From f8e5c55a036f0e2e2a958e30456270f3f9eba933 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 27 Apr 2024 14:52:13 +0200 Subject: Adding upstream version 1.9.5p2. Signed-off-by: Daniel Baumann --- plugins/audit_json/Makefile.in | 220 + plugins/audit_json/audit_json.c | 697 +++ plugins/audit_json/audit_json.exp | 1 + plugins/group_file/Makefile.in | 223 + plugins/group_file/getgrent.c | 188 + plugins/group_file/group_file.c | 128 + plugins/group_file/group_file.exp | 1 + plugins/group_file/plugin_test.c | 220 + plugins/python/Makefile.in | 520 ++ plugins/python/example_approval_plugin.py | 18 + plugins/python/example_audit_plugin.py | 84 + plugins/python/example_conversation.py | 98 + plugins/python/example_debugging.py | 85 + plugins/python/example_group_plugin.py | 45 + plugins/python/example_io_plugin.py | 153 + plugins/python/example_policy_plugin.py | 172 + plugins/python/pyhelpers.c | 568 ++ plugins/python/pyhelpers.h | 105 + plugins/python/pyhelpers_cpychecker.h | 45 + plugins/python/python_baseplugin.c | 87 + plugins/python/python_convmessage.c | 154 + plugins/python/python_importblocker.c | 213 + plugins/python/python_loghandler.c | 190 + plugins/python/python_plugin.exp | 8 + plugins/python/python_plugin_approval.c | 195 + plugins/python/python_plugin_approval_multi.inc | 57 + plugins/python/python_plugin_audit.c | 282 + plugins/python/python_plugin_audit_multi.inc | 78 + plugins/python/python_plugin_common.c | 743 +++ plugins/python/python_plugin_common.h | 85 + plugins/python/python_plugin_group.c | 114 + plugins/python/python_plugin_io.c | 277 + plugins/python/python_plugin_io_multi.inc | 99 + plugins/python/python_plugin_policy.c | 290 ++ plugins/python/regress/check_python_examples.c | 1599 ++++++ plugins/python/regress/iohelpers.c | 175 + plugins/python/regress/iohelpers.h | 54 + plugins/python/regress/plugin_approval_test.py | 22 + plugins/python/regress/plugin_conflict.py | 11 + plugins/python/regress/plugin_errorstr.py | 18 + ...eck_example_audit_plugin_receives_accept.stdout | 7 + ...heck_example_audit_plugin_receives_error.stdout | 5 + ...eck_example_audit_plugin_receives_reject.stdout | 5 + ...eck_example_audit_plugin_version_display.stdout | 6 + ...k_example_audit_plugin_workflow_multiple.stderr | 1 + ...k_example_audit_plugin_workflow_multiple.stdout | 14 + ...ion_plugin_reason_log_with_suspend.conversation | 3 + ...versation_plugin_reason_log_with_suspend.stderr | 0 ...versation_plugin_reason_log_with_suspend.stdout | 3 + ...versation_plugin_reason_log_with_suspend.stored | 3 + ..._plugin_reason_log_without_suspend.conversation | 3 + ...sation_plugin_reason_log_without_suspend.stderr | 0 ...sation_plugin_reason_log_without_suspend.stdout | 1 + ...sation_plugin_reason_log_without_suspend.stored | 3 + ...xample_conversation_plugin_user_interrupts.conv | 2 + ...onversation_plugin_user_interrupts.conversation | 2 + ...mple_conversation_plugin_user_interrupts.stderr | 1 + ...mple_conversation_plugin_user_interrupts.stdout | 1 + .../check_example_debugging_c_calls@diag.log | 6 + .../check_example_debugging_c_calls@info.log | 11 + .../testdata/check_example_debugging_load@diag.log | 3 + .../check_example_debugging_plugin@err.log | 2 + .../check_example_debugging_plugin@info.log | 8 + .../check_example_debugging_py_calls@diag.log | 2 + .../check_example_debugging_py_calls@info.log | 9 + .../check_example_debugging_sudo_cb@info.log | 1 + ...check_example_group_plugin_is_able_to_debug.log | 4 + .../check_example_io_plugin_command_log.stderr | 0 .../check_example_io_plugin_command_log.stdout | 1 + .../check_example_io_plugin_command_log.stored | 16 + ...k_example_io_plugin_command_log_multiple.stderr | 1 + ...k_example_io_plugin_command_log_multiple.stdout | 2 + ..._example_io_plugin_command_log_multiple1.stored | 16 + ..._example_io_plugin_command_log_multiple2.stored | 16 + ...xample_io_plugin_failed_to_start_command.stderr | 0 ...xample_io_plugin_failed_to_start_command.stdout | 1 + ...xample_io_plugin_failed_to_start_command.stored | 8 + ...le_io_plugin_fails_with_python_backtrace.stderr | 1 + ...le_io_plugin_fails_with_python_backtrace.stdout | 7 + .../check_example_io_plugin_version_display.stderr | 0 .../check_example_io_plugin_version_display.stdout | 2 + .../check_example_io_plugin_version_display.stored | 2 + ...k_example_io_plugin_version_display_full.stdout | 3 + ...example_policy_plugin_accepted_execution.stderr | 0 ...example_policy_plugin_accepted_execution.stdout | 1 + ...k_example_policy_plugin_denied_execution.stderr | 1 + ...k_example_policy_plugin_denied_execution.stdout | 0 ...k_example_policy_plugin_failed_execution.stderr | 1 + ...k_example_policy_plugin_failed_execution.stdout | 0 .../check_example_policy_plugin_list.stderr | 0 .../check_example_policy_plugin_list.stdout | 25 + ...k_example_policy_plugin_validate_invalidate.log | 8 + ...ck_example_policy_plugin_version_display.stderr | 0 ...ck_example_policy_plugin_version_display.stdout | 1 + ...ample_policy_plugin_version_display_full.stdout | 2 + .../check_loading_fails_missing_classname.stderr | 3 + .../check_loading_fails_missing_classname.stdout | 0 .../check_loading_fails_missing_path.stderr | 2 + .../check_loading_fails_missing_path.stdout | 0 .../check_loading_fails_not_owned_by_root.stderr | 1 + .../check_loading_fails_not_owned_by_root.stdout | 0 .../check_loading_fails_wrong_classname.stderr | 2 + .../check_loading_fails_wrong_classname.stdout | 0 .../testdata/check_loading_fails_wrong_path.stderr | 1 + .../testdata/check_loading_fails_wrong_path.stdout | 0 ..._loading_succeeds_with_missing_classname.stdout | 1 + ...k_multiple_approval_plugin_and_arguments.stderr | 1 + ...k_multiple_approval_plugin_and_arguments.stdout | 67 + ..._python_plugins_do_not_affect_each_other.stdout | 4 + .../regress/testdata/sudo.conf.developer_mode | 1 + .../python/regress/testdata/sudo.conf.normal_mode | 1 + plugins/python/regress/testhelpers.c | 295 ++ plugins/python/regress/testhelpers.h | 175 + plugins/python/sudo_python_debug.c | 129 + plugins/python/sudo_python_debug.h | 46 + plugins/python/sudo_python_module.c | 611 +++ plugins/python/sudo_python_module.h | 64 + plugins/sample/Makefile.in | 210 + plugins/sample/README | 23 + plugins/sample/sample_plugin.c | 492 ++ plugins/sample/sample_plugin.exp | 2 + plugins/sample_approval/Makefile.in | 220 + plugins/sample_approval/sample_approval.c | 169 + plugins/sample_approval/sample_approval.exp | 1 + plugins/sudoers/Makefile.in | 2706 ++++++++++ plugins/sudoers/alias.c | 370 ++ plugins/sudoers/audit.c | 444 ++ plugins/sudoers/auth/API | 136 + plugins/sudoers/auth/afs.c | 80 + plugins/sudoers/auth/aix_auth.c | 308 ++ plugins/sudoers/auth/bsdauth.c | 201 + plugins/sudoers/auth/dce.c | 194 + plugins/sudoers/auth/fwtk.c | 150 + plugins/sudoers/auth/kerb5.c | 332 ++ plugins/sudoers/auth/pam.c | 765 +++ plugins/sudoers/auth/passwd.c | 122 + plugins/sudoers/auth/rfc1938.c | 139 + plugins/sudoers/auth/secureware.c | 109 + plugins/sudoers/auth/securid5.c | 225 + plugins/sudoers/auth/sia.c | 152 + plugins/sudoers/auth/sudo_auth.c | 477 ++ plugins/sudoers/auth/sudo_auth.h | 104 + plugins/sudoers/base64.c | 121 + plugins/sudoers/boottime.c | 167 + plugins/sudoers/bsm_audit.c | 283 + plugins/sudoers/bsm_audit.h | 26 + plugins/sudoers/check.c | 373 ++ plugins/sudoers/check.h | 89 + plugins/sudoers/cvtsudoers.c | 1334 +++++ plugins/sudoers/cvtsudoers.h | 100 + plugins/sudoers/cvtsudoers_json.c | 907 ++++ plugins/sudoers/cvtsudoers_ldif.c | 712 +++ plugins/sudoers/cvtsudoers_pwutil.c | 484 ++ plugins/sudoers/def_data.c | 579 +++ plugins/sudoers/def_data.h | 281 + plugins/sudoers/def_data.in | 414 ++ plugins/sudoers/defaults.c | 1109 ++++ plugins/sudoers/defaults.h | 143 + plugins/sudoers/digestname.c | 55 + plugins/sudoers/editor.c | 252 + plugins/sudoers/env.c | 1506 ++++++ plugins/sudoers/env_pattern.c | 93 + plugins/sudoers/exptilde.c | 99 + plugins/sudoers/file.c | 152 + plugins/sudoers/filedigest.c | 92 + plugins/sudoers/find_path.c | 172 + plugins/sudoers/fmtsudoers.c | 478 ++ plugins/sudoers/gc.c | 150 + plugins/sudoers/gentime.c | 157 + plugins/sudoers/getdate.c | 1513 ++++++ plugins/sudoers/getdate.y | 936 ++++ plugins/sudoers/getspwuid.c | 139 + plugins/sudoers/gmtoff.c | 75 + plugins/sudoers/goodpath.c | 73 + plugins/sudoers/gram.c | 3709 +++++++++++++ plugins/sudoers/gram.h | 197 + plugins/sudoers/gram.y | 1570 ++++++ plugins/sudoers/group_plugin.c | 233 + plugins/sudoers/hexchar.c | 101 + plugins/sudoers/ins_2001.h | 35 + plugins/sudoers/ins_classic.h | 39 + plugins/sudoers/ins_csops.h | 41 + plugins/sudoers/ins_goons.h | 50 + plugins/sudoers/ins_python.h | 39 + plugins/sudoers/insults.h | 69 + plugins/sudoers/interfaces.c | 138 + plugins/sudoers/interfaces.h | 57 + plugins/sudoers/iolog.c | 1292 +++++ plugins/sudoers/iolog_path_escapes.c | 141 + plugins/sudoers/ldap.c | 2099 ++++++++ plugins/sudoers/ldap_conf.c | 932 ++++ plugins/sudoers/ldap_util.c | 610 +++ plugins/sudoers/linux_audit.c | 116 + plugins/sudoers/linux_audit.h | 24 + plugins/sudoers/locale.c | 154 + plugins/sudoers/log_client.c | 2043 ++++++++ plugins/sudoers/log_client.h | 124 + plugins/sudoers/logging.c | 821 +++ plugins/sudoers/logging.h | 74 + plugins/sudoers/match.c | 675 +++ plugins/sudoers/match_addr.c | 208 + plugins/sudoers/match_command.c | 674 +++ plugins/sudoers/match_digest.c | 135 + plugins/sudoers/mkdefaults | 163 + plugins/sudoers/parse.c | 939 ++++ plugins/sudoers/parse.h | 398 ++ plugins/sudoers/parse_ldif.c | 778 +++ plugins/sudoers/po/README | 14 + plugins/sudoers/po/ast.mo | Bin 0 -> 34264 bytes plugins/sudoers/po/ast.po | 2343 +++++++++ plugins/sudoers/po/ca.mo | Bin 0 -> 51564 bytes plugins/sudoers/po/ca.po | 2440 +++++++++ plugins/sudoers/po/cs.mo | Bin 0 -> 65656 bytes plugins/sudoers/po/cs.po | 3238 ++++++++++++ plugins/sudoers/po/da.mo | Bin 0 -> 46504 bytes plugins/sudoers/po/da.po | 2344 +++++++++ plugins/sudoers/po/de.mo | Bin 0 -> 68279 bytes plugins/sudoers/po/de.po | 3101 +++++++++++ plugins/sudoers/po/el.mo | Bin 0 -> 51009 bytes plugins/sudoers/po/el.po | 1718 ++++++ plugins/sudoers/po/eo.mo | Bin 0 -> 62872 bytes plugins/sudoers/po/eo.po | 3087 +++++++++++ plugins/sudoers/po/eu.mo | Bin 0 -> 6404 bytes plugins/sudoers/po/eu.po | 1679 ++++++ plugins/sudoers/po/fi.mo | Bin 0 -> 55765 bytes plugins/sudoers/po/fi.po | 3254 ++++++++++++ plugins/sudoers/po/fr.mo | Bin 0 -> 72145 bytes plugins/sudoers/po/fr.po | 3286 ++++++++++++ plugins/sudoers/po/fur.mo | Bin 0 -> 9485 bytes plugins/sudoers/po/fur.po | 2119 ++++++++ plugins/sudoers/po/hr.mo | Bin 0 -> 66396 bytes plugins/sudoers/po/hr.po | 3326 ++++++++++++ plugins/sudoers/po/hu.mo | Bin 0 -> 26073 bytes plugins/sudoers/po/hu.po | 2152 ++++++++ plugins/sudoers/po/it.mo | Bin 0 -> 65353 bytes plugins/sudoers/po/it.po | 3087 +++++++++++ plugins/sudoers/po/ja.mo | Bin 0 -> 73913 bytes plugins/sudoers/po/ja.po | 3306 ++++++++++++ plugins/sudoers/po/ko.mo | Bin 0 -> 67838 bytes plugins/sudoers/po/ko.po | 3146 +++++++++++ plugins/sudoers/po/lt.mo | Bin 0 -> 1994 bytes plugins/sudoers/po/lt.po | 1682 ++++++ plugins/sudoers/po/nb.mo | Bin 0 -> 49008 bytes plugins/sudoers/po/nb.po | 2444 +++++++++ plugins/sudoers/po/nl.mo | Bin 0 -> 39096 bytes plugins/sudoers/po/nl.po | 2282 ++++++++ plugins/sudoers/po/pl.mo | Bin 0 -> 66152 bytes plugins/sudoers/po/pl.po | 3087 +++++++++++ plugins/sudoers/po/pt.mo | Bin 0 -> 64469 bytes plugins/sudoers/po/pt.po | 3166 +++++++++++ plugins/sudoers/po/pt_BR.mo | Bin 0 -> 66651 bytes plugins/sudoers/po/pt_BR.po | 3289 ++++++++++++ plugins/sudoers/po/ro.mo | Bin 0 -> 64155 bytes plugins/sudoers/po/ro.po | 3029 +++++++++++ plugins/sudoers/po/ru.mo | Bin 0 -> 11555 bytes plugins/sudoers/po/ru.po | 1868 +++++++ plugins/sudoers/po/sk.mo | Bin 0 -> 4927 bytes plugins/sudoers/po/sk.po | 1892 +++++++ plugins/sudoers/po/sl.mo | Bin 0 -> 36413 bytes plugins/sudoers/po/sl.po | 1758 +++++++ plugins/sudoers/po/sr.mo | Bin 0 -> 84383 bytes plugins/sudoers/po/sr.po | 3211 ++++++++++++ plugins/sudoers/po/sudoers.pot | 3025 +++++++++++ plugins/sudoers/po/sv.mo | Bin 0 -> 63549 bytes plugins/sudoers/po/sv.po | 3285 ++++++++++++ plugins/sudoers/po/tr.mo | Bin 0 -> 13979 bytes plugins/sudoers/po/tr.po | 1721 ++++++ plugins/sudoers/po/uk.mo | Bin 0 -> 89307 bytes plugins/sudoers/po/uk.po | 3098 +++++++++++ plugins/sudoers/po/vi.mo | Bin 0 -> 54696 bytes plugins/sudoers/po/vi.po | 2502 +++++++++ plugins/sudoers/po/zh_CN.mo | Bin 0 -> 53540 bytes plugins/sudoers/po/zh_CN.po | 3323 ++++++++++++ plugins/sudoers/po/zh_TW.mo | Bin 0 -> 59885 bytes plugins/sudoers/po/zh_TW.po | 3166 +++++++++++ plugins/sudoers/policy.c | 1186 +++++ plugins/sudoers/prompt.c | 163 + plugins/sudoers/pwutil.c | 1100 ++++ plugins/sudoers/pwutil.h | 77 + plugins/sudoers/pwutil_impl.c | 414 ++ plugins/sudoers/rcstr.c | 100 + plugins/sudoers/redblack.c | 479 ++ plugins/sudoers/redblack.h | 60 + .../sudoers/regress/check_symbols/check_symbols.c | 99 + plugins/sudoers/regress/cvtsudoers/sudoers | 126 + plugins/sudoers/regress/cvtsudoers/sudoers.defs | 19 + plugins/sudoers/regress/cvtsudoers/test1.out.ok | 14 + plugins/sudoers/regress/cvtsudoers/test1.sh | 10 + plugins/sudoers/regress/cvtsudoers/test10.out.ok | 1 + plugins/sudoers/regress/cvtsudoers/test10.sh | 10 + plugins/sudoers/regress/cvtsudoers/test11.out.ok | 7 + plugins/sudoers/regress/cvtsudoers/test11.sh | 8 + plugins/sudoers/regress/cvtsudoers/test12.out.ok | 8 + plugins/sudoers/regress/cvtsudoers/test12.sh | 8 + plugins/sudoers/regress/cvtsudoers/test13.out.ok | 7 + plugins/sudoers/regress/cvtsudoers/test13.sh | 8 + plugins/sudoers/regress/cvtsudoers/test14.out.ok | 7 + plugins/sudoers/regress/cvtsudoers/test14.sh | 8 + plugins/sudoers/regress/cvtsudoers/test15.out.ok | 1 + plugins/sudoers/regress/cvtsudoers/test15.sh | 10 + plugins/sudoers/regress/cvtsudoers/test16.out.ok | 1 + plugins/sudoers/regress/cvtsudoers/test16.sh | 10 + plugins/sudoers/regress/cvtsudoers/test17.out.ok | 1 + plugins/sudoers/regress/cvtsudoers/test17.sh | 10 + plugins/sudoers/regress/cvtsudoers/test18.out.ok | 1 + plugins/sudoers/regress/cvtsudoers/test18.sh | 10 + plugins/sudoers/regress/cvtsudoers/test19.out.ok | 11 + plugins/sudoers/regress/cvtsudoers/test19.sh | 8 + plugins/sudoers/regress/cvtsudoers/test2.out.ok | 10 + plugins/sudoers/regress/cvtsudoers/test2.sh | 10 + plugins/sudoers/regress/cvtsudoers/test20.conf | 6 + plugins/sudoers/regress/cvtsudoers/test20.out.ok | 1 + plugins/sudoers/regress/cvtsudoers/test20.sh | 13 + plugins/sudoers/regress/cvtsudoers/test21.conf | 8 + plugins/sudoers/regress/cvtsudoers/test21.out.ok | 24 + plugins/sudoers/regress/cvtsudoers/test21.sh | 14 + plugins/sudoers/regress/cvtsudoers/test22.out.ok | 31 + plugins/sudoers/regress/cvtsudoers/test22.sh | 73 + plugins/sudoers/regress/cvtsudoers/test23.out.ok | 20 + plugins/sudoers/regress/cvtsudoers/test23.sh | 9 + plugins/sudoers/regress/cvtsudoers/test24.out.ok | 89 + plugins/sudoers/regress/cvtsudoers/test24.sh | 9 + plugins/sudoers/regress/cvtsudoers/test25.out.ok | 31 + plugins/sudoers/regress/cvtsudoers/test25.sh | 53 + plugins/sudoers/regress/cvtsudoers/test26.err.ok | 3 + plugins/sudoers/regress/cvtsudoers/test26.out.ok | 0 plugins/sudoers/regress/cvtsudoers/test26.sh | 49 + plugins/sudoers/regress/cvtsudoers/test27.out.ok | 16 + plugins/sudoers/regress/cvtsudoers/test27.sh | 12 + plugins/sudoers/regress/cvtsudoers/test28.out.ok | 10 + plugins/sudoers/regress/cvtsudoers/test28.sh | 74 + plugins/sudoers/regress/cvtsudoers/test29.out.ok | 4 + plugins/sudoers/regress/cvtsudoers/test29.sh | 61 + plugins/sudoers/regress/cvtsudoers/test3.out.ok | 7 + plugins/sudoers/regress/cvtsudoers/test3.sh | 10 + plugins/sudoers/regress/cvtsudoers/test30.out.ok | 26 + plugins/sudoers/regress/cvtsudoers/test30.sh | 15 + plugins/sudoers/regress/cvtsudoers/test31.conf | 9 + plugins/sudoers/regress/cvtsudoers/test31.out.ok | 24 + plugins/sudoers/regress/cvtsudoers/test31.sh | 14 + plugins/sudoers/regress/cvtsudoers/test32.err.ok | 1 + plugins/sudoers/regress/cvtsudoers/test32.out.ok | 119 + plugins/sudoers/regress/cvtsudoers/test32.sh | 22 + plugins/sudoers/regress/cvtsudoers/test33.out.ok | 7 + plugins/sudoers/regress/cvtsudoers/test33.sh | 62 + plugins/sudoers/regress/cvtsudoers/test4.out.ok | 5 + plugins/sudoers/regress/cvtsudoers/test4.sh | 10 + plugins/sudoers/regress/cvtsudoers/test5.out.ok | 6 + plugins/sudoers/regress/cvtsudoers/test5.sh | 10 + plugins/sudoers/regress/cvtsudoers/test6.out.ok | 1 + plugins/sudoers/regress/cvtsudoers/test6.sh | 10 + plugins/sudoers/regress/cvtsudoers/test7.out.ok | 2 + plugins/sudoers/regress/cvtsudoers/test7.sh | 10 + plugins/sudoers/regress/cvtsudoers/test8.out.ok | 1 + plugins/sudoers/regress/cvtsudoers/test8.sh | 10 + plugins/sudoers/regress/cvtsudoers/test9.out.ok | 1 + plugins/sudoers/regress/cvtsudoers/test9.sh | 10 + .../sudoers/regress/env_match/check_env_pattern.c | 76 + plugins/sudoers/regress/env_match/data | 22 + plugins/sudoers/regress/exptilde/check_exptilde.c | 101 + .../regress/iolog_plugin/check_iolog_plugin.c | 430 ++ plugins/sudoers/regress/parser/check_addr.c | 139 + plugins/sudoers/regress/parser/check_addr.in | 13 + plugins/sudoers/regress/parser/check_base64.c | 114 + plugins/sudoers/regress/parser/check_digest.c | 125 + plugins/sudoers/regress/parser/check_digest.out.ok | 36 + plugins/sudoers/regress/parser/check_fill.c | 189 + plugins/sudoers/regress/parser/check_gentime.c | 83 + plugins/sudoers/regress/parser/check_hexchar.c | 81 + .../sudoers/regress/starttime/check_starttime.c | 118 + plugins/sudoers/regress/sudoers/test1.in | 12 + plugins/sudoers/regress/sudoers/test1.json.ok | 154 + plugins/sudoers/regress/sudoers/test1.ldif.ok | 88 + plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok | 13 + plugins/sudoers/regress/sudoers/test1.out.ok | 6 + plugins/sudoers/regress/sudoers/test1.toke.ok | 8 + plugins/sudoers/regress/sudoers/test10.in | 1 + plugins/sudoers/regress/sudoers/test10.json.ok | 0 plugins/sudoers/regress/sudoers/test10.ldif.ok | 0 plugins/sudoers/regress/sudoers/test10.out.ok | 2 + plugins/sudoers/regress/sudoers/test10.toke.ok | 1 + plugins/sudoers/regress/sudoers/test11.in | 1 + plugins/sudoers/regress/sudoers/test11.json.ok | 0 plugins/sudoers/regress/sudoers/test11.ldif.ok | 0 plugins/sudoers/regress/sudoers/test11.out.ok | 1 + plugins/sudoers/regress/sudoers/test11.toke.ok | 2 + plugins/sudoers/regress/sudoers/test12.in | 1 + plugins/sudoers/regress/sudoers/test12.json.ok | 0 plugins/sudoers/regress/sudoers/test12.ldif.ok | 0 plugins/sudoers/regress/sudoers/test12.out.ok | 1 + plugins/sudoers/regress/sudoers/test12.toke.ok | 2 + plugins/sudoers/regress/sudoers/test13.in | 1 + plugins/sudoers/regress/sudoers/test13.json.ok | 0 plugins/sudoers/regress/sudoers/test13.ldif.ok | 0 plugins/sudoers/regress/sudoers/test13.out.ok | 1 + plugins/sudoers/regress/sudoers/test13.toke.ok | 2 + plugins/sudoers/regress/sudoers/test14.in | 6 + plugins/sudoers/regress/sudoers/test14.json.ok | 62 + plugins/sudoers/regress/sudoers/test14.ldif.ok | 20 + .../sudoers/regress/sudoers/test14.ldif2sudo.ok | 11 + plugins/sudoers/regress/sudoers/test14.out.ok | 7 + plugins/sudoers/regress/sudoers/test14.toke.ok | 6 + plugins/sudoers/regress/sudoers/test15.in | 2 + plugins/sudoers/regress/sudoers/test15.json.ok | 19 + plugins/sudoers/regress/sudoers/test15.ldif.ok | 9 + .../sudoers/regress/sudoers/test15.ldif2sudo.ok | 2 + plugins/sudoers/regress/sudoers/test15.out.ok | 3 + plugins/sudoers/regress/sudoers/test15.toke.ok | 2 + plugins/sudoers/regress/sudoers/test16.in | 3 + plugins/sudoers/regress/sudoers/test16.json.ok | 24 + plugins/sudoers/regress/sudoers/test16.ldif.ok | 9 + .../sudoers/regress/sudoers/test16.ldif2sudo.ok | 2 + plugins/sudoers/regress/sudoers/test16.out.ok | 5 + plugins/sudoers/regress/sudoers/test16.toke.ok | 3 + plugins/sudoers/regress/sudoers/test17.in | 13 + plugins/sudoers/regress/sudoers/test17.json.ok | 180 + plugins/sudoers/regress/sudoers/test17.ldif.ok | 104 + .../sudoers/regress/sudoers/test17.ldif2sudo.ok | 29 + plugins/sudoers/regress/sudoers/test17.out.ok | 13 + plugins/sudoers/regress/sudoers/test17.toke.ok | 11 + plugins/sudoers/regress/sudoers/test18.in | 8 + plugins/sudoers/regress/sudoers/test18.json.ok | 0 plugins/sudoers/regress/sudoers/test18.ldif.ok | 0 plugins/sudoers/regress/sudoers/test18.out.ok | 4 + plugins/sudoers/regress/sudoers/test18.toke.ok | 10 + plugins/sudoers/regress/sudoers/test19.in | 12 + plugins/sudoers/regress/sudoers/test19.json.ok | 187 + plugins/sudoers/regress/sudoers/test19.ldif.ok | 103 + .../sudoers/regress/sudoers/test19.ldif2sudo.ok | 30 + plugins/sudoers/regress/sudoers/test19.out.ok | 12 + plugins/sudoers/regress/sudoers/test19.toke.ok | 12 + plugins/sudoers/regress/sudoers/test2.in | 60 + plugins/sudoers/regress/sudoers/test2.json.ok | 403 ++ plugins/sudoers/regress/sudoers/test2.ldif.ok | 157 + plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok | 38 + plugins/sudoers/regress/sudoers/test2.out.ok | 42 + plugins/sudoers/regress/sudoers/test2.toke.ok | 60 + plugins/sudoers/regress/sudoers/test20.in | 26 + plugins/sudoers/regress/sudoers/test20.json.ok | 114 + plugins/sudoers/regress/sudoers/test20.ldif.ok | 28 + .../sudoers/regress/sudoers/test20.ldif2sudo.ok | 22 + plugins/sudoers/regress/sudoers/test20.out.ok | 24 + plugins/sudoers/regress/sudoers/test20.toke.ok | 26 + plugins/sudoers/regress/sudoers/test21.in | 36 + plugins/sudoers/regress/sudoers/test21.json.ok | 169 + plugins/sudoers/regress/sudoers/test21.ldif.ok | 39 + .../sudoers/regress/sudoers/test21.ldif2sudo.ok | 33 + plugins/sudoers/regress/sudoers/test21.out.ok | 35 + plugins/sudoers/regress/sudoers/test21.toke.ok | 36 + plugins/sudoers/regress/sudoers/test22.in | 6 + plugins/sudoers/regress/sudoers/test22.json.ok | 88 + plugins/sudoers/regress/sudoers/test22.ldif.ok | 40 + .../sudoers/regress/sudoers/test22.ldif2sudo.ok | 11 + plugins/sudoers/regress/sudoers/test22.out.ok | 6 + plugins/sudoers/regress/sudoers/test22.sudo.ok | 7 + plugins/sudoers/regress/sudoers/test22.toke.ok | 6 + plugins/sudoers/regress/sudoers/test23.in | 11 + plugins/sudoers/regress/sudoers/test23.json.ok | 102 + plugins/sudoers/regress/sudoers/test23.ldif.ok | 14 + .../sudoers/regress/sudoers/test23.ldif2sudo.ok | 8 + plugins/sudoers/regress/sudoers/test23.out.ok | 10 + plugins/sudoers/regress/sudoers/test23.sudo.ok | 8 + plugins/sudoers/regress/sudoers/test23.toke.ok | 11 + plugins/sudoers/regress/sudoers/test24.in | 6 + plugins/sudoers/regress/sudoers/test24.json.ok | 61 + plugins/sudoers/regress/sudoers/test24.ldif.ok | 39 + .../sudoers/regress/sudoers/test24.ldif2sudo.ok | 8 + plugins/sudoers/regress/sudoers/test24.out.ok | 7 + plugins/sudoers/regress/sudoers/test24.sudo.ok | 6 + plugins/sudoers/regress/sudoers/test24.toke.ok | 6 + plugins/sudoers/regress/sudoers/test3.in | 6 + plugins/sudoers/regress/sudoers/test3.json.ok | 45 + plugins/sudoers/regress/sudoers/test3.ldif.ok | 12 + plugins/sudoers/regress/sudoers/test3.ldif2sudo.ok | 0 plugins/sudoers/regress/sudoers/test3.out.ok | 8 + plugins/sudoers/regress/sudoers/test3.toke.ok | 6 + plugins/sudoers/regress/sudoers/test4.in | 7 + plugins/sudoers/regress/sudoers/test4.json.ok | 0 plugins/sudoers/regress/sudoers/test4.ldif.ok | 0 plugins/sudoers/regress/sudoers/test4.out.ok | 3 + plugins/sudoers/regress/sudoers/test4.toke.ok | 5 + plugins/sudoers/regress/sudoers/test5.in | 3 + plugins/sudoers/regress/sudoers/test5.json.ok | 0 plugins/sudoers/regress/sudoers/test5.ldif.ok | 0 plugins/sudoers/regress/sudoers/test5.out.ok | 1 + plugins/sudoers/regress/sudoers/test5.toke.ok | 3 + plugins/sudoers/regress/sudoers/test6.in | 15 + plugins/sudoers/regress/sudoers/test6.json.ok | 158 + plugins/sudoers/regress/sudoers/test6.ldif.ok | 70 + plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok | 5 + plugins/sudoers/regress/sudoers/test6.out.ok | 13 + plugins/sudoers/regress/sudoers/test6.toke.ok | 15 + plugins/sudoers/regress/sudoers/test7.in | 7 + plugins/sudoers/regress/sudoers/test7.json.ok | 0 plugins/sudoers/regress/sudoers/test7.ldif.ok | 0 plugins/sudoers/regress/sudoers/test7.out.ok | 1 + plugins/sudoers/regress/sudoers/test7.toke.ok | 7 + plugins/sudoers/regress/sudoers/test8.in | 8 + plugins/sudoers/regress/sudoers/test8.json.ok | 0 plugins/sudoers/regress/sudoers/test8.ldif.ok | 0 plugins/sudoers/regress/sudoers/test8.out.ok | 4 + plugins/sudoers/regress/sudoers/test8.toke.ok | 7 + plugins/sudoers/regress/sudoers/test9.in | 0 plugins/sudoers/regress/sudoers/test9.json.ok | 0 plugins/sudoers/regress/sudoers/test9.ldif.ok | 0 plugins/sudoers/regress/sudoers/test9.out.ok | 2 + plugins/sudoers/regress/sudoers/test9.toke.ok | 0 plugins/sudoers/regress/testsudoers/group | 15 + plugins/sudoers/regress/testsudoers/test1.out.ok | 8 + plugins/sudoers/regress/testsudoers/test1.sh | 15 + plugins/sudoers/regress/testsudoers/test10.out.ok | 51 + plugins/sudoers/regress/testsudoers/test10.sh | 46 + plugins/sudoers/regress/testsudoers/test11.out.ok | 21 + plugins/sudoers/regress/testsudoers/test11.sh | 28 + plugins/sudoers/regress/testsudoers/test12.out.ok | 15 + plugins/sudoers/regress/testsudoers/test12.sh | 20 + plugins/sudoers/regress/testsudoers/test13.out.ok | 22 + plugins/sudoers/regress/testsudoers/test13.sh | 25 + plugins/sudoers/regress/testsudoers/test14.out.ok | 18 + plugins/sudoers/regress/testsudoers/test14.sh | 25 + plugins/sudoers/regress/testsudoers/test15.out.ok | 17 + plugins/sudoers/regress/testsudoers/test15.sh | 24 + plugins/sudoers/regress/testsudoers/test2.inc | 1 + plugins/sudoers/regress/testsudoers/test2.out.ok | 25 + plugins/sudoers/regress/testsudoers/test2.sh | 25 + plugins/sudoers/regress/testsudoers/test3.out.ok | 51 + plugins/sudoers/regress/testsudoers/test3.sh | 48 + plugins/sudoers/regress/testsudoers/test4.out.ok | 5 + plugins/sudoers/regress/testsudoers/test4.sh | 16 + plugins/sudoers/regress/testsudoers/test5.out.ok | 10 + plugins/sudoers/regress/testsudoers/test5.sh | 34 + plugins/sudoers/regress/testsudoers/test6.out.ok | 10 + plugins/sudoers/regress/testsudoers/test6.sh | 13 + plugins/sudoers/regress/testsudoers/test7.out.ok | 10 + plugins/sudoers/regress/testsudoers/test7.sh | 13 + plugins/sudoers/regress/testsudoers/test8.out.ok | 25 + plugins/sudoers/regress/testsudoers/test8.sh | 24 + plugins/sudoers/regress/testsudoers/test9.out.ok | 10 + plugins/sudoers/regress/testsudoers/test9.sh | 15 + plugins/sudoers/regress/visudo/test1.out.ok | 1 + plugins/sudoers/regress/visudo/test1.sh | 14 + plugins/sudoers/regress/visudo/test10.out.ok | 1 + plugins/sudoers/regress/visudo/test10.sh | 13 + plugins/sudoers/regress/visudo/test2.err.ok | 1 + plugins/sudoers/regress/visudo/test2.out.ok | 0 plugins/sudoers/regress/visudo/test2.sh | 17 + plugins/sudoers/regress/visudo/test3.err.ok | 2 + plugins/sudoers/regress/visudo/test3.out.ok | 1 + plugins/sudoers/regress/visudo/test3.sh | 37 + plugins/sudoers/regress/visudo/test4.out.ok | 1 + plugins/sudoers/regress/visudo/test4.sh | 16 + plugins/sudoers/regress/visudo/test5.out.ok | 1 + plugins/sudoers/regress/visudo/test5.sh | 10 + plugins/sudoers/regress/visudo/test6.out.ok | 1 + plugins/sudoers/regress/visudo/test6.sh | 27 + plugins/sudoers/regress/visudo/test7.out.ok | 1 + plugins/sudoers/regress/visudo/test7.sh | 31 + plugins/sudoers/regress/visudo/test8.err.ok | 1 + plugins/sudoers/regress/visudo/test8.out.ok | 1 + plugins/sudoers/regress/visudo/test8.sh | 32 + plugins/sudoers/regress/visudo/test9.out.ok | 1 + plugins/sudoers/regress/visudo/test9.sh | 14 + plugins/sudoers/set_perms.c | 1593 ++++++ plugins/sudoers/solaris_audit.c | 139 + plugins/sudoers/solaris_audit.h | 25 + plugins/sudoers/sssd.c | 801 +++ plugins/sudoers/starttime.c | 308 ++ plugins/sudoers/strlist.c | 92 + plugins/sudoers/strlist.h | 40 + plugins/sudoers/stubs.c | 124 + plugins/sudoers/sudo_ldap.h | 31 + plugins/sudoers/sudo_ldap_conf.h | 138 + plugins/sudoers/sudo_nss.c | 264 + plugins/sudoers/sudo_nss.h | 46 + plugins/sudoers/sudo_printf.c | 69 + plugins/sudoers/sudoers.c | 1711 ++++++ plugins/sudoers/sudoers.exp | 7 + plugins/sudoers/sudoers.h | 458 ++ plugins/sudoers/sudoers.in | 96 + plugins/sudoers/sudoers_debug.c | 135 + plugins/sudoers/sudoers_debug.h | 48 + plugins/sudoers/sudoers_version.h | 80 + plugins/sudoers/sudoreplay.c | 1650 ++++++ plugins/sudoers/testsudoers.c | 610 +++ plugins/sudoers/timeout.c | 109 + plugins/sudoers/timestamp.c | 1084 ++++ plugins/sudoers/timestr.c | 50 + plugins/sudoers/toke.c | 5491 ++++++++++++++++++++ plugins/sudoers/toke.h | 53 + plugins/sudoers/toke.l | 1295 +++++ plugins/sudoers/toke_util.c | 203 + plugins/sudoers/tsdump.c | 311 ++ plugins/sudoers/tsgetgrpw.c | 427 ++ plugins/sudoers/tsgetgrpw.h | 74 + plugins/sudoers/visudo.c | 1313 +++++ plugins/system_group/Makefile.in | 215 + plugins/system_group/system_group.c | 144 + plugins/system_group/system_group.exp | 1 + 598 files changed, 171403 insertions(+) create mode 100644 plugins/audit_json/Makefile.in create mode 100644 plugins/audit_json/audit_json.c create mode 100644 plugins/audit_json/audit_json.exp create mode 100644 plugins/group_file/Makefile.in create mode 100644 plugins/group_file/getgrent.c create mode 100644 plugins/group_file/group_file.c create mode 100644 plugins/group_file/group_file.exp create mode 100644 plugins/group_file/plugin_test.c create mode 100644 plugins/python/Makefile.in create mode 100644 plugins/python/example_approval_plugin.py create mode 100644 plugins/python/example_audit_plugin.py create mode 100644 plugins/python/example_conversation.py create mode 100644 plugins/python/example_debugging.py create mode 100644 plugins/python/example_group_plugin.py create mode 100644 plugins/python/example_io_plugin.py create mode 100644 plugins/python/example_policy_plugin.py create mode 100644 plugins/python/pyhelpers.c create mode 100644 plugins/python/pyhelpers.h create mode 100644 plugins/python/pyhelpers_cpychecker.h create mode 100644 plugins/python/python_baseplugin.c create mode 100644 plugins/python/python_convmessage.c create mode 100644 plugins/python/python_importblocker.c create mode 100644 plugins/python/python_loghandler.c create mode 100644 plugins/python/python_plugin.exp create mode 100644 plugins/python/python_plugin_approval.c create mode 100644 plugins/python/python_plugin_approval_multi.inc create mode 100644 plugins/python/python_plugin_audit.c create mode 100644 plugins/python/python_plugin_audit_multi.inc create mode 100644 plugins/python/python_plugin_common.c create mode 100644 plugins/python/python_plugin_common.h create mode 100644 plugins/python/python_plugin_group.c create mode 100644 plugins/python/python_plugin_io.c create mode 100644 plugins/python/python_plugin_io_multi.inc create mode 100644 plugins/python/python_plugin_policy.c create mode 100644 plugins/python/regress/check_python_examples.c create mode 100644 plugins/python/regress/iohelpers.c create mode 100644 plugins/python/regress/iohelpers.h create mode 100644 plugins/python/regress/plugin_approval_test.py create mode 100644 plugins/python/regress/plugin_conflict.py create mode 100644 plugins/python/regress/plugin_errorstr.py create mode 100644 plugins/python/regress/testdata/check_example_audit_plugin_receives_accept.stdout create mode 100644 plugins/python/regress/testdata/check_example_audit_plugin_receives_error.stdout create mode 100644 plugins/python/regress/testdata/check_example_audit_plugin_receives_reject.stdout create mode 100644 plugins/python/regress/testdata/check_example_audit_plugin_version_display.stdout create mode 100644 plugins/python/regress/testdata/check_example_audit_plugin_workflow_multiple.stderr create mode 100644 plugins/python/regress/testdata/check_example_audit_plugin_workflow_multiple.stdout create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.conversation create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stderr create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stdout create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stored create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.conversation create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stderr create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stdout create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stored create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.conv create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.conversation create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.stderr create mode 100644 plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.stdout create mode 100644 plugins/python/regress/testdata/check_example_debugging_c_calls@diag.log create mode 100644 plugins/python/regress/testdata/check_example_debugging_c_calls@info.log create mode 100644 plugins/python/regress/testdata/check_example_debugging_load@diag.log create mode 100644 plugins/python/regress/testdata/check_example_debugging_plugin@err.log create mode 100644 plugins/python/regress/testdata/check_example_debugging_plugin@info.log create mode 100644 plugins/python/regress/testdata/check_example_debugging_py_calls@diag.log create mode 100644 plugins/python/regress/testdata/check_example_debugging_py_calls@info.log create mode 100644 plugins/python/regress/testdata/check_example_debugging_sudo_cb@info.log create mode 100644 plugins/python/regress/testdata/check_example_group_plugin_is_able_to_debug.log create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_command_log.stderr create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_command_log.stdout create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_command_log.stored create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple.stderr create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple.stdout create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple1.stored create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple2.stored create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stderr create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stdout create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stored create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_fails_with_python_backtrace.stderr create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_fails_with_python_backtrace.stdout create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_version_display.stderr create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_version_display.stdout create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_version_display.stored create mode 100644 plugins/python/regress/testdata/check_example_io_plugin_version_display_full.stdout create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_accepted_execution.stderr create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_accepted_execution.stdout create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_denied_execution.stderr create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_denied_execution.stdout create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_failed_execution.stderr create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_failed_execution.stdout create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_list.stderr create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_list.stdout create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_validate_invalidate.log create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_version_display.stderr create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_version_display.stdout create mode 100644 plugins/python/regress/testdata/check_example_policy_plugin_version_display_full.stdout create mode 100644 plugins/python/regress/testdata/check_loading_fails_missing_classname.stderr create mode 100644 plugins/python/regress/testdata/check_loading_fails_missing_classname.stdout create mode 100644 plugins/python/regress/testdata/check_loading_fails_missing_path.stderr create mode 100644 plugins/python/regress/testdata/check_loading_fails_missing_path.stdout create mode 100644 plugins/python/regress/testdata/check_loading_fails_not_owned_by_root.stderr create mode 100644 plugins/python/regress/testdata/check_loading_fails_not_owned_by_root.stdout create mode 100644 plugins/python/regress/testdata/check_loading_fails_wrong_classname.stderr create mode 100644 plugins/python/regress/testdata/check_loading_fails_wrong_classname.stdout create mode 100644 plugins/python/regress/testdata/check_loading_fails_wrong_path.stderr create mode 100644 plugins/python/regress/testdata/check_loading_fails_wrong_path.stdout create mode 100644 plugins/python/regress/testdata/check_loading_succeeds_with_missing_classname.stdout create mode 100644 plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stderr create mode 100644 plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stdout create mode 100644 plugins/python/regress/testdata/check_python_plugins_do_not_affect_each_other.stdout create mode 100644 plugins/python/regress/testdata/sudo.conf.developer_mode create mode 100644 plugins/python/regress/testdata/sudo.conf.normal_mode create mode 100644 plugins/python/regress/testhelpers.c create mode 100644 plugins/python/regress/testhelpers.h create mode 100644 plugins/python/sudo_python_debug.c create mode 100644 plugins/python/sudo_python_debug.h create mode 100644 plugins/python/sudo_python_module.c create mode 100644 plugins/python/sudo_python_module.h create mode 100644 plugins/sample/Makefile.in create mode 100644 plugins/sample/README create mode 100644 plugins/sample/sample_plugin.c create mode 100644 plugins/sample/sample_plugin.exp create mode 100644 plugins/sample_approval/Makefile.in create mode 100644 plugins/sample_approval/sample_approval.c create mode 100644 plugins/sample_approval/sample_approval.exp create mode 100644 plugins/sudoers/Makefile.in create mode 100644 plugins/sudoers/alias.c create mode 100644 plugins/sudoers/audit.c create mode 100644 plugins/sudoers/auth/API create mode 100644 plugins/sudoers/auth/afs.c create mode 100644 plugins/sudoers/auth/aix_auth.c create mode 100644 plugins/sudoers/auth/bsdauth.c create mode 100644 plugins/sudoers/auth/dce.c create mode 100644 plugins/sudoers/auth/fwtk.c create mode 100644 plugins/sudoers/auth/kerb5.c create mode 100644 plugins/sudoers/auth/pam.c create mode 100644 plugins/sudoers/auth/passwd.c create mode 100644 plugins/sudoers/auth/rfc1938.c create mode 100644 plugins/sudoers/auth/secureware.c create mode 100644 plugins/sudoers/auth/securid5.c create mode 100644 plugins/sudoers/auth/sia.c create mode 100644 plugins/sudoers/auth/sudo_auth.c create mode 100644 plugins/sudoers/auth/sudo_auth.h create mode 100644 plugins/sudoers/base64.c create mode 100644 plugins/sudoers/boottime.c create mode 100644 plugins/sudoers/bsm_audit.c create mode 100644 plugins/sudoers/bsm_audit.h create mode 100644 plugins/sudoers/check.c create mode 100644 plugins/sudoers/check.h create mode 100644 plugins/sudoers/cvtsudoers.c create mode 100644 plugins/sudoers/cvtsudoers.h create mode 100644 plugins/sudoers/cvtsudoers_json.c create mode 100644 plugins/sudoers/cvtsudoers_ldif.c create mode 100644 plugins/sudoers/cvtsudoers_pwutil.c create mode 100644 plugins/sudoers/def_data.c create mode 100644 plugins/sudoers/def_data.h create mode 100644 plugins/sudoers/def_data.in create mode 100644 plugins/sudoers/defaults.c create mode 100644 plugins/sudoers/defaults.h create mode 100644 plugins/sudoers/digestname.c create mode 100644 plugins/sudoers/editor.c create mode 100644 plugins/sudoers/env.c create mode 100644 plugins/sudoers/env_pattern.c create mode 100644 plugins/sudoers/exptilde.c create mode 100644 plugins/sudoers/file.c create mode 100644 plugins/sudoers/filedigest.c create mode 100644 plugins/sudoers/find_path.c create mode 100644 plugins/sudoers/fmtsudoers.c create mode 100644 plugins/sudoers/gc.c create mode 100644 plugins/sudoers/gentime.c create mode 100644 plugins/sudoers/getdate.c create mode 100644 plugins/sudoers/getdate.y create mode 100644 plugins/sudoers/getspwuid.c create mode 100644 plugins/sudoers/gmtoff.c create mode 100644 plugins/sudoers/goodpath.c create mode 100644 plugins/sudoers/gram.c create mode 100644 plugins/sudoers/gram.h create mode 100644 plugins/sudoers/gram.y create mode 100644 plugins/sudoers/group_plugin.c create mode 100644 plugins/sudoers/hexchar.c create mode 100644 plugins/sudoers/ins_2001.h create mode 100644 plugins/sudoers/ins_classic.h create mode 100644 plugins/sudoers/ins_csops.h create mode 100644 plugins/sudoers/ins_goons.h create mode 100644 plugins/sudoers/ins_python.h create mode 100644 plugins/sudoers/insults.h create mode 100644 plugins/sudoers/interfaces.c create mode 100644 plugins/sudoers/interfaces.h create mode 100644 plugins/sudoers/iolog.c create mode 100644 plugins/sudoers/iolog_path_escapes.c create mode 100644 plugins/sudoers/ldap.c create mode 100644 plugins/sudoers/ldap_conf.c create mode 100644 plugins/sudoers/ldap_util.c create mode 100644 plugins/sudoers/linux_audit.c create mode 100644 plugins/sudoers/linux_audit.h create mode 100644 plugins/sudoers/locale.c create mode 100644 plugins/sudoers/log_client.c create mode 100644 plugins/sudoers/log_client.h create mode 100644 plugins/sudoers/logging.c create mode 100644 plugins/sudoers/logging.h create mode 100644 plugins/sudoers/match.c create mode 100644 plugins/sudoers/match_addr.c create mode 100644 plugins/sudoers/match_command.c create mode 100644 plugins/sudoers/match_digest.c create mode 100755 plugins/sudoers/mkdefaults create mode 100644 plugins/sudoers/parse.c create mode 100644 plugins/sudoers/parse.h create mode 100644 plugins/sudoers/parse_ldif.c create mode 100644 plugins/sudoers/po/README create mode 100644 plugins/sudoers/po/ast.mo create mode 100644 plugins/sudoers/po/ast.po create mode 100644 plugins/sudoers/po/ca.mo create mode 100644 plugins/sudoers/po/ca.po create mode 100644 plugins/sudoers/po/cs.mo create mode 100644 plugins/sudoers/po/cs.po create mode 100644 plugins/sudoers/po/da.mo create mode 100644 plugins/sudoers/po/da.po create mode 100644 plugins/sudoers/po/de.mo create mode 100644 plugins/sudoers/po/de.po create mode 100644 plugins/sudoers/po/el.mo create mode 100644 plugins/sudoers/po/el.po create mode 100644 plugins/sudoers/po/eo.mo create mode 100644 plugins/sudoers/po/eo.po create mode 100644 plugins/sudoers/po/eu.mo create mode 100644 plugins/sudoers/po/eu.po create mode 100644 plugins/sudoers/po/fi.mo create mode 100644 plugins/sudoers/po/fi.po create mode 100644 plugins/sudoers/po/fr.mo create mode 100644 plugins/sudoers/po/fr.po create mode 100644 plugins/sudoers/po/fur.mo create mode 100644 plugins/sudoers/po/fur.po create mode 100644 plugins/sudoers/po/hr.mo create mode 100644 plugins/sudoers/po/hr.po create mode 100644 plugins/sudoers/po/hu.mo create mode 100644 plugins/sudoers/po/hu.po create mode 100644 plugins/sudoers/po/it.mo create mode 100644 plugins/sudoers/po/it.po create mode 100644 plugins/sudoers/po/ja.mo create mode 100644 plugins/sudoers/po/ja.po create mode 100644 plugins/sudoers/po/ko.mo create mode 100644 plugins/sudoers/po/ko.po create mode 100644 plugins/sudoers/po/lt.mo create mode 100644 plugins/sudoers/po/lt.po create mode 100644 plugins/sudoers/po/nb.mo create mode 100644 plugins/sudoers/po/nb.po create mode 100644 plugins/sudoers/po/nl.mo create mode 100644 plugins/sudoers/po/nl.po create mode 100644 plugins/sudoers/po/pl.mo create mode 100644 plugins/sudoers/po/pl.po create mode 100644 plugins/sudoers/po/pt.mo create mode 100644 plugins/sudoers/po/pt.po create mode 100644 plugins/sudoers/po/pt_BR.mo create mode 100644 plugins/sudoers/po/pt_BR.po create mode 100644 plugins/sudoers/po/ro.mo create mode 100644 plugins/sudoers/po/ro.po create mode 100644 plugins/sudoers/po/ru.mo create mode 100644 plugins/sudoers/po/ru.po create mode 100644 plugins/sudoers/po/sk.mo create mode 100644 plugins/sudoers/po/sk.po create mode 100644 plugins/sudoers/po/sl.mo create mode 100644 plugins/sudoers/po/sl.po create mode 100644 plugins/sudoers/po/sr.mo create mode 100644 plugins/sudoers/po/sr.po create mode 100644 plugins/sudoers/po/sudoers.pot create mode 100644 plugins/sudoers/po/sv.mo create mode 100644 plugins/sudoers/po/sv.po create mode 100644 plugins/sudoers/po/tr.mo create mode 100644 plugins/sudoers/po/tr.po create mode 100644 plugins/sudoers/po/uk.mo create mode 100644 plugins/sudoers/po/uk.po create mode 100644 plugins/sudoers/po/vi.mo create mode 100644 plugins/sudoers/po/vi.po create mode 100644 plugins/sudoers/po/zh_CN.mo create mode 100644 plugins/sudoers/po/zh_CN.po create mode 100644 plugins/sudoers/po/zh_TW.mo create mode 100644 plugins/sudoers/po/zh_TW.po create mode 100644 plugins/sudoers/policy.c create mode 100644 plugins/sudoers/prompt.c create mode 100644 plugins/sudoers/pwutil.c create mode 100644 plugins/sudoers/pwutil.h create mode 100644 plugins/sudoers/pwutil_impl.c create mode 100644 plugins/sudoers/rcstr.c create mode 100644 plugins/sudoers/redblack.c create mode 100644 plugins/sudoers/redblack.h create mode 100644 plugins/sudoers/regress/check_symbols/check_symbols.c create mode 100644 plugins/sudoers/regress/cvtsudoers/sudoers create mode 100755 plugins/sudoers/regress/cvtsudoers/sudoers.defs create mode 100644 plugins/sudoers/regress/cvtsudoers/test1.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test1.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test10.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test10.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test11.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test11.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test12.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test12.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test13.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test13.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test14.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test14.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test15.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test15.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test16.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test16.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test17.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test17.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test18.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test18.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test19.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test19.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test2.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test2.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test20.conf create mode 100644 plugins/sudoers/regress/cvtsudoers/test20.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test20.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test21.conf create mode 100644 plugins/sudoers/regress/cvtsudoers/test21.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test21.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test22.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test22.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test23.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test23.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test24.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test24.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test25.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test25.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test26.err.ok create mode 100644 plugins/sudoers/regress/cvtsudoers/test26.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test26.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test27.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test27.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test28.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test28.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test29.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test29.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test3.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test3.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test30.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test30.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test31.conf create mode 100644 plugins/sudoers/regress/cvtsudoers/test31.out.ok create mode 100644 plugins/sudoers/regress/cvtsudoers/test31.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test32.err.ok create mode 100644 plugins/sudoers/regress/cvtsudoers/test32.out.ok create mode 100644 plugins/sudoers/regress/cvtsudoers/test32.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test33.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test33.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test4.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test4.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test5.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test5.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test6.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test6.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test7.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test7.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test8.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test8.sh create mode 100644 plugins/sudoers/regress/cvtsudoers/test9.out.ok create mode 100755 plugins/sudoers/regress/cvtsudoers/test9.sh create mode 100644 plugins/sudoers/regress/env_match/check_env_pattern.c create mode 100644 plugins/sudoers/regress/env_match/data create mode 100644 plugins/sudoers/regress/exptilde/check_exptilde.c create mode 100644 plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c create mode 100644 plugins/sudoers/regress/parser/check_addr.c create mode 100644 plugins/sudoers/regress/parser/check_addr.in create mode 100644 plugins/sudoers/regress/parser/check_base64.c create mode 100644 plugins/sudoers/regress/parser/check_digest.c create mode 100644 plugins/sudoers/regress/parser/check_digest.out.ok create mode 100644 plugins/sudoers/regress/parser/check_fill.c create mode 100644 plugins/sudoers/regress/parser/check_gentime.c create mode 100644 plugins/sudoers/regress/parser/check_hexchar.c create mode 100644 plugins/sudoers/regress/starttime/check_starttime.c create mode 100644 plugins/sudoers/regress/sudoers/test1.in create mode 100644 plugins/sudoers/regress/sudoers/test1.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test1.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test1.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test1.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test10.in create mode 100644 plugins/sudoers/regress/sudoers/test10.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test10.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test10.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test10.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test11.in create mode 100644 plugins/sudoers/regress/sudoers/test11.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test11.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test11.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test11.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test12.in create mode 100644 plugins/sudoers/regress/sudoers/test12.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test12.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test12.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test12.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test13.in create mode 100644 plugins/sudoers/regress/sudoers/test13.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test13.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test13.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test13.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test14.in create mode 100644 plugins/sudoers/regress/sudoers/test14.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test14.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test14.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test14.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test14.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test15.in create mode 100644 plugins/sudoers/regress/sudoers/test15.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test15.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test15.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test15.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test15.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test16.in create mode 100644 plugins/sudoers/regress/sudoers/test16.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test16.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test16.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test16.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test16.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test17.in create mode 100644 plugins/sudoers/regress/sudoers/test17.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test17.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test17.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test17.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test17.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test18.in create mode 100644 plugins/sudoers/regress/sudoers/test18.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test18.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test18.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test18.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test19.in create mode 100644 plugins/sudoers/regress/sudoers/test19.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test19.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test19.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test19.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test19.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test2.in create mode 100644 plugins/sudoers/regress/sudoers/test2.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test2.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test2.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test2.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test20.in create mode 100644 plugins/sudoers/regress/sudoers/test20.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test20.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test20.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test20.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test20.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test21.in create mode 100644 plugins/sudoers/regress/sudoers/test21.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test21.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test21.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test21.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test21.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test22.in create mode 100644 plugins/sudoers/regress/sudoers/test22.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test22.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test22.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test22.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test22.sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test22.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test23.in create mode 100644 plugins/sudoers/regress/sudoers/test23.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test23.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test23.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test23.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test23.sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test23.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test24.in create mode 100644 plugins/sudoers/regress/sudoers/test24.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test24.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test24.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test24.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test24.sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test24.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test3.in create mode 100644 plugins/sudoers/regress/sudoers/test3.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test3.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test3.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test3.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test3.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test4.in create mode 100644 plugins/sudoers/regress/sudoers/test4.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test4.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test4.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test4.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test5.in create mode 100644 plugins/sudoers/regress/sudoers/test5.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test5.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test5.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test5.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test6.in create mode 100644 plugins/sudoers/regress/sudoers/test6.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test6.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok create mode 100644 plugins/sudoers/regress/sudoers/test6.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test6.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test7.in create mode 100644 plugins/sudoers/regress/sudoers/test7.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test7.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test7.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test7.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test8.in create mode 100644 plugins/sudoers/regress/sudoers/test8.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test8.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test8.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test8.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test9.in create mode 100644 plugins/sudoers/regress/sudoers/test9.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test9.ldif.ok create mode 100644 plugins/sudoers/regress/sudoers/test9.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test9.toke.ok create mode 100644 plugins/sudoers/regress/testsudoers/group create mode 100644 plugins/sudoers/regress/testsudoers/test1.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test1.sh create mode 100644 plugins/sudoers/regress/testsudoers/test10.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test10.sh create mode 100644 plugins/sudoers/regress/testsudoers/test11.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test11.sh create mode 100644 plugins/sudoers/regress/testsudoers/test12.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test12.sh create mode 100644 plugins/sudoers/regress/testsudoers/test13.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test13.sh create mode 100644 plugins/sudoers/regress/testsudoers/test14.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test14.sh create mode 100644 plugins/sudoers/regress/testsudoers/test15.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test15.sh create mode 100644 plugins/sudoers/regress/testsudoers/test2.inc create mode 100644 plugins/sudoers/regress/testsudoers/test2.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test2.sh create mode 100644 plugins/sudoers/regress/testsudoers/test3.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test3.sh create mode 100644 plugins/sudoers/regress/testsudoers/test4.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test4.sh create mode 100644 plugins/sudoers/regress/testsudoers/test5.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test5.sh create mode 100644 plugins/sudoers/regress/testsudoers/test6.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test6.sh create mode 100644 plugins/sudoers/regress/testsudoers/test7.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test7.sh create mode 100644 plugins/sudoers/regress/testsudoers/test8.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test8.sh create mode 100644 plugins/sudoers/regress/testsudoers/test9.out.ok create mode 100755 plugins/sudoers/regress/testsudoers/test9.sh create mode 100644 plugins/sudoers/regress/visudo/test1.out.ok create mode 100755 plugins/sudoers/regress/visudo/test1.sh create mode 100644 plugins/sudoers/regress/visudo/test10.out.ok create mode 100755 plugins/sudoers/regress/visudo/test10.sh create mode 100644 plugins/sudoers/regress/visudo/test2.err.ok create mode 100644 plugins/sudoers/regress/visudo/test2.out.ok create mode 100755 plugins/sudoers/regress/visudo/test2.sh create mode 100644 plugins/sudoers/regress/visudo/test3.err.ok create mode 100644 plugins/sudoers/regress/visudo/test3.out.ok create mode 100755 plugins/sudoers/regress/visudo/test3.sh create mode 100644 plugins/sudoers/regress/visudo/test4.out.ok create mode 100755 plugins/sudoers/regress/visudo/test4.sh create mode 100644 plugins/sudoers/regress/visudo/test5.out.ok create mode 100755 plugins/sudoers/regress/visudo/test5.sh create mode 100644 plugins/sudoers/regress/visudo/test6.out.ok create mode 100755 plugins/sudoers/regress/visudo/test6.sh create mode 100644 plugins/sudoers/regress/visudo/test7.out.ok create mode 100755 plugins/sudoers/regress/visudo/test7.sh create mode 100644 plugins/sudoers/regress/visudo/test8.err.ok create mode 100644 plugins/sudoers/regress/visudo/test8.out.ok create mode 100755 plugins/sudoers/regress/visudo/test8.sh create mode 100644 plugins/sudoers/regress/visudo/test9.out.ok create mode 100755 plugins/sudoers/regress/visudo/test9.sh create mode 100644 plugins/sudoers/set_perms.c create mode 100644 plugins/sudoers/solaris_audit.c create mode 100644 plugins/sudoers/solaris_audit.h create mode 100644 plugins/sudoers/sssd.c create mode 100644 plugins/sudoers/starttime.c create mode 100644 plugins/sudoers/strlist.c create mode 100644 plugins/sudoers/strlist.h create mode 100644 plugins/sudoers/stubs.c create mode 100644 plugins/sudoers/sudo_ldap.h create mode 100644 plugins/sudoers/sudo_ldap_conf.h create mode 100644 plugins/sudoers/sudo_nss.c create mode 100644 plugins/sudoers/sudo_nss.h create mode 100644 plugins/sudoers/sudo_printf.c create mode 100644 plugins/sudoers/sudoers.c create mode 100644 plugins/sudoers/sudoers.exp create mode 100644 plugins/sudoers/sudoers.h create mode 100644 plugins/sudoers/sudoers.in create mode 100644 plugins/sudoers/sudoers_debug.c create mode 100644 plugins/sudoers/sudoers_debug.h create mode 100644 plugins/sudoers/sudoers_version.h create mode 100644 plugins/sudoers/sudoreplay.c create mode 100644 plugins/sudoers/testsudoers.c create mode 100644 plugins/sudoers/timeout.c create mode 100644 plugins/sudoers/timestamp.c create mode 100644 plugins/sudoers/timestr.c create mode 100644 plugins/sudoers/toke.c create mode 100644 plugins/sudoers/toke.h create mode 100644 plugins/sudoers/toke.l create mode 100644 plugins/sudoers/toke_util.c create mode 100644 plugins/sudoers/tsdump.c create mode 100644 plugins/sudoers/tsgetgrpw.c create mode 100644 plugins/sudoers/tsgetgrpw.h create mode 100644 plugins/sudoers/visudo.c create mode 100644 plugins/system_group/Makefile.in create mode 100644 plugins/system_group/system_group.c create mode 100644 plugins/system_group/system_group.exp (limited to 'plugins') diff --git a/plugins/audit_json/Makefile.in b/plugins/audit_json/Makefile.in new file mode 100644 index 0000000..1172e8e --- /dev/null +++ b/plugins/audit_json/Makefile.in @@ -0,0 +1,220 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2020 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +devdir = @devdir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +scriptdir = $(top_srcdir)/scripts +incdir = $(top_srcdir)/include +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LT_LIBS = $(top_builddir)/lib/util/libsudo_util.la +LIBS = $(LT_LIBS) + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ +plugindir = @plugindir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/audit_json.exp +shlib_map = audit_json.map +shlib_opt = audit_json.opt + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +OBJS = audit_json.lo + +IOBJS = $(OBJS:.lo=.i) + +POBJS = $(IOBJS:.i=.plog) + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +all: audit_json.la + +depend: + $(scriptdir)/mkdep.pl --srcdir=$(top_srcdir) \ + --builddir=`pwd`/$(top_builddir) plugins/audit_json/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/audit_json/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/audit_json/Makefile + +.SUFFIXES: .c .h .i .lo .plog + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +audit_json.la: $(OBJS) $(LT_LIBS) @LT_LDDEP@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(OBJS) $(LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so + +pre-install: + +install: install-plugin + +install-dirs: + $(SHELL) $(scriptdir)/mkinstalldirs $(DESTDIR)$(plugindir) + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: install-dirs audit_json.la + if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) audit_json.la $(DESTDIR)$(plugindir); \ + fi + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/audit_json.la + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(plugindir)/audit_json.so$(INSTALL_BACKUP) + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a *.i *.plog \ + stamp-* core *.core core.* + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs $(shlib_map) $(shlib_opt) + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +getgrent.lo: $(srcdir)/getgrent.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/getgrent.c +getgrent.i: $(srcdir)/getgrent.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +getgrent.plog: getgrent.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/getgrent.c --i-file $< --output-file $@ +audit_json.lo: $(srcdir)/audit_json.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/audit_json.c +audit_json.i: $(srcdir)/audit_json.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +audit_json.plog: audit_json.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/audit_json.c --i-file $< --output-file $@ diff --git a/plugins/audit_json/audit_json.c b/plugins/audit_json/audit_json.c new file mode 100644 index 0000000..acc4360 --- /dev/null +++ b/plugins/audit_json/audit_json.c @@ -0,0 +1,697 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#include +#include +#include +#include +#include + +#include "pathnames.h" +#include "sudo_compat.h" +#include "sudo_conf.h" +#include "sudo_debug.h" +#include "sudo_dso.h" +#include "sudo_fatal.h" +#include "sudo_gettext.h" +#include "sudo_json.h" +#include "sudo_plugin.h" +#include "sudo_util.h" + +static int audit_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; +static sudo_conv_t audit_conv; +static sudo_printf_t audit_printf; + +static struct audit_state { + int submit_optind; + char uuid_str[37]; + bool accepted; + FILE *log_fp; + char *logfile; + char * const * settings; + char * const * user_info; + char * const * submit_argv; + char * const * submit_envp; +} state = { -1 }; + +/* Filter out entries in settings[] that are not really options. */ +char * const settings_filter[] = { + "debug_flags", + "max_groups", + "network_addrs", + "plugin_dir", + "plugin_path", + "progname", + NULL +}; + +static int +audit_json_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t plugin_printf, char * const settings[], + char * const user_info[], int submit_optind, char * const submit_argv[], + char * const submit_envp[], char * const plugin_options[], + const char **errstr) +{ + struct sudo_conf_debug_file_list debug_files = + TAILQ_HEAD_INITIALIZER(debug_files); + struct sudo_debug_file *debug_file; + const char *cp, *plugin_path = NULL; + unsigned char uuid[16]; + char * const *cur; + mode_t oldmask; + int fd, ret = -1; + debug_decl_vars(audit_json_open, SUDO_DEBUG_PLUGIN); + + audit_conv = conversation; + audit_printf = plugin_printf; + + /* + * Stash initial values. + */ + state.submit_optind = submit_optind; + state.settings = settings; + state.user_info = user_info; + state.submit_argv = submit_argv; + state.submit_envp = submit_envp; + + /* Initialize the debug subsystem. */ + for (cur = settings; (cp = *cur) != NULL; cur++) { + if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) { + cp += sizeof("debug_flags=") - 1; + if (sudo_debug_parse_flags(&debug_files, cp) == -1) + goto oom; + continue; + } + if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) { + plugin_path = cp + sizeof("plugin_path=") - 1; + continue; + } + } + if (plugin_path != NULL && !TAILQ_EMPTY(&debug_files)) { + audit_debug_instance = + sudo_debug_register(plugin_path, NULL, NULL, &debug_files); + if (audit_debug_instance == SUDO_DEBUG_INSTANCE_ERROR) { + *errstr = U_("unable to initialize debugging"); + goto bad; + } + sudo_debug_enter(__func__, __FILE__, __LINE__, sudo_debug_subsys); + } + + /* Create a UUID for this command for use with audit records. */ + sudo_uuid_create(uuid); + if (sudo_uuid_to_string(uuid, state.uuid_str, sizeof(state.uuid_str)) == NULL) { + *errstr = U_("unable to generate UUID"); + goto bad; + } + + /* Parse plugin_options to check for logfile option. */ + if (plugin_options != NULL) { + for (cur = plugin_options; (cp = *cur) != NULL; cur++) { + if (strncmp(cp, "logfile=", sizeof("logfile=") - 1) == 0) { + state.logfile = strdup(cp + sizeof("logfile=") - 1); + if (state.logfile == NULL) + goto oom; + } + } + } + if (state.logfile == NULL) { + if (asprintf(&state.logfile, "%s/sudo_audit.json", _PATH_SUDO_LOGDIR) == -1) + goto oom; + } + + /* open log file */ + /* TODO: support pipe */ + oldmask = umask(S_IRWXG|S_IRWXO); + fd = open(state.logfile, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); + (void)umask(oldmask); + if (fd == -1 || (state.log_fp = fdopen(fd, "w")) == NULL) { + *errstr = U_("unable to open audit system"); + if (fd != -1) + close(fd); + goto bad; + } + + ret = 1; + goto done; + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + *errstr = U_("unable to allocate memory"); + +bad: + if (state.log_fp != NULL) { + fclose(state.log_fp); + state.log_fp = NULL; + } + +done: + while ((debug_file = TAILQ_FIRST(&debug_files))) { + TAILQ_REMOVE(&debug_files, debug_file, entries); + free(debug_file->debug_file); + free(debug_file->debug_flags); + free(debug_file); + } + + debug_return_int(ret); +} + +static bool +add_key_value(struct json_container *json, const char *str) +{ + struct json_value json_value; + const char *cp, *errstr; + char name[256]; + size_t len; + debug_decl(add_key_value, SUDO_DEBUG_PLUGIN); + + if ((cp = strchr(str, '=')) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "ignoring bad command info string \"%s\"", str); + debug_return_bool(false); + } + len = (size_t)(cp - str); + cp++; + + /* Variable name currently limited to 256 chars */ + if (len >= sizeof(name)) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "ignoring long command info name \"%.*s\"", (int)len, str); + debug_return_bool(false); + } + memcpy(name, str, len); + name[len] = '\0'; + + /* Check for bool or number. */ + json_value.type = JSON_NULL; + switch (*cp) { + case '+': case '-': case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': case '8': case '9': + json_value.u.number = sudo_strtonum(cp, INT_MIN, INT_MAX, &errstr); + if (errstr == NULL) + json_value.type = JSON_NUMBER; + break; + case 't': + if (strcmp(cp, "true") == 0) { + json_value.type = JSON_BOOL; + json_value.u.boolean = true; + } + break; + case 'f': + if (strcmp(cp, "false") == 0) { + json_value.type = JSON_BOOL; + json_value.u.boolean = false; + } + break; + } + + /* Default to string type. */ + if (json_value.type == JSON_NULL) { + json_value.type = JSON_STRING; + json_value.u.string = cp; + } + + debug_return_bool(sudo_json_add_value(json, name, &json_value)); +} + +static bool +add_array(struct json_container *json, const char *name, char * const * array) +{ + const char *cp; + struct json_value json_value; + debug_decl(add_array, SUDO_DEBUG_PLUGIN); + + if (!sudo_json_open_array(json, name)) + debug_return_bool(false); + while ((cp = *array) != NULL) { + json_value.type = JSON_STRING; + json_value.u.string = cp; + if (!sudo_json_add_value(json, name, &json_value)) + debug_return_bool(false); + array++; + } + if (!sudo_json_close_array(json)) + debug_return_bool(false); + + debug_return_bool(true); +} + +static bool +filter_key_value(const char *kv, char * const * filter) +{ + char * const *cur; + const char *cp; + size_t namelen; + + if (filter != NULL) { + namelen = strcspn(kv, "="); + for (cur = filter; (cp = *cur) != NULL; cur++) { + if (strncmp(kv, cp, namelen) == 0 && cp[namelen] == '\0') + return true; + } + } + return false; +} + +static bool +add_key_value_object(struct json_container *json, const char *name, + char * const * array, char * const * filter) +{ + char * const *cur; + const char *cp; + bool empty = false; + debug_decl(add_key_value_object, SUDO_DEBUG_PLUGIN); + + if (filter != NULL) { + /* Avoid printing an empty object if everything is filtered. */ + empty = true; + for (cur = array; (cp = *cur) != NULL; cur++) { + if (!filter_key_value(cp, filter)) { + empty = false; + break; + } + } + } + if (!empty) { + if (!sudo_json_open_object(json, name)) + goto bad; + for (cur = array; (cp = *cur) != NULL; cur++) { + if (filter_key_value(cp, filter)) + continue; + if (!add_key_value(json, cp)) + goto bad; + } + if (!sudo_json_close_object(json)) + goto bad; + } + + debug_return_bool(true); +bad: + debug_return_bool(false); +} + +static bool +add_timestamp(struct json_container *json, struct timespec *ts) +{ + struct json_value json_value; + time_t secs = ts->tv_sec; + char timebuf[1024]; + struct tm *tm; + debug_decl(add_timestamp, SUDO_DEBUG_PLUGIN); + + if ((tm = gmtime(&secs)) == NULL) + debug_return_bool(false); + + sudo_json_open_object(json, "timestamp"); + + json_value.type = JSON_NUMBER; + json_value.u.number = ts->tv_sec; + sudo_json_add_value(json, "seconds", &json_value); + + json_value.type = JSON_NUMBER; + json_value.u.number = ts->tv_nsec; + sudo_json_add_value(json, "nanoseconds", &json_value); + + strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", tm); + json_value.type = JSON_STRING; + json_value.u.string = timebuf; + sudo_json_add_value(json, "iso8601", &json_value); + + strftime(timebuf, sizeof(timebuf), "%a %b %e %H:%M:%S %Z %Y", tm); + json_value.type = JSON_STRING; + json_value.u.string = timebuf; + sudo_json_add_value(json, "localtime", &json_value); + + sudo_json_close_object(json); + + debug_return_bool(true); +} + +static int +audit_write_json(struct json_container *json) +{ + struct stat sb; + int ret = -1; + debug_decl(audit_write_json, SUDO_DEBUG_PLUGIN); + + if (!sudo_lock_file(fileno(state.log_fp), SUDO_LOCK)) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to lock %s", state.logfile); + goto done; + } + + /* Note: assumes file ends in "\n}\n" */ + if (fstat(fileno(state.log_fp), &sb) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to stat %s", state.logfile); + goto done; + } + if (sb.st_size == 0) { + /* New file */ + putc('{', state.log_fp); + } else if (fseeko(state.log_fp, -3, SEEK_END) == 0) { + /* Continue file, overwrite the final "\n}\n" */ + putc(',', state.log_fp); + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek %s", state.logfile); + goto done; + } + + fputs(sudo_json_get_buf(json), state.log_fp); + fputs("\n}\n", state.log_fp); + fflush(state.log_fp); + (void)sudo_lock_file(fileno(state.log_fp), SUDO_UNLOCK); + + /* TODO: undo partial record on error */ + if (!ferror(state.log_fp)) + ret = true; + +done: + debug_return_int(ret); +} + +static int +audit_write_exit_record(int exit_status, int error) +{ + struct json_container json; + struct json_value json_value; + struct timespec now; + int ret = -1; + debug_decl(audit_write_exit_record, SUDO_DEBUG_PLUGIN); + + if (sudo_gettime_real(&now) == -1) { + sudo_warn("%s", U_("unable to read the clock")); + goto done; + } + + if (!sudo_json_init(&json, 4, false, false)) + goto oom; + if (!sudo_json_open_object(&json, "exit")) + goto oom; + + /* Write UUID */ + json_value.type = JSON_STRING; + json_value.u.string = state.uuid_str; + if (!sudo_json_add_value(&json, "uuid", &json_value)) + goto oom; + + /* Write time stamp */ + if (!add_timestamp(&json, &now)) + goto oom; + + if (error != 0) { + /* Error executing command */ + json_value.type = JSON_STRING; + json_value.u.string = strerror(error); + if (!sudo_json_add_value(&json, "error", &json_value)) + goto oom; + } else { + if (WIFEXITED(exit_status)) { + /* Command exited normally. */ + json_value.type = JSON_NUMBER; + json_value.u.number = WEXITSTATUS(exit_status); + if (!sudo_json_add_value(&json, "exit_value", &json_value)) + goto oom; + } else if (WIFSIGNALED(exit_status)) { + /* Command killed by signal. */ + char signame[SIG2STR_MAX]; + int signo = WTERMSIG(exit_status); + if (signo <= 0 || sig2str(signo, signame) == -1) { + json_value.type = JSON_NUMBER; + json_value.u.number = signo; + if (!sudo_json_add_value(&json, "signal", &json_value)) + goto oom; + } else { + json_value.type = JSON_STRING; + json_value.u.string = signame; // -V507 + if (!sudo_json_add_value(&json, "signal", &json_value)) + goto oom; + } + /* Core dump? */ + json_value.type = JSON_BOOL; + json_value.u.boolean = WCOREDUMP(exit_status); + if (!sudo_json_add_value(&json, "dumped_core", &json_value)) + goto oom; + /* Exit value */ + json_value.type = JSON_NUMBER; + json_value.u.number = WTERMSIG(exit_status) | 128; + if (!sudo_json_add_value(&json, "exit_value", &json_value)) + goto oom; + } + } + + if (!sudo_json_close_object(&json)) + goto oom; + + ret = audit_write_json(&json); + sudo_json_free(&json); +done: + debug_return_int(ret); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_json_free(&json); + debug_return_int(-1); +} + +static int +audit_write_record(const char *audit_str, const char *plugin_name, + unsigned int plugin_type, const char *reason, char * const command_info[], + char * const run_argv[], char * const run_envp[]) +{ + struct json_container json; + struct json_value json_value; + struct timespec now; + int ret = -1; + debug_decl(audit_write_record, SUDO_DEBUG_PLUGIN); + + if (sudo_gettime_real(&now) == -1) { + sudo_warn("%s", U_("unable to read the clock")); + goto done; + } + + if (!sudo_json_init(&json, 4, false, false)) + goto oom; + if (!sudo_json_open_object(&json, audit_str)) + goto oom; + + json_value.type = JSON_STRING; + json_value.u.string = plugin_name; + if (!sudo_json_add_value(&json, "plugin_name", &json_value)) + goto oom; + + switch (plugin_type) { + case SUDO_FRONT_END: + json_value.u.string = "front-end"; + break; + case SUDO_POLICY_PLUGIN: + json_value.u.string = "policy"; + break; + case SUDO_IO_PLUGIN: + json_value.u.string = "io"; + break; + case SUDO_APPROVAL_PLUGIN: + json_value.u.string = "approval"; + break; + case SUDO_AUDIT_PLUGIN: + json_value.u.string = "audit"; + break; + default: + json_value.u.string = "unknown"; + break; + } + json_value.type = JSON_STRING; + if (!sudo_json_add_value(&json, "plugin_type", &json_value)) + goto oom; + + /* error and reject audit events usually contain a reason. */ + if (reason != NULL) { + json_value.type = JSON_STRING; + json_value.u.string = reason; + if (!sudo_json_add_value(&json, "reason", &json_value)) + goto oom; + } + + json_value.type = JSON_STRING; + json_value.u.string = state.uuid_str; + if (!sudo_json_add_value(&json, "uuid", &json_value)) + goto oom; + + if (!add_timestamp(&json, &now)) + goto oom; + + /* Write key=value objects. */ + if (!add_key_value_object(&json, "options", state.settings, settings_filter)) + goto oom; + if (!add_key_value_object(&json, "user_info", state.user_info, NULL)) + goto oom; + if (command_info != NULL) { + if (!add_key_value_object(&json, "command_info", command_info, NULL)) + goto oom; + } + + /* Write submit_optind before submit_argv */ + json_value.type = JSON_NUMBER; + json_value.u.number = state.submit_optind; + if (!sudo_json_add_value(&json, "submit_optind", &json_value)) + goto oom; + + if (!add_array(&json, "submit_argv", state.submit_argv)) + goto oom; + if (!add_array(&json, "submit_envp", state.submit_envp)) + goto oom; + if (run_argv != NULL) { + if (!add_array(&json, "run_argv", run_argv)) + goto oom; + } + if (run_envp != NULL) { + if (!add_array(&json, "run_envp", run_envp)) + goto oom; + } + + if (!sudo_json_close_object(&json)) + goto oom; + + ret = audit_write_json(&json); + sudo_json_free(&json); + +done: + debug_return_int(ret); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_json_free(&json); + debug_return_int(-1); +} + +static int +audit_json_accept(const char *plugin_name, unsigned int plugin_type, + char * const command_info[], char * const run_argv[], + char * const run_envp[], const char **errstr) +{ + int ret; + debug_decl(audit_json_accept, SUDO_DEBUG_PLUGIN); + + /* Ignore the extra accept event from the sudo front-end. */ + if (plugin_type == SUDO_FRONT_END) + debug_return_int(true); + + state.accepted = true; + + ret = audit_write_record("accept", plugin_name, plugin_type, NULL, + command_info, run_argv, run_envp); + + debug_return_int(ret); +} + +static int +audit_json_reject(const char *plugin_name, unsigned int plugin_type, + const char *reason, char * const command_info[], const char **errstr) +{ + int ret; + debug_decl(audit_json_reject, SUDO_DEBUG_PLUGIN); + + ret = audit_write_record("reject", plugin_name, plugin_type, + reason, command_info, NULL, NULL); + + debug_return_int(ret); +} + +static int +audit_json_error(const char *plugin_name, unsigned int plugin_type, + const char *reason, char * const command_info[], const char **errstr) +{ + int ret; + debug_decl(audit_json_error, SUDO_DEBUG_PLUGIN); + + ret = audit_write_record("error", plugin_name, plugin_type, + reason, command_info, NULL, NULL); + + debug_return_int(ret); +} + +static void +audit_json_close(int status_type, int status) +{ + debug_decl(audit_json_close, SUDO_DEBUG_PLUGIN); + + switch (status_type) { + case SUDO_PLUGIN_NO_STATUS: + break; + case SUDO_PLUGIN_WAIT_STATUS: + audit_write_exit_record(status, 0); + break; + case SUDO_PLUGIN_EXEC_ERROR: + audit_write_exit_record(0, status); + break; + case SUDO_PLUGIN_SUDO_ERROR: + audit_write_record("error", "sudo", 0, strerror(status), + NULL, NULL, NULL); + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unexpected status type %d, value %d", status_type, status); + break; + } + + free(state.logfile); + if (state.log_fp != NULL) + fclose(state.log_fp); + + debug_return; +} + +static int +audit_json_show_version(int verbose) +{ + debug_decl(audit_json_show_version, SUDO_DEBUG_PLUGIN); + + audit_printf(SUDO_CONV_INFO_MSG, "JSON audit plugin version %s\n", + PACKAGE_VERSION); + + debug_return_int(true); +} + +sudo_dso_public struct audit_plugin audit_json = { + SUDO_AUDIT_PLUGIN, + SUDO_API_VERSION, + audit_json_open, + audit_json_close, + audit_json_accept, + audit_json_reject, + audit_json_error, + audit_json_show_version, + NULL, /* register_hooks */ + NULL /* deregister_hooks */ +}; diff --git a/plugins/audit_json/audit_json.exp b/plugins/audit_json/audit_json.exp new file mode 100644 index 0000000..9015117 --- /dev/null +++ b/plugins/audit_json/audit_json.exp @@ -0,0 +1 @@ +audit_json diff --git a/plugins/group_file/Makefile.in b/plugins/group_file/Makefile.in new file mode 100644 index 0000000..ab49bec --- /dev/null +++ b/plugins/group_file/Makefile.in @@ -0,0 +1,223 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2010-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +abs_srcdir = @abs_srcdir@ +top_srcdir = @top_srcdir@ +abs_top_srcdir = @abs_top_srcdir@ +top_builddir = @top_builddir@ +abs_top_builddir = @abs_top_builddir@ +devdir = @devdir@ +scriptdir = $(top_srcdir)/scripts +incdir = $(top_srcdir)/include +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LT_LIBS = $(top_builddir)/lib/util/libsudo_util.la +LIBS = $(LT_LIBS) + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ +plugindir = @plugindir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/group_file.exp +shlib_map = group_file.map +shlib_opt = group_file.opt + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +OBJS = group_file.lo getgrent.lo + +IOBJS = $(OBJS:.lo=.i) + +POBJS = $(IOBJS:.i=.plog) + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +all: group_file.la + +depend: + $(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \ + --builddir=$(abs_top_builddir) plugins/group_file/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/group_file/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/group_file/Makefile + +.SUFFIXES: .c .h .i .lo .plog + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +group_file.la: $(OBJS) $(LT_LIBS) @LT_LDDEP@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(OBJS) $(LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so + +pre-install: + +install: install-plugin + +install-dirs: + $(SHELL) $(scriptdir)/mkinstalldirs $(DESTDIR)$(plugindir) + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: install-dirs group_file.la + if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) group_file.la $(DESTDIR)$(plugindir); \ + fi + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/group_file.la + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(plugindir)/group_file.so$(INSTALL_BACKUP) + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la + -rm -f *.i *.plog stamp-* core *.core core.* + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs $(shlib_map) $(shlib_opt) + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +getgrent.lo: $(srcdir)/getgrent.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/getgrent.c +getgrent.i: $(srcdir)/getgrent.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +getgrent.plog: getgrent.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/getgrent.c --i-file $< --output-file $@ +group_file.lo: $(srcdir)/group_file.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/group_file.c +group_file.i: $(srcdir)/group_file.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +group_file.plog: group_file.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/group_file.c --i-file $< --output-file $@ diff --git a/plugins/group_file/getgrent.c b/plugins/group_file/getgrent.c new file mode 100644 index 0000000..142fd39 --- /dev/null +++ b/plugins/group_file/getgrent.c @@ -0,0 +1,188 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2005,2008,2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Trivial replacements for the libc getgr{uid,nam}() routines. + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_util.h" + +#undef GRMEM_MAX +#define GRMEM_MAX 200 + +static FILE *grf; +static const char *grfile = "/etc/group"; +static int gr_stayopen; + +void mysetgrfile(const char *); +void mysetgrent(void); +void myendgrent(void); +struct group *mygetgrent(void); +struct group *mygetgrnam(const char *); +struct group *mygetgrgid(gid_t); + +void +mysetgrfile(const char *file) +{ + grfile = file; + if (grf != NULL) + myendgrent(); +} + +void +mysetgrent(void) +{ + if (grf == NULL) { + grf = fopen(grfile, "r"); + if (grf != NULL) { + if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) { + fclose(grf); + grf = NULL; + } + } + } else { + rewind(grf); + } + gr_stayopen = 1; +} + +void +myendgrent(void) +{ + if (grf != NULL) { + fclose(grf); + grf = NULL; + } + gr_stayopen = 0; +} + +struct group * +mygetgrent(void) +{ + static struct group gr; + static char grbuf[LINE_MAX], *gr_mem[GRMEM_MAX+1]; + size_t len; + id_t id; + char *cp, *colon; + const char *errstr; + int n; + +next_entry: + if ((colon = fgets(grbuf, sizeof(grbuf), grf)) == NULL) + return NULL; + + memset(&gr, 0, sizeof(gr)); + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + gr.gr_name = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + gr.gr_passwd = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + goto next_entry; + gr.gr_gid = (gid_t)id; + len = strlen(colon); + if (len > 0 && colon[len - 1] == '\n') + colon[len - 1] = '\0'; + if (*colon != '\0') { + char *last; + + gr.gr_mem = gr_mem; + cp = strtok_r(colon, ",", &last); + for (n = 0; cp != NULL && n < GRMEM_MAX; n++) { + gr.gr_mem[n] = cp; + cp = strtok_r(NULL, ",", &last); + } + gr.gr_mem[n++] = NULL; + } else + gr.gr_mem = NULL; + return &gr; +} + +struct group * +mygetgrnam(const char *name) +{ + struct group *gr; + + if (grf == NULL) { + if ((grf = fopen(grfile, "r")) == NULL) + return NULL; + if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) { + fclose(grf); + return NULL; + } + } else { + rewind(grf); + } + while ((gr = mygetgrent()) != NULL) { + if (strcmp(gr->gr_name, name) == 0) + break; + } + if (!gr_stayopen) { + fclose(grf); + grf = NULL; + } + return gr; +} + +struct group * +mygetgrgid(gid_t gid) +{ + struct group *gr; + + if (grf == NULL) { + if ((grf = fopen(grfile, "r")) == NULL) + return NULL; + if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) { + fclose(grf); + return NULL; + } + } else { + rewind(grf); + } + while ((gr = mygetgrent()) != NULL) { + if (gr->gr_gid == gid) + break; + } + if (!gr_stayopen) { + fclose(grf); + grf = NULL; + } + return gr; +} diff --git a/plugins/group_file/group_file.c b/plugins/group_file/group_file.c new file mode 100644 index 0000000..02672b7 --- /dev/null +++ b/plugins/group_file/group_file.c @@ -0,0 +1,128 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "sudo_plugin.h" +#include "sudo_compat.h" + +/* + * Sample sudoers group plugin that uses an extra group file with the + * same format as /etc/group. + */ + +static sudo_printf_t sudo_log; + +extern void mysetgrfile(const char *); +extern void mysetgrent(void); +extern void myendgrent(void); +extern struct group *mygetgrnam(const char *); + +static int +sample_init(int version, sudo_printf_t sudo_printf, char *const argv[]) +{ + struct stat sb; + + sudo_log = sudo_printf; + + if (SUDO_API_VERSION_GET_MAJOR(version) != GROUP_API_VERSION_MAJOR) { + sudo_log(SUDO_CONV_ERROR_MSG, + "group_file: incompatible major version %d, expected %d\n", + SUDO_API_VERSION_GET_MAJOR(version), + GROUP_API_VERSION_MAJOR); + return -1; + } + + /* Check that the group file exists and has a safe mode. */ + if (argv == NULL || argv[0] == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, + "group_file: path to group file not specified\n"); + return -1; + } + if (stat(argv[0], &sb) != 0) { + sudo_log(SUDO_CONV_ERROR_MSG, + "group_file: %s: %s\n", argv[0], strerror(errno)); + return -1; + } + if ((sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) { + sudo_log(SUDO_CONV_ERROR_MSG, + "%s must be only be writable by owner\n", argv[0]); + return -1; + } + + mysetgrfile(argv[0]); + mysetgrent(); + + return true; +} + +static void +sample_cleanup(void) +{ + myendgrent(); +} + +/* + * Returns true if "user" is a member of "group", else false. + */ +static int +sample_query(const char *user, const char *group, const struct passwd *pwd) +{ + struct group *grp; + char **member; + + grp = mygetgrnam(group); + if (grp != NULL && grp->gr_mem != NULL) { + for (member = grp->gr_mem; *member != NULL; member++) { + if (strcasecmp(user, *member) == 0) + return true; + } + } + + return false; +} + +sudo_dso_public struct sudoers_group_plugin group_plugin = { + GROUP_API_VERSION, + sample_init, + sample_cleanup, + sample_query +}; diff --git a/plugins/group_file/group_file.exp b/plugins/group_file/group_file.exp new file mode 100644 index 0000000..a859d6c --- /dev/null +++ b/plugins/group_file/group_file.exp @@ -0,0 +1 @@ +group_plugin diff --git a/plugins/group_file/plugin_test.c b/plugins/group_file/plugin_test.c new file mode 100644 index 0000000..3d94e68 --- /dev/null +++ b/plugins/group_file/plugin_test.c @@ -0,0 +1,220 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudo_plugin.h" + +sudo_dso_public int main(int argc, char *argv[]); + +/* + * Simple driver to test sudoer group plugins. + * usage: plugin_test [-p "plugin.so plugin_args ..."] user:group ... + */ + +static void *group_handle; +static struct sudoers_group_plugin *group_plugin; + +static int +plugin_printf(int msg_type, const char *fmt, ...) +{ + va_list ap; + FILE *fp; + + switch (msg_type) { + case SUDO_CONV_INFO_MSG: + fp = stdout; + break; + case SUDO_CONV_ERROR_MSG: + fp = stderr; + break; + default: + errno = EINVAL; + return -1; + } + + va_start(ap, fmt); + vfprintf(fp, fmt, ap); + va_end(ap); + + return 0; +} + +/* + * Load the specified plugin and run its init function. + * Returns -1 if unable to open the plugin, else it returns + * the value from the plugin's init function. + */ +static int +group_plugin_load(char *plugin_info) +{ + char *args, path[PATH_MAX], savedch; + char **argv = NULL; + int rc; + + /* + * Fill in .so path and split out args (if any). + */ + if ((args = strpbrk(plugin_info, " \t")) != NULL) { + savedch = *args; + *args = '\0'; + } + if (strlcpy(path, plugin_info, sizeof(path)) >= sizeof(path)) { + fprintf(stderr, "path too long: %s\n", plugin_info); + return -1; + } + if (args != NULL) + *args++ = savedch; + + /* Open plugin and map in symbol. */ + group_handle = dlopen(path, RTLD_LAZY); + if (!group_handle) { + fprintf(stderr, "unable to dlopen %s: %s\n", path, dlerror()); + return -1; + } + group_plugin = dlsym(group_handle, "group_plugin"); + if (group_plugin == NULL) { + fprintf(stderr, "unable to find symbol \"group_plugin\" in %s\n", path); + return -1; + } + + if (SUDO_API_VERSION_GET_MAJOR(group_plugin->version) != GROUP_API_VERSION_MAJOR) { + fprintf(stderr, + "%s: incompatible group plugin major version %u, expected %d\n", + path, SUDO_API_VERSION_GET_MAJOR(group_plugin->version), + GROUP_API_VERSION_MAJOR); + return -1; + } + + /* + * Split args into a vector if specified. + */ + if (args != NULL) { + int ac = 0, wasblank = 1; + char *cp, *last; + + for (cp = args; *cp != '\0'; cp++) { + if (isblank((unsigned char)*cp)) { + wasblank = 1; + } else if (wasblank) { + wasblank = 0; + ac++; + } + } + if (ac != 0) { + argv = malloc((ac + 1) * sizeof(char *)); + if (argv == NULL) { + perror(NULL); + return -1; + } + ac = 0; + cp = strtok_r(args, " \t", &last); + while (cp != NULL) { + argv[ac++] = cp; + cp = strtok_r(NULL, " \t", &last); + } + argv[ac] = NULL; + } + } + + rc = (group_plugin->init)(GROUP_API_VERSION, plugin_printf, argv); + + free(argv); + + return rc; +} + +static void +group_plugin_unload(void) +{ + (group_plugin->cleanup)(); + dlclose(group_handle); + group_handle = NULL; +} + +static int +group_plugin_query(const char *user, const char *group, + const struct passwd *pwd) +{ + return (group_plugin->query)(user, group, pwd); +} + +static void +usage(void) +{ + fprintf(stderr, + "usage: plugin_test [-p \"plugin.so plugin_args ...\"] user:group ...\n"); + exit(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + int ch, i, found; + char *plugin = "group_file.so"; + char *user, *group; + struct passwd *pwd; + + while ((ch = getopt(argc, argv, "p:")) != -1) { + switch (ch) { + case 'p': + plugin = optarg; + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (argc < 1) + usage(); + + if (group_plugin_load(plugin) != 1) { + fprintf(stderr, "unable to load plugin: %s\n", plugin); + exit(EXIT_FAILURE); + } + + for (i = 0; argv[i] != NULL; i++) { + user = argv[i]; + group = strchr(argv[i], ':'); + if (group == NULL) + continue; + *group++ = '\0'; + pwd = getpwnam(user); + found = group_plugin_query(user, group, pwd); + printf("user %s %s in group %s\n", user, found ? "is" : "NOT ", group); + } + group_plugin_unload(); + + exit(EXIT_SUCCESS); +} + diff --git a/plugins/python/Makefile.in b/plugins/python/Makefile.in new file mode 100644 index 0000000..5315ff0 --- /dev/null +++ b/plugins/python/Makefile.in @@ -0,0 +1,520 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2019-2020 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +PACKAGE_TARNAME = @PACKAGE_TARNAME@ + +srcdir = @srcdir@ +abs_srcdir = @abs_srcdir@ +top_builddir = @top_builddir@ +abs_top_builddir = @abs_top_builddir@ +top_srcdir = @top_srcdir@ +abs_top_srcdir = @abs_top_srcdir@ +devdir = @devdir@ +scriptdir = $(top_srcdir)/scripts +incdir = $(top_srcdir)/include +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LT_LIBS = $(top_builddir)/lib/util/libsudo_util.la +LIBS = $(LT_LIBS) + +LIBPYTHONPLUGIN = python_plugin.la + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(top_srcdir) -DPLUGIN_DIR=\"$(plugindir)\" -DSRC_DIR=\"$(abs_srcdir)\" @CPPFLAGS@ @PYTHON_INCLUDE@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ @PYTHON_LIBS@ +LT_LDFLAGS = @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ +plugindir = @plugindir@ +docdir = @docdir@ +exampledir = @exampledir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/python_plugin.exp +shlib_map = python_plugin.map +shlib_opt = python_plugin.opt + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +EXAMPLES = example_conversation.py example_debugging.py example_group_plugin.py example_io_plugin.py example_policy_plugin.py \ + example_audit_plugin.py example_approval_plugin.py + +OBJS = python_plugin_common.lo python_plugin_policy.lo python_plugin_io.lo python_plugin_group.lo pyhelpers.lo \ + python_loghandler.lo \ + python_importblocker.lo python_convmessage.lo sudo_python_module.lo sudo_python_debug.lo \ + python_baseplugin.lo python_plugin_audit.lo python_plugin_approval.lo + +IOBJS = $(OBJS:.lo=.i) + +POBJS = $(IOBJS:.i=.plog) + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +TEST_PROGS = check_python_examples + +CHECK_PYTHON_EXAMPLES_OBJS = check_python_examples.o iohelpers.o testhelpers.o pyhelpers.lo sudo_python_debug.lo + +all: python_plugin.la + +depend: + $(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \ + --builddir=$(abs_top_builddir) plugins/python/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/python/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/python/Makefile + +.SUFFIXES: .c .h .i .lo .plog .o + +.c.o: + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +python_plugin.la: $(OBJS) $(LT_LIBS) @LT_LDDEP@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(OBJS) $(LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so + +pre-install: + +install: install-plugin install-doc + +install-dirs: + $(SHELL) $(scriptdir)/mkinstalldirs $(DESTDIR)$(plugindir) $(DESTDIR)$(exampledir) + +install-binaries: + +install-includes: + +install-doc: install-dirs + for f in $(EXAMPLES); do $(INSTALL) $(INSTALL_OWNER) -m 0644 $(srcdir)/$$f $(DESTDIR)$(exampledir); done + +install-plugin: install-dirs python_plugin.la + if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) python_plugin.la $(DESTDIR)$(plugindir); \ + fi + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/python_plugin.la + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(plugindir)/python_plugin.so$(INSTALL_BACKUP) + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la + -rm -f *.i *.plog stamp-* core *.core core.* $(TEST_PROGS) + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs $(shlib_map) $(shlib_opt) + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +check: $(TEST_PROGS) + @if test X"$(cross_compiling)" != X"yes"; then \ + ./check_python_examples ".libs/python_plugin.so"; \ + fi + +update_test_data: $(TEST_PROGS) + @if test X"$(cross_compiling)" != X"yes"; then \ + UPDATE_TESTDATA=1 ./check_python_examples ".libs/python_plugin.so"; \ + fi + +check_python_examples: $(CHECK_PYTHON_EXAMPLES_OBJS) $(LIBPYTHONPLUGIN) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_PYTHON_EXAMPLES_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +# Autogenerated dependencies, do not modify +check_python_examples.o: $(srcdir)/regress/check_python_examples.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/regress/iohelpers.h \ + $(srcdir)/regress/testhelpers.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/check_python_examples.c +check_python_examples.i: $(srcdir)/regress/check_python_examples.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/regress/iohelpers.h \ + $(srcdir)/regress/testhelpers.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_python_examples.plog: check_python_examples.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/check_python_examples.c --i-file $< --output-file $@ +iohelpers.o: $(srcdir)/regress/iohelpers.c $(incdir)/sudo_compat.h \ + $(srcdir)/regress/iohelpers.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/iohelpers.c +iohelpers.i: $(srcdir)/regress/iohelpers.c $(incdir)/sudo_compat.h \ + $(srcdir)/regress/iohelpers.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +iohelpers.plog: iohelpers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iohelpers.c --i-file $< --output-file $@ +pyhelpers.lo: $(srcdir)/pyhelpers.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/pyhelpers.c +pyhelpers.i: $(srcdir)/pyhelpers.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +pyhelpers.plog: pyhelpers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pyhelpers.c --i-file $< --output-file $@ +python_baseplugin.lo: $(srcdir)/python_baseplugin.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_baseplugin.c +python_baseplugin.i: $(srcdir)/python_baseplugin.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_baseplugin.plog: python_baseplugin.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_baseplugin.c --i-file $< --output-file $@ +python_convmessage.lo: $(srcdir)/python_convmessage.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_convmessage.c +python_convmessage.i: $(srcdir)/python_convmessage.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_convmessage.plog: python_convmessage.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_convmessage.c --i-file $< --output-file $@ +python_importblocker.lo: $(srcdir)/python_importblocker.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_importblocker.c +python_importblocker.i: $(srcdir)/python_importblocker.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_importblocker.plog: python_importblocker.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_importblocker.c --i-file $< --output-file $@ +python_loghandler.lo: $(srcdir)/python_loghandler.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_loghandler.c +python_loghandler.i: $(srcdir)/python_loghandler.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_loghandler.plog: python_loghandler.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_loghandler.c --i-file $< --output-file $@ +python_plugin_approval.lo: $(srcdir)/python_plugin_approval.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_approval_multi.inc \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_plugin_approval.c +python_plugin_approval.i: $(srcdir)/python_plugin_approval.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_approval_multi.inc \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_plugin_approval.plog: python_plugin_approval.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_plugin_approval.c --i-file $< --output-file $@ +python_plugin_audit.lo: $(srcdir)/python_plugin_audit.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_audit_multi.inc \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_plugin_audit.c +python_plugin_audit.i: $(srcdir)/python_plugin_audit.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_audit_multi.inc \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_plugin_audit.plog: python_plugin_audit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_plugin_audit.c --i-file $< --output-file $@ +python_plugin_common.lo: $(srcdir)/python_plugin_common.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_plugin_common.c +python_plugin_common.i: $(srcdir)/python_plugin_common.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_plugin_common.plog: python_plugin_common.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_plugin_common.c --i-file $< --output-file $@ +python_plugin_group.lo: $(srcdir)/python_plugin_group.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_plugin_group.c +python_plugin_group.i: $(srcdir)/python_plugin_group.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_plugin_group.plog: python_plugin_group.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_plugin_group.c --i-file $< --output-file $@ +python_plugin_io.lo: $(srcdir)/python_plugin_io.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/python_plugin_io_multi.inc \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_plugin_io.c +python_plugin_io.i: $(srcdir)/python_plugin_io.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(srcdir)/pyhelpers.h $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/python_plugin_io_multi.inc \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_plugin_io.plog: python_plugin_io.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_plugin_io.c --i-file $< --output-file $@ +python_plugin_policy.lo: $(srcdir)/python_plugin_policy.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/python_plugin_policy.c +python_plugin_policy.i: $(srcdir)/python_plugin_policy.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/python_plugin_common.h \ + $(srcdir)/sudo_python_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +python_plugin_policy.plog: python_plugin_policy.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/python_plugin_policy.c --i-file $< --output-file $@ +sudo_python_debug.lo: $(srcdir)/sudo_python_debug.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/sudo_python_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudo_python_debug.c +sudo_python_debug.i: $(srcdir)/sudo_python_debug.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/sudo_python_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudo_python_debug.plog: sudo_python_debug.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_python_debug.c --i-file $< --output-file $@ +sudo_python_module.lo: $(srcdir)/sudo_python_module.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudo_python_module.c +sudo_python_module.i: $(srcdir)/sudo_python_module.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h \ + $(srcdir)/sudo_python_debug.h \ + $(srcdir)/sudo_python_module.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudo_python_module.plog: sudo_python_module.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_python_module.c --i-file $< --output-file $@ +testhelpers.o: $(srcdir)/regress/testhelpers.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h $(srcdir)/regress/iohelpers.h \ + $(srcdir)/regress/testhelpers.h $(srcdir)/sudo_python_debug.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/testhelpers.c +testhelpers.i: $(srcdir)/regress/testhelpers.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/pyhelpers.h \ + $(srcdir)/pyhelpers_cpychecker.h $(srcdir)/regress/iohelpers.h \ + $(srcdir)/regress/testhelpers.h $(srcdir)/sudo_python_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +testhelpers.plog: testhelpers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/testhelpers.c --i-file $< --output-file $@ diff --git a/plugins/python/example_approval_plugin.py b/plugins/python/example_approval_plugin.py new file mode 100644 index 0000000..56ac865 --- /dev/null +++ b/plugins/python/example_approval_plugin.py @@ -0,0 +1,18 @@ +import sudo + +from datetime import datetime + + +class BusinessHoursApprovalPlugin(sudo.Plugin): + def check(self, command_info: tuple, run_argv: tuple, + run_env: tuple) -> int: + error_msg = "" + now = datetime.now() + if now.weekday() >= 5: + error_msg = "That is not allowed on the weekend!" + if now.hour < 8 or now.hour > 17: + error_msg = "That is not allowed outside the business hours!" + + if error_msg: + sudo.log_info(error_msg) + raise sudo.PluginReject(error_msg) diff --git a/plugins/python/example_audit_plugin.py b/plugins/python/example_audit_plugin.py new file mode 100644 index 0000000..d582e28 --- /dev/null +++ b/plugins/python/example_audit_plugin.py @@ -0,0 +1,84 @@ +import sudo + +import os + + +VERSION = 1.0 + + +class SudoAuditPlugin(sudo.Plugin): + def __init__(self, plugin_options, user_info, **kwargs): + # For loading multiple times, an optional "Id" can be specified + # as argument to identify the log lines + plugin_id = sudo.options_as_dict(plugin_options).get("Id", "") + self._log_line_prefix = "(AUDIT{}) ".format(plugin_id) + + user_info_dict = sudo.options_as_dict(user_info) + user = user_info_dict.get("user", "???") + uid = user_info_dict.get("uid", "???") + self._log("-- Started by user {} ({}) -- ".format(user, uid)) + + def __del__(self): + self._log("-- Finished --") + + def open(self, submit_optind: int, submit_argv: tuple) -> int: + # To cut out the sudo options, use "submit_optind": + program_args = submit_argv[submit_optind:] + if program_args: + self._log("Requested command: " + " ".join(program_args)) + + def accept(self, plugin_name, plugin_type, + command_info, run_argv, run_envp) -> int: + info = sudo.options_as_dict(command_info) + cmd = list(run_argv) + cmd[0] = info.get("command") + self._log("Accepted command: {}".format(" ".join(cmd))) + self._log(" By the plugin: {} (type={})".format( + plugin_name, self.__plugin_type_str(plugin_type))) + + self._log(" Environment: " + " ".join(run_envp)) + + def reject(self, plugin_name, plugin_type, audit_msg, command_info) -> int: + self._log("Rejected by plugin {} (type={}): {}".format( + plugin_name, self.__plugin_type_str(plugin_type), audit_msg)) + + def error(self, plugin_name, plugin_type, audit_msg, command_info) -> int: + self._log("Plugin {} (type={}) got an error: {}".format( + plugin_name, self.__plugin_type_str(plugin_type), audit_msg)) + + def close(self, status_kind: int, status: int) -> None: + if status_kind == sudo.EXIT_REASON.NO_STATUS: + self._log("The command was not executed") + + elif status_kind == sudo.EXIT_REASON.WAIT_STATUS: + if os.WIFEXITED(status): + self._log("Command returned with exit code " + "{}".format(os.WEXITSTATUS(status))) + elif os.WIFSIGNALED(status): + self._log("Command exited due to signal " + "{}".format(os.WTERMSIG(status))) + else: + raise sudo.PluginError("Failed to understand wait exit status") + + elif status_kind == sudo.EXIT_REASON.EXEC_ERROR: + self._log("Sudo has failed to execute the command, " + "execve returned {}".format(status)) + + elif status_kind == sudo.EXIT_REASON.SUDO_ERROR: + self._log("Sudo has run into an error: {}".format(status)) + + else: + raise Exception("Command returned unknown status kind {}".format( + status_kind)) + + def show_version(self, is_verbose: bool) -> int: + version_str = " (version=1.0)" if is_verbose else "" + sudo.log_info("Python Example Audit Plugin" + version_str) + + def _log(self, string): + # For the example, we just log to output (this could be a file) + sudo.log_info(self._log_line_prefix, string) + + @staticmethod + def __plugin_type_str(plugin_type): + return sudo.PLUGIN_TYPE(plugin_type).name diff --git a/plugins/python/example_conversation.py b/plugins/python/example_conversation.py new file mode 100644 index 0000000..8e68d36 --- /dev/null +++ b/plugins/python/example_conversation.py @@ -0,0 +1,98 @@ +import sudo +import signal +from os import path + + +class ReasonLoggerIOPlugin(sudo.Plugin): + """ + An example sudo plugin demonstrating how to use the sudo conversation API. + + From the python plugin, you can ask something from the user using the + "sudo.conv" function. It expects one or more "sudo.ConvMessage" instances + which specifies how the interaction has to look like. + + sudo.ConvMessage has the following fields (see help(sudo.ConvMessage)): + msg_type: int Specifies the type of the conversation. + See sudo.CONV.* constants below. + timeout: int The maximum amount of time for the conversation + in seconds. After the timeout exceeds, the "sudo.conv" + function will raise sudo.ConversationInterrupted + exception. + msg: str The message to display for the user. + + To specify the conversion type you can use the following constants: + sudo.CONV.PROMPT_ECHO_OFF + sudo.CONV.PROMPT_ECHO_ON + sudo.CONV.ERROR_MSG + sudo.CONV.INFO_MSG + sudo.CONV.PROMPT_MASK + sudo.CONV.PROMPT_ECHO_OK + sudo.CONV.PREFER_TTY + """ + + def open(self, argv, command_info): + try: + conv_timeout = 120 # in seconds + sudo.log_info("Please provide your reason " + "for executing {}".format(argv)) + + # We ask two questions, the second is not visible on screen, + # so the user can hide a hidden message in case of criminals are + # forcing him for running the command. + # You can either specify the arguments in strict order (timeout + # being optional), or use named arguments. + message1 = sudo.ConvMessage(sudo.CONV.PROMPT_ECHO_ON, + "Reason: ", + conv_timeout) + message2 = sudo.ConvMessage(msg="Secret reason: ", + timeout=conv_timeout, + msg_type=sudo.CONV.PROMPT_MASK) + reply1, reply2 = sudo.conv(message1, message2, + on_suspend=self.on_conversation_suspend, + on_resume=self.on_conversation_resume) + + with open(self._log_file_path(), "a") as file: + print("Executed", ' '.join(argv), file=file) + print("Reason:", reply1, file=file) + print("Hidden reason:", reply2, file=file) + + except sudo.ConversationInterrupted: + sudo.log_error("You did not answer in time") + return sudo.RC.REJECT + + def on_conversation_suspend(self, signum): + # This is just an example of how to do something on conversation + # suspend. You can skip specifying 'on_suspend' argument if there + # is no need + sudo.log_info("conversation suspend: signal", + self._signal_name(signum)) + + def on_conversation_resume(self, signum): + # This is just an example of how to do something on conversation + # resume. You can skip specifying 'on_resume' argument if there + # is no need + sudo.log_info("conversation resume: signal was", + self._signal_name(signum)) + + # helper functions: + if hasattr(signal, "Signals"): + @classmethod + def _signal_name(cls, signum: int): + try: + return signal.Signals(signum).name + except Exception: + return "{}".format(signum) + else: + @classmethod + def _signal_name(cls, signum: int): + for n, v in sorted(signal.__dict__.items()): + if v != signum: + continue + if n.startswith("SIG") and not n.startswith("SIG_"): + return n + return "{}".format(signum) + + def _log_file_path(self): + options_dict = sudo.options_as_dict(self.plugin_options) + log_path = options_dict.get("LogPath", "/tmp") + return path.join(log_path, "sudo_reasons.txt") diff --git a/plugins/python/example_debugging.py b/plugins/python/example_debugging.py new file mode 100644 index 0000000..01310c6 --- /dev/null +++ b/plugins/python/example_debugging.py @@ -0,0 +1,85 @@ +import sudo + +import logging + + +class DebugDemoPlugin(sudo.Plugin): + """ + An example sudo plugin demonstrating the debugging capabilities. + + You can install it as an extra IO plugin for example by adding the + following line to sudo.conf: + Plugin python_io python_plugin.so \ + ModulePath=/example_debugging.py \ + ClassName=DebugDemoPlugin + + To see the plugin's debug output, use the following line in sudo.conf: + Debug python_plugin.so \ + /var/log/sudo_python_debug plugin@trace,c_calls@trace + ^ ^-- the options for the logging + ^----- the output will be placed here + + The options for the logging is in format of multiple "subsystem@level" + separated by commas (","). + The most interesting subsystems are: + plugin Shows each call of sudo.debug API in the log + - py_calls Logs whenever a C function calls into the python module. + (For example calling this __init__ function.) + c_calls Logs whenever python calls into a C sudo API function + + You can also specify "all" as subsystem name to get the debug messages of + all subsystems. + + Other subsystems available: + internal logs internal functions of the python language wrapper + sudo_cb logs when sudo calls into its plugin API + load logs python plugin loading / unloading + + Log levels + crit sudo.DEBUG.CRIT --> only critical messages + err sudo.DEBUG.ERROR + warn sudo.DEBUG.WARN + notice sudo.DEBUG.NOTICE + diag sudo.DEBUG.DIAG + info sudo.DEBUG.INFO + trace sudo.DEBUG.TRACE + debug sudo.DEBUG.DEBUG --> very extreme verbose debugging + + See the sudo.conf manual for more details ("man sudo.conf"). + + """ + + def __init__(self, plugin_options, **kwargs): + # Specify: "py_calls@info" debug option to show the call to this + # constructor and the arguments passed in + + # Specifying "plugin@err" debug option will show this message + # (or any more verbose level) + sudo.debug(sudo.DEBUG.ERROR, "My demo purpose plugin shows " + "this ERROR level debug message") + + # Specifying "plugin@info" debug option will show this message + # (or any more verbose level) + sudo.debug(sudo.DEBUG.INFO, "My demo purpose plugin shows " + "this INFO level debug message") + + # You can also use python log system, because sudo sets its log handler + # on the root logger. + # Note that the level of python logging is separate than the one set in + # sudo.conf. If using the python logger, each will have effect. + logger = logging.getLogger() + logger.setLevel(logging.INFO) + logger.error("Python log system shows this ERROR level debug message") + logger.info("Python log system shows this INFO level debug message") + + # If you raise the level to info or below, the call of the debug + # will also be logged. + # An example output you will see in the debug log file: + # Dec 5 15:19:19 sudo[123040] __init__ @ /.../example_debugging.py:54 debugs: + # Dec 5 15:19:19 sudo[123040] My demo purpose plugin shows this ERROR level debug message + + # Specify: "c_calls@diag" debug option to show this call and its + # arguments. If you specify info debug level instead ("c_calls@info"), + # you will also see the python function and line from which you called + # the 'options_as_dict' function. + self.plugin_options = sudo.options_as_dict(plugin_options) diff --git a/plugins/python/example_group_plugin.py b/plugins/python/example_group_plugin.py new file mode 100644 index 0000000..bb53fdb --- /dev/null +++ b/plugins/python/example_group_plugin.py @@ -0,0 +1,45 @@ +import sudo + + +class SudoGroupPlugin(sudo.Plugin): + """Example sudo input/output plugin + + Demonstrates how to use the sudo group plugin API. Typing annotations are + just here for the help on the syntax (requires python >= 3.5). + + On detailed description of the functions refer to sudo_plugin manual (man + sudo_plugin). + + Most functions can express error or reject through their "int" return value + as documented in the manual. The sudo module also has constants for these: + sudo.RC.ACCEPT / sudo.RC.OK 1 + sudo.RC.REJECT 0 + sudo.RC.ERROR -1 + sudo.RC.USAGE_ERROR -2 + + If the plugin encounters an error, instead of just returning sudo.RC.ERROR + result code it can also add a message describing the problem. + This can be done by raising the special exception: + raise sudo.PluginError("Message") + This added message will be used by the audit plugins. + + If the function returns "None" (for example does not call return), it will + be considered sudo.RC.OK. If an exception other than sudo.PluginError is + raised, its backtrace will be shown to the user and the plugin function + returns sudo.RC.ERROR. If that is not acceptable, catch it. + """ + + # -- Plugin API functions -- + def query(self, user: str, group: str, user_pwd: tuple): + """Query if user is part of the specified group. + + Beware that user_pwd can be None if user is not present in the password + database. Otherwise it is a tuple convertible to pwd.struct_passwd. + """ + hardcoded_user_groups = { + "testgroup": ["testuser1", "testuser2"], + "mygroup": ["test"] + } + + group_has_user = user in hardcoded_user_groups.get(group, []) + return sudo.RC.ACCEPT if group_has_user else sudo.RC.REJECT diff --git a/plugins/python/example_io_plugin.py b/plugins/python/example_io_plugin.py new file mode 100644 index 0000000..dc4c6a7 --- /dev/null +++ b/plugins/python/example_io_plugin.py @@ -0,0 +1,153 @@ +import sudo + +from os import path +import errno +import signal +import sys +import json + + +VERSION = 1.0 + + +class SudoIOPlugin(sudo.Plugin): + """Example sudo input/output plugin + + Demonstrates how to use the sudo IO plugin API. All functions are added as + an example on their syntax, but note that all of them are optional. + + On detailed description of the functions refer to sudo_plugin manual (man + sudo_plugin). + + Most functions can express error or reject through their "int" return value + as documented in the manual. The sudo module also has constants for these: + sudo.RC.ACCEPT / sudo.RC.OK 1 + sudo.RC.REJECT 0 + sudo.RC.ERROR -1 + sudo.RC.USAGE_ERROR -2 + + If the plugin encounters an error, instead of just returning sudo.RC.ERROR + result code it can also add a message describing the problem. + This can be done by raising the special exception: + raise sudo.PluginError("Message") + This added message will be used by the audit plugins. + + If the function returns "None" (for example does not call return), it will + be considered sudo.RC.OK. If an exception other than sudo.PluginError is + raised, its backtrace will be shown to the user and the plugin function + returns sudo.RC.ERROR. If that is not acceptable, catch it. + """ + + # -- Plugin API functions -- + + def __init__(self, version: str, + plugin_options: tuple, **kwargs): + """The constructor of the IO plugin. + + Other variables you can currently use as arguments are: + user_env: tuple + settings: tuple + user_info: tuple + + For their detailed description, see the open() call of the C plugin API + in the sudo manual ("man sudo"). + """ + if not version.startswith("1."): + raise sudo.SudoException( + "This plugin plugin is not compatible with python plugin" + "API version {}".format(version)) + + # convert tuple of "key=value"s to dict + plugin_options = sudo.options_as_dict(plugin_options) + + log_path = plugin_options.get("LogPath", "/tmp") + self._open_log_file(path.join(log_path, "sudo.log")) + self._log("", "-- Plugin STARTED --") + + def __del__(self): + if hasattr(self, "_log_file"): + self._log("", "-- Plugin DESTROYED --") + self._log_file.close() + + def open(self, argv: tuple, + command_info: tuple) -> int: + """Receives the command the user wishes to run. + + This function works the same as open() call of the C IO plugin API (see + sudo manual), except that: + - It only gets called before the user would execute some command (and + not for a version query for example). + - Other arguments of the C open() call are received through the + constructor. + """ + self._log("EXEC", " ".join(argv)) + self._log("EXEC info", json.dumps(command_info, indent=4)) + + return sudo.RC.ACCEPT + + def log_ttyout(self, buf: str) -> int: + return self._log("TTY OUT", buf.strip()) + + def log_ttyin(self, buf: str) -> int: + return self._log("TTY IN", buf.strip()) + + def log_stdin(self, buf: str) -> int: + return self._log("STD IN", buf.strip()) + + def log_stdout(self, buf: str) -> int: + return self._log("STD OUT", buf.strip()) + + def log_stderr(self, buf: str) -> int: + return self._log("STD ERR", buf.strip()) + + def change_winsize(self, line: int, cols: int) -> int: + self._log("WINSIZE", "{}x{}".format(line, cols)) + + def log_suspend(self, signo: int) -> int: + signal_description = self._signal_name(signo) + + self._log("SUSPEND", signal_description) + + def show_version(self, is_verbose: int) -> int: + sudo.log_info("Python Example IO Plugin version: {}".format(VERSION)) + if is_verbose: + sudo.log_info("Python interpreter version:", sys.version) + + def close(self, exit_status: int, error: int) -> None: + """Called when a command execution finished. + + Works the same as close() from C API (see sudo_plugin manual), except + that it only gets called if there was a command execution trial (open() + returned with sudo.RC.ACCEPT). + """ + if error == 0: + self._log("CLOSE", "Command returned {}".format(exit_status)) + else: + error_name = errno.errorcode.get(error, "???") + self._log("CLOSE", "Failed to execute, execve returned {} ({})" + .format(error, error_name)) + + # -- Helper functions -- + + def _open_log_file(self, log_path): + sudo.log_info("Example sudo python plugin will log to", log_path) + self._log_file = open(log_path, "a") + + def _log(self, type, message): + print(type, message, file=self._log_file) + return sudo.RC.ACCEPT + + if hasattr(signal, "Signals"): + def _signal_name(cls, signo: int): + try: + return signal.Signals(signo).name + except ValueError: + return "signal {}".format(signo) + else: + def _signal_name(cls, signo: int): + for n, v in sorted(signal.__dict__.items()): + if v != signo: + continue; + if n.startswith("SIG") and not n.startswith("SIG_"): + return n + return "signal {}".format(signo) diff --git a/plugins/python/example_policy_plugin.py b/plugins/python/example_policy_plugin.py new file mode 100644 index 0000000..dfb15ca --- /dev/null +++ b/plugins/python/example_policy_plugin.py @@ -0,0 +1,172 @@ +import sudo + +import errno +import sys +import os +import pwd +import grp +import shutil + + +VERSION = 1.0 + + +class SudoPolicyPlugin(sudo.Plugin): + """Example sudo policy plugin + + Demonstrates how to use the sudo policy plugin API. All functions are added + as an example on their syntax, but note that most of them are optional + (except check_policy). + + On detailed description of the functions refer to sudo_plugin manual (man + sudo_plugin). + + Most functions can express error or reject through their "int" return value + as documented in the manual. The sudo module also has constants for these: + sudo.RC.ACCEPT / sudo.RC.OK 1 + sudo.RC.REJECT 0 + sudo.RC.ERROR -1 + sudo.RC.USAGE_ERROR -2 + + If the plugin encounters an error, instead of just returning sudo.RC.ERROR + result code it can also add a message describing the problem. + This can be done by raising the special exception: + raise sudo.PluginError("Message") + This added message will be used by the audit plugins. + + If the function returns "None" (for example does not call return), it will + be considered sudo.RC.OK. If an exception other than sudo.PluginError is + raised, its backtrace will be shown to the user and the plugin function + returns sudo.RC.ERROR. If that is not acceptable, catch it. + """ + + _allowed_commands = ("id", "whoami") + _safe_password = "12345" + + # -- Plugin API functions -- + + def __init__(self, user_env: tuple, settings: tuple, + version: str, **kwargs): + """The constructor matches the C sudo plugin API open() call + + Other variables you can currently use as arguments are: + user_info: tuple + plugin_options: tuple + + For their detailed description, see the open() call of the C plugin API + in the sudo manual ("man sudo"). + """ + if not version.startswith("1."): + raise sudo.PluginError( + "This plugin plugin is not compatible with python plugin" + "API version {}".format(version)) + + self.user_env = sudo.options_as_dict(user_env) + self.settings = sudo.options_as_dict(settings) + + def check_policy(self, argv: tuple, env_add: tuple): + cmd = argv[0] + # Example for a simple reject: + if not self._is_command_allowed(cmd): + sudo.log_error("You are not allowed to run this command!") + return sudo.RC.REJECT + + raise sudo.PluginError("You are not allowed to run this command!") + + # The environment the command will be executed with (we allow any here) + user_env_out = sudo.options_from_dict(self.user_env) + env_add + + command_info_out = sudo.options_from_dict({ + "command": self._find_on_path(cmd), # Absolute path of command + "runas_uid": self._runas_uid(), # The user id + "runas_gid": self._runas_gid(), # The group id + }) + + return (sudo.RC.ACCEPT, command_info_out, argv, user_env_out) + + def init_session(self, user_pwd: tuple, user_env: tuple): + """Perform session setup + + Beware that user_pwd can be None if user is not present in the password + database. Otherwise it is a tuple convertible to pwd.struct_passwd. + """ + # conversion example: + user_pwd = pwd.struct_passwd(user_pwd) if user_pwd else None + + # This is how you change the user_env: + return (sudo.RC.OK, user_env + ("PLUGIN_EXAMPLE_ENV=1",)) + + # If you do not want to change user_env, you can just return (or None): + # return sudo.RC.OK + + def list(self, argv: tuple, is_verbose: int, user: str): + cmd = argv[0] if argv else None + as_user_text = "as user '{}'".format(user) if user else "" + + if cmd: + allowed_text = "" if self._is_command_allowed(cmd) else "NOT " + sudo.log_info("You are {}allowed to execute command '{}'{}" + .format(allowed_text, cmd, as_user_text)) + + if not cmd or is_verbose: + sudo.log_info("Only the following commands are allowed:", + ", ".join(self._allowed_commands), as_user_text) + + def validate(self): + pass # we have no cache + + def invalidate(self, remove: int): + pass # we have no cache + + def show_version(self, is_verbose: int): + sudo.log_info("Python Example Policy Plugin " + "version: {}".format(VERSION)) + if is_verbose: + sudo.log_info("Python interpreter version:", sys.version) + + def close(self, exit_status: int, error: int) -> None: + if error == 0: + sudo.log_info("The command returned with exit_status {}".format( + exit_status)) + else: + error_name = errno.errorcode.get(error, "???") + sudo.log_error( + "Failed to execute command, execve syscall returned " + "{} ({})".format(error, error_name)) + + # -- Helper functions -- + + def _is_command_allowed(self, cmd): + return os.path.basename(cmd) in self._allowed_commands + + def _find_on_path(self, cmd): + if os.path.isabs(cmd): + return cmd + + path = self.user_env.get("PATH", "/usr/bin:/bin") + absolute_cmd = shutil.which(cmd, path=path) + if not absolute_cmd: + raise sudo.PluginError("Can not find cmd '{}' on PATH".format(cmd)) + return absolute_cmd + + def _runas_pwd(self): + runas_user = self.settings.get("runas_user") or "root" + try: + return pwd.getpwnam(runas_user) + except KeyError: + raise sudo.PluginError("Could not find user " + "'{}'".format(runas_user)) + + def _runas_uid(self): + return self._runas_pwd().pw_uid + + def _runas_gid(self): + runas_group = self.settings.get("runas_group") + if runas_group is None: + return self._runas_pwd().pw_gid + + try: + return grp.getgrnam(runas_group).gr_gid + except KeyError: + raise sudo.PluginError( + "Could not find group '{}'".format(runas_group)) diff --git a/plugins/python/pyhelpers.c b/plugins/python/pyhelpers.c new file mode 100644 index 0000000..6b235f3 --- /dev/null +++ b/plugins/python/pyhelpers.c @@ -0,0 +1,568 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "pyhelpers.h" + +#include +#include +#include "pathnames.h" + +static int +_sudo_printf_default(int msg_type, const char *fmt, ...) +{ + FILE *fp = stdout; + FILE *ttyfp = NULL; + va_list ap; + int len; + + if (ISSET(msg_type, SUDO_CONV_PREFER_TTY)) { + /* Try writing to /dev/tty first. */ + ttyfp = fopen(_PATH_TTY, "w"); + } + + switch (msg_type & 0xff) { + case SUDO_CONV_ERROR_MSG: + fp = stderr; + FALLTHROUGH; + case SUDO_CONV_INFO_MSG: + va_start(ap, fmt); + len = vfprintf(ttyfp ? ttyfp : fp, fmt, ap); + va_end(ap); + break; + default: + len = -1; + errno = EINVAL; + break; + } + + if (ttyfp != NULL) + fclose(ttyfp); + + return len; +} + + +struct PythonContext py_ctx = { + .sudo_log = &_sudo_printf_default, +}; + + +int +py_is_sudo_log_available(void) +{ + debug_decl(py_is_sudo_log_available, PYTHON_DEBUG_INTERNAL); + debug_return_int(py_ctx.sudo_log != &_sudo_printf_default); +} + +char * +py_join_str_list(PyObject *py_str_list, const char *separator) +{ + debug_decl(py_join_str_list, PYTHON_DEBUG_INTERNAL); + + char *result = NULL; + PyObject *py_separator = NULL; + PyObject *py_str = NULL; + + py_separator = PyUnicode_FromString(separator); + if (py_separator == NULL) + goto cleanup; + + py_str = PyObject_CallMethod(py_separator, "join", "(O)", py_str_list); + if (py_str == NULL) { + goto cleanup; + } + + const char *str = PyUnicode_AsUTF8(py_str); + if (str != NULL) { + result = strdup(str); + } + +cleanup: + Py_XDECREF(py_str); + Py_XDECREF(py_separator); + + debug_return_str(result); +} + +char * +py_create_traceback_string(PyObject *py_traceback) +{ + debug_decl(py_create_traceback_string, PYTHON_DEBUG_INTERNAL); + if (py_traceback == NULL) + debug_return_str(strdup("")); + + char* traceback = NULL; + + + PyObject *py_traceback_module = PyImport_ImportModule("traceback"); + if (py_traceback_module == NULL) { + PyErr_Clear(); // do not care, we just won't show backtrace + } else { + PyObject *py_traceback_str_list = PyObject_CallMethod(py_traceback_module, "format_tb", "(O)", py_traceback); + + if (py_traceback_str_list != NULL) { + traceback = py_join_str_list(py_traceback_str_list, ""); + Py_DECREF(py_traceback_str_list); + } + + Py_CLEAR(py_traceback_module); + } + + debug_return_str(traceback ? traceback : strdup("")); +} + +void +py_log_last_error(const char *context_message) +{ + debug_decl(py_log_last_error, PYTHON_DEBUG_INTERNAL); + if (!PyErr_Occurred()) { + py_sudo_log(SUDO_CONV_ERROR_MSG, "%s\n", context_message); + debug_return; + } + + PyObject *py_type = NULL, *py_message = NULL, *py_traceback = NULL; + PyErr_Fetch(&py_type, &py_message, &py_traceback); + + char *message = py_message ? py_create_string_rep(py_message) : NULL; + + py_sudo_log(SUDO_CONV_ERROR_MSG, "%s%s%s\n", + context_message ? context_message : "", + context_message && *context_message ? ": " : "", + message ? message : "(NULL)"); + free(message); + + if (py_traceback != NULL) { + char *traceback = py_create_traceback_string(py_traceback); + py_sudo_log(SUDO_CONV_INFO_MSG, "Traceback:\n%s\n", traceback); + free(traceback); + } + + Py_XDECREF(py_type); + Py_XDECREF(py_message); + Py_XDECREF(py_traceback); + debug_return; +} + +PyObject * +py_str_array_to_tuple_with_count(Py_ssize_t count, char * const strings[]) +{ + debug_decl(py_str_array_to_tuple_with_count, PYTHON_DEBUG_INTERNAL); + + PyObject *py_argv = PyTuple_New(count); + if (py_argv == NULL) + debug_return_ptr(NULL); + + for (int i = 0; i < count; ++i) { + PyObject *py_arg = PyUnicode_FromString(strings[i]); + if (py_arg == NULL || PyTuple_SetItem(py_argv, i, py_arg) != 0) { + Py_CLEAR(py_argv); + break; + } + } + + debug_return_ptr(py_argv); +} + +PyObject * +py_str_array_to_tuple(char * const strings[]) +{ + debug_decl(py_str_array_to_tuple, PYTHON_DEBUG_INTERNAL); + + // find the item count ("strings" ends with NULL terminator): + Py_ssize_t count = 0; + if (strings != NULL) { + while (strings[count] != NULL) + ++count; + } + + debug_return_ptr(py_str_array_to_tuple_with_count(count, strings)); +} + +char ** +py_str_array_from_tuple(PyObject *py_tuple) +{ + debug_decl(py_str_array_from_tuple, PYTHON_DEBUG_INTERNAL); + + if (!PyTuple_Check(py_tuple)) { + PyErr_Format(PyExc_ValueError, "%s: value error, argument should be a tuple but it is '%s'", + __func__, Py_TYPENAME(py_tuple)); + debug_return_ptr(NULL); + } + + Py_ssize_t tuple_size = PyTuple_Size(py_tuple); + + // we need an extra 0 at the end + char **result = calloc(Py_SSIZE2SIZE(tuple_size) + 1, sizeof(char*)); + if (result == NULL) { + debug_return_ptr(NULL); + } + + for (int i = 0; i < tuple_size; ++i) { + PyObject *py_value = PyTuple_GetItem(py_tuple, i); + if (py_value == NULL) { + str_array_free(&result); + debug_return_ptr(NULL); + } + + // Note that it can be an "int" or something else as well + char *value = py_create_string_rep(py_value); + if (value == NULL) { + // conversion error is already set + str_array_free(&result); + debug_return_ptr(NULL); + } + result[i] = value; + } + + debug_return_ptr(result); +} + +PyObject * +py_tuple_get(PyObject *py_tuple, Py_ssize_t index, PyTypeObject *expected_type) +{ + debug_decl(py_tuple_get, PYTHON_DEBUG_INTERNAL); + + PyObject *py_item = PyTuple_GetItem(py_tuple, index); + if (py_item == NULL) { + debug_return_ptr(NULL); + } + + if (!PyObject_TypeCheck(py_item, expected_type)) { + PyErr_Format(PyExc_ValueError, "Value error: tuple element %d should " + "be a '%s' (but it is '%s')", + index, expected_type->tp_name, Py_TYPENAME(py_item)); + debug_return_ptr(NULL); + } + + debug_return_ptr(py_item); +} + +PyObject * +py_create_version(unsigned int version) +{ + debug_decl(py_create_version, PYTHON_DEBUG_INTERNAL); + debug_return_ptr(PyUnicode_FromFormat("%d.%d", SUDO_API_VERSION_GET_MAJOR(version), + SUDO_API_VERSION_GET_MINOR(version))); +} + +PyObject * +py_from_passwd(const struct passwd *pwd) +{ + debug_decl(py_from_passwd, PYTHON_DEBUG_INTERNAL); + + if (pwd == NULL) { + debug_return_ptr_pynone; + } + + // Create a tuple similar and convertible to python "struct_passwd" of "pwd" module + debug_return_ptr( + Py_BuildValue("(zziizzz)", pwd->pw_name, pwd->pw_passwd, + pwd->pw_uid, pwd->pw_gid, pwd->pw_gecos, + pwd->pw_dir, pwd->pw_shell) + ); +} + +char * +py_create_string_rep(PyObject *py_object) +{ + debug_decl(py_create_string_rep, PYTHON_DEBUG_INTERNAL); + char *result = NULL; + + if (py_object == NULL) + debug_return_ptr(NULL); + + PyObject *py_string = PyObject_Str(py_object); + if (py_string != NULL) { + const char *bytes = PyUnicode_AsUTF8(py_string); + if (bytes != NULL) { + result = strdup(bytes); + } + } + + Py_XDECREF(py_string); + debug_return_ptr(result); +} + +static void +_py_debug_python_function(const char *class_name, const char *function_name, const char *message, + PyObject *py_args, PyObject *py_kwargs, int subsystem_id) +{ + debug_decl_vars(_py_debug_python_function, subsystem_id); + + if (sudo_debug_needed(SUDO_DEBUG_DIAG)) { + char *args_str = NULL; + char *kwargs_str = NULL; + if (py_args != NULL) { + /* Sort by key for consistent output on Python < 3.6 */ + PyObject *py_args_sorted = NULL; + if (PyDict_Check(py_args)) { + py_args_sorted = PyDict_Items(py_args); + if (py_args_sorted != NULL) { + if (PyList_Sort(py_args_sorted) == 0) { + py_args = py_args_sorted; + } + } + } + args_str = py_create_string_rep(py_args); + if (py_args_sorted != NULL) + Py_DECREF(py_args_sorted); + } + if (py_kwargs != NULL) { + /* Sort by key for consistent output on Python < 3.6 */ + PyObject *py_kwargs_sorted = NULL; + if (PyDict_Check(py_kwargs)) { + py_kwargs_sorted = PyDict_Items(py_kwargs); + if (py_kwargs_sorted != NULL) { + if (PyList_Sort(py_kwargs_sorted) == 0) { + py_kwargs = py_kwargs_sorted; + } + } + } + kwargs_str = py_create_string_rep(py_kwargs); + if (py_kwargs_sorted != NULL) + Py_DECREF(py_kwargs_sorted); + } + + sudo_debug_printf(SUDO_DEBUG_DIAG, "%s.%s %s: %s %s\n", class_name, + function_name, message, args_str ? args_str : "()", + kwargs_str ? kwargs_str : ""); + free(args_str); + free(kwargs_str); + } +} + +void +py_debug_python_call(const char *class_name, const char *function_name, + PyObject *py_args, PyObject *py_kwargs, int subsystem_id) +{ + debug_decl_vars(py_debug_python_call, subsystem_id); + + if (subsystem_id == PYTHON_DEBUG_C_CALLS && sudo_debug_needed(SUDO_DEBUG_INFO)) { + // at this level we also output the callee python script + char *callee_func_name = NULL, *callee_file_name = NULL; + long callee_line_number = -1; + + if (py_get_current_execution_frame(&callee_file_name, &callee_line_number, &callee_func_name) == SUDO_RC_OK) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s @ %s:%ld calls C function:\n", + callee_func_name, callee_file_name, callee_line_number); + } + + free(callee_func_name); + free(callee_file_name); + } + + _py_debug_python_function(class_name, function_name, "was called with arguments", + py_args, py_kwargs, subsystem_id); +} + +void +py_debug_python_result(const char *class_name, const char *function_name, + PyObject *py_result, int subsystem_id) +{ + if (py_result == NULL) { + debug_decl_vars(py_debug_python_result, subsystem_id); + sudo_debug_printf(SUDO_CONV_ERROR_MSG, "%s.%s call failed\n", + class_name, function_name); + } else { + _py_debug_python_function(class_name, function_name, "returned result", + py_result, NULL, subsystem_id); + } +} + +void +str_array_free(char ***array) +{ + debug_decl(str_array_free, PYTHON_DEBUG_INTERNAL); + + if (*array == NULL) + debug_return; + + for (char **item_ptr = *array; *item_ptr != NULL; ++item_ptr) + free(*item_ptr); + + free(*array); + *array = NULL; + + debug_return; +} + +int +py_get_current_execution_frame(char **file_name, long *line_number, char **function_name) +{ + *file_name = NULL; + *line_number = (long)-1; + *function_name = NULL; + + PyObject *py_err_type = NULL, *py_err_value = NULL, *py_err_traceback = NULL; + PyErr_Fetch(&py_err_type, &py_err_value, &py_err_traceback); + + PyObject *py_frame = NULL, *py_f_code = NULL, + *py_filename = NULL, *py_function_name = NULL; + + PyObject *py_getframe = PySys_GetObject("_getframe"); + if (py_getframe == NULL) + goto cleanup; + + py_frame = PyObject_CallFunction(py_getframe, "i", 0); + if (py_frame == NULL) + goto cleanup; + + *line_number = py_object_get_optional_attr_number(py_frame, "f_lineno"); + + py_f_code = py_object_get_optional_attr(py_frame, "f_code", NULL); + if (py_f_code != NULL) { + py_filename = py_object_get_optional_attr(py_f_code, "co_filename", NULL); + if (py_filename != NULL) + *file_name = strdup(PyUnicode_AsUTF8(py_filename)); + + py_function_name = py_object_get_optional_attr(py_f_code, "co_name", NULL); + if (py_function_name != NULL) + *function_name = strdup(PyUnicode_AsUTF8(py_function_name)); + } + +cleanup: + Py_CLEAR(py_frame); + Py_CLEAR(py_f_code); + Py_CLEAR(py_filename); + Py_CLEAR(py_function_name); + + // we hide every error happening inside this function + PyErr_Restore(py_err_type, py_err_value, py_err_traceback); + + return (*file_name && *function_name && (*line_number >= 0)) ? + SUDO_RC_OK : SUDO_RC_ERROR; +} + +void +py_ctx_reset() +{ + memset(&py_ctx, 0, sizeof(py_ctx)); + py_ctx.sudo_log = &_sudo_printf_default; +} + +int +py_sudo_conv(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[], struct sudo_conv_callback *callback) +{ + /* Enable suspend during password entry. */ + struct sigaction sa, saved_sigtstp; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + (void) sigaction(SIGTSTP, &sa, &saved_sigtstp); + + int rc = SUDO_RC_ERROR; + if (py_ctx.sudo_conv != NULL) + rc = py_ctx.sudo_conv((int)num_msgs, msgs, replies, callback); + + /* Restore signal handlers and signal mask. */ + (void) sigaction(SIGTSTP, &saved_sigtstp, NULL); + + return rc; +} + +PyObject * +py_object_get_optional_attr(PyObject *py_object, const char *attr, PyObject *py_default) +{ + if (PyObject_HasAttrString(py_object, attr)) { + return PyObject_GetAttrString(py_object, attr); + } + Py_XINCREF(py_default); // whatever we return will have its refcount incremented + return py_default; +} + +const char * +py_object_get_optional_attr_string(PyObject *py_object, const char *attr_name) +{ + PyObject *py_value = py_object_get_optional_attr(py_object, attr_name, NULL); + if (py_value == NULL) + return NULL; + + const char *value = PyUnicode_AsUTF8(py_value); + Py_CLEAR(py_value); // Note, the object still has reference to the attribute + return value; +} + +long long +py_object_get_optional_attr_number(PyObject *py_object, const char *attr_name) +{ + PyObject *py_value = py_object_get_optional_attr(py_object, attr_name, NULL); + if (py_value == NULL) + return -1; + + long long value = PyLong_AsLongLong(py_value); + Py_CLEAR(py_value); + return value; +} + +void +py_object_set_attr_number(PyObject *py_object, const char *attr_name, long long number) +{ + PyObject *py_number = PyLong_FromLong(number); + if (py_number == NULL) + return; + + PyObject_SetAttrString(py_object, attr_name, py_number); + Py_CLEAR(py_number); +} + +void +py_object_set_attr_string(PyObject *py_object, const char *attr_name, const char *value) +{ + PyObject *py_value = PyUnicode_FromString(value); + if (py_value == NULL) + return; + + PyObject_SetAttrString(py_object, attr_name, py_value); + Py_CLEAR(py_value); +} + +PyObject * +py_dict_create_string_int(size_t count, struct key_value_str_int *key_values) +{ + debug_decl(py_dict_create_string_int, PYTHON_DEBUG_INTERNAL); + + PyObject *py_value = NULL; + PyObject *py_dict = PyDict_New(); + if (py_dict == NULL) + goto cleanup; + + for (size_t i = 0; i < count; ++i) { + py_value = PyLong_FromLong(key_values[i].value); + if (py_value == NULL) + goto cleanup; + + if (PyDict_SetItemString(py_dict, key_values[i].key, py_value) < 0) + goto cleanup; + + Py_CLEAR(py_value); + } + +cleanup: + if (PyErr_Occurred()) { + Py_CLEAR(py_dict); + } + Py_CLEAR(py_value); + + debug_return_ptr(py_dict); +} diff --git a/plugins/python/pyhelpers.h b/plugins/python/pyhelpers.h new file mode 100644 index 0000000..01843d7 --- /dev/null +++ b/plugins/python/pyhelpers.h @@ -0,0 +1,105 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_PLUGIN_PYHELPERS_H +#define SUDO_PLUGIN_PYHELPERS_H + +#define PY_SSIZE_T_CLEAN +#include + +#include "config.h" +#include "sudo_compat.h" +#include "sudo_plugin.h" + +#include "pyhelpers_cpychecker.h" + +#include "sudo_python_debug.h" + +enum SudoPluginFunctionReturnCode { + SUDO_RC_OK = 1, + SUDO_RC_ACCEPT = 1, + SUDO_RC_REJECT = 0, + SUDO_RC_ERROR = -1, + SUDO_RC_USAGE_ERROR = -2, +}; + +#define INTERPRETER_MAX 32 + +struct PythonContext +{ + sudo_printf_t sudo_log; + sudo_conv_t sudo_conv; + PyThreadState *py_main_interpreter; + size_t interpreter_count; + PyThreadState *py_subinterpreters[INTERPRETER_MAX]; +}; + +extern struct PythonContext py_ctx; + +#define Py_TYPENAME(object) (object ? Py_TYPE(object)->tp_name : "NULL") +#define Py_SSIZE2SIZE(value) ((value) < 0 ? 0 : (size_t)(value)) + +#define py_sudo_log(...) py_ctx.sudo_log(__VA_ARGS__) + +int py_sudo_conv(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[], struct sudo_conv_callback *callback); + +void py_log_last_error(const char *context_message); + +char *py_create_string_rep(PyObject *py_object); + +char *py_join_str_list(PyObject *py_str_list, const char *separator); + +struct key_value_str_int +{ + const char *key; + int value; +}; + +PyObject *py_dict_create_string_int(size_t count, struct key_value_str_int *key_values); + +PyObject *py_from_passwd(const struct passwd *pwd); + +PyObject *py_str_array_to_tuple_with_count(Py_ssize_t count, char * const strings[]); +PyObject *py_str_array_to_tuple(char * const strings[]); +char **py_str_array_from_tuple(PyObject *py_tuple); + +CPYCHECKER_RETURNS_BORROWED_REF +PyObject *py_tuple_get(PyObject *py_tuple, Py_ssize_t index, PyTypeObject *expected_type); + +PyObject *py_object_get_optional_attr(PyObject *py_object, const char *attr, PyObject *py_default); +long long py_object_get_optional_attr_number(PyObject *py_object, const char *attr_name); +const char *py_object_get_optional_attr_string(PyObject *py_object, const char *attr_name); + +void py_object_set_attr_number(PyObject *py_object, const char *attr_name, long long number); +void py_object_set_attr_string(PyObject *py_object, const char *attr_name, const char *value); + +PyObject *py_create_version(unsigned int version); + +void py_debug_python_call(const char *class_name, const char *function_name, + PyObject *py_args, PyObject *py_kwargs, int subsystem_id); +void py_debug_python_result(const char *class_name, const char *function_name, + PyObject *py_args, int subsystem_id); + +void str_array_free(char ***array); + +int py_get_current_execution_frame(char **file_name, long *line_number, char **function_name); + +void py_ctx_reset(void); + +#endif // SUDO_PLUGIN_PYHELPERS_H diff --git a/plugins/python/pyhelpers_cpychecker.h b/plugins/python/pyhelpers_cpychecker.h new file mode 100644 index 0000000..dc048c3 --- /dev/null +++ b/plugins/python/pyhelpers_cpychecker.h @@ -0,0 +1,45 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_PLUGIN_PYHELPERS_CPYCHECKER_H +#define SUDO_PLUGIN_PYHELPERS_CPYCHECKER_H + +/* Helper macros for cpychecker */ + +#if defined(WITH_CPYCHECKER_RETURNS_BORROWED_REF_ATTRIBUTE) + #define CPYCHECKER_RETURNS_BORROWED_REF \ + __attribute__((cpychecker_returns_borrowed_ref)) +#else + #define CPYCHECKER_RETURNS_BORROWED_REF +#endif + +#ifdef WITH_CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION_ATTRIBUTE + #define CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION \ + __attribute__ ((cpychecker_negative_result_sets_exception)) +#else + #define CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +#endif + +#if defined(WITH_CPYCHECKER_STEALS_REFERENCE_TO_ARG_ATTRIBUTE) + #define CPYCHECKER_STEALS_REFERENCE_TO_ARG(n) \ + __attribute__((cpychecker_steals_reference_to_arg(n))) +#else + #define CPYCHECKER_STEALS_REFERENCE_TO_ARG(n) +#endif + +#endif // SUDO_PLUGIN_PYHELPERS_CPYCHECKER_H diff --git a/plugins/python/python_baseplugin.c b/plugins/python/python_baseplugin.c new file mode 100644 index 0000000..6060169 --- /dev/null +++ b/plugins/python/python_baseplugin.c @@ -0,0 +1,87 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "sudo_python_module.h" + +PyTypeObject *sudo_type_Plugin = NULL; + +static PyObject * +_sudo_Plugin__Init(PyObject *py_self, PyObject *py_args, PyObject *py_kwargs) +{ + debug_decl(_sudo_Plugin__Init, PYTHON_DEBUG_C_CALLS); + + py_debug_python_call("Plugin", "__init__", py_args, NULL, PYTHON_DEBUG_C_CALLS); + + if (!PyArg_UnpackTuple(py_args, "sudo.Plugin.__init__", 1, 1, &py_self)) + goto cleanup; + + Py_ssize_t pos = 0; + PyObject *py_key = NULL, *py_value = NULL; // -> borrowed references + + while (PyDict_Next(py_kwargs, &pos, &py_key, &py_value)) { + if (PyObject_SetAttr(py_self, py_key, py_value) != 0) + goto cleanup; + } + +cleanup: + if (PyErr_Occurred()) + debug_return_ptr(NULL); + + debug_return_ptr_pynone; +} + + +static PyMethodDef _sudo_Plugin_class_methods[] = { + {"__init__", (PyCFunction)_sudo_Plugin__Init, + METH_VARARGS | METH_KEYWORDS, + "Base sudo plugin constructor"}, + {NULL, NULL, 0, NULL} +}; + + +int +sudo_module_register_baseplugin(PyObject *py_module) +{ + debug_decl(sudo_module_register_baseplugin, PYTHON_DEBUG_INTERNAL); + int rc = SUDO_RC_ERROR; + PyObject *py_class = NULL; + + py_class = sudo_module_create_class("sudo.Plugin", _sudo_Plugin_class_methods, NULL); + if (py_class == NULL) + goto cleanup; + + if (PyModule_AddObject(py_module, "Plugin", py_class) < 0) { + goto cleanup; + } + + Py_INCREF(py_class); + rc = SUDO_RC_OK; + + Py_CLEAR(sudo_type_Plugin); + sudo_type_Plugin = (PyTypeObject *)py_class; + Py_INCREF(sudo_type_Plugin); + +cleanup: + Py_CLEAR(py_class); + debug_return_int(rc); +} diff --git a/plugins/python/python_convmessage.c b/plugins/python/python_convmessage.c new file mode 100644 index 0000000..67e6d96 --- /dev/null +++ b/plugins/python/python_convmessage.c @@ -0,0 +1,154 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "sudo_python_module.h" + +PyTypeObject *sudo_type_ConvMessage; + +static PyObject * +_sudo_ConvMessage__Init(PyObject *py_self, PyObject *py_args, PyObject *py_kwargs) +{ + debug_decl(_sudo_ConvMessage__Init, PYTHON_DEBUG_C_CALLS); + + py_debug_python_call("ConvMessage", "__init__", py_args, py_kwargs, PYTHON_DEBUG_C_CALLS); + + PyObject *py_empty = PyTuple_New(0); + + struct sudo_conv_message conv_message = { 0, 0, NULL }; + + static char *keywords[] = { "self", "msg_type", "msg", "timeout", NULL }; + if (!PyArg_ParseTupleAndKeywords(py_args ? py_args : py_empty, py_kwargs, "Ois|i:sudo.ConvMessage", keywords, + &py_self, &(conv_message.msg_type), &(conv_message.msg), + &(conv_message.timeout))) + goto cleanup; + + sudo_debug_printf(SUDO_DEBUG_TRACE, "Parsed arguments: self='%p' msg_type='%d' timeout='%d' msg='%s'", + (void *)py_self, conv_message.msg_type, conv_message.timeout, conv_message.msg); + + py_object_set_attr_number(py_self, "msg_type", conv_message.msg_type); + if (PyErr_Occurred()) + goto cleanup; + + py_object_set_attr_number(py_self, "timeout", conv_message.timeout); + if (PyErr_Occurred()) // -V547 + goto cleanup; + + py_object_set_attr_string(py_self, "msg", conv_message.msg); + if (PyErr_Occurred()) // -V547 + goto cleanup; + +cleanup: + Py_CLEAR(py_empty); + + if (PyErr_Occurred()) + debug_return_ptr(NULL); + + debug_return_ptr_pynone; +} + + +static PyMethodDef _sudo_ConvMessage_class_methods[] = +{ + {"__init__", (PyCFunction)_sudo_ConvMessage__Init, + METH_VARARGS | METH_KEYWORDS, + "Conversation message (same as C type sudo_conv_message)"}, + {NULL, NULL, 0, NULL} +}; + + +int +sudo_module_register_conv_message(PyObject *py_module) +{ + debug_decl(_sudo_module_register_conv_message, PYTHON_DEBUG_INTERNAL); + int rc = SUDO_RC_ERROR; + PyObject *py_class = NULL; + + py_class = sudo_module_create_class("sudo.ConvMessage", _sudo_ConvMessage_class_methods, NULL); + if (py_class == NULL) + goto cleanup; + + if (PyModule_AddObject(py_module, "ConvMessage", py_class) < 0) { + goto cleanup; + } + + Py_INCREF(py_class); + rc = SUDO_RC_OK; + + Py_CLEAR(sudo_type_ConvMessage); + sudo_type_ConvMessage = (PyTypeObject *)py_class; + Py_INCREF(sudo_type_ConvMessage); + +cleanup: + Py_CLEAR(py_class); + debug_return_int(rc); +} + +int +sudo_module_ConvMessage_to_c(PyObject *py_conv_message, struct sudo_conv_message *conv_message) +{ + debug_decl(sudo_module_ConvMessage_to_c, PYTHON_DEBUG_C_CALLS); + + conv_message->msg_type = (int)py_object_get_optional_attr_number(py_conv_message, "msg_type"); + if (PyErr_Occurred()) + debug_return_int(SUDO_RC_ERROR); + + conv_message->timeout = (int)py_object_get_optional_attr_number(py_conv_message, "timeout"); + if (PyErr_Occurred()) // -V547 + debug_return_int(SUDO_RC_ERROR); + + conv_message->msg = py_object_get_optional_attr_string(py_conv_message, "msg"); + if (PyErr_Occurred()) // -V547 + debug_return_int(SUDO_RC_ERROR); + + debug_return_int(SUDO_RC_OK); +} + +int +sudo_module_ConvMessages_to_c(PyObject *py_tuple, Py_ssize_t *num_msgs, struct sudo_conv_message **msgs) +{ + debug_decl(sudo_module_ConvMessages_to_c, PYTHON_DEBUG_C_CALLS); + + *num_msgs = PyTuple_Size(py_tuple); + *msgs = NULL; + + if (*num_msgs <= 0) { + *num_msgs = 0; + PyErr_Format(sudo_exc_SudoException, "Expected at least one ConvMessage"); + debug_return_int(SUDO_RC_ERROR); + } + + *msgs = calloc(Py_SSIZE2SIZE(*num_msgs), sizeof(struct sudo_conv_message)); + if (*msgs == NULL) { + debug_return_int(SUDO_RC_ERROR); + } + + for (Py_ssize_t i = 0; i < *num_msgs; ++i) { + PyObject *py_msg = py_tuple_get(py_tuple, i, sudo_type_ConvMessage); + if (py_msg == NULL || sudo_module_ConvMessage_to_c(py_msg, &(*msgs)[i]) < 0) { + debug_return_int(SUDO_RC_ERROR); + } + } + + debug_return_int(SUDO_RC_OK); +} + diff --git a/plugins/python/python_importblocker.c b/plugins/python/python_importblocker.c new file mode 100644 index 0000000..2bce36c --- /dev/null +++ b/plugins/python/python_importblocker.c @@ -0,0 +1,213 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "sudo_python_module.h" + +#include "sudo_util.h" + +#include +#include +#include + + +static int +_verify_import(const char *file_path) +{ + debug_decl(_verify_import, PYTHON_DEBUG_INTERNAL); + + // Check mode and owner similar to what we do in open_sudoers(). + // This is to help avoid loading a potentially insecure module. + struct stat sb; + if (stat(file_path, &sb) != 0) { + PyErr_Format(PyExc_ImportError, "Failed to stat file '%s'", file_path); + debug_return_int(SUDO_RC_ERROR); + } + + if (sb.st_uid != ROOT_UID) { + PyErr_Format(PyExc_ImportError, "File '%s' must be owned by uid %d", file_path, ROOT_UID); + debug_return_int(SUDO_RC_ERROR); + } + + if ((sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) { + PyErr_Format(PyExc_ImportError, "File '%s' must be only be writable by owner", file_path); + debug_return_int(SUDO_RC_ERROR); + } + + debug_return_int(SUDO_RC_OK); +} + +static PyObject * +_sudo_ImportBlocker__Init(PyObject *py_self, PyObject *py_args) +{ + debug_decl(_sudo_ImportBlocker__Init, PYTHON_DEBUG_C_CALLS); + + py_debug_python_call("ImportBlocker", "__init__", py_args, NULL, PYTHON_DEBUG_C_CALLS); + + PyObject *py_meta_path = NULL; + if (!PyArg_UnpackTuple(py_args, "sudo.ImportBlocker.__init__", 2, 2, &py_self, &py_meta_path)) + goto cleanup; + + if (PyObject_SetAttrString(py_self, "meta_path", py_meta_path) != 0) + goto cleanup; + +cleanup: + if (PyErr_Occurred()) + debug_return_ptr(NULL); + + debug_return_ptr_pynone; +} + +static PyObject * +_sudo_ImportBlocker__find_module(PyObject *py_self, PyObject *py_args) +{ + debug_decl(_sudo_ImportBlocker__find_module, PYTHON_DEBUG_C_CALLS); + + PyObject *py_fullname = NULL, *py_path = NULL, *py_meta_path = NULL, + *py_meta_path_iterator = NULL, *py_finder = NULL, + *py_importer = NULL, *py_import_path = NULL; + + py_debug_python_call("ImportBlocker", "find_module", py_args, NULL, PYTHON_DEBUG_C_CALLS); + + if (!PyArg_UnpackTuple(py_args, "sudo.ImportBlocker.find_module", 2, 3, &py_self, &py_fullname, &py_path)) + goto cleanup; + + py_meta_path = PyObject_GetAttrString(py_self, "meta_path"); + if (py_meta_path == NULL) + goto cleanup; + + py_meta_path_iterator = PyObject_GetIter(py_meta_path); + if (py_meta_path_iterator == NULL) + goto cleanup; + + while ((py_finder = PyIter_Next(py_meta_path_iterator)) != NULL) { + py_importer = PyObject_CallMethod(py_finder, "find_module", "(OO)", + py_fullname, py_path); + if (py_importer == NULL) { + goto cleanup; + } + + if (py_importer != Py_None) { // the import could be resolved + if (PyObject_HasAttrString(py_importer, "get_filename")) { + // there is a file associated with the import (.py, .so, etc) + py_import_path = PyObject_CallMethod(py_importer, "get_filename", ""); + const char *import_path = PyUnicode_AsUTF8(py_import_path); + + sudo_debug_printf(SUDO_DEBUG_DIAG, "ImportBlocker: verifying permissions " + "on file '%s'\n", import_path); + if (_verify_import(import_path) != SUDO_RC_OK) + goto cleanup; + + Py_CLEAR(py_import_path); + + } else { + sudo_debug_printf(SUDO_DEBUG_DIAG, "ImportBlocker: internal module import '%s'\n", + PyUnicode_AsUTF8(py_fullname)); + } + + goto cleanup; + } + + Py_CLEAR(py_importer); + Py_CLEAR(py_finder); + } + + Py_CLEAR(py_importer); + py_importer = Py_None; + Py_INCREF(py_importer); + +cleanup: + Py_CLEAR(py_meta_path_iterator); + Py_CLEAR(py_meta_path); + Py_CLEAR(py_finder); + Py_CLEAR(py_import_path); + + if (PyErr_Occurred()) { + Py_CLEAR(py_importer); + debug_return_ptr(NULL); + } + + debug_return_ptr(py_importer); +} + +static PyMethodDef _sudo_ImportBlocker_class_methods[] = +{ + {"__init__", _sudo_ImportBlocker__Init, METH_VARARGS, ""}, + {"find_module", _sudo_ImportBlocker__find_module, METH_VARARGS, ""}, + {NULL, NULL, 0, NULL} +}; + +// This possibly can be replaced with PySys_AddAuditHook for python >= 3.8 +// +// This function is equivalent of the python call: +// sys.meta_path = [sudo.ImportBlocker(sys.meta_path)] +int +sudo_module_register_importblocker(void) +{ + debug_decl(sudo_module_register_importblocker, PYTHON_DEBUG_C_CALLS); + + int rc = SUDO_RC_ERROR; + + PyObject *py_meta_path = NULL, *py_import_blocker_cls = NULL, + *py_import_blocker = NULL; + + py_meta_path = PySys_GetObject("meta_path"); // note: borrowed reference + if (py_meta_path == NULL) { + PyErr_Format(sudo_exc_SudoException, "'sys.meta_path' is not available. " + "Unable to register import blocker hook which is meant to " + "verify that no such module get loaded by the sudo python plugins" + "which are writable by others than root."); + goto cleanup; + } + Py_INCREF(py_meta_path); + + py_import_blocker_cls = sudo_module_create_class("sudo.ImportBlocker", _sudo_ImportBlocker_class_methods, NULL); + if (py_import_blocker_cls == NULL) + goto cleanup; + + // call the constructor + py_import_blocker = PyObject_CallFunctionObjArgs(py_import_blocker_cls, py_meta_path, NULL); + if (py_import_blocker == NULL) + goto cleanup; + + Py_DECREF(py_meta_path); + py_meta_path = PyList_New(1); + if (py_meta_path == NULL) + goto cleanup; + + if (PyList_SetItem(py_meta_path, 0, py_import_blocker) != 0) + goto cleanup; + py_import_blocker = NULL; // list has stolen it + + if (PySys_SetObject("meta_path", py_meta_path) != 0) { + goto cleanup; + } + + rc = SUDO_RC_OK; + +cleanup: + Py_CLEAR(py_meta_path); + Py_CLEAR(py_import_blocker); + Py_CLEAR(py_import_blocker_cls); + + debug_return_int(rc); +} diff --git a/plugins/python/python_loghandler.c b/plugins/python/python_loghandler.c new file mode 100644 index 0000000..2541e68 --- /dev/null +++ b/plugins/python/python_loghandler.c @@ -0,0 +1,190 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "sudo_python_module.h" + +PyObject *sudo_type_LogHandler; + + +static void +_debug_plugin(int log_level, const char *log_message) +{ + debug_decl_vars(python_sudo_debug, PYTHON_DEBUG_PLUGIN); + + if (sudo_debug_needed(SUDO_DEBUG_INFO)) { + // at trace level we output the position for the python log as well + char *func_name = NULL, *file_name = NULL; + long line_number = -1; + + if (py_get_current_execution_frame(&file_name, &line_number, &func_name) == SUDO_RC_OK) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s @ %s:%ld debugs:\n", + func_name, file_name, line_number); + } + + free(func_name); + free(file_name); + } + + sudo_debug_printf(log_level, "%s\n", log_message); +} + +PyObject * +python_sudo_debug(PyObject *Py_UNUSED(py_self), PyObject *py_args) +{ + debug_decl(python_sudo_debug, PYTHON_DEBUG_C_CALLS); + py_debug_python_call("sudo", "debug", py_args, NULL, PYTHON_DEBUG_C_CALLS); + + int log_level = SUDO_DEBUG_DEBUG; + const char *log_message = NULL; + if (!PyArg_ParseTuple(py_args, "is:sudo.debug", &log_level, &log_message)) { + debug_return_ptr(NULL); + } + + _debug_plugin(log_level, log_message); + + debug_return_ptr_pynone; +} + +static int +_sudo_log_level_from_python(long level) +{ + if (level >= 50) + return SUDO_DEBUG_CRIT; + if (level >= 40) + return SUDO_DEBUG_ERROR; + if (level >= 30) + return SUDO_DEBUG_WARN; + if (level >= 20) + return SUDO_DEBUG_INFO; + + return SUDO_DEBUG_TRACE; +} + +static PyObject * +_sudo_LogHandler__emit(PyObject *py_self, PyObject *py_args) +{ + debug_decl(_sudo_LogHandler__emit, PYTHON_DEBUG_C_CALLS); + + PyObject *py_record = NULL; // borrowed + PyObject *py_message = NULL; + + py_debug_python_call("LogHandler", "emit", py_args, NULL, PYTHON_DEBUG_C_CALLS); + + if (!PyArg_UnpackTuple(py_args, "sudo.LogHandler.emit", 2, 2, &py_self, &py_record)) + goto cleanup; + + long python_loglevel = py_object_get_optional_attr_number(py_record, "levelno"); + if (PyErr_Occurred()) { + PyErr_Format(sudo_exc_SudoException, "sudo.LogHandler: Failed to determine log level"); + goto cleanup; + } + + int sudo_loglevel = _sudo_log_level_from_python(python_loglevel); + + py_message = PyObject_CallMethod(py_self, "format", "O", py_record); + if (py_message == NULL) + goto cleanup; + + _debug_plugin(sudo_loglevel, PyUnicode_AsUTF8(py_message)); + +cleanup: + Py_CLEAR(py_message); + if (PyErr_Occurred()) { + debug_return_ptr(NULL); + } + + debug_return_ptr_pynone; +} + +/* The sudo.LogHandler class can be used to make the default python logger + * use sudo's built in log system. */ +static PyMethodDef _sudo_LogHandler_class_methods[] = +{ + {"emit", _sudo_LogHandler__emit, METH_VARARGS, ""}, + {NULL, NULL, 0, NULL} +}; + +// This function registers sudo.LogHandler class +int +sudo_module_register_loghandler(PyObject *py_module) +{ + debug_decl(sudo_module_register_loghandler, PYTHON_DEBUG_INTERNAL); + + PyObject *py_logging_module = NULL, *py_streamhandler = NULL; + + py_logging_module = PyImport_ImportModule("logging"); + if (py_logging_module == NULL) + goto cleanup; + + py_streamhandler = PyObject_GetAttrString(py_logging_module, "StreamHandler"); + if (py_streamhandler == NULL) + goto cleanup; + + sudo_type_LogHandler = sudo_module_create_class("sudo.LogHandler", + _sudo_LogHandler_class_methods, py_streamhandler); + if (sudo_type_LogHandler == NULL) + goto cleanup; + + if (PyModule_AddObject(py_module, "LogHandler", sudo_type_LogHandler) < 0) + goto cleanup; + + Py_INCREF(sudo_type_LogHandler); + +cleanup: + Py_CLEAR(py_streamhandler); + Py_CLEAR(py_logging_module); + debug_return_int(PyErr_Occurred() ? SUDO_RC_ERROR : SUDO_RC_OK); +} + +// This sets sudo.LogHandler as the default log handler: +// logging.getLogger().addHandler(sudo.LogHandler()) +int +sudo_module_set_default_loghandler(void) +{ + debug_decl(sudo_module_set_default_loghandler, PYTHON_DEBUG_INTERNAL); + + PyObject *py_loghandler = NULL, *py_logging_module = NULL, + *py_logger = NULL, *py_result = NULL; + + py_loghandler = PyObject_CallObject(sudo_type_LogHandler, NULL); + if (py_loghandler == NULL) + goto cleanup; + + py_logging_module = PyImport_ImportModule("logging"); + if (py_logging_module == NULL) + goto cleanup; + + py_logger = PyObject_CallMethod(py_logging_module, "getLogger", NULL); + if (py_logger == NULL) + goto cleanup; + + py_result = PyObject_CallMethod(py_logger, "addHandler", "O", py_loghandler); + +cleanup: + Py_CLEAR(py_result); + Py_CLEAR(py_logger); + Py_CLEAR(py_logging_module); + Py_CLEAR(py_loghandler); + + debug_return_int(PyErr_Occurred() ? SUDO_RC_ERROR : SUDO_RC_OK); +} diff --git a/plugins/python/python_plugin.exp b/plugins/python/python_plugin.exp new file mode 100644 index 0000000..1261a58 --- /dev/null +++ b/plugins/python/python_plugin.exp @@ -0,0 +1,8 @@ +group_plugin +python_approval +python_approval_clone +python_audit +python_audit_clone +python_io +python_io_clone +python_policy diff --git a/plugins/python/python_plugin_approval.c b/plugins/python/python_plugin_approval.c new file mode 100644 index 0000000..31c479f --- /dev/null +++ b/plugins/python/python_plugin_approval.c @@ -0,0 +1,195 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "python_plugin_common.h" + +struct ApprovalPluginContext +{ + struct PluginContext base_ctx; + struct approval_plugin *plugin; +}; + +#define BASE_CTX(approval_ctx) (&(approval_ctx->base_ctx)) + +#define PY_APPROVAL_PLUGIN_VERSION SUDO_API_MKVERSION(1, 0) + +#define CALLBACK_PLUGINFUNC(func_name) approval_ctx->plugin->func_name + +// This also verifies compile time that the name matches the sudo plugin API. +#define CALLBACK_PYNAME(func_name) ((void)CALLBACK_PLUGINFUNC(func_name), #func_name) + + +static int +python_plugin_approval_open(struct ApprovalPluginContext *approval_ctx, + unsigned int version, sudo_conv_t conversation, sudo_printf_t sudo_printf, + char * const settings[], char * const user_info[], int submit_optind, + char * const submit_argv[], char * const submit_envp[], + char * const plugin_options[], const char **errstr) +{ + debug_decl(python_plugin_approval_open, PYTHON_DEBUG_CALLBACKS); + (void) version; + + int rc = python_plugin_register_logging(conversation, sudo_printf, settings); + if (rc != SUDO_RC_OK) { + debug_return_int(rc); + } + + struct PluginContext *plugin_ctx = BASE_CTX(approval_ctx); + + rc = python_plugin_init(plugin_ctx, plugin_options, version); + if (rc != SUDO_RC_OK) { + debug_return_int(rc); + } + + PyObject *py_kwargs = NULL, *py_submit_optind = NULL, + *py_submit_argv = NULL; + + if ((py_kwargs = python_plugin_construct_args(version, settings, user_info, + submit_envp, plugin_options)) == NULL || + (py_submit_optind = PyLong_FromLong(submit_optind)) == NULL || + (py_submit_argv = py_str_array_to_tuple(submit_argv)) == NULL) + { + py_log_last_error("Failed to construct plugin instance"); + rc = SUDO_RC_ERROR; + } else { + PyDict_SetItemString(py_kwargs, "submit_optind", py_submit_optind); + PyDict_SetItemString(py_kwargs, "submit_argv", py_submit_argv); + + rc = python_plugin_construct_custom(plugin_ctx, py_kwargs); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + } + + Py_CLEAR(py_kwargs); + Py_CLEAR(py_submit_argv); + Py_CLEAR(py_submit_optind); + + if (rc != SUDO_RC_OK) { + debug_return_int(rc); + } + + debug_return_int(rc); +} + +static void +python_plugin_approval_close(struct ApprovalPluginContext *approval_ctx) +{ + debug_decl(python_plugin_approval_close, PYTHON_DEBUG_CALLBACKS); + + struct PluginContext *plugin_ctx = BASE_CTX(approval_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + python_plugin_deinit(plugin_ctx); + + debug_return; +} + +static int +python_plugin_approval_check(struct ApprovalPluginContext *approval_ctx, + char * const command_info[], char * const run_argv[], + char * const run_envp[], const char **errstr) +{ + debug_decl(python_plugin_approval_check, PYTHON_DEBUG_CALLBACKS); + + struct PluginContext *plugin_ctx = BASE_CTX(approval_ctx); + + PyObject *py_command_info = NULL, *py_run_argv = NULL, *py_run_envp = NULL, + *py_args = NULL; + + int rc = SUDO_RC_ERROR; + if ((py_command_info = py_str_array_to_tuple(command_info)) != NULL && + (py_run_argv = py_str_array_to_tuple(run_argv)) != NULL && + (py_run_envp = py_str_array_to_tuple(run_envp)) != NULL) + { + py_args = Py_BuildValue("(OOO)", py_command_info, py_run_argv, py_run_envp); + } + + // Note, py_args gets cleared by api_rc_call + rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(check), py_args); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + + Py_CLEAR(py_command_info); + Py_CLEAR(py_run_argv); + Py_CLEAR(py_run_envp); + + debug_return_int(rc); +} + +int +python_plugin_approval_show_version(struct ApprovalPluginContext *approval_ctx, int verbose) +{ + debug_decl(python_plugin_approval_show_version, PYTHON_DEBUG_CALLBACKS); + + struct PluginContext *plugin_ctx = BASE_CTX(approval_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + + debug_return_int(python_plugin_show_version(plugin_ctx, + CALLBACK_PYNAME(show_version), verbose, PY_APPROVAL_PLUGIN_VERSION, "approval")); +} + +sudo_dso_public struct approval_plugin python_approval; + +// generate symbols for loading multiple approval plugins: +#define APPROVAL_SYMBOL_NAME(symbol) symbol +#include "python_plugin_approval_multi.inc" +#define APPROVAL_SYMBOL_NAME(symbol) symbol##1 +#include "python_plugin_approval_multi.inc" +#define APPROVAL_SYMBOL_NAME(symbol) symbol##2 +#include "python_plugin_approval_multi.inc" +#define APPROVAL_SYMBOL_NAME(symbol) symbol##3 +#include "python_plugin_approval_multi.inc" +#define APPROVAL_SYMBOL_NAME(symbol) symbol##4 +#include "python_plugin_approval_multi.inc" +#define APPROVAL_SYMBOL_NAME(symbol) symbol##5 +#include "python_plugin_approval_multi.inc" +#define APPROVAL_SYMBOL_NAME(symbol) symbol##6 +#include "python_plugin_approval_multi.inc" +#define APPROVAL_SYMBOL_NAME(symbol) symbol##7 +#include "python_plugin_approval_multi.inc" + +static struct approval_plugin *extra_approval_plugins[] = { + &python_approval1, + &python_approval2, + &python_approval3, + &python_approval4, + &python_approval5, + &python_approval6, + &python_approval7 +}; + +sudo_dso_public struct approval_plugin * +python_approval_clone(void) +{ + static size_t counter = 0; + struct approval_plugin *next_plugin = NULL; + + size_t max = sizeof(extra_approval_plugins) / sizeof(*extra_approval_plugins); + if (counter < max) { + next_plugin = extra_approval_plugins[counter]; + ++counter; + } else if (counter == max) { + ++counter; + py_sudo_log(SUDO_CONV_ERROR_MSG, + "sudo: loading more than %d sudo python approval plugins is not supported\n", counter); + } + + return next_plugin; +} diff --git a/plugins/python/python_plugin_approval_multi.inc b/plugins/python/python_plugin_approval_multi.inc new file mode 100644 index 0000000..6ee16be --- /dev/null +++ b/plugins/python/python_plugin_approval_multi.inc @@ -0,0 +1,57 @@ +/* The purpose of this file is to generate a approval_plugin symbols, + * with an I/O plugin context which is unique to it and its functions. + * The callbacks inside are just wrappers around the real functions in python_plugin_approval.c, + * their only purpose is to add the unique context to each separate approval_plugin call. + */ + +#define PLUGIN_CTX APPROVAL_SYMBOL_NAME(plugin_ctx) +#define CALLBACK_CFUNC(func_name) APPROVAL_SYMBOL_NAME(_python_plugin_approval_ ## func_name) + +extern struct approval_plugin APPROVAL_SYMBOL_NAME(python_approval); +static struct ApprovalPluginContext PLUGIN_CTX = { {}, &APPROVAL_SYMBOL_NAME(python_approval) }; + + +int +CALLBACK_CFUNC(open)(unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], int submit_optind, + char * const submit_argv[], char * const submit_envp[], + char * const plugin_options[], const char **errstr) +{ + return python_plugin_approval_open(&PLUGIN_CTX, version, conversation, + sudo_printf, settings, user_info, submit_optind, submit_argv, + submit_envp, plugin_options, errstr); +} + +void +CALLBACK_CFUNC(close)(void) +{ + python_plugin_approval_close(&PLUGIN_CTX); +} + +int +CALLBACK_CFUNC(check)(char * const command_info[], char * const run_argv[], + char * const run_envp[], const char **errstr) +{ + return python_plugin_approval_check(&PLUGIN_CTX, command_info, run_argv, + run_envp, errstr); +} + +int +CALLBACK_CFUNC(show_version)(int verbose) +{ + return python_plugin_approval_show_version(&PLUGIN_CTX, verbose); +} + +struct approval_plugin APPROVAL_SYMBOL_NAME(python_approval) = { + SUDO_APPROVAL_PLUGIN, + SUDO_API_VERSION, + CALLBACK_CFUNC(open), + CALLBACK_CFUNC(close), + CALLBACK_CFUNC(check), + CALLBACK_CFUNC(show_version) +}; + +#undef PLUGIN_CTX +#undef CALLBACK_CFUNC +#undef APPROVAL_SYMBOL_NAME diff --git a/plugins/python/python_plugin_audit.c b/plugins/python/python_plugin_audit.c new file mode 100644 index 0000000..ac40934 --- /dev/null +++ b/plugins/python/python_plugin_audit.c @@ -0,0 +1,282 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "python_plugin_common.h" + +struct AuditPluginContext +{ + struct PluginContext base_ctx; + struct audit_plugin *plugin; +}; + +#define BASE_CTX(audit_ctx) (&(audit_ctx->base_ctx)) + +#define PY_AUDIT_PLUGIN_VERSION SUDO_API_MKVERSION(1, 0) + +#define CALLBACK_PLUGINFUNC(func_name) audit_ctx->plugin->func_name + +// This also verifies compile time that the name matches the sudo plugin API. +#define CALLBACK_PYNAME(func_name) ((void)CALLBACK_PLUGINFUNC(func_name), #func_name) + +#define MARK_CALLBACK_OPTIONAL(function_name) \ + do { \ + python_plugin_mark_callback_optional(plugin_ctx, CALLBACK_PYNAME(function_name), \ + (void **)&CALLBACK_PLUGINFUNC(function_name)); \ + } while(0) + + +static int +_call_plugin_open(struct AuditPluginContext *audit_ctx, int submit_optind, char * const submit_argv[]) +{ + debug_decl(_call_plugin_open, PYTHON_DEBUG_CALLBACKS); + + struct PluginContext *plugin_ctx = BASE_CTX(audit_ctx); + if (!PyObject_HasAttrString(plugin_ctx->py_instance, CALLBACK_PYNAME(open))) { + debug_return_int(SUDO_RC_OK); + } + + int rc = SUDO_RC_ERROR; + PyObject *py_submit_argv = py_str_array_to_tuple(submit_argv); + + if (py_submit_argv != NULL) { + rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(open), + Py_BuildValue("(iO)", submit_optind, py_submit_argv)); + } else { + rc = SUDO_RC_ERROR; + } + + Py_XDECREF(py_submit_argv); + debug_return_int(rc); +} + +static int +python_plugin_audit_open(struct AuditPluginContext *audit_ctx, + unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], int submit_optind, + char * const submit_argv[], char * const submit_envp[], + char * const plugin_options[], const char **errstr) +{ + debug_decl(python_plugin_audit_open, PYTHON_DEBUG_CALLBACKS); + (void) version; + + int rc = python_plugin_register_logging(conversation, sudo_printf, settings); + if (rc != SUDO_RC_OK) { + debug_return_int(rc); + } + + struct PluginContext *plugin_ctx = BASE_CTX(audit_ctx); + + rc = python_plugin_init(plugin_ctx, plugin_options, version); + if (rc != SUDO_RC_OK) { + debug_return_int(rc); + } + + rc = python_plugin_construct(plugin_ctx, PY_AUDIT_PLUGIN_VERSION, settings, + user_info, submit_envp, plugin_options); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + if (rc != SUDO_RC_OK) { + debug_return_int(rc); + } + + // skip plugin callbacks which are not mandatory + MARK_CALLBACK_OPTIONAL(accept); + MARK_CALLBACK_OPTIONAL(reject); + MARK_CALLBACK_OPTIONAL(error); + + plugin_ctx->call_close = 1; + rc = _call_plugin_open(audit_ctx, submit_optind, submit_argv); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + + if (PyErr_Occurred()) { + py_log_last_error("Error during calling audit open"); + } + + debug_return_int(rc); +} + +static void +python_plugin_audit_close(struct AuditPluginContext *audit_ctx, int status_type, int status) +{ + debug_decl(python_plugin_audit_close, PYTHON_DEBUG_CALLBACKS); + + python_plugin_close(BASE_CTX(audit_ctx), CALLBACK_PYNAME(close), + Py_BuildValue("(ii)", status_type, status)); + + debug_return; +} + +int +python_plugin_audit_accept(struct AuditPluginContext *audit_ctx, + const char *plugin_name, unsigned int plugin_type, + char * const command_info[], char * const run_argv[], + char * const run_envp[], const char **errstr) +{ + debug_decl(python_plugin_audit_accept, PYTHON_DEBUG_CALLBACKS); + + struct PluginContext *plugin_ctx = BASE_CTX(audit_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + + PyObject *py_command_info = NULL, *py_run_argv = NULL, *py_run_envp = NULL; + int rc = SUDO_RC_ERROR; + + py_run_argv = py_str_array_to_tuple(run_argv); + if (py_run_argv == NULL) + goto cleanup; + + py_command_info = py_str_array_to_tuple(command_info); + if (py_command_info == NULL) + goto cleanup; + + py_run_envp = py_str_array_to_tuple(run_envp); + if (py_run_envp == NULL) + goto cleanup; + + PyObject *py_args = Py_BuildValue("(ziOOO)", plugin_name, plugin_type, py_command_info, py_run_argv, py_run_envp); + rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(accept), py_args); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + +cleanup: + Py_CLEAR(py_command_info); + Py_CLEAR(py_run_argv); + Py_CLEAR(py_run_envp); + + debug_return_int(rc); +} + +int +python_plugin_audit_reject(struct AuditPluginContext *audit_ctx, + const char *plugin_name, unsigned int plugin_type, + const char *audit_msg, char * const command_info[], const char **errstr) +{ + debug_decl(python_plugin_audit_reject, PYTHON_DEBUG_CALLBACKS); + + struct PluginContext *plugin_ctx = BASE_CTX(audit_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + + PyObject *py_command_info = NULL; + int rc = SUDO_RC_ERROR; + + py_command_info = py_str_array_to_tuple(command_info); + if (PyErr_Occurred()) + goto cleanup; + + PyObject *py_args = Py_BuildValue("(zizO)", plugin_name, plugin_type, audit_msg, py_command_info); + rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(reject), py_args); + + CALLBACK_SET_ERROR(plugin_ctx, errstr); + +cleanup: + Py_CLEAR(py_command_info); + if (PyErr_Occurred()) + py_log_last_error("Error during calling audit reject"); + + debug_return_int(rc); +} + +int +python_plugin_audit_error(struct AuditPluginContext *audit_ctx, + const char *plugin_name, unsigned int plugin_type, + const char *audit_msg, char * const command_info[], const char **errstr) +{ + debug_decl(python_plugin_audit_error, PYTHON_DEBUG_CALLBACKS); + + struct PluginContext *plugin_ctx = BASE_CTX(audit_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + + PyObject *py_command_info = NULL; + int rc = SUDO_RC_ERROR; + + py_command_info = py_str_array_to_tuple(command_info); + if (PyErr_Occurred()) + goto cleanup; + + PyObject *py_args = Py_BuildValue("(zizO)", plugin_name, plugin_type, audit_msg, py_command_info); + rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(error), py_args); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + +cleanup: + Py_CLEAR(py_command_info); + + debug_return_int(rc); +} + +int +python_plugin_audit_show_version(struct AuditPluginContext *audit_ctx, int verbose) +{ + debug_decl(python_plugin_audit_show_version, PYTHON_DEBUG_CALLBACKS); + + struct PluginContext *plugin_ctx = BASE_CTX(audit_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + + debug_return_int(python_plugin_show_version(plugin_ctx, + CALLBACK_PYNAME(show_version), verbose, PY_AUDIT_PLUGIN_VERSION, "audit")); +} + +sudo_dso_public struct audit_plugin python_audit; + +// generate symbols for loading multiple audit plugins: +#define AUDIT_SYMBOL_NAME(symbol) symbol +#include "python_plugin_audit_multi.inc" +#define AUDIT_SYMBOL_NAME(symbol) symbol##1 +#include "python_plugin_audit_multi.inc" +#define AUDIT_SYMBOL_NAME(symbol) symbol##2 +#include "python_plugin_audit_multi.inc" +#define AUDIT_SYMBOL_NAME(symbol) symbol##3 +#include "python_plugin_audit_multi.inc" +#define AUDIT_SYMBOL_NAME(symbol) symbol##4 +#include "python_plugin_audit_multi.inc" +#define AUDIT_SYMBOL_NAME(symbol) symbol##5 +#include "python_plugin_audit_multi.inc" +#define AUDIT_SYMBOL_NAME(symbol) symbol##6 +#include "python_plugin_audit_multi.inc" +#define AUDIT_SYMBOL_NAME(symbol) symbol##7 +#include "python_plugin_audit_multi.inc" + +static struct audit_plugin *extra_audit_plugins[] = { + &python_audit1, + &python_audit2, + &python_audit3, + &python_audit4, + &python_audit5, + &python_audit6, + &python_audit7 +}; + +sudo_dso_public struct audit_plugin * +python_audit_clone(void) +{ + static size_t counter = 0; + struct audit_plugin *next_plugin = NULL; + + size_t max = sizeof(extra_audit_plugins) / sizeof(*extra_audit_plugins); + if (counter < max) { + next_plugin = extra_audit_plugins[counter]; + ++counter; + } else if (counter == max) { + ++counter; + py_sudo_log(SUDO_CONV_ERROR_MSG, "sudo: loading more than %d sudo python audit plugins is not supported\n", counter); + } + + return next_plugin; +} diff --git a/plugins/python/python_plugin_audit_multi.inc b/plugins/python/python_plugin_audit_multi.inc new file mode 100644 index 0000000..bb65f9e --- /dev/null +++ b/plugins/python/python_plugin_audit_multi.inc @@ -0,0 +1,78 @@ +/* The purpose of this file is to generate a audit_plugin symbols, + * with an I/O plugin context which is unique to it and its functions. + * The callbacks inside are just wrappers around the real functions in python_plugin_audit.c, + * their only purpose is to add the unique context to each separate audit_plugin call. + */ + +#define PLUGIN_CTX AUDIT_SYMBOL_NAME(plugin_ctx) +#define CALLBACK_CFUNC(func_name) AUDIT_SYMBOL_NAME(_python_plugin_audit_ ## func_name) + +extern struct audit_plugin AUDIT_SYMBOL_NAME(python_audit); +static struct AuditPluginContext PLUGIN_CTX = { {}, &AUDIT_SYMBOL_NAME(python_audit) }; + + +static int +CALLBACK_CFUNC(open)(unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], int submit_optind, + char * const submit_argv[], char * const submit_envp[], + char * const plugin_options[], const char **errstr) +{ + return python_plugin_audit_open(&PLUGIN_CTX, version, conversation, sudo_printf, + settings, user_info, submit_optind, submit_argv, submit_envp, + plugin_options, errstr); +} + +static void +CALLBACK_CFUNC(close)(int status_type, int status) +{ + python_plugin_audit_close(&PLUGIN_CTX, status_type, status); +} + +int +CALLBACK_CFUNC(accept)(const char *plugin_name, unsigned int plugin_type, + char * const command_info[], char * const run_argv[], + char * const run_envp[], const char **errstr) +{ + return python_plugin_audit_accept(&PLUGIN_CTX, plugin_name, plugin_type, + command_info, run_argv, run_envp, errstr); +} + +int +CALLBACK_CFUNC(reject)(const char *plugin_name, unsigned int plugin_type, + const char *audit_msg, char * const command_info[], const char **errstr) +{ + return python_plugin_audit_reject(&PLUGIN_CTX, plugin_name, plugin_type, + audit_msg, command_info, errstr); +} + +int +CALLBACK_CFUNC(error)(const char *plugin_name, unsigned int plugin_type, + const char *audit_msg, char * const command_info[], const char **errstr) +{ + return python_plugin_audit_error(&PLUGIN_CTX, plugin_name, plugin_type, + audit_msg, command_info, errstr); +} + +int +CALLBACK_CFUNC(show_version)(int verbose) +{ + return python_plugin_audit_show_version(&PLUGIN_CTX, verbose); +} + +struct audit_plugin AUDIT_SYMBOL_NAME(python_audit) = { + SUDO_AUDIT_PLUGIN, + SUDO_API_VERSION, + CALLBACK_CFUNC(open), + CALLBACK_CFUNC(close), + CALLBACK_CFUNC(accept), + CALLBACK_CFUNC(reject), + CALLBACK_CFUNC(error), + CALLBACK_CFUNC(show_version), + NULL, /* register_hooks */ + NULL /* deregister_hooks */ +}; + +#undef PLUGIN_CTX +#undef CALLBACK_CFUNC +#undef AUDIT_SYMBOL_NAME diff --git a/plugins/python/python_plugin_common.c b/plugins/python/python_plugin_common.c new file mode 100644 index 0000000..b6e6c4e --- /dev/null +++ b/plugins/python/python_plugin_common.c @@ -0,0 +1,743 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "python_plugin_common.h" +#include "sudo_python_module.h" + +#include "sudo_queue.h" +#include "sudo_conf.h" + +#include +#include + +static struct _inittab * python_inittab_copy = NULL; +static size_t python_inittab_copy_len = 0; + +#ifndef PLUGIN_DIR +#define PLUGIN_DIR "" +#endif + +/* Py_FinalizeEx is new in version 3.6 */ +#if PY_MAJOR_VERSION > 3 || PY_MINOR_VERSION < 6 +# define Py_FinalizeEx() (Py_Finalize(), 0) +#endif + +const char * +_lookup_value(char * const keyvalues[], const char *key) +{ + debug_decl(_lookup_value, PYTHON_DEBUG_INTERNAL); + if (keyvalues == NULL) + debug_return_const_str(NULL); + + size_t keylen = strlen(key); + for (; *keyvalues != NULL; ++keyvalues) { + const char *keyvalue = *keyvalues; + if (strncmp(keyvalue, key, keylen) == 0 && keyvalue[keylen] == '=') + debug_return_const_str(keyvalue + keylen + 1); + } + debug_return_const_str(NULL); +} + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +int +_append_python_path(const char *module_dir) +{ + debug_decl(_append_python_path, PYTHON_DEBUG_PLUGIN_LOAD); + int rc = -1; + PyObject *py_sys_path = PySys_GetObject("path"); + if (py_sys_path == NULL) { + PyErr_Format(sudo_exc_SudoException, "Failed to get python 'path'"); + debug_return_int(rc); + } + + sudo_debug_printf(SUDO_DEBUG_DIAG, "Extending python 'path' with '%s'\n", module_dir); + + PyObject *py_module_dir = PyUnicode_FromString(module_dir); + if (py_module_dir == NULL || PyList_Append(py_sys_path, py_module_dir) != 0) { + Py_XDECREF(py_module_dir); + debug_return_int(rc); + } + Py_XDECREF(py_module_dir); + + if (sudo_debug_needed(SUDO_DEBUG_INFO)) { + char *path = py_join_str_list(py_sys_path, ":"); + sudo_debug_printf(SUDO_DEBUG_INFO, "Python path became: %s\n", path); + free(path); + } + + rc = 0; + debug_return_int(rc); +} + +static PyObject * +_import_module(const char *path) +{ + debug_decl(_import_module, PYTHON_DEBUG_PLUGIN_LOAD); + + sudo_debug_printf(SUDO_DEBUG_DIAG, "importing module: %s\n", path); + + char path_copy[PATH_MAX]; + if (strlcpy(path_copy, path, sizeof(path_copy)) >= sizeof(path_copy)) + debug_return_ptr(NULL); + + char *module_dir = path_copy; + char *module_name = strrchr(path_copy, '/'); + if (module_name == NULL) { + module_name = path_copy; + module_dir = ""; + } else { + *module_name++ = '\0'; + } + + size_t len = strlen(module_name); + if (len >= 3 && strcmp(".py", module_name + len - 3) == 0) + module_name[len - 3] = '\0'; + + sudo_debug_printf(SUDO_DEBUG_INFO, "module_name: '%s', module_dir: '%s'\n", module_name, module_dir); + + if (_append_python_path(module_dir) < 0) + debug_return_ptr(NULL); + + debug_return_ptr(PyImport_ImportModule(module_name)); +} + +static PyThreadState * +_python_plugin_new_interpreter(void) +{ + debug_decl(_python_plugin_new_interpreter, PYTHON_DEBUG_INTERNAL); + if (py_ctx.interpreter_count >= INTERPRETER_MAX) { + PyErr_Format(PyExc_Exception, "Too many interpreters"); + debug_return_ptr(NULL); + } + + PyThreadState *py_interpreter = Py_NewInterpreter(); + if (py_interpreter != NULL) { + py_ctx.py_subinterpreters[py_ctx.interpreter_count] = py_interpreter; + ++py_ctx.interpreter_count; + } + + debug_return_ptr(py_interpreter); +} + +static int +_save_inittab(void) +{ + debug_decl(_save_inittab, PYTHON_DEBUG_INTERNAL); + free(python_inittab_copy); // just to be sure (it is always NULL) + + for (python_inittab_copy_len = 0; + PyImport_Inittab[python_inittab_copy_len].name != NULL; + ++python_inittab_copy_len) { + } + ++python_inittab_copy_len; // for the null mark + + python_inittab_copy = malloc(sizeof(struct _inittab) * python_inittab_copy_len); + if (python_inittab_copy == NULL) { + debug_return_int(SUDO_RC_ERROR); + } + + memcpy(python_inittab_copy, PyImport_Inittab, python_inittab_copy_len * sizeof(struct _inittab)); + debug_return_int(SUDO_RC_OK); +} + +static void +_restore_inittab(void) +{ + debug_decl(_restore_inittab, PYTHON_DEBUG_INTERNAL); + + if (python_inittab_copy != NULL) + memcpy(PyImport_Inittab, python_inittab_copy, python_inittab_copy_len * sizeof(struct _inittab)); + + free(python_inittab_copy); + python_inittab_copy = NULL; + python_inittab_copy_len = 0; + debug_return; +} + +void +python_plugin_handle_plugin_error_exception(PyObject **py_result, struct PluginContext *plugin_ctx) +{ + debug_decl(python_plugin_handle_plugin_error_exception, PYTHON_DEBUG_INTERNAL); + + free(plugin_ctx->callback_error); + plugin_ctx->callback_error = NULL; + + if (PyErr_Occurred()) { + int rc = SUDO_RC_ERROR; + if (PyErr_ExceptionMatches(sudo_exc_PluginReject)) { + rc = SUDO_RC_REJECT; + } else if (!PyErr_ExceptionMatches(sudo_exc_PluginError)) { + debug_return; + } + + if (py_result != NULL) { + Py_CLEAR(*py_result); + *py_result = PyLong_FromLong(rc); + } + + PyObject *py_type = NULL, *py_message = NULL, *py_traceback = NULL; + PyErr_Fetch(&py_type, &py_message, &py_traceback); + + char *message = py_message ? py_create_string_rep(py_message) : NULL; + sudo_debug_printf(SUDO_DEBUG_INFO, "received sudo.PluginError exception with message '%s'", + message == NULL ? "(null)" : message); + + plugin_ctx->callback_error = message; + + Py_CLEAR(py_type); + Py_CLEAR(py_message); + Py_CLEAR(py_traceback); + } + + debug_return; +} + +int +python_plugin_construct_custom(struct PluginContext *plugin_ctx, PyObject *py_kwargs) +{ + debug_decl(python_plugin_construct_custom, PYTHON_DEBUG_PLUGIN_LOAD); + int rc = SUDO_RC_ERROR; + PyObject *py_args = PyTuple_New(0); + + if (py_args == NULL) + goto cleanup; + + py_debug_python_call(python_plugin_name(plugin_ctx), "__init__", + py_args, py_kwargs, PYTHON_DEBUG_PY_CALLS); + + plugin_ctx->py_instance = PyObject_Call(plugin_ctx->py_class, py_args, py_kwargs); + python_plugin_handle_plugin_error_exception(NULL, plugin_ctx); + + py_debug_python_result(python_plugin_name(plugin_ctx), "__init__", + plugin_ctx->py_instance, PYTHON_DEBUG_PY_CALLS); + + if (plugin_ctx->py_instance) + rc = SUDO_RC_OK; + +cleanup: + if (PyErr_Occurred()) { + py_log_last_error("Failed to construct plugin instance"); + Py_CLEAR(plugin_ctx->py_instance); + rc = SUDO_RC_ERROR; + } + + Py_XDECREF(py_args); + debug_return_int(rc); +} + +PyObject * +python_plugin_construct_args(unsigned int version, + char *const settings[], char *const user_info[], + char *const user_env[], char *const plugin_options[]) +{ + PyObject *py_settings = NULL; + PyObject *py_user_info = NULL; + PyObject *py_user_env = NULL; + PyObject *py_plugin_options = NULL; + PyObject *py_version = NULL; + PyObject *py_kwargs = NULL; + + if ((py_settings = py_str_array_to_tuple(settings)) == NULL || + (py_user_info = py_str_array_to_tuple(user_info)) == NULL || + (py_user_env = py_str_array_to_tuple(user_env)) == NULL || + (py_plugin_options = py_str_array_to_tuple(plugin_options)) == NULL || + (py_version = py_create_version(version)) == NULL || + (py_kwargs = PyDict_New()) == NULL || + PyDict_SetItemString(py_kwargs, "version", py_version) != 0 || + PyDict_SetItemString(py_kwargs, "settings", py_settings) != 0 || + PyDict_SetItemString(py_kwargs, "user_env", py_user_env) != 0 || + PyDict_SetItemString(py_kwargs, "user_info", py_user_info) != 0 || + PyDict_SetItemString(py_kwargs, "plugin_options", py_plugin_options) != 0) + { + Py_CLEAR(py_kwargs); + } + + Py_CLEAR(py_settings); + Py_CLEAR(py_user_info); + Py_CLEAR(py_user_env); + Py_CLEAR(py_plugin_options); + Py_CLEAR(py_version); + return py_kwargs; +} + +int +python_plugin_construct(struct PluginContext *plugin_ctx, unsigned int version, + char *const settings[], char *const user_info[], + char *const user_env[], char *const plugin_options[]) +{ + debug_decl(python_plugin_construct, PYTHON_DEBUG_PLUGIN_LOAD); + + int rc = SUDO_RC_ERROR; + PyObject *py_kwargs = python_plugin_construct_args( + version, settings, user_info, user_env, plugin_options); + + if (py_kwargs == NULL) { + py_log_last_error("Failed to construct plugin instance"); + rc = SUDO_RC_ERROR; + } else { + rc = python_plugin_construct_custom(plugin_ctx, py_kwargs); + } + + Py_CLEAR(py_kwargs); + + debug_return_int(rc); +} + +int +python_plugin_register_logging(sudo_conv_t conversation, + sudo_printf_t sudo_printf, + char * const settings[]) +{ + debug_decl(python_plugin_register_logging, PYTHON_DEBUG_INTERNAL); + + int rc = SUDO_RC_ERROR; + if (conversation != NULL) + py_ctx.sudo_conv = conversation; + + if (sudo_printf) + py_ctx.sudo_log = sudo_printf; + + struct sudo_conf_debug_file_list debug_files = TAILQ_HEAD_INITIALIZER(debug_files); + struct sudo_conf_debug_file_list *debug_files_ptr = &debug_files; + + const char *plugin_path = _lookup_value(settings, "plugin_path"); + if (plugin_path == NULL) + plugin_path = "python_plugin.so"; + + const char *debug_flags = _lookup_value(settings, "debug_flags"); + + if (debug_flags == NULL) { // the group plugin does not have this information, so try to look it up + debug_files_ptr = sudo_conf_debug_files(plugin_path); + } else { + if (!python_debug_parse_flags(&debug_files, debug_flags)) + goto cleanup; + } + + if (debug_files_ptr != NULL) { + if (!python_debug_register(plugin_path, debug_files_ptr)) + goto cleanup; + } + + rc = SUDO_RC_OK; + +cleanup: + debug_return_int(rc); +} + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +static int +_python_plugin_register_plugin_in_py_ctx(void) +{ + debug_decl(_python_plugin_register_plugin_in_py_ctx, PYTHON_DEBUG_PLUGIN_LOAD); + + if (!Py_IsInitialized()) { + // Disable environment variables effecting the python interpreter + // This is important since we are running code here as root, the + // user should not be able to alter what is running any how. + Py_IgnoreEnvironmentFlag = 1; + Py_IsolatedFlag = 1; + Py_NoUserSiteDirectory = 1; + + if (_save_inittab() != SUDO_RC_OK) + debug_return_int(SUDO_RC_ERROR); + + PyImport_AppendInittab("sudo", sudo_module_init); + Py_InitializeEx(0); + py_ctx.py_main_interpreter = PyThreadState_Get(); + + // This ensures we import "sudo" module in the main interpreter, + // each subinterpreter will have a shallow copy. + // (This makes the C sudo module able to eg. import other modules.) + PyObject *py_sudo = NULL; + if ((py_sudo = PyImport_ImportModule("sudo")) == NULL) { + debug_return_int(SUDO_RC_ERROR); + } + Py_CLEAR(py_sudo); + } else { + PyThreadState_Swap(py_ctx.py_main_interpreter); + } + + debug_return_int(SUDO_RC_OK); +} + +int +_python_plugin_set_path(struct PluginContext *plugin_ctx, const char *path) +{ + if (path == NULL) { + py_sudo_log(SUDO_CONV_ERROR_MSG, "No python module path is specified. " + "Use 'ModulePath' plugin config option in 'sudo.conf'\n"); + return SUDO_RC_ERROR; + } + + if (*path == '/') { // absolute path + plugin_ctx->plugin_path = strdup(path); + } else { + if (asprintf(&plugin_ctx->plugin_path, PLUGIN_DIR "/python/%s", path) < 0) + plugin_ctx->plugin_path = NULL; + } + + if (plugin_ctx->plugin_path == NULL) { + py_sudo_log(SUDO_CONV_ERROR_MSG, "Failed to allocate memory"); + return SUDO_RC_ERROR; + } + + return SUDO_RC_OK; +} + +/* Returns the list of sudo.Plugins in a module */ +static PyObject * +_python_plugin_class_list(PyObject *py_module) { + PyObject *py_module_dict = PyModule_GetDict(py_module); // Note: borrowed + PyObject *key, *value; // Note: borrowed + Py_ssize_t pos = 0; + PyObject *py_plugin_list = PyList_New(0); + + while (PyDict_Next(py_module_dict, &pos, &key, &value)) { + if (PyObject_IsSubclass(value, (PyObject *)sudo_type_Plugin) == 1) { + if (PyList_Append(py_plugin_list, key) != 0) + goto cleanup; + } else { + PyErr_Clear(); + } + } + +cleanup: + if (PyErr_Occurred()) { + Py_CLEAR(py_plugin_list); + } + return py_plugin_list; +} + +/* Gets a sudo.Plugin class from the specified module. The argument "plugin_class" + * can be NULL in which case it loads the one and only "sudo.Plugin" present + * in the module (if so), or displays helpful error message. */ +static PyObject * +_python_plugin_get_class(const char *plugin_path, PyObject *py_module, const char *plugin_class) +{ + debug_decl(python_plugin_init, PYTHON_DEBUG_PLUGIN_LOAD); + PyObject *py_plugin_list = NULL, *py_class = NULL; + + if (plugin_class == NULL) { + py_plugin_list = _python_plugin_class_list(py_module); + if (py_plugin_list == NULL) { + goto cleanup; + } + + if (PyList_Size(py_plugin_list) == 1) { + PyObject *py_plugin_name = PyList_GetItem(py_plugin_list, 0); // Note: borrowed + plugin_class = PyUnicode_AsUTF8(py_plugin_name); + } + } + + if (plugin_class == NULL) { + py_sudo_log(SUDO_CONV_ERROR_MSG, "No plugin class is specified for python module '%s'. " + "Use 'ClassName' configuration option in 'sudo.conf'\n", plugin_path); + if (py_plugin_list != NULL) { + /* Sorting the plugin list makes regress test output consistent. */ + PyObject *py_obj = PyObject_CallMethod(py_plugin_list, "sort", ""); + Py_CLEAR(py_obj); + char *possible_plugins = py_join_str_list(py_plugin_list, ", "); + if (possible_plugins != NULL) { + py_sudo_log(SUDO_CONV_ERROR_MSG, "Possible plugins: %s\n", possible_plugins); + free(possible_plugins); + } + } + goto cleanup; + } + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "Using plugin class '%s'", plugin_class); + py_class = PyObject_GetAttrString(py_module, plugin_class); + if (py_class == NULL) { + py_sudo_log(SUDO_CONV_ERROR_MSG, "Failed to find plugin class '%s'\n", plugin_class); + PyErr_Clear(); + goto cleanup; + } + + if (!PyObject_IsSubclass(py_class, (PyObject *)sudo_type_Plugin)) { + py_sudo_log(SUDO_CONV_ERROR_MSG, "Plugin class '%s' does not inherit from 'sudo.Plugin'\n", plugin_class); + Py_CLEAR(py_class); + goto cleanup; + } + +cleanup: + Py_CLEAR(py_plugin_list); + debug_return_ptr(py_class); +} + +int +python_plugin_init(struct PluginContext *plugin_ctx, char * const plugin_options[], + unsigned int version) +{ + debug_decl(python_plugin_init, PYTHON_DEBUG_PLUGIN_LOAD); + + int rc = SUDO_RC_ERROR; + + if (_python_plugin_register_plugin_in_py_ctx() != SUDO_RC_OK) + goto cleanup; + + plugin_ctx->sudo_api_version = version; + + plugin_ctx->py_interpreter = _python_plugin_new_interpreter(); + if (plugin_ctx->py_interpreter == NULL) { + goto cleanup; + } + PyThreadState_Swap(plugin_ctx->py_interpreter); + + if (!sudo_conf_developer_mode() && sudo_module_register_importblocker() < 0) { + goto cleanup; + } + + if (sudo_module_set_default_loghandler() < 0) + goto cleanup; + + if (_python_plugin_set_path(plugin_ctx, _lookup_value(plugin_options, "ModulePath")) != SUDO_RC_OK) { + goto cleanup; + } + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "Loading python module from path '%s'", plugin_ctx->plugin_path); + plugin_ctx->py_module = _import_module(plugin_ctx->plugin_path); + if (plugin_ctx->py_module == NULL) { + goto cleanup; + } + + plugin_ctx->py_class = _python_plugin_get_class(plugin_ctx->plugin_path, plugin_ctx->py_module, + _lookup_value(plugin_options, "ClassName")); + if (plugin_ctx->py_class == NULL) { + goto cleanup; + } + + rc = SUDO_RC_OK; + +cleanup: + if (plugin_ctx->py_class == NULL) { + py_log_last_error("Failed during loading plugin class"); + rc = SUDO_RC_ERROR; + } + + debug_return_int(rc); +} + +void +python_plugin_deinit(struct PluginContext *plugin_ctx) +{ + debug_decl(python_plugin_deinit, PYTHON_DEBUG_PLUGIN_LOAD); + sudo_debug_printf(SUDO_DEBUG_DIAG, "Deinit was called for a python plugin\n"); + + Py_CLEAR(plugin_ctx->py_instance); + Py_CLEAR(plugin_ctx->py_class); + Py_CLEAR(plugin_ctx->py_module); + + // Note: we are preserving the interpreters here until the unlink because + // of bugs like (strptime does not work after python interpreter reinit): + // https://bugs.python.org/issue27400 + // These potentially effect a lot more python functions, simply because + // it is a rare tested scenario. + + free(plugin_ctx->callback_error); + free(plugin_ctx->plugin_path); + memset(plugin_ctx, 0, sizeof(*plugin_ctx)); + + python_debug_deregister(); + debug_return; +} + +PyObject * +python_plugin_api_call(struct PluginContext *plugin_ctx, const char *func_name, PyObject *py_args) +{ + debug_decl(python_plugin_api_call, PYTHON_DEBUG_PY_CALLS); + + // Note: call fails if py_args is an empty tuple. Passing no arguments works passing NULL + // instead. So having such must be handled as valid. (See policy_plugin.validate()) + if (py_args == NULL && PyErr_Occurred()) { + py_sudo_log(SUDO_CONV_ERROR_MSG, "Failed to build arguments for python plugin API call '%s'\n", func_name); + py_log_last_error(NULL); + debug_return_ptr(NULL); + } + + PyObject *py_callable = NULL; + py_callable = PyObject_GetAttrString(plugin_ctx->py_instance, func_name); + + if (py_callable == NULL) { + Py_CLEAR(py_args); + debug_return_ptr(NULL); + } + + py_debug_python_call(python_plugin_name(plugin_ctx), func_name, + py_args, NULL, PYTHON_DEBUG_PY_CALLS); + + PyObject *py_result = PyObject_CallObject(py_callable, py_args); + Py_CLEAR(py_args); + Py_CLEAR(py_callable); + + py_debug_python_result(python_plugin_name(plugin_ctx), func_name, + py_result, PYTHON_DEBUG_PY_CALLS); + + python_plugin_handle_plugin_error_exception(&py_result, plugin_ctx); + + if (PyErr_Occurred()) { + py_log_last_error(NULL); + } + + debug_return_ptr(py_result); +} + +int +python_plugin_rc_to_int(PyObject *py_result) +{ + debug_decl(python_plugin_rc_to_int, PYTHON_DEBUG_PY_CALLS); + if (py_result == NULL) + debug_return_int(SUDO_RC_ERROR); + + if (py_result == Py_None) + debug_return_int(SUDO_RC_OK); + + debug_return_int((int)PyLong_AsLong(py_result)); +} + +int +python_plugin_api_rc_call(struct PluginContext *plugin_ctx, const char *func_name, PyObject *py_args) +{ + debug_decl(python_plugin_api_rc_call, PYTHON_DEBUG_PY_CALLS); + + PyObject *py_result = python_plugin_api_call(plugin_ctx, func_name, py_args); + int rc = python_plugin_rc_to_int(py_result); + Py_XDECREF(py_result); + debug_return_int(rc); +} + +int +python_plugin_show_version(struct PluginContext *plugin_ctx, const char *python_callback_name, + int is_verbose, unsigned int plugin_api_version, const char *plugin_api_name) +{ + debug_decl(python_plugin_show_version, PYTHON_DEBUG_CALLBACKS); + + if (is_verbose) { + py_sudo_log(SUDO_CONV_INFO_MSG, "Python %s plugin (API %d.%d): %s (loaded from '%s')\n", + plugin_api_name, + SUDO_API_VERSION_GET_MAJOR(plugin_api_version), + SUDO_API_VERSION_GET_MINOR(plugin_api_version), + python_plugin_name(plugin_ctx), + plugin_ctx->plugin_path); + } + + int rc = SUDO_RC_OK; + if (PyObject_HasAttrString(plugin_ctx->py_instance, python_callback_name)) { + rc = python_plugin_api_rc_call(plugin_ctx, python_callback_name, + Py_BuildValue("(i)", is_verbose)); + } + + debug_return_int(rc); +} + +void +python_plugin_close(struct PluginContext *plugin_ctx, const char *callback_name, + PyObject *py_args) +{ + debug_decl(python_plugin_close, PYTHON_DEBUG_CALLBACKS); + + PyThreadState_Swap(plugin_ctx->py_interpreter); + + // Note, this should handle the case when init has failed + if (plugin_ctx->py_instance != NULL) { + if (!plugin_ctx->call_close) { + sudo_debug_printf(SUDO_DEBUG_INFO, "Skipping close call, because there was no command run\n"); + + } else if (!PyObject_HasAttrString(plugin_ctx->py_instance, callback_name)) { + sudo_debug_printf(SUDO_DEBUG_INFO, "Python plugin function 'close' is skipped (not present)\n"); + } else { + PyObject *py_result = python_plugin_api_call(plugin_ctx, callback_name, py_args); + py_args = NULL; // api call already freed it + Py_XDECREF(py_result); + } + } + + Py_CLEAR(py_args); + + if (PyErr_Occurred()) { + py_log_last_error(NULL); + } + + python_plugin_deinit(plugin_ctx); + + debug_return; +} + +void +python_plugin_mark_callback_optional(struct PluginContext *plugin_ctx, + const char *function_name, void **function) +{ + if (!PyObject_HasAttrString(plugin_ctx->py_instance, function_name)) { + debug_decl_vars(python_plugin_mark_callback_optional, PYTHON_DEBUG_PY_CALLS); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s function '%s' is not implemented\n", + Py_TYPENAME(plugin_ctx->py_instance), function_name); + *function = NULL; + } +} + +const char * +python_plugin_name(struct PluginContext *plugin_ctx) +{ + debug_decl(python_plugin_name, PYTHON_DEBUG_INTERNAL); + + const char *name = "(NULL)"; + + if (plugin_ctx == NULL || !PyType_Check(plugin_ctx->py_class)) + debug_return_const_str(name); + + debug_return_const_str(((PyTypeObject *)(plugin_ctx->py_class))->tp_name); +} + +void python_plugin_unlink(void) __attribute__((destructor)); + +// this gets run only when sudo unlinks the python_plugin.so +void +python_plugin_unlink(void) +{ + debug_decl(python_plugin_unlink, PYTHON_DEBUG_INTERNAL); + if (py_ctx.py_main_interpreter == NULL) + return; + + if (Py_IsInitialized()) { + sudo_debug_printf(SUDO_DEBUG_NOTICE, "Closing: deinit python %zu subinterpreters\n", + py_ctx.interpreter_count); + for (size_t i = 0; i < py_ctx.interpreter_count; ++i) { + PyThreadState *py_interpreter = py_ctx.py_subinterpreters[i]; + PyThreadState_Swap(py_interpreter); + Py_EndInterpreter(py_interpreter); + } + + sudo_debug_printf(SUDO_DEBUG_NOTICE, "Closing: deinit main interpreter\n"); + + // we need to call finalize from the main interpreter + PyThreadState_Swap(py_ctx.py_main_interpreter); + + if (Py_FinalizeEx() != 0) { + sudo_debug_printf(SUDO_DEBUG_WARN, "Closing: failed to deinit python interpreter\n"); + } + + // Restore inittab so "sudo" module does not remain there (as garbage) + _restore_inittab(); + } + py_ctx_reset(); + debug_return; +} diff --git a/plugins/python/python_plugin_common.h b/plugins/python/python_plugin_common.h new file mode 100644 index 0000000..c0fdce6 --- /dev/null +++ b/plugins/python/python_plugin_common.h @@ -0,0 +1,85 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_PYTHON_PLUGIN_COMMON_H +#define SUDO_PYTHON_PLUGIN_COMMON_H + +#include "pyhelpers.h" + +struct PluginContext { + PyThreadState *py_interpreter; + PyObject *py_module; + PyObject *py_class; + PyObject *py_instance; + int call_close; + unsigned int sudo_api_version; + char *plugin_path; + + // We use this to let the error string live until sudo and the audit plugins + // are using it. + char *callback_error; +}; + +int python_plugin_register_logging(sudo_conv_t conversation, sudo_printf_t sudo_printf, char * const settings[]); + +int python_plugin_init(struct PluginContext *plugin_ctx, char * const plugin_options[], unsigned int version); + +int python_plugin_construct_custom(struct PluginContext *plugin_ctx, PyObject *py_kwargs); + +PyObject *python_plugin_construct_args(unsigned int version, char *const settings[], + char *const user_info[], char *const user_env[], char *const plugin_options[]); + +int python_plugin_construct(struct PluginContext *plugin_ctx, unsigned int version, + char *const settings[], char *const user_info[], + char *const user_env[], char *const plugin_options[]); + +void python_plugin_deinit(struct PluginContext *plugin_ctx); + +int python_plugin_show_version(struct PluginContext *plugin_ctx, + const char *python_callback_name, int isVerbose, unsigned int plugin_api_version, const char *plugin_api_name); + +CPYCHECKER_STEALS_REFERENCE_TO_ARG(3) +void python_plugin_close(struct PluginContext *plugin_ctx, const char *callback_name, + PyObject *py_args); + +CPYCHECKER_STEALS_REFERENCE_TO_ARG(3) +PyObject *python_plugin_api_call(struct PluginContext *plugin_ctx, + const char *func_name, PyObject *py_args); + +CPYCHECKER_STEALS_REFERENCE_TO_ARG(3) +int python_plugin_api_rc_call(struct PluginContext *plugin_ctx, + const char *func_name, PyObject *py_args); + +int python_plugin_rc_to_int(PyObject *py_result); + +void python_plugin_mark_callback_optional(struct PluginContext *plugin_ctx, + const char *function_name, void **function); + +const char *python_plugin_name(struct PluginContext *plugin_ctx); + +// sets the callback error stored in plugin_ctx into "errstr" but only if API +// version is enough and "errstr" is valid +#define CALLBACK_SET_ERROR(plugin_ctx, errstr) \ + do { \ + if ((plugin_ctx)->sudo_api_version >= SUDO_API_MKVERSION(1, 15)) { \ + if (errstr != NULL) \ + *errstr = (plugin_ctx)->callback_error; \ + } \ + } while(0) + +#endif // SUDO_PYTHON_PLUGIN_COMMON_H diff --git a/plugins/python/python_plugin_group.c b/plugins/python/python_plugin_group.c new file mode 100644 index 0000000..d0ea3c1 --- /dev/null +++ b/plugins/python/python_plugin_group.c @@ -0,0 +1,114 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "python_plugin_common.h" + +static struct PluginContext plugin_ctx; + +extern struct sudoers_group_plugin group_plugin; + +#define PY_GROUP_PLUGIN_VERSION SUDO_API_MKVERSION(1, 0) + +#define CALLBACK_PLUGINFUNC(func_name) group_plugin.func_name +#define CALLBACK_CFUNC(func_name) python_plugin_group_ ## func_name + +// This also verifies compile time that the name matches the sudo plugin API. +#define CALLBACK_PYNAME(func_name) ((void)CALLBACK_PLUGINFUNC(func_name), #func_name) + + +int +python_plugin_group_init(int version, sudo_printf_t sudo_printf, char *const plugin_options[]) +{ + debug_decl(python_plugin_group_init, PYTHON_DEBUG_CALLBACKS); + + if (version < SUDO_API_MKVERSION(1, 0)) { + sudo_printf(SUDO_CONV_ERROR_MSG, + "Error: Python group plugin requires at least plugin API version 1.0\n"); + debug_return_int(SUDO_RC_ERROR); + } + + int rc = SUDO_RC_ERROR; + + rc = python_plugin_register_logging(NULL, sudo_printf, NULL); + if (rc != SUDO_RC_OK) + debug_return_int(rc); + + rc = python_plugin_init(&plugin_ctx, plugin_options, (unsigned int)version); + if (rc != SUDO_RC_OK) + debug_return_int(rc); + + PyObject *py_version = NULL, + *py_plugin_options = NULL, + *py_kwargs = NULL; + + if ((py_kwargs = PyDict_New()) == NULL || + (py_version = py_create_version(PY_GROUP_PLUGIN_VERSION)) == NULL || + (py_plugin_options = py_str_array_to_tuple(plugin_options)) == NULL || + PyDict_SetItemString(py_kwargs, "args", py_plugin_options) != 0 || + PyDict_SetItemString(py_kwargs, "version", py_version)) + { + py_log_last_error("Failed to construct arguments for plugin constructor call."); + rc = SUDO_RC_ERROR; + } else { + rc = python_plugin_construct_custom(&plugin_ctx, py_kwargs); + } + + Py_XDECREF(py_version); + Py_XDECREF(py_plugin_options); + Py_XDECREF(py_kwargs); + debug_return_int(rc); +} + +void +python_plugin_group_cleanup(void) +{ + debug_decl(python_plugin_group_cleanup, PYTHON_DEBUG_CALLBACKS); + PyThreadState_Swap(plugin_ctx.py_interpreter); + python_plugin_deinit(&plugin_ctx); +} + +int +python_plugin_group_query(const char *user, const char *group, const struct passwd *pwd) +{ + debug_decl(python_plugin_group_query, PYTHON_DEBUG_CALLBACKS); + + PyThreadState_Swap(plugin_ctx.py_interpreter); + + PyObject *py_pwd = py_from_passwd(pwd); + if (py_pwd == NULL) { + debug_return_int(SUDO_RC_ERROR); + } + + int rc = python_plugin_api_rc_call(&plugin_ctx, CALLBACK_PYNAME(query), + Py_BuildValue("(zzO)", user, group, py_pwd)); + Py_XDECREF(py_pwd); + + debug_return_int(rc); +} + +sudo_dso_public struct sudoers_group_plugin group_plugin = { + GROUP_API_VERSION, + CALLBACK_CFUNC(init), + CALLBACK_CFUNC(cleanup), + CALLBACK_CFUNC(query) +}; diff --git a/plugins/python/python_plugin_io.c b/plugins/python/python_plugin_io.c new file mode 100644 index 0000000..b124808 --- /dev/null +++ b/plugins/python/python_plugin_io.c @@ -0,0 +1,277 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "python_plugin_common.h" + +struct IOPluginContext +{ + struct PluginContext base_ctx; + struct io_plugin *io_plugin; +}; + +#define BASE_CTX(io_ctx) (&(io_ctx->base_ctx)) + +#define PY_IO_PLUGIN_VERSION SUDO_API_MKVERSION(1, 0) + +#define CALLBACK_PLUGINFUNC(func_name) io_ctx->io_plugin->func_name + +// This also verifies compile time that the name matches the sudo plugin API. +#define CALLBACK_PYNAME(func_name) ((void)CALLBACK_PLUGINFUNC(func_name), #func_name) + +#define MARK_CALLBACK_OPTIONAL(function_name) \ + do { \ + python_plugin_mark_callback_optional(plugin_ctx, CALLBACK_PYNAME(function_name), \ + (void **)&CALLBACK_PLUGINFUNC(function_name)); \ + } while(0) + + +static int +_call_plugin_open(struct IOPluginContext *io_ctx, int argc, char * const argv[], char * const command_info[]) +{ + debug_decl(_call_plugin_open, PYTHON_DEBUG_CALLBACKS); + struct PluginContext *plugin_ctx = BASE_CTX(io_ctx); + plugin_ctx->call_close = 1; + + if (!PyObject_HasAttrString(plugin_ctx->py_instance, CALLBACK_PYNAME(open))) { + debug_return_int(SUDO_RC_OK); + } + + int rc = SUDO_RC_ERROR; + PyObject *py_argv = py_str_array_to_tuple_with_count(argc, argv); + PyObject *py_command_info = py_str_array_to_tuple(command_info); + + if (py_argv != NULL && py_command_info != NULL) { + rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(open), + Py_BuildValue("(OO)", py_argv, py_command_info)); + } else { + rc = SUDO_RC_ERROR; + } + + if (rc != SUDO_RC_OK) + plugin_ctx->call_close = 0; + + Py_XDECREF(py_argv); + Py_XDECREF(py_command_info); + debug_return_int(rc); +} + +int +python_plugin_io_open(struct IOPluginContext *io_ctx, + unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const command_info[], + int argc, char * const argv[], char * const user_env[], + char * const plugin_options[], const char **errstr) +{ + debug_decl(python_plugin_io_open, PYTHON_DEBUG_CALLBACKS); + + if (version < SUDO_API_MKVERSION(1, 2)) { + sudo_printf(SUDO_CONV_ERROR_MSG, + "Error: Python IO plugin requires at least plugin API version 1.2\n"); + debug_return_int(SUDO_RC_ERROR); + } + + int rc = python_plugin_register_logging(conversation, sudo_printf, settings); + if (rc != SUDO_RC_OK) + debug_return_int(rc); + + struct PluginContext *plugin_ctx = BASE_CTX(io_ctx); + rc = python_plugin_init(plugin_ctx, plugin_options, version); + + if (rc != SUDO_RC_OK) + debug_return_int(rc); + + rc = python_plugin_construct(plugin_ctx, PY_IO_PLUGIN_VERSION, + settings, user_info, user_env, plugin_options); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + if (rc != SUDO_RC_OK) { + debug_return_int(rc); + } + + // skip plugin callbacks which are not mandatory + MARK_CALLBACK_OPTIONAL(log_ttyin); + MARK_CALLBACK_OPTIONAL(log_ttyout); + MARK_CALLBACK_OPTIONAL(log_stdin); + MARK_CALLBACK_OPTIONAL(log_stdout); + MARK_CALLBACK_OPTIONAL(log_stderr); + MARK_CALLBACK_OPTIONAL(change_winsize); + MARK_CALLBACK_OPTIONAL(log_suspend); + // open and close are mandatory + + if (argc > 0) // we only call open if there is request for running sg + rc = _call_plugin_open(io_ctx, argc, argv, command_info); + + CALLBACK_SET_ERROR(plugin_ctx, errstr); + debug_return_int(rc); +} + +void +python_plugin_io_close(struct IOPluginContext *io_ctx, int exit_status, int error) +{ + debug_decl(python_plugin_io_close, PYTHON_DEBUG_CALLBACKS); + python_plugin_close(BASE_CTX(io_ctx), CALLBACK_PYNAME(close), + Py_BuildValue("(ii)", error == 0 ? exit_status : -1, error)); + debug_return; +} + +int +python_plugin_io_show_version(struct IOPluginContext *io_ctx, int verbose) +{ + debug_decl(python_plugin_io_show_version, PYTHON_DEBUG_CALLBACKS); + + PyThreadState_Swap(BASE_CTX(io_ctx)->py_interpreter); + + debug_return_int(python_plugin_show_version(BASE_CTX(io_ctx), CALLBACK_PYNAME(show_version), + verbose, PY_IO_PLUGIN_VERSION, "io")); +} + +int +python_plugin_io_log_ttyin(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr) +{ + debug_decl(python_plugin_io_log_ttyin, PYTHON_DEBUG_CALLBACKS); + struct PluginContext *plugin_ctx = BASE_CTX(io_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + int rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(log_ttyin), + Py_BuildValue("(s#)", buf, len)); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + debug_return_int(rc); +} + +int +python_plugin_io_log_ttyout(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr) +{ + debug_decl(python_plugin_io_log_ttyout, PYTHON_DEBUG_CALLBACKS); + struct PluginContext *plugin_ctx = BASE_CTX(io_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + int rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(log_ttyout), + Py_BuildValue("(s#)", buf, len)); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + debug_return_int(rc); +} + +int +python_plugin_io_log_stdin(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr) +{ + debug_decl(python_plugin_io_log_stdin, PYTHON_DEBUG_CALLBACKS); + struct PluginContext *plugin_ctx = BASE_CTX(io_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + int rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(log_stdin), + Py_BuildValue("(s#)", buf, len)); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + debug_return_int(rc); +} + +int +python_plugin_io_log_stdout(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr) +{ + debug_decl(python_plugin_io_log_stdout, PYTHON_DEBUG_CALLBACKS); + struct PluginContext *plugin_ctx = BASE_CTX(io_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + int rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(log_stdout), + Py_BuildValue("(s#)", buf, len)); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + debug_return_int(rc); +} + +int +python_plugin_io_log_stderr(struct IOPluginContext *io_ctx, const char *buf, unsigned int len, const char **errstr) +{ + debug_decl(python_plugin_io_log_stderr, PYTHON_DEBUG_CALLBACKS); + struct PluginContext *plugin_ctx = BASE_CTX(io_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + int rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(log_stderr), + Py_BuildValue("(s#)", buf, len)); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + debug_return_int(rc); +} + +int +python_plugin_io_change_winsize(struct IOPluginContext *io_ctx, unsigned int line, unsigned int cols, const char **errstr) +{ + debug_decl(python_plugin_io_change_winsize, PYTHON_DEBUG_CALLBACKS); + struct PluginContext *plugin_ctx = BASE_CTX(io_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + int rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(change_winsize), + Py_BuildValue("(ii)", line, cols)); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + debug_return_int(rc); +} + +int +python_plugin_io_log_suspend(struct IOPluginContext *io_ctx, int signo, const char **errstr) +{ + debug_decl(python_plugin_io_log_suspend, PYTHON_DEBUG_CALLBACKS); + struct PluginContext *plugin_ctx = BASE_CTX(io_ctx); + PyThreadState_Swap(plugin_ctx->py_interpreter); + int rc = python_plugin_api_rc_call(plugin_ctx, CALLBACK_PYNAME(log_suspend), + Py_BuildValue("(i)", signo)); + CALLBACK_SET_ERROR(plugin_ctx, errstr); + debug_return_int(rc); +} + +// generate symbols for loading multiple io plugins: +sudo_dso_public struct io_plugin python_io; +#define IO_SYMBOL_NAME(symbol) symbol +#include "python_plugin_io_multi.inc" +#define IO_SYMBOL_NAME(symbol) symbol##1 +#include "python_plugin_io_multi.inc" +#define IO_SYMBOL_NAME(symbol) symbol##2 +#include "python_plugin_io_multi.inc" +#define IO_SYMBOL_NAME(symbol) symbol##3 +#include "python_plugin_io_multi.inc" +#define IO_SYMBOL_NAME(symbol) symbol##4 +#include "python_plugin_io_multi.inc" +#define IO_SYMBOL_NAME(symbol) symbol##5 +#include "python_plugin_io_multi.inc" +#define IO_SYMBOL_NAME(symbol) symbol##6 +#include "python_plugin_io_multi.inc" +#define IO_SYMBOL_NAME(symbol) symbol##7 +#include "python_plugin_io_multi.inc" + +static struct io_plugin *extra_io_plugins[] = { + &python_io1, + &python_io2, + &python_io3, + &python_io4, + &python_io5, + &python_io6, + &python_io7 +}; + +sudo_dso_public struct io_plugin * +python_io_clone(void) +{ + static size_t counter = 0; + struct io_plugin *next_plugin = NULL; + + size_t max = sizeof(extra_io_plugins) / sizeof(*extra_io_plugins); + if (counter < max) { + next_plugin = extra_io_plugins[counter]; + ++counter; + } else if (counter == max) { + ++counter; + py_sudo_log(SUDO_CONV_ERROR_MSG, "sudo: loading more than %d sudo python IO plugins is not supported\n", counter); + } + + return next_plugin; +} diff --git a/plugins/python/python_plugin_io_multi.inc b/plugins/python/python_plugin_io_multi.inc new file mode 100644 index 0000000..bf776f3 --- /dev/null +++ b/plugins/python/python_plugin_io_multi.inc @@ -0,0 +1,99 @@ +/* The purpose of this file is to generate a io_plugin symbols, + * with an I/O plugin context which is unique to it and its functions. + * The callbacks inside are just wrappers around the real functions in python_plugin_io.c, + * their only purpose is to add the unique context to each separate io_plugin call. + */ + +#define PLUGIN_CTX IO_SYMBOL_NAME(plugin_ctx) +#define CALLBACK_CFUNC(func_name) IO_SYMBOL_NAME(_python_plugin_io_ ## func_name) + +extern struct io_plugin IO_SYMBOL_NAME(python_io); +static struct IOPluginContext PLUGIN_CTX = { {}, &IO_SYMBOL_NAME(python_io) }; + +int +CALLBACK_CFUNC(open)( + unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const command_info[], + int argc, char * const argv[], char * const user_env[], + char * const plugin_options[], const char **errstr) +{ + return python_plugin_io_open(&PLUGIN_CTX, version, conversation, + sudo_printf, settings, user_info, command_info, argc, argv, user_env, plugin_options, errstr); +} + +void +CALLBACK_CFUNC(close)(int exit_status, int error) +{ + python_plugin_io_close(&PLUGIN_CTX, exit_status, error); +} + +int +CALLBACK_CFUNC(show_version)(int verbose) +{ + return python_plugin_io_show_version(&PLUGIN_CTX, verbose); +} + +int +CALLBACK_CFUNC(log_ttyin)(const char *buf, unsigned int len, const char **errstr) +{ + return python_plugin_io_log_ttyin(&PLUGIN_CTX, buf, len, errstr); +} + +int +CALLBACK_CFUNC(log_ttyout)(const char *buf, unsigned int len, const char **errstr) +{ + return python_plugin_io_log_ttyout(&PLUGIN_CTX, buf, len, errstr); +} + +int +CALLBACK_CFUNC(log_stdin)(const char *buf, unsigned int len, const char **errstr) +{ + return python_plugin_io_log_stdin(&PLUGIN_CTX, buf, len, errstr); +} + +int +CALLBACK_CFUNC(log_stdout)(const char *buf, unsigned int len, const char **errstr) +{ + return python_plugin_io_log_stdout(&PLUGIN_CTX, buf, len, errstr); +} + +int +CALLBACK_CFUNC(log_stderr)(const char *buf, unsigned int len, const char **errstr) +{ + return python_plugin_io_log_stderr(&PLUGIN_CTX, buf, len, errstr); +} + +int +CALLBACK_CFUNC(change_winsize)(unsigned int line, unsigned int cols, const char **errstr) +{ + return python_plugin_io_change_winsize(&PLUGIN_CTX, line, cols, errstr); +} + +int +CALLBACK_CFUNC(log_suspend)(int signo, const char **errstr) +{ + return python_plugin_io_log_suspend(&PLUGIN_CTX, signo, errstr); +} + +struct io_plugin IO_SYMBOL_NAME(python_io) = { + SUDO_IO_PLUGIN, + SUDO_API_VERSION, + CALLBACK_CFUNC(open), + CALLBACK_CFUNC(close), + CALLBACK_CFUNC(show_version), + CALLBACK_CFUNC(log_ttyin), + CALLBACK_CFUNC(log_ttyout), + CALLBACK_CFUNC(log_stdin), + CALLBACK_CFUNC(log_stdout), + CALLBACK_CFUNC(log_stderr), + NULL, // register_hooks, + NULL, // deregister_hooks, + CALLBACK_CFUNC(change_winsize), + CALLBACK_CFUNC(log_suspend), + NULL // event_alloc +}; + +#undef PLUGIN_CTX +#undef CALLBACK_CFUNC +#undef IO_SYMBOL_NAME diff --git a/plugins/python/python_plugin_policy.c b/plugins/python/python_plugin_policy.c new file mode 100644 index 0000000..82b9a18 --- /dev/null +++ b/plugins/python/python_plugin_policy.c @@ -0,0 +1,290 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "python_plugin_common.h" + + +static struct PluginContext plugin_ctx; + +extern struct policy_plugin python_policy; + +#define PY_POLICY_PLUGIN_VERSION SUDO_API_MKVERSION(1, 0) + +#define CALLBACK_PLUGINFUNC(func_name) python_policy.func_name +#define CALLBACK_CFUNC(func_name) python_plugin_policy_ ## func_name + +// This also verifies compile time that the name matches the sudo plugin API. +#define CALLBACK_PYNAME(func_name) ((void)CALLBACK_PLUGINFUNC(func_name), #func_name) + +#define MARK_CALLBACK_OPTIONAL(function_name) \ + do { \ + python_plugin_mark_callback_optional(&plugin_ctx, CALLBACK_PYNAME(function_name), \ + (void **)&CALLBACK_PLUGINFUNC(function_name)); \ + } while(0) + + +static int +python_plugin_policy_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const user_env[], + char * const plugin_options[], const char **errstr) +{ + debug_decl(python_plugin_policy_open, PYTHON_DEBUG_CALLBACKS); + + if (version < SUDO_API_MKVERSION(1, 2)) { + sudo_printf(SUDO_CONV_ERROR_MSG, + "Error: Python policy plugin requires at least plugin API version 1.2\n"); + debug_return_int(SUDO_RC_ERROR); + } + + int rc = python_plugin_register_logging(conversation, sudo_printf, settings); + if (rc != SUDO_RC_OK) + debug_return_int(rc); + + rc = python_plugin_init(&plugin_ctx, plugin_options, version); + if (rc != SUDO_RC_OK) + debug_return_int(rc); + + rc = python_plugin_construct(&plugin_ctx, PY_POLICY_PLUGIN_VERSION, settings, + user_info, user_env, plugin_options); + CALLBACK_SET_ERROR(&plugin_ctx, errstr); + if (rc != SUDO_RC_OK) { + debug_return_int(rc); + } + + // skip plugin callbacks which are not mandatory + MARK_CALLBACK_OPTIONAL(list); + MARK_CALLBACK_OPTIONAL(validate); + MARK_CALLBACK_OPTIONAL(invalidate); + MARK_CALLBACK_OPTIONAL(init_session); + // check_policy, open and close are mandatory + + debug_return_int(rc); +} + +static void +python_plugin_policy_close(int exit_status, int error) +{ + debug_decl(python_plugin_policy_close, PYTHON_DEBUG_CALLBACKS); + python_plugin_close(&plugin_ctx, CALLBACK_PYNAME(close), + Py_BuildValue("(ii)", error == 0 ? exit_status : -1, error)); + debug_return; +} + +static int +python_plugin_policy_check(int argc, char * const argv[], + char *env_add[], char **command_info_out[], + char **argv_out[], char **user_env_out[], const char **errstr) +{ + debug_decl(python_plugin_policy_check, PYTHON_DEBUG_CALLBACKS); + int rc = SUDO_RC_ERROR; + + PyThreadState_Swap(plugin_ctx.py_interpreter); + + *command_info_out = *argv_out = *user_env_out = NULL; + + PyObject *py_argv = py_str_array_to_tuple_with_count(argc, argv); + + PyObject *py_env_add = py_str_array_to_tuple(env_add); + PyObject *py_result = NULL; + + if (py_argv == NULL || py_env_add == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, "Failed to create some of the arguments for the python call " + "(py_argv=%p py_env_add=%p)\n", (void *)py_argv, (void *)py_env_add); + goto cleanup; + } + + py_result = python_plugin_api_call(&plugin_ctx, CALLBACK_PYNAME(check_policy), + Py_BuildValue("(OO)", py_argv, py_env_add)); + CALLBACK_SET_ERROR(&plugin_ctx, errstr); + if (py_result == NULL) + goto cleanup; + + PyObject *py_rc = NULL, + *py_command_info_out = NULL, + *py_argv_out = NULL, + *py_user_env_out = NULL; + if (PyTuple_Check(py_result)) + { + if (!PyArg_ParseTuple(py_result, "O!|O!O!O!:python_plugin.check_policy", + &PyLong_Type, &py_rc, + &PyTuple_Type, &py_command_info_out, + &PyTuple_Type, &py_argv_out, + &PyTuple_Type, &py_user_env_out)) + { + rc = SUDO_RC_ERROR; + goto cleanup; + } + } else { + py_rc = py_result; + } + + if (py_command_info_out != NULL) + *command_info_out = py_str_array_from_tuple(py_command_info_out); + + if (py_argv_out != NULL) + *argv_out = py_str_array_from_tuple(py_argv_out); + + if (py_user_env_out != NULL) + *user_env_out = py_str_array_from_tuple(py_user_env_out); + + rc = python_plugin_rc_to_int(py_rc); + +cleanup: + if (PyErr_Occurred()) { + py_log_last_error(NULL); + rc = SUDO_RC_ERROR; + free(*command_info_out); + free(*argv_out); + free(*user_env_out); + *command_info_out = *argv_out = *user_env_out = NULL; + } + + Py_XDECREF(py_argv); + Py_XDECREF(py_env_add); + Py_XDECREF(py_result); + + if (rc == SUDO_RC_ACCEPT) + plugin_ctx.call_close = 1; + + debug_return_int(rc); +} + +static int +python_plugin_policy_list(int argc, char * const argv[], int verbose, const char *list_user, const char **errstr) +{ + debug_decl(python_plugin_policy_list, PYTHON_DEBUG_CALLBACKS); + + PyThreadState_Swap(plugin_ctx.py_interpreter); + + PyObject *py_argv = py_str_array_to_tuple_with_count(argc, argv); + if (py_argv == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, "%s: Failed to create argv argument for the python call\n", __func__); + debug_return_int(SUDO_RC_ERROR); + } + + int rc = python_plugin_api_rc_call(&plugin_ctx, CALLBACK_PYNAME(list), + Py_BuildValue("(Oiz)", py_argv, verbose, list_user)); + + Py_XDECREF(py_argv); + + CALLBACK_SET_ERROR(&plugin_ctx, errstr); + debug_return_int(rc); +} + +static int +python_plugin_policy_version(int verbose) +{ + debug_decl(python_plugin_policy_version, PYTHON_DEBUG_CALLBACKS); + + PyThreadState_Swap(plugin_ctx.py_interpreter); + + debug_return_int(python_plugin_show_version(&plugin_ctx, CALLBACK_PYNAME(show_version), + verbose, PY_POLICY_PLUGIN_VERSION, "policy")); +} + +int +python_plugin_policy_validate(const char **errstr) +{ + debug_decl(python_plugin_policy_validate, PYTHON_DEBUG_CALLBACKS); + PyThreadState_Swap(plugin_ctx.py_interpreter); + int rc = python_plugin_api_rc_call(&plugin_ctx, CALLBACK_PYNAME(validate), NULL); + CALLBACK_SET_ERROR(&plugin_ctx, errstr); + debug_return_int(rc); +} + +void +python_plugin_policy_invalidate(int remove) +{ + debug_decl(python_plugin_policy_invalidate, PYTHON_DEBUG_CALLBACKS); + PyThreadState_Swap(plugin_ctx.py_interpreter); + python_plugin_api_rc_call(&plugin_ctx, CALLBACK_PYNAME(invalidate), + Py_BuildValue("(i)", remove)); + debug_return; +} + +int +python_plugin_policy_init_session(struct passwd *pwd, char **user_env[], const char **errstr) +{ + debug_decl(python_plugin_policy_init_session, PYTHON_DEBUG_CALLBACKS); + int rc = SUDO_RC_ERROR; + PyThreadState_Swap(plugin_ctx.py_interpreter); + PyObject *py_pwd = NULL, *py_user_env = NULL, *py_result = NULL; + + py_pwd = py_from_passwd(pwd); + if (py_pwd == NULL) + goto cleanup; + + py_user_env = py_str_array_to_tuple(*user_env); + if (py_user_env == NULL) + goto cleanup; + + py_result = python_plugin_api_call(&plugin_ctx, CALLBACK_PYNAME(init_session), + Py_BuildValue("(OO)", py_pwd, py_user_env)); + CALLBACK_SET_ERROR(&plugin_ctx, errstr); + if (py_result == NULL) + goto cleanup; + + PyObject *py_user_env_out = NULL, *py_rc = NULL; + if (PyTuple_Check(py_result)) { + if (!PyArg_ParseTuple(py_result, "O!|O!:python_plugin.init_session", + &PyLong_Type, &py_rc, + &PyTuple_Type, &py_user_env_out)) { + goto cleanup; + } + } else { + py_rc = py_result; + } + + if (py_user_env_out != NULL) { + str_array_free(user_env); + *user_env = py_str_array_from_tuple(py_user_env_out); + if (*user_env == NULL) + goto cleanup; + } + + rc = python_plugin_rc_to_int(py_rc); + +cleanup: + Py_XDECREF(py_pwd); + Py_XDECREF(py_user_env); + Py_XDECREF(py_result); + + debug_return_int(rc); +} + +sudo_dso_public struct policy_plugin python_policy = { + SUDO_POLICY_PLUGIN, + SUDO_API_VERSION, + CALLBACK_CFUNC(open), + CALLBACK_CFUNC(close), + CALLBACK_CFUNC(version), + CALLBACK_CFUNC(check), + CALLBACK_CFUNC(list), + CALLBACK_CFUNC(validate), + CALLBACK_CFUNC(invalidate), + CALLBACK_CFUNC(init_session), + NULL, /* register_hooks */ + NULL, /* deregister_hooks */ + NULL /* event_alloc */ +}; diff --git a/plugins/python/regress/check_python_examples.c b/plugins/python/regress/check_python_examples.c new file mode 100644 index 0000000..ad35592 --- /dev/null +++ b/plugins/python/regress/check_python_examples.c @@ -0,0 +1,1599 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "testhelpers.h" + +#include "sudo_dso.h" + +#define DECL_PLUGIN(type, variable_name) \ + static struct type *variable_name = NULL; \ + static struct type variable_name ## _original + +#define RESTORE_PYTHON_PLUGIN(variable_name) \ + memcpy(variable_name, &(variable_name ## _original), sizeof(variable_name ## _original)) + +#define SAVE_PYTHON_PLUGIN(variable_name) \ + memcpy(&(variable_name ## _original), variable_name, sizeof(variable_name ## _original)) + +static const char *python_plugin_so_path = NULL; +static void *python_plugin_handle = NULL; +DECL_PLUGIN(io_plugin, python_io); +DECL_PLUGIN(policy_plugin, python_policy); +DECL_PLUGIN(approval_plugin, python_approval); +DECL_PLUGIN(audit_plugin, python_audit); +DECL_PLUGIN(sudoers_group_plugin, group_plugin); + +static struct passwd example_pwd; + +static int _init_symbols(void); +static int _unlink_symbols(void); + +void +create_plugin_options(const char *module_name, const char *class_name, const char *extra_option) +{ + char opt_module_path[PATH_MAX + 256]; + char opt_classname[PATH_MAX + 256]; + snprintf(opt_module_path, sizeof(opt_module_path), + "ModulePath=" SRC_DIR "/%s.py", module_name); + + snprintf(opt_classname, sizeof(opt_classname), "ClassName=%s", class_name); + + str_array_free(&data.plugin_options); + size_t count = 3 + (extra_option != NULL); + data.plugin_options = create_str_array(count, opt_module_path, + opt_classname, extra_option, NULL); +} + +void +create_io_plugin_options(const char *log_path) +{ + char opt_logpath[PATH_MAX + 16]; + snprintf(opt_logpath, sizeof(opt_logpath), "LogPath=%s", log_path); + create_plugin_options("example_io_plugin", "SudoIOPlugin", opt_logpath); +} + +void +create_debugging_plugin_options(void) +{ + create_plugin_options("example_debugging", "DebugDemoPlugin", NULL); +} + +void +create_audit_plugin_options(const char *extra_argument) +{ + create_plugin_options("example_audit_plugin", "SudoAuditPlugin", extra_argument); +} + +void +create_conversation_plugin_options(void) +{ + char opt_logpath[PATH_MAX + 16]; + snprintf(opt_logpath, sizeof(opt_logpath), "LogPath=%s", data.tmp_dir); + create_plugin_options("example_conversation", "ReasonLoggerIOPlugin", opt_logpath); +} + +void +create_policy_plugin_options(void) +{ + create_plugin_options("example_policy_plugin", "SudoPolicyPlugin", NULL); +} + +int +init(void) +{ + // always start each test from clean state + memset(&data, 0, sizeof(data)); + + memset(&example_pwd, 0, sizeof(example_pwd)); + example_pwd.pw_name = "pw_name"; + example_pwd.pw_passwd = "pw_passwd"; + example_pwd.pw_gecos = "pw_gecos"; + example_pwd.pw_shell ="pw_shell"; + example_pwd.pw_dir = "pw_dir"; + example_pwd.pw_uid = (uid_t)1001; + example_pwd.pw_gid = (gid_t)101; + + VERIFY_TRUE(asprintf(&data.tmp_dir, TEMP_PATH_TEMPLATE) >= 0); + VERIFY_NOT_NULL(mkdtemp(data.tmp_dir)); + + // by default we test in developer mode, so the python plugin can be loaded + sudo_conf_clear_paths(); + VERIFY_INT(sudo_conf_read(sudo_conf_developer_mode, SUDO_CONF_ALL), true); + VERIFY_TRUE(sudo_conf_developer_mode()); + + // some default values for the plugin open: + data.settings = create_str_array(1, NULL); + data.user_info = create_str_array(1, NULL); + data.command_info = create_str_array(1, NULL); + data.plugin_argc = 0; + data.plugin_argv = create_str_array(1, NULL); + data.user_env = create_str_array(1, NULL); + + VERIFY_TRUE(_init_symbols()); + return true; +} + +int +cleanup(int success) +{ + if (!success) { + printf("\nThe output of the plugin:\n%s", data.stdout_str); + printf("\nThe error output of the plugin:\n%s", data.stderr_str); + } + + VERIFY_TRUE(rmdir_recursive(data.tmp_dir)); + if (data.tmp_dir2) { + VERIFY_TRUE(rmdir_recursive(data.tmp_dir2)); + } + + free(data.tmp_dir); + free(data.tmp_dir2); + + str_array_free(&data.settings); + str_array_free(&data.user_info); + str_array_free(&data.command_info); + str_array_free(&data.plugin_argv); + str_array_free(&data.user_env); + str_array_free(&data.plugin_options); + + return true; +} + +int +check_example_io_plugin_version_display(int is_verbose) +{ + const char *errstr = NULL; + create_io_plugin_options(data.tmp_dir); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, data.user_env, + data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_INT(python_io->show_version(is_verbose), SUDO_RC_OK); + + python_io->close(0, 0); // this should not call the python plugin close as there was no command run invocation + + if (is_verbose) { + // Note: the exact python version is environment dependent + VERIFY_STR_CONTAINS(data.stdout_str, "Python interpreter version:"); + *strstr(data.stdout_str, "Python interpreter version:") = '\0'; + VERIFY_STDOUT(expected_path("check_example_io_plugin_version_display_full.stdout")); + } else { + VERIFY_STDOUT(expected_path("check_example_io_plugin_version_display.stdout")); + } + + VERIFY_STDERR(expected_path("check_example_io_plugin_version_display.stderr")); + VERIFY_FILE("sudo.log", expected_path("check_example_io_plugin_version_display.stored")); + + return true; +} + +int +check_example_io_plugin_command_log(void) +{ + const char *errstr = NULL; + create_io_plugin_options(data.tmp_dir); + + str_array_free(&data.plugin_argv); + data.plugin_argc = 2; + data.plugin_argv = create_str_array(3, "id", "--help", NULL); + + str_array_free(&data.command_info); + data.command_info = create_str_array(3, "command=/bin/id", "runas_uid=0", NULL); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_stdin("some standard input", strlen("some standard input"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_stdout("some standard output", strlen("some standard output"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_stderr("some standard error", strlen("some standard error"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_suspend(SIGTSTP, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_suspend(SIGCONT, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->change_winsize(200, 100, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_ttyin("some tty input", strlen("some tty input"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_ttyout("some tty output", strlen("some tty output"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_io->close(1, 0); // successful execution, command returned 1 + + VERIFY_STDOUT(expected_path("check_example_io_plugin_command_log.stdout")); + VERIFY_STDERR(expected_path("check_example_io_plugin_command_log.stderr")); + VERIFY_FILE("sudo.log", expected_path("check_example_io_plugin_command_log.stored")); + + return true; +} + +typedef struct io_plugin * (io_clone_func)(void); + +int +check_example_io_plugin_command_log_multiple(void) +{ + const char *errstr = NULL; + + // verify multiple python io plugin symbols are available + io_clone_func *python_io_clone = (io_clone_func *)sudo_dso_findsym(python_plugin_handle, "python_io_clone"); + VERIFY_PTR_NE(python_io_clone, NULL); + + struct io_plugin *python_io2 = NULL; + + for (int i = 0; i < 7; ++i) { + python_io2 = (*python_io_clone)(); + VERIFY_PTR_NE(python_io2, NULL); + VERIFY_PTR_NE(python_io2, python_io); + } + + // open the first plugin and let it log to tmp_dir + create_io_plugin_options(data.tmp_dir); + + str_array_free(&data.plugin_argv); + data.plugin_argc = 2; + data.plugin_argv = create_str_array(3, "id", "--help", NULL); + + str_array_free(&data.command_info); + data.command_info = create_str_array(3, "command=/bin/id", "runas_uid=0", NULL); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + // For verifying the error message of no more plugin. It should be displayed only once. + VERIFY_PTR((*python_io_clone)(), NULL); + VERIFY_PTR((*python_io_clone)(), NULL); + + // open the second plugin with another log directory + VERIFY_TRUE(asprintf(&data.tmp_dir2, TEMP_PATH_TEMPLATE) >= 0); + VERIFY_NOT_NULL(mkdtemp(data.tmp_dir2)); + create_io_plugin_options(data.tmp_dir2); + + str_array_free(&data.plugin_argv); + data.plugin_argc = 1; + data.plugin_argv = create_str_array(2, "whoami", NULL); + + str_array_free(&data.command_info); + data.command_info = create_str_array(3, "command=/bin/whoami", "runas_uid=1", NULL); + + VERIFY_INT(python_io2->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_INT(python_io->log_stdin("stdin for plugin 1", strlen("stdin for plugin 1"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io2->log_stdin("stdin for plugin 2", strlen("stdin for plugin 2"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_stdout("stdout for plugin 1", strlen("stdout for plugin 1"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io2->log_stdout("stdout for plugin 2", strlen("stdout for plugin 2"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_stderr("stderr for plugin 1", strlen("stderr for plugin 1"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io2->log_stderr("stderr for plugin 2", strlen("stderr for plugin 2"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_suspend(SIGTSTP, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io2->log_suspend(SIGSTOP, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_suspend(SIGCONT, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io2->log_suspend(SIGCONT, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->change_winsize(20, 10, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io2->change_winsize(30, 40, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_ttyin("tty input for plugin 1", strlen("tty input for plugin 1"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io2->log_ttyin("tty input for plugin 2", strlen("tty input for plugin 2"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->log_ttyout("tty output for plugin 1", strlen("tty output for plugin 1"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io2->log_ttyout("tty output for plugin 2", strlen("tty output for plugin 2"), &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_io->close(1, 0); // successful execution, command returned 1 + python_io2->close(2, 0); // command returned 2 + + VERIFY_STDOUT(expected_path("check_example_io_plugin_command_log_multiple.stdout")); + VERIFY_STDERR(expected_path("check_example_io_plugin_command_log_multiple.stderr")); + VERIFY_FILE("sudo.log", expected_path("check_example_io_plugin_command_log_multiple1.stored")); + VERIFY_TRUE(verify_file(data.tmp_dir2, "sudo.log", expected_path("check_example_io_plugin_command_log_multiple2.stored"))); + + return true; +} + +int +check_example_io_plugin_failed_to_start_command(void) +{ + const char *errstr = NULL; + + create_io_plugin_options(data.tmp_dir); + + str_array_free(&data.plugin_argv); + data.plugin_argc = 1; + data.plugin_argv = create_str_array(2, "cmd", NULL); + + str_array_free(&data.command_info); + data.command_info = create_str_array(3, "command=/usr/share/cmd", "runas_uid=0", NULL); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_io->close(0, EPERM); // execve returned with error + + VERIFY_STDOUT(expected_path("check_example_io_plugin_failed_to_start_command.stdout")); + VERIFY_STDERR(expected_path("check_example_io_plugin_failed_to_start_command.stderr")); + VERIFY_FILE("sudo.log", expected_path("check_example_io_plugin_failed_to_start_command.stored")); + + return true; +} + +int +check_example_io_plugin_fails_with_python_backtrace(void) +{ + const char *errstr = NULL; + + create_io_plugin_options("/some/not/writable/directory"); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_ERROR); + VERIFY_PTR(errstr, NULL); + + VERIFY_STDOUT(expected_path("check_example_io_plugin_fails_with_python_backtrace.stdout")); + VERIFY_STDERR(expected_path("check_example_io_plugin_fails_with_python_backtrace.stderr")); + + python_io->close(0, 0); + return true; +} + +int +check_io_plugin_reports_error(void) +{ + const char *errstr = NULL; + str_array_free(&data.plugin_options); + data.plugin_options = create_str_array( + 3, + "ModulePath=" SRC_DIR "/regress/plugin_errorstr.py", + "ClassName=ConstructErrorPlugin", + NULL + ); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_ERROR); + + VERIFY_STR(errstr, "Something wrong in plugin constructor"); + errstr = NULL; + + python_io->close(0, 0); + + str_array_free(&data.plugin_options); + data.plugin_options = create_str_array( + 3, + "ModulePath=" SRC_DIR "/regress/plugin_errorstr.py", + "ClassName=ErrorMsgPlugin", + NULL + ); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_INT(python_io->log_stdin("", 0, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in log_stdin"); + + errstr = (void *)13; + VERIFY_INT(python_io->log_stdout("", 0, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in log_stdout"); + + errstr = NULL; + VERIFY_INT(python_io->log_stderr("", 0, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in log_stderr"); + + errstr = NULL; + VERIFY_INT(python_io->log_ttyin("", 0, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in log_ttyin"); + + errstr = NULL; + VERIFY_INT(python_io->log_ttyout("", 0, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in log_ttyout"); + + errstr = NULL; + VERIFY_INT(python_io->log_suspend(SIGTSTP, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in log_suspend"); + + errstr = NULL; + VERIFY_INT(python_io->change_winsize(200, 100, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in change_winsize"); + + python_io->close(0, 0); + + VERIFY_STR(data.stderr_str, ""); + VERIFY_STR(data.stdout_str, ""); + return true; +} + +int +check_example_group_plugin(void) +{ + create_plugin_options("example_group_plugin", "SudoGroupPlugin", NULL); + + VERIFY_INT(group_plugin->init(GROUP_API_VERSION, fake_printf, data.plugin_options), SUDO_RC_OK); + + VERIFY_INT(group_plugin->query("test", "mygroup", NULL), SUDO_RC_OK); + VERIFY_INT(group_plugin->query("testuser2", "testgroup", NULL), SUDO_RC_OK); + VERIFY_INT(group_plugin->query("testuser2", "mygroup", NULL), SUDO_RC_REJECT); + VERIFY_INT(group_plugin->query("test", "testgroup", NULL), SUDO_RC_REJECT); + + group_plugin->cleanup(); + VERIFY_STR(data.stderr_str, ""); + VERIFY_STR(data.stdout_str, ""); + return true; +} + +const char * +create_debug_config(const char *debug_spec) +{ + char *result = NULL; + + static char config_path[PATH_MAX] = "/"; + snprintf(config_path, sizeof(config_path), "%s/sudo.conf", data.tmp_dir); + + char *content = NULL; + if (asprintf(&content, "Set developer_mode true\n" + "Debug %s %s/debug.log %s\n", + "python_plugin.so", data.tmp_dir, debug_spec) < 0) + { + printf("Failed to allocate string\n"); + goto cleanup; + } + + if (fwriteall(config_path, content) != true) { + printf("Failed to write '%s'\n", config_path); + goto cleanup; + } + + result = config_path; + +cleanup: + free(content); + + return result; +} + +int +check_example_group_plugin_is_able_to_debug(void) +{ + const char *config_path = create_debug_config("py_calls@diag"); + VERIFY_NOT_NULL(config_path); + VERIFY_INT(sudo_conf_read(config_path, SUDO_CONF_ALL), true); + + create_plugin_options("example_group_plugin", "SudoGroupPlugin", NULL); + + group_plugin->init(GROUP_API_VERSION, fake_printf, data.plugin_options); + + group_plugin->query("user", "group", &example_pwd); + + group_plugin->cleanup(); + + VERIFY_STR(data.stderr_str, ""); + VERIFY_STR(data.stdout_str, ""); + + VERIFY_LOG_LINES(expected_path("check_example_group_plugin_is_able_to_debug.log")); + + return true; +} + +int +check_plugin_unload(void) +{ + // You can call this test to avoid having a lot of subinterpreters + // (each plugin->open starts one, and only plugin unlink closes) + // It only verifies that python was shut down correctly. + VERIFY_TRUE(Py_IsInitialized()); + VERIFY_TRUE(_unlink_symbols()); + VERIFY_FALSE(Py_IsInitialized()); // python interpreter could be stopped + return true; +} + +int +check_example_debugging(const char *debug_spec) +{ + const char *errstr = NULL; + const char *config_path = create_debug_config(debug_spec); + VERIFY_NOT_NULL(config_path); + VERIFY_INT(sudo_conf_read(config_path, SUDO_CONF_ALL), true); + + create_debugging_plugin_options(); + + str_array_free(&data.settings); + char *debug_flags_setting = NULL; + VERIFY_TRUE(asprintf(&debug_flags_setting, "debug_flags=%s/debug.log %s", data.tmp_dir, debug_spec) >= 0); + + data.settings = create_str_array(3, debug_flags_setting, "plugin_path=python_plugin.so", NULL); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + python_io->close(0, 0); + + VERIFY_STR(data.stderr_str, ""); + VERIFY_STR(data.stdout_str, ""); + + VERIFY_LOG_LINES(expected_path("check_example_debugging_%s.log", debug_spec)); + + free(debug_flags_setting); + return true; +} + +int +check_loading_fails(const char *name) +{ + const char *errstr = NULL; + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_ERROR); + VERIFY_PTR(errstr, NULL); + python_io->close(0, 0); + + VERIFY_STDOUT(expected_path("check_loading_fails_%s.stdout", name)); + VERIFY_STDERR(expected_path("check_loading_fails_%s.stderr", name)); + + return true; +} + +int +check_loading_fails_with_missing_path(void) +{ + str_array_free(&data.plugin_options); + data.plugin_options = create_str_array(2, "ClassName=DebugDemoPlugin", NULL); + return check_loading_fails("missing_path"); +} + +int +check_loading_succeeds_with_missing_classname(void) +{ + str_array_free(&data.plugin_options); + data.plugin_options = create_str_array(2, "ModulePath=" SRC_DIR "/example_debugging.py", NULL); + + const char *errstr = NULL; + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_io->show_version(1), SUDO_RC_OK); + python_io->close(0, 0); + + VERIFY_STDOUT(expected_path("check_loading_succeeds_with_missing_classname.stdout")); + VERIFY_STR(data.stderr_str, ""); + + return true; +} + +int +check_loading_fails_with_missing_classname(void) +{ + str_array_free(&data.plugin_options); + data.plugin_options = create_str_array(2, "ModulePath=" SRC_DIR "/regress/plugin_errorstr.py", NULL); + return check_loading_fails("missing_classname"); +} + +int +check_loading_fails_with_wrong_classname(void) +{ + create_plugin_options("example_debugging", "MispelledPluginName", NULL); + return check_loading_fails("wrong_classname"); +} + +int +check_loading_fails_with_wrong_path(void) +{ + str_array_free(&data.plugin_options); + data.plugin_options = create_str_array(3, "ModulePath=/wrong_path.py", "ClassName=PluginName", NULL); + return check_loading_fails("wrong_path"); +} + +int +check_loading_fails_plugin_is_not_owned_by_root(void) +{ + sudo_conf_clear_paths(); + VERIFY_INT(sudo_conf_read(sudo_conf_normal_mode, SUDO_CONF_ALL), true); + + create_debugging_plugin_options(); + return check_loading_fails("not_owned_by_root"); +} + +int +check_example_conversation_plugin_reason_log(int simulate_suspend, const char *description) +{ + const char *errstr = NULL; + + create_conversation_plugin_options(); + + str_array_free(&data.plugin_argv); // have a command run + data.plugin_argc = 1; + data.plugin_argv = create_str_array(2, "/bin/whoami", NULL); + + data.conv_replies[0] = "my fake reason"; + data.conv_replies[1] = "my real secret reason"; + + sudo_conv_t conversation = simulate_suspend ? fake_conversation_with_suspend : fake_conversation; + + VERIFY_INT(python_io->open(SUDO_API_VERSION, conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + python_io->close(0, 0); + + VERIFY_STDOUT(expected_path("check_example_conversation_plugin_reason_log_%s.stdout", description)); + VERIFY_STDERR(expected_path("check_example_conversation_plugin_reason_log_%s.stderr", description)); + VERIFY_CONV(expected_path("check_example_conversation_plugin_reason_log_%s.conversation", description)); + VERIFY_FILE("sudo_reasons.txt", expected_path("check_example_conversation_plugin_reason_log_%s.stored", description)); + return true; +} + +int +check_example_conversation_plugin_user_interrupts(void) +{ + const char *errstr = NULL; + + create_conversation_plugin_options(); + + str_array_free(&data.plugin_argv); // have a command run + data.plugin_argc = 1; + data.plugin_argv = create_str_array(2, "/bin/whoami", NULL); + + data.conv_replies[0] = NULL; // this simulates user interrupt for the first question + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_REJECT); + VERIFY_PTR(errstr, NULL); + python_io->close(0, 0); + + VERIFY_STDOUT(expected_path("check_example_conversation_plugin_user_interrupts.stdout")); + VERIFY_STDERR(expected_path("check_example_conversation_plugin_user_interrupts.stderr")); + VERIFY_CONV(expected_path("check_example_conversation_plugin_user_interrupts.conversation")); + return true; +} + +int +check_example_policy_plugin_version_display(int is_verbose) +{ + const char *errstr = NULL; + + create_policy_plugin_options(); + + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + VERIFY_INT(python_policy->show_version(is_verbose), SUDO_RC_OK); + + python_policy->close(0, 0); // this should not call the python plugin close as there was no command run invocation + + if (is_verbose) { + // Note: the exact python version is environment dependent + VERIFY_STR_CONTAINS(data.stdout_str, "Python interpreter version:"); + *strstr(data.stdout_str, "Python interpreter version:") = '\0'; + VERIFY_STDOUT(expected_path("check_example_policy_plugin_version_display_full.stdout")); + } else { + VERIFY_STDOUT(expected_path("check_example_policy_plugin_version_display.stdout")); + } + + VERIFY_STDERR(expected_path("check_example_policy_plugin_version_display.stderr")); + + return true; +} + +int +check_example_policy_plugin_accepted_execution(void) +{ + const char *errstr = NULL; + + create_policy_plugin_options(); + + str_array_free(&data.plugin_argv); + data.plugin_argc = 2; + data.plugin_argv = create_str_array(3, "/bin/whoami", "--help", NULL); + + str_array_free(&data.user_env); + data.user_env = create_str_array(3, "USER_ENV1=VALUE1", "USER_ENV2=value2", NULL); + + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + char **env_add = create_str_array(3, "REQUESTED_ENV1=VALUE1", "REQUESTED_ENV2=value2", NULL); + + char **argv_out, **user_env_out, **command_info_out; // free to contain garbage + + VERIFY_INT(python_policy->check_policy(data.plugin_argc, data.plugin_argv, env_add, + &command_info_out, &argv_out, &user_env_out, &errstr), + SUDO_RC_ACCEPT); + VERIFY_PTR(errstr, NULL); + + VERIFY_STR_SET(command_info_out, 4, "command=/bin/whoami", "runas_uid=0", "runas_gid=0", NULL); + VERIFY_STR_SET(user_env_out, 5, "USER_ENV1=VALUE1", "USER_ENV2=value2", + "REQUESTED_ENV1=VALUE1", "REQUESTED_ENV2=value2", NULL); + VERIFY_STR_SET(argv_out, 3, "/bin/whoami", "--help", NULL); + + VERIFY_INT(python_policy->init_session(&example_pwd, &user_env_out, &errstr), SUDO_RC_ACCEPT); + VERIFY_PTR(errstr, NULL); + + // init session is able to modify the user env: + VERIFY_STR_SET(user_env_out, 6, "USER_ENV1=VALUE1", "USER_ENV2=value2", + "REQUESTED_ENV1=VALUE1", "REQUESTED_ENV2=value2", "PLUGIN_EXAMPLE_ENV=1", NULL); + + python_policy->close(3, 0); // successful execution returned exit code 3 + + VERIFY_STDOUT(expected_path("check_example_policy_plugin_accepted_execution.stdout")); + VERIFY_STDERR(expected_path("check_example_policy_plugin_accepted_execution.stderr")); + + str_array_free(&env_add); + str_array_free(&user_env_out); + str_array_free(&command_info_out); + str_array_free(&argv_out); + return true; +} + +int +check_example_policy_plugin_failed_execution(void) +{ + const char *errstr = NULL; + + create_policy_plugin_options(); + + str_array_free(&data.plugin_argv); + data.plugin_argc = 2; + data.plugin_argv = create_str_array(3, "/bin/id", "--help", NULL); + + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + char **argv_out, **user_env_out, **command_info_out; // free to contain garbage + + VERIFY_INT(python_policy->check_policy(data.plugin_argc, data.plugin_argv, NULL, + &command_info_out, &argv_out, &user_env_out, &errstr), + SUDO_RC_ACCEPT); + VERIFY_PTR(errstr, NULL); + + // pwd is unset (user is not part of /etc/passwd) + VERIFY_INT(python_policy->init_session(NULL, &user_env_out, &errstr), SUDO_RC_ACCEPT); + VERIFY_PTR(errstr, NULL); + + python_policy->close(12345, ENOENT); // failed to execute + + VERIFY_STDOUT(expected_path("check_example_policy_plugin_failed_execution.stdout")); + VERIFY_STDERR(expected_path("check_example_policy_plugin_failed_execution.stderr")); + + str_array_free(&user_env_out); + str_array_free(&command_info_out); + str_array_free(&argv_out); + return true; +} + +int +check_example_policy_plugin_denied_execution(void) +{ + const char *errstr = NULL; + + create_policy_plugin_options(); + + str_array_free(&data.plugin_argv); + data.plugin_argc = 1; + data.plugin_argv = create_str_array(2, "/bin/passwd", NULL); + + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + char **argv_out, **user_env_out, **command_info_out; // free to contain garbage + + VERIFY_INT(python_policy->check_policy(data.plugin_argc, data.plugin_argv, NULL, + &command_info_out, &argv_out, &user_env_out, &errstr), + SUDO_RC_REJECT); + VERIFY_PTR(errstr, NULL); + + VERIFY_PTR(command_info_out, NULL); + VERIFY_PTR(argv_out, NULL); + VERIFY_PTR(user_env_out, NULL); + + python_policy->close(0, 0); // there was no execution + + VERIFY_STDOUT(expected_path("check_example_policy_plugin_denied_execution.stdout")); + VERIFY_STDERR(expected_path("check_example_policy_plugin_denied_execution.stderr")); + + return true; +} + +int +check_example_policy_plugin_list(void) +{ + const char *errstr = NULL; + + create_policy_plugin_options(); + + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + snprintf_append(data.stdout_str, MAX_OUTPUT, "-- minimal --\n"); + VERIFY_INT(python_policy->list(data.plugin_argc, data.plugin_argv, false, NULL, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + snprintf_append(data.stdout_str, MAX_OUTPUT, "\n-- minimal (verbose) --\n"); + VERIFY_INT(python_policy->list(data.plugin_argc, data.plugin_argv, true, NULL, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + snprintf_append(data.stdout_str, MAX_OUTPUT, "\n-- with user --\n"); + VERIFY_INT(python_policy->list(data.plugin_argc, data.plugin_argv, false, "testuser", &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + snprintf_append(data.stdout_str, MAX_OUTPUT, "\n-- with user (verbose) --\n"); + VERIFY_INT(python_policy->list(data.plugin_argc, data.plugin_argv, true, "testuser", &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + snprintf_append(data.stdout_str, MAX_OUTPUT, "\n-- with allowed program --\n"); + str_array_free(&data.plugin_argv); + data.plugin_argc = 3; + data.plugin_argv = create_str_array(4, "/bin/id", "some", "arguments", NULL); + VERIFY_INT(python_policy->list(data.plugin_argc, data.plugin_argv, false, NULL, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + snprintf_append(data.stdout_str, MAX_OUTPUT, "\n-- with allowed program (verbose) --\n"); + VERIFY_INT(python_policy->list(data.plugin_argc, data.plugin_argv, true, NULL, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + snprintf_append(data.stdout_str, MAX_OUTPUT, "\n-- with denied program --\n"); + str_array_free(&data.plugin_argv); + data.plugin_argc = 1; + data.plugin_argv = create_str_array(2, "/bin/passwd", NULL); + VERIFY_INT(python_policy->list(data.plugin_argc, data.plugin_argv, false, NULL, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + snprintf_append(data.stdout_str, MAX_OUTPUT, "\n-- with denied program (verbose) --\n"); + VERIFY_INT(python_policy->list(data.plugin_argc, data.plugin_argv, true, NULL, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_policy->close(0, 0); // there was no execution + + VERIFY_STDOUT(expected_path("check_example_policy_plugin_list.stdout")); + VERIFY_STDERR(expected_path("check_example_policy_plugin_list.stderr")); + + return true; +} + +int +check_example_policy_plugin_validate_invalidate(void) +{ + const char *errstr = NULL; + + // the plugin does not do any meaningful for these, so using log to validate instead + const char *config_path = create_debug_config("py_calls@diag"); + VERIFY_NOT_NULL(config_path); + VERIFY_INT(sudo_conf_read(config_path, SUDO_CONF_ALL), true); + + create_policy_plugin_options(); + + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_INT(python_policy->validate(&errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_policy->invalidate(true); + python_policy->invalidate(false); + + python_policy->close(0, 0); // no command execution + + VERIFY_LOG_LINES(expected_path("check_example_policy_plugin_validate_invalidate.log")); + VERIFY_STR(data.stderr_str, ""); + VERIFY_STR(data.stdout_str, ""); + return true; +} + +int +check_policy_plugin_callbacks_are_optional(void) +{ + const char *errstr = NULL; + + create_debugging_plugin_options(); + + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_PTR(python_policy->list, NULL); + VERIFY_PTR(python_policy->validate, NULL); + VERIFY_PTR(python_policy->invalidate, NULL); + VERIFY_PTR_NE(python_policy->check_policy, NULL); // (not optional) + VERIFY_PTR(python_policy->init_session, NULL); + + // show_version always displays the plugin, but it is optional in the python layer + VERIFY_PTR_NE(python_policy->show_version, NULL); + VERIFY_INT(python_policy->show_version(1), SUDO_RC_OK); + + python_policy->close(0, 0); + return true; +} + +int +check_policy_plugin_reports_error(void) +{ + const char *errstr = NULL; + str_array_free(&data.plugin_options); + data.plugin_options = create_str_array( + 3, + "ModulePath=" SRC_DIR "/regress/plugin_errorstr.py", + "ClassName=ConstructErrorPlugin", + NULL + ); + + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in plugin constructor"); + errstr = NULL; + + python_policy->close(0, 0); + + str_array_free(&data.plugin_options); + data.plugin_options = create_str_array( + 3, + "ModulePath=" SRC_DIR "/regress/plugin_errorstr.py", + "ClassName=ErrorMsgPlugin", + NULL + ); + + data.plugin_argc = 1; + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(2, "id", NULL); + + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + char **command_info_out = NULL; + char **argv_out = NULL; + char **user_env_out = NULL; + + VERIFY_INT(python_policy->list(data.plugin_argc, data.plugin_argv, true, NULL, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in list"); + + errstr = NULL; + VERIFY_INT(python_policy->validate(&errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in validate"); + + errstr = NULL; + VERIFY_INT(python_policy->check_policy(data.plugin_argc, data.plugin_argv, data.user_env, + &command_info_out, &argv_out, &user_env_out, &errstr), + SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in check_policy"); + + errstr = NULL; + VERIFY_INT(python_policy->init_session(&example_pwd, &user_env_out, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in init_session"); + + python_policy->close(0, 0); + + VERIFY_STR(data.stderr_str, ""); + VERIFY_STR(data.stdout_str, ""); + return true; +} + +int +check_io_plugin_callbacks_are_optional(void) +{ + const char *errstr = NULL; + + create_debugging_plugin_options(); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_PTR(python_io->log_stdin, NULL); + VERIFY_PTR(python_io->log_stdout, NULL); + VERIFY_PTR(python_io->log_stderr, NULL); + VERIFY_PTR(python_io->log_ttyin, NULL); + VERIFY_PTR(python_io->log_ttyout, NULL); + VERIFY_PTR(python_io->change_winsize, NULL); + + // show_version always displays the plugin, but it is optional in the python layer + VERIFY_PTR_NE(python_io->show_version, NULL); + VERIFY_INT(python_io->show_version(1), SUDO_RC_OK); + + python_io->close(0, 0); + return true; +} + +int +check_python_plugins_do_not_affect_each_other(void) +{ + const char *errstr = NULL; + + // We test here that one plugin is not able to effect the environment of another + // This is important so they do not ruin or depend on each other's state. + create_plugin_options("regress/plugin_conflict", "ConflictPlugin", "Path=path_for_first_plugin"); + + VERIFY_INT(python_io->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.command_info, data.plugin_argc, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + create_plugin_options("regress/plugin_conflict", "ConflictPlugin", "Path=path_for_second_plugin"); + VERIFY_INT(python_policy->open(SUDO_API_VERSION, fake_conversation, fake_printf, data.settings, + data.user_info, data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_io->close(0, 0); + python_policy->close(0, 0); + + VERIFY_STDOUT(expected_path("check_python_plugins_do_not_affect_each_other.stdout")); + VERIFY_STR(data.stderr_str, ""); + return true; +} + +int +check_example_audit_plugin_receives_accept(void) +{ + create_audit_plugin_options(""); + const char *errstr = NULL; + + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(6, "sudo", "-u", "user", "id", "--help", NULL); + + str_array_free(&data.user_env); + data.user_env = create_str_array(3, "KEY1=VALUE1", "KEY2=VALUE2", NULL); + + str_array_free(&data.user_info); + data.user_info = create_str_array(3, "user=testuser1", "uid=123", NULL); + + VERIFY_INT(python_audit->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 3, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + str_array_free(&data.command_info); + data.command_info = create_str_array(2, "command=/sbin/id", NULL); + + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(3, "id", "--help", NULL); + + VERIFY_INT(python_audit->accept("accepter plugin name", SUDO_POLICY_PLUGIN, + data.command_info, data.plugin_argv, + data.user_env, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_audit->close(SUDO_PLUGIN_WAIT_STATUS, W_EXITCODE(2, 0)); // process exited with 2 + + VERIFY_STDOUT(expected_path("check_example_audit_plugin_receives_accept.stdout")); + VERIFY_STR(data.stderr_str, ""); + + return true; +} + +int +check_example_audit_plugin_receives_reject(void) +{ + create_audit_plugin_options(NULL); + const char *errstr = NULL; + + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(3, "sudo", "passwd", NULL); + + str_array_free(&data.user_info); + data.user_info = create_str_array(3, "user=root", "uid=0", NULL); + + VERIFY_INT(python_audit->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 1, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_INT(python_audit->reject("rejecter plugin name", SUDO_IO_PLUGIN, + "Rejected just because!", data.command_info, + &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_audit->close(SUDO_PLUGIN_NO_STATUS, 0); // program was not run + + VERIFY_STDOUT(expected_path("check_example_audit_plugin_receives_reject.stdout")); + VERIFY_STR(data.stderr_str, ""); + + return true; +} + +int +check_example_audit_plugin_receives_error(void) +{ + create_audit_plugin_options(""); + const char *errstr = NULL; + + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(5, "sudo", "-u", "user", "id", NULL); + + VERIFY_INT(python_audit->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 3, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + str_array_free(&data.command_info); + data.command_info = create_str_array(2, "command=/sbin/id", NULL); + + VERIFY_INT(python_audit->error("errorer plugin name", SUDO_AUDIT_PLUGIN, + "Some error has happened", data.command_info, + &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_audit->close(SUDO_PLUGIN_SUDO_ERROR, 222); + + VERIFY_STDOUT(expected_path("check_example_audit_plugin_receives_error.stdout")); + VERIFY_STR(data.stderr_str, ""); + + return true; +} + +typedef struct audit_plugin * (audit_clone_func)(void); + +int +check_example_audit_plugin_workflow_multiple(void) +{ + // verify multiple python audit plugins are available + audit_clone_func *python_audit_clone = (audit_clone_func *)sudo_dso_findsym( + python_plugin_handle, "python_audit_clone"); + VERIFY_PTR_NE(python_audit_clone, NULL); + + struct audit_plugin *python_audit2 = NULL; + + for (int i = 0; i < 7; ++i) { + python_audit2 = (*python_audit_clone)(); + VERIFY_PTR_NE(python_audit2, NULL); + VERIFY_PTR_NE(python_audit2, python_audit); + } + + const char *errstr = NULL; + + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(6, "sudo", "-u", "user", "id", "--help", NULL); + + str_array_free(&data.user_env); + data.user_env = create_str_array(3, "KEY1=VALUE1", "KEY2=VALUE2", NULL); + + str_array_free(&data.user_info); + data.user_info = create_str_array(3, "user=default", "uid=1000", NULL); + + create_audit_plugin_options("Id=1"); + VERIFY_INT(python_audit->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 3, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + // For verifying the error message of no more plugin. It should be displayed only once. + VERIFY_PTR((*python_audit_clone)(), NULL); + VERIFY_PTR((*python_audit_clone)(), NULL); + + create_audit_plugin_options("Id=2"); + VERIFY_INT(python_audit2->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 3, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + str_array_free(&data.command_info); + data.command_info = create_str_array(2, "command=/sbin/id", NULL); + + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(3, "id", "--help", NULL); + + VERIFY_INT(python_audit->accept("accepter plugin name", SUDO_POLICY_PLUGIN, + data.command_info, data.plugin_argv, + data.user_env, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_INT(python_audit2->accept("accepter plugin name", SUDO_POLICY_PLUGIN, + data.command_info, data.plugin_argv, + data.user_env, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_audit->close(SUDO_PLUGIN_WAIT_STATUS, W_EXITCODE(0, 11)); // process got signal 11 + python_audit2->close(SUDO_PLUGIN_WAIT_STATUS, W_EXITCODE(0, 11)); + + VERIFY_STDOUT(expected_path("check_example_audit_plugin_workflow_multiple.stdout")); + VERIFY_STDERR(expected_path("check_example_audit_plugin_workflow_multiple.stderr")); + + return true; +} + +int +check_example_audit_plugin_version_display(void) +{ + create_audit_plugin_options(NULL); + const char *errstr = NULL; + + str_array_free(&data.user_info); + data.user_info = create_str_array(3, "user=root", "uid=0", NULL); + + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(3, "sudo", "-V", NULL); + + VERIFY_INT(python_audit->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 2, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_INT(python_audit->show_version(false), SUDO_RC_OK); + VERIFY_INT(python_audit->show_version(true), SUDO_RC_OK); + + python_audit->close(SUDO_PLUGIN_SUDO_ERROR, 222); + + VERIFY_STDOUT(expected_path("check_example_audit_plugin_version_display.stdout")); + VERIFY_STR(data.stderr_str, ""); + + return true; +} + +int +check_audit_plugin_callbacks_are_optional(void) +{ + const char *errstr = NULL; + + create_debugging_plugin_options(); + + VERIFY_INT(python_audit->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 2, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_PTR(python_audit->accept, NULL); + VERIFY_PTR(python_audit->reject, NULL); + VERIFY_PTR(python_audit->error, NULL); + + // show_version always displays the plugin, but it is optional in the python layer + VERIFY_PTR_NE(python_audit->show_version, NULL); + VERIFY_INT(python_audit->show_version(1), SUDO_RC_OK); + + python_audit->close(SUDO_PLUGIN_NO_STATUS, 0); + return true; +} + +int +check_audit_plugin_reports_error(void) +{ + const char *errstr = NULL; + create_plugin_options("regress/plugin_errorstr", "ConstructErrorPlugin", NULL); + + VERIFY_INT(python_audit->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 0, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_ERROR); + + VERIFY_STR(errstr, "Something wrong in plugin constructor"); + errstr = NULL; + + python_audit->close(SUDO_PLUGIN_NO_STATUS, 0); + + create_plugin_options("regress/plugin_errorstr", "ErrorMsgPlugin", NULL); + + VERIFY_INT(python_audit->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 0, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in open"); + + errstr = NULL; + VERIFY_INT(python_audit->accept("plugin name", SUDO_POLICY_PLUGIN, + data.command_info, data.plugin_argv, + data.user_env, &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in accept"); + + errstr = NULL; + VERIFY_INT(python_audit->reject("plugin name", SUDO_POLICY_PLUGIN, + "audit message", data.command_info, + &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in reject"); + + errstr = NULL; + VERIFY_INT(python_audit->error("plugin name", SUDO_POLICY_PLUGIN, + "audit message", data.command_info, + &errstr), SUDO_RC_ERROR); + VERIFY_STR(errstr, "Something wrong in error"); + + python_audit->close(SUDO_PLUGIN_NO_STATUS, 0); + + VERIFY_STR(data.stderr_str, ""); + VERIFY_STR(data.stdout_str, ""); + return true; +} + +static int +check_example_approval_plugin(const char *date_str, const char *expected_error) +{ + const char *errstr = NULL; + + create_plugin_options("example_approval_plugin", "BusinessHoursApprovalPlugin", NULL); + + VERIFY_INT(python_approval->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 0, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + + VERIFY_TRUE(mock_python_datetime_now("example_approval_plugin", date_str)); + + int expected_rc = (expected_error == NULL) ? SUDO_RC_ACCEPT : SUDO_RC_REJECT; + + VERIFY_INT(python_approval->check(data.command_info, data.plugin_argv, data.user_env, &errstr), + expected_rc); + + if (expected_error == NULL) { + VERIFY_PTR(errstr, NULL); + VERIFY_STR(data.stdout_str, ""); + } else { + VERIFY_STR(errstr, expected_error); + VERIFY_STR_CONTAINS(data.stdout_str, expected_error); // (ends with \n) + } + VERIFY_STR(data.stderr_str, ""); + + python_approval->close(); + + return true; +} + +typedef struct approval_plugin * (approval_clone_func)(void); + +static int +check_multiple_approval_plugin_and_arguments(void) +{ + // verify multiple python approval plugins are available + approval_clone_func *python_approval_clone = (approval_clone_func *)sudo_dso_findsym( + python_plugin_handle, "python_approval_clone"); + VERIFY_PTR_NE(python_approval_clone, NULL); + + struct approval_plugin *python_approval2 = NULL; + + for (int i = 0; i < 7; ++i) { + python_approval2 = (*python_approval_clone)(); + VERIFY_PTR_NE(python_approval2, NULL); + VERIFY_PTR_NE(python_approval2, python_approval); + } + + const char *errstr = NULL; + create_plugin_options("regress/plugin_approval_test", "ApprovalTestPlugin", "Id=1"); + + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(6, "sudo", "-u", "user", "whoami", "--help", NULL); + + str_array_free(&data.user_env); + data.user_env = create_str_array(3, "USER_ENV1=VALUE1", "USER_ENV2=value2", NULL); + + str_array_free(&data.user_info); + data.user_info = create_str_array(3, "INFO1=VALUE1", "info2=value2", NULL); + + str_array_free(&data.settings); + data.settings = create_str_array(3, "SETTING1=VALUE1", "setting2=value2", NULL); + + VERIFY_INT(python_approval->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 3, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + // For verifying the error message of no more plugin. It should be displayed only once. + VERIFY_PTR((*python_approval_clone)(), NULL); + VERIFY_PTR((*python_approval_clone)(), NULL); + + create_plugin_options("regress/plugin_approval_test", "ApprovalTestPlugin", "Id=2"); + VERIFY_INT(python_approval2->open(SUDO_API_VERSION, fake_conversation, fake_printf, + data.settings, data.user_info, 3, data.plugin_argv, + data.user_env, data.plugin_options, &errstr), SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_INT(python_approval->show_version(false), SUDO_RC_OK); + VERIFY_INT(python_approval2->show_version(true), SUDO_RC_OK); + + str_array_free(&data.command_info); + data.command_info = create_str_array(3, "CMDINFO1=value1", "CMDINFO2=VALUE2", NULL); + + str_array_free(&data.plugin_argv); + data.plugin_argv = create_str_array(3, "whoami", "--help", NULL); + + VERIFY_INT(python_approval->check(data.command_info, data.plugin_argv, data.user_env, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + VERIFY_INT(python_approval2->check(data.command_info, data.plugin_argv, data.user_env, &errstr), + SUDO_RC_OK); + VERIFY_PTR(errstr, NULL); + + python_approval->close(); + python_approval2->close(); + + VERIFY_STDOUT(expected_path("check_multiple_approval_plugin_and_arguments.stdout")); + VERIFY_STDERR(expected_path("check_multiple_approval_plugin_and_arguments.stderr")); + + return true; +} + + +static int +_init_symbols(void) +{ + if (python_plugin_handle != NULL) { + // symbols are already loaded, we just restore + RESTORE_PYTHON_PLUGIN(python_io); + RESTORE_PYTHON_PLUGIN(python_policy); + RESTORE_PYTHON_PLUGIN(python_approval); + RESTORE_PYTHON_PLUGIN(python_audit); + RESTORE_PYTHON_PLUGIN(group_plugin); + return true; + } + + // we load the symbols + python_plugin_handle = sudo_dso_load(python_plugin_so_path, SUDO_DSO_LAZY|SUDO_DSO_GLOBAL); + VERIFY_PTR_NE(python_plugin_handle, NULL); + + python_io = sudo_dso_findsym(python_plugin_handle, "python_io"); + VERIFY_PTR_NE(python_io, NULL); + + group_plugin = sudo_dso_findsym(python_plugin_handle, "group_plugin"); + VERIFY_PTR_NE(group_plugin, NULL); + + python_policy = sudo_dso_findsym(python_plugin_handle, "python_policy"); + VERIFY_PTR_NE(python_policy, NULL); + + python_audit = sudo_dso_findsym(python_plugin_handle, "python_audit"); + VERIFY_PTR_NE(python_audit, NULL); + + python_approval = sudo_dso_findsym(python_plugin_handle, "python_approval"); + VERIFY_PTR_NE(python_approval, NULL); + + SAVE_PYTHON_PLUGIN(python_io); + SAVE_PYTHON_PLUGIN(python_policy); + SAVE_PYTHON_PLUGIN(python_approval); + SAVE_PYTHON_PLUGIN(python_audit); + SAVE_PYTHON_PLUGIN(group_plugin); + + return true; +} + +static int +_unlink_symbols(void) +{ + python_io = NULL; + group_plugin = NULL; + python_policy = NULL; + python_approval = NULL; + python_audit = NULL; + VERIFY_INT(sudo_dso_unload(python_plugin_handle), 0); + python_plugin_handle = NULL; + VERIFY_FALSE(Py_IsInitialized()); + return true; +} + +int +main(int argc, char *argv[]) +{ + int errors = 0; + + if (argc != 2) { + printf("Please specify the python_plugin.so as argument!\n"); + return EXIT_FAILURE; + } + python_plugin_so_path = argv[1]; + + RUN_TEST(check_example_io_plugin_version_display(true)); + RUN_TEST(check_example_io_plugin_version_display(false)); + RUN_TEST(check_example_io_plugin_command_log()); + RUN_TEST(check_example_io_plugin_command_log_multiple()); + RUN_TEST(check_example_io_plugin_failed_to_start_command()); + RUN_TEST(check_example_io_plugin_fails_with_python_backtrace()); + RUN_TEST(check_io_plugin_callbacks_are_optional()); + RUN_TEST(check_io_plugin_reports_error()); + RUN_TEST(check_plugin_unload()); + + RUN_TEST(check_example_group_plugin()); + RUN_TEST(check_example_group_plugin_is_able_to_debug()); + RUN_TEST(check_plugin_unload()); + + RUN_TEST(check_loading_fails_with_missing_path()); + RUN_TEST(check_loading_succeeds_with_missing_classname()); + RUN_TEST(check_loading_fails_with_missing_classname()); + RUN_TEST(check_loading_fails_with_wrong_classname()); + RUN_TEST(check_loading_fails_with_wrong_path()); + RUN_TEST(check_loading_fails_plugin_is_not_owned_by_root()); + RUN_TEST(check_plugin_unload()); + + RUN_TEST(check_example_conversation_plugin_reason_log(false, "without_suspend")); + RUN_TEST(check_example_conversation_plugin_reason_log(true, "with_suspend")); + RUN_TEST(check_example_conversation_plugin_user_interrupts()); + RUN_TEST(check_plugin_unload()); + + RUN_TEST(check_example_policy_plugin_version_display(true)); + RUN_TEST(check_example_policy_plugin_version_display(false)); + RUN_TEST(check_example_policy_plugin_accepted_execution()); + RUN_TEST(check_example_policy_plugin_failed_execution()); + RUN_TEST(check_example_policy_plugin_denied_execution()); + RUN_TEST(check_example_policy_plugin_list()); + RUN_TEST(check_example_policy_plugin_validate_invalidate()); + RUN_TEST(check_policy_plugin_callbacks_are_optional()); + RUN_TEST(check_policy_plugin_reports_error()); + RUN_TEST(check_plugin_unload()); + + RUN_TEST(check_example_audit_plugin_receives_accept()); + RUN_TEST(check_example_audit_plugin_receives_reject()); + RUN_TEST(check_example_audit_plugin_receives_error()); + RUN_TEST(check_example_audit_plugin_workflow_multiple()); + RUN_TEST(check_example_audit_plugin_version_display()); + RUN_TEST(check_audit_plugin_callbacks_are_optional()); + RUN_TEST(check_audit_plugin_reports_error()); + RUN_TEST(check_plugin_unload()); + + // Monday, too early + RUN_TEST(check_example_approval_plugin( + "2020-02-10T07:55:23", "That is not allowed outside the business hours!")); + // Monday, good time + RUN_TEST(check_example_approval_plugin("2020-02-10T08:05:23", NULL)); + // Friday, good time + RUN_TEST(check_example_approval_plugin("2020-02-14T17:59:23", NULL)); + // Friday, too late + RUN_TEST(check_example_approval_plugin( + "2020-02-10T18:05:23", "That is not allowed outside the business hours!")); + // Saturday + RUN_TEST(check_example_approval_plugin( + "2020-02-15T08:05:23", "That is not allowed on the weekend!")); + RUN_TEST(check_multiple_approval_plugin_and_arguments()); + + RUN_TEST(check_python_plugins_do_not_affect_each_other()); + RUN_TEST(check_plugin_unload()); + + RUN_TEST(check_example_debugging("plugin@err")); + RUN_TEST(check_example_debugging("plugin@info")); + RUN_TEST(check_example_debugging("load@diag")); + RUN_TEST(check_example_debugging("sudo_cb@info")); + RUN_TEST(check_example_debugging("c_calls@diag")); + RUN_TEST(check_example_debugging("c_calls@info")); + RUN_TEST(check_example_debugging("py_calls@diag")); + RUN_TEST(check_example_debugging("py_calls@info")); + RUN_TEST(check_example_debugging("plugin@err")); + RUN_TEST(check_plugin_unload()); + + return errors; +} diff --git a/plugins/python/regress/iohelpers.c b/plugins/python/regress/iohelpers.c new file mode 100644 index 0000000..9c71dfc --- /dev/null +++ b/plugins/python/regress/iohelpers.c @@ -0,0 +1,175 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "iohelpers.h" + +int +rmdir_recursive(const char *path) +{ + char *cmd = NULL; + int success = false; + + if (asprintf(&cmd, "rm -rf \"%s\"", path) < 0) + return false; + + if (system(cmd) == 0) + success = true; + + free(cmd); + + return success; +} + +int +fwriteall(const char *file_path, const char *string) +{ + int success = false; + + FILE *file = fopen(file_path, "w+"); + if (file == NULL) + goto cleanup; + + size_t size = strlen(string); + if (fwrite(string, 1, size, file) < size) { + goto cleanup; + } + + success = true; + +cleanup: + if (file) + fclose(file); + + return success; +} + +int +freadall(const char *file_path, char *output, size_t max_len) +{ + int rc = false; + FILE *file = fopen(file_path, "rb"); + if (file == NULL) { + printf("Failed to open file '%s'\n", file_path); + goto cleanup; + } + + size_t len = fread(output, 1, max_len - 1, file); + output[len] = '\0'; + + if (ferror(file) != 0) { + printf("Failed to read file '%s' (Error %d)\n", file_path, ferror(file)); + goto cleanup; + } + + if (!feof(file)) { + printf("File '%s' was bigger than allocated buffer %zu", file_path, max_len); + goto cleanup; + } + + rc = true; + +cleanup: + if (file) + fclose(file); + + return rc; +} + +int +vsnprintf_append(char *output, size_t max_output_len, const char *fmt, va_list args) +{ + va_list args2; + va_copy(args2, args); + + size_t output_len = strlen(output); + int rc = vsnprintf(output + output_len, max_output_len - output_len, fmt, args2); + + va_end(args2); + return rc; +} + +int +snprintf_append(char *output, size_t max_output_len, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + int rc = vsnprintf_append(output, max_output_len, fmt, args); + va_end(args); + return rc; +} + +int +str_array_count(char **str_array) +{ + int result = 0; + for (; str_array[result] != NULL; ++result) {} + return result; +} + +void +str_array_snprint(char *out_str, size_t max_len, char **str_array, int array_len) +{ + if (array_len < 0) + array_len = str_array_count(str_array); + + for (int pos = 0; pos < array_len; ++pos) { + snprintf_append(out_str, max_len, "%s%s", pos > 0 ? ", " : "", str_array[pos]); + } +} + +char * +str_replaced(const char *source, size_t dest_len, const char *old, const char *new) +{ + char *result = calloc(1, dest_len); + char *dest = result; + char *pos = NULL; + size_t old_len = strlen(old); + + while ((pos = strstr(source, old)) != NULL) { + size_t len = snprintf(dest, dest_len, + "%.*s%s", (int)(pos - source), source, new); + if (len >= dest_len) + goto fail; + + dest_len -= len; + dest += len; + source = pos + old_len; + } + + if (strlcpy(dest, source, dest_len) >= dest_len) + goto fail; + + return result; + +fail: + free(result); + return strdup("str_replace_all failed, string too long"); +} + +void +str_replace_in_place(char *string, size_t max_length, const char *old, const char *new) +{ + char *replaced = str_replaced(string, max_length, old, new); + strlcpy(string, replaced, max_length); + free(replaced); +} diff --git a/plugins/python/regress/iohelpers.h b/plugins/python/regress/iohelpers.h new file mode 100644 index 0000000..b2383af --- /dev/null +++ b/plugins/python/regress/iohelpers.h @@ -0,0 +1,54 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef PYTHON_IO_HELPERS +#define PYTHON_IO_HELPERS + +#include "config.h" +#include "sudo_compat.h" + +#include +#include +#include +#include +#include +#include + +#include + +#define MAX_OUTPUT (2 << 16) + +int rmdir_recursive(const char *path); + +int fwriteall(const char *file_path, const char *string); +int freadall(const char *file_path, char *output, size_t max_len); + +// allocates new string with the content of 'string' but 'old' replaced to 'new' +// The allocated array will be dest_length size and null terminated correctly. +char *str_replaced(const char *string, size_t dest_length, const char *old, const char *new); + +// same, but "string" must be able to store 'max_length' number of characters including the null terminator +void str_replace_in_place(char *string, size_t max_length, const char *old, const char *new); + +int vsnprintf_append(char *output, size_t max_output_len, const char *fmt, va_list args); +int snprintf_append(char *output, size_t max_output_len, const char *fmt, ...); + +int str_array_count(char **str_array); +void str_array_snprint(char *out_str, size_t max_len, char **str_array, int array_len); + +#endif diff --git a/plugins/python/regress/plugin_approval_test.py b/plugins/python/regress/plugin_approval_test.py new file mode 100644 index 0000000..69ea668 --- /dev/null +++ b/plugins/python/regress/plugin_approval_test.py @@ -0,0 +1,22 @@ +import sudo +import json + + +class ApprovalTestPlugin(sudo.Plugin): + def __init__(self, plugin_options, **kwargs): + id = sudo.options_as_dict(plugin_options).get("Id", "") + super().__init__(plugin_options=plugin_options, **kwargs) + self._id = "(APPROVAL {})".format(id) + sudo.log_info("{} Constructed:".format(self._id)) + sudo.log_info(json.dumps(self.__dict__, indent=4, sort_keys=True)) + + def __del__(self): + sudo.log_info("{} Destructed successfully".format(self._id)) + + def check(self, *args): + sudo.log_info("{} Check was called with arguments: " + "{}".format(self._id, args)) + + def show_version(self, *args): + sudo.log_info("{} Show version was called with arguments: " + "{}".format(self._id, args)) diff --git a/plugins/python/regress/plugin_conflict.py b/plugins/python/regress/plugin_conflict.py new file mode 100644 index 0000000..3632193 --- /dev/null +++ b/plugins/python/regress/plugin_conflict.py @@ -0,0 +1,11 @@ +import sudo + +import sys + +sys.path = [] + +class ConflictPlugin(sudo.Plugin): + def __init__(self, plugin_options, **kwargs): + sudo.log_info("PATH before: {} (should be empty)".format(sys.path)) + sys.path = [sudo.options_as_dict(plugin_options).get("Path")] + sudo.log_info("PATH set: {}".format(sys.path)) diff --git a/plugins/python/regress/plugin_errorstr.py b/plugins/python/regress/plugin_errorstr.py new file mode 100644 index 0000000..fcbd71d --- /dev/null +++ b/plugins/python/regress/plugin_errorstr.py @@ -0,0 +1,18 @@ +import sudo + + +# The purpose of this class is that all methods you call on its object +# raises a PluginError with a message containing the name of the called method. +# Eg. if you call "ErrorMsgPlugin().some_method()" it will raise +# "Something wrong in some_method" +class ErrorMsgPlugin(sudo.Plugin): + def __getattr__(self, name): + def raiser_func(*args): + raise sudo.PluginError("Something wrong in " + name) + + return raiser_func + + +class ConstructErrorPlugin(sudo.Plugin): + def __init__(self, **kwargs): + raise sudo.PluginError("Something wrong in plugin constructor") diff --git a/plugins/python/regress/testdata/check_example_audit_plugin_receives_accept.stdout b/plugins/python/regress/testdata/check_example_audit_plugin_receives_accept.stdout new file mode 100644 index 0000000..2c83972 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_audit_plugin_receives_accept.stdout @@ -0,0 +1,7 @@ +(AUDIT) -- Started by user testuser1 (123) -- +(AUDIT) Requested command: id --help +(AUDIT) Accepted command: /sbin/id --help +(AUDIT) By the plugin: accepter plugin name (type=POLICY) +(AUDIT) Environment: KEY1=VALUE1 KEY2=VALUE2 +(AUDIT) Command returned with exit code 2 +(AUDIT) -- Finished -- diff --git a/plugins/python/regress/testdata/check_example_audit_plugin_receives_error.stdout b/plugins/python/regress/testdata/check_example_audit_plugin_receives_error.stdout new file mode 100644 index 0000000..cb7068d --- /dev/null +++ b/plugins/python/regress/testdata/check_example_audit_plugin_receives_error.stdout @@ -0,0 +1,5 @@ +(AUDIT) -- Started by user ??? (???) -- +(AUDIT) Requested command: id +(AUDIT) Plugin errorer plugin name (type=AUDIT) got an error: Some error has happened +(AUDIT) Sudo has run into an error: 222 +(AUDIT) -- Finished -- diff --git a/plugins/python/regress/testdata/check_example_audit_plugin_receives_reject.stdout b/plugins/python/regress/testdata/check_example_audit_plugin_receives_reject.stdout new file mode 100644 index 0000000..c6e8a5a --- /dev/null +++ b/plugins/python/regress/testdata/check_example_audit_plugin_receives_reject.stdout @@ -0,0 +1,5 @@ +(AUDIT) -- Started by user root (0) -- +(AUDIT) Requested command: passwd +(AUDIT) Rejected by plugin rejecter plugin name (type=IO): Rejected just because! +(AUDIT) The command was not executed +(AUDIT) -- Finished -- diff --git a/plugins/python/regress/testdata/check_example_audit_plugin_version_display.stdout b/plugins/python/regress/testdata/check_example_audit_plugin_version_display.stdout new file mode 100644 index 0000000..1586f46 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_audit_plugin_version_display.stdout @@ -0,0 +1,6 @@ +(AUDIT) -- Started by user root (0) -- +Python Example Audit Plugin +Python audit plugin (API 1.0): SudoAuditPlugin (loaded from 'SRC_DIR/example_audit_plugin.py') +Python Example Audit Plugin (version=1.0) +(AUDIT) Sudo has run into an error: 222 +(AUDIT) -- Finished -- diff --git a/plugins/python/regress/testdata/check_example_audit_plugin_workflow_multiple.stderr b/plugins/python/regress/testdata/check_example_audit_plugin_workflow_multiple.stderr new file mode 100644 index 0000000..1d7d4a1 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_audit_plugin_workflow_multiple.stderr @@ -0,0 +1 @@ +sudo: loading more than 8 sudo python audit plugins is not supported diff --git a/plugins/python/regress/testdata/check_example_audit_plugin_workflow_multiple.stdout b/plugins/python/regress/testdata/check_example_audit_plugin_workflow_multiple.stdout new file mode 100644 index 0000000..aa5ee58 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_audit_plugin_workflow_multiple.stdout @@ -0,0 +1,14 @@ +(AUDIT1) -- Started by user default (1000) -- +(AUDIT1) Requested command: id --help +(AUDIT2) -- Started by user default (1000) -- +(AUDIT2) Requested command: id --help +(AUDIT1) Accepted command: /sbin/id --help +(AUDIT1) By the plugin: accepter plugin name (type=POLICY) +(AUDIT1) Environment: KEY1=VALUE1 KEY2=VALUE2 +(AUDIT2) Accepted command: /sbin/id --help +(AUDIT2) By the plugin: accepter plugin name (type=POLICY) +(AUDIT2) Environment: KEY1=VALUE1 KEY2=VALUE2 +(AUDIT1) Command exited due to signal 11 +(AUDIT1) -- Finished -- +(AUDIT2) Command exited due to signal 11 +(AUDIT2) -- Finished -- diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.conversation b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.conversation new file mode 100644 index 0000000..43bd2e7 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.conversation @@ -0,0 +1,3 @@ +Question count: 2 +Question 0: <> (timeout: 120, msg_type=2) +Question 1: <> (timeout: 120, msg_type=5) diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stderr b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stderr new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stdout b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stdout new file mode 100644 index 0000000..9d515c9 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stdout @@ -0,0 +1,3 @@ +Please provide your reason for executing ('/bin/whoami',) +conversation suspend: signal SIGTSTP +conversation resume: signal was SIGCONT diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stored b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stored new file mode 100644 index 0000000..c0ab857 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_with_suspend.stored @@ -0,0 +1,3 @@ +Executed /bin/whoami +Reason: my fake reason +Hidden reason: my real secret reason diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.conversation b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.conversation new file mode 100644 index 0000000..43bd2e7 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.conversation @@ -0,0 +1,3 @@ +Question count: 2 +Question 0: <> (timeout: 120, msg_type=2) +Question 1: <> (timeout: 120, msg_type=5) diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stderr b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stderr new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stdout b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stdout new file mode 100644 index 0000000..7bbfa3f --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stdout @@ -0,0 +1 @@ +Please provide your reason for executing ('/bin/whoami',) diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stored b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stored new file mode 100644 index 0000000..c0ab857 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_reason_log_without_suspend.stored @@ -0,0 +1,3 @@ +Executed /bin/whoami +Reason: my fake reason +Hidden reason: my real secret reason diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.conv b/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.conv new file mode 100644 index 0000000..59d7202 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.conv @@ -0,0 +1,2 @@ +Question count: 2 +Question 0: <> (timeout: 120, msg_type=2) diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.conversation b/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.conversation new file mode 100644 index 0000000..59d7202 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.conversation @@ -0,0 +1,2 @@ +Question count: 2 +Question 0: <> (timeout: 120, msg_type=2) diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.stderr b/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.stderr new file mode 100644 index 0000000..8a4a528 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.stderr @@ -0,0 +1 @@ +You did not answer in time diff --git a/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.stdout b/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.stdout new file mode 100644 index 0000000..7bbfa3f --- /dev/null +++ b/plugins/python/regress/testdata/check_example_conversation_plugin_user_interrupts.stdout @@ -0,0 +1 @@ +Please provide your reason for executing ('/bin/whoami',) diff --git a/plugins/python/regress/testdata/check_example_debugging_c_calls@diag.log b/plugins/python/regress/testdata/check_example_debugging_c_calls@diag.log new file mode 100644 index 0000000..1d2918a --- /dev/null +++ b/plugins/python/regress/testdata/check_example_debugging_c_calls@diag.log @@ -0,0 +1,6 @@ +sudo.debug was called with arguments: (, 'My demo purpose plugin shows this ERROR level debug message') +sudo.debug was called with arguments: (, 'My demo purpose plugin shows this INFO level debug message') +LogHandler.emit was called +LogHandler.emit was called +sudo.options_as_dict was called with arguments: (('ModulePath=SRC_DIR/example_debugging.py', 'ClassName=DebugDemoPlugin'),) +sudo.options_as_dict returned result: [('ClassName', 'DebugDemoPlugin'), ('ModulePath', 'SRC_DIR/example_debugging.py')] diff --git a/plugins/python/regress/testdata/check_example_debugging_c_calls@info.log b/plugins/python/regress/testdata/check_example_debugging_c_calls@info.log new file mode 100644 index 0000000..755b3f5 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_debugging_c_calls@info.log @@ -0,0 +1,11 @@ +__init__ @ SRC_DIR/example_debugging.py:58 calls C function: +sudo.debug was called with arguments: (, 'My demo purpose plugin shows this ERROR level debug message') +__init__ @ SRC_DIR/example_debugging.py:63 calls C function: +sudo.debug was called with arguments: (, 'My demo purpose plugin shows this INFO level debug message') +handle @ logging/__init__.py calls C function: +LogHandler.emit was called +handle @ logging/__init__.py calls C function: +LogHandler.emit was called +__init__ @ SRC_DIR/example_debugging.py:85 calls C function: +sudo.options_as_dict was called with arguments: (('ModulePath=SRC_DIR/example_debugging.py', 'ClassName=DebugDemoPlugin'),) +sudo.options_as_dict returned result: [('ClassName', 'DebugDemoPlugin'), ('ModulePath', 'SRC_DIR/example_debugging.py')] diff --git a/plugins/python/regress/testdata/check_example_debugging_load@diag.log b/plugins/python/regress/testdata/check_example_debugging_load@diag.log new file mode 100644 index 0000000..15b4bbe --- /dev/null +++ b/plugins/python/regress/testdata/check_example_debugging_load@diag.log @@ -0,0 +1,3 @@ +importing module: SRC_DIR/example_debugging.py +Extending python 'path' with 'SRC_DIR' +Deinit was called for a python plugin diff --git a/plugins/python/regress/testdata/check_example_debugging_plugin@err.log b/plugins/python/regress/testdata/check_example_debugging_plugin@err.log new file mode 100644 index 0000000..aec31ec --- /dev/null +++ b/plugins/python/regress/testdata/check_example_debugging_plugin@err.log @@ -0,0 +1,2 @@ +My demo purpose plugin shows this ERROR level debug message +Python log system shows this ERROR level debug message diff --git a/plugins/python/regress/testdata/check_example_debugging_plugin@info.log b/plugins/python/regress/testdata/check_example_debugging_plugin@info.log new file mode 100644 index 0000000..ed72f35 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_debugging_plugin@info.log @@ -0,0 +1,8 @@ +__init__ @ SRC_DIR/example_debugging.py:58 debugs: +My demo purpose plugin shows this ERROR level debug message +__init__ @ SRC_DIR/example_debugging.py:63 debugs: +My demo purpose plugin shows this INFO level debug message +handle @ logging/__init__.py debugs: +Python log system shows this ERROR level debug message +handle @ logging/__init__.py debugs: +Python log system shows this INFO level debug message diff --git a/plugins/python/regress/testdata/check_example_debugging_py_calls@diag.log b/plugins/python/regress/testdata/check_example_debugging_py_calls@diag.log new file mode 100644 index 0000000..97a89ef --- /dev/null +++ b/plugins/python/regress/testdata/check_example_debugging_py_calls@diag.log @@ -0,0 +1,2 @@ +DebugDemoPlugin.__init__ was called with arguments: () [('plugin_options', ('ModulePath=SRC_DIR/example_debugging.py', 'ClassName=DebugDemoPlugin')), ('settings', ('debug_flags=/tmp/sudo_check_python_exampleXXXXXX/debug.log py_calls@diag', 'plugin_path=python_plugin.so')), ('user_env', ()), ('user_info', ()), ('version', '1.0')] +DebugDemoPlugin.__init__ returned result: diff --git a/plugins/python/regress/testdata/check_example_debugging_py_calls@info.log b/plugins/python/regress/testdata/check_example_debugging_py_calls@info.log new file mode 100644 index 0000000..ae39daf --- /dev/null +++ b/plugins/python/regress/testdata/check_example_debugging_py_calls@info.log @@ -0,0 +1,9 @@ +DebugDemoPlugin.__init__ was called with arguments: () [('plugin_options', ('ModulePath=SRC_DIR/example_debugging.py', 'ClassName=DebugDemoPlugin')), ('settings', ('debug_flags=/tmp/sudo_check_python_exampleXXXXXX/debug.log py_calls@info', 'plugin_path=python_plugin.so')), ('user_env', ()), ('user_info', ()), ('version', '1.0')] +DebugDemoPlugin.__init__ returned result: +DebugDemoPlugin function 'log_ttyin' is not implemented +DebugDemoPlugin function 'log_ttyout' is not implemented +DebugDemoPlugin function 'log_stdin' is not implemented +DebugDemoPlugin function 'log_stdout' is not implemented +DebugDemoPlugin function 'log_stderr' is not implemented +DebugDemoPlugin function 'change_winsize' is not implemented +DebugDemoPlugin function 'log_suspend' is not implemented diff --git a/plugins/python/regress/testdata/check_example_debugging_sudo_cb@info.log b/plugins/python/regress/testdata/check_example_debugging_sudo_cb@info.log new file mode 100644 index 0000000..908066b --- /dev/null +++ b/plugins/python/regress/testdata/check_example_debugging_sudo_cb@info.log @@ -0,0 +1 @@ +Skipping close call, because there was no command run diff --git a/plugins/python/regress/testdata/check_example_group_plugin_is_able_to_debug.log b/plugins/python/regress/testdata/check_example_group_plugin_is_able_to_debug.log new file mode 100644 index 0000000..bb2fc4f --- /dev/null +++ b/plugins/python/regress/testdata/check_example_group_plugin_is_able_to_debug.log @@ -0,0 +1,4 @@ +SudoGroupPlugin.__init__ was called with arguments: () [('args', ('ModulePath=SRC_DIR/example_group_plugin.py', 'ClassName=SudoGroupPlugin')), ('version', '1.0')] +SudoGroupPlugin.__init__ returned result: +SudoGroupPlugin.query was called with arguments: ('user', 'group', ('pw_name', 'pw_passwd', 1001, 101, 'pw_gecos', 'pw_dir', 'pw_shell')) +SudoGroupPlugin.query returned result: RC.REJECT diff --git a/plugins/python/regress/testdata/check_example_io_plugin_command_log.stderr b/plugins/python/regress/testdata/check_example_io_plugin_command_log.stderr new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_io_plugin_command_log.stdout b/plugins/python/regress/testdata/check_example_io_plugin_command_log.stdout new file mode 100644 index 0000000..7e94c91 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_command_log.stdout @@ -0,0 +1 @@ +Example sudo python plugin will log to /tmp/sudo_check_python_exampleXXXXXX/sudo.log diff --git a/plugins/python/regress/testdata/check_example_io_plugin_command_log.stored b/plugins/python/regress/testdata/check_example_io_plugin_command_log.stored new file mode 100644 index 0000000..73fdc5d --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_command_log.stored @@ -0,0 +1,16 @@ + -- Plugin STARTED -- +EXEC id --help +EXEC info [ + "command=/bin/id", + "runas_uid=0" +] +STD IN some standard input +STD OUT some standard output +STD ERR some standard error +SUSPEND SIGTSTP +SUSPEND SIGCONT +WINSIZE 200x100 +TTY IN some tty input +TTY OUT some tty output +CLOSE Command returned 1 + -- Plugin DESTROYED -- diff --git a/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple.stderr b/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple.stderr new file mode 100644 index 0000000..f519805 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple.stderr @@ -0,0 +1 @@ +sudo: loading more than 8 sudo python IO plugins is not supported diff --git a/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple.stdout b/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple.stdout new file mode 100644 index 0000000..e9dbd67 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple.stdout @@ -0,0 +1,2 @@ +Example sudo python plugin will log to /tmp/sudo_check_python_exampleXXXXXX/sudo.log +Example sudo python plugin will log to /tmp/sudo_check_python_exampleXXXXXX2/sudo.log diff --git a/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple1.stored b/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple1.stored new file mode 100644 index 0000000..bc60c38 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple1.stored @@ -0,0 +1,16 @@ + -- Plugin STARTED -- +EXEC id --help +EXEC info [ + "command=/bin/id", + "runas_uid=0" +] +STD IN stdin for plugin 1 +STD OUT stdout for plugin 1 +STD ERR stderr for plugin 1 +SUSPEND SIGTSTP +SUSPEND SIGCONT +WINSIZE 20x10 +TTY IN tty input for plugin 1 +TTY OUT tty output for plugin 1 +CLOSE Command returned 1 + -- Plugin DESTROYED -- diff --git a/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple2.stored b/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple2.stored new file mode 100644 index 0000000..ed3fdc8 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_command_log_multiple2.stored @@ -0,0 +1,16 @@ + -- Plugin STARTED -- +EXEC whoami +EXEC info [ + "command=/bin/whoami", + "runas_uid=1" +] +STD IN stdin for plugin 2 +STD OUT stdout for plugin 2 +STD ERR stderr for plugin 2 +SUSPEND SIGSTOP +SUSPEND SIGCONT +WINSIZE 30x40 +TTY IN tty input for plugin 2 +TTY OUT tty output for plugin 2 +CLOSE Command returned 2 + -- Plugin DESTROYED -- diff --git a/plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stderr b/plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stderr new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stdout b/plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stdout new file mode 100644 index 0000000..7e94c91 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stdout @@ -0,0 +1 @@ +Example sudo python plugin will log to /tmp/sudo_check_python_exampleXXXXXX/sudo.log diff --git a/plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stored b/plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stored new file mode 100644 index 0000000..1b99398 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_failed_to_start_command.stored @@ -0,0 +1,8 @@ + -- Plugin STARTED -- +EXEC cmd +EXEC info [ + "command=/usr/share/cmd", + "runas_uid=0" +] +CLOSE Failed to execute, execve returned 1 (EPERM) + -- Plugin DESTROYED -- diff --git a/plugins/python/regress/testdata/check_example_io_plugin_fails_with_python_backtrace.stderr b/plugins/python/regress/testdata/check_example_io_plugin_fails_with_python_backtrace.stderr new file mode 100644 index 0000000..1dd42a6 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_fails_with_python_backtrace.stderr @@ -0,0 +1 @@ +Failed to construct plugin instance: [Errno 2] No such file or directory: '/some/not/writable/directory/sudo.log' diff --git a/plugins/python/regress/testdata/check_example_io_plugin_fails_with_python_backtrace.stdout b/plugins/python/regress/testdata/check_example_io_plugin_fails_with_python_backtrace.stdout new file mode 100644 index 0000000..10b0e23 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_fails_with_python_backtrace.stdout @@ -0,0 +1,7 @@ +Example sudo python plugin will log to /some/not/writable/directory/sudo.log +Traceback: + File "SRC_DIR/example_io_plugin.py", line 64, in __init__ + self._open_log_file(path.join(log_path, "sudo.log")) + File "SRC_DIR/example_io_plugin.py", line 134, in _open_log_file + self._log_file = open(log_path, "a") + diff --git a/plugins/python/regress/testdata/check_example_io_plugin_version_display.stderr b/plugins/python/regress/testdata/check_example_io_plugin_version_display.stderr new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_io_plugin_version_display.stdout b/plugins/python/regress/testdata/check_example_io_plugin_version_display.stdout new file mode 100644 index 0000000..07e998a --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_version_display.stdout @@ -0,0 +1,2 @@ +Example sudo python plugin will log to /tmp/sudo_check_python_exampleXXXXXX/sudo.log +Python Example IO Plugin version: 1.0 diff --git a/plugins/python/regress/testdata/check_example_io_plugin_version_display.stored b/plugins/python/regress/testdata/check_example_io_plugin_version_display.stored new file mode 100644 index 0000000..45f9b9e --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_version_display.stored @@ -0,0 +1,2 @@ + -- Plugin STARTED -- + -- Plugin DESTROYED -- diff --git a/plugins/python/regress/testdata/check_example_io_plugin_version_display_full.stdout b/plugins/python/regress/testdata/check_example_io_plugin_version_display_full.stdout new file mode 100644 index 0000000..cfb3921 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_io_plugin_version_display_full.stdout @@ -0,0 +1,3 @@ +Example sudo python plugin will log to /tmp/sudo_check_python_exampleXXXXXX/sudo.log +Python io plugin (API 1.0): SudoIOPlugin (loaded from 'SRC_DIR/example_io_plugin.py') +Python Example IO Plugin version: 1.0 diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_accepted_execution.stderr b/plugins/python/regress/testdata/check_example_policy_plugin_accepted_execution.stderr new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_accepted_execution.stdout b/plugins/python/regress/testdata/check_example_policy_plugin_accepted_execution.stdout new file mode 100644 index 0000000..c63a26e --- /dev/null +++ b/plugins/python/regress/testdata/check_example_policy_plugin_accepted_execution.stdout @@ -0,0 +1 @@ +The command returned with exit_status 3 diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_denied_execution.stderr b/plugins/python/regress/testdata/check_example_policy_plugin_denied_execution.stderr new file mode 100644 index 0000000..6db9b2c --- /dev/null +++ b/plugins/python/regress/testdata/check_example_policy_plugin_denied_execution.stderr @@ -0,0 +1 @@ +You are not allowed to run this command! diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_denied_execution.stdout b/plugins/python/regress/testdata/check_example_policy_plugin_denied_execution.stdout new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_failed_execution.stderr b/plugins/python/regress/testdata/check_example_policy_plugin_failed_execution.stderr new file mode 100644 index 0000000..e8d7034 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_policy_plugin_failed_execution.stderr @@ -0,0 +1 @@ +Failed to execute command, execve syscall returned 2 (ENOENT) diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_failed_execution.stdout b/plugins/python/regress/testdata/check_example_policy_plugin_failed_execution.stdout new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_list.stderr b/plugins/python/regress/testdata/check_example_policy_plugin_list.stderr new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_list.stdout b/plugins/python/regress/testdata/check_example_policy_plugin_list.stdout new file mode 100644 index 0000000..48c5baf --- /dev/null +++ b/plugins/python/regress/testdata/check_example_policy_plugin_list.stdout @@ -0,0 +1,25 @@ +-- minimal -- +Only the following commands are allowed: id, whoami + +-- minimal (verbose) -- +Only the following commands are allowed: id, whoami + +-- with user -- +Only the following commands are allowed: id, whoami as user 'testuser' + +-- with user (verbose) -- +Only the following commands are allowed: id, whoami as user 'testuser' + +-- with allowed program -- +You are allowed to execute command '/bin/id' + +-- with allowed program (verbose) -- +You are allowed to execute command '/bin/id' +Only the following commands are allowed: id, whoami + +-- with denied program -- +You are NOT allowed to execute command '/bin/passwd' + +-- with denied program (verbose) -- +You are NOT allowed to execute command '/bin/passwd' +Only the following commands are allowed: id, whoami diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_validate_invalidate.log b/plugins/python/regress/testdata/check_example_policy_plugin_validate_invalidate.log new file mode 100644 index 0000000..6f1479a --- /dev/null +++ b/plugins/python/regress/testdata/check_example_policy_plugin_validate_invalidate.log @@ -0,0 +1,8 @@ +SudoPolicyPlugin.__init__ was called with arguments: () [('plugin_options', ('ModulePath=SRC_DIR/example_policy_plugin.py', 'ClassName=SudoPolicyPlugin')), ('settings', ()), ('user_env', ()), ('user_info', ()), ('version', '1.0')] +SudoPolicyPlugin.__init__ returned result: +SudoPolicyPlugin.validate was called with arguments: () +SudoPolicyPlugin.validate returned result: None +SudoPolicyPlugin.invalidate was called with arguments: (1,) +SudoPolicyPlugin.invalidate returned result: None +SudoPolicyPlugin.invalidate was called with arguments: (0,) +SudoPolicyPlugin.invalidate returned result: None diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_version_display.stderr b/plugins/python/regress/testdata/check_example_policy_plugin_version_display.stderr new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_version_display.stdout b/plugins/python/regress/testdata/check_example_policy_plugin_version_display.stdout new file mode 100644 index 0000000..1cc1edd --- /dev/null +++ b/plugins/python/regress/testdata/check_example_policy_plugin_version_display.stdout @@ -0,0 +1 @@ +Python Example Policy Plugin version: 1.0 diff --git a/plugins/python/regress/testdata/check_example_policy_plugin_version_display_full.stdout b/plugins/python/regress/testdata/check_example_policy_plugin_version_display_full.stdout new file mode 100644 index 0000000..a23cf12 --- /dev/null +++ b/plugins/python/regress/testdata/check_example_policy_plugin_version_display_full.stdout @@ -0,0 +1,2 @@ +Python policy plugin (API 1.0): SudoPolicyPlugin (loaded from 'SRC_DIR/example_policy_plugin.py') +Python Example Policy Plugin version: 1.0 diff --git a/plugins/python/regress/testdata/check_loading_fails_missing_classname.stderr b/plugins/python/regress/testdata/check_loading_fails_missing_classname.stderr new file mode 100644 index 0000000..c207e2f --- /dev/null +++ b/plugins/python/regress/testdata/check_loading_fails_missing_classname.stderr @@ -0,0 +1,3 @@ +No plugin class is specified for python module 'SRC_DIR/regress/plugin_errorstr.py'. Use 'ClassName' configuration option in 'sudo.conf' +Possible plugins: ConstructErrorPlugin, ErrorMsgPlugin +Failed during loading plugin class diff --git a/plugins/python/regress/testdata/check_loading_fails_missing_classname.stdout b/plugins/python/regress/testdata/check_loading_fails_missing_classname.stdout new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_loading_fails_missing_path.stderr b/plugins/python/regress/testdata/check_loading_fails_missing_path.stderr new file mode 100644 index 0000000..05bc634 --- /dev/null +++ b/plugins/python/regress/testdata/check_loading_fails_missing_path.stderr @@ -0,0 +1,2 @@ +No python module path is specified. Use 'ModulePath' plugin config option in 'sudo.conf' +Failed during loading plugin class diff --git a/plugins/python/regress/testdata/check_loading_fails_missing_path.stdout b/plugins/python/regress/testdata/check_loading_fails_missing_path.stdout new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_loading_fails_not_owned_by_root.stderr b/plugins/python/regress/testdata/check_loading_fails_not_owned_by_root.stderr new file mode 100644 index 0000000..7ba1bc9 --- /dev/null +++ b/plugins/python/regress/testdata/check_loading_fails_not_owned_by_root.stderr @@ -0,0 +1 @@ +Failed during loading plugin class: File 'SRC_DIR/example_debugging.py' must be owned by uid 0 diff --git a/plugins/python/regress/testdata/check_loading_fails_not_owned_by_root.stdout b/plugins/python/regress/testdata/check_loading_fails_not_owned_by_root.stdout new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_loading_fails_wrong_classname.stderr b/plugins/python/regress/testdata/check_loading_fails_wrong_classname.stderr new file mode 100644 index 0000000..a4c519a --- /dev/null +++ b/plugins/python/regress/testdata/check_loading_fails_wrong_classname.stderr @@ -0,0 +1,2 @@ +Failed to find plugin class 'MispelledPluginName' +Failed during loading plugin class diff --git a/plugins/python/regress/testdata/check_loading_fails_wrong_classname.stdout b/plugins/python/regress/testdata/check_loading_fails_wrong_classname.stdout new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_loading_fails_wrong_path.stderr b/plugins/python/regress/testdata/check_loading_fails_wrong_path.stderr new file mode 100644 index 0000000..3087ba8 --- /dev/null +++ b/plugins/python/regress/testdata/check_loading_fails_wrong_path.stderr @@ -0,0 +1 @@ +Failed during loading plugin class: No module named 'wrong_path' diff --git a/plugins/python/regress/testdata/check_loading_fails_wrong_path.stdout b/plugins/python/regress/testdata/check_loading_fails_wrong_path.stdout new file mode 100644 index 0000000..e69de29 diff --git a/plugins/python/regress/testdata/check_loading_succeeds_with_missing_classname.stdout b/plugins/python/regress/testdata/check_loading_succeeds_with_missing_classname.stdout new file mode 100644 index 0000000..f7a1a6f --- /dev/null +++ b/plugins/python/regress/testdata/check_loading_succeeds_with_missing_classname.stdout @@ -0,0 +1 @@ +Python io plugin (API 1.0): DebugDemoPlugin (loaded from 'SRC_DIR/example_debugging.py') diff --git a/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stderr b/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stderr new file mode 100644 index 0000000..6dfb141 --- /dev/null +++ b/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stderr @@ -0,0 +1 @@ +sudo: loading more than 8 sudo python approval plugins is not supported diff --git a/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stdout b/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stdout new file mode 100644 index 0000000..0500bec --- /dev/null +++ b/plugins/python/regress/testdata/check_multiple_approval_plugin_and_arguments.stdout @@ -0,0 +1,67 @@ +(APPROVAL 1) Constructed: +{ + "_id": "(APPROVAL 1)", + "plugin_options": [ + "ModulePath=SRC_DIR/regress/plugin_approval_test.py", + "ClassName=ApprovalTestPlugin", + "Id=1" + ], + "settings": [ + "SETTING1=VALUE1", + "setting2=value2" + ], + "submit_argv": [ + "sudo", + "-u", + "user", + "whoami", + "--help" + ], + "submit_optind": 3, + "user_env": [ + "USER_ENV1=VALUE1", + "USER_ENV2=value2" + ], + "user_info": [ + "INFO1=VALUE1", + "info2=value2" + ], + "version": "1.17" +} +(APPROVAL 2) Constructed: +{ + "_id": "(APPROVAL 2)", + "plugin_options": [ + "ModulePath=SRC_DIR/regress/plugin_approval_test.py", + "ClassName=ApprovalTestPlugin", + "Id=2" + ], + "settings": [ + "SETTING1=VALUE1", + "setting2=value2" + ], + "submit_argv": [ + "sudo", + "-u", + "user", + "whoami", + "--help" + ], + "submit_optind": 3, + "user_env": [ + "USER_ENV1=VALUE1", + "USER_ENV2=value2" + ], + "user_info": [ + "INFO1=VALUE1", + "info2=value2" + ], + "version": "1.17" +} +(APPROVAL 1) Show version was called with arguments: (0,) +Python approval plugin (API 1.0): ApprovalTestPlugin (loaded from 'SRC_DIR/regress/plugin_approval_test.py') +(APPROVAL 2) Show version was called with arguments: (1,) +(APPROVAL 1) Check was called with arguments: (('CMDINFO1=value1', 'CMDINFO2=VALUE2'), ('whoami', '--help'), ('USER_ENV1=VALUE1', 'USER_ENV2=value2')) +(APPROVAL 2) Check was called with arguments: (('CMDINFO1=value1', 'CMDINFO2=VALUE2'), ('whoami', '--help'), ('USER_ENV1=VALUE1', 'USER_ENV2=value2')) +(APPROVAL 1) Destructed successfully +(APPROVAL 2) Destructed successfully diff --git a/plugins/python/regress/testdata/check_python_plugins_do_not_affect_each_other.stdout b/plugins/python/regress/testdata/check_python_plugins_do_not_affect_each_other.stdout new file mode 100644 index 0000000..cd5bef9 --- /dev/null +++ b/plugins/python/regress/testdata/check_python_plugins_do_not_affect_each_other.stdout @@ -0,0 +1,4 @@ +PATH before: [] (should be empty) +PATH set: ['path_for_first_plugin'] +PATH before: [] (should be empty) +PATH set: ['path_for_second_plugin'] diff --git a/plugins/python/regress/testdata/sudo.conf.developer_mode b/plugins/python/regress/testdata/sudo.conf.developer_mode new file mode 100644 index 0000000..4da2ad9 --- /dev/null +++ b/plugins/python/regress/testdata/sudo.conf.developer_mode @@ -0,0 +1 @@ +Set developer_mode true diff --git a/plugins/python/regress/testdata/sudo.conf.normal_mode b/plugins/python/regress/testdata/sudo.conf.normal_mode new file mode 100644 index 0000000..b972a6a --- /dev/null +++ b/plugins/python/regress/testdata/sudo.conf.normal_mode @@ -0,0 +1 @@ +Set developer_mode false diff --git a/plugins/python/regress/testhelpers.c b/plugins/python/regress/testhelpers.c new file mode 100644 index 0000000..1a861bd --- /dev/null +++ b/plugins/python/regress/testhelpers.c @@ -0,0 +1,295 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "testhelpers.h" + +const char *sudo_conf_developer_mode = TESTDATA_DIR "sudo.conf.developer_mode"; +const char *sudo_conf_normal_mode = TESTDATA_DIR "sudo.conf.normal_mode"; + +struct TestData data; + +static void +clean_output(char *output) +{ + // we replace some output which otherwise would be test run dependent + str_replace_in_place(output, MAX_OUTPUT, data.tmp_dir, TEMP_PATH_TEMPLATE); + + if (data.tmp_dir2) + str_replace_in_place(output, MAX_OUTPUT, data.tmp_dir2, TEMP_PATH_TEMPLATE "2"); + + str_replace_in_place(output, MAX_OUTPUT, SRC_DIR, "SRC_DIR"); +} + +const char * +expected_path(const char *format, ...) +{ + static char expected_output_file[PATH_MAX]; + size_t dirlen = strlcpy(expected_output_file, TESTDATA_DIR, sizeof(expected_output_file)); + + va_list args; + va_start(args, format); + vsnprintf(expected_output_file + dirlen, PATH_MAX - dirlen, format, args); + va_end(args); + + return expected_output_file; +} + +char ** +create_str_array(size_t count, ...) +{ + va_list args; + + va_start(args, count); + + char ** result = calloc(count, sizeof(char *)); + for (size_t i = 0; i < count; ++i) { + const char *str = va_arg(args, char *); + result[i] = (str == NULL ? NULL : strdup(str)); + } + + va_end(args); + return result; +} + +int +is_update(void) +{ + static int result = -1; + if (result < 0) { + const char *update = getenv("UPDATE_TESTDATA"); + result = (update && strcmp(update, "1") == 0) ? 1 : 0; + } + return result; +} + +int +verify_content(char *actual_content, const char *reference_path) +{ + clean_output(actual_content); + + if (is_update()) { + VERIFY_TRUE(fwriteall(reference_path, actual_content)); + } else { + char expected_output[MAX_OUTPUT] = ""; + if (!freadall(reference_path, expected_output, sizeof(expected_output))) { + printf("Error: Missing test data at '%s'\n", reference_path); + return false; + } + VERIFY_STR(actual_content, expected_output); + } + + return true; +} + +int +verify_file(const char *actual_dir, const char *actual_file_name, const char *reference_path) +{ + char actual_path[PATH_MAX]; + snprintf(actual_path, sizeof(actual_path), "%s/%s", actual_dir, actual_file_name); + + char actual_str[MAX_OUTPUT]; + if (!freadall(actual_path, actual_str, sizeof(actual_str))) { + printf("Expected that file '%s' gets created, but it was not\n", actual_path); + return false; + } + + int rc = verify_content(actual_str, reference_path); + return rc; +} + +int +fake_conversation(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[], struct sudo_conv_callback *callback) +{ + (void) callback; + snprintf_append(data.conv_str, MAX_OUTPUT, "Question count: %d\n", num_msgs); + for (int i = 0; i < num_msgs; ++i) { + const struct sudo_conv_message *msg = &msgs[i]; + snprintf_append(data.conv_str, MAX_OUTPUT, "Question %d: <<%s>> (timeout: %d, msg_type=%d)\n", + i, msg->msg, msg->timeout, msg->msg_type); + + if (data.conv_replies[i] == NULL) + return 1; // simulates user interruption (conversation error) + + replies[i].reply = strdup(data.conv_replies[i]); + } + + return 0; // simulate user answered just fine +} + +int +fake_conversation_with_suspend(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[], struct sudo_conv_callback *callback) +{ + if (callback != NULL) { + callback->on_suspend(SIGTSTP, callback->closure); + callback->on_resume(SIGCONT, callback->closure); + } + + return fake_conversation(num_msgs, msgs, replies, callback); +} + +int +fake_printf(int msg_type, const char *fmt, ...) +{ + int rc = -1; + va_list args; + va_start(args, fmt); + + char *output = NULL; + switch(msg_type) { + case SUDO_CONV_INFO_MSG: + output = data.stdout_str; + break; + case SUDO_CONV_ERROR_MSG: + output = data.stderr_str; + break; + default: + break; + } + + if (output) + rc = vsnprintf_append(output, MAX_OUTPUT, fmt, args); + + va_end(args); + return rc; +} + +int +verify_log_lines(const char *reference_path) +{ + char stored_path[PATH_MAX]; + snprintf(stored_path, sizeof(stored_path), "%s/%s", data.tmp_dir, "debug.log"); + + FILE *file = fopen(stored_path, "rb"); + if (file == NULL) { + printf("Failed to open file '%s'\n", stored_path); + return false; + } + + char line[1024] = ""; + char stored_str[MAX_OUTPUT] = ""; + while(fgets(line, sizeof(line), file) != NULL) { + char *line_data = strstr(line, "] "); // this skips the timestamp and pid at the beginning + VERIFY_NOT_NULL(line_data); // malformed log line + line_data += 2; + + char *line_end = strstr(line_data, " object at "); // this skips checking the pointer hex + if (line_end) + snprintf(line_end, sizeof(line) - (line_end - line), " object>\n"); + + if (strncmp(line_data, "handle @ /", sizeof("handle @ /") - 1) == 0) { + char *start = line_data + sizeof("handle @ ") - 1; + + // normalize path to logging/__init__.py + char *logging = strstr(start, "logging/"); + if (logging != NULL) { + memmove(start, logging, strlen(logging) + 1); + } + + // remove line number + char *colon = strchr(start, ':'); + if (colon != NULL) { + size_t len = strspn(colon + 1, "0123456789"); + if (len != 0) + memmove(colon, colon + len + 1, strlen(colon + len + 1) + 1); + } + } else if (strncmp(line_data, "LogHandler.emit was called ", 27) == 0) { + // LogHandler.emit argument details vary based on python version + line_data[26] = '\n'; + line_data[27] = '\0'; + } + + VERIFY_TRUE(strlcat(stored_str, line_data, sizeof(stored_str)) < sizeof(stored_str)); // we have enough space in buffer + } + + clean_output(stored_str); + + VERIFY_TRUE(verify_content(stored_str, reference_path)); + return true; +} + +int +verify_str_set(char **actual_set, char **expected_set, const char *actual_variable_name) +{ + VERIFY_NOT_NULL(actual_set); + VERIFY_NOT_NULL(expected_set); + + int actual_len = str_array_count(actual_set); + int expected_len = str_array_count(expected_set); + + int matches = false; + if (actual_len == expected_len) { + int actual_pos = 0; + for (; actual_pos < actual_len; ++actual_pos) { + char *actual_item = actual_set[actual_pos]; + + int expected_pos = 0; + for (; expected_pos < expected_len; ++expected_pos) { + if (strcmp(actual_item, expected_set[expected_pos]) == 0) + break; + } + + if (expected_pos == expected_len) { + // matching item was not found + break; + } + } + + matches = (actual_pos == actual_len); + } + + if (!matches) { + char actual_set_str[MAX_OUTPUT] = ""; + char expected_set_str[MAX_OUTPUT] = ""; + str_array_snprint(actual_set_str, MAX_OUTPUT, actual_set, actual_len); + str_array_snprint(expected_set_str, MAX_OUTPUT, expected_set, expected_len); + + VERIFY_PRINT_MSG("%s", actual_variable_name, actual_set_str, "expected", + expected_set_str, "expected to contain the same elements as"); + return false; + } + + return true; +} + +int +mock_python_datetime_now(const char *plugin_name, const char *date_str) +{ + char *cmd = NULL; + int len; + len = asprintf(&cmd, + "import %s\n" // the plugin has its own submodule + "from datetime import datetime\n" // store the real datetime + "import time\n" + "from unittest.mock import Mock\n" + "%s.datetime = Mock()\n" // replace plugin's datetime + "%s.datetime.now = lambda: datetime.strptime('%s', '%%Y-%%m-%%dT%%H:%%M:%%S')\n", + plugin_name, plugin_name, plugin_name, date_str); + if (len == -1) + return false; + VERIFY_PTR_NE(cmd, NULL); + VERIFY_INT(PyRun_SimpleString(cmd), 0); + free(cmd); + return true; +} diff --git a/plugins/python/regress/testhelpers.h b/plugins/python/regress/testhelpers.h new file mode 100644 index 0000000..b5abb99 --- /dev/null +++ b/plugins/python/regress/testhelpers.h @@ -0,0 +1,175 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef PYTHON_TESTHELPERS +#define PYTHON_TESTHELPERS + +#include "iohelpers.h" + +#include "../pyhelpers.h" + +#include "sudo_conf.h" + +// just for the IDE +#ifndef SRC_DIR +#define SRC_DIR "" +#endif +#define TESTDATA_DIR SRC_DIR "/regress/testdata/" + +extern const char *sudo_conf_developer_mode; +extern const char *sudo_conf_normal_mode; + +#define TEMP_PATH_TEMPLATE "/tmp/sudo_check_python_exampleXXXXXX" + +extern struct TestData { + char *tmp_dir; + char *tmp_dir2; + char stdout_str[MAX_OUTPUT]; + char stderr_str[MAX_OUTPUT]; + + char conv_str[MAX_OUTPUT]; + const char *conv_replies[8]; + + // some example test data used by multiple test cases: + char ** settings; + char ** user_info; + char ** command_info; + char ** plugin_argv; + int plugin_argc; + char ** user_env; + char ** plugin_options; +} data; + +const char * expected_path(const char *format, ...); + +char ** create_str_array(size_t count, ...); + +#define RUN_TEST(testcase) \ + do { \ + int success = 1; \ + printf("Running test " #testcase " ... \n"); \ + if (!init()) { \ + printf("FAILED: initialization of testcase %s at %s:%d\n", #testcase, __FILE__, __LINE__); \ + success = 0; \ + } else \ + if (!testcase) { \ + printf("FAILED: testcase %s at %s:%d\n", #testcase, __FILE__, __LINE__); \ + success = 0; \ + } \ + if (!cleanup(success)) { \ + printf("FAILED: deitialization of testcase %s at %s:%d\n", #testcase, __FILE__, __LINE__); \ + success = 0; \ + } \ + if (!success) { \ + errors++; \ + } \ + } while(false) + +#define VERIFY_PRINT_MSG(fmt, actual_str, actual, expected_str, expected, expected_to_be_message) \ + printf("Expectation failed at %s:%d:\n actual is <<" fmt ">>: %s\n %s <<" fmt ">>: %s\n", \ + __FILE__, __LINE__, actual, actual_str, expected_to_be_message, expected, expected_str) + +#define VERIFY_CUSTOM(fmt, type, actual, expected, invert) \ + do { \ + type actual_value = (type)(actual); \ + int failed = (actual_value != expected); \ + if (invert) \ + failed = !failed; \ + if (failed) { \ + VERIFY_PRINT_MSG(fmt, #actual, actual_value, #expected, expected, invert ? "not expected to be" : "expected to be"); \ + return false; \ + } \ + } while(false) + +#define VERIFY_EQ(fmt, type, actual, expected) VERIFY_CUSTOM(fmt, type, actual, expected, false) +#define VERIFY_NE(fmt, type, actual, not_expected) VERIFY_CUSTOM(fmt, type, actual, not_expected, true) + +#define VERIFY_INT(actual, expected) VERIFY_EQ("%d", int, actual, expected) + +#define VERIFY_PTR(actual, expected) VERIFY_EQ("%p", const void *, (const void *)actual, (const void *)expected) +#define VERIFY_PTR_NE(actual, not_expected) VERIFY_NE("%p", const void *, (const void *)actual, (const void *)not_expected) + +#define VERIFY_TRUE(actual) VERIFY_NE("%d", int, actual, 0) +#define VERIFY_FALSE(actual) VERIFY_INT(actual, false) + +#define VERIFY_NOT_NULL(actual) VERIFY_NE("%p", const void *, actual, NULL) + +#define VERIFY_STR(actual, expected) \ + do { \ + const char *actual_str = actual; \ + if (!actual_str || strcmp(actual_str, expected) != 0) { \ + VERIFY_PRINT_MSG("%s", #actual, actual_str ? actual_str : "(null)", #expected, expected, "expected to be"); \ + return false; \ + } \ + } while(false) + +#define VERIFY_STR_CONTAINS(actual, expected) \ + do { \ + const char *actual_str = actual; \ + if (!actual_str || strstr(actual_str, expected) == NULL) { \ + VERIFY_PRINT_MSG("%s", #actual, actual_str ? actual_str : "(null)", #expected, expected, "expected to contain the string"); \ + return false; \ + } \ + } while(false) + +int is_update(void); + +int verify_content(char *actual_content, const char *reference_path); + +#define VERIFY_CONTENT(actual_output, reference_path) \ + VERIFY_TRUE(verify_content(actual_output, reference_path)) + +#define VERIFY_STDOUT(reference_path) \ + VERIFY_CONTENT(data.stdout_str, reference_path) + +#define VERIFY_STDERR(reference_path) \ + VERIFY_CONTENT(data.stderr_str, reference_path) + +#define VERIFY_CONV(reference_name) \ + VERIFY_CONTENT(data.conv_str, reference_name) + +int verify_file(const char *actual_dir, const char *actual_file_name, const char *reference_path); + +#define VERIFY_FILE(actual_file_name, reference_path) \ + VERIFY_TRUE(verify_file(data.tmp_dir, actual_file_name, reference_path)) + +int fake_conversation(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[], struct sudo_conv_callback *callback); + +int fake_conversation_with_suspend(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[], struct sudo_conv_callback *callback); + +int fake_printf(int msg_type, const char *fmt, ...); + +int verify_log_lines(const char *reference_path); + +int mock_python_datetime_now(const char *plugin_name, const char *date_str); + +#define VERIFY_LOG_LINES(reference_path) \ + VERIFY_TRUE(verify_log_lines(reference_path)) + +int verify_str_set(char **actual_set, char **expected_set, const char *actual_variable_name); + +#define VERIFY_STR_SET(actual_set, ...) \ + do { \ + char **expected_set = create_str_array(__VA_ARGS__); \ + VERIFY_TRUE(verify_str_set(actual_set, expected_set, #actual_set)); \ + str_array_free(&expected_set); \ + } while(false) + +#endif // PYTHON_TESTHELPERS diff --git a/plugins/python/sudo_python_debug.c b/plugins/python/sudo_python_debug.c new file mode 100644 index 0000000..18cb756 --- /dev/null +++ b/plugins/python/sudo_python_debug.c @@ -0,0 +1,129 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include +#include + +#include +#include + +#include "sudo_gettext.h" +#include "sudo_compat.h" +#include "sudo_python_debug.h" +#include "sudo_queue.h" +#include "sudo_conf.h" +#include "sudo_fatal.h" + + +static int python_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; +static unsigned int python_debug_refcnt; + +static const char *const python_subsystem_names[] = { + "py_calls", // logs c -> py calls + "c_calls", // logs py -> c calls + "load", // logs python plugin loading / unloading + "sudo_cb", // logs sudo callback calls + "internal", // logs internal functions of the language wrapper plugin + "plugin", // logs whatever log the python module would like to log through sudo.debug API + NULL +}; + +#define NUM_SUBSYSTEMS sizeof(python_subsystem_names) / sizeof(*python_subsystem_names) - 1 + +/* Subsystem IDs assigned at registration time. */ +int python_subsystem_ids[NUM_SUBSYSTEMS]; + +/* + * Parse the "filename flags,..." debug_flags entry and insert a new + * sudo_debug_file struct into debug_files. + */ +bool +python_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files, + const char *entry) +{ + /* Already initialized? */ + if (python_debug_instance != SUDO_DEBUG_INSTANCE_INITIALIZER) + return true; + + return sudo_debug_parse_flags(debug_files, entry) != -1; +} + +/* + * Register the specified debug files and program with the + * debug subsystem, freeing the debug list when done. + * Sets the active debug instance as a side effect. + */ +bool +python_debug_register(const char *program, + struct sudo_conf_debug_file_list *debug_files) +{ + int instance = python_debug_instance; + struct sudo_debug_file *debug_file, *debug_next; + + /* Setup debugging if indicated. */ + if (debug_files != NULL && !TAILQ_EMPTY(debug_files)) { + if (program != NULL) { + instance = sudo_debug_register(program, python_subsystem_names, + (unsigned int *)python_subsystem_ids, debug_files); + } + TAILQ_FOREACH_SAFE(debug_file, debug_files, entries, debug_next) { + TAILQ_REMOVE(debug_files, debug_file, entries); + free(debug_file->debug_file); + free(debug_file->debug_flags); + free(debug_file); + } + } + + switch (instance) { + case SUDO_DEBUG_INSTANCE_ERROR: + return false; + case SUDO_DEBUG_INSTANCE_INITIALIZER: + /* Nothing to do */ + break; + default: + /* New debug instance or additional reference on existing one. */ + python_debug_instance = instance; + sudo_debug_set_active_instance(python_debug_instance); + python_debug_refcnt++; + break; + } + + return true; +} + +/* + * Deregister python_debug_instance if it is registered. + */ +void +python_debug_deregister(void) +{ + debug_decl(python_debug_deregister, PYTHON_DEBUG_INTERNAL); + + if (python_debug_refcnt != 0) { + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); + if (--python_debug_refcnt == 0) { + if (sudo_debug_deregister(python_debug_instance) < 1) + python_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; + } + } +} diff --git a/plugins/python/sudo_python_debug.h b/plugins/python/sudo_python_debug.h new file mode 100644 index 0000000..02a715a --- /dev/null +++ b/plugins/python/sudo_python_debug.h @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_PYTHON_DEBUG_H +#define SUDO_PYTHON_DEBUG_H + +#include "sudo_debug.h" + +/* + * Sudo python plugin debug subsystems. + * Note that python_subsystem_ids[] is filled in at debug registration time. + */ +extern int python_subsystem_ids[]; +#define PYTHON_DEBUG_PY_CALLS (python_subsystem_ids[0]) +#define PYTHON_DEBUG_C_CALLS (python_subsystem_ids[1]) +#define PYTHON_DEBUG_PLUGIN_LOAD (python_subsystem_ids[2]) +#define PYTHON_DEBUG_CALLBACKS (python_subsystem_ids[3]) +#define PYTHON_DEBUG_INTERNAL (python_subsystem_ids[4]) +#define PYTHON_DEBUG_PLUGIN (python_subsystem_ids[5]) + +bool python_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files, const char *entry); +bool python_debug_register(const char *program, struct sudo_conf_debug_file_list *debug_files); +void python_debug_deregister(void); + +#define debug_return_ptr_pynone \ + do { \ + Py_INCREF(Py_None); \ + debug_return_ptr(Py_None); \ + } while(0) + +#endif /* SUDO_PYTHON_DEBUG_H */ diff --git a/plugins/python/sudo_python_module.c b/plugins/python/sudo_python_module.c new file mode 100644 index 0000000..bd189df --- /dev/null +++ b/plugins/python/sudo_python_module.c @@ -0,0 +1,611 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include "sudo_python_module.h" + +#define EXC_VAR(exception_name) sudo_exc_ ## exception_name +#define TYPE_VAR(type_name) &sudo_type_ ## type_name + +// exceptions: +PyObject *sudo_exc_SudoException; +PyObject *sudo_exc_PluginException; +PyObject *sudo_exc_PluginError; +PyObject *sudo_exc_PluginReject; +static PyObject *sudo_exc_ConversationInterrupted; + +// the methods exposed in the "sudo" python module +// "args" is a tuple (~= const list) containing all the unnamed arguments +// "kwargs" is a dict of the keyword arguments or NULL if there are none +static PyObject *python_sudo_log_info(PyObject *py_self, PyObject *py_args, PyObject *py_kwargs); +static PyObject *python_sudo_log_error(PyObject *py_self, PyObject *py_args, PyObject *py_kwargs); +static PyObject *python_sudo_conversation(PyObject *py_self, PyObject *py_args, PyObject *py_kwargs); +static PyObject *python_sudo_options_as_dict(PyObject *py_self, PyObject *py_args); +static PyObject *python_sudo_options_from_dict(PyObject *py_self, PyObject *py_args); + +static PyMethodDef sudo_methods[] = { + {"debug", (PyCFunction)python_sudo_debug, METH_VARARGS, "Debug messages which can be saved to file in sudo.conf."}, + {"log_info", (PyCFunction)python_sudo_log_info, METH_VARARGS | METH_KEYWORDS, "Display informational messages."}, + {"log_error", (PyCFunction)python_sudo_log_error, METH_VARARGS | METH_KEYWORDS, "Display error messages."}, + {"conv", (PyCFunction)python_sudo_conversation, METH_VARARGS | METH_KEYWORDS, "Interact with the user"}, + {"options_as_dict", python_sudo_options_as_dict, METH_VARARGS, "Convert a string tuple in key=value format to a dictionary."}, + {"options_from_dict", python_sudo_options_from_dict, METH_VARARGS, "Convert a dictionary to a tuple of strings in key=value format."}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static struct PyModuleDef sudo_module = { + PyModuleDef_HEAD_INIT, + "sudo", /* name of module */ + NULL, /* module documentation, may be NULL */ + -1, /* size of per-interpreter state of the module, + or -1 if the module keeps state in global variables. */ + sudo_methods, + NULL, /* slots */ + NULL, /* traverse */ + NULL, /* clear */ + NULL /* free */ +}; + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +static int +_parse_log_function_args(PyObject *py_args, PyObject *py_kwargs, char **args_joined, const char ** end) +{ + debug_decl(python_sudo_log, PYTHON_DEBUG_INTERNAL); + + int rc = SUDO_RC_ERROR; + PyObject *py_empty = NULL; + + const char *sep = NULL; + py_empty = PyTuple_New(0); + if (py_empty == NULL) + goto cleanup; + + static char *keywords[] = { "sep", "end", NULL }; + if (py_kwargs != NULL && !PyArg_ParseTupleAndKeywords(py_empty, py_kwargs, "|zz:sudo.log", keywords, &sep, end)) + goto cleanup; + + if (sep == NULL) + sep = " "; + + if (*end == NULL) + *end = "\n"; + + // this is to mimic the behaviour of python "print" / "log" + *args_joined = py_join_str_list(py_args, sep); + if (!PyErr_Occurred()) // == (*args_joined != NULL), but cpychecker does not understand that + rc = SUDO_RC_OK; + +cleanup: + Py_CLEAR(py_empty); + debug_return_int(rc); +} + +static PyObject * +python_sudo_log(int msg_type, PyObject *Py_UNUSED(py_self), PyObject *py_args, PyObject *py_kwargs) +{ + debug_decl(python_sudo_log, PYTHON_DEBUG_C_CALLS); + py_debug_python_call("sudo", "log", py_args, py_kwargs, PYTHON_DEBUG_C_CALLS); + + int rc = SUDO_RC_ERROR; + + char *args_joined = NULL; + const char *end = NULL; + if (_parse_log_function_args(py_args, py_kwargs, &args_joined, &end) != SUDO_RC_OK) + goto cleanup; + + rc = py_ctx.sudo_log(msg_type, "%s%s", args_joined, end); + if (rc < 0) { + PyErr_Format(sudo_exc_SudoException, "sudo.log: Error displaying message"); + goto cleanup; + } + +cleanup: + free(args_joined); + + PyObject *py_result = PyErr_Occurred() ? NULL : PyLong_FromLong(rc); + + py_debug_python_result("sudo", "log", py_result, PYTHON_DEBUG_C_CALLS); + debug_return_ptr(py_result); +} + +static PyObject * +python_sudo_options_as_dict(PyObject *py_self, PyObject *py_args) +{ + (void) py_self; + + debug_decl(python_sudo_options_as_dict, PYTHON_DEBUG_C_CALLS); + py_debug_python_call("sudo", "options_as_dict", py_args, NULL, PYTHON_DEBUG_C_CALLS); + + PyObject *py_config_tuple = NULL, + *py_result = NULL, + *py_config_tuple_iterator = NULL, + *py_config = NULL, + *py_splitted = NULL, + *py_separator = NULL; + + if (!PyArg_ParseTuple(py_args, "O:sudo.options_as_dict", &py_config_tuple)) + goto cleanup; + + py_config_tuple_iterator = PyObject_GetIter(py_config_tuple); + if (py_config_tuple_iterator == NULL) + goto cleanup; + + py_result = PyDict_New(); + if (py_result == NULL) + goto cleanup; + + py_separator = PyUnicode_FromString("="); + if (py_separator == NULL) + goto cleanup; + + while ((py_config = PyIter_Next(py_config_tuple_iterator)) != NULL) { + py_splitted = PyUnicode_Split(py_config, py_separator, 1); + if (py_splitted == NULL) + goto cleanup; + + PyObject *py_key = PyList_GetItem(py_splitted, 0); // borrowed ref + if (py_key == NULL) + goto cleanup; + + PyObject *py_value = PyList_GetItem(py_splitted, 1); + if (py_value == NULL) { // skip values without a key + Py_CLEAR(py_config); + Py_CLEAR(py_splitted); + PyErr_Clear(); + continue; + } + + if (PyDict_SetItem(py_result, py_key, py_value) != 0) { + goto cleanup; + } + + Py_CLEAR(py_config); + Py_CLEAR(py_splitted); + } + +cleanup: + Py_CLEAR(py_config_tuple_iterator); + Py_CLEAR(py_config); + Py_CLEAR(py_splitted); + Py_CLEAR(py_separator); + + if (PyErr_Occurred()) { + Py_CLEAR(py_result); + } + + py_debug_python_result("sudo", "options_as_dict", py_result, PYTHON_DEBUG_C_CALLS); + debug_return_ptr(py_result); +} + +static PyObject * +python_sudo_options_from_dict(PyObject *py_self, PyObject *py_args) +{ + (void) py_self; + debug_decl(python_sudo_options_from_dict, PYTHON_DEBUG_C_CALLS); + py_debug_python_call("sudo", "options_from_dict", py_args, NULL, PYTHON_DEBUG_C_CALLS); + + PyObject *py_config_dict = NULL, + *py_result = NULL; + + if (!PyArg_ParseTuple(py_args, "O!:sudo.options_from_dict", &PyDict_Type, &py_config_dict)) + goto cleanup; + + Py_ssize_t dict_size = PyDict_Size(py_config_dict); + py_result = PyTuple_New(dict_size); + if (py_result == NULL) + goto cleanup; + + PyObject *py_key = NULL, *py_value = NULL; // -> borrowed references + Py_ssize_t i, pos = 0; + for (i = 0; PyDict_Next(py_config_dict, &pos, &py_key, &py_value); i++) { + PyObject *py_config = PyUnicode_FromFormat("%S%s%S", py_key, "=", py_value); + if (py_config == NULL) + goto cleanup; + + /* Dictionaries are sparse so we cannot use pos as an index. */ + if (PyTuple_SetItem(py_result, i, py_config) != 0) { // this steals a reference, even on error + goto cleanup; + } + } + +cleanup: + if (PyErr_Occurred()) { + Py_CLEAR(py_result); + } + + py_debug_python_result("sudo", "options_from_dict", py_result, PYTHON_DEBUG_C_CALLS); + debug_return_ptr(py_result); +} + +static PyObject * +python_sudo_log_info(PyObject *py_self, PyObject *py_args, PyObject *py_kwargs) +{ + return python_sudo_log(SUDO_CONV_INFO_MSG, py_self, py_args, py_kwargs); +} + +static PyObject * +python_sudo_log_error(PyObject *py_self, PyObject *py_args, PyObject *py_kwargs) +{ + return python_sudo_log(SUDO_CONV_ERROR_MSG, py_self, py_args, py_kwargs); +} + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +static int py_expect_arg_callable(PyObject *py_callable, + const char *func_name, const char *arg_name) +{ + debug_decl(py_expect_arg_callable, PYTHON_DEBUG_INTERNAL); + + if (!PyCallable_Check(py_callable)) { + PyErr_Format(PyExc_ValueError, "%s: %s argument must be python callable (got %s) ", + func_name, arg_name, Py_TYPENAME(py_callable)); + debug_return_int(-1); + } + + debug_return_int(0); +} + +struct py_conv_callback_closure +{ + PyObject *py_on_suspend; + PyObject *py_on_resume; +}; + +static int +_call_conversation_callback(PyObject *py_callback, int signo) +{ + debug_decl(_call_conversation_callback, PYTHON_DEBUG_INTERNAL); + + if (py_callback == NULL || py_callback == Py_None) + debug_return_int(0); // nothing to do + + PyObject *py_result = PyObject_CallFunction(py_callback, "(i)", signo); + + int rc = -1; + + // We treat sudo.RC_OK (1) and None (no exception occurred) as success as well to avoid confusion + if (py_result && (py_result == Py_None || PyLong_AsLong(py_result) >= 0)) + rc = 0; + + Py_CLEAR(py_result); + + if (rc != 0) + py_log_last_error("Error during conversation callback"); + + debug_return_int(rc); +} + +int +python_sudo_conversation_suspend_cb(int signo, struct py_conv_callback_closure *closure) +{ + return _call_conversation_callback(closure->py_on_suspend, signo); +} + +int +python_sudo_conversation_resume_cb(int signo, struct py_conv_callback_closure *closure) +{ + return _call_conversation_callback(closure->py_on_resume, signo); +} + +static PyObject * +python_sudo_conversation(PyObject *Py_UNUSED(self), PyObject *py_args, PyObject *py_kwargs) +{ + debug_decl(python_sudo_conversation, PYTHON_DEBUG_C_CALLS); + py_debug_python_call("sudo", "conv", py_args, py_kwargs, PYTHON_DEBUG_C_CALLS); + + PyObject *py_result = NULL, *py_empty = NULL; + Py_ssize_t num_msgs = 0; + struct sudo_conv_message *msgs = NULL; + struct sudo_conv_reply *replies = NULL; + + // Note, they are both borrowed references of py_kwargs + struct py_conv_callback_closure callback_closure = { NULL, NULL }; + + struct sudo_conv_callback callback = { + SUDO_CONV_CALLBACK_VERSION, + &callback_closure, + (sudo_conv_callback_fn_t)python_sudo_conversation_suspend_cb, + (sudo_conv_callback_fn_t)python_sudo_conversation_resume_cb + }; + + py_empty = PyTuple_New(0); + if (py_empty == NULL) + goto cleanup; + + static char *keywords[] = { "on_suspend", "on_resume", NULL }; + if (py_kwargs != NULL && !PyArg_ParseTupleAndKeywords(py_empty, py_kwargs, "|OO:sudo.conv", keywords, + &callback_closure.py_on_suspend, + &callback_closure.py_on_resume)) + goto cleanup; + + if (callback_closure.py_on_suspend != NULL && + py_expect_arg_callable(callback_closure.py_on_suspend, "sudo.conv", "on_suspend") < 0) { + goto cleanup; + } + + if (callback_closure.py_on_resume != NULL && + py_expect_arg_callable(callback_closure.py_on_resume, "sudo.conv", "on_resume") < 0) { + goto cleanup; + } + + if (sudo_module_ConvMessages_to_c(py_args, &num_msgs, &msgs) < 0) { + goto cleanup; + } + + replies = calloc(Py_SSIZE2SIZE(num_msgs), sizeof(struct sudo_conv_reply)); + if (replies == NULL) + goto cleanup; + py_result = PyTuple_New(num_msgs); + if (py_result == NULL) + goto cleanup; + + if (py_ctx.sudo_conv == NULL) { + PyErr_Format(sudo_exc_SudoException, "%s: conversation is unavailable", + __func__); + goto cleanup; + } + + int rc = py_sudo_conv((int)num_msgs, msgs, replies, &callback); + if (rc != 0) { + PyErr_Format(sudo_exc_ConversationInterrupted, + "%s: conversation was interrupted", __func__, rc); + goto cleanup; + } + + for (Py_ssize_t i = 0; i < num_msgs; ++i) { + char *reply = replies[i].reply; + if (reply != NULL) { + PyObject *py_reply = PyUnicode_FromString(reply); + if (py_reply == NULL) { + goto cleanup; + } + + if (PyTuple_SetItem(py_result, i, py_reply) != 0) { // this steals a reference even on error + PyErr_Format(sudo_exc_SudoException, "%s: failed to set tuple item", __func__); + goto cleanup; + } + + sudo_debug_printf(SUDO_DEBUG_DIAG, "user reply for conversation: '%s'\n", reply); + } + } + +cleanup: + Py_CLEAR(py_empty); + if (replies != NULL) { + for (int i = 0; i < num_msgs; ++i) + free(replies[i].reply); + } + free(msgs); + free(replies); + + if (PyErr_Occurred()) { + Py_CLEAR(py_result); // we return NULL + } + + py_debug_python_result("sudo", "conv", py_result, PYTHON_DEBUG_C_CALLS); + + debug_return_ptr(py_result); +} + +/* + * Create a python class. + * Class name must be a full name including module, eg. "sudo.MyFavouriteClass". + * The resulting class object can be added to a module using PyModule_AddObject. + */ +PyObject * +sudo_module_create_class(const char *class_name, PyMethodDef *class_methods, + PyObject *base_class) +{ + debug_decl(sudo_module_create_class, PYTHON_DEBUG_INTERNAL); + + PyObject *py_base_classes = NULL, *py_class = NULL, *py_member_dict = NULL; + + if (base_class == NULL) { + py_base_classes = PyTuple_New(0); + } else { + py_base_classes = Py_BuildValue("(O)", base_class); + } + + if (py_base_classes == NULL) + goto cleanup; + + py_member_dict = PyDict_New(); + if (py_member_dict == NULL) + goto cleanup; + + for (PyMethodDef *py_def = class_methods; py_def->ml_name != NULL; ++py_def) { + PyObject *py_func = PyCFunction_New(py_def, NULL); + if (py_func == NULL) { + goto cleanup; + } + + // this wrapping makes the function get the 'self' as argument + PyObject *py_method = PyInstanceMethod_New(py_func); + if (py_method == NULL) { + Py_DECREF(py_func); + goto cleanup; + } + + int rc = PyDict_SetItemString(py_member_dict, py_def->ml_name, py_method); + + Py_XDECREF(py_func); + Py_XDECREF(py_method); + + if (rc != 0) + goto cleanup; + } + + py_class = PyObject_CallFunction((PyObject *)&PyType_Type, "(sOO)", + class_name, + py_base_classes, + py_member_dict); + +cleanup: + Py_CLEAR(py_base_classes); + Py_CLEAR(py_member_dict); + + debug_return_ptr(py_class); +} + +CPYCHECKER_STEALS_REFERENCE_TO_ARG(3) +void +sudo_module_register_enum(PyObject *py_module, const char *enum_name, PyObject *py_constants_dict) +{ + // pseudo code: + // return enum.IntEnum('MyEnum', {'DEFINITION_NAME': DEFINITION_VALUE, ...}) + + debug_decl(sudo_module_register_enum, PYTHON_DEBUG_INTERNAL); + + if (py_constants_dict == NULL) + return; + + PyObject *py_enum_class = NULL; + { + PyObject *py_enum_module = PyImport_ImportModule("enum"); + if (py_enum_module == NULL) { + Py_CLEAR(py_constants_dict); + debug_return; + } + + py_enum_class = PyObject_CallMethod(py_enum_module, + "IntEnum", "sO", enum_name, + py_constants_dict); + + Py_CLEAR(py_constants_dict); + Py_CLEAR(py_enum_module); + } + + if (py_enum_class == NULL) { + debug_return; + } + + if (PyModule_AddObject(py_module, enum_name, py_enum_class) < 0) { + Py_CLEAR(py_enum_class); + debug_return; + } + + debug_return; +} + +PyMODINIT_FUNC +sudo_module_init(void) +{ + debug_decl(sudo_module_init, PYTHON_DEBUG_C_CALLS); + + PyObject *py_module = PyModule_Create(&sudo_module); + + if (py_module == NULL) + debug_return_ptr(NULL); + + // Note: "PyModule_AddObject()" decrements the refcount only on success + + // exceptions + #define MODULE_ADD_EXCEPTION(exception_name, base_exception) \ + do { \ + EXC_VAR(exception_name) = PyErr_NewException("sudo." # exception_name, base_exception, NULL); \ + if (EXC_VAR(exception_name) == NULL || PyModule_AddObject(py_module, # exception_name, EXC_VAR(exception_name)) < 0) { \ + Py_CLEAR(EXC_VAR(exception_name)); \ + goto cleanup; \ + } \ + Py_INCREF(EXC_VAR(exception_name)); \ + } while(0); + + MODULE_ADD_EXCEPTION(SudoException, NULL); + + MODULE_ADD_EXCEPTION(PluginException, NULL); + MODULE_ADD_EXCEPTION(PluginError, EXC_VAR(PluginException)); + MODULE_ADD_EXCEPTION(PluginReject, EXC_VAR(PluginException)); + + MODULE_ADD_EXCEPTION(ConversationInterrupted, EXC_VAR(SudoException)); + + #define MODULE_REGISTER_ENUM(name, key_values) \ + sudo_module_register_enum(py_module, name, py_dict_create_string_int(\ + sizeof(key_values) / sizeof(struct key_value_str_int), key_values)) + + // constants + struct key_value_str_int constants_rc[] = { + {"OK", SUDO_RC_OK}, + {"ACCEPT", SUDO_RC_ACCEPT}, + {"REJECT", SUDO_RC_REJECT}, + {"ERROR", SUDO_RC_ERROR}, + {"USAGE_ERROR", SUDO_RC_USAGE_ERROR} + }; + MODULE_REGISTER_ENUM("RC", constants_rc); + + struct key_value_str_int constants_conv[] = { + {"PROMPT_ECHO_OFF", SUDO_CONV_PROMPT_ECHO_OFF}, + {"PROMPT_ECHO_ON", SUDO_CONV_PROMPT_ECHO_ON}, + {"INFO_MSG", SUDO_CONV_INFO_MSG}, + {"PROMPT_MASK", SUDO_CONV_PROMPT_MASK}, + {"PROMPT_ECHO_OK", SUDO_CONV_PROMPT_ECHO_OK}, + {"PREFER_TTY", SUDO_CONV_PREFER_TTY} + }; + MODULE_REGISTER_ENUM("CONV", constants_conv); + + struct key_value_str_int constants_debug[] = { + {"CRIT", SUDO_DEBUG_CRIT}, + {"ERROR", SUDO_DEBUG_ERROR}, + {"WARN", SUDO_DEBUG_WARN}, + {"NOTICE", SUDO_DEBUG_NOTICE}, + {"DIAG", SUDO_DEBUG_DIAG}, + {"INFO", SUDO_DEBUG_INFO}, + {"TRACE", SUDO_DEBUG_TRACE}, + {"DEBUG", SUDO_DEBUG_DEBUG} + }; + MODULE_REGISTER_ENUM("DEBUG", constants_debug); + + struct key_value_str_int constants_exit_reason[] = { + {"NO_STATUS", SUDO_PLUGIN_NO_STATUS}, + {"WAIT_STATUS", SUDO_PLUGIN_WAIT_STATUS}, + {"EXEC_ERROR", SUDO_PLUGIN_EXEC_ERROR}, + {"SUDO_ERROR", SUDO_PLUGIN_SUDO_ERROR} + }; + MODULE_REGISTER_ENUM("EXIT_REASON", constants_exit_reason); + + struct key_value_str_int constants_plugin_types[] = { + {"POLICY", SUDO_POLICY_PLUGIN}, + {"AUDIT", SUDO_AUDIT_PLUGIN}, + {"IO", SUDO_IO_PLUGIN}, + {"APPROVAL", SUDO_APPROVAL_PLUGIN}, + {"SUDO", SUDO_FRONT_END} + }; + MODULE_REGISTER_ENUM("PLUGIN_TYPE", constants_plugin_types); + + // classes + if (sudo_module_register_conv_message(py_module) != SUDO_RC_OK) + goto cleanup; + + if (sudo_module_register_baseplugin(py_module) != SUDO_RC_OK) + goto cleanup; + + if (sudo_module_register_loghandler(py_module) != SUDO_RC_OK) + goto cleanup; + +cleanup: + if (PyErr_Occurred()) { + Py_CLEAR(py_module); + Py_CLEAR(sudo_exc_SudoException); + Py_CLEAR(sudo_exc_PluginError); + Py_CLEAR(sudo_exc_ConversationInterrupted); + } + + debug_return_ptr(py_module); +} diff --git a/plugins/python/sudo_python_module.h b/plugins/python/sudo_python_module.h new file mode 100644 index 0000000..a6c4f04 --- /dev/null +++ b/plugins/python/sudo_python_module.h @@ -0,0 +1,64 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Robert Manner + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_PYTHON_MODULE_H +#define SUDO_PYTHON_MODULE_H + +#include "pyhelpers.h" + +extern PyObject *sudo_exc_SudoException; // Base exception for the sudo module problems + +// This is for the python plugins to report error messages for us +extern PyObject *sudo_exc_PluginException; // base exception of the following: +extern PyObject *sudo_exc_PluginReject; // a reject with message +extern PyObject *sudo_exc_PluginError; // an error with message + +extern PyTypeObject *sudo_type_Plugin; +extern PyTypeObject *sudo_type_ConvMessage; + +extern PyObject *sudo_type_LogHandler; + +PyObject *sudo_module_create_class(const char *class_name, PyMethodDef *class_methods, + PyObject *base_class); + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +int sudo_module_register_importblocker(void); + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +int sudo_module_register_conv_message(PyObject *py_module); + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +int sudo_module_ConvMessage_to_c(PyObject *py_conv_message, struct sudo_conv_message *conv_message); + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +int sudo_module_ConvMessages_to_c(PyObject *py_tuple, Py_ssize_t *num_msgs, struct sudo_conv_message **msgs); + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +int sudo_module_register_baseplugin(PyObject *py_module); + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +int sudo_module_register_loghandler(PyObject *py_module); + +CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +int sudo_module_set_default_loghandler(void); + +PyObject *python_sudo_debug(PyObject *py_self, PyObject *py_args); + +PyMODINIT_FUNC sudo_module_init(void); + +#endif // SUDO_PYTHON_MODULE_H diff --git a/plugins/sample/Makefile.in b/plugins/sample/Makefile.in new file mode 100644 index 0000000..82bcfd7 --- /dev/null +++ b/plugins/sample/Makefile.in @@ -0,0 +1,210 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2011-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +abs_srcdir = @abs_srcdir@ +top_srcdir = @top_srcdir@ +abs_top_srcdir = @abs_top_srcdir@ +top_builddir = @top_builddir@ +abs_top_builddir = @abs_top_builddir@ +devdir = @devdir@ +scriptdir = $(top_srcdir)/scripts +incdir = $(top_srcdir)/include +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LIBS = $(top_builddir)/lib/util/libsudo_util.la + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ +plugindir = @plugindir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/sample_plugin.exp +shlib_map = sample_plugin.map +shlib_opt = sample_plugin.opt + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +OBJS = sample_plugin.lo + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +all: sample_plugin.la + +depend: + $(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \ + --builddir=$(abs_top_builddir) plugins/sample/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sample/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sample/Makefile + +.SUFFIXES: .c .h .i .lo .plog + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +sample_plugin.la: $(OBJS) @LT_LDDEP@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(OBJS) $(LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so + +pre-install: + +install: install-plugin + +install-dirs: + $(SHELL) $(scriptdir)/mkinstalldirs $(DESTDIR)$(plugindir) + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: install-dirs sample_plugin.la + if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) sample_plugin.la $(DESTDIR)$(plugindir); \ + fi + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/sample_plugin.la + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(plugindir)/sample_plugin.so$(INSTALL_BACKUP) + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la + -rm -f *.i *.plog stamp-* core *.core core.* + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs $(shlib_map) $(shlib_opt) + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +sample_plugin.lo: $(srcdir)/sample_plugin.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sample_plugin.c +sample_plugin.i: $(srcdir)/sample_plugin.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sample_plugin.plog: sample_plugin.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sample_plugin.c --i-file $< --output-file $@ diff --git a/plugins/sample/README b/plugins/sample/README new file mode 100644 index 0000000..45c2b78 --- /dev/null +++ b/plugins/sample/README @@ -0,0 +1,23 @@ +This is a sample sudo policy plugin. See the sudo_plugin manual for +information on writing your own plugin. + +The sample policy plugin is not built or installed by default. To +build and install the plugin, change to the plugins/sample directory +and run "make". It can be installed by running "make install" as +the superuser from the same directory. + +To actually use the sample plugin, you'll need to modify the +/etc/sudo.conf file. Caution: you should not make changes to +/etc/sudo.conf without also having a root shell open repair things +in case of an error. To enable the plugin, first comment out any +existing policy Plugin line in /etc/sudo.conf, for example: + + Plugin sudoers_policy sudoers.so + +Then add a line for the sample plugin: + + Plugin sample_policy sample_plugin.so + +You may need to create /etc/sudo.conf if it does not already exist. + +Note that you may only have a single policy plugin defined. diff --git a/plugins/sample/sample_plugin.c b/plugins/sample/sample_plugin.c new file mode 100644 index 0000000..1b57e9c --- /dev/null +++ b/plugins/sample/sample_plugin.c @@ -0,0 +1,492 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "pathnames.h" +#include "sudo_compat.h" +#include "sudo_plugin.h" +#include "sudo_util.h" + +/* + * Sample plugin module that allows any user who knows the password + * ("test") to run any command as root. Since there is no credential + * caching the validate and invalidate functions are NULL. + */ + +static struct plugin_state { + char **envp; + char * const *settings; + char * const *user_info; +} plugin_state; +static sudo_conv_t sudo_conv; +static sudo_printf_t sudo_log; +static FILE *input, *output; +static uid_t runas_uid = ROOT_UID; +static gid_t runas_gid = -1; +static int use_sudoedit = false; + +/* + * Plugin policy open function. + */ +static int +policy_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const user_env[], char * const args[]) +{ + char * const *ui; + struct passwd *pw; + const char *runas_user = NULL; + struct group *gr; + const char *runas_group = NULL; + + if (!sudo_conv) + sudo_conv = conversation; + if (!sudo_log) + sudo_log = sudo_printf; + + if (SUDO_API_VERSION_GET_MAJOR(version) != SUDO_API_VERSION_MAJOR) { + sudo_log(SUDO_CONV_ERROR_MSG, + "the sample plugin requires API version %d.x\n", + SUDO_API_VERSION_MAJOR); + return -1; + } + + /* Only allow commands to be run as root. */ + for (ui = settings; *ui != NULL; ui++) { + if (strncmp(*ui, "runas_user=", sizeof("runas_user=") - 1) == 0) { + runas_user = *ui + sizeof("runas_user=") - 1; + } + if (strncmp(*ui, "runas_group=", sizeof("runas_group=") - 1) == 0) { + runas_group = *ui + sizeof("runas_group=") - 1; + } + if (strncmp(*ui, "progname=", sizeof("progname=") - 1) == 0) { + initprogname(*ui + sizeof("progname=") - 1); + } + /* Check to see if sudo was called as sudoedit or with -e flag. */ + if (strncmp(*ui, "sudoedit=", sizeof("sudoedit=") - 1) == 0) { + if (strcasecmp(*ui + sizeof("sudoedit=") - 1, "true") == 0) + use_sudoedit = true; + } + /* This plugin doesn't support running sudo with no arguments. */ + if (strncmp(*ui, "implied_shell=", sizeof("implied_shell=") - 1) == 0) { + if (strcasecmp(*ui + sizeof("implied_shell=") - 1, "true") == 0) + return -2; /* usage error */ + } + } + if (runas_user != NULL) { + if ((pw = getpwnam(runas_user)) == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unknown user %s\n", runas_user); + return 0; + } + runas_uid = pw->pw_uid; + } + if (runas_group != NULL) { + if ((gr = getgrnam(runas_group)) == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unknown group %s\n", runas_group); + return 0; + } + runas_gid = gr->gr_gid; + } + + /* Plugin state. */ + plugin_state.envp = (char **)user_env; + plugin_state.settings = settings; + plugin_state.user_info = user_info; + + return 1; +} + +static char * +find_in_path(char *command, char **envp) +{ + struct stat sb; + char *path, *path0, **ep, *cp; + char pathbuf[PATH_MAX], *qualified = NULL; + + if (strchr(command, '/') != NULL) + return command; + + path = _PATH_DEFPATH; + for (ep = plugin_state.envp; *ep != NULL; ep++) { + if (strncmp(*ep, "PATH=", 5) == 0) { + path = *ep + 5; + break; + } + } + path = path0 = strdup(path); + do { + if ((cp = strchr(path, ':'))) + *cp = '\0'; + snprintf(pathbuf, sizeof(pathbuf), "%s/%s", *path ? path : ".", + command); + if (stat(pathbuf, &sb) == 0) { + if (S_ISREG(sb.st_mode) && (sb.st_mode & 0000111)) { + qualified = pathbuf; + break; + } + } + path = cp + 1; + } while (cp != NULL); + free(path0); + return qualified ? strdup(qualified) : NULL; +} + +static int +check_passwd(void) +{ + struct sudo_conv_message msg; + struct sudo_conv_reply repl; + + /* Prompt user for password via conversation function. */ + memset(&msg, 0, sizeof(msg)); + msg.msg_type = SUDO_CONV_PROMPT_ECHO_OFF; + msg.msg = "Password: "; + memset(&repl, 0, sizeof(repl)); + sudo_conv(1, &msg, &repl, NULL); + if (repl.reply == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "missing password\n"); + return false; + } + if (strcmp(repl.reply, "test") != 0) { + sudo_log(SUDO_CONV_ERROR_MSG, "incorrect password\n"); + return false; + } + return true; +} + +static char ** +build_command_info(const char *command) +{ + static char **command_info; + int i = 0; + + /* Setup command info. */ + command_info = calloc(32, sizeof(char *)); + if (command_info == NULL) + return NULL; + if ((command_info[i++] = sudo_new_key_val("command", command)) == NULL || + asprintf(&command_info[i++], "runas_euid=%ld", (long)runas_uid) == -1 || + asprintf(&command_info[i++], "runas_uid=%ld", (long)runas_uid) == -1) { + return NULL; + } + if (runas_gid != (gid_t)-1) { + if (asprintf(&command_info[i++], "runas_gid=%ld", (long)runas_gid) == -1 || + asprintf(&command_info[i++], "runas_egid=%ld", (long)runas_gid) == -1) { + return NULL; + } + } + if (use_sudoedit) { + command_info[i] = strdup("sudoedit=true"); + if (command_info[i++] == NULL) + return NULL; + } +#ifdef USE_TIMEOUT + command_info[i++] = "timeout=30"; +#endif + return command_info; +} + +static char * +find_editor(int nfiles, char * const files[], char **argv_out[]) +{ + char *cp, *last, **ep, **nargv, *editor, *editor_path; + int ac, i, nargc, wasblank; + + /* Lookup EDITOR in user's environment. */ + editor = _PATH_VI; + for (ep = plugin_state.envp; *ep != NULL; ep++) { + if (strncmp(*ep, "EDITOR=", 7) == 0) { + editor = *ep + 7; + break; + } + } + editor = strdup(editor); + if (editor == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unable to allocate memory\n"); + return NULL; + } + + /* + * Split editor into an argument vector; editor is reused (do not free). + * The EDITOR environment variables may contain command + * line args so look for those and alloc space for them too. + */ + nargc = 1; + for (wasblank = 0, cp = editor; *cp != '\0'; cp++) { + if (isblank((unsigned char) *cp)) + wasblank = 1; + else if (wasblank) { + wasblank = 0; + nargc++; + } + } + /* If we can't find the editor in the user's PATH, give up. */ + cp = strtok_r(editor, " \t", &last); + if (cp == NULL || + (editor_path = find_in_path(editor, plugin_state.envp)) == NULL) { + free(editor); + return NULL; + } + if (editor_path != editor) + free(editor); + nargv = malloc((nargc + 1 + nfiles + 1) * sizeof(char *)); + if (nargv == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unable to allocate memory\n"); + free(editor_path); + return NULL; + } + for (ac = 0; cp != NULL && ac < nargc; ac++) { + nargv[ac] = cp; + cp = strtok_r(NULL, " \t", &last); + } + nargv[ac++] = "--"; + for (i = 0; i < nfiles; ) + nargv[ac++] = files[i++]; + nargv[ac] = NULL; + + *argv_out = nargv; + return editor_path; +} + +/* + * Plugin policy check function. + * Simple example that prompts for a password, hard-coded to "test". + */ +static int +policy_check(int argc, char * const argv[], + char *env_add[], char **command_info_out[], + char **argv_out[], char **user_env_out[]) +{ + char *command; + + if (!argc || argv[0] == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "no command specified\n"); + return false; + } + + if (!check_passwd()) + return false; + + command = find_in_path(argv[0], plugin_state.envp); + if (command == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "%s: command not found\n", argv[0]); + return false; + } + + /* If "sudo vi" is run, auto-convert to sudoedit. */ + if (strcmp(command, _PATH_VI) == 0) + use_sudoedit = true; + + if (use_sudoedit) { + /* Rebuild argv using editor */ + free(command); + command = find_editor(argc - 1, argv + 1, argv_out); + if (command == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unable to find valid editor\n"); + return -1; + } + use_sudoedit = true; + } else { + /* No changes needd to argv */ + *argv_out = (char **)argv; + } + + /* No changes to envp */ + *user_env_out = plugin_state.envp; + + /* Setup command info. */ + *command_info_out = build_command_info(command); + free(command); + if (*command_info_out == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "out of memory\n"); + return -1; + } + + return true; +} + +static int +policy_list(int argc, char * const argv[], int verbose, const char *list_user) +{ + /* + * List user's capabilities. + */ + sudo_log(SUDO_CONV_INFO_MSG, "Validated users may run any command\n"); + return true; +} + +static int +policy_version(int verbose) +{ + sudo_log(SUDO_CONV_INFO_MSG, "Sample policy plugin version %s\n", PACKAGE_VERSION); + return true; +} + +static void +policy_close(int exit_status, int error) +{ + /* + * The policy might log the command exit status here. + * In this example, we just print a message. + */ + if (error) { + sudo_log(SUDO_CONV_ERROR_MSG, "Command error: %s\n", strerror(error)); + } else { + if (WIFEXITED(exit_status)) { + sudo_log(SUDO_CONV_INFO_MSG, "Command exited with status %d\n", + WEXITSTATUS(exit_status)); + } else if (WIFSIGNALED(exit_status)) { + sudo_log(SUDO_CONV_INFO_MSG, "Command killed by signal %d\n", + WTERMSIG(exit_status)); + } + } +} + +static int +io_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const command_info[], + int argc, char * const argv[], char * const user_env[], char * const args[]) +{ + int fd; + char path[PATH_MAX]; + + if (!sudo_conv) + sudo_conv = conversation; + if (!sudo_log) + sudo_log = sudo_printf; + + /* Open input and output files. */ + snprintf(path, sizeof(path), "/var/tmp/sample-%u.output", + (unsigned int)getpid()); + fd = open(path, O_WRONLY|O_CREAT|O_EXCL, 0644); + if (fd == -1) + return false; + output = fdopen(fd, "w"); + + snprintf(path, sizeof(path), "/var/tmp/sample-%u.input", + (unsigned int)getpid()); + fd = open(path, O_WRONLY|O_CREAT|O_EXCL, 0644); + if (fd == -1) + return false; + input = fdopen(fd, "w"); + + return true; +} + +static void +io_close(int exit_status, int error) +{ + fclose(input); + fclose(output); +} + +static int +io_version(int verbose) +{ + sudo_log(SUDO_CONV_INFO_MSG, "Sample I/O plugin version %s\n", + PACKAGE_VERSION); + return true; +} + +static int +io_log_input(const char *buf, unsigned int len) +{ + ignore_result(fwrite(buf, len, 1, input)); + return true; +} + +static int +io_log_output(const char *buf, unsigned int len) +{ + const char *cp, *ep; + bool ret = true; + + ignore_result(fwrite(buf, len, 1, output)); + /* + * If we find the string "honk!" in the buffer, reject it. + * In practice we'd want to be able to detect the word + * broken across two buffers. + */ + for (cp = buf, ep = buf + len; cp < ep; cp++) { + if (cp + 5 < ep && memcmp(cp, "honk!", 5) == 0) { + ret = false; + break; + } + } + return ret; +} + +sudo_dso_public struct policy_plugin sample_policy = { + SUDO_POLICY_PLUGIN, + SUDO_API_VERSION, + policy_open, + policy_close, + policy_version, + policy_check, + policy_list, + NULL, /* validate */ + NULL, /* invalidate */ + NULL, /* init_session */ + NULL, /* register_hooks */ + NULL /* deregister_hooks */ +}; + +/* + * Note: This plugin does not differentiate between tty and pipe I/O. + * It all gets logged to the same file. + */ +sudo_dso_public struct io_plugin sample_io = { + SUDO_IO_PLUGIN, + SUDO_API_VERSION, + io_open, + io_close, + io_version, + io_log_input, /* tty input */ + io_log_output, /* tty output */ + io_log_input, /* command stdin if not tty */ + io_log_output, /* command stdout if not tty */ + io_log_output /* command stderr if not tty */ +}; diff --git a/plugins/sample/sample_plugin.exp b/plugins/sample/sample_plugin.exp new file mode 100644 index 0000000..9f85094 --- /dev/null +++ b/plugins/sample/sample_plugin.exp @@ -0,0 +1,2 @@ +sample_policy +sample_io diff --git a/plugins/sample_approval/Makefile.in b/plugins/sample_approval/Makefile.in new file mode 100644 index 0000000..3e876b1 --- /dev/null +++ b/plugins/sample_approval/Makefile.in @@ -0,0 +1,220 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2020 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +devdir = @devdir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +scriptdir = $(top_srcdir)/scripts +incdir = $(top_srcdir)/include +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LT_LIBS = $(top_builddir)/lib/util/libsudo_util.la +LIBS = $(LT_LIBS) + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ +plugindir = @plugindir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/sample_approval.exp +shlib_map = sample_approval.map +shlib_opt = sample_approval.opt + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +OBJS = sample_approval.lo + +IOBJS = $(OBJS:.lo=.i) + +POBJS = $(IOBJS:.i=.plog) + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +all: sample_approval.la + +depend: + $(scriptdir)/mkdep.pl --srcdir=$(top_srcdir) \ + --builddir=`pwd`/$(top_builddir) plugins/sample_approval/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sample_approval/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sample_approval/Makefile + +.SUFFIXES: .c .h .i .lo .plog + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +sample_approval.la: $(OBJS) $(LT_LIBS) @LT_LDDEP@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(OBJS) $(LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so + +pre-install: + +install: install-plugin + +install-dirs: + $(SHELL) $(scriptdir)/mkinstalldirs $(DESTDIR)$(plugindir) + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: install-dirs sample_approval.la + if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) sample_approval.la $(DESTDIR)$(plugindir); \ + fi + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/sample_approval.la + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(plugindir)/sample_approval.so$(INSTALL_BACKUP) + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a *.i *.plog \ + stamp-* core *.core core.* + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs $(shlib_map) $(shlib_opt) + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +getgrent.lo: $(srcdir)/getgrent.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/getgrent.c +getgrent.i: $(srcdir)/getgrent.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +getgrent.plog: getgrent.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/getgrent.c --i-file $< --output-file $@ +sample_approval.lo: $(srcdir)/sample_approval.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sample_approval.c +sample_approval.i: $(srcdir)/sample_approval.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sample_approval.plog: sample_approval.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sample_approval.c --i-file $< --output-file $@ diff --git a/plugins/sample_approval/sample_approval.c b/plugins/sample_approval/sample_approval.c new file mode 100644 index 0000000..c4634c1 --- /dev/null +++ b/plugins/sample_approval/sample_approval.c @@ -0,0 +1,169 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_conf.h" +#include "sudo_debug.h" +#include "sudo_fatal.h" +#include "sudo_gettext.h" +#include "sudo_plugin.h" +#include "sudo_util.h" + +static int approval_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; +sudo_printf_t sudo_printf; + +static int +sample_approval_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t plugin_printf, char * const settings[], + char * const user_info[], int submit_optind, char * const submit_argv[], + char * const submit_envp[], char * const plugin_options[], + const char **errstr) +{ + struct sudo_conf_debug_file_list debug_files = + TAILQ_HEAD_INITIALIZER(debug_files); + struct sudo_debug_file *debug_file; + const char *cp, *plugin_path = NULL; + char * const *cur; + int ret = -1; + debug_decl_vars(sample_approval_open, SUDO_DEBUG_PLUGIN); + + sudo_printf = plugin_printf; + + /* Initialize the debug subsystem. */ + for (cur = settings; (cp = *cur) != NULL; cur++) { + if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) { + cp += sizeof("debug_flags=") - 1; + if (sudo_debug_parse_flags(&debug_files, cp) == -1) + goto oom; + continue; + } + if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) { + plugin_path = cp + sizeof("plugin_path=") - 1; + continue; + } + } + if (plugin_path != NULL && !TAILQ_EMPTY(&debug_files)) { + approval_debug_instance = + sudo_debug_register(plugin_path, NULL, NULL, &debug_files); + if (approval_debug_instance == SUDO_DEBUG_INSTANCE_ERROR) { + *errstr = U_("unable to initialize debugging"); + goto done; + } + sudo_debug_enter(__func__, __FILE__, __LINE__, sudo_debug_subsys); + } + + ret = 1; + goto done; + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + *errstr = U_("unable to allocate memory"); + +done: + while ((debug_file = TAILQ_FIRST(&debug_files)) != NULL) { + TAILQ_REMOVE(&debug_files, debug_file, entries); + free(debug_file->debug_file); + free(debug_file->debug_flags); + free(debug_file); + } + + debug_return_int(ret); +} + +static void +sample_approval_close(void) +{ + debug_decl(sample_approval_close, SUDO_DEBUG_PLUGIN); + + /* Nothing here, we could store a NULL pointer instead. */ + + debug_return; +} + +static int +sample_approval_check(char * const command_info[], char * const run_argv[], + char * const run_envp[], const char **errstr) +{ + struct tm *tm; + time_t now; + int ret = 0; + debug_decl(sample_approval_check, SUDO_DEBUG_PLUGIN); + + /* + * Only approve requests that are within business hours, + * which are 9am - 5pm local time. Does not check holidays. + */ + if (time(&now) == -1 || (tm = localtime(&now)) == NULL) + goto done; + if (tm->tm_wday < 1 || tm->tm_wday > 5) { + /* bad weekday */ + goto done; + } + if (tm->tm_hour < 9 || tm->tm_hour > 17 || + (tm->tm_hour == 17 && tm->tm_min > 0)) { + /* bad hour */ + goto done; + } + ret = 1; + +done: + if (ret == 0) { + *errstr = U_("You are not allowed to use sudo outside business hours"); + sudo_printf(SUDO_CONV_ERROR_MSG, "%s\n", *errstr); + } + + debug_return_int(ret); +} + +static int +sample_approval_show_version(int verbose) +{ + debug_decl(approval_show_version, SUDO_DEBUG_PLUGIN); + + sudo_printf(SUDO_CONV_INFO_MSG, "sample approval plugin version %s\n", + PACKAGE_VERSION); + + debug_return_int(true); +} + +sudo_dso_public struct approval_plugin sample_approval = { + SUDO_APPROVAL_PLUGIN, + SUDO_API_VERSION, + sample_approval_open, + sample_approval_close, + sample_approval_check, + sample_approval_show_version +}; diff --git a/plugins/sample_approval/sample_approval.exp b/plugins/sample_approval/sample_approval.exp new file mode 100644 index 0000000..ea9cd65 --- /dev/null +++ b/plugins/sample_approval/sample_approval.exp @@ -0,0 +1 @@ +sample_approval diff --git a/plugins/sudoers/Makefile.in b/plugins/sudoers/Makefile.in new file mode 100644 index 0000000..5aeeae6 --- /dev/null +++ b/plugins/sudoers/Makefile.in @@ -0,0 +1,2706 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 1996, 1998-2005, 2007-2020 +# Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# Sponsored in part by the Defense Advanced Research Projects +# Agency (DARPA) and Air Force Research Laboratory, Air Force +# Materiel Command, USAF, under agreement number F39502-99-1-0512. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +abs_srcdir = @abs_srcdir@ +top_srcdir = @top_srcdir@ +abs_top_srcdir = @abs_top_srcdir@ +top_builddir = @top_builddir@ +abs_top_builddir = @abs_top_builddir@ +devdir = @devdir@ +scriptdir = $(top_srcdir)/scripts +authdir = $(srcdir)/auth +incdir = $(top_srcdir)/include +docdir = @docdir@ +libdir = @libdir@ +rundir = @rundir@ +vardir = @vardir@ +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +FLEX = @FLEX@ +YACC = @YACC@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LIBEVENTLOG = $(top_builddir)/lib/eventlog/libsudo_eventlog.la +LIBIOLOG = $(top_builddir)/lib/iolog/libsudo_iolog.la +LIBLOGSRV = @LIBLOGSRV@ +LIBUTIL = $(top_builddir)/lib/util/libsudo_util.la +LIBS = $(LIBUTIL) +NET_LIBS = @NET_LIBS@ +SUDOERS_LIBS = @SUDOERS_LIBS@ @AFS_LIBS@ @GETGROUPS_LIB@ @LIBTLS@ $(NET_LIBS) $(LIBIOLOG) $(LIBEVENTLOG) $(LIBLOGSRV) +REPLAY_LIBS = @REPLAY_LIBS@ $(LIBEVENTLOG) $(LIBIOLOG) +VISUDO_LIBS = $(NET_LIBS) +CVTSUDOERS_LIBS = $(NET_LIBS) +TESTSUDOERS_LIBS = $(NET_LIBS) + +# C preprocessor defines +CPPDEFS = -DLIBDIR=\"$(libdir)\" -DLOCALEDIR=\"$(localedir)\" \ + -D_PATH_SUDOERS=\"$(sudoersdir)/sudoers\" \ + -D_PATH_CVTSUDOERS_CONF=\"$(sysconfdir)/cvtsudoers.conf\" \ + -DSUDOERS_UID=$(sudoers_uid) -DSUDOERS_GID=$(sudoers_gid) \ + -DSUDOERS_MODE=$(sudoers_mode) + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(devdir) -I$(srcdir) \ + $(CPPDEFS) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @SUDOERS_LDFLAGS@ @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/sudoers.exp +shlib_map = sudoers.map +shlib_opt = sudoers.opt + +# Directory in which to install the sudoers plugin +plugindir = @plugindir@ + +# Directory in which to install the sudoers file +sudoersdir = $(sysconfdir) + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +# User, group, and mode the sudoers file should be "owned" by (configure) +sudoers_uid = @SUDOERS_UID@ +sudoers_gid = @SUDOERS_GID@ +sudoers_mode = @SUDOERS_MODE@ + +# Set to non-empty for development mode +DEVEL = @DEVEL@ + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +PROGS = sudoers.la visudo sudoreplay cvtsudoers testsudoers + +TEST_PROGS = check_addr check_base64 check_digest check_env_pattern \ + check_exptilde check_fill check_gentime check_hexchar \ + check_iolog_plugin check_starttime @SUDOERS_TEST_PROGS@ + +AUTH_OBJS = sudo_auth.lo @AUTH_OBJS@ + +LIBPARSESUDOERS_OBJS = alias.lo audit.lo base64.lo defaults.lo digestname.lo \ + exptilde.lo filedigest.lo gentime.lo gmtoff.lo gram.lo \ + hexchar.lo match.lo match_addr.lo match_command.lo \ + match_digest.lo pwutil.lo pwutil_impl.lo rcstr.lo \ + redblack.lo strlist.lo sudoers_debug.lo timeout.lo \ + timestr.lo toke.lo toke_util.lo + +LIBPARSESUDOERS_IOBJS = $(LIBPARSESUDOERS_OBJS:.lo=.i) passwd.i + +SUDOERS_OBJS = $(AUTH_OBJS) boottime.lo check.lo editor.lo env.lo \ + env_pattern.lo file.lo find_path.lo fmtsudoers.lo gc.lo \ + goodpath.lo group_plugin.lo interfaces.lo iolog.lo \ + iolog_path_escapes.lo locale.lo log_client.lo logging.lo \ + parse.lo policy.lo prompt.lo set_perms.lo starttime.lo \ + sudo_nss.lo sudoers.lo timestamp.lo @SUDOERS_OBJS@ + +SUDOERS_IOBJS = $(SUDOERS_OBJS:.lo=.i) + +VISUDO_OBJS = editor.lo find_path.lo goodpath.lo locale.lo stubs.o \ + sudo_printf.o visudo.o + +VISUDO_IOBJS = sudo_printf.i visudo.i + +CVTSUDOERS_OBJS = cvtsudoers.o cvtsudoers_json.o cvtsudoers_ldif.o \ + cvtsudoers_pwutil.o fmtsudoers.lo locale.lo parse_ldif.o \ + stubs.o sudo_printf.o ldap_util.lo + +CVTSUDOERS_IOBJS = cvtsudoers.i cvtsudoers_json.i cvtsudoers_ldif.i \ + cvtsudoers_pwutil.i + +REPLAY_OBJS = getdate.o sudoreplay.o + +REPLAY_IOBJS = $(REPLAY_OBJS:.o=.i) + +TEST_OBJS = fmtsudoers.lo group_plugin.lo interfaces.lo ldap_util.lo \ + locale.lo net_ifs.o parse_ldif.o sudo_printf.o \ + testsudoers.o tsgetgrpw.o + +IOBJS = $(LIBPARSESUDOERS_IOBJS) $(SUDOERS_IOBJS) $(VISUDO_IOBJS) \ + $(CVTSUDOERS_IOBJS) $(REPLAY_IOBJS) + +POBJS = $(IOBJS:.i=.plog) + +TSDUMP_OBJS = tsdump.o sudoers_debug.lo locale.lo + +CHECK_ADDR_OBJS = check_addr.o interfaces.lo match_addr.lo sudoers_debug.lo \ + sudo_printf.o + +CHECK_BASE64_OBJS = check_base64.o base64.lo sudoers_debug.lo + +CHECK_DIGEST_OBJS = check_digest.o filedigest.lo digestname.lo sudoers_debug.lo + +CHECK_ENV_MATCH_OBJS = check_env_pattern.o env_pattern.lo sudoers_debug.lo + +CHECK_EXPTILDE_OBJS = check_exptilde.o exptilde.lo pwutil.lo pwutil_impl.lo redblack.lo sudoers_debug.lo + +CHECK_FILL_OBJS = check_fill.o hexchar.lo toke_util.lo sudoers_debug.lo + +CHECK_GENTIME_OBJS = check_gentime.o gentime.lo gmtoff.lo sudoers_debug.lo + +CHECK_HEXCHAR_OBJS = check_hexchar.o hexchar.lo sudoers_debug.lo + +CHECK_IOLOG_PLUGIN_OBJS = check_iolog_plugin.o iolog.lo log_client.lo \ + locale.lo pwutil.lo pwutil_impl.lo redblack.lo \ + strlist.lo sudoers_debug.lo + +CHECK_SYMBOLS_OBJS = check_symbols.o + +CHECK_STARTTIME_OBJS = check_starttime.o starttime.lo sudoers_debug.lo + +VERSION = @PACKAGE_VERSION@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ + +all: $(PROGS) + +.SUFFIXES: .c .h .i .l .lo .o .plog .y + +.c.o: + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +# Prevent default rules from building .c files from .l and .y files +.l.c: + @true + +.y.c: + @true + +depend: + $(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \ + --builddir=$(abs_top_builddir) plugins/sudoers/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sudoers/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sudoers/Makefile + +libparsesudoers.la: $(LIBPARSESUDOERS_OBJS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(LIBPARSESUDOERS_OBJS) -no-install + +sudoers.la: $(SUDOERS_OBJS) $(LIBUTIL) $(LIBIOLOG) $(LIBLOGSRV) libparsesudoers.la @LT_LDDEP@ + case "$(LT_LDFLAGS)" in \ + *-no-install*) \ + $(LIBTOOL) $(LTFLAGS) @LT_STATIC@ --mode=link $(CC) $(LDFLAGS) $(LT_LDFLAGS) -o $@ $(SUDOERS_OBJS) libparsesudoers.la $(SUDOERS_LIBS) -module;; \ + *) \ + $(LIBTOOL) $(LTFLAGS) @LT_STATIC@ --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(SUDOERS_OBJS) libparsesudoers.la $(SUDOERS_LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so;; \ + esac + +visudo: libparsesudoers.la $(VISUDO_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(VISUDO_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) libparsesudoers.la $(LIBS) $(VISUDO_LIBS) + +cvtsudoers: libparsesudoers.la $(CVTSUDOERS_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CVTSUDOERS_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) libparsesudoers.la $(LIBS) $(CVTSUDOERS_LIBS) + +sudoreplay: timestr.lo $(REPLAY_OBJS) $(LIBUTIL) $(LIBIOLOG) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(REPLAY_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) timestr.lo $(REPLAY_LIBS) + +testsudoers: libparsesudoers.la $(TEST_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(TEST_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) libparsesudoers.la $(LIBS) $(TESTSUDOERS_LIBS) + +tsdump: $(TSDUMP_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(TSDUMP_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_addr: $(CHECK_ADDR_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_ADDR_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) $(NET_LIBS) + +check_base64: $(CHECK_BASE64_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_BASE64_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_digest: $(CHECK_DIGEST_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_DIGEST_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_env_pattern: $(CHECK_ENV_MATCH_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_ENV_MATCH_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_exptilde: $(CHECK_EXPTILDE_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_EXPTILDE_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_fill: $(CHECK_FILL_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_FILL_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_gentime: $(CHECK_GENTIME_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_GENTIME_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_hexchar: $(CHECK_HEXCHAR_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_HEXCHAR_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_iolog_plugin: $(CHECK_IOLOG_PLUGIN_OBJS) $(LIBUTIL) $(LIBIOLOG) $(LIBLOGSRV) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_PLUGIN_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBIOLOG) $(LIBEVENTLOG) $(LIBLOGSRV) @LIBTLS@ + +check_starttime: $(CHECK_STARTTIME_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_STARTTIME_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +# We need to link check_symbols with -lpthread on HP-UX since LDAP uses threads +check_symbols: $(CHECK_SYMBOLS_OBJS) $(LIBUTIL) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_SYMBOLS_OBJS) $(CHECK_SYMBOLS_LDFLAGS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) @SUDO_LIBS@ + +GENERATED = gram.h gram.c toke.c def_data.c def_data.h getdate.c + +prologue: + echo "/*" > $@ + echo " * This is an open source non-commercial project. Dear PVS-Studio, please check it." >> $@ + echo " * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com" >> $@ + echo " */" >> $@ + echo "" >> $@ + echo "#include " >> $@ + +$(devdir)/gram.c $(devdir)/gram.h: $(srcdir)/gram.y prologue + @if [ -n "$(DEVEL)" ]; then \ + if test "$(srcdir)" = "."; then \ + gram_y="gram.y"; \ + else \ + gram_y="$(srcdir)/gram.y"; \ + fi; \ + cmd='$(YACC) -d -p sudoers '"$$gram_y"'; cp prologue $(devdir)/gram.c; $(SED) "s/^\\(#line .*\\) \"y\\.tab\\.c\"/\1 \"gram.c\"/" y.tab.c >> $(devdir)/gram.c; rm -f y.tab.c; mv -f y.tab.h $(devdir)/gram.h'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +$(devdir)/toke.c: $(srcdir)/toke.l prologue + @if [ -n "$(DEVEL)" ]; then \ + if test "$(srcdir)" = "."; then \ + toke_l="toke.l"; \ + else \ + toke_l="$(srcdir)/toke.l"; \ + fi; \ + cmd='$(FLEX) '"$$toke_l"'; cp prologue $(devdir)/toke.c; $(SED) -e "s/^\\(#line .*\\) \"lex\\.sudoers\\.c\"/\1 \"toke.c\"/" -e "s:/\* *FALLTHROUGH *\*/:FALLTHROUGH;:" lex.sudoers.c >> $(devdir)/toke.c; rm -f lex.sudoers.c'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +$(devdir)/getdate.c: $(srcdir)/getdate.y prologue + @if [ -n "$(DEVEL)" ]; then \ + echo "expect 10 shift/reduce conflicts"; \ + if test "$(srcdir)" = "."; then \ + getdate_y="getdate.y"; \ + else \ + getdate_y="$(srcdir)/getdate.y"; \ + fi; \ + cmd='$(YACC) '"$$getdate_y"'; cp prologue $(devdir)/getdate.c; $(SED) "s/^\\(#line .*\\) \"y\\.tab\\.c\"/\1 \"getdate.c\"/" y.tab.c >> $(devdir)/getdate.c; rm -f y.tab.c'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +$(devdir)/def_data.c $(devdir)/def_data.h: $(srcdir)/def_data.in + @if [ -n "$(DEVEL)" ]; then \ + cmd='AWK=$(AWK) $(SHELL) $(srcdir)/mkdefaults -o $(devdir)/def_data $(srcdir)/def_data.in'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +sudoers: $(srcdir)/sudoers.in + cd $(top_builddir) && $(SHELL) config.status --file=plugins/sudoers/$@ + +pre-install: + @if test X"$(cross_compiling)" != X"yes" -a X"$(DESTDIR)" = X""; then \ + if test -r $(sudoersdir)/sudoers; then \ + echo "Checking existing sudoers file for syntax errors."; \ + ./visudo -c -f $(sudoersdir)/sudoers; \ + fi; \ + fi + +install: install-plugin install-binaries install-sudoers install-doc + +install-dirs: + $(SHELL) $(scriptdir)/mkinstalldirs $(DESTDIR)$(plugindir) \ + $(DESTDIR)$(sbindir) $(DESTDIR)$(bindir) \ + $(DESTDIR)$(sudoersdir) $(DESTDIR)$(docdir) \ + `echo $(DESTDIR)$(rundir)|$(SED) 's,/[^/]*$$,,'` \ + `echo $(DESTDIR)$(vardir)|$(SED) 's,/[^/]*$$,,'` + $(INSTALL) -d $(INSTALL_OWNER) -m 0711 $(DESTDIR)$(rundir) + $(INSTALL) -d $(INSTALL_OWNER) -m 0711 $(DESTDIR)$(vardir) + $(INSTALL) -d $(INSTALL_OWNER) -m 0700 $(DESTDIR)$(vardir)/lectured + +install-binaries: cvtsudoers sudoreplay visudo install-dirs + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m 0755 cvtsudoers $(DESTDIR)$(bindir)/cvtsudoers + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m 0755 sudoreplay $(DESTDIR)$(bindir)/sudoreplay + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m 0755 visudo $(DESTDIR)$(sbindir)/visudo + +install-includes: + +install-doc: + +install-plugin: sudoers.la install-dirs + case "$(LT_LDFLAGS)" in \ + *-no-install*) ;; \ + *) if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) sudoers.la $(DESTDIR)$(plugindir); \ + fi;; \ + esac + +install-sudoers: install-dirs + $(INSTALL) -d $(INSTALL_OWNER) -m 0750 $(DESTDIR)$(sudoersdir)/sudoers.d + $(INSTALL) $(INSTALL_OWNER) -m $(sudoers_mode) sudoers $(DESTDIR)$(sudoersdir)/sudoers.dist + test -r $(DESTDIR)$(sudoersdir)/sudoers || \ + cp -p $(DESTDIR)$(sudoersdir)/sudoers.dist $(DESTDIR)$(sudoersdir)/sudoers + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/sudoers.la + -rm -f $(DESTDIR)$(bindir)/cvtsudoers \ + $(DESTDIR)$(bindir)/sudoreplay + $(DESTDIR)$(sbindir)/visudo + -test -z "$(INSTALL_BACKUP)" || \ + $(DESTDIR)$(bindir)/cvtsudoers$(INSTALL_BACKUP) \ + $(DESTDIR)$(bindir)/sudoreplay$(INSTALL_BACKUP) \ + $(DESTDIR)$(sbindir)/visudo$(INSTALL_BACKUP) \ + $(DESTDIR)$(plugindir)/sudoers.so$(INSTALL_BACKUP) + -cmp $(DESTDIR)$(sudoersdir)/sudoers $(DESTDIR)$(sudoersdir)/sudoers.dist >/dev/null && \ + rm -f $(DESTDIR)$(sudoersdir)/sudoers + -rm -f $(DESTDIR)$(sudoersdir)/sudoers.dist + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) -I$(devdir) -I$(srcdir) $(srcdir)/*.c $(srcdir)/auth/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) -I$(devdir) -I$(srcdir) $(srcdir)/*.c $(srcdir)/auth/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: $(TEST_PROGS) visudo testsudoers cvtsudoers + @if test X"$(cross_compiling)" != X"yes"; then \ + LC_ALL=C; export LC_ALL; \ + unset LANG || LANG=; \ + MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \ + MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \ + umask 022; \ + rval=0; \ + mkdir -p regress/parser; \ + ./check_addr $(srcdir)/regress/parser/check_addr.in || rval=`expr $$rval + $$?`; \ + ./check_base64 || rval=`expr $$rval + $$?`; \ + if test -f check_digest; then \ + ./check_digest > regress/parser/check_digest.out; \ + diff regress/parser/check_digest.out $(srcdir)/regress/parser/check_digest.out.ok || rval=`expr $$rval + $$?`; \ + fi; \ + ./check_env_pattern $(srcdir)/regress/env_match/data || rval=`expr $$rval + $$?`; \ + ./check_exptilde || rval=`expr $$rval + $$?`; \ + ./check_fill || rval=`expr $$rval + $$?`; \ + ./check_gentime || rval=`expr $$rval + $$?`; \ + ./check_hexchar || rval=`expr $$rval + $$?`; \ + mkdir -p regress/iolog_plugin; \ + ./check_iolog_plugin regress/iolog_plugin/iolog || rval=`expr $$rval + $$?`; \ + ./check_starttime || rval=`expr $$rval + $$?`; \ + if test -f check_symbols; then \ + ./check_symbols .libs/sudoers.so $(shlib_exp) || rval=`expr $$rval + $$?`; \ + fi; \ + passed=0; failed=0; total=0; \ + mkdir -p regress/sudoers; \ + dir=sudoers; \ + for t in $(srcdir)/regress/$$dir/*.in; do \ + base=`basename $$t .in`; \ + out="regress/sudoers/$${base}.out"; \ + toke="regress/sudoers/$${base}.toke"; \ + json="regress/sudoers/$${base}.json"; \ + ldif="regress/sudoers/$${base}.ldif"; \ + sudo="regress/sudoers/$${base}.sudo"; \ + ldif2sudo="regress/sudoers/$${base}.ldif2sudo"; \ + if test -s $$json.ok; then \ + ASAN_OPTIONS=; \ + else \ + ASAN_OPTIONS=detect_leaks=0; \ + fi; \ + ASAN_OPTIONS=$$ASAN_OPTIONS \ + ./testsudoers -dt <$$t >$$out 2>$$toke || true; \ + if cmp $$out $(srcdir)/$$out.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (parse): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (parse): FAIL"; \ + diff $$out $(srcdir)/$$out.ok || true; \ + fi; \ + total=`expr $$total + 1`; \ + if cmp $$toke $(srcdir)/$$toke.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (toke): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (toke): FAIL"; \ + diff $$toke $(srcdir)/$$toke.ok || true; \ + fi; \ + total=`expr $$total + 1`; \ + ./cvtsudoers -c "" -f json $$t >$$json 2>/dev/null || true; \ + total=`expr $$total + 1`; \ + if cmp $$json $(srcdir)/$$json.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (json): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (json): FAIL"; \ + diff $$json $(srcdir)/$$json.ok || true; \ + fi; \ + SUDOERS_BASE="ou=SUDOers,dc=sudo,dc=ws" \ + ./cvtsudoers -c "" -f ldif < $$t >$$ldif 2>/dev/null || true; \ + total=`expr $$total + 1`; \ + if cmp $$ldif $(srcdir)/$$ldif.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (ldif): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base: (ldif) FAIL"; \ + diff $$ldif $(srcdir)/$$ldif.ok || true; \ + fi; \ + ./cvtsudoers -c "" -f sudoers $$t >$$sudo 2>/dev/null || true; \ + total=`expr $$total + 1`; \ + if ./visudo -qcf $$sudo; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (reparse): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base: (reparse) FAIL"; \ + ./visudo -cf $$sudo || true; \ + fi; \ + if test -s $(srcdir)/$$ldif.ok; then \ + ./cvtsudoers -c "" -i ldif -f sudoers $(srcdir)/$$ldif.ok >$$ldif2sudo || true; \ + total=`expr $$total + 1`; \ + if cmp $$ldif2sudo $(srcdir)/$$ldif2sudo.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (ldif2sudo): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base: (ldif2sudo) FAIL"; \ + diff $$ldif $(srcdir)/$$ldif.ok || true; \ + fi; \ + fi; \ + done; \ + echo "$$dir: $$passed/$$total tests passed; $$failed/$$total tests failed"; \ + if test $$failed -ne 0; then \ + rval=`expr $$rval + $$failed`; \ + fi; \ + for dir in testsudoers visudo cvtsudoers; do \ + mkdir -p regress/$$dir; \ + passed=0; failed=0; total=0; \ + for t in $(srcdir)/regress/$$dir/*.sh; do \ + base=`basename $$t .sh`; \ + out="regress/$$dir/$${base}.out"; \ + err="regress/$$dir/$${base}.err"; \ + status=0; \ + TESTSUDOERS=./testsudoers VISUDO=./visudo \ + CVTSUDOERS=./cvtsudoers TESTDIR=$(srcdir)/regress/$$dir \ + $(SHELL) $$t >$$out 2>$$err || status=$$?; \ + if cmp $$out $(srcdir)/$$out.ok >/dev/null; then \ + if test $$status -ne 0; then \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (exit $$status): FAIL"; \ + else \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base: OK"; \ + fi; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base: FAIL"; \ + diff $$out $(srcdir)/$$out.ok || true; \ + fi; \ + total=`expr $$total + 1`; \ + if test -s $(srcdir)/$$err.ok; then \ + if cmp $$err $(srcdir)/$$err.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (stderr): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (stderr): FAIL"; \ + diff $$err $(srcdir)/$$err.ok || true; \ + fi; \ + total=`expr $$total + 1`; \ + elif test -s $$err; then \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (stderr): FAIL"; \ + cat $$err 1>&2; \ + fi; \ + done; \ + echo "$$dir: $$passed/$$total tests passed; $$failed/$$total tests failed"; \ + if test $$failed -ne 0; then \ + rval=`expr $$rval + $$failed`; \ + fi; \ + done; \ + exit $$rval; \ + fi + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f $(PROGS) $(TEST_PROGS) \ + *.lo *.o *.la + -rm -f *.i *.plog stamp-* core *.core core.* prologue regress/*/*.out \ + regress/*/*.toke regress/*/*.err regress/*/*.json \ + regress/*/*.ldif regress/*/*.ldif2sudo regress/*/*.sudo + -rm -rf regress/iolog_plugin/iolog + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile sudoers sudoers.lo .libs $(shlib_map) $(shlib_opt) + @if [ -n "$(DEVEL)" -a "$(devdir)" != "$(srcdir)" ]; then \ + cmd='rm -rf $(GENERATED)'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +afs.lo: $(authdir)/afs.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/afs.c +afs.i: $(authdir)/afs.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +afs.plog: afs.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/afs.c --i-file $< --output-file $@ +aix_auth.lo: $(authdir)/aix_auth.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/aix_auth.c +aix_auth.i: $(authdir)/aix_auth.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +aix_auth.plog: aix_auth.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/aix_auth.c --i-file $< --output-file $@ +alias.lo: $(srcdir)/alias.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/redblack.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/alias.c +alias.i: $(srcdir)/alias.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/redblack.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +alias.plog: alias.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/alias.c --i-file $< --output-file $@ +audit.lo: $(srcdir)/audit.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/log_server.pb-c.h $(incdir)/protobuf-c/protobuf-c.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/bsm_audit.h \ + $(srcdir)/defaults.h $(srcdir)/linux_audit.h $(srcdir)/log_client.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/solaris_audit.h \ + $(srcdir)/strlist.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/audit.c +audit.i: $(srcdir)/audit.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/log_server.pb-c.h $(incdir)/protobuf-c/protobuf-c.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/bsm_audit.h \ + $(srcdir)/defaults.h $(srcdir)/linux_audit.h $(srcdir)/log_client.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/solaris_audit.h \ + $(srcdir)/strlist.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +audit.plog: audit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/audit.c --i-file $< --output-file $@ +base64.lo: $(srcdir)/base64.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/base64.c +base64.i: $(srcdir)/base64.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +base64.plog: base64.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/base64.c --i-file $< --output-file $@ +boottime.lo: $(srcdir)/boottime.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/boottime.c +boottime.i: $(srcdir)/boottime.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +boottime.plog: boottime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/boottime.c --i-file $< --output-file $@ +bsdauth.lo: $(authdir)/bsdauth.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/bsdauth.c +bsdauth.i: $(authdir)/bsdauth.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +bsdauth.plog: bsdauth.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/bsdauth.c --i-file $< --output-file $@ +bsm_audit.lo: $(srcdir)/bsm_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/bsm_audit.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/bsm_audit.c +bsm_audit.i: $(srcdir)/bsm_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/bsm_audit.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +bsm_audit.plog: bsm_audit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/bsm_audit.c --i-file $< --output-file $@ +check.lo: $(srcdir)/check.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/check.c +check.i: $(srcdir)/check.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check.plog: check.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/check.c --i-file $< --output-file $@ +check_addr.o: $(srcdir)/regress/parser/check_addr.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_addr.c +check_addr.i: $(srcdir)/regress/parser/check_addr.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_addr.plog: check_addr.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_addr.c --i-file $< --output-file $@ +check_base64.o: $(srcdir)/regress/parser/check_base64.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_base64.c +check_base64.i: $(srcdir)/regress/parser/check_base64.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_base64.plog: check_base64.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_base64.c --i-file $< --output-file $@ +check_digest.o: $(srcdir)/regress/parser/check_digest.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_digest.c +check_digest.i: $(srcdir)/regress/parser/check_digest.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_digest.plog: check_digest.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_digest.c --i-file $< --output-file $@ +check_env_pattern.o: $(srcdir)/regress/env_match/check_env_pattern.c \ + $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/env_match/check_env_pattern.c +check_env_pattern.i: $(srcdir)/regress/env_match/check_env_pattern.c \ + $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_env_pattern.plog: check_env_pattern.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/env_match/check_env_pattern.c --i-file $< --output-file $@ +check_exptilde.o: $(srcdir)/regress/exptilde/check_exptilde.c \ + $(devdir)/def_data.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/exptilde/check_exptilde.c +check_exptilde.i: $(srcdir)/regress/exptilde/check_exptilde.c \ + $(devdir)/def_data.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_exptilde.plog: check_exptilde.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/exptilde/check_exptilde.c --i-file $< --output-file $@ +check_fill.o: $(srcdir)/regress/parser/check_fill.c $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h $(srcdir)/toke.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_fill.c +check_fill.i: $(srcdir)/regress/parser/check_fill.c $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h $(srcdir)/toke.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_fill.plog: check_fill.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_fill.c --i-file $< --output-file $@ +check_gentime.o: $(srcdir)/regress/parser/check_gentime.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_gentime.c +check_gentime.i: $(srcdir)/regress/parser/check_gentime.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_gentime.plog: check_gentime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_gentime.c --i-file $< --output-file $@ +check_hexchar.o: $(srcdir)/regress/parser/check_hexchar.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_hexchar.c +check_hexchar.i: $(srcdir)/regress/parser/check_hexchar.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_hexchar.plog: check_hexchar.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_hexchar.c --i-file $< --output-file $@ +check_iolog_plugin.o: $(srcdir)/regress/iolog_plugin/check_iolog_plugin.c \ + $(devdir)/def_data.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/iolog_plugin/check_iolog_plugin.c +check_iolog_plugin.i: $(srcdir)/regress/iolog_plugin/check_iolog_plugin.c \ + $(devdir)/def_data.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_iolog_plugin.plog: check_iolog_plugin.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_plugin/check_iolog_plugin.c --i-file $< --output-file $@ +check_starttime.o: $(srcdir)/regress/starttime/check_starttime.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/starttime/check_starttime.c +check_starttime.i: $(srcdir)/regress/starttime/check_starttime.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_starttime.plog: check_starttime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/starttime/check_starttime.c --i-file $< --output-file $@ +check_symbols.o: $(srcdir)/regress/check_symbols/check_symbols.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/check_symbols/check_symbols.c +check_symbols.i: $(srcdir)/regress/check_symbols/check_symbols.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_symbols.plog: check_symbols.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/check_symbols/check_symbols.c --i-file $< --output-file $@ +cvtsudoers.o: $(srcdir)/cvtsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/getopt.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/redblack.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/sudoers_version.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/cvtsudoers.c +cvtsudoers.i: $(srcdir)/cvtsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/getopt.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/redblack.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/sudoers_version.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +cvtsudoers.plog: cvtsudoers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/cvtsudoers.c --i-file $< --output-file $@ +cvtsudoers_json.o: $(srcdir)/cvtsudoers_json.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_json.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/cvtsudoers_json.c +cvtsudoers_json.i: $(srcdir)/cvtsudoers_json.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_json.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +cvtsudoers_json.plog: cvtsudoers_json.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/cvtsudoers_json.c --i-file $< --output-file $@ +cvtsudoers_ldif.o: $(srcdir)/cvtsudoers_ldif.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/redblack.h \ + $(srcdir)/strlist.h $(srcdir)/sudo_ldap.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/cvtsudoers_ldif.c +cvtsudoers_ldif.i: $(srcdir)/cvtsudoers_ldif.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/redblack.h \ + $(srcdir)/strlist.h $(srcdir)/sudo_ldap.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +cvtsudoers_ldif.plog: cvtsudoers_ldif.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/cvtsudoers_ldif.c --i-file $< --output-file $@ +cvtsudoers_pwutil.o: $(srcdir)/cvtsudoers_pwutil.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/pwutil.h \ + $(srcdir)/strlist.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/cvtsudoers_pwutil.c +cvtsudoers_pwutil.i: $(srcdir)/cvtsudoers_pwutil.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/pwutil.h \ + $(srcdir)/strlist.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +cvtsudoers_pwutil.plog: cvtsudoers_pwutil.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/cvtsudoers_pwutil.c --i-file $< --output-file $@ +dce.lo: $(authdir)/dce.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/dce.c +dce.i: $(authdir)/dce.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +dce.plog: dce.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/dce.c --i-file $< --output-file $@ +defaults.lo: $(srcdir)/defaults.c $(devdir)/def_data.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/defaults.c +defaults.i: $(srcdir)/defaults.c $(devdir)/def_data.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +defaults.plog: defaults.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/defaults.c --i-file $< --output-file $@ +digestname.lo: $(srcdir)/digestname.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_queue.h \ + $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/digestname.c +digestname.i: $(srcdir)/digestname.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_queue.h \ + $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +digestname.plog: digestname.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/digestname.c --i-file $< --output-file $@ +editor.lo: $(srcdir)/editor.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/editor.c +editor.i: $(srcdir)/editor.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +editor.plog: editor.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/editor.c --i-file $< --output-file $@ +env.lo: $(srcdir)/env.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/env.c +env.i: $(srcdir)/env.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +env.plog: env.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/env.c --i-file $< --output-file $@ +env_pattern.lo: $(srcdir)/env_pattern.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/env_pattern.c +env_pattern.i: $(srcdir)/env_pattern.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +env_pattern.plog: env_pattern.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/env_pattern.c --i-file $< --output-file $@ +exptilde.lo: $(srcdir)/exptilde.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/pwutil.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/exptilde.c +exptilde.i: $(srcdir)/exptilde.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/pwutil.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +exptilde.plog: exptilde.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/exptilde.c --i-file $< --output-file $@ +file.lo: $(srcdir)/file.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/file.c +file.i: $(srcdir)/file.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +file.plog: file.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/file.c --i-file $< --output-file $@ +filedigest.lo: $(srcdir)/filedigest.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/filedigest.c +filedigest.i: $(srcdir)/filedigest.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +filedigest.plog: filedigest.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/filedigest.c --i-file $< --output-file $@ +find_path.lo: $(srcdir)/find_path.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/find_path.c +find_path.i: $(srcdir)/find_path.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +find_path.plog: find_path.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/find_path.c --i-file $< --output-file $@ +fmtsudoers.lo: $(srcdir)/fmtsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/fmtsudoers.c +fmtsudoers.i: $(srcdir)/fmtsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +fmtsudoers.plog: fmtsudoers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/fmtsudoers.c --i-file $< --output-file $@ +fwtk.lo: $(authdir)/fwtk.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/fwtk.c +fwtk.i: $(authdir)/fwtk.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +fwtk.plog: fwtk.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/fwtk.c --i-file $< --output-file $@ +gc.lo: $(srcdir)/gc.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gc.c +gc.i: $(srcdir)/gc.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +gc.plog: gc.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/gc.c --i-file $< --output-file $@ +gentime.lo: $(srcdir)/gentime.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gentime.c +gentime.i: $(srcdir)/gentime.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +gentime.plog: gentime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/gentime.c --i-file $< --output-file $@ +getdate.o: $(devdir)/getdate.c $(incdir)/sudo_compat.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(devdir)/getdate.c +getdate.i: $(devdir)/getdate.c $(incdir)/sudo_compat.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +getdate.plog: getdate.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(devdir)/getdate.c --i-file $< --output-file $@ +getspwuid.lo: $(srcdir)/getspwuid.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/getspwuid.c +getspwuid.i: $(srcdir)/getspwuid.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +getspwuid.plog: getspwuid.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/getspwuid.c --i-file $< --output-file $@ +gmtoff.lo: $(srcdir)/gmtoff.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gmtoff.c +gmtoff.i: $(srcdir)/gmtoff.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +gmtoff.plog: gmtoff.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/gmtoff.c --i-file $< --output-file $@ +goodpath.lo: $(srcdir)/goodpath.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/goodpath.c +goodpath.i: $(srcdir)/goodpath.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +goodpath.plog: goodpath.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/goodpath.c --i-file $< --output-file $@ +gram.lo: $(devdir)/gram.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/toke.h $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(devdir)/gram.c +gram.i: $(devdir)/gram.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/toke.h $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +gram.plog: gram.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(devdir)/gram.c --i-file $< --output-file $@ +group_plugin.lo: $(srcdir)/group_plugin.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/group_plugin.c +group_plugin.i: $(srcdir)/group_plugin.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +group_plugin.plog: group_plugin.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/group_plugin.c --i-file $< --output-file $@ +hexchar.lo: $(srcdir)/hexchar.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/hexchar.c +hexchar.i: $(srcdir)/hexchar.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +hexchar.plog: hexchar.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/hexchar.c --i-file $< --output-file $@ +interfaces.lo: $(srcdir)/interfaces.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/interfaces.c +interfaces.i: $(srcdir)/interfaces.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +interfaces.plog: interfaces.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/interfaces.c --i-file $< --output-file $@ +iolog.lo: $(srcdir)/iolog.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/log_server.pb-c.h $(incdir)/protobuf-c/protobuf-c.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/log_client.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/strlist.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/iolog.c +iolog.i: $(srcdir)/iolog.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/log_server.pb-c.h $(incdir)/protobuf-c/protobuf-c.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/log_client.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/strlist.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +iolog.plog: iolog.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog.c --i-file $< --output-file $@ +iolog_path_escapes.lo: $(srcdir)/iolog_path_escapes.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/iolog_path_escapes.c +iolog_path_escapes.i: $(srcdir)/iolog_path_escapes.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +iolog_path_escapes.plog: iolog_path_escapes.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_path_escapes.c --i-file $< --output-file $@ +kerb5.lo: $(authdir)/kerb5.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/kerb5.c +kerb5.i: $(authdir)/kerb5.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +kerb5.plog: kerb5.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/kerb5.c --i-file $< --output-file $@ +ldap.lo: $(srcdir)/ldap.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_ldap_conf.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/ldap.c +ldap.i: $(srcdir)/ldap.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_ldap_conf.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +ldap.plog: ldap.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/ldap.c --i-file $< --output-file $@ +ldap_conf.lo: $(srcdir)/ldap_conf.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_ldap.h \ + $(srcdir)/sudo_ldap_conf.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/ldap_conf.c +ldap_conf.i: $(srcdir)/ldap_conf.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_ldap.h \ + $(srcdir)/sudo_ldap_conf.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +ldap_conf.plog: ldap_conf.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/ldap_conf.c --i-file $< --output-file $@ +ldap_util.lo: $(srcdir)/ldap_util.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/ldap_util.c +ldap_util.i: $(srcdir)/ldap_util.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +ldap_util.plog: ldap_util.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/ldap_util.c --i-file $< --output-file $@ +linux_audit.lo: $(srcdir)/linux_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/linux_audit.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/linux_audit.c +linux_audit.i: $(srcdir)/linux_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/linux_audit.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +linux_audit.plog: linux_audit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/linux_audit.c --i-file $< --output-file $@ +locale.lo: $(srcdir)/locale.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/locale.c +locale.i: $(srcdir)/locale.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +locale.plog: locale.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/locale.c --i-file $< --output-file $@ +log_client.lo: $(srcdir)/log_client.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/hostcheck.h $(incdir)/log_server.pb-c.h \ + $(incdir)/protobuf-c/protobuf-c.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_event.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/log_client.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/strlist.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/log_client.c +log_client.i: $(srcdir)/log_client.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/hostcheck.h $(incdir)/log_server.pb-c.h \ + $(incdir)/protobuf-c/protobuf-c.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_event.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/log_client.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/strlist.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +log_client.plog: log_client.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/log_client.c --i-file $< --output-file $@ +logging.lo: $(srcdir)/logging.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/log_server.pb-c.h $(incdir)/protobuf-c/protobuf-c.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/log_client.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/logging.c +logging.i: $(srcdir)/logging.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/log_server.pb-c.h $(incdir)/protobuf-c/protobuf-c.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/log_client.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +logging.plog: logging.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/logging.c --i-file $< --output-file $@ +match.lo: $(srcdir)/match.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/fnmatch.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/match.c +match.i: $(srcdir)/match.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/fnmatch.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +match.plog: match.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/match.c --i-file $< --output-file $@ +match_addr.lo: $(srcdir)/match_addr.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/match_addr.c +match_addr.i: $(srcdir)/match_addr.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +match_addr.plog: match_addr.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/match_addr.c --i-file $< --output-file $@ +match_command.lo: $(srcdir)/match_command.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/fnmatch.h \ + $(incdir)/compat/glob.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/match_command.c +match_command.i: $(srcdir)/match_command.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/fnmatch.h \ + $(incdir)/compat/glob.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +match_command.plog: match_command.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/match_command.c --i-file $< --output-file $@ +match_digest.lo: $(srcdir)/match_digest.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_digest.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/match_digest.c +match_digest.i: $(srcdir)/match_digest.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_digest.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +match_digest.plog: match_digest.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/match_digest.c --i-file $< --output-file $@ +net_ifs.o: $(top_srcdir)/src/net_ifs.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(top_srcdir)/src/net_ifs.c +net_ifs.i: $(top_srcdir)/src/net_ifs.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +net_ifs.plog: net_ifs.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(top_srcdir)/src/net_ifs.c --i-file $< --output-file $@ +pam.lo: $(authdir)/pam.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/pam.c +pam.i: $(authdir)/pam.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +pam.plog: pam.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/pam.c --i-file $< --output-file $@ +parse.lo: $(srcdir)/parse.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/parse.c +parse.i: $(srcdir)/parse.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +parse.plog: parse.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/parse.c --i-file $< --output-file $@ +parse_ldif.o: $(srcdir)/parse_ldif.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/redblack.h $(srcdir)/strlist.h $(srcdir)/sudo_ldap.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/parse_ldif.c +parse_ldif.i: $(srcdir)/parse_ldif.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/redblack.h $(srcdir)/strlist.h $(srcdir)/sudo_ldap.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +parse_ldif.plog: parse_ldif.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/parse_ldif.c --i-file $< --output-file $@ +passwd.lo: $(authdir)/passwd.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/passwd.c +passwd.i: $(authdir)/passwd.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +passwd.plog: passwd.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/passwd.c --i-file $< --output-file $@ +policy.lo: $(srcdir)/policy.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/interfaces.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/sudoers_version.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/policy.c +policy.i: $(srcdir)/policy.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/interfaces.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/sudoers_version.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +policy.plog: policy.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/policy.c --i-file $< --output-file $@ +prompt.lo: $(srcdir)/prompt.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/prompt.c +prompt.i: $(srcdir)/prompt.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +prompt.plog: prompt.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/prompt.c --i-file $< --output-file $@ +pwutil.lo: $(srcdir)/pwutil.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/pwutil.h $(srcdir)/redblack.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/pwutil.c +pwutil.i: $(srcdir)/pwutil.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/pwutil.h $(srcdir)/redblack.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +pwutil.plog: pwutil.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pwutil.c --i-file $< --output-file $@ +pwutil_impl.lo: $(srcdir)/pwutil_impl.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/pwutil.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/pwutil_impl.c +pwutil_impl.i: $(srcdir)/pwutil_impl.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/pwutil.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +pwutil_impl.plog: pwutil_impl.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pwutil_impl.c --i-file $< --output-file $@ +rcstr.lo: $(srcdir)/rcstr.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/rcstr.c +rcstr.i: $(srcdir)/rcstr.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +rcstr.plog: rcstr.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/rcstr.c --i-file $< --output-file $@ +redblack.lo: $(srcdir)/redblack.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/redblack.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/redblack.c +redblack.i: $(srcdir)/redblack.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/redblack.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +redblack.plog: redblack.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/redblack.c --i-file $< --output-file $@ +rfc1938.lo: $(authdir)/rfc1938.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/rfc1938.c +rfc1938.i: $(authdir)/rfc1938.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +rfc1938.plog: rfc1938.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/rfc1938.c --i-file $< --output-file $@ +secureware.lo: $(authdir)/secureware.c $(authdir)/sudo_auth.h \ + $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/secureware.c +secureware.i: $(authdir)/secureware.c $(authdir)/sudo_auth.h \ + $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +secureware.plog: secureware.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/secureware.c --i-file $< --output-file $@ +securid5.lo: $(authdir)/securid5.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/securid5.c +securid5.i: $(authdir)/securid5.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +securid5.plog: securid5.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/securid5.c --i-file $< --output-file $@ +set_perms.lo: $(srcdir)/set_perms.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/set_perms.c +set_perms.i: $(srcdir)/set_perms.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +set_perms.plog: set_perms.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/set_perms.c --i-file $< --output-file $@ +sia.lo: $(authdir)/sia.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/sia.c +sia.i: $(authdir)/sia.c $(authdir)/sudo_auth.h $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sia.plog: sia.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/sia.c --i-file $< --output-file $@ +solaris_audit.lo: $(srcdir)/solaris_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/solaris_audit.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/solaris_audit.c +solaris_audit.i: $(srcdir)/solaris_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/solaris_audit.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +solaris_audit.plog: solaris_audit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/solaris_audit.c --i-file $< --output-file $@ +sssd.lo: $(srcdir)/sssd.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sssd.c +sssd.i: $(srcdir)/sssd.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sssd.plog: sssd.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sssd.c --i-file $< --output-file $@ +starttime.lo: $(srcdir)/starttime.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/starttime.c +starttime.i: $(srcdir)/starttime.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +starttime.plog: starttime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/starttime.c --i-file $< --output-file $@ +strlist.lo: $(srcdir)/strlist.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/strlist.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/strlist.c +strlist.i: $(srcdir)/strlist.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/strlist.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +strlist.plog: strlist.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/strlist.c --i-file $< --output-file $@ +stubs.o: $(srcdir)/stubs.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/stubs.c +stubs.i: $(srcdir)/stubs.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +stubs.plog: stubs.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/stubs.c --i-file $< --output-file $@ +sudo_auth.lo: $(authdir)/sudo_auth.c $(authdir)/sudo_auth.h \ + $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_rand.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/ins_2001.h $(srcdir)/ins_classic.h \ + $(srcdir)/ins_csops.h $(srcdir)/ins_goons.h \ + $(srcdir)/ins_python.h $(srcdir)/insults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/sudo_auth.c +sudo_auth.i: $(authdir)/sudo_auth.c $(authdir)/sudo_auth.h \ + $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_rand.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/ins_2001.h $(srcdir)/ins_classic.h \ + $(srcdir)/ins_csops.h $(srcdir)/ins_goons.h \ + $(srcdir)/ins_python.h $(srcdir)/insults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudo_auth.plog: sudo_auth.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/sudo_auth.c --i-file $< --output-file $@ +sudo_nss.lo: $(srcdir)/sudo_nss.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudo_nss.c +sudo_nss.i: $(srcdir)/sudo_nss.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudo_nss.plog: sudo_nss.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_nss.c --i-file $< --output-file $@ +sudo_printf.o: $(srcdir)/sudo_printf.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudo_printf.c +sudo_printf.i: $(srcdir)/sudo_printf.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudo_printf.plog: sudo_printf.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_printf.c --i-file $< --output-file $@ +sudoers.lo: $(srcdir)/sudoers.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/auth/sudo_auth.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudoers.c +sudoers.i: $(srcdir)/sudoers.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/auth/sudo_auth.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudoers.plog: sudoers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudoers.c --i-file $< --output-file $@ +sudoers_debug.lo: $(srcdir)/sudoers_debug.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudoers_debug.c +sudoers_debug.i: $(srcdir)/sudoers_debug.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudoers_debug.plog: sudoers_debug.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudoers_debug.c --i-file $< --output-file $@ +sudoreplay.o: $(srcdir)/sudoreplay.c $(incdir)/compat/getopt.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_event.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/logging.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudoreplay.c +sudoreplay.i: $(srcdir)/sudoreplay.c $(incdir)/compat/getopt.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_event.h $(incdir)/sudo_eventlog.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/logging.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudoreplay.plog: sudoreplay.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudoreplay.c --i-file $< --output-file $@ +testsudoers.o: $(srcdir)/testsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/tsgetgrpw.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/testsudoers.c +testsudoers.i: $(srcdir)/testsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/tsgetgrpw.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +testsudoers.plog: testsudoers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/testsudoers.c --i-file $< --output-file $@ +timeout.lo: $(srcdir)/timeout.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/timeout.c +timeout.i: $(srcdir)/timeout.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +timeout.plog: timeout.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/timeout.c --i-file $< --output-file $@ +timestamp.lo: $(srcdir)/timestamp.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/timestamp.c +timestamp.i: $(srcdir)/timestamp.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +timestamp.plog: timestamp.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/timestamp.c --i-file $< --output-file $@ +timestr.lo: $(srcdir)/timestr.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/timestr.c +timestr.i: $(srcdir)/timestr.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +timestr.plog: timestr.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/timestr.c --i-file $< --output-file $@ +toke.lo: $(devdir)/toke.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_digest.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/toke.h $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(devdir)/toke.c +toke.i: $(devdir)/toke.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_digest.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/toke.h $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +toke.plog: toke.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(devdir)/toke.c --i-file $< --output-file $@ +toke_util.lo: $(srcdir)/toke_util.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/toke.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/toke_util.c +toke_util.i: $(srcdir)/toke_util.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/toke.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +toke_util.plog: toke_util.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/toke_util.c --i-file $< --output-file $@ +tsdump.o: $(srcdir)/tsdump.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/tsdump.c +tsdump.i: $(srcdir)/tsdump.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/check.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +tsdump.plog: tsdump.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/tsdump.c --i-file $< --output-file $@ +tsgetgrpw.o: $(srcdir)/tsgetgrpw.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/tsgetgrpw.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/tsgetgrpw.c +tsgetgrpw.i: $(srcdir)/tsgetgrpw.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/tsgetgrpw.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +tsgetgrpw.plog: tsgetgrpw.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/tsgetgrpw.c --i-file $< --output-file $@ +visudo.o: $(srcdir)/visudo.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/getopt.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/redblack.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/sudoers_version.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/visudo.c +visudo.i: $(srcdir)/visudo.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/getopt.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/redblack.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/sudoers_version.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +visudo.plog: visudo.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/visudo.c --i-file $< --output-file $@ diff --git a/plugins/sudoers/alias.c b/plugins/sudoers/alias.c new file mode 100644 index 0000000..caaa984 --- /dev/null +++ b/plugins/sudoers/alias.c @@ -0,0 +1,370 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include + +#include "sudoers.h" +#include "redblack.h" +#include + +/* + * Comparison function for the red-black tree. + * Aliases are sorted by name with the type used as a tie-breaker. + */ +static int +alias_compare(const void *v1, const void *v2) +{ + const struct alias *a1 = (const struct alias *)v1; + const struct alias *a2 = (const struct alias *)v2; + int res; + debug_decl(alias_compare, SUDOERS_DEBUG_ALIAS); + + if (a1 == NULL) + res = -1; + else if (a2 == NULL) + res = 1; + else if ((res = strcmp(a1->name, a2->name)) == 0) + res = a1->type - a2->type; + debug_return_int(res); +} + +/* + * Search the tree for an alias with the specified name and type. + * Returns a pointer to the alias structure or NULL if not found. + * Caller is responsible for calling alias_put() on the returned + * alias to mark it as unused. + */ +struct alias * +alias_get(struct sudoers_parse_tree *parse_tree, const char *name, int type) +{ + struct alias key; + struct rbnode *node; + struct alias *a = NULL; + debug_decl(alias_get, SUDOERS_DEBUG_ALIAS); + + if (parse_tree->aliases == NULL) + debug_return_ptr(NULL); + + key.name = (char *)name; + key.type = type; + if ((node = rbfind(parse_tree->aliases, &key)) != NULL) { + /* + * Check whether this alias is already in use. + * If so, we've detected a loop. If not, set the flag, + * which the caller should clear with a call to alias_put(). + */ + a = node->data; + if (a->used) { + errno = ELOOP; + debug_return_ptr(NULL); + } + a->used = true; + } else { + errno = ENOENT; + } + debug_return_ptr(a); +} + +/* + * Clear the "used" flag in an alias once the caller is done with it. + */ +void +alias_put(struct alias *a) +{ + debug_decl(alias_put, SUDOERS_DEBUG_ALIAS); + a->used = false; + debug_return; +} + +/* + * Add an alias to the aliases redblack tree. + * Note that "file" must be a reference-counted string. + * Returns true on success and false on failure, setting errno. + */ +bool +alias_add(struct sudoers_parse_tree *parse_tree, char *name, int type, + char *file, int line, int column, struct member *members) +{ + struct alias *a; + debug_decl(alias_add, SUDOERS_DEBUG_ALIAS); + + if (parse_tree->aliases == NULL) { + if ((parse_tree->aliases = alloc_aliases()) == NULL) + debug_return_bool(false); + } + + a = calloc(1, sizeof(*a)); + if (a == NULL) + debug_return_bool(false); + a->name = name; + a->type = type; + /* a->used = false; */ + a->file = rcstr_addref(file); + a->line = line; + a->column = column; + HLTQ_TO_TAILQ(&a->members, members, entries); + switch (rbinsert(parse_tree->aliases, a, NULL)) { + case 1: + alias_free(a); + errno = EEXIST; + debug_return_bool(false); + case -1: + alias_free(a); + debug_return_bool(false); + } + debug_return_bool(true); +} + +/* + * Closure to adapt 2-arg rbapply() to 3-arg alias_apply(). + */ +struct alias_apply_closure { + struct sudoers_parse_tree *parse_tree; + int (*func)(struct sudoers_parse_tree *, struct alias *, void *); + void *cookie; +}; + +/* Adapt rbapply() to alias_apply() calling convention. */ +static int +alias_apply_func(void *v1, void *v2) +{ + struct alias *a = v1; + struct alias_apply_closure *closure = v2; + + return closure->func(closure->parse_tree, a, closure->cookie); +} + +/* + * Apply a function to each alias entry and pass in a cookie. + */ +void +alias_apply(struct sudoers_parse_tree *parse_tree, + int (*func)(struct sudoers_parse_tree *, struct alias *, void *), + void *cookie) +{ + struct alias_apply_closure closure; + debug_decl(alias_apply, SUDOERS_DEBUG_ALIAS); + + if (parse_tree->aliases != NULL) { + closure.parse_tree = parse_tree; + closure.func = func; + closure.cookie = cookie; + rbapply(parse_tree->aliases, alias_apply_func, &closure, inorder); + } + + debug_return; +} + +/* + * Returns true if there are no aliases in the parse_tree, else false. + */ +bool +no_aliases(struct sudoers_parse_tree *parse_tree) +{ + debug_decl(no_aliases, SUDOERS_DEBUG_ALIAS); + debug_return_bool(parse_tree->aliases == NULL || + rbisempty(parse_tree->aliases)); +} + +/* + * Free memory used by an alias struct and its members. + */ +void +alias_free(void *v) +{ + struct alias *a = (struct alias *)v; + debug_decl(alias_free, SUDOERS_DEBUG_ALIAS); + + if (a != NULL) { + free(a->name); + rcstr_delref(a->file); + free_members(&a->members); + free(a); + } + + debug_return; +} + +/* + * Find the named alias, remove it from the tree and return it. + */ +struct alias * +alias_remove(struct sudoers_parse_tree *parse_tree, char *name, int type) +{ + struct rbnode *node; + struct alias key; + debug_decl(alias_remove, SUDOERS_DEBUG_ALIAS); + + if (parse_tree->aliases != NULL) { + key.name = name; + key.type = type; + if ((node = rbfind(parse_tree->aliases, &key)) != NULL) + debug_return_ptr(rbdelete(parse_tree->aliases, node)); + } + errno = ENOENT; + debug_return_ptr(NULL); +} + +struct rbtree * +alloc_aliases(void) +{ + debug_decl(alloc_aliases, SUDOERS_DEBUG_ALIAS); + + debug_return_ptr(rbcreate(alias_compare)); +} + +void +free_aliases(struct rbtree *aliases) +{ + debug_decl(free_aliases, SUDOERS_DEBUG_ALIAS); + + if (aliases != NULL) + rbdestroy(aliases, alias_free); +} + +const char * +alias_type_to_string(int alias_type) +{ + return alias_type == HOSTALIAS ? "Host_Alias" : + alias_type == CMNDALIAS ? "Cmnd_Alias" : + alias_type == USERALIAS ? "User_Alias" : + alias_type == RUNASALIAS ? "Runas_Alias" : + "Invalid_Alias"; +} + +/* + * Remove the alias of the specified type as well as any other aliases + * referenced by that alias. Stores removed aliases in a freelist. + */ +static bool +alias_remove_recursive(struct sudoers_parse_tree *parse_tree, char *name, + int type, struct rbtree *freelist) +{ + struct member *m; + struct alias *a; + bool ret = true; + debug_decl(alias_remove_recursive, SUDOERS_DEBUG_ALIAS); + + if ((a = alias_remove(parse_tree, name, type)) != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + if (m->type == ALIAS) { + if (!alias_remove_recursive(parse_tree, m->name, type, freelist)) + ret = false; + } + } + if (rbinsert(freelist, a, NULL) != 0) + ret = false; + } + debug_return_bool(ret); +} + +static int +alias_find_used_members(struct sudoers_parse_tree *parse_tree, + struct member_list *members, int atype, struct rbtree *used_aliases) +{ + struct member *m; + int errors = 0; + debug_decl(alias_find_used_members, SUDOERS_DEBUG_ALIAS); + + if (members != NULL) { + TAILQ_FOREACH(m, members, entries) { + if (m->type != ALIAS) + continue; + if (!alias_remove_recursive(parse_tree, m->name, atype, used_aliases)) + errors++; + } + } + + debug_return_int(errors); +} + +/* + * Move all aliases referenced by userspecs to used_aliases. + */ +bool +alias_find_used(struct sudoers_parse_tree *parse_tree, struct rbtree *used_aliases) +{ + struct privilege *priv; + struct userspec *us; + struct cmndspec *cs; + struct defaults *d; + struct member *m; + int errors = 0; + debug_decl(alias_find_used, SUDOERS_DEBUG_ALIAS); + + /* Move referenced aliases to used_aliases. */ + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + errors += alias_find_used_members(parse_tree, &us->users, + USERALIAS, used_aliases); + TAILQ_FOREACH(priv, &us->privileges, entries) { + errors += alias_find_used_members(parse_tree, &priv->hostlist, + HOSTALIAS, used_aliases); + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + errors += alias_find_used_members(parse_tree, cs->runasuserlist, + RUNASALIAS, used_aliases); + errors += alias_find_used_members(parse_tree, cs->runasgrouplist, + RUNASALIAS, used_aliases); + if ((m = cs->cmnd)->type == ALIAS) { + if (!alias_remove_recursive(parse_tree, m->name, CMNDALIAS, + used_aliases)) + errors++; + } + } + } + } + TAILQ_FOREACH(d, &parse_tree->defaults, entries) { + switch (d->type) { + case DEFAULTS_HOST: + errors += alias_find_used_members(parse_tree, d->binding, + HOSTALIAS, used_aliases); + break; + case DEFAULTS_USER: + errors += alias_find_used_members(parse_tree, d->binding, + USERALIAS, used_aliases); + break; + case DEFAULTS_RUNAS: + errors += alias_find_used_members(parse_tree, d->binding, + RUNASALIAS, used_aliases); + break; + case DEFAULTS_CMND: + errors += alias_find_used_members(parse_tree, d->binding, + CMNDALIAS, used_aliases); + break; + default: + break; + } + } + + debug_return_int(errors ? false : true); +} diff --git a/plugins/sudoers/audit.c b/plugins/sudoers/audit.c new file mode 100644 index 0000000..f72c4d4 --- /dev/null +++ b/plugins/sudoers/audit.c @@ -0,0 +1,444 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2015, 2019-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "log_client.h" + +#ifdef HAVE_BSM_AUDIT +# include "bsm_audit.h" +#endif +#ifdef HAVE_LINUX_AUDIT +# include "linux_audit.h" +#endif +#ifdef HAVE_SOLARIS_AUDIT +# include "solaris_audit.h" +#endif + +#ifdef SUDOERS_LOG_CLIENT +static struct client_closure *client_closure = NULL; +static struct log_details audit_details; +#endif +char *audit_msg = NULL; + +/* sudoers_audit is declared at the end of this file. */ +extern sudo_dso_public struct audit_plugin sudoers_audit; + +static int +audit_success(char *const argv[]) +{ + int rc = 0; + debug_decl(audit_success, SUDOERS_DEBUG_AUDIT); + + if (argv != NULL) { +#ifdef HAVE_BSM_AUDIT + if (bsm_audit_success(argv) == -1) + rc = -1; +#endif +#ifdef HAVE_LINUX_AUDIT + if (linux_audit_command(argv, 1) == -1) + rc = -1; +#endif +#ifdef HAVE_SOLARIS_AUDIT + if (solaris_audit_success(argv) == -1) + rc = -1; +#endif + } + + debug_return_int(rc); +} + +static int +audit_failure_int(char *const argv[], const char *message) +{ + int ret = 0; + debug_decl(audit_failure_int, SUDOERS_DEBUG_AUDIT); + +#if defined(HAVE_BSM_AUDIT) || defined(HAVE_LINUX_AUDIT) + if (def_log_denied && argv != NULL) { +#ifdef HAVE_BSM_AUDIT + if (bsm_audit_failure(argv, message) == -1) + ret = -1; +#endif +#ifdef HAVE_LINUX_AUDIT + if (linux_audit_command(argv, 0) == -1) + ret = -1; +#endif +#ifdef HAVE_SOLARIS_AUDIT + if (solaris_audit_failure(argv, message) == -1) + ret = -1; +#endif + } +#endif /* HAVE_BSM_AUDIT || HAVE_LINUX_AUDIT */ + + debug_return_int(ret); +} + +int +vaudit_failure(char *const argv[], char const *const fmt, va_list ap) +{ + int oldlocale, ret; + char *message; + debug_decl(vaudit_failure, SUDOERS_DEBUG_AUDIT); + + /* Audit messages should be in the sudoers locale. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + if ((ret = vasprintf(&message, _(fmt), ap)) == -1) + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + if (ret != -1) { + /* Set audit_msg for audit plugins. */ + free(audit_msg); + audit_msg = message; + + ret = audit_failure_int(argv, audit_msg); + } + + sudoers_setlocale(oldlocale, NULL); + + debug_return_int(ret); +} + +int +audit_failure(char *const argv[], char const *const fmt, ...) +{ + va_list ap; + int ret; + debug_decl(audit_failure, SUDOERS_DEBUG_AUDIT); + + va_start(ap, fmt); + ret = vaudit_failure(argv, fmt, ap); + va_end(ap); + + debug_return_int(ret); +} + +static int +sudoers_audit_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t plugin_printf, char * const settings[], + char * const user_info[], int submit_optind, char * const submit_argv[], + char * const submit_envp[], char * const plugin_options[], + const char **errstr) +{ + struct sudo_conf_debug_file_list debug_files = TAILQ_HEAD_INITIALIZER(debug_files); + struct sudoers_open_info info; + const char *cp, *plugin_path = NULL; + char * const *cur; + int ret; + debug_decl(sudoers_audit_open, SUDOERS_DEBUG_PLUGIN); + + sudo_conv = conversation; + sudo_printf = plugin_printf; + + bindtextdomain("sudoers", LOCALEDIR); + + /* Initialize the debug subsystem. */ + for (cur = settings; (cp = *cur) != NULL; cur++) { + if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) { + cp += sizeof("debug_flags=") - 1; + if (!sudoers_debug_parse_flags(&debug_files, cp)) + debug_return_int(-1); + continue; + } + if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) { + plugin_path = cp + sizeof("plugin_path=") - 1; + continue; + } + } + if (!sudoers_debug_register(plugin_path, &debug_files)) + debug_return_int(-1); + + /* Call the sudoers init function. */ + info.settings = settings; + info.user_info = user_info; + info.plugin_args = plugin_options; + ret = sudoers_init(&info, submit_envp); + + if (ret == true) { + /* Unset close function if we don't need it to avoid extra process. */ +#ifdef SUDOERS_LOG_CLIENT + if (client_closure == NULL) +#endif + sudoers_audit.close = NULL; + } else { + /* The audit functions set audit_msg on failure. */ + if (audit_msg != NULL) + *errstr = audit_msg; + } + + debug_return_int(ret); +} + +#ifdef SUDOERS_LOG_CLIENT +static void +audit_to_eventlog(struct eventlog *evlog, char * const command_info[], + char * const run_argv[], char * const run_envp[]) +{ + char * const *cur; + debug_decl(audit_to_eventlog, SUDOERS_DEBUG_PLUGIN); + + /* Fill in evlog from sudoers Defaults, run_argv and run_envp. */ + sudoers_to_eventlog(evlog, run_argv, run_envp); + + /* Update iolog and execution environment from command_info[]. */ + if (command_info != NULL) { + for (cur = command_info; *cur != NULL; cur++) { + switch (**cur) { + case 'c': + if (strncmp(*cur, "command=", sizeof("command=") - 1) == 0) { + evlog->command = *cur + sizeof("command=") - 1; + continue; + } + if (strncmp(*cur, "chroot=", sizeof("chroot=") - 1) == 0) { + evlog->runchroot = *cur + sizeof("chroot=") - 1; + continue; + } + break; + case 'i': + if (strncmp(*cur, "iolog_path=", sizeof("iolog_path=") - 1) == 0) { + evlog->iolog_path = *cur + sizeof("iolog_path=") - 1; + evlog->iolog_file = strrchr(evlog->iolog_path, '/'); + if (evlog->iolog_file != NULL) + evlog->iolog_file++; + continue; + } + break; + case 'r': + if (strncmp(*cur, "runcwd=", sizeof("runcwd=") - 1) == 0) { + evlog->runcwd = *cur + sizeof("runcwd=") - 1; + continue; + } + break; + } + } + } + + debug_return; +} + +static bool +log_server_accept(char * const command_info[], char * const run_argv[], + char * const run_envp[]) +{ + struct eventlog *evlog; + struct timespec now; + bool ret = false; + debug_decl(log_server_accept, SUDOERS_DEBUG_PLUGIN); + + /* Only send accept event to log server if I/O log plugin did not. */ + if (SLIST_EMPTY(&def_log_servers) || def_log_input || def_log_output) + debug_return_bool(true); + + if (sudo_gettime_real(&now) == -1) { + sudo_warn("%s", U_("unable to get time of day")); + goto done; + } + if ((evlog = malloc(sizeof(*evlog))) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + + audit_to_eventlog(evlog, command_info, run_argv, run_envp); + if (!init_log_details(&audit_details, evlog)) + goto done; + + /* Open connection to log server, send hello and accept messages. */ + client_closure = log_server_open(&audit_details, &now, false, + SEND_ACCEPT, NULL, sudoers_audit.event_alloc); + if (client_closure != NULL) + ret = true; +done: + debug_return_bool(ret); +} + +static void +log_server_exit(int status_type, int status) +{ + debug_decl(log_server_exit, SUDOERS_DEBUG_PLUGIN); + + if (client_closure != NULL) { + int exit_status = 0, error = 0; + + if (status_type == SUDO_PLUGIN_WAIT_STATUS) { + if (WIFEXITED(status)) + exit_status = WEXITSTATUS(status); + else + exit_status = WTERMSIG(status) | 128; + } else { + /* Must be errno. */ + error = status; + } + log_server_close(client_closure, exit_status, error); + client_closure = NULL; + free(audit_details.evlog); + audit_details.evlog = NULL; + } + + debug_return; +} +#else +static bool +log_server_accept(char * const command_info[], char * const run_argv[], + char * const run_envp[]) +{ + return true; +} + +static void +log_server_exit(int status_type, int status) +{ + return; +} +#endif /* SUDOERS_LOG_CLIENT */ + +static int +sudoers_audit_accept(const char *plugin_name, unsigned int plugin_type, + char * const command_info[], char * const run_argv[], + char * const run_envp[], const char **errstr) +{ + int ret = true; + debug_decl(sudoers_audit_accept, SUDOERS_DEBUG_PLUGIN); + + /* Only log the accept event from the sudo front-end */ + if (plugin_type != SUDO_FRONT_END) + debug_return_int(true); + + if (!def_log_allowed) + debug_return_int(true); + + if (audit_success(run_argv) != 0 && !def_ignore_audit_errors) + ret = false; + + if (!log_allowed() && !def_ignore_logfile_errors) + ret = false; + + if (!log_server_accept(command_info, run_argv, run_envp)) { + if (!def_ignore_logfile_errors) + ret = false; + } + + debug_return_int(ret); +} + +static int +sudoers_audit_reject(const char *plugin_name, unsigned int plugin_type, + const char *message, char * const command_info[], const char **errstr) +{ + struct eventlog evlog; + int ret = true; + debug_decl(sudoers_audit_reject, SUDOERS_DEBUG_PLUGIN); + + /* Skip reject events that sudoers generated itself. */ + if (strncmp(plugin_name, "sudoers_", 8) == 0) + debug_return_int(true); + + if (!def_log_denied) + debug_return_int(true); + + if (audit_failure_int(NewArgv, message) != 0) { + if (!def_ignore_audit_errors) + ret = false; + } + + audit_to_eventlog(&evlog, command_info, NewArgv, env_get()); + if (!eventlog_reject(&evlog, 0, message, NULL, NULL)) + ret = false; + + if (!log_server_reject(&evlog, message, sudoers_audit.event_alloc)) + ret = false; + + debug_return_int(ret); +} + +static int +sudoers_audit_error(const char *plugin_name, unsigned int plugin_type, + const char *message, char * const command_info[], const char **errstr) +{ + struct eventlog evlog; + struct timespec now; + int ret = true; + debug_decl(sudoers_audit_error, SUDOERS_DEBUG_PLUGIN); + + /* Skip error events that sudoers generated itself. */ + if (strncmp(plugin_name, "sudoers_", 8) == 0) + debug_return_int(true); + + if (audit_failure_int(NewArgv, message) != 0) { + if (!def_ignore_audit_errors) + ret = false; + } + + if (sudo_gettime_real(&now)) { + sudo_warn("%s", U_("unable to get time of day")); + debug_return_bool(false); + } + + audit_to_eventlog(&evlog, command_info, NewArgv, env_get()); + if (!eventlog_alert(&evlog, 0, &now, message, NULL)) + ret = false; + + if (!log_server_alert(&evlog, &now, message, NULL, + sudoers_audit.event_alloc)) + ret = false; + + debug_return_int(ret); +} + +void +sudoers_audit_close(int status_type, int status) +{ + log_server_exit(status_type, status); +} + +static int +sudoers_audit_version(int verbose) +{ + debug_decl(sudoers_audit_version, SUDOERS_DEBUG_PLUGIN); + + sudo_printf(SUDO_CONV_INFO_MSG, "Sudoers audit plugin version %s\n", + PACKAGE_VERSION); + + debug_return_int(true); +} + +sudo_dso_public struct audit_plugin sudoers_audit = { + SUDO_AUDIT_PLUGIN, + SUDO_API_VERSION, + sudoers_audit_open, + sudoers_audit_close, + sudoers_audit_accept, + sudoers_audit_reject, + sudoers_audit_error, + sudoers_audit_version, + NULL, /* register_hooks */ + NULL, /* deregister_hooks */ + NULL /* event_alloc() filled in by sudo */ +}; diff --git a/plugins/sudoers/auth/API b/plugins/sudoers/auth/API new file mode 100644 index 0000000..9d58827 --- /dev/null +++ b/plugins/sudoers/auth/API @@ -0,0 +1,136 @@ +NOTE: the Sudo auth API is subject to change + +Purpose: to provide a simple API for authentication methods that + encapsulates things nicely without turning into a maze + of #ifdef's + +The sudo_auth struct looks like this: + +typedef struct sudo_auth { + int flags; /* various flags, see below */ + int status; /* status from verify routine */ + char *name; /* name of the method in string form */ + void *data; /* method-specific data pointer */ + + int (*init)(struct passwd *pw, sudo_auth *auth); + int (*setup)(struct passwd *pw, char **prompt, sudo_auth *auth); + int (*verify)(struct passwd *pw, char *p, sudo_auth *auth, struct sudo_conv_callback *callback); + int (*approval)(struct passwd *pw, sudo_auth *auth); + int (*cleanup)(struct passwd *pw, sudo_auth *auth, bool force); + int (*begin_session)(struct passwd *pw, char **user_env[], struct sudo_auth *auth); + int (*end_session)(struct passwd *pw, struct sudo_auth *auth); +} sudo_auth; + +The variables in the struct are as follows: + flags Bitwise binary flags, see below. + + status Contains the return value from the last run of + the "verify" function. Starts out as AUTH_FAILURE. + + name The name of the authentication method as a C string. + + data A pointer to method-specific data. This is passed to + all the functions of an auth method and is usually + initialized in the "init" or "setup" routines. + +Possible values of sudo_auth.flags: + FLAG_DISABLED Set if an "init" or "setup" function fails. + + FLAG_STANDALONE If set, this indicates that the method must + be the only auth method configured, and that + it will prompt for the password itself. + + FLAG_ONEANDONLY If set, this indicates that the method is the + only one in use. Can be used by auth functions + to determine whether to return a fatal or nonfatal + error. + +The member functions can return the following values: + AUTH_SUCCESS Function succeeded. For a ``verify'' function + this means the user correctly authenticated. + + AUTH_FAILURE Function failed. If this is an ``init'' or + ``setup'' routine, the auth method will be + marked as !configured. + + AUTH_FATAL A fatal error occurred. The routine should have + written an error message to stderr and optionally + sent mail to the administrator. + When verify_user() gets AUTH_FATAL from an auth + function it does an exit(1). + +The functions in the struct are as follows: + + int init(struct passwd *pw, sudo_auth *auth) + Function to do any one-time initialization for the auth + method. All of the "init" functions are run before anything + else. + + int setup(struct passwd *pw, char **prompt, sudo_auth *auth) + Function to do method-specific setup. All the "setup" + routines are run before any of the "verify" routines. A + pointer to the prompt string may be used to add method-specific + info to the prompt. + + int verify(struct passwd *pw, char *p, sudo_auth *auth, struct sudo_conv_callback *callback) + Function to do user verification for this auth method. For + standalone auth methods ``p'' is the prompt string. For + normal auth methods, ``p'' is the password the user entered. + The callback should be passed to auth_getpass() to allow sudoers + to unlock the ticket file when sudo is suspended. + Note that standalone auth methods are responsible for + rerading the password themselves. + + int approval(struct passwd *pw, struct sudo_auth *auth) + Function to perform account management and approval *after* + the user has authenticated successfully. This function may + check for expired accounts, perform time of day restrictions, etc. + For PAM, this calls pam_acct_mgmt(). For BSD auth, it calls + auth_approval(). + + int cleanup(struct passwd *pw, sudo_auth *auth, bool force) + Function to do per-auth method cleanup. This is only run + at the end of the authentication process, after the user + has completely failed or succeeded to authenticate. + The ``auth->status'' variable contains the result of the + last authentication attempt which may be interesting. + If the force flag is set, cleanup should happen immediately. + + int begin_session(struct passwd *pw, char **user_env[], struct sudo_auth *auth) + Function to begin a user session. This is used for session handling + in PAM and SIA. + + int end_session(struct passwd *pw, struct sudo_auth *auth) + Function to end a user session. This is used for session handling + in PAM and SIA. + +A note about standalone methods. Some authentication methods can't +coexist with any others. This may be because they encapsulate other +methods (pam, sia) or because they have a special way of interacting +with the user (securid). + +Adding a new authentication method: + +Each method should live in its own file. Add prototypes for the functions +in sudo_auth.h. + +Add the method to the ``auth_switch'' in sudo_auth.c. Note that +standalone methods must go first. If ``fooauth'' is a normal auth +method, its entry would look like: + +#ifdef HAVE_FOOAUTH +AUTH_ENTRY("foo", 0, foo_init, foo_setup, foo_verify, + foo_cleanup, foo_begin_session, foo_end_session) +#endif + +If this is a standalone method, it would be: + +#ifdef HAVE_FOOAUTH +AUTH_ENTRY("foo", FLAG_STANDALONE, foo_init, foo_setup, foo_verify, + foo_cleanup, foo_begin_session, foo_end_session) +#endif + +If the method needs to run as the user, not root, add FLAG_USER to +the second argument in the AUTH_ENTRY line. If you don't have an +init/setup/cleanup/begin/end routine, just use a NULL for that +field. diff --git a/plugins/sudoers/auth/afs.c b/plugins/sudoers/auth/afs.c new file mode 100644 index 0000000..616a8a8 --- /dev/null +++ b/plugins/sudoers/auth/afs.c @@ -0,0 +1,80 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999, 2001-2005, 2007, 2010-2012, 2014-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_AFS + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +int +sudo_afs_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + struct ktc_encryptionKey afs_key; + struct ktc_token afs_token; + debug_decl(sudo_afs_verify, SUDOERS_DEBUG_AUTH); + + /* Try to just check the password */ + ka_StringToKey(pass, NULL, &afs_key); + if (ka_GetAdminToken(pw->pw_name, /* name */ + NULL, /* instance */ + NULL, /* realm */ + &afs_key, /* key (contains password) */ + 0, /* lifetime */ + &afs_token, /* token */ + 0) == 0) /* new */ + debug_return_int(AUTH_SUCCESS); + + /* Fall back on old method XXX - needed? */ + setpag(); + if (ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION+KA_USERAUTH_DOSETPAG, + pw->pw_name, /* name */ + NULL, /* instance */ + NULL, /* realm */ + pass, /* password */ + 0, /* lifetime */ + NULL, /* expiration ptr (unused) */ + 0, /* spare */ + NULL) == 0) /* reason */ + debug_return_int(AUTH_SUCCESS); + + debug_return_int(AUTH_FAILURE); +} + +#endif HAVE_AFS diff --git a/plugins/sudoers/auth/aix_auth.c b/plugins/sudoers/auth/aix_auth.c new file mode 100644 index 0000000..6272811 --- /dev/null +++ b/plugins/sudoers/auth/aix_auth.c @@ -0,0 +1,308 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_AIXAUTH + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +/* + * For a description of the AIX authentication API, see + * http://publib16.boulder.ibm.com/doc_link/en_US/a_doc_lib/libs/basetrf1/authenticate.htm + */ + +#ifdef HAVE_PAM +# define AIX_AUTH_UNKNOWN 0 +# define AIX_AUTH_STD 1 +# define AIX_AUTH_PAM 2 + +static int +sudo_aix_authtype(void) +{ + size_t linesize = 0; + ssize_t len; + char *cp, *line = NULL; + bool in_stanza = false; + int authtype = AIX_AUTH_UNKNOWN; + FILE *fp; + debug_decl(sudo_aix_authtype, SUDOERS_DEBUG_AUTH); + + if ((fp = fopen("/etc/security/login.cfg", "r")) == NULL) + debug_return_int(AIX_AUTH_UNKNOWN); + + while ((len = getdelim(&line, &linesize, '\n', fp)) != -1) { + /* First remove comments. */ + if ((cp = strchr(line, '#')) != NULL) { + *cp = '\0'; + len = (ssize_t)(cp - line); + } + + /* Next remove trailing newlines and whitespace. */ + while (len > 0 && isspace((unsigned char)line[len - 1])) + line[--len] = '\0'; + + /* Skip blank lines. */ + if (len == 0) + continue; + + /* Match start of the usw stanza. */ + if (!in_stanza) { + if (strncmp(line, "usw:", 4) == 0) + in_stanza = true; + continue; + } + + /* Check for end of the usw stanza. */ + if (!isblank((unsigned char)line[0])) { + in_stanza = false; + break; + } + + /* Skip leading blanks. */ + cp = line; + do { + cp++; + } while (isblank((unsigned char)*cp)); + + /* Match "auth_type = (PAM_AUTH|STD_AUTH)". */ + if (strncmp(cp, "auth_type", 9) != 0) + continue; + cp += 9; + while (isblank((unsigned char)*cp)) + cp++; + if (*cp++ != '=') + continue; + while (isblank((unsigned char)*cp)) + cp++; + if (strcmp(cp, "PAM_AUTH") == 0) { + authtype = AIX_AUTH_PAM; + break; + } + if (strcmp(cp, "STD_AUTH") == 0) { + authtype = AIX_AUTH_STD; + break; + } + } + free(line); + fclose(fp); + + debug_return_int(authtype); +} +#endif /* HAVE_PAM */ + +int +sudo_aix_init(struct passwd *pw, sudo_auth *auth) +{ + debug_decl(sudo_aix_init, SUDOERS_DEBUG_AUTH); + +#ifdef HAVE_PAM + /* Check auth_type in /etc/security/login.cfg. */ + if (sudo_aix_authtype() == AIX_AUTH_PAM) { + if (sudo_pam_init_quiet(pw, auth) == AUTH_SUCCESS) { + /* Fail AIX authentication so we can use PAM instead. */ + debug_return_int(AUTH_FAILURE); + } + } +#endif + debug_return_int(AUTH_SUCCESS); +} + +/* Ignore AIX password incorrect message */ +static bool +sudo_aix_valid_message(const char *message) +{ + const char *cp; + const char badpass_msgid[] = "3004-300"; + debug_decl(sudo_aix_valid_message, SUDOERS_DEBUG_AUTH); + + if (message == NULL || message[0] == '\0') + debug_return_bool(false); + + /* Match "3004-300: You entered an invalid login name or password" */ + for (cp = message; *cp != '\0'; cp++) { + if (isdigit((unsigned char)*cp)) { + if (strncmp(cp, badpass_msgid, strlen(badpass_msgid)) == 0) + debug_return_bool(false); + break; + } + } + debug_return_bool(true); +} + +/* + * Change the user's password. If root changes the user's password + * the ADMCHG flag is set on the account (and the user must change + * it again) so we run passwd(1) as the user. This does mean that + * the user will need to re-enter their original password again, + * unlike with su(1). We may consider using pwdadm(1) as root to + * change the password and then clear the flag in the future. + */ +static bool +sudo_aix_change_password(const char *user) +{ + struct sigaction sa, savechld; + pid_t child, pid; + bool ret = false; + sigset_t mask; + int status; + debug_decl(sudo_aix_change_password, SUDOERS_DEBUG_AUTH); + + /* Set SIGCHLD handler to default since we call waitpid() below. */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + (void) sigaction(SIGCHLD, &sa, &savechld); + + switch (child = sudo_debug_fork()) { + case -1: + /* error */ + sudo_warn("%s", U_("unable to fork")); + break; + case 0: + /* child, run passwd(1) */ + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + (void) sigprocmask(SIG_UNBLOCK, &mask, NULL); + set_perms(PERM_USER); + execl("/usr/bin/passwd", "passwd", user, (char *)NULL); + sudo_warn("passwd"); + _exit(127); + /* NOTREACHED */ + default: + /* parent */ + break; + } + + /* Wait for passwd(1) to complete. */ + do { + pid = waitpid(child, &status, 0); + } while (pid == -1 && errno == EINTR); + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "child (%d) exit value %d", (int)child, status); + if (pid != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0) + ret = true; + + /* Restore saved SIGCHLD handler. */ + (void) sigaction(SIGCHLD, &savechld, NULL); + + debug_return_bool(ret); +} + +int +sudo_aix_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char *pass, *message = NULL; + int result = 1, reenter = 0; + int ret = AUTH_SUCCESS; + debug_decl(sudo_aix_verify, SUDOERS_DEBUG_AUTH); + + do { + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass == NULL) + break; + free(message); + message = NULL; + result = authenticate(pw->pw_name, pass, &reenter, &message); + freezero(pass, strlen(pass)); + prompt = message; + } while (reenter); + + if (result != 0) { + /* Display error message, if any. */ + if (sudo_aix_valid_message(message)) + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "%s", message); + ret = pass ? AUTH_FAILURE : AUTH_INTR; + } + free(message); + message = NULL; + + /* Check if password expired and allow user to change it if possible. */ + if (ret == AUTH_SUCCESS) { + result = passwdexpired(pw->pw_name, &message); + if (message != NULL && message[0] != '\0') { + int msg_type = SUDO_CONV_PREFER_TTY; + msg_type |= result ? SUDO_CONV_ERROR_MSG : SUDO_CONV_INFO_MSG, + sudo_printf(msg_type, "%s", message); + free(message); + message = NULL; + } + switch (result) { + case 0: + /* password not expired. */ + break; + case 1: + /* password expired, user must change it */ + if (!sudo_aix_change_password(pw->pw_name)) { + sudo_warnx(U_("unable to change password for %s"), pw->pw_name); + ret = AUTH_FATAL; + } + break; + case 2: + /* password expired, only admin can change it */ + ret = AUTH_FATAL; + break; + default: + /* error (-1) */ + sudo_warn("passwdexpired"); + ret = AUTH_FATAL; + break; + } + } + + debug_return_int(ret); +} + +int +sudo_aix_cleanup(struct passwd *pw, sudo_auth *auth, bool force) +{ + debug_decl(sudo_aix_cleanup, SUDOERS_DEBUG_AUTH); + + /* Unset AUTHSTATE as it may not be correct for the runas user. */ + if (sudo_unsetenv("AUTHSTATE") == -1) + debug_return_int(AUTH_FAILURE); + + debug_return_int(AUTH_SUCCESS); +} + +#endif /* HAVE_AIXAUTH */ diff --git a/plugins/sudoers/auth/bsdauth.c b/plugins/sudoers/auth/bsdauth.c new file mode 100644 index 0000000..fec7402 --- /dev/null +++ b/plugins/sudoers/auth/bsdauth.c @@ -0,0 +1,201 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2000-2005, 2007-2008, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_BSD_AUTH_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +# ifndef LOGIN_DEFROOTCLASS +# define LOGIN_DEFROOTCLASS "daemon" +# endif + +struct bsdauth_state { + auth_session_t *as; + login_cap_t *lc; +}; + +int +bsdauth_init(struct passwd *pw, sudo_auth *auth) +{ + static struct bsdauth_state state; + debug_decl(bsdauth_init, SUDOERS_DEBUG_AUTH); + + /* Get login class based on auth user, which may not be invoking user. */ + if (pw->pw_class && *pw->pw_class) + state.lc = login_getclass(pw->pw_class); + else + state.lc = login_getclass(pw->pw_uid ? LOGIN_DEFCLASS : LOGIN_DEFROOTCLASS); + if (state.lc == NULL) { + log_warning(0, + N_("unable to get login class for user %s"), pw->pw_name); + debug_return_int(AUTH_FATAL); + } + + if ((state.as = auth_open()) == NULL) { + log_warning(0, N_("unable to begin bsd authentication")); + login_close(state.lc); + debug_return_int(AUTH_FATAL); + } + + /* XXX - maybe check the auth style earlier? */ + login_style = login_getstyle(state.lc, login_style, "auth-sudo"); + if (login_style == NULL) { + log_warningx(0, N_("invalid authentication type")); + auth_close(state.as); + login_close(state.lc); + debug_return_int(AUTH_FATAL); + } + + if (auth_setitem(state.as, AUTHV_STYLE, login_style) < 0 || + auth_setitem(state.as, AUTHV_NAME, pw->pw_name) < 0 || + auth_setitem(state.as, AUTHV_CLASS, login_class) < 0) { + log_warningx(0, N_("unable to initialize BSD authentication")); + auth_close(state.as); + login_close(state.lc); + debug_return_int(AUTH_FATAL); + } + + auth->data = (void *) &state; + debug_return_int(AUTH_SUCCESS); +} + +int +bsdauth_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char *pass; + char *s; + size_t len; + int authok = 0; + struct sigaction sa, osa; + auth_session_t *as = ((struct bsdauth_state *) auth->data)->as; + debug_decl(bsdauth_verify, SUDOERS_DEBUG_AUTH); + + /* save old signal handler */ + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + (void) sigaction(SIGCHLD, &sa, &osa); + + /* + * If there is a challenge then print that instead of the normal + * prompt. If the user just hits return we prompt again with echo + * turned on, which is useful for challenge/response things like + * S/Key. + */ + if ((s = auth_challenge(as)) == NULL) { + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + } else { + pass = auth_getpass(s, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass && *pass == '\0') { + if ((prompt = strrchr(s, '\n'))) + prompt++; + else + prompt = s; + + /* + * Append '[echo on]' to the last line of the challenge and + * reprompt with echo turned on. + */ + len = strlen(prompt) - 1; + while (isspace(prompt[len]) || prompt[len] == ':') + prompt[len--] = '\0'; + if (asprintf(&s, "%s [echo on]: ", prompt) == -1) { + log_warningx(0, N_("unable to allocate memory")); + debug_return_int(AUTH_FATAL); + } + free(pass); + pass = auth_getpass(s, SUDO_CONV_PROMPT_ECHO_ON, callback); + free(s); + } + } + + if (pass) { + authok = auth_userresponse(as, pass, 1); + freezero(pass, strlen(pass)); + } + + /* restore old signal handler */ + (void) sigaction(SIGCHLD, &osa, NULL); + + if (authok) + debug_return_int(AUTH_SUCCESS); + + if (!pass) + debug_return_int(AUTH_INTR); + + if ((s = auth_getvalue(as, "errormsg")) != NULL) + log_warningx(0, "%s", s); + debug_return_int(AUTH_FAILURE); +} + +int +bsdauth_approval(struct passwd *pw, sudo_auth *auth, bool exempt) +{ + struct bsdauth_state *state = auth->data; + debug_decl(bsdauth_approval, SUDOERS_DEBUG_AUTH); + + if (auth_approval(state->as, state->lc, pw->pw_name, "auth-sudo") == 0) { + if (auth_getstate(state->as) & AUTH_EXPIRED) + log_warningx(0, "%s", N_("your account has expired")); + else + log_warningx(0, "%s", N_("approval failed")); + debug_return_int(AUTH_FAILURE); + } + debug_return_int(AUTH_SUCCESS); +} + +int +bsdauth_cleanup(struct passwd *pw, sudo_auth *auth, bool force) +{ + struct bsdauth_state *state = auth->data; + debug_decl(bsdauth_cleanup, SUDOERS_DEBUG_AUTH); + + if (state != NULL) { + auth_close(state->as); + login_close(state->lc); + } + + debug_return_int(AUTH_SUCCESS); +} + +#endif /* HAVE_BSD_AUTH_H */ diff --git a/plugins/sudoers/auth/dce.c b/plugins/sudoers/auth/dce.c new file mode 100644 index 0000000..e1d911c --- /dev/null +++ b/plugins/sudoers/auth/dce.c @@ -0,0 +1,194 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2010-2012, 2014-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ +/* + * The code below basically comes from the examples supplied on + * the OSF DCE 1.0.3 manpages for the sec_login routines, with + * enough additional polishing to make the routine work with the + * rest of sudo. + * + * This code is known to work on HP 700 and 800 series systems + * running HP-UX 9.X and 10.X, with either HP's version 1.2.1 of DCE. + * (aka, OSF DCE 1.0.3) or with HP's version 1.4 of DCE (aka, OSF + * DCE 1.1). + */ + +#include + +#ifdef HAVE_DCE + +#include +#include +#include +#include +#include +#include + +#include +#include +#include /* required to call dce_error_inq_text routine */ + +#include "sudoers.h" +#include "sudo_auth.h" + +static int check_dce_status(error_status_t, char *); + +int +sudo_dce_verify(struct passwd *pw, char *plain_pw, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + struct passwd temp_pw; + sec_passwd_rec_t password_rec; + sec_login_handle_t login_context; + boolean32 reset_passwd; + sec_login_auth_src_t auth_src; + error_status_t status; + debug_decl(sudo_dce_verify, SUDOERS_DEBUG_AUTH); + + /* + * Create the local context of the DCE principal necessary + * to perform authenticated network operations. The network + * identity set up by this operation cannot be used until it + * is validated via sec_login_validate_identity(). + */ + if (sec_login_setup_identity((unsigned_char_p_t) pw->pw_name, + sec_login_no_flags, &login_context, &status)) { + + if (check_dce_status(status, "sec_login_setup_identity(1):")) + debug_return_int(AUTH_FAILURE); + + password_rec.key.key_type = sec_passwd_plain; + password_rec.key.tagged_union.plain = (idl_char *) plain_pw; + password_rec.pepper = NULL; + password_rec.version_number = sec_passwd_c_version_none; + + /* Validate the login context with the password */ + if (sec_login_validate_identity(login_context, &password_rec, + &reset_passwd, &auth_src, &status)) { + + if (check_dce_status(status, "sec_login_validate_identity(1):")) + debug_return_int(AUTH_FAILURE); + + /* + * Certify that the DCE Security Server used to set + * up and validate a login context is legitimate. Makes + * sure that we didn't get spoofed by another DCE server. + */ + if (!sec_login_certify_identity(login_context, &status)) { + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "Whoa! Bogus authentication server!\n"); + (void) check_dce_status(status,"sec_login_certify_identity(1):"); + debug_return_int(AUTH_FAILURE); + } + if (check_dce_status(status, "sec_login_certify_identity(2):")) + debug_return_int(AUTH_FAILURE); + + /* + * Sets the network credentials to those specified + * by the now validated login context. + */ + sec_login_set_context(login_context, &status); + if (check_dce_status(status, "sec_login_set_context:")) + debug_return_int(AUTH_FAILURE); + + /* + * Oops, your credentials were no good. Possibly + * caused by clock times out of adjustment between + * DCE client and DCE security server... + */ + if (auth_src != sec_login_auth_src_network) { + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "You have no network credentials.\n"); + debug_return_int(AUTH_FAILURE); + } + /* Check if the password has aged and is thus no good */ + if (reset_passwd) { + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "Your DCE password needs resetting.\n"); + debug_return_int(AUTH_FAILURE); + } + + /* + * We should be a valid user by this point. Pull the + * user's password structure from the DCE security + * server just to make sure. If we get it with no + * problems, then we really are legitimate... + */ + sec_login_get_pwent(login_context, (sec_login_passwd_t) &temp_pw, + &status); + if (check_dce_status(status, "sec_login_get_pwent:")) + debug_return_int(AUTH_FAILURE); + + /* + * If we get to here, then the pwent above properly fetched + * the password structure from the DCE registry, so the user + * must be valid. We don't really care what the user's + * registry password is, just that the user could be + * validated. In fact, if we tried to compare the local + * password to the DCE entry at this point, the operation + * would fail if the hidden password feature is turned on, + * because the password field would contain an asterisk. + * Also go ahead and destroy the user's DCE login context + * before we leave here (and don't bother checking the + * status), in order to clean up credentials files in + * /opt/dcelocal/var/security/creds. By doing this, we are + * assuming that the user will not need DCE authentication + * later in the program, only local authentication. If this + * is not true, then the login_context will have to be + * returned to the calling program, and the context purged + * somewhere later in the program. + */ + sec_login_purge_context(&login_context, &status); + debug_return_int(AUTH_SUCCESS); + } else { + if(check_dce_status(status, "sec_login_validate_identity(2):")) + debug_return_int(AUTH_FAILURE); + sec_login_purge_context(&login_context, &status); + if(check_dce_status(status, "sec_login_purge_context:")) + debug_return_int(AUTH_FAILURE); + } + } + (void) check_dce_status(status, "sec_login_setup_identity(2):"); + debug_return_int(AUTH_FAILURE); +} + +/* Returns 0 for DCE "ok" status, 1 otherwise */ +static int +check_dce_status(error_status_t input_status, char *comment) +{ + int error_stat; + unsigned char error_string[dce_c_error_string_len]; + debug_decl(check_dce_status, SUDOERS_DEBUG_AUTH); + + if (input_status == rpc_s_ok) + debug_return_int(0); + dce_error_inq_text(input_status, error_string, &error_stat); + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "%s %s\n", comment, error_string); + debug_return_int(1); +} + +#endif /* HAVE_DCE */ diff --git a/plugins/sudoers/auth/fwtk.c b/plugins/sudoers/auth/fwtk.c new file mode 100644 index 0000000..7f3385d --- /dev/null +++ b/plugins/sudoers/auth/fwtk.c @@ -0,0 +1,150 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2008, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_FWTK + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +int +sudo_fwtk_init(struct passwd *pw, sudo_auth *auth) +{ + static Cfg *confp; /* Configuration entry struct */ + char resp[128]; /* Response from the server */ + debug_decl(sudo_fwtk_init, SUDOERS_DEBUG_AUTH); + + if ((confp = cfg_read("sudo")) == (Cfg *)-1) { + sudo_warnx("%s", U_("unable to read fwtk config")); + debug_return_int(AUTH_FATAL); + } + + if (auth_open(confp)) { + sudo_warnx("%s", U_("unable to connect to authentication server")); + debug_return_int(AUTH_FATAL); + } + + /* Get welcome message from auth server */ + if (auth_recv(resp, sizeof(resp))) { + sudo_warnx("%s", U_("lost connection to authentication server")); + debug_return_int(AUTH_FATAL); + } + if (strncmp(resp, "Authsrv ready", 13) != 0) { + sudo_warnx(U_("authentication server error:\n%s"), resp); + debug_return_int(AUTH_FATAL); + } + + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_fwtk_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char *pass; /* Password from the user */ + char buf[SUDO_CONV_REPL_MAX + 12]; /* General prupose buffer */ + char resp[128]; /* Response from the server */ + int error; + debug_decl(sudo_fwtk_verify, SUDOERS_DEBUG_AUTH); + + /* Send username to authentication server. */ + (void) snprintf(buf, sizeof(buf), "authorize %s 'sudo'", pw->pw_name); +restart: + if (auth_send(buf) || auth_recv(resp, sizeof(resp))) { + sudo_warnx("%s", U_("lost connection to authentication server")); + debug_return_int(AUTH_FATAL); + } + + /* Get the password/response from the user. */ + if (strncmp(resp, "challenge ", 10) == 0) { + (void) snprintf(buf, sizeof(buf), "%s\nResponse: ", &resp[10]); + pass = auth_getpass(buf, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass && *pass == '\0') { + free(pass); + pass = auth_getpass("Response [echo on]: ", + SUDO_CONV_PROMPT_ECHO_ON, callback); + } + } else if (strncmp(resp, "chalnecho ", 10) == 0) { + pass = auth_getpass(&resp[10], SUDO_CONV_PROMPT_ECHO_OFF, callback); + } else if (strncmp(resp, "password", 8) == 0) { + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + } else if (strncmp(resp, "display ", 8) == 0) { + sudo_printf(SUDO_CONV_INFO_MSG|SUDO_CONV_PREFER_TTY, "%s\n", &resp[8]); + strlcpy(buf, "response noop", sizeof(buf)); + goto restart; + } else { + sudo_warnx("%s", resp); + debug_return_int(AUTH_FATAL); + } + if (!pass) { /* ^C or error */ + debug_return_int(AUTH_INTR); + } + + /* Send the user's response to the server */ + (void) snprintf(buf, sizeof(buf), "response '%s'", pass); + if (auth_send(buf) || auth_recv(resp, sizeof(resp))) { + sudo_warnx("%s", U_("lost connection to authentication server")); + error = AUTH_FATAL; + goto done; + } + + if (strncmp(resp, "ok", 2) == 0) { + error = AUTH_SUCCESS; + goto done; + } + + /* Main loop prints "Permission Denied" or insult. */ + if (strcmp(resp, "Permission Denied.") != 0) + sudo_warnx("%s", resp); + error = AUTH_FAILURE; +done: + explicit_bzero(buf, sizeof(buf)); + freezero(pass, strlen(pass)); + debug_return_int(error); +} + +int +sudo_fwtk_cleanup(struct passwd *pw, sudo_auth *auth, bool force) +{ + debug_decl(sudo_fwtk_cleanup, SUDOERS_DEBUG_AUTH); + + auth_close(); + debug_return_int(AUTH_SUCCESS); +} + +#endif /* HAVE_FWTK */ diff --git a/plugins/sudoers/auth/kerb5.c b/plugins/sudoers/auth/kerb5.c new file mode 100644 index 0000000..a607226 --- /dev/null +++ b/plugins/sudoers/auth/kerb5.c @@ -0,0 +1,332 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2008, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_KERB5 + +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_HEIMDAL +#include +#endif + +#include "sudoers.h" +#include "sudo_auth.h" + +#ifdef HAVE_HEIMDAL +# define extract_name(c, p) krb5_principal_get_comp_string(c, p, 1) +# define krb5_free_data_contents(c, d) krb5_data_free(d) +#else +# define extract_name(c, p) (krb5_princ_component(c, p, 1)->data) +#endif + +#ifndef HAVE_KRB5_VERIFY_USER +static int verify_krb_v5_tgt(krb5_context, krb5_creds *, char *); +#endif +static struct _sudo_krb5_data { + krb5_context sudo_context; + krb5_principal princ; + krb5_ccache ccache; +} sudo_krb5_data = { NULL, NULL, NULL }; +typedef struct _sudo_krb5_data *sudo_krb5_datap; + +#ifdef SUDO_KRB5_INSTANCE +static const char *sudo_krb5_instance = SUDO_KRB5_INSTANCE; +#else +static const char *sudo_krb5_instance = NULL; +#endif + +#ifndef HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC +static krb5_error_code +krb5_get_init_creds_opt_alloc(krb5_context context, + krb5_get_init_creds_opt **opts) +{ + *opts = malloc(sizeof(krb5_get_init_creds_opt)); + if (*opts == NULL) + return KRB5_CC_NOMEM; + krb5_get_init_creds_opt_init(*opts); + return 0; +} + +static void +krb5_get_init_creds_opt_free(krb5_get_init_creds_opt *opts) +{ + free(opts); +} +#endif + +int +sudo_krb5_setup(struct passwd *pw, char **promptp, sudo_auth *auth) +{ + static char *krb5_prompt; + debug_decl(sudo_krb5_init, SUDOERS_DEBUG_AUTH); + + if (krb5_prompt == NULL) { + krb5_context sudo_context; + krb5_principal princ; + char *pname; + krb5_error_code error; + + sudo_context = ((sudo_krb5_datap) auth->data)->sudo_context; + princ = ((sudo_krb5_datap) auth->data)->princ; + + /* + * Really, we need to tell the caller not to prompt for password. The + * API does not currently provide this unless the auth is standalone. + */ + if ((error = krb5_unparse_name(sudo_context, princ, &pname))) { + log_warningx(0, + N_("%s: unable to convert principal to string ('%s'): %s"), + auth->name, pw->pw_name, error_message(error)); + debug_return_int(AUTH_FAILURE); + } + + /* Only rewrite prompt if user didn't specify their own. */ + /*if (!strcmp(prompt, PASSPROMPT)) { */ + if (asprintf(&krb5_prompt, "Password for %s: ", pname) == -1) { + log_warningx(0, N_("unable to allocate memory")); + free(pname); + debug_return_int(AUTH_FATAL); + } + /*}*/ + free(pname); + } + *promptp = krb5_prompt; + + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_krb5_init(struct passwd *pw, sudo_auth *auth) +{ + krb5_context sudo_context; + krb5_error_code error; + char cache_name[64], *pname = pw->pw_name; + debug_decl(sudo_krb5_init, SUDOERS_DEBUG_AUTH); + + auth->data = (void *) &sudo_krb5_data; /* Stash all our data here */ + + if (sudo_krb5_instance != NULL) { + int len = asprintf(&pname, "%s%s%s", pw->pw_name, + sudo_krb5_instance[0] != '/' ? "/" : "", sudo_krb5_instance); + if (len == -1) { + log_warningx(0, N_("unable to allocate memory")); + debug_return_int(AUTH_FATAL); + } + } + +#ifdef HAVE_KRB5_INIT_SECURE_CONTEXT + error = krb5_init_secure_context(&(sudo_krb5_data.sudo_context)); +#else + error = krb5_init_context(&(sudo_krb5_data.sudo_context)); +#endif + if (error) + goto done; + sudo_context = sudo_krb5_data.sudo_context; + + error = krb5_parse_name(sudo_context, pname, &(sudo_krb5_data.princ)); + if (error) { + log_warningx(0, N_("%s: unable to parse '%s': %s"), auth->name, pname, + error_message(error)); + goto done; + } + + (void) snprintf(cache_name, sizeof(cache_name), "MEMORY:sudocc_%ld", + (long) getpid()); + if ((error = krb5_cc_resolve(sudo_context, cache_name, + &(sudo_krb5_data.ccache)))) { + log_warningx(0, N_("%s: unable to resolve credential cache: %s"), + auth->name, error_message(error)); + goto done; + } + +done: + if (sudo_krb5_instance != NULL) + free(pname); + debug_return_int(error ? AUTH_FAILURE : AUTH_SUCCESS); +} + +#ifdef HAVE_KRB5_VERIFY_USER +int +sudo_krb5_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + krb5_context sudo_context; + krb5_principal princ; + krb5_ccache ccache; + krb5_error_code error; + debug_decl(sudo_krb5_verify, SUDOERS_DEBUG_AUTH); + + sudo_context = ((sudo_krb5_datap) auth->data)->sudo_context; + princ = ((sudo_krb5_datap) auth->data)->princ; + ccache = ((sudo_krb5_datap) auth->data)->ccache; + + error = krb5_verify_user(sudo_context, princ, ccache, pass, 1, NULL); + debug_return_int(error ? AUTH_FAILURE : AUTH_SUCCESS); +} +#else +int +sudo_krb5_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + krb5_context sudo_context; + krb5_principal princ; + krb5_creds credbuf, *creds = NULL; + krb5_ccache ccache; + krb5_error_code error; + krb5_get_init_creds_opt *opts = NULL; + debug_decl(sudo_krb5_verify, SUDOERS_DEBUG_AUTH); + + sudo_context = ((sudo_krb5_datap) auth->data)->sudo_context; + princ = ((sudo_krb5_datap) auth->data)->princ; + ccache = ((sudo_krb5_datap) auth->data)->ccache; + + /* Set default flags based on the local config file. */ + error = krb5_get_init_creds_opt_alloc(sudo_context, &opts); + if (error) { + log_warningx(0, N_("%s: unable to allocate options: %s"), auth->name, + error_message(error)); + goto done; + } +#ifdef HAVE_HEIMDAL + krb5_get_init_creds_opt_set_default_flags(sudo_context, NULL, + krb5_principal_get_realm(sudo_context, princ), opts); +#endif + + /* Note that we always obtain a new TGT to verify the user */ + if ((error = krb5_get_init_creds_password(sudo_context, &credbuf, princ, + pass, krb5_prompter_posix, + NULL, 0, NULL, opts))) { + /* Don't print error if just a bad password */ + if (error != KRB5KRB_AP_ERR_BAD_INTEGRITY) { + log_warningx(0, N_("%s: unable to get credentials: %s"), + auth->name, error_message(error)); + } + goto done; + } + creds = &credbuf; + + /* Verify the TGT to prevent spoof attacks. */ + if ((error = verify_krb_v5_tgt(sudo_context, creds, auth->name))) + goto done; + + /* Store credential in cache. */ + if ((error = krb5_cc_initialize(sudo_context, ccache, princ))) { + log_warningx(0, N_("%s: unable to initialize credential cache: %s"), + auth->name, error_message(error)); + } else if ((error = krb5_cc_store_cred(sudo_context, ccache, creds))) { + log_warningx(0, N_("%s: unable to store credential in cache: %s"), + auth->name, error_message(error)); + } + +done: + if (opts) { +#ifdef HAVE_KRB5_GET_INIT_CREDS_OPT_FREE_TWO_ARGS + krb5_get_init_creds_opt_free(sudo_context, opts); +#else + krb5_get_init_creds_opt_free(opts); +#endif + } + if (creds) + krb5_free_cred_contents(sudo_context, creds); + debug_return_int(error ? AUTH_FAILURE : AUTH_SUCCESS); +} +#endif + +int +sudo_krb5_cleanup(struct passwd *pw, sudo_auth *auth, bool force) +{ + krb5_context sudo_context; + krb5_principal princ; + krb5_ccache ccache; + debug_decl(sudo_krb5_cleanup, SUDOERS_DEBUG_AUTH); + + sudo_context = ((sudo_krb5_datap) auth->data)->sudo_context; + princ = ((sudo_krb5_datap) auth->data)->princ; + ccache = ((sudo_krb5_datap) auth->data)->ccache; + + if (sudo_context) { + if (ccache) + krb5_cc_destroy(sudo_context, ccache); + if (princ) + krb5_free_principal(sudo_context, princ); + krb5_free_context(sudo_context); + } + + debug_return_int(AUTH_SUCCESS); +} + +#ifndef HAVE_KRB5_VERIFY_USER +/* + * Verify the Kerberos ticket-granting ticket just retrieved for the + * user. If the Kerberos server doesn't respond, assume the user is + * trying to fake us out (since we DID just get a TGT from what is + * supposedly our KDC). + * + * Returns 0 for successful authentication, non-zero for failure. + */ +static int +verify_krb_v5_tgt(krb5_context sudo_context, krb5_creds *cred, char *auth_name) +{ + krb5_error_code error; + krb5_principal server; + krb5_verify_init_creds_opt vopt; + debug_decl(verify_krb_v5_tgt, SUDOERS_DEBUG_AUTH); + + /* + * Get the server principal for the local host. + * (Use defaults of "host" and canonicalized local name.) + */ + if ((error = krb5_sname_to_principal(sudo_context, NULL, NULL, + KRB5_NT_SRV_HST, &server))) { + log_warningx(0, N_("%s: unable to get host principal: %s"), auth_name, + error_message(error)); + debug_return_int(-1); + } + + /* Initialize verify opts and set secure mode */ + krb5_verify_init_creds_opt_init(&vopt); + krb5_verify_init_creds_opt_set_ap_req_nofail(&vopt, 1); + + /* verify the Kerberos ticket-granting ticket we just retrieved */ + error = krb5_verify_init_creds(sudo_context, cred, server, NULL, + NULL, &vopt); + krb5_free_principal(sudo_context, server); + if (error) { + log_warningx(0, N_("%s: Cannot verify TGT! Possible attack!: %s"), + auth_name, error_message(error)); + } + debug_return_int(error); +} +#endif + +#endif /* HAVE_KERB5 */ diff --git a/plugins/sudoers/auth/pam.c b/plugins/sudoers/auth/pam.c new file mode 100644 index 0000000..6310364 --- /dev/null +++ b/plugins/sudoers/auth/pam.c @@ -0,0 +1,765 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_PAM + +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_PAM_PAM_APPL_H +# include +#else +# include +#endif + +#ifdef __hpux +# include +#endif + +#ifdef HAVE_LIBINTL_H +# if defined(__LINUX_PAM__) +# define PAM_TEXT_DOMAIN "Linux-PAM" +# elif defined(__sun__) +# define PAM_TEXT_DOMAIN "SUNW_OST_SYSOSPAM" +# endif +#endif + +/* We don't want to translate the strings in the calls to dgt(). */ +#ifdef PAM_TEXT_DOMAIN +# define dgt(d, t) dgettext(d, t) +#endif + +#include "sudoers.h" +#include "sudo_auth.h" + +/* Only OpenPAM and Linux PAM use const qualifiers. */ +#ifdef PAM_SUN_CODEBASE +# define PAM_CONST +#else +# define PAM_CONST const +#endif + +/* Ambiguity in spec: is it an array of pointers or a pointer to an array? */ +#ifdef PAM_SUN_CODEBASE +# define PAM_MSG_GET(msg, n) (*(msg) + (n)) +#else +# define PAM_MSG_GET(msg, n) ((msg)[(n)]) +#endif + +#ifndef PAM_DATA_SILENT +#define PAM_DATA_SILENT 0 +#endif + +struct conv_filter { + char *msg; + size_t msglen; +}; + +static int converse(int, PAM_CONST struct pam_message **, + struct pam_response **, void *); +static struct sudo_conv_callback *conv_callback; +static struct pam_conv pam_conv = { converse, &conv_callback }; +static char *def_prompt = PASSPROMPT; +static bool getpass_error; +static pam_handle_t *pamh; +static struct conv_filter *conv_filter; + +static void +conv_filter_init(void) +{ + debug_decl(conv_filter_init, SUDOERS_DEBUG_AUTH); + +#ifdef __hpux + /* + * HP-UX displays last login information as part of either account + * management (in trusted mode) or session management (regular mode). + * Filter those out in the conversation function unless running a shell. + */ + if (!ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)) { + int i, nfilt = 0, maxfilters = 0; + struct conv_filter *newfilt; + nl_catd catd; + char *msg; + + /* + * Messages from PAM account management when trusted mode is enabled: + * 1 Last successful login for %s: %s + * 2 Last successful login for %s: %s on %s + * 3 Last unsuccessful login for %s: %s + * 4 Last unsuccessful login for %s: %s on %s + */ + if ((catd = catopen("pam_comsec", NL_CAT_LOCALE)) != -1) { + maxfilters += 4; + newfilt = reallocarray(conv_filter, maxfilters + 1, + sizeof(*conv_filter)); + if (newfilt != NULL) { + conv_filter = newfilt; + for (i = 1; i < 5; i++) { + if ((msg = catgets(catd, 1, i, NULL)) == NULL) + break; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "adding \"%s\" to conversation filter", msg); + if ((conv_filter[nfilt].msg = strdup(msg)) == NULL) + break; + conv_filter[nfilt].msglen = strcspn(msg, "%"); + nfilt++; + } + } + } + /* + * Messages from PAM session management when trusted mode is disabled: + * 3 Last successful login: %s %s %s %s + * 4 Last authentication failure: %s %s %s %s + */ + if ((catd = catopen("pam_hpsec", NL_CAT_LOCALE)) != -1) { + maxfilters += 2; + newfilt = reallocarray(conv_filter, maxfilters + 1, + sizeof(*conv_filter)); + if (newfilt != NULL) { + conv_filter = newfilt; + for (i = 3; i < 5; i++) { + if ((msg = catgets(catd, 1, i, NULL)) == NULL) + break; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "adding \"%s\" to conversation filter", msg); + if ((conv_filter[nfilt].msg = strdup(msg)) == NULL) + break; + conv_filter[nfilt].msglen = strcspn(msg, "%"); + nfilt++; + } + } + } + if (conv_filter != NULL) { + conv_filter[nfilt].msg = NULL; + conv_filter[nfilt].msglen = 0; + } + } +#endif /* __hpux */ + debug_return; +} + +/* + * Like pam_strerror() but never returns NULL and uses strerror(errno) + * for PAM_SYSTEM_ERR. + */ +static const char * +sudo_pam_strerror(pam_handle_t *handle, int errnum) +{ + const char *errstr; + static char errbuf[32]; + + if (errnum == PAM_SYSTEM_ERR) + return strerror(errno); + if ((errstr = pam_strerror(handle, errnum)) == NULL) + (void)snprintf(errbuf, sizeof(errbuf), "PAM error %d", errnum); + return errstr; +} + +static int +sudo_pam_init2(struct passwd *pw, sudo_auth *auth, bool quiet) +{ + static int pam_status = PAM_SUCCESS; + const char *ttypath = user_ttypath; + const char *errstr, *pam_service; + int rc; + debug_decl(sudo_pam_init, SUDOERS_DEBUG_AUTH); + + /* Stash pointer to last pam status. */ + auth->data = &pam_status; + +#ifdef _AIX + if (pamh != NULL) { + /* Already initialized (may happen with AIX). */ + debug_return_int(AUTH_SUCCESS); + } +#endif /* _AIX */ + + /* Initial PAM. */ + pam_service = ISSET(sudo_mode, MODE_LOGIN_SHELL) ? + def_pam_login_service : def_pam_service; + pam_status = pam_start(pam_service, pw->pw_name, &pam_conv, &pamh); + if (pam_status != PAM_SUCCESS) { + errstr = sudo_pam_strerror(NULL, pam_status); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_start(%s, %s, %p, %p): %s", pam_service, pw->pw_name, + &pam_conv, &pamh, errstr); + if (!quiet) + log_warningx(0, N_("unable to initialize PAM: %s"), errstr); + debug_return_int(AUTH_FATAL); + } + + /* Initialize conversation function message filter. */ + conv_filter_init(); + + /* + * Set PAM_RUSER to the invoking user (the "from" user). + * Solaris 7 and below require PAM_RHOST to be set if PAM_RUSER is. + * Note: PAM_RHOST may cause a DNS lookup on Linux in libaudit. + */ + if (def_pam_ruser) { + rc = pam_set_item(pamh, PAM_RUSER, user_name); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_RUSER, %s): %s", user_name, errstr); + } + } + if (def_pam_rhost) { + rc = pam_set_item(pamh, PAM_RHOST, user_host); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_RHOST, %s): %s", user_host, errstr); + } + } + +#if defined(__LINUX_PAM__) || defined(__sun__) + /* + * Some PAM modules assume PAM_TTY is set and will misbehave (or crash) + * if it is not. Known offenders include pam_lastlog and pam_time. + */ + if (ttypath == NULL) + ttypath = ""; +#endif + if (ttypath != NULL) { // -V547 + rc = pam_set_item(pamh, PAM_TTY, ttypath); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_TTY, %s): %s", ttypath, errstr); + } + } + + /* + * If PAM session and setcred support is disabled we don't + * need to keep a sudo process around to close the session. + */ + if (!def_pam_session && !def_pam_setcred) + auth->end_session = NULL; + + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_pam_init(struct passwd *pw, sudo_auth *auth) +{ + return sudo_pam_init2(pw, auth, false); +} + +#ifdef _AIX +int +sudo_pam_init_quiet(struct passwd *pw, sudo_auth *auth) +{ + return sudo_pam_init2(pw, auth, true); +} +#endif /* _AIX */ + +int +sudo_pam_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + const char *envccname; + const char *s; + int *pam_status = (int *) auth->data; + debug_decl(sudo_pam_verify, SUDOERS_DEBUG_AUTH); + + def_prompt = prompt; /* for converse */ + getpass_error = false; /* set by converse if user presses ^C */ + conv_callback = callback; /* passed to conversation function */ + + /* Set KRB5CCNAME from the user environment if not set to propagate this + * information to PAM modules that may use it to authentication. */ + envccname = sudo_getenv("KRB5CCNAME"); + if (envccname == NULL && user_ccname != NULL) { + if (sudo_setenv("KRB5CCNAME", user_ccname, true) != 0) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "unable to set KRB5CCNAME"); + debug_return_int(AUTH_FAILURE); + } + } + + /* PAM_SILENT prevents the authentication service from generating output. */ + *pam_status = pam_authenticate(pamh, PAM_SILENT); + + /* Restore KRB5CCNAME to its original value. */ + if (envccname == NULL && sudo_unsetenv("KRB5CCNAME") != 0) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "unable to restore KRB5CCNAME"); + debug_return_int(AUTH_FAILURE); + } + + if (getpass_error) { + /* error or ^C from tgetpass() */ + debug_return_int(AUTH_INTR); + } + switch (*pam_status) { + case PAM_SUCCESS: + debug_return_int(AUTH_SUCCESS); + case PAM_AUTH_ERR: + case PAM_AUTHINFO_UNAVAIL: + case PAM_MAXTRIES: + case PAM_PERM_DENIED: + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "pam_authenticate: %d", *pam_status); + debug_return_int(AUTH_FAILURE); + default: + s = sudo_pam_strerror(pamh, *pam_status); + log_warningx(0, N_("PAM authentication error: %s"), s); + debug_return_int(AUTH_FATAL); + } +} + +int +sudo_pam_approval(struct passwd *pw, sudo_auth *auth, bool exempt) +{ + const char *s; + int rc, status = AUTH_SUCCESS; + int *pam_status = (int *) auth->data; + debug_decl(sudo_pam_approval, SUDOERS_DEBUG_AUTH); + + if (def_pam_acct_mgmt) { + rc = pam_acct_mgmt(pamh, PAM_SILENT); + switch (rc) { + case PAM_SUCCESS: + break; + case PAM_AUTH_ERR: + log_warningx(0, N_("account validation failure, " + "is your account locked?")); + status = AUTH_FATAL; + break; + case PAM_NEW_AUTHTOK_REQD: + /* Ignore if user is exempt from password restrictions. */ + if (exempt) { + rc = *pam_status; + break; + } + /* New password required, try to change it. */ + log_warningx(0, N_("Account or password is " + "expired, reset your password and try again")); + rc = pam_chauthtok(pamh, PAM_CHANGE_EXPIRED_AUTHTOK); + if (rc == PAM_SUCCESS) + break; + s = pam_strerror(pamh, rc); + log_warningx(0, N_("unable to change expired password: %s"), s); + status = AUTH_FAILURE; + break; + case PAM_AUTHTOK_EXPIRED: + /* Ignore if user is exempt from password restrictions. */ + if (exempt) { + rc = *pam_status; + break; + } + /* Password expired, cannot be updated by user. */ + log_warningx(0, + N_("Password expired, contact your system administrator")); + status = AUTH_FATAL; + break; + case PAM_ACCT_EXPIRED: + log_warningx(0, + N_("Account expired or PAM config lacks an \"account\" " + "section for sudo, contact your system administrator")); + status = AUTH_FATAL; + break; + case PAM_AUTHINFO_UNAVAIL: + case PAM_MAXTRIES: + case PAM_PERM_DENIED: + s = sudo_pam_strerror(pamh, rc); + log_warningx(0, N_("PAM account management error: %s"), s); + status = AUTH_FAILURE; + break; + default: + s = sudo_pam_strerror(pamh, rc); + log_warningx(0, N_("PAM account management error: %s"), s); + status = AUTH_FATAL; + break; + } + *pam_status = rc; + } + debug_return_int(status); +} + +int +sudo_pam_cleanup(struct passwd *pw, sudo_auth *auth, bool force) +{ + int *pam_status = (int *) auth->data; + debug_decl(sudo_pam_cleanup, SUDOERS_DEBUG_AUTH); + + /* If successful, we can't close the session until sudo_pam_end_session() */ + if (force || *pam_status != PAM_SUCCESS || auth->end_session == NULL) { + *pam_status = pam_end(pamh, *pam_status | PAM_DATA_SILENT); + pamh = NULL; + } + debug_return_int(*pam_status == PAM_SUCCESS ? AUTH_SUCCESS : AUTH_FAILURE); +} + +int +sudo_pam_begin_session(struct passwd *pw, char **user_envp[], sudo_auth *auth) +{ + int rc, status = AUTH_SUCCESS; + int *pam_status = (int *) auth->data; + const char *errstr; + debug_decl(sudo_pam_begin_session, SUDOERS_DEBUG_AUTH); + + /* + * If there is no valid user we cannot open a PAM session. + * This is not an error as sudo can run commands with arbitrary + * uids, it just means we are done from a session management standpoint. + */ + if (pw == NULL) { + if (pamh != NULL) { + rc = pam_end(pamh, PAM_SUCCESS | PAM_DATA_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_end: %s", errstr); + } + pamh = NULL; + } + goto done; + } + + /* + * Update PAM_USER to reference the user we are running the command + * as, as opposed to the user we authenticated as. + */ + rc = pam_set_item(pamh, PAM_USER, pw->pw_name); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_USER, %s): %s", pw->pw_name, errstr); + } + + /* + * Reinitialize credentials when changing the user. + * We don't worry about a failure from pam_setcred() since with + * stacked PAM auth modules a failure from one module may override + * PAM_SUCCESS from another. For example, given a non-local user, + * pam_unix will fail but pam_ldap or pam_sss may succeed, but if + * pam_unix is first in the stack, pam_setcred() will fail. + */ + if (def_pam_setcred) { + rc = pam_setcred(pamh, PAM_REINITIALIZE_CRED); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_setcred: %s", errstr); + def_pam_setcred = false; + } + } + + if (def_pam_session) { + /* + * We use PAM_SILENT to prevent pam_lastlog from printing last login + * information except when explicitly running a shell. + */ + const bool silent = !ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL); + rc = pam_open_session(pamh, silent ? PAM_SILENT : 0); + switch (rc) { + case PAM_SUCCESS: + break; + case PAM_SESSION_ERR: + /* Treat PAM_SESSION_ERR as a non-fatal error. */ + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_open_session: %s", errstr); + /* Avoid closing session that was not opened. */ + def_pam_session = false; + break; + default: + /* Unexpected session failure, treat as fatal error. */ + *pam_status = rc; + errstr = sudo_pam_strerror(pamh, rc); + log_warningx(0, N_("%s: %s"), "pam_open_session", errstr); + rc = pam_end(pamh, *pam_status | PAM_DATA_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_end: %s", errstr); + } + pamh = NULL; + status = AUTH_FATAL; + goto done; + } + } + +#ifdef HAVE_PAM_GETENVLIST + /* + * Update environment based on what is stored in pamh. + * If no authentication is done we will only have environment + * variables if pam_env is called via session. + */ + if (user_envp != NULL) { + char **pam_envp = pam_getenvlist(pamh); + if (pam_envp != NULL) { + /* Merge pam env with user env. */ + if (!env_init(*user_envp) || !env_merge(pam_envp)) + status = AUTH_FATAL; + *user_envp = env_get(); + (void)env_init(NULL); + free(pam_envp); + /* XXX - we leak any duplicates that were in pam_envp */ + } + } +#endif /* HAVE_PAM_GETENVLIST */ + +done: + debug_return_int(status); +} + +int +sudo_pam_end_session(struct passwd *pw, sudo_auth *auth) +{ + int rc, status = AUTH_SUCCESS; + const char *errstr; + debug_decl(sudo_pam_end_session, SUDOERS_DEBUG_AUTH); + + if (pamh != NULL) { + /* + * Update PAM_USER to reference the user we are running the command + * as, as opposed to the user we authenticated as. + * XXX - still needed now that session init is in parent? + */ + rc = pam_set_item(pamh, PAM_USER, pw->pw_name); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_USER, %s): %s", pw->pw_name, errstr); + } + if (def_pam_session) { + rc = pam_close_session(pamh, PAM_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_close_session: %s", errstr); + } + } + if (def_pam_setcred) { + rc = pam_setcred(pamh, PAM_DELETE_CRED | PAM_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_setcred: %s", errstr); + } + } + rc = pam_end(pamh, PAM_SUCCESS | PAM_DATA_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_end: %s", errstr); + status = AUTH_FATAL; + } + pamh = NULL; + } + + debug_return_int(status); +} + +#define PROMPT_IS_PASSWORD(_p) \ + (strncmp((_p), "Password:", 9) == 0 && \ + ((_p)[9] == '\0' || ((_p)[9] == ' ' && (_p)[10] == '\0'))) + +#ifdef PAM_TEXT_DOMAIN +# define PAM_PROMPT_IS_PASSWORD(_p) \ + (strcmp((_p), dgt(PAM_TEXT_DOMAIN, "Password:")) == 0 || \ + strcmp((_p), dgt(PAM_TEXT_DOMAIN, "Password: ")) == 0 || \ + PROMPT_IS_PASSWORD(_p)) +#else +# define PAM_PROMPT_IS_PASSWORD(_p) PROMPT_IS_PASSWORD(_p) +#endif /* PAM_TEXT_DOMAIN */ + +/* + * We use the PAM prompt in preference to sudo's as long + * as passprompt_override is not set and: + * a) the (translated) sudo prompt matches /^Password: ?/ + * or: + * b) the PAM prompt itself *doesn't* match /^Password: ?/ + * or /^username's Password: ?/ + * + * The intent is to use the PAM prompt for things like + * challenge-response, otherwise use sudo's prompt. + * There may also be cases where a localized translation + * of "Password: " exists for PAM but not for sudo. + */ +static bool +use_pam_prompt(const char *pam_prompt) +{ + size_t user_len; + debug_decl(use_pam_prompt, SUDOERS_DEBUG_AUTH); + + /* Always use sudo prompt if passprompt_override is set. */ + if (def_passprompt_override) + debug_return_bool(false); + + /* If sudo prompt matches "^Password: ?$", use PAM prompt. */ + if (PROMPT_IS_PASSWORD(def_prompt)) + debug_return_bool(true); + + /* If PAM prompt matches "^Password: ?$", use sudo prompt. */ + if (PAM_PROMPT_IS_PASSWORD(pam_prompt)) + debug_return_bool(false); + + /* + * Some PAM modules use "^username's Password: ?$" instead of + * "^Password: ?" so check for that too. + */ + user_len = strlen(user_name); + if (strncmp(pam_prompt, user_name, user_len) == 0) { + const char *cp = pam_prompt + user_len; + if (strncmp(cp, "'s Password:", 12) == 0 && + (cp[12] == '\0' || (cp[12] == ' ' && cp[13] == '\0'))) + debug_return_bool(false); + } + + /* Otherwise, use the PAM prompt. */ + debug_return_bool(true); +} + +static bool +is_filtered(const char *msg) +{ + bool filtered = false; + + if (conv_filter != NULL) { + struct conv_filter *filt = conv_filter; + while (filt->msg != NULL) { + if (strncmp(msg, filt->msg, filt->msglen) == 0) { + filtered = true; + break; + } + filt++; + } + } + return filtered; +} + +/* + * ``Conversation function'' for PAM <-> human interaction. + */ +static int +converse(int num_msg, PAM_CONST struct pam_message **msg, + struct pam_response **reply_out, void *vcallback) +{ + struct sudo_conv_callback *callback = NULL; + struct pam_response *reply; + const char *prompt; + char *pass; + int n, type; + int ret = PAM_SUCCESS; + debug_decl(converse, SUDOERS_DEBUG_AUTH); + + if (num_msg <= 0 || num_msg > PAM_MAX_NUM_MSG) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "invalid number of PAM messages: %d", num_msg); + debug_return_int(PAM_CONV_ERR); + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "number of PAM messages: %d", num_msg); + + if ((reply = calloc(num_msg, sizeof(struct pam_response))) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(PAM_BUF_ERR); + } + *reply_out = reply; + + if (vcallback != NULL) + callback = *((struct sudo_conv_callback **)vcallback); + + for (n = 0; n < num_msg; n++) { + PAM_CONST struct pam_message *pm = PAM_MSG_GET(msg, n); + + type = SUDO_CONV_PROMPT_ECHO_OFF; + switch (pm->msg_style) { + case PAM_PROMPT_ECHO_ON: + type = SUDO_CONV_PROMPT_ECHO_ON; + FALLTHROUGH; + case PAM_PROMPT_ECHO_OFF: + /* Error out if the last password read was interrupted. */ + if (getpass_error) + goto done; + + /* Choose either the sudo prompt or the PAM one. */ + prompt = use_pam_prompt(pm->msg) ? pm->msg : def_prompt; + + /* Read the password unless interrupted. */ + pass = auth_getpass(prompt, type, callback); + if (pass == NULL) { + /* Error (or ^C) reading password, don't try again. */ + getpass_error = true; + ret = PAM_CONV_ERR; + goto done; + } + if (strlen(pass) >= PAM_MAX_RESP_SIZE) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "password longer than %d", PAM_MAX_RESP_SIZE); + ret = PAM_CONV_ERR; + explicit_bzero(pass, strlen(pass)); + goto done; + } + reply[n].resp = pass; /* auth_getpass() malloc's a copy */ + break; + case PAM_TEXT_INFO: + if (pm->msg != NULL && !is_filtered(pm->msg)) + sudo_printf(SUDO_CONV_INFO_MSG|SUDO_CONV_PREFER_TTY, + "%s\n", pm->msg); + break; + case PAM_ERROR_MSG: + if (pm->msg != NULL) + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "%s\n", pm->msg); + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unsupported message style: %d", pm->msg_style); + ret = PAM_CONV_ERR; + goto done; + } + } + +done: + if (ret != PAM_SUCCESS) { + /* Zero and free allocated memory and return an error. */ + for (n = 0; n < num_msg; n++) { + struct pam_response *pr = &reply[n]; + + if (pr->resp != NULL) { + freezero(pr->resp, strlen(pr->resp)); + pr->resp = NULL; + } + } + free(reply); + *reply_out = NULL; + } + debug_return_int(ret); +} + +#endif /* HAVE_PAM */ diff --git a/plugins/sudoers/auth/passwd.c b/plugins/sudoers/auth/passwd.c new file mode 100644 index 0000000..566881f --- /dev/null +++ b/plugins/sudoers/auth/passwd.c @@ -0,0 +1,122 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +#define DESLEN 13 +#define HAS_AGEINFO(p, l) (l == 18 && p[DESLEN] == ',') + +int +sudo_passwd_init(struct passwd *pw, sudo_auth *auth) +{ + debug_decl(sudo_passwd_init, SUDOERS_DEBUG_AUTH); + +#ifdef HAVE_SKEYACCESS + if (skeyaccess(pw, user_tty, NULL, NULL) == 0) + debug_return_int(AUTH_FAILURE); +#endif + sudo_setspent(); + auth->data = sudo_getepw(pw); + sudo_endspent(); + debug_return_int(auth->data ? AUTH_SUCCESS : AUTH_FATAL); +} + +#ifdef HAVE_CRYPT +int +sudo_passwd_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char sav, *epass; + char *pw_epasswd = auth->data; + size_t pw_len; + int matched = 0; + debug_decl(sudo_passwd_verify, SUDOERS_DEBUG_AUTH); + + /* An empty plain-text password must match an empty encrypted password. */ + if (pass[0] == '\0') + debug_return_int(pw_epasswd[0] ? AUTH_FAILURE : AUTH_SUCCESS); + + /* + * Truncate to 8 chars if standard DES since not all crypt()'s do this. + * If this turns out not to be safe we will have to use OS #ifdef's (sigh). + */ + sav = pass[8]; + pw_len = strlen(pw_epasswd); + if (pw_len == DESLEN || HAS_AGEINFO(pw_epasswd, pw_len)) + pass[8] = '\0'; + + /* + * Normal UN*X password check. + * HP-UX may add aging info (separated by a ',') at the end so + * only compare the first DESLEN characters in that case. + */ + epass = (char *) crypt(pass, pw_epasswd); + pass[8] = sav; + if (epass != NULL) { + if (HAS_AGEINFO(pw_epasswd, pw_len) && strlen(epass) == DESLEN) + matched = !strncmp(pw_epasswd, epass, DESLEN); + else + matched = !strcmp(pw_epasswd, epass); + } + + debug_return_int(matched ? AUTH_SUCCESS : AUTH_FAILURE); +} +#else +int +sudo_passwd_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char *pw_passwd = auth->data; + int matched; + debug_decl(sudo_passwd_verify, SUDOERS_DEBUG_AUTH); + + /* Simple string compare for systems without crypt(). */ + matched = !strcmp(pass, pw_passwd); + + debug_return_int(matched ? AUTH_SUCCESS : AUTH_FAILURE); +} +#endif + +int +sudo_passwd_cleanup(struct passwd *pw, sudo_auth *auth, bool force) +{ + char *pw_epasswd = auth->data; + debug_decl(sudo_passwd_cleanup, SUDOERS_DEBUG_AUTH); + + if (pw_epasswd != NULL) + freezero(pw_epasswd, strlen(pw_epasswd)); + + debug_return_int(AUTH_SUCCESS); +} diff --git a/plugins/sudoers/auth/rfc1938.c b/plugins/sudoers/auth/rfc1938.c new file mode 100644 index 0000000..2e4824c --- /dev/null +++ b/plugins/sudoers/auth/rfc1938.c @@ -0,0 +1,139 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1994-1996, 1998-2005, 2010-2012, 2014-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#if defined(HAVE_SKEY) || defined(HAVE_OPIE) + +#include +#include +#include +#include +#include +#include + +#if defined(HAVE_SKEY) +# include +# define RFC1938 skey +# ifdef HAVE_RFC1938_SKEYCHALLENGE +# define rfc1938challenge(a,b,c,d) skeychallenge((a),(b),(c),(d)) +# else +# define rfc1938challenge(a,b,c,d) skeychallenge((a),(b),(c)) +# endif +# define rfc1938verify(a,b) skeyverify((a),(b)) +#elif defined(HAVE_OPIE) +# include +# define RFC1938 opie +# define rfc1938challenge(a,b,c,d) opiechallenge((a),(b),(c)) +# define rfc1938verify(a,b) opieverify((a),(b)) +#endif + +#include "sudoers.h" +#include "sudo_auth.h" + +int +sudo_rfc1938_setup(struct passwd *pw, char **promptp, sudo_auth *auth) +{ + char challenge[256]; + size_t challenge_len; + static char *orig_prompt = NULL, *new_prompt = NULL; + static size_t op_len, np_size; + static struct RFC1938 rfc1938; + debug_decl(sudo_rfc1938_setup, SUDOERS_DEBUG_AUTH); + + /* Stash a pointer to the rfc1938 struct if we have not initialized */ + if (!auth->data) + auth->data = &rfc1938; + + /* Save the original prompt */ + if (orig_prompt == NULL) { + orig_prompt = *promptp; + op_len = strlen(orig_prompt); + + /* Ignore trailing colon (we will add our own) */ + if (orig_prompt[op_len - 1] == ':') + op_len--; + else if (op_len >= 2 && orig_prompt[op_len - 1] == ' ' + && orig_prompt[op_len - 2] == ':') + op_len -= 2; + } + +#ifdef HAVE_SKEY + /* Close old stream */ + if (rfc1938.keyfile) + (void) fclose(rfc1938.keyfile); +#endif + + /* + * Look up the user and get the rfc1938 challenge. + * If the user is not in the OTP db, only post a fatal error if + * we are running alone (since they may just use a normal passwd). + */ + if (rfc1938challenge(&rfc1938, pw->pw_name, challenge, sizeof(challenge))) { + if (IS_ONEANDONLY(auth)) { + sudo_warnx(U_("you do not exist in the %s database"), auth->name); + debug_return_int(AUTH_FATAL); + } else { + debug_return_int(AUTH_FAILURE); + } + } + + /* Get space for new prompt with embedded challenge */ + challenge_len = strlen(challenge); + if (np_size < op_len + challenge_len + 7) { + char *p = realloc(new_prompt, op_len + challenge_len + 7); + if (p == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(AUTH_FATAL); + } + np_size = op_len + challenge_len + 7; + new_prompt = p; + } + + if (def_long_otp_prompt) + (void) snprintf(new_prompt, np_size, "%s\n%s", challenge, orig_prompt); + else + (void) snprintf(new_prompt, np_size, "%.*s [ %s ]:", (int)op_len, + orig_prompt, challenge); + + *promptp = new_prompt; + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_rfc1938_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + debug_decl(sudo_rfc1938_verify, SUDOERS_DEBUG_AUTH); + + if (rfc1938verify((struct RFC1938 *) auth->data, pass) == 0) + debug_return_int(AUTH_SUCCESS); + else + debug_return_int(AUTH_FAILURE); +} + +#endif /* HAVE_SKEY || HAVE_OPIE */ diff --git a/plugins/sudoers/auth/secureware.c b/plugins/sudoers/auth/secureware.c new file mode 100644 index 0000000..dd7aa42 --- /dev/null +++ b/plugins/sudoers/auth/secureware.c @@ -0,0 +1,109 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1998-2005, 2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_GETPRPWNAM + +#include +#include +#include +#include +#include +#include +#ifdef __hpux +# undef MAXINT +# include +#else +# include +#endif /* __hpux */ +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +#ifdef __alpha +extern int crypt_type; +#endif + +int +sudo_secureware_init(struct passwd *pw, sudo_auth *auth) +{ + debug_decl(sudo_secureware_init, SUDOERS_DEBUG_AUTH); + +#ifdef __alpha + if (crypt_type == INT_MAX) + debug_return_int(AUTH_FAILURE); /* no shadow */ +#endif + + sudo_setspent(); + auth->data = sudo_getepw(pw); + sudo_endspent(); + debug_return_int(auth->data ? AUTH_SUCCESS : AUTH_FATAL); +} + +int +sudo_secureware_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char *pw_epasswd = auth->data; + char *epass = NULL; + debug_decl(sudo_secureware_verify, SUDOERS_DEBUG_AUTH); + + /* An empty plain-text password must match an empty encrypted password. */ + if (pass[0] == '\0') + debug_return_int(pw_epasswd[0] ? AUTH_FAILURE : AUTH_SUCCESS); + +#if defined(__alpha) +# ifdef HAVE_DISPCRYPT + epass = dispcrypt(pass, pw_epasswd, crypt_type); +# else + if (crypt_type == AUTH_CRYPT_BIGCRYPT) + epass = bigcrypt(pass, pw_epasswd); + else if (crypt_type == AUTH_CRYPT_CRYPT16) + epass = crypt(pass, pw_epasswd); +# endif /* HAVE_DISPCRYPT */ +#elif defined(HAVE_BIGCRYPT) + epass = bigcrypt(pass, pw_epasswd); +#endif /* __alpha */ + + if (epass != NULL && strcmp(pw_epasswd, epass) == 0) + debug_return_int(AUTH_SUCCESS); + debug_return_int(AUTH_FAILURE); +} + +int +sudo_secureware_cleanup(struct passwd *pw, sudo_auth *auth, bool force) +{ + char *pw_epasswd = auth->data; + debug_decl(sudo_secureware_cleanup, SUDOERS_DEBUG_AUTH); + + if (pw_epasswd != NULL) + freezero(pw_epasswd, strlen(pw_epasswd)); + debug_return_int(AUTH_SUCCESS); +} + +#endif /* HAVE_GETPRPWNAM */ diff --git a/plugins/sudoers/auth/securid5.c b/plugins/sudoers/auth/securid5.c new file mode 100644 index 0000000..698953f --- /dev/null +++ b/plugins/sudoers/auth/securid5.c @@ -0,0 +1,225 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007, 2010-2012, 2014-2016 + * Todd C. Miller + * Copyright (c) 2002 Michael Stroucken + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_SECURID + +#include +#include +#include +#include +#include +#include + +/* Needed for SecurID v5.0 Authentication on UNIX */ +#define UNIX 1 +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +/* + * securid_init - Initialises communications with ACE server + * Arguments in: + * pw - UNUSED + * auth - sudo authentication structure + * + * Results out: + * auth - auth->data contains pointer to new SecurID handle + * return code - Fatal if initialization unsuccessful, otherwise + * success. + */ +int +sudo_securid_init(struct passwd *pw, sudo_auth *auth) +{ + static SDI_HANDLE sd_dat; /* SecurID handle */ + debug_decl(sudo_securid_init, SUDOERS_DEBUG_AUTH); + + auth->data = (void *) &sd_dat; /* For method-specific data */ + + /* Start communications */ + if (AceInitialize() != SD_FALSE) + debug_return_int(AUTH_SUCCESS); + + sudo_warnx("%s", U_("failed to initialise the ACE API library")); + debug_return_int(AUTH_FATAL); +} + +/* + * securid_setup - Initialises a SecurID transaction and locks out other + * ACE servers + * + * Arguments in: + * pw - struct passwd for username + * promptp - UNUSED + * auth - sudo authentication structure for SecurID handle + * + * Results out: + * return code - Success if transaction started correctly, fatal + * otherwise + */ +int +sudo_securid_setup(struct passwd *pw, char **promptp, sudo_auth *auth) +{ + SDI_HANDLE *sd = (SDI_HANDLE *) auth->data; + int retval; + debug_decl(sudo_securid_setup, SUDOERS_DEBUG_AUTH); + + /* Re-initialize SecurID every time. */ + if (SD_Init(sd) != ACM_OK) { + sudo_warnx("%s", U_("unable to contact the SecurID server")); + debug_return_int(AUTH_FATAL); + } + + /* Lock new PIN code */ + retval = SD_Lock(*sd, pw->pw_name); + + switch (retval) { + case ACM_OK: + sudo_warnx("%s", U_("User ID locked for SecurID Authentication")); + debug_return_int(AUTH_SUCCESS); + + case ACE_UNDEFINED_USERNAME: + sudo_warnx("%s", U_("invalid username length for SecurID")); + debug_return_int(AUTH_FATAL); + + case ACE_ERR_INVALID_HANDLE: + sudo_warnx("%s", U_("invalid Authentication Handle for SecurID")); + debug_return_int(AUTH_FATAL); + + case ACM_ACCESS_DENIED: + sudo_warnx("%s", U_("SecurID communication failed")); + debug_return_int(AUTH_FATAL); + + default: + sudo_warnx("%s", U_("unknown SecurID error")); + debug_return_int(AUTH_FATAL); + } +} + +/* + * securid_verify - Authenticates user and handles ACE responses + * + * Arguments in: + * pw - struct passwd for username + * pass - UNUSED + * auth - sudo authentication structure for SecurID handle + * + * Results out: + * return code - Success on successful authentication, failure on + * incorrect authentication, fatal on errors + */ +int +sudo_securid_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + SDI_HANDLE *sd = (SDI_HANDLE *) auth->data; + int ret; + debug_decl(sudo_securid_verify, SUDOERS_DEBUG_AUTH); + + pass = auth_getpass("Enter your PASSCODE: ", SUDO_CONV_PROMPT_ECHO_OFF, + callback); + + /* Have ACE verify password */ + switch (SD_Check(*sd, pass, pw->pw_name)) { + case ACM_OK: + ret = AUTH_SUCESS; + break; + + case ACE_UNDEFINED_PASSCODE: + sudo_warnx("%s", U_("invalid passcode length for SecurID")); + ret = AUTH_FATAL; + break; + + case ACE_UNDEFINED_USERNAME: + sudo_warnx("%s", U_("invalid username length for SecurID")); + ret = AUTH_FATAL; + break; + + case ACE_ERR_INVALID_HANDLE: + sudo_warnx("%s", U_("invalid Authentication Handle for SecurID")); + ret = AUTH_FATAL; + break; + + case ACM_ACCESS_DENIED: + ret = AUTH_FAILURE; + break; + + case ACM_NEXT_CODE_REQUIRED: + /* Sometimes (when current token close to expire?) + ACE challenges for the next token displayed + (entered without the PIN) */ + if (pass != NULL) + freezero(pass, strlen(pass)); + pass = auth_getpass("\ +!!! ATTENTION !!!\n\ +Wait for the token code to change, \n\ +then enter the new token code.\n", \ + SUDO_CONV_PROMPT_ECHO_OFF, callback); + + if (SD_Next(*sd, pass) == ACM_OK) { + ret = AUTH_SUCCESS; + break; + } + + ret = AUTH_FAILURE; + break; + + case ACM_NEW_PIN_REQUIRED: + /* + * This user's SecurID has not been activated yet, + * or the pin has been reset + */ + /* XXX - Is setting up a new PIN within sudo's scope? */ + SD_Pin(*sd, ""); + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "Your SecurID access has not yet been set up.\n"); + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "Please set up a PIN before you try to authenticate.\n"); + ret = AUTH_FATAL; + break; + + default: + sudo_warnx("%s", U_("unknown SecurID error")); + ret = AUTH_FATAL; + break; + } + + /* Free resources */ + SD_Close(*sd); + + if (pass != NULL) + freezero(pass, strlen(pass)); + + /* Return stored state to calling process */ + debug_return_int(ret); +} + +#endif /* HAVE_SECURID */ diff --git a/plugins/sudoers/auth/sia.c b/plugins/sudoers/auth/sia.c new file mode 100644 index 0000000..7feb19e --- /dev/null +++ b/plugins/sudoers/auth/sia.c @@ -0,0 +1,152 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_SIA_SES_INIT + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +static char **sudo_argv; +static int sudo_argc; + +int +sudo_sia_setup(struct passwd *pw, char **promptp, sudo_auth *auth) +{ + SIAENTITY *siah; + int i; + debug_decl(sudo_sia_setup, SUDOERS_DEBUG_AUTH); + + /* Rebuild argv for sia_ses_init() */ + sudo_argc = NewArgc + 1; + sudo_argv = reallocarray(NULL, sudo_argc + 1, sizeof(char *)); + if (sudo_argv == NULL) { + log_warningx(0, N_("unable to allocate memory")); + debug_return_int(AUTH_FATAL); + } + sudo_argv[0] = "sudo"; + for (i = 0; i < NewArgc; i++) + sudo_argv[i + 1] = NewArgv[i]; + sudo_argv[sudo_argc] = NULL; + + /* We don't let SIA prompt the user for input. */ + if (sia_ses_init(&siah, sudo_argc, sudo_argv, NULL, pw->pw_name, user_ttypath, 0, NULL) != SIASUCCESS) { + log_warning(0, N_("unable to initialize SIA session")); + debug_return_int(AUTH_FATAL); + } + + auth->data = siah; + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_sia_verify(struct passwd *pw, char *prompt, sudo_auth *auth, + struct sudo_conv_callback *callback) +{ + SIAENTITY *siah = auth->data; + char *pass; + int rc; + debug_decl(sudo_sia_verify, SUDOERS_DEBUG_AUTH); + + /* Get password, return AUTH_INTR if we got ^C */ + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass == NULL) + debug_return_int(AUTH_INTR); + + /* Check password and zero out plaintext copy. */ + rc = sia_ses_authent(NULL, pass, siah); + freezero(pass, strlen(pass)); + + if (rc == SIASUCCESS) + debug_return_int(AUTH_SUCCESS); + if (ISSET(rc, SIASTOP)) + debug_return_int(AUTH_FATAL); + debug_return_int(AUTH_FAILURE); +} + +int +sudo_sia_cleanup(struct passwd *pw, sudo_auth *auth, bool force) +{ + SIAENTITY *siah = auth->data; + debug_decl(sudo_sia_cleanup, SUDOERS_DEBUG_AUTH); + + (void) sia_ses_release(&siah); + auth->data = NULL; + free(sudo_argv); + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_sia_begin_session(struct passwd *pw, char **user_envp[], sudo_auth *auth) +{ + SIAENTITY *siah; + int status = AUTH_FATAL; + debug_decl(sudo_sia_begin_session, SUDOERS_DEBUG_AUTH); + + /* Re-init sia for the target user's session. */ + if (sia_ses_init(&siah, NewArgc, NewArgv, NULL, pw->pw_name, user_ttypath, 0, NULL) != SIASUCCESS) { + log_warning(0, N_("unable to initialize SIA session")); + goto done; + } + + if (sia_make_entity_pwd(pw, siah) != SIASUCCESS) { + sudo_warn("sia_make_entity_pwd"); + goto done; + } + + status = AUTH_FAILURE; /* no more fatal errors. */ + + siah->authtype = SIA_A_NONE; + if (sia_ses_estab(sia_collect_trm, siah) != SIASUCCESS) { + sudo_warn("sia_ses_estab"); + goto done; + } + + if (sia_ses_launch(sia_collect_trm, siah) != SIASUCCESS) { + sudo_warn("sia_ses_launch"); + goto done; + } + + status = AUTH_SUCCESS; + +done: + (void) sia_ses_release(&siah); + debug_return_int(status); +} + +#endif /* HAVE_SIA_SES_INIT */ diff --git a/plugins/sudoers/auth/sudo_auth.c b/plugins/sudoers/auth/sudo_auth.c new file mode 100644 index 0000000..188b65f --- /dev/null +++ b/plugins/sudoers/auth/sudo_auth.c @@ -0,0 +1,477 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2008-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" +#include "insults.h" + +static sudo_auth auth_switch[] = { +/* Standalone entries first */ +#ifdef HAVE_AIXAUTH + AUTH_ENTRY("aixauth", FLAG_STANDALONE, sudo_aix_init, NULL, sudo_aix_verify, NULL, sudo_aix_cleanup, NULL, NULL) +#endif +#ifdef HAVE_PAM + AUTH_ENTRY("pam", FLAG_STANDALONE, sudo_pam_init, NULL, sudo_pam_verify, sudo_pam_approval, sudo_pam_cleanup, sudo_pam_begin_session, sudo_pam_end_session) +#endif +#ifdef HAVE_SECURID + AUTH_ENTRY("SecurId", FLAG_STANDALONE, sudo_securid_init, sudo_securid_setup, sudo_securid_verify, NULL, NULL, NULL, NULL) +#endif +#ifdef HAVE_SIA_SES_INIT + AUTH_ENTRY("sia", FLAG_STANDALONE, NULL, sudo_sia_setup, sudo_sia_verify, NULL, sudo_sia_cleanup, sudo_sia_begin_session, NULL) +#endif +#ifdef HAVE_FWTK + AUTH_ENTRY("fwtk", FLAG_STANDALONE, sudo_fwtk_init, NULL, sudo_fwtk_verify, NULL, sudo_fwtk_cleanup, NULL, NULL) +#endif +#ifdef HAVE_BSD_AUTH_H + AUTH_ENTRY("bsdauth", FLAG_STANDALONE, bsdauth_init, NULL, bsdauth_verify, bsdauth_approval, bsdauth_cleanup, NULL, NULL) +#endif + +/* Non-standalone entries */ +#ifndef WITHOUT_PASSWD + AUTH_ENTRY("passwd", 0, sudo_passwd_init, NULL, sudo_passwd_verify, NULL, sudo_passwd_cleanup, NULL, NULL) +#endif +#if defined(HAVE_GETPRPWNAM) && !defined(WITHOUT_PASSWD) + AUTH_ENTRY("secureware", 0, sudo_secureware_init, NULL, sudo_secureware_verify, NULL, sudo_secureware_cleanup, NULL, NULL) +#endif +#ifdef HAVE_AFS + AUTH_ENTRY("afs", 0, NULL, NULL, sudo_afs_verify, NULL, NULL, NULL, NULL) +#endif +#ifdef HAVE_DCE + AUTH_ENTRY("dce", 0, NULL, NULL, sudo_dce_verify, NULL, NULL, NULL, NULL) +#endif +#ifdef HAVE_KERB5 + AUTH_ENTRY("kerb5", 0, sudo_krb5_init, sudo_krb5_setup, sudo_krb5_verify, NULL, sudo_krb5_cleanup, NULL, NULL) +#endif +#ifdef HAVE_SKEY + AUTH_ENTRY("S/Key", 0, NULL, sudo_rfc1938_setup, sudo_rfc1938_verify, NULL, NULL, NULL, NULL) +#endif +#ifdef HAVE_OPIE + AUTH_ENTRY("OPIE", 0, NULL, sudo_rfc1938_setup, sudo_rfc1938_verify, NULL, NULL, NULL, NULL) +#endif + AUTH_ENTRY(NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL) +}; + +static bool standalone; + +/* + * Initialize sudoers authentication method(s). + * Returns 0 on success and -1 on error. + */ +int +sudo_auth_init(struct passwd *pw) +{ + sudo_auth *auth; + int status = AUTH_SUCCESS; + debug_decl(sudo_auth_init, SUDOERS_DEBUG_AUTH); + + if (auth_switch[0].name == NULL) + debug_return_int(0); + + /* Initialize auth methods and unconfigure the method if necessary. */ + for (auth = auth_switch; auth->name; auth++) { + if (auth->init && !IS_DISABLED(auth)) { + /* Disable if it failed to init unless there was a fatal error. */ + status = (auth->init)(pw, auth); + if (status == AUTH_FAILURE) + SET(auth->flags, FLAG_DISABLED); + else if (status == AUTH_FATAL) + break; /* assume error msg already printed */ + } + } + + /* + * Make sure we haven't mixed standalone and shared auth methods. + * If there are multiple standalone methods, only use the first one. + */ + if ((standalone = IS_STANDALONE(&auth_switch[0]))) { + bool found = false; + for (auth = auth_switch; auth->name; auth++) { + if (IS_DISABLED(auth)) + continue; + if (!IS_STANDALONE(auth)) { + audit_failure(NewArgv, N_("invalid authentication methods")); + log_warningx(SLOG_SEND_MAIL, + N_("Invalid authentication methods compiled into sudo! " + "You may not mix standalone and non-standalone authentication.")); + debug_return_int(-1); + } + if (!found) { + /* Found first standalone method. */ + found = true; + continue; + } + /* Disable other standalone methods. */ + SET(auth->flags, FLAG_DISABLED); + } + } + + /* Set FLAG_ONEANDONLY if there is only one auth method. */ + for (auth = auth_switch; auth->name; auth++) { + /* Find first enabled auth method. */ + if (!IS_DISABLED(auth)) { + sudo_auth *first = auth; + /* Check for others. */ + for (; auth->name; auth++) { + if (!IS_DISABLED(auth)) + break; + } + if (auth->name == NULL) + SET(first->flags, FLAG_ONEANDONLY); + break; + } + } + + debug_return_int(status == AUTH_FATAL ? -1 : 0); +} + +/* + * Cleanup all authentication approval methods. + * Returns true on success, false on failure and -1 on error. + */ +int +sudo_auth_approval(struct passwd *pw, int validated, bool exempt) +{ + sudo_auth *auth; + debug_decl(sudo_auth_approval, SUDOERS_DEBUG_AUTH); + + /* Call approval routines. */ + for (auth = auth_switch; auth->name; auth++) { + if (auth->approval && !IS_DISABLED(auth)) { + int status = (auth->approval)(pw, auth, exempt); + if (status != AUTH_SUCCESS) { + /* Assume error msg already printed. */ + log_auth_failure(validated, 0); + debug_return_int(status == AUTH_FAILURE ? false : -1); + } + } + } + debug_return_int(true); +} + +/* + * Cleanup all authentication methods. + * Returns 0 on success and -1 on error. + */ +int +sudo_auth_cleanup(struct passwd *pw, bool force) +{ + sudo_auth *auth; + debug_decl(sudo_auth_cleanup, SUDOERS_DEBUG_AUTH); + + /* Call cleanup routines. */ + for (auth = auth_switch; auth->name; auth++) { + if (auth->cleanup && !IS_DISABLED(auth)) { + int status = (auth->cleanup)(pw, auth, force); + if (status == AUTH_FATAL) { + /* Assume error msg already printed. */ + debug_return_int(-1); + } + } + } + debug_return_int(0); +} + +static void +pass_warn(void) +{ + const char *warning = def_badpass_message; + debug_decl(pass_warn, SUDOERS_DEBUG_AUTH); + +#ifdef INSULT + if (def_insults) + warning = INSULT; +#endif + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, "%s\n", warning); + + debug_return; +} + +static bool +user_interrupted(void) +{ + sigset_t mask; + + return (sigpending(&mask) == 0 && + (sigismember(&mask, SIGINT) || sigismember(&mask, SIGQUIT))); +} + +/* + * Verify the specified user. + * Returns true if verified, false if not or -1 on error. + */ +int +verify_user(struct passwd *pw, char *prompt, int validated, + struct sudo_conv_callback *callback) +{ + unsigned int ntries; + int ret, status, success = AUTH_FAILURE; + sudo_auth *auth; + sigset_t mask, omask; + struct sigaction sa, saved_sigtstp; + debug_decl(verify_user, SUDOERS_DEBUG_AUTH); + + /* Make sure we have at least one auth method. */ + if (auth_switch[0].name == NULL) { + audit_failure(NewArgv, N_("no authentication methods")); + log_warningx(SLOG_SEND_MAIL, + N_("There are no authentication methods compiled into sudo! " + "If you want to turn off authentication, use the " + "--disable-authentication configure option.")); + debug_return_int(-1); + } + + /* Enable suspend during password entry. */ + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + (void) sigaction(SIGTSTP, &sa, &saved_sigtstp); + + /* + * We treat authentication as a critical section and block + * keyboard-generated signals such as SIGINT and SIGQUIT + * which might otherwise interrupt a sleep(3). + * They are temporarily unblocked by auth_getpass(). + */ + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + (void) sigprocmask(SIG_BLOCK, &mask, &omask); + + for (ntries = 0; ntries < def_passwd_tries; ntries++) { + int num_methods = 0; + char *pass = NULL; + + /* If user attempted to interrupt password verify, quit now. */ + if (user_interrupted()) + goto done; + + if (ntries != 0) + pass_warn(); + + /* Do any per-method setup and unconfigure the method if needed */ + for (auth = auth_switch; auth->name; auth++) { + if (IS_DISABLED(auth)) + continue; + num_methods++; + if (auth->setup != NULL) { + status = (auth->setup)(pw, &prompt, auth); + if (status == AUTH_FAILURE) + SET(auth->flags, FLAG_DISABLED); + else if (status == AUTH_FATAL || user_interrupted()) + goto done; /* assume error msg already printed */ + } + } + if (num_methods == 0) { + audit_failure(NewArgv, N_("no authentication methods")); + log_warningx(SLOG_SEND_MAIL, + N_("Unable to initialize authentication methods.")); + debug_return_int(-1); + } + + /* Get the password unless the auth function will do it for us */ + if (!standalone) { + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass == NULL) + break; + } + + /* Call authentication functions. */ + for (auth = auth_switch; auth->name; auth++) { + if (IS_DISABLED(auth)) + continue; + + success = auth->status = + (auth->verify)(pw, standalone ? prompt : pass, auth, callback); + if (success != AUTH_FAILURE) + break; + } + if (pass != NULL) + freezero(pass, strlen(pass)); + + if (success != AUTH_FAILURE) + goto done; + } + +done: + /* Restore signal handlers and signal mask. */ + (void) sigaction(SIGTSTP, &saved_sigtstp, NULL); + (void) sigprocmask(SIG_SETMASK, &omask, NULL); + + switch (success) { + case AUTH_SUCCESS: + ret = true; + break; + case AUTH_INTR: + case AUTH_FAILURE: + if (ntries != 0) + validated |= FLAG_BAD_PASSWORD; + log_auth_failure(validated, ntries); + ret = false; + break; + case AUTH_FATAL: + default: + log_auth_failure(validated, 0); + ret = -1; + break; + } + + debug_return_int(ret); +} + +/* + * Call authentication method begin session hooks. + * Returns 1 on success and -1 on error. + */ +int +sudo_auth_begin_session(struct passwd *pw, char **user_env[]) +{ + sudo_auth *auth; + debug_decl(sudo_auth_begin_session, SUDOERS_DEBUG_AUTH); + + for (auth = auth_switch; auth->name; auth++) { + if (auth->begin_session && !IS_DISABLED(auth)) { + int status = (auth->begin_session)(pw, user_env, auth); + if (status != AUTH_SUCCESS) { + /* Assume error msg already printed. */ + debug_return_int(-1); + } + } + } + debug_return_int(1); +} + +bool +sudo_auth_needs_end_session(void) +{ + sudo_auth *auth; + bool needed = false; + debug_decl(sudo_auth_needs_end_session, SUDOERS_DEBUG_AUTH); + + for (auth = auth_switch; auth->name; auth++) { + if (auth->end_session && !IS_DISABLED(auth)) { + needed = true; + break; + } + } + debug_return_bool(needed); +} + +/* + * Call authentication method end session hooks. + * Returns 1 on success and -1 on error. + */ +int +sudo_auth_end_session(struct passwd *pw) +{ + sudo_auth *auth; + int status; + debug_decl(sudo_auth_end_session, SUDOERS_DEBUG_AUTH); + + for (auth = auth_switch; auth->name; auth++) { + if (auth->end_session && !IS_DISABLED(auth)) { + status = (auth->end_session)(pw, auth); + if (status == AUTH_FATAL) { + /* Assume error msg already printed. */ + debug_return_int(-1); + } + } + } + debug_return_int(1); +} + +/* + * Prompts the user for a password using the conversation function. + * Returns the plaintext password or NULL. + * The user is responsible for freeing the returned value. + */ +char * +auth_getpass(const char *prompt, int type, struct sudo_conv_callback *callback) +{ + struct sudo_conv_message msg; + struct sudo_conv_reply repl; + sigset_t mask, omask; + debug_decl(auth_getpass, SUDOERS_DEBUG_AUTH); + + /* Mask user input if pwfeedback set and echo is off. */ + if (type == SUDO_CONV_PROMPT_ECHO_OFF && def_pwfeedback) + type = SUDO_CONV_PROMPT_MASK; + + /* If visiblepw set, do not error out if there is no tty. */ + if (def_visiblepw) + type |= SUDO_CONV_PROMPT_ECHO_OK; + + /* Unblock SIGINT and SIGQUIT during password entry. */ + /* XXX - do in tgetpass() itself instead? */ + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + (void) sigprocmask(SIG_UNBLOCK, &mask, &omask); + + /* Call conversation function. */ + memset(&msg, 0, sizeof(msg)); + msg.msg_type = type; + msg.timeout = def_passwd_timeout.tv_sec; + msg.msg = prompt; + memset(&repl, 0, sizeof(repl)); + sudo_conv(1, &msg, &repl, callback); + /* XXX - check for ENOTTY? */ + + /* Restore previous signal mask. */ + (void) sigprocmask(SIG_SETMASK, &omask, NULL); + + debug_return_str_masked(repl.reply); +} + +void +dump_auth_methods(void) +{ + sudo_auth *auth; + debug_decl(dump_auth_methods, SUDOERS_DEBUG_AUTH); + + sudo_printf(SUDO_CONV_INFO_MSG, _("Authentication methods:")); + for (auth = auth_switch; auth->name; auth++) + sudo_printf(SUDO_CONV_INFO_MSG, " '%s'", auth->name); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + + debug_return; +} diff --git a/plugins/sudoers/auth/sudo_auth.h b/plugins/sudoers/auth/sudo_auth.h new file mode 100644 index 0000000..9ee408d --- /dev/null +++ b/plugins/sudoers/auth/sudo_auth.h @@ -0,0 +1,104 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2016, 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_AUTH_H +#define SUDO_AUTH_H + +/* Auth function return values. */ +#define AUTH_SUCCESS 0 +#define AUTH_FAILURE 1 +#define AUTH_INTR 2 +#define AUTH_FATAL 3 + +typedef struct sudo_auth { + int flags; /* various flags, see below */ + int status; /* status from verify routine */ + char *name; /* name of the method as a string */ + void *data; /* method-specific data pointer */ + int (*init)(struct passwd *pw, struct sudo_auth *auth); + int (*setup)(struct passwd *pw, char **prompt, struct sudo_auth *auth); + int (*verify)(struct passwd *pw, char *p, struct sudo_auth *auth, struct sudo_conv_callback *callback); + int (*approval)(struct passwd *pw, struct sudo_auth *auth, bool exempt); + int (*cleanup)(struct passwd *pw, struct sudo_auth *auth, bool force); + int (*begin_session)(struct passwd *pw, char **user_env[], struct sudo_auth *auth); + int (*end_session)(struct passwd *pw, struct sudo_auth *auth); +} sudo_auth; + +/* Values for sudo_auth.flags. */ +#define FLAG_DISABLED 0x02 /* method disabled */ +#define FLAG_STANDALONE 0x04 /* standalone auth method */ +#define FLAG_ONEANDONLY 0x08 /* one and only auth method */ + +/* Shortcuts for using the flags above. */ +#define IS_DISABLED(x) ((x)->flags & FLAG_DISABLED) +#define IS_STANDALONE(x) ((x)->flags & FLAG_STANDALONE) +#define IS_ONEANDONLY(x) ((x)->flags & FLAG_ONEANDONLY) + +/* Like tgetpass() but uses conversation function */ +char *auth_getpass(const char *prompt, int type, struct sudo_conv_callback *callback); + +/* Pointer to conversation function to use with auth_getpass(). */ +extern sudo_conv_t sudo_conv; + +/* Prototypes for standalone methods */ +int bsdauth_init(struct passwd *pw, sudo_auth *auth); +int bsdauth_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback); +int bsdauth_approval(struct passwd *pw, sudo_auth *auth, bool exempt); +int bsdauth_cleanup(struct passwd *pw, sudo_auth *auth, bool force); +int sudo_aix_init(struct passwd *pw, sudo_auth *auth); +int sudo_aix_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_aix_cleanup(struct passwd *pw, sudo_auth *auth, bool force); +int sudo_fwtk_init(struct passwd *pw, sudo_auth *auth); +int sudo_fwtk_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_fwtk_cleanup(struct passwd *pw, sudo_auth *auth, bool force); +int sudo_pam_init(struct passwd *pw, sudo_auth *auth); +int sudo_pam_init_quiet(struct passwd *pw, sudo_auth *auth); +int sudo_pam_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_pam_approval(struct passwd *pw, sudo_auth *auth, bool exempt); +int sudo_pam_cleanup(struct passwd *pw, sudo_auth *auth, bool force); +int sudo_pam_begin_session(struct passwd *pw, char **user_env[], sudo_auth *auth); +int sudo_pam_end_session(struct passwd *pw, sudo_auth *auth); +int sudo_securid_init(struct passwd *pw, sudo_auth *auth); +int sudo_securid_setup(struct passwd *pw, char **prompt, sudo_auth *auth); +int sudo_securid_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_sia_setup(struct passwd *pw, char **prompt, sudo_auth *auth); +int sudo_sia_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_sia_cleanup(struct passwd *pw, sudo_auth *auth, bool force); +int sudo_sia_begin_session(struct passwd *pw, char **user_env[], sudo_auth *auth); + +/* Prototypes for normal methods */ +int sudo_afs_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_dce_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_krb5_init(struct passwd *pw, sudo_auth *auth); +int sudo_krb5_setup(struct passwd *pw, char **prompt, sudo_auth *auth); +int sudo_krb5_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_krb5_cleanup(struct passwd *pw, sudo_auth *auth, bool force); +int sudo_passwd_init(struct passwd *pw, sudo_auth *auth); +int sudo_passwd_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_passwd_cleanup(struct passwd *pw, sudo_auth *auth, bool force); +int sudo_rfc1938_setup(struct passwd *pw, char **prompt, sudo_auth *auth); +int sudo_rfc1938_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_secureware_init(struct passwd *pw, sudo_auth *auth); +int sudo_secureware_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_secureware_cleanup(struct passwd *pw, sudo_auth *auth, bool force); + +/* Fields: name, flags, init, setup, verify, approval, cleanup, begin_sess, end_sess */ +#define AUTH_ENTRY(n, f, i, s, v, a, c, b, e) \ + { (f), AUTH_FAILURE, (n), NULL, (i), (s), (v), (a), (c) , (b), (e) }, + +#endif /* SUDO_AUTH_H */ diff --git a/plugins/sudoers/base64.c b/plugins/sudoers/base64.c new file mode 100644 index 0000000..7691aba --- /dev/null +++ b/plugins/sudoers/base64.c @@ -0,0 +1,121 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include "sudoers.h" + +/* + * Derived from code with the following declaration: + * PUBLIC DOMAIN - Jon Mayo - November 13, 2003 + */ + +static const unsigned char base64dec_tab[256]= { + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255, + 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, + 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +}; + +/* + * Decode a NUL-terminated string in base64 format and store the + * result in dst. + */ +size_t +base64_decode(const char *in, unsigned char *out, size_t out_size) +{ + unsigned char *out_end = out + out_size; + const unsigned char *out0 = out; + unsigned int rem, v; + debug_decl(base64_decode, SUDOERS_DEBUG_MATCH); + + for (v = 0, rem = 0; *in != '\0' && *in != '='; in++) { + unsigned char ch = base64dec_tab[(unsigned char)*in]; + if (ch == 255) + debug_return_size_t((size_t)-1); + v = (v << 6) | ch; + rem += 6; + if (rem >= 8) { + rem -= 8; + if (out >= out_end) + debug_return_size_t((size_t)-1); + *out++ = (v >> rem) & 0xff; + } + } + if (rem >= 8) { + if (out >= out_end) + debug_return_size_t((size_t)-1); + *out++ = (v >> rem) & 0xff; + } + debug_return_size_t((size_t)(out - out0)); +} + +static const unsigned char base64enc_tab[64] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +size_t +base64_encode(const unsigned char *in, size_t in_len, char *out, size_t out_len) +{ + size_t ii, io; + unsigned int rem, v; + debug_decl(base64_encode, SUDOERS_DEBUG_MATCH); + + for (io = 0, ii = 0, v = 0, rem = 0; ii < in_len; ii++) { + unsigned char ch = in[ii]; + v = (v << 8) | ch; + rem += 8; + while (rem >= 6) { + rem -= 6; + if (io >= out_len) + debug_return_size_t((size_t)-1); /* truncation is failure */ + out[io++] = base64enc_tab[(v >> rem) & 63]; + } + } + if (rem != 0) { + v <<= (6 - rem); + if (io >= out_len) + debug_return_size_t((size_t)-1); /* truncation is failure */ + out[io++] = base64enc_tab[v&63]; + } + while (io & 3) { + if (io >= out_len) + debug_return_size_t((size_t)-1); /* truncation is failure */ + out[io++] = '='; + } + if (io >= out_len) + debug_return_size_t((size_t)-1); /* no room for NUL terminator */ + out[io] = '\0'; + debug_return_size_t(io); +} diff --git a/plugins/sudoers/boottime.c b/plugins/sudoers/boottime.c new file mode 100644 index 0000000..78f3279 --- /dev/null +++ b/plugins/sudoers/boottime.c @@ -0,0 +1,167 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2015, 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include /* for size_t, ssize_t */ +#include + +#include +#include +#include +#include +#include +#include +#ifndef __linux__ +# if defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME) +# include +# elif defined(HAVE_GETUTXID) +# include +# elif defined(HAVE_GETUTID) +# include +# endif +#endif /* !__linux__ */ + +#include "sudoers.h" + +/* + * Fill in a struct timespec with the time the system booted. + * Returns 1 on success and 0 on failure. + */ + +#if defined(__linux__) +bool +get_boottime(struct timespec *ts) +{ + char *line = NULL; + size_t linesize = 0; + bool found = false; + long long llval; + ssize_t len; + FILE *fp; + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL); + + /* read btime from /proc/stat */ + fp = fopen("/proc/stat", "r"); + if (fp != NULL) { + while ((len = getdelim(&line, &linesize, '\n', fp)) != -1) { + if (strncmp(line, "btime ", 6) == 0) { + if (line[len - 1] == '\n') + line[len - 1] = '\0'; + llval = sudo_strtonum(line + 6, 1, LLONG_MAX, NULL); + if (llval > 0) { + ts->tv_sec = (time_t)llval; + ts->tv_nsec = 0; + found = true; + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "found btime in /proc/stat: %lld", llval); + break; + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "invalid btime in /proc/stat: %s", line); + } + } + } + fclose(fp); + free(line); + } + + debug_return_bool(found); +} + +#elif defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME) + +bool +get_boottime(struct timespec *ts) +{ + size_t size; + int mib[2]; + struct timeval tv; + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL); + + mib[0] = CTL_KERN; + mib[1] = KERN_BOOTTIME; + size = sizeof(tv); + if (sysctl(mib, 2, &tv, &size, NULL, 0) != -1) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "KERN_BOOTTIME: %lld, %ld", (long long)tv.tv_sec, (long)tv.tv_usec); + TIMEVAL_TO_TIMESPEC(&tv, ts); + debug_return_bool(true); + } + + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "KERN_BOOTTIME: %s", strerror(errno)); + debug_return_bool(false); +} + +#elif defined(HAVE_GETUTXID) + +bool +get_boottime(struct timespec *ts) +{ + struct utmpx *ut, key; + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL); + + memset(&key, 0, sizeof(key)); + key.ut_type = BOOT_TIME; + setutxent(); + if ((ut = getutxid(&key)) != NULL) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "BOOT_TIME: %lld, %ld", (long long)ut->ut_tv.tv_sec, + (long)ut->ut_tv.tv_usec); + TIMEVAL_TO_TIMESPEC(&ut->ut_tv, ts); + } + endutxent(); + debug_return_bool(ut != NULL); +} + +#elif defined(HAVE_GETUTID) + +bool +get_boottime(struct timespec *ts) +{ + struct utmp *ut, key; + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL); + + memset(&key, 0, sizeof(key)); + key.ut_type = BOOT_TIME; + setutent(); + if ((ut = getutid(&key)) != NULL) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "BOOT_TIME: %lld", (long long)ut->ut_time); + ts->tv_sec = ut->ut_time; + ts->tv_nsec = 0; + } + endutent(); + debug_return_bool(ut != NULL); +} + +#else + +bool +get_boottime(struct timespec *ts) +{ + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL); + debug_return_bool(false); +} +#endif diff --git a/plugins/sudoers/bsm_audit.c b/plugins/sudoers/bsm_audit.c new file mode 100644 index 0000000..2867c5f --- /dev/null +++ b/plugins/sudoers/bsm_audit.c @@ -0,0 +1,283 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2015 Todd C. Miller + * Copyright (c) 2009 Christian S.J. Peron + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_BSM_AUDIT + +#include /* for pid_t */ + +#include +#include +#include + +#include +#include +#include +#include + +#include "sudoers.h" +#include "bsm_audit.h" + +/* + * Solaris auditon() returns EINVAL if BSM audit not configured. + * OpenBSM returns ENOSYS for unimplemented options. + */ +#ifdef __sun +# define AUDIT_NOT_CONFIGURED EINVAL +#else +# define AUDIT_NOT_CONFIGURED ENOSYS +#endif + +#ifdef __FreeBSD__ +# define BSM_AUDIT_COMPAT +#endif + +static au_event_t sudo_audit_event = AUE_sudo; + +static int +audit_sudo_selected(int sorf) +{ + auditinfo_addr_t ainfo_addr; + struct au_mask *mask; + int rc; + debug_decl(audit_sudo_selected, SUDOERS_DEBUG_AUDIT); + + if (getaudit_addr(&ainfo_addr, sizeof(ainfo_addr)) < 0) { +#ifdef BSM_AUDIT_COMPAT + if (errno == ENOSYS) { + auditinfo_t ainfo; + + /* Fall back to older BSM API. */ + if (getaudit(&ainfo) < 0) { + sudo_warn("getaudit"); + debug_return_int(-1); + } + mask = &ainfo.ai_mask; + } else +#endif /* BSM_AUDIT_COMPAT */ + { + sudo_warn("getaudit_addr"); + debug_return_int(-1); + } + } else { + mask = &ainfo_addr.ai_mask; + } + rc = au_preselect(sudo_audit_event, mask, sorf, AU_PRS_REREAD); + if (rc == -1) { +#if defined(__APPLE__) && defined(AUE_DARWIN_sudo) + /* + * Mac OS X 10.10 au_preselect() only accepts AUE_DARWIN_sudo. + */ + sudo_audit_event = AUE_DARWIN_sudo; + rc = au_preselect(sudo_audit_event, mask, sorf, AU_PRS_REREAD); + if (rc == -1) +#endif + + sudo_warn("au_preselect"); + } + debug_return_int(rc); +} + +/* + * Returns 0 on success or -1 on error. + */ +int +bsm_audit_success(char *const exec_args[]) +{ + auditinfo_addr_t ainfo_addr; + token_t *tok; + au_id_t auid; + long au_cond; + int aufd, selected; + pid_t pid; + debug_decl(bsm_audit_success, SUDOERS_DEBUG_AUDIT); + + /* + * If we are not auditing, don't cut an audit record; just return. + */ + if (auditon(A_GETCOND, (caddr_t)&au_cond, sizeof(long)) < 0) { + if (errno == AUDIT_NOT_CONFIGURED) + debug_return_int(0); + sudo_warn("%s", U_("Could not determine audit condition")); + debug_return_int(-1); + } + if (au_cond == AUC_NOAUDIT) + debug_return_int(0); + /* + * Check to see if the preselection masks are interested in seeing + * this event. + */ + selected = audit_sudo_selected(AU_PRS_SUCCESS); + if (selected != 1) + debug_return_int(!selected ? 0 : -1); + if (getauid(&auid) < 0) { + sudo_warn("getauid"); + debug_return_int(-1); + } + if ((aufd = au_open()) == -1) { + sudo_warn("au_open"); + debug_return_int(-1); + } + pid = getpid(); + if (getaudit_addr(&ainfo_addr, sizeof(ainfo_addr)) == 0) { + tok = au_to_subject_ex(auid, geteuid(), getegid(), getuid(), + getuid(), pid, pid, &ainfo_addr.ai_termid); +#ifdef BSM_AUDIT_COMPAT + } else if (errno == ENOSYS) { + auditinfo_t ainfo; + + /* + * NB: We should probably watch out for ERANGE here. + */ + if (getaudit(&ainfo) < 0) { + sudo_warn("getaudit"); + debug_return_int(-1); + } + tok = au_to_subject(auid, geteuid(), getegid(), getuid(), + getuid(), pid, pid, &ainfo.ai_termid); +#endif /* BSM_AUDIT_COMPAT */ + } else { + sudo_warn("getaudit_addr"); + debug_return_int(-1); + } + if (tok == NULL) { + sudo_warn("au_to_subject"); + debug_return_int(-1); + } + au_write(aufd, tok); + tok = au_to_exec_args((char **)exec_args); + if (tok == NULL) { + sudo_warn("au_to_exec_args"); + debug_return_int(-1); + } + au_write(aufd, tok); + tok = au_to_return32(0, 0); + if (tok == NULL) { + sudo_warn("au_to_return32"); + debug_return_int(-1); + } + au_write(aufd, tok); +#ifdef HAVE_AU_CLOSE_SOLARIS11 + if (au_close(aufd, 1, sudo_audit_event, 0) == -1) +#else + if (au_close(aufd, 1, sudo_audit_event) == -1) +#endif + { + sudo_warn("%s", U_("unable to commit audit record")); + debug_return_int(-1); + } + debug_return_int(0); +} + +/* + * Returns 0 on success or -1 on error. + */ +int +bsm_audit_failure(char *const exec_args[], const char *errmsg) +{ + auditinfo_addr_t ainfo_addr; + token_t *tok; + long au_cond; + au_id_t auid; + pid_t pid; + int aufd; + debug_decl(bsm_audit_failure, SUDOERS_DEBUG_AUDIT); + + /* + * If we are not auditing, don't cut an audit record; just return. + */ + if (auditon(A_GETCOND, (caddr_t)&au_cond, sizeof(long)) < 0) { + if (errno == AUDIT_NOT_CONFIGURED) + debug_return_int(0); + sudo_warn("%s", U_("Could not determine audit condition")); + debug_return_int(-1); + } + if (au_cond == AUC_NOAUDIT) + debug_return_int(0); + if (!audit_sudo_selected(AU_PRS_FAILURE)) + debug_return_int(0); + if (getauid(&auid) < 0) { + sudo_warn("getauid"); + debug_return_int(-1); + } + if ((aufd = au_open()) == -1) { + sudo_warn("au_open"); + debug_return_int(-1); + } + pid = getpid(); + if (getaudit_addr(&ainfo_addr, sizeof(ainfo_addr)) == 0) { + tok = au_to_subject_ex(auid, geteuid(), getegid(), getuid(), + getuid(), pid, pid, &ainfo_addr.ai_termid); +#ifdef BSM_AUDIT_COMPAT + } else if (errno == ENOSYS) { + auditinfo_t ainfo; + + if (getaudit(&ainfo) < 0) { + sudo_warn("getaudit"); + debug_return_int(-1); + } + tok = au_to_subject(auid, geteuid(), getegid(), getuid(), + getuid(), pid, pid, &ainfo.ai_termid); +#endif /* BSM_AUDIT_COMPAT */ + } else { + sudo_warn("getaudit_addr"); + debug_return_int(-1); + } + if (tok == NULL) { + sudo_warn("au_to_subject"); + debug_return_int(-1); + } + au_write(aufd, tok); + tok = au_to_exec_args((char **)exec_args); + if (tok == NULL) { + sudo_warn("au_to_exec_args"); + debug_return_int(-1); + } + au_write(aufd, tok); + tok = au_to_text((char *)errmsg); + if (tok == NULL) { + sudo_warn("au_to_text"); + debug_return_int(-1); + } + au_write(aufd, tok); + tok = au_to_return32(EPERM, 1); + if (tok == NULL) { + sudo_warn("au_to_return32"); + debug_return_int(-1); + } + au_write(aufd, tok); +#ifdef HAVE_AU_CLOSE_SOLARIS11 + if (au_close(aufd, 1, sudo_audit_event, PAD_FAILURE) == -1) +#else + if (au_close(aufd, 1, sudo_audit_event) == -1) +#endif + { + sudo_warn("%s", U_("unable to commit audit record")); + debug_return_int(-1); + } + debug_return_int(0); +} + +#endif /* HAVE_BSM_AUDIT */ diff --git a/plugins/sudoers/bsm_audit.h b/plugins/sudoers/bsm_audit.h new file mode 100644 index 0000000..db2f496 --- /dev/null +++ b/plugins/sudoers/bsm_audit.h @@ -0,0 +1,26 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2010, 2013-2014 Todd C. Miller + * Copyright (c) 2009 Christian S.J. Peron + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_BSM_AUDIT_H +#define SUDOERS_BSM_AUDIT_H + +int bsm_audit_success(char *const argv[]); +int bsm_audit_failure(char *const argv[], const char *errmsg); + +#endif /* SUDOERS_BSM_AUDIT_H */ diff --git a/plugins/sudoers/check.c b/plugins/sudoers/check.c new file mode 100644 index 0000000..4a7bb5e --- /dev/null +++ b/plugins/sudoers/check.c @@ -0,0 +1,373 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996,1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include /* for ssize_t */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "check.h" + +static bool display_lecture(int); +static struct passwd *get_authpw(int); + +struct getpass_closure { + int tstat; + void *cookie; + struct passwd *auth_pw; +}; + +/* + * Called when getpass is suspended so we can drop the lock. + */ +static int +getpass_suspend(int signo, void *vclosure) +{ + struct getpass_closure *closure = vclosure; + + timestamp_close(closure->cookie); + closure->cookie = NULL; + return 0; +} + +/* + * Called when getpass is resumed so we can reacquire the lock. + */ +static int +getpass_resume(int signo, void *vclosure) +{ + struct getpass_closure *closure = vclosure; + + closure->cookie = timestamp_open(user_name, user_sid); + if (closure->cookie == NULL) + return -1; + if (!timestamp_lock(closure->cookie, closure->auth_pw)) + return -1; + return 0; +} + +/* + * Returns true if the user successfully authenticates, false if not + * or -1 on fatal error. + */ +static int +check_user_interactive(int validated, int mode, struct getpass_closure *closure) +{ + struct sudo_conv_callback cb, *callback = NULL; + int ret = -1; + char *prompt; + bool lectured; + debug_decl(check_user_interactive, SUDOERS_DEBUG_AUTH); + + /* Open, lock and read time stamp file if we are using it. */ + if (!ISSET(mode, MODE_IGNORE_TICKET)) { + /* Open time stamp file and check its status. */ + closure->cookie = timestamp_open(user_name, user_sid); + if (timestamp_lock(closure->cookie, closure->auth_pw)) + closure->tstat = timestamp_status(closure->cookie, closure->auth_pw); + + /* Construct callback for getpass function. */ + memset(&cb, 0, sizeof(cb)); + cb.version = SUDO_CONV_CALLBACK_VERSION; + cb.closure = closure; + cb.on_suspend = getpass_suspend; + cb.on_resume = getpass_resume; + callback = &cb; + } + + switch (closure->tstat) { + case TS_FATAL: + /* Fatal error (usually setuid failure), unsafe to proceed. */ + goto done; + + case TS_CURRENT: + /* Time stamp file is valid and current. */ + if (!ISSET(validated, FLAG_CHECK_USER)) { + ret = true; + break; + } + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: check user flag overrides time stamp", __func__); + FALLTHROUGH; + + default: + /* Bail out if we are non-interactive and a password is required */ + if (ISSET(mode, MODE_NONINTERACTIVE)) { + validated |= FLAG_NON_INTERACTIVE; + log_auth_failure(validated, 0); + goto done; + } + + /* XXX - should not lecture if askpass helper is being used. */ + lectured = display_lecture(closure->tstat); + + /* Expand any escapes in the prompt. */ + prompt = expand_prompt(user_prompt ? user_prompt : def_passprompt, + closure->auth_pw->pw_name); + if (prompt == NULL) + goto done; + + ret = verify_user(closure->auth_pw, prompt, validated, callback); + if (ret == true && lectured) + (void)set_lectured(); /* lecture error not fatal */ + free(prompt); + break; + } + +done: + debug_return_int(ret); +} + +/* + * Returns true if the user successfully authenticates, false if not + * or -1 on error. + */ +int +check_user(int validated, int mode) +{ + struct getpass_closure closure = { TS_ERROR }; + int ret = -1; + bool exempt = false; + debug_decl(check_user, SUDOERS_DEBUG_AUTH); + + /* + * Init authentication system regardless of whether we need a password. + * Required for proper PAM session support. + */ + if ((closure.auth_pw = get_authpw(mode)) == NULL) + goto done; + if (sudo_auth_init(closure.auth_pw) == -1) + goto done; + + /* + * Don't prompt for the root passwd or if the user is exempt. + * If the user is not changing uid/gid, no need for a password. + */ + if (!def_authenticate || user_is_exempt()) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: %s", __func__, + !def_authenticate ? "authentication disabled" : + "user exempt from authentication"); + exempt = true; + ret = true; + goto done; + } + if (user_uid == 0 || (user_uid == runas_pw->pw_uid && + (!runas_gr || user_in_group(sudo_user.pw, runas_gr->gr_name)))) { +#ifdef HAVE_SELINUX + if (user_role == NULL && user_type == NULL) +#endif +#ifdef HAVE_PRIV_SET + if (runas_privs == NULL && runas_limitprivs == NULL) +#endif + { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: user running command as self", __func__); + ret = true; + goto done; + } + } + + ret = check_user_interactive(validated, mode, &closure); + +done: + if (ret == true) { + /* The approval function may disallow a user post-authentication. */ + ret = sudo_auth_approval(closure.auth_pw, validated, exempt); + + /* + * Only update time stamp if user validated and was approved. + * Failure to update the time stamp is not a fatal error. + */ + if (ret == true && closure.tstat != TS_ERROR) { + if (ISSET(validated, VALIDATE_SUCCESS)) + (void)timestamp_update(closure.cookie, closure.auth_pw); + } + } + timestamp_close(closure.cookie); + sudo_auth_cleanup(closure.auth_pw, !ISSET(validated, VALIDATE_SUCCESS)); + if (closure.auth_pw != NULL) + sudo_pw_delref(closure.auth_pw); + + debug_return_int(ret); +} + +/* + * Display sudo lecture (standard or custom). + * Returns true if the user was lectured, else false. + */ +static bool +display_lecture(int status) +{ + struct sudo_conv_message msg; + struct sudo_conv_reply repl; + char buf[BUFSIZ]; + struct stat sb; + ssize_t nread; + int fd; + debug_decl(lecture, SUDOERS_DEBUG_AUTH); + + if (def_lecture == never || + (def_lecture == once && already_lectured(status))) + debug_return_bool(false); + + memset(&msg, 0, sizeof(msg)); + memset(&repl, 0, sizeof(repl)); + + if (def_lecture_file) { + fd = open(def_lecture_file, O_RDONLY|O_NONBLOCK); + if (fd != -1 && fstat(fd, &sb) == 0) { + if (S_ISREG(sb.st_mode)) { + (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK); + while ((nread = read(fd, buf, sizeof(buf) - 1)) > 0) { + buf[nread] = '\0'; + msg.msg_type = SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY; + msg.msg = buf; + sudo_conv(1, &msg, &repl, NULL); + } + close(fd); + if (nread == -1) { + log_warning(SLOG_RAW_MSG, + N_("error reading lecture file %s"), def_lecture_file); + debug_return_bool(false); + } + debug_return_bool(true); + } else { + log_warningx(SLOG_RAW_MSG, + N_("ignoring lecture file %s: not a regular file"), + def_lecture_file); + } + } else { + log_warning(SLOG_RAW_MSG|SLOG_NO_STDERR, N_("unable to open %s"), + def_lecture_file); + } + if (fd != -1) + close(fd); + } + + /* Default sudo lecture. */ + msg.msg_type = SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY; + msg.msg = _("\n" + "We trust you have received the usual lecture from the local System\n" + "Administrator. It usually boils down to these three things:\n\n" + " #1) Respect the privacy of others.\n" + " #2) Think before you type.\n" + " #3) With great power comes great responsibility.\n\n"); + sudo_conv(1, &msg, &repl, NULL); + debug_return_bool(true); +} + +/* + * Checks if the user is exempt from supplying a password. + */ +bool +user_is_exempt(void) +{ + bool ret = false; + debug_decl(user_is_exempt, SUDOERS_DEBUG_AUTH); + + if (def_exempt_group) + ret = user_in_group(sudo_user.pw, def_exempt_group); + debug_return_bool(ret); +} + +/* + * Get passwd entry for the user we are going to authenticate as. + * By default, this is the user invoking sudo. In the most common + * case, this matches sudo_user.pw or runas_pw. + */ +static struct passwd * +get_authpw(int mode) +{ + struct passwd *pw = NULL; + debug_decl(get_authpw, SUDOERS_DEBUG_AUTH); + + if (ISSET(mode, (MODE_CHECK|MODE_LIST))) { + /* In list mode we always prompt for the user's password. */ + sudo_pw_addref(sudo_user.pw); + pw = sudo_user.pw; + } else { + if (def_rootpw) { + if ((pw = sudo_getpwuid(ROOT_UID)) == NULL) { + log_warningx(SLOG_SEND_MAIL, N_("unknown uid: %u"), ROOT_UID); + } + } else if (def_runaspw) { + if ((pw = sudo_getpwnam(def_runas_default)) == NULL) { + log_warningx(SLOG_SEND_MAIL, + N_("unknown user: %s"), def_runas_default); + } + } else if (def_targetpw) { + if (runas_pw->pw_name == NULL) { + /* This should never be NULL as we fake up the passwd struct */ + log_warningx(SLOG_RAW_MSG, N_("unknown uid: %u"), + (unsigned int) runas_pw->pw_uid); + } else { + sudo_pw_addref(runas_pw); + pw = runas_pw; + } + } else { + sudo_pw_addref(sudo_user.pw); + pw = sudo_user.pw; + } + } + + debug_return_ptr(pw); +} + +/* + * Returns true if the specified shell is allowed by /etc/shells, else false. + */ +bool +check_user_shell(const struct passwd *pw) +{ + const char *shell; + debug_decl(check_user_shell, SUDOERS_DEBUG_AUTH); + + if (!def_runas_check_shell) + debug_return_bool(true); + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: checking /etc/shells for %s", __func__, pw->pw_shell); + + setusershell(); + while ((shell = getusershell()) != NULL) { + if (strcmp(shell, pw->pw_shell) == 0) + debug_return_bool(true); + } + endusershell(); + + debug_return_bool(false); +} diff --git a/plugins/sudoers/check.h b/plugins/sudoers/check.h new file mode 100644 index 0000000..39c61fc --- /dev/null +++ b/plugins/sudoers/check.h @@ -0,0 +1,89 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996,1998-2005, 2007-2014 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDOERS_CHECK_H +#define SUDOERS_CHECK_H + +/* Status codes for timestamp_status() */ +#define TS_CURRENT 0 +#define TS_OLD 1 +#define TS_MISSING 2 +#define TS_ERROR 3 +#define TS_FATAL 4 + +/* + * Time stamps are now stored in a single file which contains multiple + * records. Each record starts with a 16-bit version number and a 16-bit + * record size. Multiple record types can coexist in the same file. + */ +#define TS_VERSION 2 + +/* Time stamp entry types */ +#define TS_GLOBAL 0x01 /* not restricted by tty or ppid */ +#define TS_TTY 0x02 /* restricted by tty */ +#define TS_PPID 0x03 /* restricted by ppid */ +#define TS_LOCKEXCL 0x04 /* special lock record */ + +/* Time stamp flags */ +#define TS_DISABLED 0x01 /* entry disabled */ +#define TS_ANYUID 0x02 /* ignore uid, only valid in the key */ + +struct timestamp_entry_v1 { + unsigned short version; /* version number */ + unsigned short size; /* entry size */ + unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */ + unsigned short flags; /* TS_DISABLED, TS_ANYUID */ + uid_t auth_uid; /* uid to authenticate as */ + pid_t sid; /* session ID associated with tty/ppid */ + struct timespec ts; /* time stamp (CLOCK_MONOTONIC) */ + union { + dev_t ttydev; /* tty device number */ + pid_t ppid; /* parent pid */ + } u; +}; + +struct timestamp_entry { + unsigned short version; /* version number */ + unsigned short size; /* entry size */ + unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */ + unsigned short flags; /* TS_DISABLED, TS_ANYUID */ + uid_t auth_uid; /* uid to authenticate as */ + pid_t sid; /* session ID associated with tty/ppid */ + struct timespec start_time; /* session/ppid start time */ + struct timespec ts; /* time stamp (CLOCK_MONOTONIC) */ + union { + dev_t ttydev; /* tty device number */ + pid_t ppid; /* parent pid */ + } u; +}; + +void *timestamp_open(const char *user, pid_t sid); +void timestamp_close(void *vcookie); +bool timestamp_lock(void *vcookie, struct passwd *pw); +bool timestamp_update(void *vcookie, struct passwd *pw); +int timestamp_status(void *vcookie, struct passwd *pw); +int get_starttime(pid_t pid, struct timespec *starttime); +bool already_lectured(int status); +int set_lectured(void); + +#endif /* SUDOERS_CHECK_H */ diff --git a/plugins/sudoers/cvtsudoers.c b/plugins/sudoers/cvtsudoers.c new file mode 100644 index 0000000..5d1ccdd --- /dev/null +++ b/plugins/sudoers/cvtsudoers.c @@ -0,0 +1,1334 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Convert from the sudoers file format to LDIF or JSON format. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#ifdef HAVE_GETOPT_LONG +# include +# else +# include "compat/getopt.h" +#endif /* HAVE_GETOPT_LONG */ + +#include "sudoers.h" +#include "sudoers_version.h" +#include "sudo_lbuf.h" +#include "redblack.h" +#include "cvtsudoers.h" +#include + +/* + * Globals + */ +struct cvtsudoers_filter *filters; +struct sudo_user sudo_user; +struct passwd *list_pw; +static const char short_opts[] = "b:c:d:ef:hi:I:m:Mo:O:pP:s:V"; +static struct option long_opts[] = { + { "base", required_argument, NULL, 'b' }, + { "config", required_argument, NULL, 'c' }, + { "defaults", required_argument, NULL, 'd' }, + { "expand-aliases", no_argument, NULL, 'e' }, + { "output-format", required_argument, NULL, 'f' }, + { "help", no_argument, NULL, 'h' }, + { "input-format", required_argument, NULL, 'i' }, + { "increment", required_argument, NULL, 'I' }, + { "match", required_argument, NULL, 'm' }, + { "match-local", no_argument, NULL, 'M' }, + { "prune-matches", no_argument, NULL, 'p' }, + { "padding", required_argument, NULL, 'P' }, + { "order-start", required_argument, NULL, 'O' }, + { "output", required_argument, NULL, 'o' }, + { "suppress", required_argument, NULL, 's' }, + { "version", no_argument, NULL, 'V' }, + { NULL, no_argument, NULL, '\0' }, +}; + +sudo_dso_public int main(int argc, char *argv[]); +static void help(void) __attribute__((__noreturn__)); +static void usage(int); +static bool convert_sudoers_sudoers(struct sudoers_parse_tree *parse_tree, const char *output_file, struct cvtsudoers_config *conf); +static bool parse_sudoers(const char *input_file, struct cvtsudoers_config *conf); +static bool parse_ldif(struct sudoers_parse_tree *parse_tree, const char *input_file, struct cvtsudoers_config *conf); +static bool cvtsudoers_parse_filter(char *expression); +static struct cvtsudoers_config *cvtsudoers_conf_read(const char *conf_file); +static void cvtsudoers_conf_free(struct cvtsudoers_config *conf); +static int cvtsudoers_parse_defaults(char *expression); +static int cvtsudoers_parse_suppression(char *expression); +static void filter_userspecs(struct sudoers_parse_tree *parse_tree, struct cvtsudoers_config *conf); +static void filter_defaults(struct sudoers_parse_tree *parse_tree, struct cvtsudoers_config *conf); +static void alias_remove_unused(struct sudoers_parse_tree *parse_tree); +static void alias_prune(struct sudoers_parse_tree *parse_tree, struct cvtsudoers_config *conf); + +int +main(int argc, char *argv[]) +{ + int ch, exitcode = EXIT_FAILURE; + enum sudoers_formats output_format = format_ldif; + enum sudoers_formats input_format = format_sudoers; + struct cvtsudoers_config *conf = NULL; + bool match_local = false; + const char *input_file = "-"; + const char *output_file = "-"; + const char *conf_file = _PATH_CVTSUDOERS_CONF; + const char *errstr; + debug_decl(main, SUDOERS_DEBUG_MAIN); + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + { + extern char *malloc_options; + malloc_options = "S"; + } +#endif + + initprogname(argc > 0 ? argv[0] : "cvtsudoers"); + if (!sudoers_initlocale(setlocale(LC_ALL, ""), def_sudoers_locale)) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_warn_set_locale_func(sudoers_warn_setlocale); + bindtextdomain("sudoers", LOCALEDIR); + textdomain("sudoers"); + + /* Read debug and plugin sections of sudo.conf. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG|SUDO_CONF_PLUGINS) == -1) + goto done; + + /* Initialize the debug subsystem. */ + if (!sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname()))) + goto done; + + /* Check for --config option first (no getopt warnings). */ + opterr = 0; + while ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch (ch) { + case 'c': + conf_file = optarg; + break; + } + } + + /* Read conf file. */ + conf = cvtsudoers_conf_read(conf_file); + + /* + * Reset getopt and handle the rest of the arguments. + */ + opterr = 1; + optind = 1; +#ifdef HAVE_OPTRESET + optreset = 1; +#endif + while ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch (ch) { + case 'b': + free(conf->sudoers_base); + conf->sudoers_base = strdup(optarg); + if (conf->sudoers_base == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + break; + case 'c': + /* handled above */ + break; + case 'd': + conf->defstr = optarg; + break; + case 'e': + conf->expand_aliases = true; + break; + case 'f': + free(conf->output_format); + conf->output_format = strdup(optarg); + if (conf->output_format == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + break; + case 'h': + help(); + break; + case 'i': + free(conf->input_format); + conf->input_format = strdup(optarg); + if (conf->input_format == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + break; + case 'I': + conf->order_increment = sudo_strtonum(optarg, 1, UINT_MAX, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("order increment: %s: %s"), optarg, U_(errstr)); + usage(1); + } + break; + case 'm': + conf->filter = optarg; + break; + case 'M': + match_local = true; + break; + case 'o': + output_file = optarg; + break; + case 'O': + conf->sudo_order = sudo_strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("starting order: %s: %s"), optarg, U_(errstr)); + usage(1); + } + break; + case 'p': + conf->prune_matches = true; + break; + case 'P': + conf->order_padding = sudo_strtonum(optarg, 1, UINT_MAX, &errstr); + if (errstr != NULL ) { + sudo_warnx(U_("order padding: %s: %s"), optarg, U_(errstr)); + usage(1); + } + break; + case 's': + conf->supstr = optarg; + break; + case 'V': + (void) printf(_("%s version %s\n"), getprogname(), + PACKAGE_VERSION); + (void) printf(_("%s grammar version %d\n"), getprogname(), + SUDOERS_GRAMMAR_VERSION); + exitcode = EXIT_SUCCESS; + goto done; + default: + usage(1); + } + } + argc -= optind; + argv += optind; + + if (conf->input_format != NULL) { + if (strcasecmp(conf->input_format, "ldif") == 0) { + input_format = format_ldif; + } else if (strcasecmp(conf->input_format, "sudoers") == 0) { + input_format = format_sudoers; + } else { + sudo_warnx(U_("unsupported input format %s"), conf->input_format); + usage(1); + } + } + if (conf->output_format != NULL) { + if (strcasecmp(conf->output_format, "json") == 0) { + output_format = format_json; + conf->store_options = true; + } else if (strcasecmp(conf->output_format, "ldif") == 0) { + output_format = format_ldif; + conf->store_options = true; + } else if (strcasecmp(conf->output_format, "sudoers") == 0) { + output_format = format_sudoers; + conf->store_options = false; + } else { + sudo_warnx(U_("unsupported output format %s"), conf->output_format); + usage(1); + } + } + if (conf->filter != NULL) { + /* We always expand aliases when filtering (may change in future). */ + if (!cvtsudoers_parse_filter(conf->filter)) + usage(1); + } + if (conf->defstr != NULL) { + conf->defaults = cvtsudoers_parse_defaults(conf->defstr); + if (conf->defaults == -1) + usage(1); + } + if (conf->supstr != NULL) { + conf->suppress = cvtsudoers_parse_suppression(conf->supstr); + if (conf->suppress == -1) + usage(1); + } + + /* Apply padding to sudo_order if present. */ + if (conf->sudo_order != 0 && conf->order_padding != 0) { + unsigned int multiplier = 1; + + do { + multiplier *= 10; + } while (--conf->order_padding != 0); + conf->sudo_order *= multiplier; + conf->order_max = conf->sudo_order + (multiplier - 1); + conf->order_padding = multiplier; + } + + /* If no base DN specified, check SUDOERS_BASE. */ + if (conf->sudoers_base == NULL) { + conf->sudoers_base = getenv("SUDOERS_BASE"); + if (conf->sudoers_base != NULL && *conf->sudoers_base != '\0') { + if ((conf->sudoers_base = strdup(conf->sudoers_base)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + } + + /* Input file (defaults to stdin). */ + if (argc > 0) { + if (argc > 1) + usage(1); + input_file = argv[0]; + } + + if (strcmp(input_file, "-") != 0) { + if (strcmp(input_file, output_file) == 0) { + sudo_fatalx(U_("%s: input and output files must be different"), + input_file); + } + } + + /* Set pwutil backend to use the filter data. */ + if (conf->filter != NULL && !match_local) { + sudo_pwutil_set_backend(cvtsudoers_make_pwitem, cvtsudoers_make_gritem, + cvtsudoers_make_gidlist_item, cvtsudoers_make_grlist_item); + } + + /* We may need the hostname to resolve %h escapes in include files. */ + get_hostname(); + + /* Setup defaults data structures. */ + if (!init_defaults()) + sudo_fatalx("%s", U_("unable to initialize sudoers default values")); + + switch (input_format) { + case format_ldif: + if (!parse_ldif(&parsed_policy, input_file, conf)) + goto done; + break; + case format_sudoers: + if (!parse_sudoers(input_file, conf)) + goto done; + break; + default: + sudo_fatalx("error: unhandled input %d", input_format); + } + + /* Apply filters. */ + filter_userspecs(&parsed_policy, conf); + filter_defaults(&parsed_policy, conf); + if (filters != NULL) { + alias_remove_unused(&parsed_policy); + if (conf->prune_matches && conf->expand_aliases) + alias_prune(&parsed_policy, conf); + } + + switch (output_format) { + case format_json: + exitcode = !convert_sudoers_json(&parsed_policy, output_file, conf); + break; + case format_ldif: + exitcode = !convert_sudoers_ldif(&parsed_policy, output_file, conf); + break; + case format_sudoers: + exitcode = !convert_sudoers_sudoers(&parsed_policy, output_file, conf); + break; + default: + sudo_fatalx("error: unhandled output format %d", output_format); + } + +done: + cvtsudoers_conf_free(conf); + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); + return exitcode; +} + +/* + * cvtsudoers configuration data. + */ +static struct cvtsudoers_config cvtsudoers_config = INITIAL_CONFIG; +static struct cvtsudoers_conf_table cvtsudoers_conf_vars[] = { + { "order_start", CONF_UINT, &cvtsudoers_config.sudo_order }, + { "order_increment", CONF_UINT, &cvtsudoers_config.order_increment }, + { "order_padding", CONF_UINT, &cvtsudoers_config.order_padding }, + { "sudoers_base", CONF_STR, &cvtsudoers_config.sudoers_base }, + { "input_format", CONF_STR, &cvtsudoers_config.input_format }, + { "output_format", CONF_STR, &cvtsudoers_config.output_format }, + { "match", CONF_STR, &cvtsudoers_config.filter }, + { "defaults", CONF_STR, &cvtsudoers_config.defstr }, + { "suppress", CONF_STR, &cvtsudoers_config.supstr }, + { "expand_aliases", CONF_BOOL, &cvtsudoers_config.expand_aliases }, + { "prune_matches", CONF_BOOL, &cvtsudoers_config.prune_matches } +}; + +/* + * Look up keyword in config table. + * Returns true if found, else false. + */ +static bool +cvtsudoers_parse_keyword(const char *conf_file, const char *keyword, + const char *value, struct cvtsudoers_conf_table *table) +{ + struct cvtsudoers_conf_table *cur; + const char *errstr; + debug_decl(sudo_ldap_parse_keyword, SUDOERS_DEBUG_UTIL); + + /* Look up keyword in config tables */ + for (cur = table; cur->conf_str != NULL; cur++) { + if (strcasecmp(keyword, cur->conf_str) == 0) { + switch (cur->type) { + case CONF_BOOL: + *(bool *)(cur->valp) = sudo_strtobool(value) == true; + break; + case CONF_UINT: + { + unsigned int uval = + sudo_strtonum(value, 0, UINT_MAX, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s: %s: %s"), + conf_file, keyword, value, U_(errstr)); + continue; + } + *(unsigned int *)(cur->valp) = uval; + } + break; + case CONF_STR: + { + char *cp = strdup(value); + if (cp == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + free(*(char **)(cur->valp)); + *(char **)(cur->valp) = cp; + break; + } + } + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +static struct cvtsudoers_config * +cvtsudoers_conf_read(const char *conf_file) +{ + char *line = NULL; + size_t linesize = 0; + FILE *fp; + debug_decl(cvtsudoers_conf_read, SUDOERS_DEBUG_UTIL); + + if ((fp = fopen(conf_file, "r")) == NULL) + debug_return_ptr(&cvtsudoers_config); + + while (sudo_parseln(&line, &linesize, NULL, fp, 0) != -1) { + char *cp, *keyword, *value; + + if (*line == '\0') + continue; /* skip empty line */ + + /* Parse keyword = value */ + keyword = line; + if ((cp = strchr(line, '=')) == NULL) + continue; + value = cp-- + 1; + + /* Trim whitespace after keyword. */ + while (cp != line && isblank((unsigned char)cp[-1])) + cp--; + *cp = '\0'; + + /* Trim whitespace before value. */ + while (isblank((unsigned char)*value)) + value++; + + /* Look up keyword in config tables */ + if (!cvtsudoers_parse_keyword(conf_file, keyword, value, cvtsudoers_conf_vars)) + sudo_warnx(U_("%s: unknown key word: %s"), conf_file, keyword); + } + free(line); + fclose(fp); + + debug_return_ptr(&cvtsudoers_config); +} + +static void +cvtsudoers_conf_free(struct cvtsudoers_config *conf) +{ + debug_decl(cvtsudoers_conf_free, SUDOERS_DEBUG_UTIL); + + if (conf != NULL) { + free(conf->sudoers_base); + free(conf->input_format); + free(conf->output_format); + conf->sudoers_base = NULL; + conf->input_format = NULL; + conf->output_format = NULL; + } + + debug_return; +} + +static int +cvtsudoers_parse_defaults(char *expression) +{ + char *last, *cp = expression; + int flags = 0; + debug_decl(cvtsudoers_parse_defaults, SUDOERS_DEBUG_UTIL); + + for ((cp = strtok_r(cp, ",", &last)); cp != NULL; (cp = strtok_r(NULL, ",", &last))) { + if (strcasecmp(cp, "all") == 0) { + SET(flags, CVT_DEFAULTS_ALL); + } else if (strcasecmp(cp, "global") == 0) { + SET(flags, CVT_DEFAULTS_GLOBAL); + } else if (strcasecmp(cp, "user") == 0) { + SET(flags, CVT_DEFAULTS_USER); + } else if (strcasecmp(cp, "runas") == 0) { + SET(flags, CVT_DEFAULTS_RUNAS); + } else if (strcasecmp(cp, "host") == 0) { + SET(flags, CVT_DEFAULTS_HOST); + } else if (strcasecmp(cp, "command") == 0) { + SET(flags, CVT_DEFAULTS_CMND); + } else { + sudo_warnx(U_("invalid defaults type: %s"), cp); + debug_return_int(-1); + } + } + + debug_return_int(flags); +} + +static int +cvtsudoers_parse_suppression(char *expression) +{ + char *last, *cp = expression; + int flags = 0; + debug_decl(cvtsudoers_parse_suppression, SUDOERS_DEBUG_UTIL); + + for ((cp = strtok_r(cp, ",", &last)); cp != NULL; (cp = strtok_r(NULL, ",", &last))) { + if (strcasecmp(cp, "defaults") == 0) { + SET(flags, SUPPRESS_DEFAULTS); + } else if (strcasecmp(cp, "aliases") == 0) { + SET(flags, SUPPRESS_ALIASES); + } else if (strcasecmp(cp, "privileges") == 0 || strcasecmp(cp, "privs") == 0) { + SET(flags, SUPPRESS_PRIVS); + } else { + sudo_warnx(U_("invalid suppression type: %s"), cp); + debug_return_int(-1); + } + } + + debug_return_int(flags); +} + +static bool +cvtsudoers_parse_filter(char *expression) +{ + char *last, *cp = expression; + debug_decl(cvtsudoers_parse_filter, SUDOERS_DEBUG_UTIL); + + if (filters == NULL) { + if ((filters = malloc(sizeof(*filters))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + STAILQ_INIT(&filters->users); + STAILQ_INIT(&filters->groups); + STAILQ_INIT(&filters->hosts); + } + + for ((cp = strtok_r(cp, ",", &last)); cp != NULL; (cp = strtok_r(NULL, ",", &last))) { + /* + * Filter expression: + * user=foo,group=bar,host=baz + */ + char *keyword; + struct sudoers_string *s; + + if ((s = malloc(sizeof(*s))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + + /* Parse keyword = value */ + keyword = cp; + if ((cp = strchr(cp, '=')) == NULL) { + sudo_warnx(U_("invalid filter: %s"), keyword);; + free(s); + debug_return_bool(false); + } + *cp++ = '\0'; + s->str = cp; + + if (strcmp(keyword, "user") == 0 ){ + STAILQ_INSERT_TAIL(&filters->users, s, entries); + } else if (strcmp(keyword, "group") == 0 ){ + STAILQ_INSERT_TAIL(&filters->groups, s, entries); + } else if (strcmp(keyword, "host") == 0 ){ + STAILQ_INSERT_TAIL(&filters->hosts, s, entries); + } else { + sudo_warnx(U_("invalid filter: %s"), keyword);; + free(s); + debug_return_bool(false); + } + } + + debug_return_bool(true); +} + +static bool +parse_ldif(struct sudoers_parse_tree *parse_tree, const char *input_file, + struct cvtsudoers_config *conf) +{ + FILE *fp = stdin; + debug_decl(parse_ldif, SUDOERS_DEBUG_UTIL); + + /* Open LDIF file and parse it. */ + if (strcmp(input_file, "-") != 0) { + if ((fp = fopen(input_file, "r")) == NULL) + sudo_fatal(U_("unable to open %s"), input_file); + } + + debug_return_bool(sudoers_parse_ldif(parse_tree, fp, conf->sudoers_base, + conf->store_options)); +} + +static bool +parse_sudoers(const char *input_file, struct cvtsudoers_config *conf) +{ + debug_decl(parse_sudoers, SUDOERS_DEBUG_UTIL); + + /* Open sudoers file and parse it. */ + if (strcmp(input_file, "-") == 0) { + sudoersin = stdin; + input_file = "stdin"; + } else if ((sudoersin = fopen(input_file, "r")) == NULL) + sudo_fatal(U_("unable to open %s"), input_file); + init_parser(input_file, false, true); + if (sudoersparse() && !parse_error) { + sudo_warnx(U_("failed to parse %s file, unknown error"), input_file); + parse_error = true; + rcstr_delref(errorfile); + if ((errorfile = rcstr_dup(input_file)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + if (parse_error) { + if (errorlineno != -1) + sudo_warnx(U_("parse error in %s near line %d\n"), + errorfile, errorlineno); + else if (errorfile != NULL) + sudo_warnx(U_("parse error in %s\n"), errorfile); + debug_return_bool(false); + } + debug_return_bool(true); +} + +FILE * +open_sudoers(const char *file, bool doedit, bool *keepopen) +{ + return fopen(file, "r"); +} + +static bool +userlist_matches_filter(struct sudoers_parse_tree *parse_tree, + struct member_list *users, struct cvtsudoers_config *conf) +{ + struct sudoers_string *s; + struct member *m, *next; + bool ret = false; + debug_decl(userlist_matches_filter, SUDOERS_DEBUG_UTIL); + + if (filters == NULL || + (STAILQ_EMPTY(&filters->users) && STAILQ_EMPTY(&filters->groups))) + debug_return_bool(true); + + TAILQ_FOREACH_REVERSE_SAFE(m, users, member_list, entries, next) { + bool matched = false; + + if (STAILQ_EMPTY(&filters->users)) { + struct passwd pw; + + /* + * Only groups in filter, make a fake user so userlist_matches() + * can do its thing. + */ + memset(&pw, 0, sizeof(pw)); + pw.pw_name = "_nobody"; + pw.pw_uid = (uid_t)-1; + pw.pw_gid = (gid_t)-1; + + if (user_matches(parse_tree, &pw, m) == true) + matched = true; + } else { + STAILQ_FOREACH(s, &filters->users, entries) { + struct passwd *pw = NULL; + + /* An upper case filter entry may be a User_Alias */ + /* XXX - doesn't handle nested aliases */ + if (m->type == ALIAS && !conf->expand_aliases) { + if (strcmp(m->name, s->str) == 0) { + matched = true; + break; + } + } + + if (s->str[0] == '#') { + const char *errstr; + uid_t uid = sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) + pw = sudo_getpwuid(uid); + } + if (pw == NULL) + pw = sudo_getpwnam(s->str); + if (pw == NULL) + continue; + + if (user_matches(parse_tree, pw, m) == true) + matched = true; + sudo_pw_delref(pw); + + /* Only need one user in the filter to match. */ + if (matched) + break; + } + } + + if (matched) { + ret = true; + } else if (conf->prune_matches) { + TAILQ_REMOVE(users, m, entries); + free_member(m); + } + } + + debug_return_bool(ret); +} + +static bool +hostlist_matches_filter(struct sudoers_parse_tree *parse_tree, + struct member_list *hostlist, struct cvtsudoers_config *conf) +{ + struct sudoers_string *s; + struct member *m, *next; + char *lhost, *shost; + bool ret = false; + char **shosts; + int n = 0; + debug_decl(hostlist_matches_filter, SUDOERS_DEBUG_UTIL); + + if (filters == NULL || STAILQ_EMPTY(&filters->hosts)) + debug_return_bool(true); + + /* Create an array of short host names. */ + STAILQ_FOREACH(s, &filters->hosts, entries) { + n++; + } + shosts = reallocarray(NULL, n, sizeof(char *)); + if (shosts == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + n = 0; + STAILQ_FOREACH(s, &filters->hosts, entries) { + lhost = s->str; + if ((shost = strchr(lhost, '.')) != NULL) { + shost = strndup(lhost, (size_t)(shost - lhost)); + if (shost == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } else { + shost = lhost; + } + shosts[n++] = shost; + } + + TAILQ_FOREACH_REVERSE_SAFE(m, hostlist, member_list, entries, next) { + bool matched = false; + n = 0; + STAILQ_FOREACH(s, &filters->hosts, entries) { + lhost = s->str; + shost = shosts[n++]; + + /* An upper case filter entry may be a Host_Alias */ + /* XXX - doesn't handle nested aliases */ + if (m->type == ALIAS && !conf->expand_aliases) { + if (strcmp(m->name, s->str) == 0) { + matched = true; + break; + } + } + + /* Only need one host in the filter to match. */ + /* XXX - can't use netgroup_tuple with NULL pw */ + if (host_matches(parse_tree, NULL, lhost, shost, m) == true) { + matched = true; + break; + } + } + + if (matched) { + ret = true; + } else if (conf->prune_matches) { + TAILQ_REMOVE(hostlist, m, entries); + free_member(m); + } + } + + /* Free shosts array and its contents. */ + n = 0; + STAILQ_FOREACH(s, &filters->hosts, entries) { + lhost = s->str; + shost = shosts[n++]; + if (shost != lhost) + free(shost); + } + free(shosts); + + debug_return_bool(ret == true); +} + +/* + * Display Defaults entries + */ +static bool +print_defaults_sudoers(struct sudoers_parse_tree *parse_tree, + struct sudo_lbuf *lbuf, bool expand_aliases) +{ + struct defaults *def, *next; + debug_decl(print_defaults_sudoers, SUDOERS_DEBUG_UTIL); + + TAILQ_FOREACH_SAFE(def, &parse_tree->defaults, entries, next) { + sudoers_format_default_line(lbuf, parse_tree, def, &next, + expand_aliases); + } + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +static int +print_alias_sudoers(struct sudoers_parse_tree *parse_tree, struct alias *a, + void *v) +{ + struct sudo_lbuf *lbuf = v; + struct member *m; + debug_decl(print_alias_sudoers, SUDOERS_DEBUG_UTIL); + + sudo_lbuf_append(lbuf, "%s %s = ", alias_type_to_string(a->type), + a->name); + TAILQ_FOREACH(m, &a->members, entries) { + if (m != TAILQ_FIRST(&a->members)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, NULL, UNSPEC); + } + sudo_lbuf_append(lbuf, "\n"); + + debug_return_int(sudo_lbuf_error(lbuf) ? -1 : 0); +} + +/* + * Display aliases + */ +static bool +print_aliases_sudoers(struct sudoers_parse_tree *parse_tree, + struct sudo_lbuf *lbuf) +{ + debug_decl(print_aliases_sudoers, SUDOERS_DEBUG_UTIL); + + alias_apply(parse_tree, print_alias_sudoers, lbuf); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +static FILE *output_fp; /* global for convert_sudoers_output */ + +static int +convert_sudoers_output(const char *buf) +{ + return fputs(buf, output_fp); +} + +/* + * Apply filters to userspecs, removing non-matching entries. + */ +static void +filter_userspecs(struct sudoers_parse_tree *parse_tree, + struct cvtsudoers_config *conf) +{ + struct userspec *us, *next_us; + struct privilege *priv, *next_priv; + debug_decl(filter_userspecs, SUDOERS_DEBUG_UTIL); + + if (filters == NULL) + debug_return; + + /* + * Does not currently prune out non-matching entries in the user or + * host lists. It acts more like a grep than a true filter. + * In the future, we may want to add a prune option. + */ + TAILQ_FOREACH_SAFE(us, &parse_tree->userspecs, entries, next_us) { + if (!userlist_matches_filter(parse_tree, &us->users, conf)) { + TAILQ_REMOVE(&parse_tree->userspecs, us, entries); + free_userspec(us); + continue; + } + TAILQ_FOREACH_SAFE(priv, &us->privileges, entries, next_priv) { + if (!hostlist_matches_filter(parse_tree, &priv->hostlist, conf)) { + TAILQ_REMOVE(&us->privileges, priv, entries); + free_privilege(priv); + } + } + if (TAILQ_EMPTY(&us->privileges)) { + TAILQ_REMOVE(&parse_tree->userspecs, us, entries); + free_userspec(us); + continue; + } + } + debug_return; +} + +/* + * Check whether the alias described by "alias_name" is the same + * as "name" or includes an alias called "name". + * Returns true if matched, else false. + */ +static bool +alias_matches(struct sudoers_parse_tree *parse_tree, const char *name, + const char *alias_name, int alias_type) +{ + struct alias *a; + struct member *m; + bool ret = false; + debug_decl(alias_matches, SUDOERS_DEBUG_ALIAS); + + if (strcmp(name, alias_name) == 0) + debug_return_bool(true); + + a = alias_get(parse_tree, alias_name, alias_type); + if (a != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + if (m->type != ALIAS) + continue; + if (alias_matches(parse_tree, name, m->name, alias_type)) { + ret = true; + break; + } + } + alias_put(a); + } + + debug_return_bool(ret); +} + +/* + * Check whether userspecs uses the aliases in the specified member lists. + * If used, they are removed (and freed) from the list. + * This does *not* check Defaults for used aliases, only userspecs. + */ +static void +alias_used_by_userspecs(struct sudoers_parse_tree *parse_tree, + struct member_list *user_aliases, struct member_list *runas_aliases, + struct member_list *host_aliases, struct member_list *cmnd_aliases) +{ + struct privilege *priv, *priv_next; + struct userspec *us, *us_next; + struct cmndspec *cs, *cs_next; + struct member *m, *m_next; + struct member *am, *am_next; + debug_decl(alias_used_by_userspecs, SUDOERS_DEBUG_ALIAS); + + /* Iterate over the policy, checking for aliases. */ + TAILQ_FOREACH_SAFE(us, &parse_tree->userspecs, entries, us_next) { + TAILQ_FOREACH_SAFE(m, &us->users, entries, m_next) { + if (m->type == ALIAS) { + /* If alias is used, remove from user_aliases and free. */ + TAILQ_FOREACH_SAFE(am, user_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, USERALIAS)) { + TAILQ_REMOVE(user_aliases, am, entries); + free_member(am); + } + } + } + } + TAILQ_FOREACH_SAFE(priv, &us->privileges, entries, priv_next) { + TAILQ_FOREACH(m, &priv->hostlist, entries) { + if (m->type == ALIAS) { + /* If alias is used, remove from host_aliases and free. */ + TAILQ_FOREACH_SAFE(am, host_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, HOSTALIAS)) { + TAILQ_REMOVE(host_aliases, am, entries); + free_member(am); + } + } + } + } + TAILQ_FOREACH_SAFE(cs, &priv->cmndlist, entries, cs_next) { + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH_SAFE(m, cs->runasuserlist, entries, m_next) { + if (m->type == ALIAS) { + /* If alias is used, remove from runas_aliases and free. */ + TAILQ_FOREACH_SAFE(am, runas_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, RUNASALIAS)) { + TAILQ_REMOVE(runas_aliases, am, entries); + free_member(am); + } + } + } + } + } + if (cs->runasgrouplist != NULL) { + TAILQ_FOREACH_SAFE(m, cs->runasgrouplist, entries, m_next) { + if (m->type == ALIAS) { + /* If alias is used, remove from runas_aliases and free. */ + TAILQ_FOREACH_SAFE(am, runas_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, RUNASALIAS)) { + TAILQ_REMOVE(runas_aliases, am, entries); + free_member(am); + } + } + } + } + } + if ((m = cs->cmnd)->type == ALIAS) { + /* If alias is used, remove from cmnd_aliases and free. */ + TAILQ_FOREACH_SAFE(am, cmnd_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, CMNDALIAS)) { + TAILQ_REMOVE(cmnd_aliases, am, entries); + free_member(am); + } + } + } + } + } + } + + debug_return; +} + +/* + * For each alias listed in members, remove and free the alias. + * Frees the contents of members too. + */ +static void +free_aliases_by_members(struct sudoers_parse_tree *parse_tree, + struct member_list *members, int type) +{ + struct member *m; + struct alias *a; + debug_decl(free_aliases_by_members, SUDOERS_DEBUG_ALIAS); + + while ((m = TAILQ_FIRST(members)) != NULL) { + TAILQ_REMOVE(members, m, entries); + a = alias_remove(parse_tree, m->name, type); + alias_free(a); + free_member(m); + } + debug_return; +} + +/* + * Apply filters to host/user-based Defaults, removing non-matching entries. + */ +static void +filter_defaults(struct sudoers_parse_tree *parse_tree, + struct cvtsudoers_config *conf) +{ + struct member_list user_aliases = TAILQ_HEAD_INITIALIZER(user_aliases); + struct member_list runas_aliases = TAILQ_HEAD_INITIALIZER(runas_aliases); + struct member_list host_aliases = TAILQ_HEAD_INITIALIZER(host_aliases); + struct member_list cmnd_aliases = TAILQ_HEAD_INITIALIZER(cmnd_aliases); + struct member_list *prev_binding = NULL; + struct defaults *def, *def_next; + struct member *m, *m_next; + int alias_type; + debug_decl(filter_defaults, SUDOERS_DEBUG_DEFAULTS); + + if (filters == NULL && conf->defaults == CVT_DEFAULTS_ALL) + debug_return; + + TAILQ_FOREACH_SAFE(def, &parse_tree->defaults, entries, def_next) { + bool keep = true; + + switch (def->type) { + case DEFAULTS: + if (!ISSET(conf->defaults, CVT_DEFAULTS_GLOBAL)) + keep = false; + alias_type = UNSPEC; + break; + case DEFAULTS_USER: + if (!ISSET(conf->defaults, CVT_DEFAULTS_USER) || + !userlist_matches_filter(parse_tree, def->binding, conf)) + keep = false; + alias_type = USERALIAS; + break; + case DEFAULTS_RUNAS: + if (!ISSET(conf->defaults, CVT_DEFAULTS_RUNAS)) + keep = false; + alias_type = RUNASALIAS; + break; + case DEFAULTS_HOST: + if (!ISSET(conf->defaults, CVT_DEFAULTS_HOST) || + !hostlist_matches_filter(parse_tree, def->binding, conf)) + keep = false; + alias_type = HOSTALIAS; + break; + case DEFAULTS_CMND: + if (!ISSET(conf->defaults, CVT_DEFAULTS_CMND)) + keep = false; + alias_type = CMNDALIAS; + break; + default: + sudo_fatalx_nodebug("unexpected defaults type %d", def->type); + break; + } + + if (!keep) { + /* Look for aliases used by the binding. */ + /* XXX - move to function */ + if (alias_type != UNSPEC && def->binding != prev_binding) { + TAILQ_FOREACH_SAFE(m, def->binding, entries, m_next) { + if (m->type == ALIAS) { + TAILQ_REMOVE(def->binding, m, entries); + switch (alias_type) { + case USERALIAS: + TAILQ_INSERT_TAIL(&user_aliases, m, entries); + break; + case RUNASALIAS: + TAILQ_INSERT_TAIL(&runas_aliases, m, entries); + break; + case HOSTALIAS: + TAILQ_INSERT_TAIL(&host_aliases, m, entries); + break; + case CMNDALIAS: + TAILQ_INSERT_TAIL(&cmnd_aliases, m, entries); + break; + default: + sudo_fatalx_nodebug("unexpected alias type %d", + alias_type); + break; + } + } + } + } + TAILQ_REMOVE(&parse_tree->defaults, def, entries); + free_default(def, &prev_binding); + if (prev_binding != NULL) { + /* Remove and free Defaults that share the same binding. */ + while (def_next != NULL && def_next->binding == prev_binding) { + def = def_next; + def_next = TAILQ_NEXT(def, entries); + TAILQ_REMOVE(&parse_tree->defaults, def, entries); + free_default(def, &prev_binding); + } + } + } else { + prev_binding = def->binding; + } + } + + /* Determine unreferenced aliases and remove/free them. */ + alias_used_by_userspecs(parse_tree, &user_aliases, &runas_aliases, + &host_aliases, &cmnd_aliases); + free_aliases_by_members(parse_tree, &user_aliases, USERALIAS); + free_aliases_by_members(parse_tree, &runas_aliases, RUNASALIAS); + free_aliases_by_members(parse_tree, &host_aliases, HOSTALIAS); + free_aliases_by_members(parse_tree, &cmnd_aliases, CMNDALIAS); + + debug_return; +} + +/* + * Remove unreferenced aliases. + */ +static void +alias_remove_unused(struct sudoers_parse_tree *parse_tree) +{ + struct rbtree *used_aliases; + debug_decl(alias_remove_unused, SUDOERS_DEBUG_ALIAS); + + used_aliases = alloc_aliases(); + if (used_aliases == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Move all referenced aliases to used_aliases. */ + if (!alias_find_used(parse_tree, used_aliases)) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Only unreferenced aliases are left, swap and free the unused ones. */ + free_aliases(parse_tree->aliases); + parse_tree->aliases = used_aliases; + + debug_return; +} + +/* + * Prune out non-matching entries from user and host aliases. + */ +static int +alias_prune_helper(struct sudoers_parse_tree *parse_tree, struct alias *a, + void *v) +{ + struct cvtsudoers_config *conf = v; + + /* XXX - misue of these functions */ + switch (a->type) { + case USERALIAS: + userlist_matches_filter(parse_tree, &a->members, conf); + break; + case HOSTALIAS: + hostlist_matches_filter(parse_tree, &a->members, conf); + break; + default: + break; + } + + return 0; +} + +/* + * Prune out non-matching entries from within aliases. + */ +static void +alias_prune(struct sudoers_parse_tree *parse_tree, + struct cvtsudoers_config *conf) +{ + debug_decl(alias_prune, SUDOERS_DEBUG_ALIAS); + + alias_apply(parse_tree, alias_prune_helper, conf); + + debug_return; +} + +/* + * Convert back to sudoers. + */ +static bool +convert_sudoers_sudoers(struct sudoers_parse_tree *parse_tree, + const char *output_file, struct cvtsudoers_config *conf) +{ + bool ret = true; + struct sudo_lbuf lbuf; + debug_decl(convert_sudoers_sudoers, SUDOERS_DEBUG_UTIL); + + if (strcmp(output_file, "-") == 0) { + output_fp = stdout; + } else { + if ((output_fp = fopen(output_file, "w")) == NULL) + sudo_fatal(U_("unable to open %s"), output_file); + } + + /* Wrap lines at 80 columns with a 4 character indent. */ + sudo_lbuf_init(&lbuf, convert_sudoers_output, 4, "\\", 80); + + /* Print Defaults */ + if (!ISSET(conf->suppress, SUPPRESS_DEFAULTS)) { + if (!print_defaults_sudoers(parse_tree, &lbuf, conf->expand_aliases)) + goto done; + if (lbuf.len > 0) { + sudo_lbuf_print(&lbuf); + sudo_lbuf_append(&lbuf, "\n"); + } + } + + /* Print Aliases */ + if (!conf->expand_aliases && !ISSET(conf->suppress, SUPPRESS_ALIASES)) { + if (!print_aliases_sudoers(parse_tree, &lbuf)) + goto done; + if (lbuf.len > 1) { + sudo_lbuf_print(&lbuf); + sudo_lbuf_append(&lbuf, "\n"); + } + } + + /* Print User_Specs, separated by blank lines. */ + if (!ISSET(conf->suppress, SUPPRESS_PRIVS)) { + if (!sudoers_format_userspecs(&lbuf, parse_tree, "\n", + conf->expand_aliases, true)) { + goto done; + } + if (lbuf.len > 1) { + sudo_lbuf_print(&lbuf); + } + } + +done: + if (sudo_lbuf_error(&lbuf)) { + if (errno == ENOMEM) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = false; + } + sudo_lbuf_destroy(&lbuf); + + (void)fflush(output_fp); + if (ferror(output_fp)) { + sudo_warn(U_("unable to write to %s"), output_file); + ret = false; + } + if (output_fp != stdout) + fclose(output_fp); + + debug_return_bool(ret); +} + +static void +usage(int fatal) +{ + (void) fprintf(fatal ? stderr : stdout, "usage: %s [-ehMpV] [-b dn] " + "[-c conf_file ] [-d deftypes] [-f output_format] [-i input_format] " + "[-I increment] [-m filter] [-o output_file] [-O start_point] " + "[-P padding] [-s sections] [input_file]\n", getprogname()); + if (fatal) + exit(EXIT_FAILURE); +} + +static void +help(void) +{ + (void) printf(_("%s - convert between sudoers file formats\n\n"), getprogname()); + usage(0); + (void) puts(_("\nOptions:\n" + " -b, --base=dn the base DN for sudo LDAP queries\n" + " -c, --config=conf_file the path to the configuration file\n" + " -d, --defaults=deftypes only convert Defaults of the specified types\n" + " -e, --expand-aliases expand aliases when converting\n" + " -f, --output-format=format set output format: JSON, LDIF or sudoers\n" + " -i, --input-format=format set input format: LDIF or sudoers\n" + " -I, --increment=num amount to increase each sudoOrder by\n" + " -h, --help display help message and exit\n" + " -m, --match=filter only convert entries that match the filter\n" + " -M, --match-local match filter uses passwd and group databases\n" + " -o, --output=output_file write converted sudoers to output_file\n" + " -O, --order-start=num starting point for first sudoOrder\n" + " -p, --prune-matches prune non-matching users, groups and hosts\n" + " -P, --padding=num base padding for sudoOrder increment\n" + " -s, --suppress=sections suppress output of certain sections\n" + " -V, --version display version information and exit")); + exit(EXIT_SUCCESS); +} diff --git a/plugins/sudoers/cvtsudoers.h b/plugins/sudoers/cvtsudoers.h new file mode 100644 index 0000000..721b81e --- /dev/null +++ b/plugins/sudoers/cvtsudoers.h @@ -0,0 +1,100 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_CVTSUDOERS_H +#define SUDOERS_CVTSUDOERS_H + +#include "strlist.h" + +/* Supported input/output formats. */ +enum sudoers_formats { + format_json, + format_ldif, + format_sudoers +}; + +/* Flags for cvtsudoers_config.defaults */ +#define CVT_DEFAULTS_GLOBAL 0x01 +#define CVT_DEFAULTS_USER 0x02 +#define CVT_DEFAULTS_RUNAS 0x04 +#define CVT_DEFAULTS_HOST 0x08 +#define CVT_DEFAULTS_CMND 0x10 +#define CVT_DEFAULTS_ALL 0xff + +/* Flags for cvtsudoers_config.suppress */ +#define SUPPRESS_DEFAULTS 0x01 +#define SUPPRESS_ALIASES 0x02 +#define SUPPRESS_PRIVS 0x04 + +/* cvtsudoers.conf settings */ +struct cvtsudoers_config { + unsigned int sudo_order; + unsigned int order_increment; + unsigned int order_padding; + unsigned int order_max; + short defaults; + short suppress; + bool expand_aliases; + bool store_options; + bool prune_matches; + char *sudoers_base; + char *input_format; + char *output_format; + char *filter; + char *defstr; + char *supstr; +}; + +/* Initial config settings for above. */ +#define INITIAL_CONFIG { 1, 1, 0, 0, CVT_DEFAULTS_ALL, 0, false, true, false } + +#define CONF_BOOL 0 +#define CONF_UINT 1 +#define CONF_STR 2 + +struct cvtsudoers_conf_table { + const char *conf_str; /* config file string */ + int type; /* CONF_BOOL, CONF_UINT, CONF_STR */ + void *valp; /* pointer into cvtsudoers_config */ +}; + +struct cvtsudoers_filter { + struct sudoers_str_list users; + struct sudoers_str_list groups; + struct sudoers_str_list hosts; +}; + +/* cvtsudoers.c */ +extern struct cvtsudoers_filter *filters; + +/* cvtsudoers_json.c */ +bool convert_sudoers_json(struct sudoers_parse_tree *parse_tree, const char *output_file, struct cvtsudoers_config *conf); + +/* cvtsudoers_ldif.c */ +bool convert_sudoers_ldif(struct sudoers_parse_tree *parse_tree, const char *output_file, struct cvtsudoers_config *conf); + +/* cvtsudoers_pwutil.c */ +struct cache_item *cvtsudoers_make_pwitem(uid_t uid, const char *name); +struct cache_item *cvtsudoers_make_gritem(gid_t gid, const char *name); +struct cache_item *cvtsudoers_make_gidlist_item(const struct passwd *pw, char * const *unused1, unsigned int type); +struct cache_item *cvtsudoers_make_grlist_item(const struct passwd *pw, char * const *unused1); + +/* stubs.c */ +void get_hostname(void); + +#endif /* SUDOERS_CVTSUDOERS_H */ diff --git a/plugins/sudoers/cvtsudoers_json.c b/plugins/sudoers/cvtsudoers_json.c new file mode 100644 index 0000000..ec4a6f5 --- /dev/null +++ b/plugins/sudoers/cvtsudoers_json.c @@ -0,0 +1,907 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_json.h" +#include "cvtsudoers.h" +#include + +/* + * Closure used to store state when iterating over all aliases. + */ +struct json_alias_closure { + struct json_container *jsonc; + const char *title; + unsigned int count; + int alias_type; +}; + +/* + * Type values used to disambiguate the generic WORD and ALIAS types. + */ +enum word_type { + TYPE_COMMAND, + TYPE_HOSTNAME, + TYPE_RUNASGROUP, + TYPE_RUNASUSER, + TYPE_USERNAME +}; + +/* + * Print sudo command member in JSON format, with correct indentation. + */ +static void +print_command_json(struct json_container *jsonc, const char *name, bool negated) +{ + struct sudo_command *c = (struct sudo_command *)name; + struct command_digest *digest; + struct json_value value; + char *cmnd = c->cmnd; + const char *digest_name; + debug_decl(print_command_json, SUDOERS_DEBUG_UTIL); + + /* Print command with optional command line args. */ + if (c->args != NULL) { + if (asprintf(&cmnd, "%s %s", c->cmnd, c->args) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + value.type = JSON_STRING; + value.u.string = cmnd ? cmnd : "ALL"; + + if (!negated && TAILQ_EMPTY(&c->digests)) { + /* Print as { "command": "command and args" } */ + sudo_json_add_value_as_object(jsonc, "command", &value); + } else { + /* Print as multi-line object. */ + sudo_json_open_object(jsonc, NULL); + sudo_json_add_value(jsonc, "command", &value); + + /* Optional digest list. */ + TAILQ_FOREACH(digest, &c->digests, entries) { + digest_name = digest_type_to_name(digest->digest_type); + value.type = JSON_STRING; + value.u.string = digest->digest_str; + sudo_json_add_value(jsonc, digest_name, &value); + } + + /* Command may be negated. */ + if (negated) { + value.type = JSON_BOOL; + value.u.boolean = true; + sudo_json_add_value(jsonc, "negated", &value); + } + + sudo_json_close_object(jsonc); + } + + if (cmnd != c->cmnd) + free(cmnd); + + debug_return; +} + +/* + * Map an alias type to enum word_type. + */ +static enum word_type +alias_to_word_type(int alias_type) +{ + switch (alias_type) { + case CMNDALIAS: + return TYPE_COMMAND; + case HOSTALIAS: + return TYPE_HOSTNAME; + case RUNASALIAS: + return TYPE_RUNASUSER; + case USERALIAS: + return TYPE_USERNAME; + default: + sudo_fatalx_nodebug("unexpected alias type %d", alias_type); + } +} + +/* + * Map a Defaults type to enum word_type. + */ +static enum word_type +defaults_to_word_type(int defaults_type) +{ + switch (defaults_type) { + case DEFAULTS_CMND: + return TYPE_COMMAND; + case DEFAULTS_HOST: + return TYPE_HOSTNAME; + case DEFAULTS_RUNAS: + return TYPE_RUNASUSER; + case DEFAULTS_USER: + return TYPE_USERNAME; + default: + sudo_fatalx_nodebug("unexpected defaults type %d", defaults_type); + } +} + +/* + * Print struct member in JSON format, with correct indentation. + */ +static void +print_member_json_int(struct json_container *jsonc, + struct sudoers_parse_tree *parse_tree, char *name, int type, bool negated, + enum word_type word_type, bool expand_aliases) +{ + struct json_value value; + const char *typestr = NULL; + const char *errstr; + int alias_type = UNSPEC; + id_t id; + debug_decl(print_member_json_int, SUDOERS_DEBUG_UTIL); + + /* Most of the time we print a string. */ + value.type = JSON_STRING; + switch (type) { + case ALL: + if (name == NULL) { + value.u.string = "ALL"; + } else { + /* ALL used with digest, print as a command. */ + type = COMMAND; + } + break; + case MYSELF: + value.u.string = ""; + break; + default: + if (name == NULL) + sudo_fatalx("missing member name for type %d", type); + value.u.string = name; + } + + switch (type) { + case USERGROUP: + value.u.string++; /* skip leading '%' */ + if (*value.u.string == ':') { + value.u.string++; + typestr = "nonunixgroup"; + if (*value.u.string == '#') { + id = sudo_strtoid(value.u.string + 1, &errstr); + if (errstr != NULL) { + sudo_warnx("internal error: non-Unix group-ID %s: \"%s\"", + errstr, value.u.string + 1); + } else { + value.type = JSON_ID; + value.u.id = id; + typestr = "nonunixgid"; + } + } + } else { + typestr = "usergroup"; + if (*value.u.string == '#') { + id = sudo_strtoid(value.u.string + 1, &errstr); + if (errstr != NULL) { + sudo_warnx("internal error: group-ID %s: \"%s\"", + errstr, value.u.string + 1); + } else { + value.type = JSON_ID; + value.u.id = id; + typestr = "usergid"; + } + } + } + break; + case NETGROUP: + typestr = "netgroup"; + value.u.string++; /* skip leading '+' */ + break; + case NTWKADDR: + typestr = "networkaddr"; + break; + case COMMAND: + print_command_json(jsonc, name, negated); + debug_return; + case ALL: + case MYSELF: + case WORD: + switch (word_type) { + case TYPE_COMMAND: + typestr = "command"; + break; + case TYPE_HOSTNAME: + typestr = "hostname"; + break; + case TYPE_RUNASGROUP: + typestr = "usergroup"; + break; + case TYPE_RUNASUSER: + case TYPE_USERNAME: + typestr = "username"; + if (*value.u.string == '#') { + id = sudo_strtoid(value.u.string + 1, &errstr); + if (errstr != NULL) { + sudo_warnx("internal error: user-ID %s: \"%s\"", + errstr, name); + } else { + value.type = JSON_ID; + value.u.id = id; + typestr = "userid"; + } + } + break; + default: + sudo_fatalx("unexpected word type %d", word_type); + } + break; + case ALIAS: + switch (word_type) { + case TYPE_COMMAND: + if (expand_aliases) { + alias_type = CMNDALIAS; + } else { + typestr = "cmndalias"; + } + break; + case TYPE_HOSTNAME: + if (expand_aliases) { + alias_type = HOSTALIAS; + } else { + typestr = "hostalias"; + } + break; + case TYPE_RUNASGROUP: + case TYPE_RUNASUSER: + if (expand_aliases) { + alias_type = RUNASALIAS; + } else { + typestr = "runasalias"; + } + break; + case TYPE_USERNAME: + if (expand_aliases) { + alias_type = USERALIAS; + } else { + typestr = "useralias"; + } + break; + default: + sudo_fatalx("unexpected word type %d", word_type); + } + break; + default: + sudo_fatalx("unexpected member type %d", type); + } + + if (expand_aliases && type == ALIAS) { + struct alias *a; + struct member *m; + + /* Print each member of the alias. */ + if ((a = alias_get(parse_tree, value.u.string, alias_type)) != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + print_member_json_int(jsonc, parse_tree, m->name, m->type, + negated ? !m->negated : m->negated, + alias_to_word_type(alias_type), true); + } + alias_put(a); + } + } else { + if (negated) { + sudo_json_open_object(jsonc, NULL); + sudo_json_add_value(jsonc, typestr, &value); + value.type = JSON_BOOL; + value.u.boolean = true; + sudo_json_add_value(jsonc, "negated", &value); + sudo_json_close_object(jsonc); + } else { + sudo_json_add_value_as_object(jsonc, typestr, &value); + } + } + + debug_return; +} + +static void +print_member_json(struct json_container *jsonc, + struct sudoers_parse_tree *parse_tree, struct member *m, + enum word_type word_type, bool expand_aliases) +{ + print_member_json_int(jsonc, parse_tree, m->name, m->type, m->negated, + word_type, expand_aliases); +} + +/* + * Callback for alias_apply() to print an alias entry if it matches + * the type specified in the closure. + */ +static int +print_alias_json(struct sudoers_parse_tree *parse_tree, struct alias *a, void *v) +{ + struct json_alias_closure *closure = v; + struct member *m; + debug_decl(print_alias_json, SUDOERS_DEBUG_UTIL); + + if (a->type != closure->alias_type) + debug_return_int(0); + + /* Open the aliases object or close the last entry, then open new one. */ + if (closure->count++ == 0) { + sudo_json_open_object(closure->jsonc, closure->title); + } else { + sudo_json_close_array(closure->jsonc); + } + sudo_json_open_array(closure->jsonc, a->name); + + TAILQ_FOREACH(m, &a->members, entries) { + print_member_json(closure->jsonc, parse_tree, m, + alias_to_word_type(closure->alias_type), false); + } + debug_return_int(0); +} + +/* + * Print the binding for a Defaults entry of the specified type. + */ +static void +print_binding_json(struct json_container *jsonc, + struct sudoers_parse_tree *parse_tree, struct member_list *binding, + int type, bool expand_aliases) +{ + struct member *m; + debug_decl(print_binding_json, SUDOERS_DEBUG_UTIL); + + if (TAILQ_EMPTY(binding)) + debug_return; + + /* Print each member object in binding. */ + sudo_json_open_array(jsonc, "Binding"); + TAILQ_FOREACH(m, binding, entries) { + print_member_json(jsonc, parse_tree, m, defaults_to_word_type(type), + expand_aliases); + } + sudo_json_close_array(jsonc); + + debug_return; +} + +/* + * Print a Defaults list JSON format. + */ +static void +print_defaults_list_json(struct json_container *jsonc, struct defaults *def) +{ + char savech, *start, *end = def->val; + struct json_value value; + debug_decl(print_defaults_list_json, SUDOERS_DEBUG_UTIL); + + sudo_json_open_object(jsonc, NULL); + value.type = JSON_STRING; + switch (def->op) { + case '+': + value.u.string = "list_add"; + break; + case '-': + value.u.string = "list_remove"; + break; + case true: + value.u.string = "list_assign"; + break; + default: + sudo_warnx("internal error: unexpected list op %d", def->op); + value.u.string = "unsupported"; + break; + } + sudo_json_add_value(jsonc, "operation", &value); + sudo_json_open_array(jsonc, def->var); + /* Split value into multiple space-separated words. */ + do { + /* Remove leading blanks, must have a non-empty string. */ + for (start = end; isblank((unsigned char)*start); start++) + continue; + if (*start == '\0') + break; + + /* Find the end and print it. */ + for (end = start; *end && !isblank((unsigned char)*end); end++) + continue; + savech = *end; + *end = '\0'; + value.type = JSON_STRING; + value.u.string = start; + sudo_json_add_value(jsonc, NULL, &value); + *end = savech; + } while (*end++ != '\0'); + sudo_json_close_array(jsonc); + sudo_json_close_object(jsonc); + + debug_return; +} + +static int +get_defaults_type(struct defaults *def) +{ + struct sudo_defs_types *cur; + + /* Look up def in table to find its type. */ + for (cur = sudo_defs_table; cur->name; cur++) { + if (strcmp(def->var, cur->name) == 0) + return cur->type; + } + return -1; +} + +/* + * Export all Defaults in JSON format. + */ +static void +print_defaults_json(struct json_container *jsonc, + struct sudoers_parse_tree *parse_tree, bool expand_aliases) +{ + struct json_value value; + struct defaults *def, *next; + int type; + debug_decl(print_defaults_json, SUDOERS_DEBUG_UTIL); + + if (TAILQ_EMPTY(&parse_tree->defaults)) + debug_return; + + sudo_json_open_array(jsonc, "Defaults"); + + TAILQ_FOREACH_SAFE(def, &parse_tree->defaults, entries, next) { + type = get_defaults_type(def); + if (type == -1) { + sudo_warnx(U_("unknown defaults entry \"%s\""), def->var); + /* XXX - just pass it through as a string anyway? */ + continue; + } + + /* Found it, print object container and binding (if any). */ + sudo_json_open_object(jsonc, NULL); + print_binding_json(jsonc, parse_tree, def->binding, def->type, + expand_aliases); + + /* Validation checks. */ + /* XXX - validate values in addition to names? */ + + /* Print options, merging ones with the same binding. */ + sudo_json_open_array(jsonc, "Options"); + for (;;) { + next = TAILQ_NEXT(def, entries); + /* XXX - need to update cur too */ + if ((type & T_MASK) == T_FLAG || def->val == NULL) { + value.type = JSON_BOOL; + value.u.boolean = def->op; + sudo_json_add_value_as_object(jsonc, def->var, &value); + } else if ((type & T_MASK) == T_LIST) { + print_defaults_list_json(jsonc, def); + } else { + value.type = JSON_STRING; + value.u.string = def->val; + sudo_json_add_value_as_object(jsonc, def->var, &value); + } + if (next == NULL || def->binding != next->binding) + break; + def = next; + type = get_defaults_type(def); + if (type == -1) { + sudo_warnx(U_("unknown defaults entry \"%s\""), def->var); + /* XXX - just pass it through as a string anyway? */ + break; + } + } + sudo_json_close_array(jsonc); + sudo_json_close_object(jsonc); + } + + /* Close Defaults array; comma (if any) & newline will be printer later. */ + sudo_json_close_array(jsonc); + + debug_return; +} + +/* + * Export all aliases of the specified type in JSON format. + * Iterates through the entire aliases tree. + */ +static void +print_aliases_by_type_json(struct json_container *jsonc, + struct sudoers_parse_tree *parse_tree, int alias_type, const char *title) +{ + struct json_alias_closure closure; + debug_decl(print_aliases_by_type_json, SUDOERS_DEBUG_UTIL); + + closure.jsonc = jsonc; + closure.count = 0; + closure.alias_type = alias_type; + closure.title = title; + alias_apply(parse_tree, print_alias_json, &closure); + if (closure.count != 0) { + sudo_json_close_array(jsonc); + sudo_json_close_object(jsonc); + } + + debug_return; +} + +/* + * Export all aliases in JSON format. + */ +static void +print_aliases_json(struct json_container *jsonc, + struct sudoers_parse_tree *parse_tree) +{ + debug_decl(print_aliases_json, SUDOERS_DEBUG_UTIL); + + print_aliases_by_type_json(jsonc, parse_tree, USERALIAS, "User_Aliases"); + print_aliases_by_type_json(jsonc, parse_tree, RUNASALIAS, "Runas_Aliases"); + print_aliases_by_type_json(jsonc, parse_tree, HOSTALIAS, "Host_Aliases"); + print_aliases_by_type_json(jsonc, parse_tree, CMNDALIAS, "Command_Aliases"); + + debug_return; +} + +/* Does the next entry differ only in the command itself? */ +static bool +cmndspec_continues(struct cmndspec *cs, struct cmndspec *next) +{ + bool ret = next != NULL && + !RUNAS_CHANGED(cs, next) && !TAGS_CHANGED(cs->tags, next->tags) +#ifdef HAVE_PRIV_SET + && cs->privs == next->privs && cs->limitprivs == next->limitprivs +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + && cs->role == next->role && cs->type == next->type +#endif /* HAVE_SELINUX */ + && cs->runchroot == next->runchroot && cs->runcwd == next->runcwd; + return ret; +} + +/* + * Print a Cmnd_Spec in JSON format at the correct indent level. + * A pointer to the next Cmnd_Spec is passed in to make it possible to + * merge adjacent entries that are identical in all but the command. + */ +static void +print_cmndspec_json(struct json_container *jsonc, + struct sudoers_parse_tree *parse_tree, struct cmndspec *cs, + struct cmndspec **nextp, struct defaults_list *options, bool expand_aliases) +{ + struct cmndspec *next = *nextp; + struct json_value value; + struct defaults *def; + struct member *m; + struct tm *tp; + char timebuf[sizeof("20120727121554Z")]; + debug_decl(print_cmndspec_json, SUDOERS_DEBUG_UTIL); + + /* Open Cmnd_Spec object. */ + sudo_json_open_object(jsonc, NULL); + + /* Print runasuserlist */ + if (cs->runasuserlist != NULL) { + sudo_json_open_array(jsonc, "runasusers"); + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + print_member_json(jsonc, parse_tree, m, TYPE_RUNASUSER, + expand_aliases); + } + sudo_json_close_array(jsonc); + } + + /* Print runasgrouplist */ + if (cs->runasgrouplist != NULL) { + sudo_json_open_array(jsonc, "runasgroups"); + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + print_member_json(jsonc, parse_tree, m, TYPE_RUNASGROUP, + expand_aliases); + } + sudo_json_close_array(jsonc); + } + + /* Print options and tags */ + if (cs->timeout > 0 || cs->notbefore != UNSPEC || cs->notafter != UNSPEC || + cs->runchroot != NULL || cs->runcwd != NULL || TAGS_SET(cs->tags) || + !TAILQ_EMPTY(options)) { + struct cmndtag tag = cs->tags; + + sudo_json_open_array(jsonc, "Options"); + if (cs->runchroot != NULL) { + value.type = JSON_STRING; + value.u.string = cs->runchroot; + sudo_json_add_value(jsonc, "runchroot", &value); + } + if (cs->runcwd != NULL) { + value.type = JSON_STRING; + value.u.string = cs->runcwd; + sudo_json_add_value(jsonc, "runcwd", &value); + } + if (cs->timeout > 0) { + value.type = JSON_NUMBER; + value.u.number = cs->timeout; + sudo_json_add_value_as_object(jsonc, "command_timeout", &value); + } + if (cs->notbefore != UNSPEC) { + if ((tp = gmtime(&cs->notbefore)) == NULL) { + sudo_warn("%s", U_("unable to get GMT time")); + } else { + if (strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", tp) == 0) { + sudo_warnx("%s", U_("unable to format timestamp")); + } else { + value.type = JSON_STRING; + value.u.string = timebuf; + sudo_json_add_value_as_object(jsonc, "notbefore", &value); + } + } + } + if (cs->notafter != UNSPEC) { + if ((tp = gmtime(&cs->notafter)) == NULL) { + sudo_warn("%s", U_("unable to get GMT time")); + } else { + if (strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", tp) == 0) { + sudo_warnx("%s", U_("unable to format timestamp")); + } else { + value.type = JSON_STRING; + value.u.string = timebuf; + sudo_json_add_value_as_object(jsonc, "notafter", &value); + } + } + } + if (tag.nopasswd != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = !tag.nopasswd; + sudo_json_add_value_as_object(jsonc, "authenticate", &value); + } + if (tag.noexec != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.noexec; + sudo_json_add_value_as_object(jsonc, "noexec", &value); + } + if (tag.send_mail != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.send_mail; + sudo_json_add_value_as_object(jsonc, "send_mail", &value); + } + if (tag.setenv != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.setenv; + sudo_json_add_value_as_object(jsonc, "setenv", &value); + } + if (tag.follow != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.follow; + sudo_json_add_value_as_object(jsonc, "sudoedit_follow", &value); + } + if (tag.log_input != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.log_input; + sudo_json_add_value_as_object(jsonc, "log_input", &value); + } + if (tag.log_output != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.log_output; + sudo_json_add_value_as_object(jsonc, "log_output", &value); + } + TAILQ_FOREACH(def, options, entries) { + int type = get_defaults_type(def); + if (type == -1) { + sudo_warnx(U_("unknown defaults entry \"%s\""), def->var); + /* XXX - just pass it through as a string anyway? */ + continue; + } + if ((type & T_MASK) == T_FLAG || def->val == NULL) { + value.type = JSON_BOOL; + value.u.boolean = def->op; + sudo_json_add_value_as_object(jsonc, def->var, &value); + } else if ((type & T_MASK) == T_LIST) { + print_defaults_list_json(jsonc, def); + } else { + value.type = JSON_STRING; + value.u.string = def->val; + sudo_json_add_value_as_object(jsonc, def->var, &value); + } + } + sudo_json_close_array(jsonc); + } + +#ifdef HAVE_SELINUX + /* Print SELinux role/type */ + if (cs->role != NULL && cs->type != NULL) { + sudo_json_open_array(jsonc, "SELinux_Spec"); + value.type = JSON_STRING; + value.u.string = cs->role; + sudo_json_add_value(jsonc, "role", &value); + value.u.string = cs->type; + sudo_json_add_value(jsonc, "type", &value); + sudo_json_close_array(jsonc); + } +#endif /* HAVE_SELINUX */ + +#ifdef HAVE_PRIV_SET + /* Print Solaris privs/limitprivs */ + if (cs->privs != NULL || cs->limitprivs != NULL) { + sudo_json_open_array(jsonc, "Solaris_Priv_Spec"); + value.type = JSON_STRING; + if (cs->privs != NULL) { + value.u.string = cs->privs; + sudo_json_add_value(jsonc, "privs", &value); + } + if (cs->limitprivs != NULL) { + value.u.string = cs->limitprivs; + sudo_json_add_value(jsonc, "limitprivs", &value); + } + sudo_json_close_array(jsonc); + } +#endif /* HAVE_PRIV_SET */ + + /* + * Merge adjacent commands with matching tags, runas, SELinux + * role/type and Solaris priv settings. + */ + sudo_json_open_array(jsonc, "Commands"); + for (;;) { + print_member_json(jsonc, parse_tree, cs->cmnd, TYPE_COMMAND, + expand_aliases); + /* Does the next entry differ only in the command itself? */ + if (!cmndspec_continues(cs, next)) + break; + cs = next; + next = TAILQ_NEXT(cs, entries); + } + sudo_json_close_array(jsonc); + + /* Close Cmnd_Spec object. */ + sudo_json_close_object(jsonc); + + *nextp = next; + + debug_return; +} + +/* + * Print a User_Spec in JSON format at the correct indent level. + */ +static void +print_userspec_json(struct json_container *jsonc, + struct sudoers_parse_tree *parse_tree, struct userspec *us, + bool expand_aliases) +{ + struct privilege *priv; + struct member *m; + struct cmndspec *cs, *next; + debug_decl(print_userspec_json, SUDOERS_DEBUG_UTIL); + + /* + * Each userspec struct may contain multiple privileges for + * a user. We export each privilege as a separate User_Spec + * object for simplicity's sake. + */ + TAILQ_FOREACH(priv, &us->privileges, entries) { + /* Open User_Spec object. */ + sudo_json_open_object(jsonc, NULL); + + /* Print users list. */ + sudo_json_open_array(jsonc, "User_List"); + TAILQ_FOREACH(m, &us->users, entries) { + print_member_json(jsonc, parse_tree, m, TYPE_USERNAME, + expand_aliases); + } + sudo_json_close_array(jsonc); + + /* Print hosts list. */ + sudo_json_open_array(jsonc, "Host_List"); + TAILQ_FOREACH(m, &priv->hostlist, entries) { + print_member_json(jsonc, parse_tree, m, TYPE_HOSTNAME, + expand_aliases); + } + sudo_json_close_array(jsonc); + + /* Print commands. */ + sudo_json_open_array(jsonc, "Cmnd_Specs"); + TAILQ_FOREACH_SAFE(cs, &priv->cmndlist, entries, next) { + print_cmndspec_json(jsonc, parse_tree, cs, &next, &priv->defaults, + expand_aliases); + } + sudo_json_close_array(jsonc); + + /* Close User_Spec object. */ + sudo_json_close_object(jsonc); + } + + debug_return; +} + +static void +print_userspecs_json(struct json_container *jsonc, + struct sudoers_parse_tree *parse_tree, bool expand_aliases) +{ + struct userspec *us; + debug_decl(print_userspecs_json, SUDOERS_DEBUG_UTIL); + + if (TAILQ_EMPTY(&parse_tree->userspecs)) + debug_return; + + sudo_json_open_array(jsonc, "User_Specs"); + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + print_userspec_json(jsonc, parse_tree, us, expand_aliases); + } + sudo_json_close_array(jsonc); + + debug_return; +} + +/* + * Export the parsed sudoers file in JSON format. + */ +bool +convert_sudoers_json(struct sudoers_parse_tree *parse_tree, + const char *output_file, struct cvtsudoers_config *conf) +{ + struct json_container jsonc; + bool ret = true; + FILE *output_fp = stdout; + debug_decl(convert_sudoers_json, SUDOERS_DEBUG_UTIL); + + if (strcmp(output_file, "-") != 0) { + if ((output_fp = fopen(output_file, "w")) == NULL) + sudo_fatal(U_("unable to open %s"), output_file); + } + + /* 4 space indent, non-compact, exit on memory allocation failure. */ + sudo_json_init(&jsonc, 4, false, true); + + /* Dump Defaults in JSON format. */ + if (!ISSET(conf->suppress, SUPPRESS_DEFAULTS)) { + print_defaults_json(&jsonc, parse_tree, conf->expand_aliases); + } + + /* Dump Aliases in JSON format. */ + if (!conf->expand_aliases && !ISSET(conf->suppress, SUPPRESS_ALIASES)) { + print_aliases_json(&jsonc, parse_tree); + } + + /* Dump User_Specs in JSON format. */ + if (!ISSET(conf->suppress, SUPPRESS_PRIVS)) { + print_userspecs_json(&jsonc, parse_tree, conf->expand_aliases); + } + + /* Write JSON output. */ + if (sudo_json_get_len(&jsonc) != 0) { + putc('{', output_fp); + fputs(sudo_json_get_buf(&jsonc), output_fp); + fputs("\n}\n", output_fp); + (void)fflush(output_fp); + if (ferror(output_fp)) + ret = false; + } + sudo_json_free(&jsonc); + if (output_fp != stdout) + fclose(output_fp); + + debug_return_bool(ret); +} diff --git a/plugins/sudoers/cvtsudoers_ldif.c b/plugins/sudoers/cvtsudoers_ldif.c new file mode 100644 index 0000000..0dd8409 --- /dev/null +++ b/plugins/sudoers/cvtsudoers_ldif.c @@ -0,0 +1,712 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudoers.h" +#include "sudo_ldap.h" +#include "redblack.h" +#include "cvtsudoers.h" +#include "sudo_lbuf.h" +#include + +struct seen_user { + const char *name; + unsigned long count; +}; + +static struct rbtree *seen_users; + +static int +seen_user_compare(const void *aa, const void *bb) +{ + const struct seen_user *a = aa; + const struct seen_user *b = bb; + + return strcasecmp(a->name, b->name); +} + +static void +seen_user_free(void *v) +{ + struct seen_user *su = v; + + free((void *)su->name); + free(su); +} + +static bool +safe_string(const char *str) +{ + unsigned int ch = *str++; + debug_decl(safe_string, SUDOERS_DEBUG_UTIL); + + /* Initial char must be <= 127 and not LF, CR, SPACE, ':', '<' */ + switch (ch) { + case '\0': + debug_return_bool(true); + case '\n': + case '\r': + case ' ': + case ':': + case '<': + debug_return_bool(false); + default: + if (ch > 127) + debug_return_bool(false); + } + + /* Any value <= 127 decimal except NUL, LF, and CR is safe */ + while ((ch = *str++) != '\0') { + if (ch > 127 || ch == '\n' || ch == '\r') + debug_return_bool(false); + } + + debug_return_bool(true); +} + +static bool +print_attribute_ldif(FILE *fp, const char *name, const char *value) +{ + const unsigned char *uvalue = (unsigned char *)value; + char *encoded = NULL; + size_t esize; + debug_decl(print_attribute_ldif, SUDOERS_DEBUG_UTIL); + + if (!safe_string(value)) { + const size_t vlen = strlen(value); + esize = ((vlen + 2) / 3 * 4) + 1; + if ((encoded = malloc(esize)) == NULL) + debug_return_bool(false); + if (base64_encode(uvalue, vlen, encoded, esize) == (size_t)-1) { + free(encoded); + debug_return_bool(false); + } + fprintf(fp, "%s:: %s\n", name, encoded); + free(encoded); + } else if (*value != '\0') { + fprintf(fp, "%s: %s\n", name, value); + } else { + fprintf(fp, "%s:\n", name); + } + + debug_return_bool(true); +} + +/* + * Print sudoOptions from a defaults_list. + */ +static bool +print_options_ldif(FILE *fp, struct defaults_list *options) +{ + struct defaults *opt; + char *attr_val; + int len; + debug_decl(print_options_ldif, SUDOERS_DEBUG_UTIL); + + TAILQ_FOREACH(opt, options, entries) { + if (opt->type != DEFAULTS) + continue; /* don't support bound defaults */ + + if (opt->val != NULL) { + /* There is no need to double quote values here. */ + len = asprintf(&attr_val, "%s%s%s", opt->var, + opt->op == '+' ? "+=" : opt->op == '-' ? "-=" : "=", opt->val); + } else { + /* Boolean flag. */ + len = asprintf(&attr_val, "%s%s", + opt->op == false ? "!" : "", opt->var); + } + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + + debug_return_bool(!ferror(fp)); +} + +/* + * Print global Defaults in a single sudoRole object. + */ +static bool +print_global_defaults_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, + const char *base) +{ + unsigned int count = 0; + struct sudo_lbuf lbuf; + struct defaults *opt; + char *dn; + debug_decl(print_global_defaults_ldif, SUDOERS_DEBUG_UTIL); + + sudo_lbuf_init(&lbuf, NULL, 0, NULL, 80); + + TAILQ_FOREACH(opt, &parse_tree->defaults, entries) { + /* Skip bound Defaults (unsupported). */ + if (opt->type == DEFAULTS) { + count++; + } else { + lbuf.len = 0; + sudo_lbuf_append(&lbuf, "# "); + sudoers_format_default_line(&lbuf, parse_tree, opt, false, true); + fprintf(fp, "# Unable to translate %s:%d:%d:\n%s\n", + opt->file, opt->line, opt->column, lbuf.buf); + } + } + sudo_lbuf_destroy(&lbuf); + + if (count == 0) + debug_return_bool(true); + + if (asprintf(&dn, "cn=defaults,%s", base) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "dn", dn); + free(dn); + print_attribute_ldif(fp, "objectClass", "top"); + print_attribute_ldif(fp, "objectClass", "sudoRole"); + print_attribute_ldif(fp, "cn", "defaults"); + print_attribute_ldif(fp, "description", "Default sudoOption's go here"); + + print_options_ldif(fp, &parse_tree->defaults); + putc('\n', fp); + + debug_return_bool(!ferror(fp)); +} + +/* + * Format a sudo_command as a string. + * Returns the formatted, dynamically allocated string or dies on error. + */ +static char * +format_cmnd(struct sudo_command *c, bool negated) +{ + struct command_digest *digest; + char *buf, *cp, *cmnd; + size_t bufsiz; + int len; + debug_decl(format_cmnd, SUDOERS_DEBUG_UTIL); + + cmnd = c->cmnd ? c->cmnd : "ALL"; + bufsiz = negated + strlen(cmnd) + 1; + if (c->args != NULL) + bufsiz += 1 + strlen(c->args); + TAILQ_FOREACH(digest, &c->digests, entries) { + bufsiz += strlen(digest_type_to_name(digest->digest_type)) + 1 + + strlen(digest->digest_str) + 1; + if (TAILQ_NEXT(digest, entries) != NULL) + bufsiz += 2; + } + + if ((buf = malloc(bufsiz)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + + cp = buf; + TAILQ_FOREACH(digest, &c->digests, entries) { + len = snprintf(cp, bufsiz - (cp - buf), "%s:%s%s ", + digest_type_to_name(digest->digest_type), digest->digest_str, + TAILQ_NEXT(digest, entries) ? "," : ""); + if (len < 0 || len >= (int)bufsiz - (cp - buf)) + sudo_fatalx(U_("internal error, %s overflow"), __func__); + cp += len; + } + + len = snprintf(cp, bufsiz - (cp - buf), "%s%s%s%s", negated ? "!" : "", + cmnd, c->args ? " " : "", c->args ? c->args : ""); + if (len < 0 || len >= (int)bufsiz - (cp - buf)) + sudo_fatalx(U_("internal error, %s overflow"), __func__); + + debug_return_str(buf); +} + +/* + * Print struct member in LDIF format as the specified attribute. + * See print_member_int() in parse.c. + */ +static void +print_member_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, char *name, + int type, bool negated, int alias_type, const char *attr_name) +{ + struct alias *a; + struct member *m; + char *attr_val; + int len; + debug_decl(print_member_ldif, SUDOERS_DEBUG_UTIL); + + switch (type) { + case MYSELF: + /* Only valid for sudoRunasUser */ + print_attribute_ldif(fp, attr_name, ""); + break; + case ALL: + if (name == NULL) { + print_attribute_ldif(fp, attr_name, negated ? "!ALL" : "ALL"); + break; + } + FALLTHROUGH; + case COMMAND: + attr_val = format_cmnd((struct sudo_command *)name, negated); + print_attribute_ldif(fp, attr_name, attr_val); + free(attr_val); + break; + case ALIAS: + if ((a = alias_get(parse_tree, name, alias_type)) != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, + negated ? !m->negated : m->negated, alias_type, attr_name); + } + alias_put(a); + break; + } + FALLTHROUGH; + default: + len = asprintf(&attr_val, "%s%s", negated ? "!" : "", name); + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, attr_name, attr_val); + free(attr_val); + break; + } + + debug_return; +} + +/* + * Print a Cmnd_Spec in LDIF format. + * A pointer to the next Cmnd_Spec is passed in to make it possible to + * merge adjacent entries that are identical in all but the command. + */ +static void +print_cmndspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct cmndspec *cs, struct cmndspec **nextp, struct defaults_list *options) +{ + struct cmndspec *next = *nextp; + struct member *m; + struct tm *tp; + char *attr_val; + bool last_one; + char timebuf[sizeof("20120727121554Z")]; + debug_decl(print_cmndspec_ldif, SUDOERS_DEBUG_UTIL); + + /* Print runasuserlist as sudoRunAsUser attributes */ + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, m->negated, + RUNASALIAS, "sudoRunAsUser"); + } + } + + /* Print runasgrouplist as sudoRunAsGroup attributes */ + if (cs->runasgrouplist != NULL) { + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, m->negated, + RUNASALIAS, "sudoRunAsGroup"); + } + } + + /* Print sudoNotBefore and sudoNotAfter attributes */ + if (cs->notbefore != UNSPEC) { + if ((tp = gmtime(&cs->notbefore)) == NULL) { + sudo_warn("%s", U_("unable to get GMT time")); + } else { + if (strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", tp) == 0) { + sudo_warnx("%s", U_("unable to format timestamp")); + } else { + print_attribute_ldif(fp, "sudoNotBefore", timebuf); + } + } + } + if (cs->notafter != UNSPEC) { + if ((tp = gmtime(&cs->notafter)) == NULL) { + sudo_warn("%s", U_("unable to get GMT time")); + } else { + if (strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", tp) == 0) { + sudo_warnx("%s", U_("unable to format timestamp")); + } else { + print_attribute_ldif(fp, "sudoNotAfter", timebuf); + } + } + } + + /* Print timeout as a sudoOption. */ + if (cs->timeout > 0) { + if (asprintf(&attr_val, "command_timeout=%d", cs->timeout) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + + /* Print tags as sudoOption attributes */ + if (TAGS_SET(cs->tags)) { + struct cmndtag tag = cs->tags; + + if (tag.nopasswd != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.nopasswd ? "!authenticate" : "authenticate"); + } + if (tag.noexec != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.noexec ? "noexec" : "!noexec"); + } + if (tag.send_mail != UNSPEC) { + if (tag.send_mail) { + print_attribute_ldif(fp, "sudoOption", "mail_all_cmnds"); + } else { + print_attribute_ldif(fp, "sudoOption", "!mail_all_cmnds"); + print_attribute_ldif(fp, "sudoOption", "!mail_always"); + print_attribute_ldif(fp, "sudoOption", "!mail_no_perms"); + } + } + if (tag.setenv != UNSPEC && tag.setenv != IMPLIED) { + print_attribute_ldif(fp, "sudoOption", + tag.setenv ? "setenv" : "!setenv"); + } + if (tag.follow != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.follow ? "sudoedit_follow" : "!sudoedit_follow"); + } + if (tag.log_input != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.log_input ? "log_input" : "!log_input"); + } + if (tag.log_output != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.log_output ? "log_output" : "!log_output"); + } + } + print_options_ldif(fp, options); + + /* Print runchroot and runcwd. */ + if (cs->runchroot != NULL) { + if (asprintf(&attr_val, "runchroot=%s", cs->runchroot) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + if (cs->runcwd != NULL) { + if (asprintf(&attr_val, "runcwd=%s", cs->runcwd) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + +#ifdef HAVE_SELINUX + /* Print SELinux role/type */ + if (cs->role != NULL && cs->type != NULL) { + if (asprintf(&attr_val, "role=%s", cs->role) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + + if (asprintf(&attr_val, "type=%s", cs->type) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } +#endif /* HAVE_SELINUX */ + +#ifdef HAVE_PRIV_SET + /* Print Solaris privs/limitprivs */ + if (cs->privs != NULL || cs->limitprivs != NULL) { + if (cs->privs != NULL) { + if (asprintf(&attr_val, "privs=%s", cs->privs) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + if (cs->limitprivs != NULL) { + if (asprintf(&attr_val, "limitprivs=%s", cs->limitprivs) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + } +#endif /* HAVE_PRIV_SET */ + + /* + * Merge adjacent commands with matching tags, runas, SELinux + * role/type and Solaris priv settings. + */ + for (;;) { + /* Does the next entry differ only in the command itself? */ + /* XXX - move into a function that returns bool */ + /* XXX - TAG_SET does not account for implied SETENV */ + last_one = next == NULL || + RUNAS_CHANGED(cs, next) || TAGS_CHANGED(cs->tags, next->tags) +#ifdef HAVE_PRIV_SET + || cs->privs != next->privs || cs->limitprivs != next->limitprivs +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + || cs->role != next->role || cs->type != next->type +#endif /* HAVE_SELINUX */ + || cs->runchroot != next->runchroot || cs->runcwd != next->runcwd; + + print_member_ldif(fp, parse_tree, cs->cmnd->name, cs->cmnd->type, + cs->cmnd->negated, CMNDALIAS, "sudoCommand"); + if (last_one) + break; + cs = next; + next = TAILQ_NEXT(cs, entries); + } + + *nextp = next; + + debug_return; +} + +/* + * Convert user name to cn, avoiding duplicates and quoting as needed. + * See http://www.faqs.org/rfcs/rfc2253.html + */ +static char * +user_to_cn(const char *user) +{ + struct seen_user key, *su = NULL; + struct rbnode *node; + const char *src; + char *cn, *dst; + size_t size; + debug_decl(user_to_cn, SUDOERS_DEBUG_UTIL); + + /* Allocate as much as we could possibly need. */ + size = (2 * strlen(user)) + 64 + 1; + if ((cn = malloc(size)) == NULL) + goto bad; + + /* + * Increment the number of times we have seen this user. + */ + key.name = user; + node = rbfind(seen_users, &key); + if (node != NULL) { + su = node->data; + } else { + if ((su = malloc(sizeof(*su))) == NULL) + goto bad; + su->count = 0; + if ((su->name = strdup(user)) == NULL) + goto bad; + if (rbinsert(seen_users, su, NULL) != 0) + goto bad; + } + + /* Build cn, quoting special chars as needed (we allocated 2 x len). */ + for (src = user, dst = cn; *src != '\0'; src++) { + switch (*src) { + case ',': + case '+': + case '"': + case '\\': + case '<': + case '>': + case '#': + case ';': + *dst++ = '\\'; /* always escape */ + break; + case ' ': + if (src == user || src[1] == '\0') + *dst++ = '\\'; /* only escape at beginning or end of string */ + break; + default: + break; + } + *dst++ = *src; + } + *dst = '\0'; + + /* Append count if there are duplicate users (cn must be unique). */ + if (su->count != 0) { + size -= (size_t)(dst - cn); + if ((size_t)snprintf(dst, size, "_%lu", su->count) >= size) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto bad; + } + } + su->count++; + + debug_return_str(cn); +bad: + if (su != NULL && su->count == 0) + seen_user_free(su); + free(cn); + debug_return_str(NULL); +} + +/* + * Print a single User_Spec. + */ +static bool +print_userspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct userspec *us, struct cvtsudoers_config *conf) +{ + struct privilege *priv; + struct member *m; + struct cmndspec *cs, *next; + debug_decl(print_userspec_ldif, SUDOERS_DEBUG_UTIL); + + /* + * Each userspec struct may contain multiple privileges for + * the user. We export each privilege as a separate sudoRole + * object for simplicity's sake. + */ + TAILQ_FOREACH(priv, &us->privileges, entries) { + TAILQ_FOREACH_SAFE(cs, &priv->cmndlist, entries, next) { + const char *base = conf->sudoers_base; + char *cn, *dn; + + /* + * Increment the number of times we have seen this user. + * If more than one user is listed, just use the first one. + */ + m = TAILQ_FIRST(&us->users); + cn = user_to_cn(m->type == ALL ? "ALL" : m->name); + if (cn == NULL || asprintf(&dn, "cn=%s,%s", cn, base) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + + print_attribute_ldif(fp, "dn", dn); + print_attribute_ldif(fp, "objectClass", "top"); + print_attribute_ldif(fp, "objectClass", "sudoRole"); + print_attribute_ldif(fp, "cn", cn); + free(cn); + free(dn); + + TAILQ_FOREACH(m, &us->users, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, m->negated, + USERALIAS, "sudoUser"); + } + + TAILQ_FOREACH(m, &priv->hostlist, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, m->negated, + HOSTALIAS, "sudoHost"); + } + + print_cmndspec_ldif(fp, parse_tree, cs, &next, &priv->defaults); + + if (conf->sudo_order != 0) { + char numbuf[(((sizeof(conf->sudo_order) * 8) + 2) / 3) + 2]; + if (conf->order_max != 0 && conf->sudo_order > conf->order_max) { + sudo_fatalx(U_("too many sudoers entries, maximum %u"), + conf->order_padding); + } + (void)snprintf(numbuf, sizeof(numbuf), "%u", conf->sudo_order); + print_attribute_ldif(fp, "sudoOrder", numbuf); + putc('\n', fp); + conf->sudo_order += conf->order_increment; + } + } + } + + debug_return_bool(!ferror(fp)); +} + +/* + * Print User_Specs. + */ +static bool +print_userspecs_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct cvtsudoers_config *conf) +{ + struct userspec *us; + debug_decl(print_userspecs_ldif, SUDOERS_DEBUG_UTIL); + + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + if (!print_userspec_ldif(fp, parse_tree, us, conf)) + debug_return_bool(false); + } + debug_return_bool(true); +} + +/* + * Export the parsed sudoers file in LDIF format. + */ +bool +convert_sudoers_ldif(struct sudoers_parse_tree *parse_tree, + const char *output_file, struct cvtsudoers_config *conf) +{ + bool ret = true; + FILE *output_fp = stdout; + debug_decl(convert_sudoers_ldif, SUDOERS_DEBUG_UTIL); + + if (conf->sudoers_base == NULL) { + sudo_fatalx("%s", U_("the SUDOERS_BASE environment variable is not set and the -b option was not specified.")); + } + + if (output_file != NULL && strcmp(output_file, "-") != 0) { + if ((output_fp = fopen(output_file, "w")) == NULL) + sudo_fatal(U_("unable to open %s"), output_file); + } + + /* Create a dictionary of already-seen users. */ + seen_users = rbcreate(seen_user_compare); + + /* Dump global Defaults in LDIF format. */ + if (!ISSET(conf->suppress, SUPPRESS_DEFAULTS)) + print_global_defaults_ldif(output_fp, parse_tree, conf->sudoers_base); + + /* Dump User_Specs in LDIF format, expanding Aliases. */ + if (!ISSET(conf->suppress, SUPPRESS_PRIVS)) + print_userspecs_ldif(output_fp, parse_tree, conf); + + /* Clean up. */ + rbdestroy(seen_users, seen_user_free); + + (void)fflush(output_fp); + if (ferror(output_fp)) + ret = false; + if (output_fp != stdout) + fclose(output_fp); + + debug_return_bool(ret); +} diff --git a/plugins/sudoers/cvtsudoers_pwutil.c b/plugins/sudoers/cvtsudoers_pwutil.c new file mode 100644 index 0000000..a7b163e --- /dev/null +++ b/plugins/sudoers/cvtsudoers_pwutil.c @@ -0,0 +1,484 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "cvtsudoers.h" +#include "pwutil.h" + +#ifndef LOGIN_NAME_MAX +# ifdef _POSIX_LOGIN_NAME_MAX +# define LOGIN_NAME_MAX _POSIX_LOGIN_NAME_MAX +# else +# define LOGIN_NAME_MAX 9 +# endif +#endif /* LOGIN_NAME_MAX */ + +#define FIELD_SIZE(src, name, size) \ +do { \ + if ((src)->name) { \ + size = strlen((src)->name) + 1; \ + total += size; \ + } else { \ + size = 0; \ + } \ +} while (0) + +#define FIELD_COPY(src, dst, name, size) \ +do { \ + if ((src)->name) { \ + memcpy(cp, (src)->name, size); \ + (dst)->name = cp; \ + cp += size; \ + } \ +} while (0) + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. If name is non-NULL it is used as the key, else the + * uid is the key. Fills in datum from the users filter. + * Returns NULL on calloc error or unknown name/id, setting errno + * to ENOMEM or ENOENT respectively. + */ +struct cache_item * +cvtsudoers_make_pwitem(uid_t uid, const char *name) +{ + char *cp, uidstr[MAX_UID_T_LEN + 2]; + size_t nsize, psize, gsize, dsize, ssize, total; +#ifdef HAVE_LOGIN_CAP_H + size_t csize; +#endif + struct cache_item_pw *pwitem; + struct passwd pw, *newpw; + struct sudoers_string *s = NULL; + debug_decl(cvtsudoers_make_pwitem, SUDOERS_DEBUG_NSS); + + /* Look up name or uid in filter list. */ + if (name != NULL) { + STAILQ_FOREACH(s, &filters->users, entries) { + if (strcasecmp(name, s->str) == 0) { + uid = (uid_t)-1; + break; + } + } + } else { + STAILQ_FOREACH(s, &filters->users, entries) { + const char *errstr; + uid_t filter_uid; + + if (s->str[0] != '#') + continue; + + filter_uid = sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) { + if (uid != filter_uid) + continue; + (void)snprintf(uidstr, sizeof(uidstr), "#%u", + (unsigned int)uid); + break; + } + } + } + if (s == NULL) { + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Fake up a passwd struct. */ + memset(&pw, 0, sizeof(pw)); + pw.pw_name = name ? s->str : uidstr; + pw.pw_passwd = "*"; + pw.pw_uid = uid; + pw.pw_gid = (gid_t)-1; + pw.pw_shell = _PATH_BSHELL; + pw.pw_dir = "/"; + + /* Allocate in one big chunk for easy freeing. */ + total = sizeof(*pwitem); + FIELD_SIZE(&pw, pw_name, nsize); + FIELD_SIZE(&pw, pw_passwd, psize); +#ifdef HAVE_LOGIN_CAP_H + FIELD_SIZE(&pw, pw_class, csize); +#endif + FIELD_SIZE(&pw, pw_gecos, gsize); + FIELD_SIZE(&pw, pw_dir, dsize); + FIELD_SIZE(&pw, pw_shell, ssize); + if (name != NULL) + total += strlen(name) + 1; + + /* Allocate space for struct item, struct passwd and the strings. */ + if ((pwitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + newpw = &pwitem->pw; + + /* + * Copy in passwd contents and make strings relative to space + * at the end of the struct. + */ + memcpy(newpw, &pw, sizeof(pw)); + cp = (char *)(pwitem + 1); + FIELD_COPY(&pw, newpw, pw_name, nsize); + FIELD_COPY(&pw, newpw, pw_passwd, psize); +#ifdef HAVE_LOGIN_CAP_H + FIELD_COPY(&pw, newpw, pw_class, csize); +#endif + FIELD_COPY(&pw, newpw, pw_gecos, gsize); + FIELD_COPY(&pw, newpw, pw_dir, dsize); + FIELD_COPY(&pw, newpw, pw_shell, ssize); + + /* Set key and datum. */ + if (name != NULL) { + memcpy(cp, name, strlen(name) + 1); + pwitem->cache.k.name = cp; + } else { + pwitem->cache.k.uid = pw.pw_uid; + } + pwitem->cache.d.pw = newpw; + pwitem->cache.refcnt = 1; + + debug_return_ptr(&pwitem->cache); +} + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. If name is non-NULL it is used as the key, else the + * gid is the key. Fills in datum from the groups filter. + * Returns NULL on calloc error or unknown name/id, setting errno + * to ENOMEM or ENOENT respectively. + */ +struct cache_item * +cvtsudoers_make_gritem(gid_t gid, const char *name) +{ + char *cp, gidstr[MAX_UID_T_LEN + 2]; + size_t nsize, psize, total, len, nmem = 0; + struct cache_item_gr *gritem; + struct group gr, *newgr; + struct sudoers_string *s = NULL; + debug_decl(cvtsudoers_make_gritem, SUDOERS_DEBUG_NSS); + + /* Look up name or gid in filter list. */ + if (name != NULL) { + STAILQ_FOREACH(s, &filters->groups, entries) { + if (strcasecmp(name, s->str) == 0) { + gid = (gid_t)-1; + break; + } + } + } else { + STAILQ_FOREACH(s, &filters->groups, entries) { + const char *errstr; + gid_t filter_gid; + + if (s->str[0] != '#') + continue; + + filter_gid = sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) { + if (gid != filter_gid) + continue; + (void)snprintf(gidstr, sizeof(gidstr), "#%u", + (unsigned int)gid); + break; + } + } + } + if (s == NULL) { + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Fake up a group struct with all filter users as members. */ + memset(&gr, 0, sizeof(gr)); + gr.gr_name = name ? s->str : gidstr; + gr.gr_gid = gid; + + /* Allocate in one big chunk for easy freeing. */ + total = sizeof(*gritem); + FIELD_SIZE(&gr, gr_name, nsize); + FIELD_SIZE(&gr, gr_passwd, psize); + if (!STAILQ_EMPTY(&filters->users)) { + STAILQ_FOREACH(s, &filters->users, entries) { + total += strlen(s->str) + 1; + nmem++; + } + total += sizeof(char *) * nmem; + } + if (name != NULL) + total += strlen(name) + 1; + + if ((gritem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + /* + * Copy in group contents and make strings relative to space + * at the end of the buffer. Note that gr_mem must come + * immediately after struct group to guarantee proper alignment. + */ + newgr = &gritem->gr; + memcpy(newgr, &gr, sizeof(gr)); + cp = (char *)(gritem + 1); + if (nmem != 0) { + newgr->gr_mem = (char **)cp; + cp += sizeof(char *) * nmem; + nmem = 0; + STAILQ_FOREACH(s, &filters->users, entries) { + len = strlen(s->str) + 1; + memcpy(cp, s->str, len); + newgr->gr_mem[nmem++] = cp; + cp += len; + } + newgr->gr_mem[nmem] = NULL; + } + FIELD_COPY(&gr, newgr, gr_passwd, psize); + FIELD_COPY(&gr, newgr, gr_name, nsize); + + /* Set key and datum. */ + if (name != NULL) { + memcpy(cp, name, strlen(name) + 1); + gritem->cache.k.name = cp; + } else { + gritem->cache.k.gid = gr.gr_gid; + } + gritem->cache.d.gr = newgr; + gritem->cache.refcnt = 1; + + debug_return_ptr(&gritem->cache); +} + +static struct cache_item_gidlist *gidlist_item; + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. Fills in datum from the groups filter. + */ +struct cache_item * +cvtsudoers_make_gidlist_item(const struct passwd *pw, char * const *unused1, + unsigned int type) +{ + char *cp; + size_t nsize, total; + struct cache_item_gidlist *glitem; + struct sudoers_string *s; + struct gid_list *gidlist; + GETGROUPS_T *gids = NULL; + int i, ngids = 0; + debug_decl(cvtsudoers_make_gidlist_item, SUDOERS_DEBUG_NSS); + + /* + * There's only a single gid list. + */ + if (gidlist_item != NULL) { + gidlist_item->cache.refcnt++; + debug_return_ptr(&gidlist_item->cache); + } + + /* Count number of possible gids in the filter. */ + STAILQ_FOREACH(s, &filters->groups, entries) { + if (s->str[0] == '#') + ngids++; + } + + /* Allocate gids[] array and fill it with parsed gids. */ + if (ngids != 0) { + gids = reallocarray(NULL, ngids, sizeof(GETGROUPS_T)); + if (gids == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + ngids = 0; + STAILQ_FOREACH(s, &filters->groups, entries) { + if (s->str[0] == '#') { + const char *errstr; + gid_t gid = sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) { + /* Valid gid. */ + gids[ngids++] = gid; + } + } + } + } + if (ngids == 0) { + free(gids); + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Allocate in one big chunk for easy freeing. */ + nsize = strlen(pw->pw_name) + 1; + total = sizeof(*glitem) + nsize; + total += sizeof(gid_t *) * ngids; + + if ((glitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(gids); + debug_return_ptr(NULL); + } + + /* + * Copy in group list and make pointers relative to space + * at the end of the buffer. Note that the groups array must come + * immediately after struct group to guarantee proper alignment. + */ + gidlist = &glitem->gidlist; + cp = (char *)(glitem + 1); + gidlist->gids = (gid_t *)cp; + cp += sizeof(gid_t) * ngids; + + /* Set key and datum. */ + memcpy(cp, pw->pw_name, nsize); + glitem->cache.k.name = cp; + glitem->cache.d.gidlist = gidlist; + glitem->cache.refcnt = 1; + glitem->cache.type = type; + + /* + * Store group IDs. + */ + for (i = 0; i < ngids; i++) + gidlist->gids[i] = gids[i]; + gidlist->ngids = ngids; + free(gids); + + debug_return_ptr(&glitem->cache); +} + +static struct cache_item_gidlist *grlist_item; + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. Fills in group names from the groups filter. + */ +struct cache_item * +cvtsudoers_make_grlist_item(const struct passwd *pw, char * const *unused1) +{ + char *cp; + size_t nsize, ngroups, total, len; + struct cache_item_grlist *grlitem; + struct sudoers_string *s; + struct group_list *grlist; + int groupname_len; + debug_decl(cvtsudoers_make_grlist_item, SUDOERS_DEBUG_NSS); + + /* + * There's only a single group list. + */ + if (grlist_item != NULL) { + grlist_item->cache.refcnt++; + debug_return_ptr(&grlist_item->cache); + } + + /* Count number of groups in the filter. */ + ngroups = 0; + STAILQ_FOREACH(s, &filters->groups, entries) { + ngroups++; + } + +#ifdef _SC_LOGIN_NAME_MAX + groupname_len = MAX((int)sysconf(_SC_LOGIN_NAME_MAX), 32); +#else + groupname_len = MAX(LOGIN_NAME_MAX, 32); +#endif + + /* Allocate in one big chunk for easy freeing. */ + nsize = strlen(pw->pw_name) + 1; + total = sizeof(*grlitem) + nsize; + total += groupname_len * ngroups; + +again: + if ((grlitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + /* + * Copy in group list and make pointers relative to space + * at the end of the buffer. Note that the groups array must come + * immediately after struct group to guarantee proper alignment. + */ + grlist = &grlitem->grlist; + cp = (char *)(grlitem + 1); + grlist->groups = (char **)cp; + cp += sizeof(char *) * ngroups; + + /* Set key and datum. */ + memcpy(cp, pw->pw_name, nsize); + grlitem->cache.k.name = cp; + grlitem->cache.d.grlist = grlist; + grlitem->cache.refcnt = 1; + cp += nsize; + + /* + * Copy groups from filter. + */ + ngroups = 0; + STAILQ_FOREACH(s, &filters->groups, entries) { + if (s->str[0] == '#') { + const char *errstr; + sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) { + /* Group ID not name, ignore it. */ + continue; + } + } + len = strlen(s->str) + 1; + if (cp - (char *)grlitem + len > total) { + total += len + groupname_len; + free(grlitem); + goto again; + } + memcpy(cp, s->str, len); + grlist->groups[ngroups++] = cp; + cp += len; + } + grlist->ngroups = ngroups; + + debug_return_ptr(&grlitem->cache); +} diff --git a/plugins/sudoers/def_data.c b/plugins/sudoers/def_data.c new file mode 100644 index 0000000..56cd224 --- /dev/null +++ b/plugins/sudoers/def_data.c @@ -0,0 +1,579 @@ +/* generated file, do not edit */ + +static struct def_values def_data_lecture[] = { + { "never", never }, + { "once", once }, + { "always", always }, + { NULL, 0 }, +}; + +static struct def_values def_data_listpw[] = { + { "never", never }, + { "any", any }, + { "all", all }, + { "always", always }, + { NULL, 0 }, +}; + +static struct def_values def_data_verifypw[] = { + { "never", never }, + { "all", all }, + { "any", any }, + { "always", always }, + { NULL, 0 }, +}; + +static struct def_values def_data_fdexec[] = { + { "never", never }, + { "digest_only", digest_only }, + { "always", always }, + { NULL, 0 }, +}; + +static struct def_values def_data_timestamp_type[] = { + { "global", global }, + { "ppid", ppid }, + { "tty", tty }, + { "kernel", kernel }, + { NULL, 0 }, +}; + +static struct def_values def_data_log_format[] = { + { "sudo", sudo }, + { "json", json }, + { NULL, 0 }, +}; + +struct sudo_defs_types sudo_defs_table[] = { + { + "syslog", T_LOGFAC|T_BOOL, + N_("Syslog facility if syslog is being used for logging: %s"), + NULL, + }, { + "syslog_goodpri", T_LOGPRI|T_BOOL, + N_("Syslog priority to use when user authenticates successfully: %s"), + NULL, + }, { + "syslog_badpri", T_LOGPRI|T_BOOL, + N_("Syslog priority to use when user authenticates unsuccessfully: %s"), + NULL, + }, { + "long_otp_prompt", T_FLAG, + N_("Put OTP prompt on its own line"), + NULL, + }, { + "ignore_dot", T_FLAG, + N_("Ignore '.' in $PATH"), + NULL, + }, { + "mail_always", T_FLAG, + N_("Always send mail when sudo is run"), + NULL, + }, { + "mail_badpass", T_FLAG, + N_("Send mail if user authentication fails"), + NULL, + }, { + "mail_no_user", T_FLAG, + N_("Send mail if the user is not in sudoers"), + NULL, + }, { + "mail_no_host", T_FLAG, + N_("Send mail if the user is not in sudoers for this host"), + NULL, + }, { + "mail_no_perms", T_FLAG, + N_("Send mail if the user is not allowed to run a command"), + NULL, + }, { + "mail_all_cmnds", T_FLAG, + N_("Send mail if the user tries to run a command"), + NULL, + }, { + "tty_tickets", T_FLAG, + N_("Use a separate timestamp for each user/tty combo"), + NULL, + }, { + "lecture", T_TUPLE|T_BOOL, + N_("Lecture user the first time they run sudo"), + def_data_lecture, + }, { + "lecture_file", T_STR|T_PATH|T_BOOL, + N_("File containing the sudo lecture: %s"), + NULL, + }, { + "authenticate", T_FLAG, + N_("Require users to authenticate by default"), + NULL, + }, { + "root_sudo", T_FLAG, + N_("Root may run sudo"), + NULL, + }, { + "log_host", T_FLAG, + N_("Log the hostname in the (non-syslog) log file"), + NULL, + }, { + "log_year", T_FLAG, + N_("Log the year in the (non-syslog) log file"), + NULL, + }, { + "shell_noargs", T_FLAG, + N_("If sudo is invoked with no arguments, start a shell"), + NULL, + }, { + "set_home", T_FLAG, + N_("Set $HOME to the target user when starting a shell with -s"), + NULL, + }, { + "always_set_home", T_FLAG, + N_("Always set $HOME to the target user's home directory"), + NULL, + }, { + "path_info", T_FLAG, + N_("Allow some information gathering to give useful error messages"), + NULL, + }, { + "fqdn", T_FLAG, + N_("Require fully-qualified hostnames in the sudoers file"), + NULL, + }, { + "insults", T_FLAG, + N_("Insult the user when they enter an incorrect password"), + NULL, + }, { + "requiretty", T_FLAG, + N_("Only allow the user to run sudo if they have a tty"), + NULL, + }, { + "env_editor", T_FLAG, + N_("Visudo will honor the EDITOR environment variable"), + NULL, + }, { + "rootpw", T_FLAG, + N_("Prompt for root's password, not the users's"), + NULL, + }, { + "runaspw", T_FLAG, + N_("Prompt for the runas_default user's password, not the users's"), + NULL, + }, { + "targetpw", T_FLAG, + N_("Prompt for the target user's password, not the users's"), + NULL, + }, { + "use_loginclass", T_FLAG, + N_("Apply defaults in the target user's login class if there is one"), + NULL, + }, { + "set_logname", T_FLAG, + N_("Set the LOGNAME and USER environment variables"), + NULL, + }, { + "stay_setuid", T_FLAG, + N_("Only set the effective uid to the target user, not the real uid"), + NULL, + }, { + "preserve_groups", T_FLAG, + N_("Don't initialize the group vector to that of the target user"), + NULL, + }, { + "loglinelen", T_UINT|T_BOOL, + N_("Length at which to wrap log file lines (0 for no wrap): %u"), + NULL, + }, { + "timestamp_timeout", T_TIMESPEC|T_BOOL, + N_("Authentication timestamp timeout: %.1f minutes"), + NULL, + }, { + "passwd_timeout", T_TIMESPEC|T_BOOL, + N_("Password prompt timeout: %.1f minutes"), + NULL, + }, { + "passwd_tries", T_UINT, + N_("Number of tries to enter a password: %u"), + NULL, + }, { + "umask", T_MODE|T_BOOL, + N_("Umask to use or 0777 to use user's: 0%o"), + NULL, + }, { + "logfile", T_STR|T_BOOL|T_PATH, + N_("Path to log file: %s"), + NULL, + }, { + "mailerpath", T_STR|T_BOOL|T_PATH, + N_("Path to mail program: %s"), + NULL, + }, { + "mailerflags", T_STR|T_BOOL, + N_("Flags for mail program: %s"), + NULL, + }, { + "mailto", T_STR|T_BOOL, + N_("Address to send mail to: %s"), + NULL, + }, { + "mailfrom", T_STR|T_BOOL, + N_("Address to send mail from: %s"), + NULL, + }, { + "mailsub", T_STR, + N_("Subject line for mail messages: %s"), + NULL, + }, { + "badpass_message", T_STR, + N_("Incorrect password message: %s"), + NULL, + }, { + "lecture_status_dir", T_STR|T_PATH, + N_("Path to lecture status dir: %s"), + NULL, + }, { + "timestampdir", T_STR|T_PATH, + N_("Path to authentication timestamp dir: %s"), + NULL, + }, { + "timestampowner", T_STR, + N_("Owner of the authentication timestamp dir: %s"), + NULL, + }, { + "exempt_group", T_STR|T_BOOL, + N_("Users in this group are exempt from password and PATH requirements: %s"), + NULL, + }, { + "passprompt", T_STR, + N_("Default password prompt: %s"), + NULL, + }, { + "passprompt_override", T_FLAG, + N_("If set, passprompt will override system prompt in all cases."), + NULL, + }, { + "runas_default", T_STR, + N_("Default user to run commands as: %s"), + NULL, + }, { + "secure_path", T_STR|T_BOOL, + N_("Value to override user's $PATH with: %s"), + NULL, + }, { + "editor", T_STR|T_PATH, + N_("Path to the editor for use by visudo: %s"), + NULL, + }, { + "listpw", T_TUPLE|T_BOOL, + N_("When to require a password for 'list' pseudocommand: %s"), + def_data_listpw, + }, { + "verifypw", T_TUPLE|T_BOOL, + N_("When to require a password for 'verify' pseudocommand: %s"), + def_data_verifypw, + }, { + "noexec", T_FLAG, + N_("Preload the sudo_noexec library which replaces the exec functions"), + NULL, + }, { + "ignore_local_sudoers", T_FLAG, + N_("If LDAP directory is up, do we ignore local sudoers file"), + NULL, + }, { + "closefrom", T_INT, + N_("File descriptors >= %d will be closed before executing a command"), + NULL, + }, { + "closefrom_override", T_FLAG, + N_("If set, users may override the value of \"closefrom\" with the -C option"), + NULL, + }, { + "setenv", T_FLAG, + N_("Allow users to set arbitrary environment variables"), + NULL, + }, { + "env_reset", T_FLAG, + N_("Reset the environment to a default set of variables"), + NULL, + }, { + "env_check", T_LIST|T_BOOL, + N_("Environment variables to check for safety:"), + NULL, + }, { + "env_delete", T_LIST|T_BOOL, + N_("Environment variables to remove:"), + NULL, + }, { + "env_keep", T_LIST|T_BOOL, + N_("Environment variables to preserve:"), + NULL, + }, { + "role", T_STR, + N_("SELinux role to use in the new security context: %s"), + NULL, + }, { + "type", T_STR, + N_("SELinux type to use in the new security context: %s"), + NULL, + }, { + "env_file", T_STR|T_PATH|T_BOOL, + N_("Path to the sudo-specific environment file: %s"), + NULL, + }, { + "restricted_env_file", T_STR|T_PATH|T_BOOL, + N_("Path to the restricted sudo-specific environment file: %s"), + NULL, + }, { + "sudoers_locale", T_STR, + N_("Locale to use while parsing sudoers: %s"), + NULL, + }, { + "visiblepw", T_FLAG, + N_("Allow sudo to prompt for a password even if it would be visible"), + NULL, + }, { + "pwfeedback", T_FLAG, + N_("Provide visual feedback at the password prompt when there is user input"), + NULL, + }, { + "fast_glob", T_FLAG, + N_("Use faster globbing that is less accurate but does not access the filesystem"), + NULL, + }, { + "umask_override", T_FLAG, + N_("The umask specified in sudoers will override the user's, even if it is more permissive"), + NULL, + }, { + "log_input", T_FLAG, + N_("Log user's input for the command being run"), + NULL, + }, { + "log_output", T_FLAG, + N_("Log the output of the command being run"), + NULL, + }, { + "compress_io", T_FLAG, + N_("Compress I/O logs using zlib"), + NULL, + }, { + "use_pty", T_FLAG, + N_("Always run commands in a pseudo-tty"), + NULL, + }, { + "group_plugin", T_STR, + N_("Plugin for non-Unix group support: %s"), + NULL, + }, { + "iolog_dir", T_STR|T_PATH, + N_("Directory in which to store input/output logs: %s"), + NULL, + }, { + "iolog_file", T_STR, + N_("File in which to store the input/output log: %s"), + NULL, + }, { + "set_utmp", T_FLAG, + N_("Add an entry to the utmp/utmpx file when allocating a pty"), + NULL, + }, { + "utmp_runas", T_FLAG, + N_("Set the user in utmp to the runas user, not the invoking user"), + NULL, + }, { + "privs", T_STR, + N_("Set of permitted privileges: %s"), + NULL, + }, { + "limitprivs", T_STR, + N_("Set of limit privileges: %s"), + NULL, + }, { + "exec_background", T_FLAG, + N_("Run commands on a pty in the background"), + NULL, + }, { + "pam_service", T_STR, + N_("PAM service name to use: %s"), + NULL, + }, { + "pam_login_service", T_STR, + N_("PAM service name to use for login shells: %s"), + NULL, + }, { + "pam_setcred", T_FLAG, + N_("Attempt to establish PAM credentials for the target user"), + NULL, + }, { + "pam_session", T_FLAG, + N_("Create a new PAM session for the command to run in"), + NULL, + }, { + "pam_acct_mgmt", T_FLAG, + N_("Perform PAM account validation management"), + NULL, + }, { + "maxseq", T_STR, + N_("Maximum I/O log sequence number: %s"), + NULL, + }, { + "use_netgroups", T_FLAG, + N_("Enable sudoers netgroup support"), + NULL, + }, { + "sudoedit_checkdir", T_FLAG, + N_("Check parent directories for writability when editing files with sudoedit"), + NULL, + }, { + "sudoedit_follow", T_FLAG, + N_("Follow symbolic links when editing files with sudoedit"), + NULL, + }, { + "always_query_group_plugin", T_FLAG, + N_("Query the group plugin for unknown system groups"), + NULL, + }, { + "netgroup_tuple", T_FLAG, + N_("Match netgroups based on the entire tuple: user, host and domain"), + NULL, + }, { + "ignore_audit_errors", T_FLAG, + N_("Allow commands to be run even if sudo cannot write to the audit log"), + NULL, + }, { + "ignore_iolog_errors", T_FLAG, + N_("Allow commands to be run even if sudo cannot write to the I/O log"), + NULL, + }, { + "ignore_logfile_errors", T_FLAG, + N_("Allow commands to be run even if sudo cannot write to the log file"), + NULL, + }, { + "match_group_by_gid", T_FLAG, + N_("Resolve groups in sudoers and match on the group ID, not the name"), + NULL, + }, { + "syslog_maxlen", T_UINT, + N_("Log entries larger than this value will be split into multiple syslog messages: %u"), + NULL, + }, { + "iolog_user", T_STR|T_BOOL, + N_("User that will own the I/O log files: %s"), + NULL, + }, { + "iolog_group", T_STR|T_BOOL, + N_("Group that will own the I/O log files: %s"), + NULL, + }, { + "iolog_mode", T_MODE, + N_("File mode to use for the I/O log files: 0%o"), + NULL, + }, { + "fdexec", T_TUPLE|T_BOOL, + N_("Execute commands by file descriptor instead of by path: %s"), + def_data_fdexec, + }, { + "ignore_unknown_defaults", T_FLAG, + N_("Ignore unknown Defaults entries in sudoers instead of producing a warning"), + NULL, + }, { + "command_timeout", T_TIMEOUT|T_BOOL, + N_("Time in seconds after which the command will be terminated: %u"), + NULL, + }, { + "user_command_timeouts", T_FLAG, + N_("Allow the user to specify a timeout on the command line"), + NULL, + }, { + "iolog_flush", T_FLAG, + N_("Flush I/O log data to disk immediately instead of buffering it"), + NULL, + }, { + "syslog_pid", T_FLAG, + N_("Include the process ID when logging via syslog"), + NULL, + }, { + "timestamp_type", T_TUPLE, + N_("Type of authentication timestamp record: %s"), + def_data_timestamp_type, + }, { + "authfail_message", T_STR, + N_("Authentication failure message: %s"), + NULL, + }, { + "case_insensitive_user", T_FLAG, + N_("Ignore case when matching user names"), + NULL, + }, { + "case_insensitive_group", T_FLAG, + N_("Ignore case when matching group names"), + NULL, + }, { + "log_allowed", T_FLAG, + N_("Log when a command is allowed by sudoers"), + NULL, + }, { + "log_denied", T_FLAG, + N_("Log when a command is denied by sudoers"), + NULL, + }, { + "log_servers", T_LIST|T_BOOL, + N_("Sudo log server(s) to connect to with optional port"), + NULL, + }, { + "log_server_timeout", T_TIMEOUT|T_BOOL, + N_("Sudo log server timeout in seconds: %u"), + NULL, + }, { + "log_server_keepalive", T_FLAG, + N_("Enable SO_KEEPALIVE socket option on the socket connected to the logserver"), + NULL, + }, { + "log_server_cabundle", T_STR|T_BOOL|T_PATH, + N_("Path to the audit server's CA bundle file: %s"), + NULL, + }, { + "log_server_peer_cert", T_STR|T_BOOL|T_PATH, + N_("Path to the sudoers certificate file: %s"), + NULL, + }, { + "log_server_peer_key", T_STR|T_BOOL|T_PATH, + N_("Path to the sudoers private key file: %s"), + NULL, + }, { + "log_server_verify", T_FLAG, + N_("Verify that the log server's certificate is valid"), + NULL, + }, { + "runas_allow_unknown_id", T_FLAG, + N_("Allow the use of unknown runas user and/or group ID"), + NULL, + }, { + "runas_check_shell", T_FLAG, + N_("Only permit running commands as a user with a valid shell"), + NULL, + }, { + "pam_ruser", T_FLAG, + N_("Set the pam remote user to the user running sudo"), + NULL, + }, { + "pam_rhost", T_FLAG, + N_("Set the pam remote host to the local host name"), + NULL, + }, { + "runcwd", T_STR|T_BOOL|T_CHPATH, + N_("Working directory to change to before executing the command: %s"), + NULL, + }, { + "runchroot", T_STR|T_BOOL|T_CHPATH, + N_("Root directory to change to before executing the command: %s"), + NULL, + }, { + "log_format", T_TUPLE, + N_("The format of logs to produce: %s"), + def_data_log_format, + }, { + "selinux", T_FLAG, + N_("Enable SELinux RBAC support"), + NULL, + }, { + NULL, 0, NULL + } +}; diff --git a/plugins/sudoers/def_data.h b/plugins/sudoers/def_data.h new file mode 100644 index 0000000..5c712b8 --- /dev/null +++ b/plugins/sudoers/def_data.h @@ -0,0 +1,281 @@ +/* generated file, do not edit */ + +#define I_SYSLOG 0 +#define def_syslog (sudo_defs_table[I_SYSLOG].sd_un.ival) +#define I_SYSLOG_GOODPRI 1 +#define def_syslog_goodpri (sudo_defs_table[I_SYSLOG_GOODPRI].sd_un.ival) +#define I_SYSLOG_BADPRI 2 +#define def_syslog_badpri (sudo_defs_table[I_SYSLOG_BADPRI].sd_un.ival) +#define I_LONG_OTP_PROMPT 3 +#define def_long_otp_prompt (sudo_defs_table[I_LONG_OTP_PROMPT].sd_un.flag) +#define I_IGNORE_DOT 4 +#define def_ignore_dot (sudo_defs_table[I_IGNORE_DOT].sd_un.flag) +#define I_MAIL_ALWAYS 5 +#define def_mail_always (sudo_defs_table[I_MAIL_ALWAYS].sd_un.flag) +#define I_MAIL_BADPASS 6 +#define def_mail_badpass (sudo_defs_table[I_MAIL_BADPASS].sd_un.flag) +#define I_MAIL_NO_USER 7 +#define def_mail_no_user (sudo_defs_table[I_MAIL_NO_USER].sd_un.flag) +#define I_MAIL_NO_HOST 8 +#define def_mail_no_host (sudo_defs_table[I_MAIL_NO_HOST].sd_un.flag) +#define I_MAIL_NO_PERMS 9 +#define def_mail_no_perms (sudo_defs_table[I_MAIL_NO_PERMS].sd_un.flag) +#define I_MAIL_ALL_CMNDS 10 +#define def_mail_all_cmnds (sudo_defs_table[I_MAIL_ALL_CMNDS].sd_un.flag) +#define I_TTY_TICKETS 11 +#define def_tty_tickets (sudo_defs_table[I_TTY_TICKETS].sd_un.flag) +#define I_LECTURE 12 +#define def_lecture (sudo_defs_table[I_LECTURE].sd_un.tuple) +#define I_LECTURE_FILE 13 +#define def_lecture_file (sudo_defs_table[I_LECTURE_FILE].sd_un.str) +#define I_AUTHENTICATE 14 +#define def_authenticate (sudo_defs_table[I_AUTHENTICATE].sd_un.flag) +#define I_ROOT_SUDO 15 +#define def_root_sudo (sudo_defs_table[I_ROOT_SUDO].sd_un.flag) +#define I_LOG_HOST 16 +#define def_log_host (sudo_defs_table[I_LOG_HOST].sd_un.flag) +#define I_LOG_YEAR 17 +#define def_log_year (sudo_defs_table[I_LOG_YEAR].sd_un.flag) +#define I_SHELL_NOARGS 18 +#define def_shell_noargs (sudo_defs_table[I_SHELL_NOARGS].sd_un.flag) +#define I_SET_HOME 19 +#define def_set_home (sudo_defs_table[I_SET_HOME].sd_un.flag) +#define I_ALWAYS_SET_HOME 20 +#define def_always_set_home (sudo_defs_table[I_ALWAYS_SET_HOME].sd_un.flag) +#define I_PATH_INFO 21 +#define def_path_info (sudo_defs_table[I_PATH_INFO].sd_un.flag) +#define I_FQDN 22 +#define def_fqdn (sudo_defs_table[I_FQDN].sd_un.flag) +#define I_INSULTS 23 +#define def_insults (sudo_defs_table[I_INSULTS].sd_un.flag) +#define I_REQUIRETTY 24 +#define def_requiretty (sudo_defs_table[I_REQUIRETTY].sd_un.flag) +#define I_ENV_EDITOR 25 +#define def_env_editor (sudo_defs_table[I_ENV_EDITOR].sd_un.flag) +#define I_ROOTPW 26 +#define def_rootpw (sudo_defs_table[I_ROOTPW].sd_un.flag) +#define I_RUNASPW 27 +#define def_runaspw (sudo_defs_table[I_RUNASPW].sd_un.flag) +#define I_TARGETPW 28 +#define def_targetpw (sudo_defs_table[I_TARGETPW].sd_un.flag) +#define I_USE_LOGINCLASS 29 +#define def_use_loginclass (sudo_defs_table[I_USE_LOGINCLASS].sd_un.flag) +#define I_SET_LOGNAME 30 +#define def_set_logname (sudo_defs_table[I_SET_LOGNAME].sd_un.flag) +#define I_STAY_SETUID 31 +#define def_stay_setuid (sudo_defs_table[I_STAY_SETUID].sd_un.flag) +#define I_PRESERVE_GROUPS 32 +#define def_preserve_groups (sudo_defs_table[I_PRESERVE_GROUPS].sd_un.flag) +#define I_LOGLINELEN 33 +#define def_loglinelen (sudo_defs_table[I_LOGLINELEN].sd_un.uival) +#define I_TIMESTAMP_TIMEOUT 34 +#define def_timestamp_timeout (sudo_defs_table[I_TIMESTAMP_TIMEOUT].sd_un.tspec) +#define I_PASSWD_TIMEOUT 35 +#define def_passwd_timeout (sudo_defs_table[I_PASSWD_TIMEOUT].sd_un.tspec) +#define I_PASSWD_TRIES 36 +#define def_passwd_tries (sudo_defs_table[I_PASSWD_TRIES].sd_un.uival) +#define I_UMASK 37 +#define def_umask (sudo_defs_table[I_UMASK].sd_un.mode) +#define I_LOGFILE 38 +#define def_logfile (sudo_defs_table[I_LOGFILE].sd_un.str) +#define I_MAILERPATH 39 +#define def_mailerpath (sudo_defs_table[I_MAILERPATH].sd_un.str) +#define I_MAILERFLAGS 40 +#define def_mailerflags (sudo_defs_table[I_MAILERFLAGS].sd_un.str) +#define I_MAILTO 41 +#define def_mailto (sudo_defs_table[I_MAILTO].sd_un.str) +#define I_MAILFROM 42 +#define def_mailfrom (sudo_defs_table[I_MAILFROM].sd_un.str) +#define I_MAILSUB 43 +#define def_mailsub (sudo_defs_table[I_MAILSUB].sd_un.str) +#define I_BADPASS_MESSAGE 44 +#define def_badpass_message (sudo_defs_table[I_BADPASS_MESSAGE].sd_un.str) +#define I_LECTURE_STATUS_DIR 45 +#define def_lecture_status_dir (sudo_defs_table[I_LECTURE_STATUS_DIR].sd_un.str) +#define I_TIMESTAMPDIR 46 +#define def_timestampdir (sudo_defs_table[I_TIMESTAMPDIR].sd_un.str) +#define I_TIMESTAMPOWNER 47 +#define def_timestampowner (sudo_defs_table[I_TIMESTAMPOWNER].sd_un.str) +#define I_EXEMPT_GROUP 48 +#define def_exempt_group (sudo_defs_table[I_EXEMPT_GROUP].sd_un.str) +#define I_PASSPROMPT 49 +#define def_passprompt (sudo_defs_table[I_PASSPROMPT].sd_un.str) +#define I_PASSPROMPT_OVERRIDE 50 +#define def_passprompt_override (sudo_defs_table[I_PASSPROMPT_OVERRIDE].sd_un.flag) +#define I_RUNAS_DEFAULT 51 +#define def_runas_default (sudo_defs_table[I_RUNAS_DEFAULT].sd_un.str) +#define I_SECURE_PATH 52 +#define def_secure_path (sudo_defs_table[I_SECURE_PATH].sd_un.str) +#define I_EDITOR 53 +#define def_editor (sudo_defs_table[I_EDITOR].sd_un.str) +#define I_LISTPW 54 +#define def_listpw (sudo_defs_table[I_LISTPW].sd_un.tuple) +#define I_VERIFYPW 55 +#define def_verifypw (sudo_defs_table[I_VERIFYPW].sd_un.tuple) +#define I_NOEXEC 56 +#define def_noexec (sudo_defs_table[I_NOEXEC].sd_un.flag) +#define I_IGNORE_LOCAL_SUDOERS 57 +#define def_ignore_local_sudoers (sudo_defs_table[I_IGNORE_LOCAL_SUDOERS].sd_un.flag) +#define I_CLOSEFROM 58 +#define def_closefrom (sudo_defs_table[I_CLOSEFROM].sd_un.ival) +#define I_CLOSEFROM_OVERRIDE 59 +#define def_closefrom_override (sudo_defs_table[I_CLOSEFROM_OVERRIDE].sd_un.flag) +#define I_SETENV 60 +#define def_setenv (sudo_defs_table[I_SETENV].sd_un.flag) +#define I_ENV_RESET 61 +#define def_env_reset (sudo_defs_table[I_ENV_RESET].sd_un.flag) +#define I_ENV_CHECK 62 +#define def_env_check (sudo_defs_table[I_ENV_CHECK].sd_un.list) +#define I_ENV_DELETE 63 +#define def_env_delete (sudo_defs_table[I_ENV_DELETE].sd_un.list) +#define I_ENV_KEEP 64 +#define def_env_keep (sudo_defs_table[I_ENV_KEEP].sd_un.list) +#define I_ROLE 65 +#define def_role (sudo_defs_table[I_ROLE].sd_un.str) +#define I_TYPE 66 +#define def_type (sudo_defs_table[I_TYPE].sd_un.str) +#define I_ENV_FILE 67 +#define def_env_file (sudo_defs_table[I_ENV_FILE].sd_un.str) +#define I_RESTRICTED_ENV_FILE 68 +#define def_restricted_env_file (sudo_defs_table[I_RESTRICTED_ENV_FILE].sd_un.str) +#define I_SUDOERS_LOCALE 69 +#define def_sudoers_locale (sudo_defs_table[I_SUDOERS_LOCALE].sd_un.str) +#define I_VISIBLEPW 70 +#define def_visiblepw (sudo_defs_table[I_VISIBLEPW].sd_un.flag) +#define I_PWFEEDBACK 71 +#define def_pwfeedback (sudo_defs_table[I_PWFEEDBACK].sd_un.flag) +#define I_FAST_GLOB 72 +#define def_fast_glob (sudo_defs_table[I_FAST_GLOB].sd_un.flag) +#define I_UMASK_OVERRIDE 73 +#define def_umask_override (sudo_defs_table[I_UMASK_OVERRIDE].sd_un.flag) +#define I_LOG_INPUT 74 +#define def_log_input (sudo_defs_table[I_LOG_INPUT].sd_un.flag) +#define I_LOG_OUTPUT 75 +#define def_log_output (sudo_defs_table[I_LOG_OUTPUT].sd_un.flag) +#define I_COMPRESS_IO 76 +#define def_compress_io (sudo_defs_table[I_COMPRESS_IO].sd_un.flag) +#define I_USE_PTY 77 +#define def_use_pty (sudo_defs_table[I_USE_PTY].sd_un.flag) +#define I_GROUP_PLUGIN 78 +#define def_group_plugin (sudo_defs_table[I_GROUP_PLUGIN].sd_un.str) +#define I_IOLOG_DIR 79 +#define def_iolog_dir (sudo_defs_table[I_IOLOG_DIR].sd_un.str) +#define I_IOLOG_FILE 80 +#define def_iolog_file (sudo_defs_table[I_IOLOG_FILE].sd_un.str) +#define I_SET_UTMP 81 +#define def_set_utmp (sudo_defs_table[I_SET_UTMP].sd_un.flag) +#define I_UTMP_RUNAS 82 +#define def_utmp_runas (sudo_defs_table[I_UTMP_RUNAS].sd_un.flag) +#define I_PRIVS 83 +#define def_privs (sudo_defs_table[I_PRIVS].sd_un.str) +#define I_LIMITPRIVS 84 +#define def_limitprivs (sudo_defs_table[I_LIMITPRIVS].sd_un.str) +#define I_EXEC_BACKGROUND 85 +#define def_exec_background (sudo_defs_table[I_EXEC_BACKGROUND].sd_un.flag) +#define I_PAM_SERVICE 86 +#define def_pam_service (sudo_defs_table[I_PAM_SERVICE].sd_un.str) +#define I_PAM_LOGIN_SERVICE 87 +#define def_pam_login_service (sudo_defs_table[I_PAM_LOGIN_SERVICE].sd_un.str) +#define I_PAM_SETCRED 88 +#define def_pam_setcred (sudo_defs_table[I_PAM_SETCRED].sd_un.flag) +#define I_PAM_SESSION 89 +#define def_pam_session (sudo_defs_table[I_PAM_SESSION].sd_un.flag) +#define I_PAM_ACCT_MGMT 90 +#define def_pam_acct_mgmt (sudo_defs_table[I_PAM_ACCT_MGMT].sd_un.flag) +#define I_MAXSEQ 91 +#define def_maxseq (sudo_defs_table[I_MAXSEQ].sd_un.str) +#define I_USE_NETGROUPS 92 +#define def_use_netgroups (sudo_defs_table[I_USE_NETGROUPS].sd_un.flag) +#define I_SUDOEDIT_CHECKDIR 93 +#define def_sudoedit_checkdir (sudo_defs_table[I_SUDOEDIT_CHECKDIR].sd_un.flag) +#define I_SUDOEDIT_FOLLOW 94 +#define def_sudoedit_follow (sudo_defs_table[I_SUDOEDIT_FOLLOW].sd_un.flag) +#define I_ALWAYS_QUERY_GROUP_PLUGIN 95 +#define def_always_query_group_plugin (sudo_defs_table[I_ALWAYS_QUERY_GROUP_PLUGIN].sd_un.flag) +#define I_NETGROUP_TUPLE 96 +#define def_netgroup_tuple (sudo_defs_table[I_NETGROUP_TUPLE].sd_un.flag) +#define I_IGNORE_AUDIT_ERRORS 97 +#define def_ignore_audit_errors (sudo_defs_table[I_IGNORE_AUDIT_ERRORS].sd_un.flag) +#define I_IGNORE_IOLOG_ERRORS 98 +#define def_ignore_iolog_errors (sudo_defs_table[I_IGNORE_IOLOG_ERRORS].sd_un.flag) +#define I_IGNORE_LOGFILE_ERRORS 99 +#define def_ignore_logfile_errors (sudo_defs_table[I_IGNORE_LOGFILE_ERRORS].sd_un.flag) +#define I_MATCH_GROUP_BY_GID 100 +#define def_match_group_by_gid (sudo_defs_table[I_MATCH_GROUP_BY_GID].sd_un.flag) +#define I_SYSLOG_MAXLEN 101 +#define def_syslog_maxlen (sudo_defs_table[I_SYSLOG_MAXLEN].sd_un.uival) +#define I_IOLOG_USER 102 +#define def_iolog_user (sudo_defs_table[I_IOLOG_USER].sd_un.str) +#define I_IOLOG_GROUP 103 +#define def_iolog_group (sudo_defs_table[I_IOLOG_GROUP].sd_un.str) +#define I_IOLOG_MODE 104 +#define def_iolog_mode (sudo_defs_table[I_IOLOG_MODE].sd_un.mode) +#define I_FDEXEC 105 +#define def_fdexec (sudo_defs_table[I_FDEXEC].sd_un.tuple) +#define I_IGNORE_UNKNOWN_DEFAULTS 106 +#define def_ignore_unknown_defaults (sudo_defs_table[I_IGNORE_UNKNOWN_DEFAULTS].sd_un.flag) +#define I_COMMAND_TIMEOUT 107 +#define def_command_timeout (sudo_defs_table[I_COMMAND_TIMEOUT].sd_un.ival) +#define I_USER_COMMAND_TIMEOUTS 108 +#define def_user_command_timeouts (sudo_defs_table[I_USER_COMMAND_TIMEOUTS].sd_un.flag) +#define I_IOLOG_FLUSH 109 +#define def_iolog_flush (sudo_defs_table[I_IOLOG_FLUSH].sd_un.flag) +#define I_SYSLOG_PID 110 +#define def_syslog_pid (sudo_defs_table[I_SYSLOG_PID].sd_un.flag) +#define I_TIMESTAMP_TYPE 111 +#define def_timestamp_type (sudo_defs_table[I_TIMESTAMP_TYPE].sd_un.tuple) +#define I_AUTHFAIL_MESSAGE 112 +#define def_authfail_message (sudo_defs_table[I_AUTHFAIL_MESSAGE].sd_un.str) +#define I_CASE_INSENSITIVE_USER 113 +#define def_case_insensitive_user (sudo_defs_table[I_CASE_INSENSITIVE_USER].sd_un.flag) +#define I_CASE_INSENSITIVE_GROUP 114 +#define def_case_insensitive_group (sudo_defs_table[I_CASE_INSENSITIVE_GROUP].sd_un.flag) +#define I_LOG_ALLOWED 115 +#define def_log_allowed (sudo_defs_table[I_LOG_ALLOWED].sd_un.flag) +#define I_LOG_DENIED 116 +#define def_log_denied (sudo_defs_table[I_LOG_DENIED].sd_un.flag) +#define I_LOG_SERVERS 117 +#define def_log_servers (sudo_defs_table[I_LOG_SERVERS].sd_un.list) +#define I_LOG_SERVER_TIMEOUT 118 +#define def_log_server_timeout (sudo_defs_table[I_LOG_SERVER_TIMEOUT].sd_un.ival) +#define I_LOG_SERVER_KEEPALIVE 119 +#define def_log_server_keepalive (sudo_defs_table[I_LOG_SERVER_KEEPALIVE].sd_un.flag) +#define I_LOG_SERVER_CABUNDLE 120 +#define def_log_server_cabundle (sudo_defs_table[I_LOG_SERVER_CABUNDLE].sd_un.str) +#define I_LOG_SERVER_PEER_CERT 121 +#define def_log_server_peer_cert (sudo_defs_table[I_LOG_SERVER_PEER_CERT].sd_un.str) +#define I_LOG_SERVER_PEER_KEY 122 +#define def_log_server_peer_key (sudo_defs_table[I_LOG_SERVER_PEER_KEY].sd_un.str) +#define I_LOG_SERVER_VERIFY 123 +#define def_log_server_verify (sudo_defs_table[I_LOG_SERVER_VERIFY].sd_un.flag) +#define I_RUNAS_ALLOW_UNKNOWN_ID 124 +#define def_runas_allow_unknown_id (sudo_defs_table[I_RUNAS_ALLOW_UNKNOWN_ID].sd_un.flag) +#define I_RUNAS_CHECK_SHELL 125 +#define def_runas_check_shell (sudo_defs_table[I_RUNAS_CHECK_SHELL].sd_un.flag) +#define I_PAM_RUSER 126 +#define def_pam_ruser (sudo_defs_table[I_PAM_RUSER].sd_un.flag) +#define I_PAM_RHOST 127 +#define def_pam_rhost (sudo_defs_table[I_PAM_RHOST].sd_un.flag) +#define I_RUNCWD 128 +#define def_runcwd (sudo_defs_table[I_RUNCWD].sd_un.str) +#define I_RUNCHROOT 129 +#define def_runchroot (sudo_defs_table[I_RUNCHROOT].sd_un.str) +#define I_LOG_FORMAT 130 +#define def_log_format (sudo_defs_table[I_LOG_FORMAT].sd_un.tuple) +#define I_SELINUX 131 +#define def_selinux (sudo_defs_table[I_SELINUX].sd_un.flag) + +enum def_tuple { + never, + once, + always, + any, + all, + digest_only, + global, + ppid, + tty, + kernel, + sudo, + json +}; diff --git a/plugins/sudoers/def_data.in b/plugins/sudoers/def_data.in new file mode 100644 index 0000000..e8162e8 --- /dev/null +++ b/plugins/sudoers/def_data.in @@ -0,0 +1,414 @@ +# +# Format: +# +# var_name +# TYPE +# description (or NULL) +# array of struct def_values if TYPE == T_TUPLE +# +# NOTE: for tuples that can be used in a boolean context the first +# value corresponds to boolean FALSE and the second to TRUE. +# + +syslog + T_LOGFAC|T_BOOL + "Syslog facility if syslog is being used for logging: %s" +syslog_goodpri + T_LOGPRI|T_BOOL + "Syslog priority to use when user authenticates successfully: %s" +syslog_badpri + T_LOGPRI|T_BOOL + "Syslog priority to use when user authenticates unsuccessfully: %s" +long_otp_prompt + T_FLAG + "Put OTP prompt on its own line" +ignore_dot + T_FLAG + "Ignore '.' in $PATH" +mail_always + T_FLAG + "Always send mail when sudo is run" +mail_badpass + T_FLAG + "Send mail if user authentication fails" +mail_no_user + T_FLAG + "Send mail if the user is not in sudoers" +mail_no_host + T_FLAG + "Send mail if the user is not in sudoers for this host" +mail_no_perms + T_FLAG + "Send mail if the user is not allowed to run a command" +mail_all_cmnds + T_FLAG + "Send mail if the user tries to run a command" +tty_tickets + T_FLAG + "Use a separate timestamp for each user/tty combo" +lecture + T_TUPLE|T_BOOL + "Lecture user the first time they run sudo" + never once always +lecture_file + T_STR|T_PATH|T_BOOL + "File containing the sudo lecture: %s" +authenticate + T_FLAG + "Require users to authenticate by default" +root_sudo + T_FLAG + "Root may run sudo" +log_host + T_FLAG + "Log the hostname in the (non-syslog) log file" +log_year + T_FLAG + "Log the year in the (non-syslog) log file" +shell_noargs + T_FLAG + "If sudo is invoked with no arguments, start a shell" +set_home + T_FLAG + "Set $HOME to the target user when starting a shell with -s" +always_set_home + T_FLAG + "Always set $HOME to the target user's home directory" +path_info + T_FLAG + "Allow some information gathering to give useful error messages" +fqdn + T_FLAG + "Require fully-qualified hostnames in the sudoers file" +insults + T_FLAG + "Insult the user when they enter an incorrect password" +requiretty + T_FLAG + "Only allow the user to run sudo if they have a tty" +env_editor + T_FLAG + "Visudo will honor the EDITOR environment variable" +rootpw + T_FLAG + "Prompt for root's password, not the users's" +runaspw + T_FLAG + "Prompt for the runas_default user's password, not the users's" +targetpw + T_FLAG + "Prompt for the target user's password, not the users's" +use_loginclass + T_FLAG + "Apply defaults in the target user's login class if there is one" +set_logname + T_FLAG + "Set the LOGNAME and USER environment variables" +stay_setuid + T_FLAG + "Only set the effective uid to the target user, not the real uid" +preserve_groups + T_FLAG + "Don't initialize the group vector to that of the target user" +loglinelen + T_UINT|T_BOOL + "Length at which to wrap log file lines (0 for no wrap): %u" +timestamp_timeout + T_TIMESPEC|T_BOOL + "Authentication timestamp timeout: %.1f minutes" +passwd_timeout + T_TIMESPEC|T_BOOL + "Password prompt timeout: %.1f minutes" +passwd_tries + T_UINT + "Number of tries to enter a password: %u" +umask + T_MODE|T_BOOL + "Umask to use or 0777 to use user's: 0%o" +logfile + T_STR|T_BOOL|T_PATH + "Path to log file: %s" +mailerpath + T_STR|T_BOOL|T_PATH + "Path to mail program: %s" +mailerflags + T_STR|T_BOOL + "Flags for mail program: %s" +mailto + T_STR|T_BOOL + "Address to send mail to: %s" +mailfrom + T_STR|T_BOOL + "Address to send mail from: %s" +mailsub + T_STR + "Subject line for mail messages: %s" +badpass_message + T_STR + "Incorrect password message: %s" +lecture_status_dir + T_STR|T_PATH + "Path to lecture status dir: %s" +timestampdir + T_STR|T_PATH + "Path to authentication timestamp dir: %s" +timestampowner + T_STR + "Owner of the authentication timestamp dir: %s" +exempt_group + T_STR|T_BOOL + "Users in this group are exempt from password and PATH requirements: %s" +passprompt + T_STR + "Default password prompt: %s" +passprompt_override + T_FLAG + "If set, passprompt will override system prompt in all cases." +runas_default + T_STR + "Default user to run commands as: %s" +secure_path + T_STR|T_BOOL + "Value to override user's $PATH with: %s" +editor + T_STR|T_PATH + "Path to the editor for use by visudo: %s" +listpw + T_TUPLE|T_BOOL + "When to require a password for 'list' pseudocommand: %s" + never any all always +verifypw + T_TUPLE|T_BOOL + "When to require a password for 'verify' pseudocommand: %s" + never all any always +noexec + T_FLAG + "Preload the sudo_noexec library which replaces the exec functions" +ignore_local_sudoers + T_FLAG + "If LDAP directory is up, do we ignore local sudoers file" +closefrom + T_INT + "File descriptors >= %d will be closed before executing a command" +closefrom_override + T_FLAG + "If set, users may override the value of "closefrom" with the -C option" +setenv + T_FLAG + "Allow users to set arbitrary environment variables" +env_reset + T_FLAG + "Reset the environment to a default set of variables" +env_check + T_LIST|T_BOOL + "Environment variables to check for safety:" +env_delete + T_LIST|T_BOOL + "Environment variables to remove:" +env_keep + T_LIST|T_BOOL + "Environment variables to preserve:" +role + T_STR + "SELinux role to use in the new security context: %s" +type + T_STR + "SELinux type to use in the new security context: %s" +env_file + T_STR|T_PATH|T_BOOL + "Path to the sudo-specific environment file: %s" +restricted_env_file + T_STR|T_PATH|T_BOOL + "Path to the restricted sudo-specific environment file: %s" +sudoers_locale + T_STR + "Locale to use while parsing sudoers: %s" +visiblepw + T_FLAG + "Allow sudo to prompt for a password even if it would be visible" +pwfeedback + T_FLAG + "Provide visual feedback at the password prompt when there is user input" +fast_glob + T_FLAG + "Use faster globbing that is less accurate but does not access the filesystem" +umask_override + T_FLAG + "The umask specified in sudoers will override the user's, even if it is more permissive" +log_input + T_FLAG + "Log user's input for the command being run" +log_output + T_FLAG + "Log the output of the command being run" +compress_io + T_FLAG + "Compress I/O logs using zlib" +use_pty + T_FLAG + "Always run commands in a pseudo-tty" +group_plugin + T_STR + "Plugin for non-Unix group support: %s" +iolog_dir + T_STR|T_PATH + "Directory in which to store input/output logs: %s" +iolog_file + T_STR + "File in which to store the input/output log: %s" +set_utmp + T_FLAG + "Add an entry to the utmp/utmpx file when allocating a pty" +utmp_runas + T_FLAG + "Set the user in utmp to the runas user, not the invoking user" +privs + T_STR + "Set of permitted privileges: %s" +limitprivs + T_STR + "Set of limit privileges: %s" +exec_background + T_FLAG + "Run commands on a pty in the background" +pam_service + T_STR + "PAM service name to use: %s" +pam_login_service + T_STR + "PAM service name to use for login shells: %s" +pam_setcred + T_FLAG + "Attempt to establish PAM credentials for the target user" +pam_session + T_FLAG + "Create a new PAM session for the command to run in" +pam_acct_mgmt + T_FLAG + "Perform PAM account validation management" +maxseq + T_STR + "Maximum I/O log sequence number: %s" +use_netgroups + T_FLAG + "Enable sudoers netgroup support" +sudoedit_checkdir + T_FLAG + "Check parent directories for writability when editing files with sudoedit" +sudoedit_follow + T_FLAG + "Follow symbolic links when editing files with sudoedit" +always_query_group_plugin + T_FLAG + "Query the group plugin for unknown system groups" +netgroup_tuple + T_FLAG + "Match netgroups based on the entire tuple: user, host and domain" +ignore_audit_errors + T_FLAG + "Allow commands to be run even if sudo cannot write to the audit log" +ignore_iolog_errors + T_FLAG + "Allow commands to be run even if sudo cannot write to the I/O log" +ignore_logfile_errors + T_FLAG + "Allow commands to be run even if sudo cannot write to the log file" +match_group_by_gid + T_FLAG + "Resolve groups in sudoers and match on the group ID, not the name" +syslog_maxlen + T_UINT + "Log entries larger than this value will be split into multiple syslog messages: %u" +iolog_user + T_STR|T_BOOL + "User that will own the I/O log files: %s" +iolog_group + T_STR|T_BOOL + "Group that will own the I/O log files: %s" +iolog_mode + T_MODE + "File mode to use for the I/O log files: 0%o" +fdexec + T_TUPLE|T_BOOL + "Execute commands by file descriptor instead of by path: %s" + never digest_only always +ignore_unknown_defaults + T_FLAG + "Ignore unknown Defaults entries in sudoers instead of producing a warning" +command_timeout + T_TIMEOUT|T_BOOL + "Time in seconds after which the command will be terminated: %u" +user_command_timeouts + T_FLAG + "Allow the user to specify a timeout on the command line" +iolog_flush + T_FLAG + "Flush I/O log data to disk immediately instead of buffering it" +syslog_pid + T_FLAG + "Include the process ID when logging via syslog" +timestamp_type + T_TUPLE + "Type of authentication timestamp record: %s" + global ppid tty kernel +authfail_message + T_STR + "Authentication failure message: %s" +case_insensitive_user + T_FLAG + "Ignore case when matching user names" +case_insensitive_group + T_FLAG + "Ignore case when matching group names" +log_allowed + T_FLAG + "Log when a command is allowed by sudoers" +log_denied + T_FLAG + "Log when a command is denied by sudoers" +log_servers + T_LIST|T_BOOL + "Sudo log server(s) to connect to with optional port" +log_server_timeout + T_TIMEOUT|T_BOOL + "Sudo log server timeout in seconds: %u" +log_server_keepalive + T_FLAG + "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +log_server_cabundle + T_STR|T_BOOL|T_PATH + "Path to the audit server's CA bundle file: %s" +log_server_peer_cert + T_STR|T_BOOL|T_PATH + "Path to the sudoers certificate file: %s" +log_server_peer_key + T_STR|T_BOOL|T_PATH + "Path to the sudoers private key file: %s" +log_server_verify + T_FLAG + "Verify that the log server's certificate is valid" +runas_allow_unknown_id + T_FLAG + "Allow the use of unknown runas user and/or group ID" +runas_check_shell + T_FLAG + "Only permit running commands as a user with a valid shell" +pam_ruser + T_FLAG + "Set the pam remote user to the user running sudo" +pam_rhost + T_FLAG + "Set the pam remote host to the local host name" +runcwd + T_STR|T_BOOL|T_CHPATH + "Working directory to change to before executing the command: %s" +runchroot + T_STR|T_BOOL|T_CHPATH + "Root directory to change to before executing the command: %s" +log_format + T_TUPLE + "The format of logs to produce: %s" + sudo json +selinux + T_FLAG + "Enable SELinux RBAC support" diff --git a/plugins/sudoers/defaults.c b/plugins/sudoers/defaults.c new file mode 100644 index 0000000..8bc48b7 --- /dev/null +++ b/plugins/sudoers/defaults.c @@ -0,0 +1,1109 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_eventlog.h" +#include + +static struct early_default early_defaults[] = { + { I_IGNORE_UNKNOWN_DEFAULTS }, +#ifdef FQDN + { I_FQDN, true }, +#else + { I_FQDN }, +#endif + { I_MATCH_GROUP_BY_GID }, + { I_GROUP_PLUGIN }, + { I_RUNAS_DEFAULT }, + { I_SUDOERS_LOCALE }, + { -1 } +}; + +/* + * Local prototypes. + */ +static bool store_int(const char *str, union sudo_defs_val *sd_un); +static bool store_list(const char *str, union sudo_defs_val *sd_un, int op); +static bool store_mode(const char *str, union sudo_defs_val *sd_un); +static int store_str(const char *str, union sudo_defs_val *sd_un); +static bool store_syslogfac(const char *str, union sudo_defs_val *sd_un); +static bool store_syslogpri(const char *str, union sudo_defs_val *sd_un); +static bool store_timeout(const char *str, union sudo_defs_val *sd_un); +static bool store_tuple(const char *str, union sudo_defs_val *sd_un, struct def_values *tuple_vals); +static bool store_uint(const char *str, union sudo_defs_val *sd_un); +static bool store_timespec(const char *str, union sudo_defs_val *sd_un); +static bool list_op(const char *str, size_t, union sudo_defs_val *sd_un, enum list_ops op); +static bool valid_path(struct sudo_defs_types *def, const char *val, const char *file, int line, int column, bool quiet); + +/* + * Table describing compile-time and run-time options. + */ +#include + +/* + * Print version and configure info. + */ +void +dump_defaults(void) +{ + struct sudo_defs_types *cur; + struct list_member *item; + struct def_values *def; + char *desc; + debug_decl(dump_defaults, SUDOERS_DEBUG_DEFAULTS); + + for (cur = sudo_defs_table; cur->name; cur++) { + if (cur->desc) { + desc = _(cur->desc); + switch (cur->type & T_MASK) { + case T_FLAG: + if (cur->sd_un.flag) + sudo_printf(SUDO_CONV_INFO_MSG, "%s\n", desc); + break; + case T_STR: + if (cur->sd_un.str) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, cur->sd_un.str); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + break; + case T_LOGFAC: + if (cur->sd_un.ival) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, + sudo_logfac2str(cur->sd_un.ival)); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + break; + case T_LOGPRI: + if (cur->sd_un.ival) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, + sudo_logpri2str(cur->sd_un.ival)); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + break; + case T_INT: + sudo_printf(SUDO_CONV_INFO_MSG, desc, cur->sd_un.ival); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + case T_UINT: + sudo_printf(SUDO_CONV_INFO_MSG, desc, cur->sd_un.uival); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + case T_TIMESPEC: { + /* display timespec in minutes as a double */ + double d = cur->sd_un.tspec.tv_sec + + (cur->sd_un.tspec.tv_nsec / 1000000000.0); + sudo_printf(SUDO_CONV_INFO_MSG, desc, d / 60.0); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + } + case T_MODE: + sudo_printf(SUDO_CONV_INFO_MSG, desc, cur->sd_un.mode); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + case T_LIST: + if (!SLIST_EMPTY(&cur->sd_un.list)) { + sudo_printf(SUDO_CONV_INFO_MSG, "%s\n", desc); + SLIST_FOREACH(item, &cur->sd_un.list, entries) { + sudo_printf(SUDO_CONV_INFO_MSG, + "\t%s\n", item->value); + } + } + break; + case T_TIMEOUT: + if (cur->sd_un.ival) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, + cur->sd_un.ival); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + break; + case T_TUPLE: + for (def = cur->values; def->sval; def++) { + if (cur->sd_un.tuple == def->nval) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, def->sval); + break; + } + } + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + } + } + } + debug_return; +} + +/* + * Find the index of the specified Defaults name in sudo_defs_table[] + * On success, returns the matching index or -1 on failure. + */ +static int +find_default(const char *name, const char *file, int line, int column, bool quiet) +{ + int i; + debug_decl(find_default, SUDOERS_DEBUG_DEFAULTS); + + for (i = 0; sudo_defs_table[i].name != NULL; i++) { + if (strcmp(name, sudo_defs_table[i].name) == 0) + debug_return_int(i); + } + if (!quiet && !def_ignore_unknown_defaults) { + if (line > 0) { + sudo_warnx(U_("%s:%d:%d: unknown defaults entry \"%s\""), + file, line, column + 1, name); + } else { + sudo_warnx(U_("%s: unknown defaults entry \"%s\""), + file, name); + } + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: unknown defaults entry \"%s\"", __func__, name); + } + debug_return_int(-1); +} + +/* + * Parse a defaults entry, storing the parsed entry in sd_un. + * Returns true on success or false on failure. + */ +static bool +parse_default_entry(struct sudo_defs_types *def, const char *val, int op, + const char *file, int line, int column, bool quiet) +{ + int rc; + debug_decl(parse_default_entry, SUDOERS_DEBUG_DEFAULTS); + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: %s:%d:%d: %s=%s op=%d", + __func__, file, line, column, def->name, val ? val : "", op); + + /* + * If no value specified, the boolean flag must be set for non-flags. + * Only flags and tuples support boolean "true". + */ + if (val == NULL) { + switch (def->type & T_MASK) { + case T_FLAG: + break; + case T_TUPLE: + if (ISSET(def->type, T_BOOL)) + break; + FALLTHROUGH; + case T_LOGFAC: + if (op == true) { + /* Use default syslog facility if none specified. */ + val = LOGFAC; + } + break; + default: + if (!ISSET(def->type, T_BOOL) || op != false) { + if (!quiet) { + if (line > 0) { + sudo_warnx(U_("%s:%d:%d: no value specified for \"%s\""), + file, line, column, def->name); + } else { + sudo_warnx(U_("%s: no value specified for \"%s\""), + file, def->name); + } + } + debug_return_bool(false); + } + } + } + + switch (def->type & T_MASK) { + case T_LOGFAC: + rc = store_syslogfac(val, &def->sd_un); + break; + case T_LOGPRI: + rc = store_syslogpri(val, &def->sd_un); + break; + case T_STR: + if (val != NULL && ISSET(def->type, T_PATH|T_CHPATH)) { + if (!valid_path(def, val, file, line, column, quiet)) { + rc = -1; + break; + } + } + rc = store_str(val, &def->sd_un); + break; + case T_INT: + rc = store_int(val, &def->sd_un); + break; + case T_UINT: + rc = store_uint(val, &def->sd_un); + break; + case T_MODE: + rc = store_mode(val, &def->sd_un); + break; + case T_FLAG: + if (val != NULL) { + if (!quiet) { + if (line > 0) { + sudo_warnx(U_("%s:%d:%d: option \"%s\" does not take a value"), + file, line, column, def->name); + } else { + sudo_warnx(U_("%s: option \"%s\" does not take a value"), + file, def->name); + } + } + rc = -1; + break; + } + def->sd_un.flag = op; + rc = true; + break; + case T_LIST: + rc = store_list(val, &def->sd_un, op); + break; + case T_TIMEOUT: + rc = store_timeout(val, &def->sd_un); + break; + case T_TUPLE: + rc = store_tuple(val, &def->sd_un, def->values); + break; + case T_TIMESPEC: + rc = store_timespec(val, &def->sd_un); + break; + default: + if (!quiet) { + if (line > 0) { + sudo_warnx(U_("%s:%d:%d: invalid Defaults type 0x%x for option \"%s\""), + file, line, column, def->type, def->name); + } else { + sudo_warnx(U_("%s: invalid Defaults type 0x%x for option \"%s\""), + file, def->type, def->name); + } + } + rc = -1; + break; + } + if (rc == false) { + if (!quiet) { + if (line > 0) { + sudo_warnx(U_("%s:%d:%d: value \"%s\" is invalid for option \"%s\""), + file, line, column, val, def->name); + } else { + sudo_warnx(U_("%s: value \"%s\" is invalid for option \"%s\""), + file, val, def->name); + } + } + } + + debug_return_bool(rc == true); +} + +struct early_default * +is_early_default(const char *name) +{ + struct early_default *early; + debug_decl(is_early_default, SUDOERS_DEBUG_DEFAULTS); + + for (early = early_defaults; early->idx != -1; early++) { + if (strcmp(name, sudo_defs_table[early->idx].name) == 0) + debug_return_ptr(early); + } + debug_return_ptr(NULL); +} + +static bool +run_callback(struct sudo_defs_types *def) +{ + debug_decl(run_callback, SUDOERS_DEBUG_DEFAULTS); + + if (def->callback == NULL) + debug_return_bool(true); + debug_return_bool(def->callback(&def->sd_un)); +} + +/* + * Sets/clears an entry in the defaults structure. + * Runs the callback if present on success. + */ +bool +set_default(const char *var, const char *val, int op, const char *file, + int line, int column, bool quiet) +{ + int idx; + debug_decl(set_default, SUDOERS_DEBUG_DEFAULTS); + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "%s: setting Defaults %s -> %s", __func__, var, val ? val : "false"); + + idx = find_default(var, file, line, column, quiet); + if (idx != -1) { + /* Set parsed value in sudo_defs_table and run callback (if any). */ + struct sudo_defs_types *def = &sudo_defs_table[idx]; + if (parse_default_entry(def, val, op, file, line, column, quiet)) + debug_return_bool(run_callback(def)); + } + debug_return_bool(false); +} + +/* + * Like set_default() but stores the matching default value + * and does not run callbacks. + */ +bool +set_early_default(const char *var, const char *val, int op, const char *file, + int line, int column, bool quiet, struct early_default *early) +{ + int idx; + debug_decl(set_early_default, SUDOERS_DEBUG_DEFAULTS); + + idx = find_default(var, file, line, column, quiet); + if (idx != -1) { + /* Set parsed value in sudo_defs_table but defer callback (if any). */ + struct sudo_defs_types *def = &sudo_defs_table[idx]; + if (parse_default_entry(def, val, op, file, line, column, quiet)) { + early->run_callback = true; + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +/* + * Run callbacks for early defaults. + */ +bool +run_early_defaults(void) +{ + struct early_default *early; + bool ret = true; + debug_decl(run_early_defaults, SUDOERS_DEBUG_DEFAULTS); + + for (early = early_defaults; early->idx != -1; early++) { + if (early->run_callback) { + if (!run_callback(&sudo_defs_table[early->idx])) + ret = false; + early->run_callback = false; + } + } + debug_return_bool(ret); +} + +static void +free_defs_val(int type, union sudo_defs_val *sd_un) +{ + switch (type & T_MASK) { + case T_STR: + free(sd_un->str); + break; + case T_LIST: + (void)list_op(NULL, 0, sd_un, freeall); + break; + } + memset(sd_un, 0, sizeof(*sd_un)); +} + +/* + * Set default options to compiled-in values. + * Any of these may be overridden at runtime by a "Defaults" file. + */ +bool +init_defaults(void) +{ + static int firsttime = 1; + struct sudo_defs_types *def; + debug_decl(init_defaults, SUDOERS_DEBUG_DEFAULTS); + + /* Clear any old settings. */ + if (!firsttime) { + for (def = sudo_defs_table; def->name != NULL; def++) + free_defs_val(def->type, &def->sd_un); + } + + /* First initialize the flags. */ +#ifdef LONG_OTP_PROMPT + def_long_otp_prompt = true; +#endif +#ifdef IGNORE_DOT_PATH + def_ignore_dot = true; +#endif +#ifdef ALWAYS_SEND_MAIL + def_mail_always = true; +#endif +#ifdef SEND_MAIL_WHEN_NO_USER + def_mail_no_user = true; +#endif +#ifdef SEND_MAIL_WHEN_NO_HOST + def_mail_no_host = true; +#endif +#ifdef SEND_MAIL_WHEN_NOT_OK + def_mail_no_perms = true; +#endif +#ifndef NO_LECTURE + def_lecture = once; +#endif +#ifndef NO_AUTHENTICATION + def_authenticate = true; +#endif +#ifndef NO_ROOT_SUDO + def_root_sudo = true; +#endif +#ifdef HOST_IN_LOG + def_log_host = true; +#endif +#ifdef SHELL_IF_NO_ARGS + def_shell_noargs = true; +#endif +#ifdef SHELL_SETS_HOME + def_set_home = true; +#endif +#ifndef DONT_LEAK_PATH_INFO + def_path_info = true; +#endif +#ifdef USE_INSULTS + def_insults = true; +#endif +#ifdef FQDN + def_fqdn = true; +#endif +#ifdef ENV_EDITOR + def_env_editor = true; +#endif +#ifdef UMASK_OVERRIDE + def_umask_override = true; +#endif + def_timestamp_type = TIMESTAMP_TYPE; + if ((def_iolog_file = strdup("%{seq}")) == NULL) + goto oom; + if ((def_iolog_dir = strdup(_PATH_SUDO_IO_LOGDIR)) == NULL) + goto oom; + if ((def_sudoers_locale = strdup("C")) == NULL) + goto oom; + def_env_reset = ENV_RESET; + def_set_logname = true; + def_closefrom = STDERR_FILENO + 1; + def_pam_ruser = true; +#ifdef __sun__ + def_pam_rhost = true; +#endif + if ((def_pam_service = strdup("sudo")) == NULL) + goto oom; +#ifdef HAVE_PAM_LOGIN + if ((def_pam_login_service = strdup("sudo-i")) == NULL) + goto oom; +#else + if ((def_pam_login_service = strdup("sudo")) == NULL) + goto oom; +#endif +#ifdef NO_PAM_SESSION + def_pam_session = false; +#else + def_pam_session = true; +#endif +#ifdef HAVE_SELINUX + def_selinux = true; +#endif +#ifdef HAVE_INNETGR + def_use_netgroups = true; +#endif + def_netgroup_tuple = false; + def_sudoedit_checkdir = true; + def_iolog_mode = S_IRUSR|S_IWUSR; + def_fdexec = digest_only; + def_log_allowed = true; + def_log_denied = true; + def_log_format = sudo; + def_runas_allow_unknown_id = false; + + /* Syslog options need special care since they both strings and ints */ +#if (LOGGING & SLOG_SYSLOG) + (void) store_syslogfac(LOGFAC, &sudo_defs_table[I_SYSLOG].sd_un); + (void) store_syslogpri(PRI_SUCCESS, &sudo_defs_table[I_SYSLOG_GOODPRI].sd_un); + (void) store_syslogpri(PRI_FAILURE, &sudo_defs_table[I_SYSLOG_BADPRI].sd_un); +#endif + + /* Password flags also have a string and integer component. */ + (void) store_tuple("any", &sudo_defs_table[I_LISTPW].sd_un, sudo_defs_table[I_LISTPW].values); + (void) store_tuple("all", &sudo_defs_table[I_VERIFYPW].sd_un, sudo_defs_table[I_VERIFYPW].values); + + /* Then initialize the int-like things. */ +#ifdef SUDO_UMASK + def_umask = SUDO_UMASK; +#else + def_umask = ACCESSPERMS; +#endif + def_loglinelen = MAXLOGFILELEN; + def_timestamp_timeout.tv_sec = TIMEOUT * 60; + def_passwd_timeout.tv_sec = PASSWORD_TIMEOUT * 60; + def_passwd_tries = TRIES_FOR_PASSWORD; +#ifdef HAVE_ZLIB_H + def_compress_io = true; +#endif + def_log_server_timeout = 30; + def_log_server_verify = true; + def_log_server_keepalive = true; + def_ignore_audit_errors = true; + def_ignore_iolog_errors = false; + def_ignore_logfile_errors = true; + + /* Now do the strings */ + if ((def_mailto = strdup(MAILTO)) == NULL) + goto oom; + if ((def_mailsub = strdup(N_(MAILSUBJECT))) == NULL) + goto oom; + if ((def_badpass_message = strdup(_(INCORRECT_PASSWORD))) == NULL) + goto oom; + if ((def_lecture_status_dir = strdup(_PATH_SUDO_LECTURE_DIR)) == NULL) + goto oom; + if ((def_timestampdir = strdup(_PATH_SUDO_TIMEDIR)) == NULL) + goto oom; + if ((def_passprompt = strdup(_(PASSPROMPT))) == NULL) + goto oom; + if ((def_runas_default = strdup(RUNAS_DEFAULT)) == NULL) + goto oom; +#ifdef _PATH_SUDO_SENDMAIL + if ((def_mailerpath = strdup(_PATH_SUDO_SENDMAIL)) == NULL) + goto oom; +#endif + if ((def_mailerflags = strdup("-t")) == NULL) + goto oom; +#if (LOGGING & SLOG_FILE) + if ((def_logfile = strdup(_PATH_SUDO_LOGFILE)) == NULL) + goto oom; +#endif +#ifdef EXEMPTGROUP + if ((def_exempt_group = strdup(EXEMPTGROUP)) == NULL) + goto oom; +#endif +#ifdef SECURE_PATH + if ((def_secure_path = strdup(SECURE_PATH)) == NULL) + goto oom; +#endif + if ((def_editor = strdup(EDITOR)) == NULL) + goto oom; + def_set_utmp = true; + def_pam_acct_mgmt = true; + def_pam_setcred = true; + def_syslog_maxlen = MAXSYSLOGLEN; + def_case_insensitive_user = true; + def_case_insensitive_group = true; + + /* Reset the locale. */ + if (!firsttime) { + if (!sudoers_initlocale(NULL, def_sudoers_locale)) + goto oom; + } + + /* Finally do the lists (currently just environment tables). */ + if (!init_envtables()) + goto oom; + + /* Init eventlog config. */ + init_eventlog_config(); + + firsttime = 0; + + debug_return_bool(true); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); +} + +/* + * Check whether a defaults entry matches the specified type. + * Returns true if it matches, else false. + */ +static bool +default_type_matches(struct defaults *d, int what) +{ + debug_decl(default_type_matches, SUDOERS_DEBUG_DEFAULTS); + + switch (d->type) { + case DEFAULTS: + if (ISSET(what, SETDEF_GENERIC)) + debug_return_bool(true); + break; + case DEFAULTS_USER: + if (ISSET(what, SETDEF_USER)) + debug_return_bool(true); + break; + case DEFAULTS_RUNAS: + if (ISSET(what, SETDEF_RUNAS)) + debug_return_bool(true); + break; + case DEFAULTS_HOST: + if (ISSET(what, SETDEF_HOST)) + debug_return_bool(true); + break; + case DEFAULTS_CMND: + if (ISSET(what, SETDEF_CMND)) + debug_return_bool(true); + break; + } + debug_return_bool(false); +} + +/* + * Check whether a defaults entry's binding matches. + * Returns true if it matches, else false. + */ +static bool +default_binding_matches(struct sudoers_parse_tree *parse_tree, + struct defaults *d, int what) +{ + debug_decl(default_binding_matches, SUDOERS_DEBUG_DEFAULTS); + + switch (d->type) { + case DEFAULTS: + debug_return_bool(true); + break; + case DEFAULTS_USER: + if (userlist_matches(parse_tree, sudo_user.pw, d->binding) == ALLOW) + debug_return_bool(true); + break; + case DEFAULTS_RUNAS: + if (runaslist_matches(parse_tree, d->binding, NULL, NULL, NULL) == ALLOW) + debug_return_bool(true); + break; + case DEFAULTS_HOST: + if (hostlist_matches(parse_tree, sudo_user.pw, d->binding) == ALLOW) + debug_return_bool(true); + break; + case DEFAULTS_CMND: + if (cmndlist_matches(parse_tree, d->binding, NULL, NULL) == ALLOW) + debug_return_bool(true); + break; + } + debug_return_bool(false); +} + +/* + * Update the global defaults based on the given defaults list. + * Pass in an OR'd list of which default types to update. + */ +bool +update_defaults(struct sudoers_parse_tree *parse_tree, + struct defaults_list *defs, int what, bool quiet) +{ + struct defaults *d; + bool ret = true; + debug_decl(update_defaults, SUDOERS_DEBUG_DEFAULTS); + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "what: 0x%02x", what); + + /* If no defaults list specified, use the global one in the parse tree. */ + if (defs == NULL) + defs = &parse_tree->defaults; + + /* + * First apply Defaults values marked as early. + */ + TAILQ_FOREACH(d, defs, entries) { + struct early_default *early = is_early_default(d->var); + if (early == NULL) + continue; + + /* Defaults type and binding must match. */ + if (!default_type_matches(d, what) || + !default_binding_matches(parse_tree, d, what)) + continue; + + /* Copy the value to sudo_defs_table and mark as early. */ + if (!set_early_default(d->var, d->val, d->op, d->file, d->line, + d->column, quiet, early)) + ret = false; + } + /* Run callbacks for early defaults (if any) */ + if (!run_early_defaults()) + ret = false; + + /* + * Then set the rest of the defaults. + */ + TAILQ_FOREACH(d, defs, entries) { + /* Skip Defaults marked as early, we already did them. */ + if (is_early_default(d->var)) + continue; + + /* Defaults type and binding must match. */ + if (!default_type_matches(d, what) || + !default_binding_matches(parse_tree, d, what)) + continue; + + /* Copy the value to sudo_defs_table and run callback (if any) */ + if (!set_default(d->var, d->val, d->op, d->file, d->line, d->column, quiet)) + ret = false; + } + + debug_return_bool(ret); +} + +/* + * Check all defaults entries without actually setting them. + */ +bool +check_defaults(struct sudoers_parse_tree *parse_tree, bool quiet) +{ + struct defaults *d; + bool ret = true; + int idx; + debug_decl(check_defaults, SUDOERS_DEBUG_DEFAULTS); + + TAILQ_FOREACH(d, &parse_tree->defaults, entries) { + idx = find_default(d->var, d->file, d->line, d->column, quiet); + if (idx != -1) { + struct sudo_defs_types def = sudo_defs_table[idx]; + memset(&def.sd_un, 0, sizeof(def.sd_un)); + if (parse_default_entry(&def, d->val, d->op, d->file, + d->line, d->column, quiet)) { + free_defs_val(def.type, &def.sd_un); + continue; + } + } + /* There was an error in the entry, flag it. */ + d->error = true; + ret = false; + } + debug_return_bool(ret); +} + +static bool +store_int(const char *str, union sudo_defs_val *sd_un) +{ + const char *errstr; + int i; + debug_decl(store_int, SUDOERS_DEBUG_DEFAULTS); + + if (str == NULL) { + sd_un->ival = 0; + } else { + i = sudo_strtonum(str, INT_MIN, INT_MAX, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: %s", str, errstr); + debug_return_bool(false); + } + sd_un->ival = i; + } + debug_return_bool(true); +} + +static bool +store_uint(const char *str, union sudo_defs_val *sd_un) +{ + const char *errstr; + unsigned int u; + debug_decl(store_uint, SUDOERS_DEBUG_DEFAULTS); + + if (str == NULL) { + sd_un->uival = 0; + } else { + u = sudo_strtonum(str, 0, UINT_MAX, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: %s", str, errstr); + debug_return_bool(false); + } + sd_un->uival = u; + } + debug_return_bool(true); +} + +static bool +store_timespec(const char *str, union sudo_defs_val *sd_un) +{ + struct timespec ts; + char sign = '+'; + int i; + debug_decl(store_timespec, SUDOERS_DEBUG_DEFAULTS); + + sudo_timespecclear(&ts); + if (str != NULL) { + /* Convert from minutes to timespec. */ + if (*str == '+' || *str == '-') + sign = *str++; + while (*str != '\0' && *str != '.') { + if (!isdigit((unsigned char)*str)) + debug_return_bool(false); /* invalid number */ + if (ts.tv_sec > TIME_T_MAX / 10) + debug_return_bool(false); /* overflow */ + ts.tv_sec *= 10; + ts.tv_sec += *str++ - '0'; + } + if (*str++ == '.') { + /* Convert optional fractional component to nanosecs. */ + for (i = 100000000; i > 0; i /= 10) { + if (*str == '\0') + break; + if (!isdigit((unsigned char)*str)) + debug_return_bool(false); /* invalid number */ + ts.tv_nsec += i * (*str++ - '0'); + } + } + /* Convert from minutes to seconds. */ + if (ts.tv_sec > TIME_T_MAX / 60) + debug_return_bool(false); /* overflow */ + ts.tv_sec *= 60; + ts.tv_nsec *= 60; + while (ts.tv_nsec >= 1000000000) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000; + } + } + if (sign == '-') { + sd_un->tspec.tv_sec = -ts.tv_sec; + sd_un->tspec.tv_nsec = -ts.tv_nsec; + } else { + sd_un->tspec.tv_sec = ts.tv_sec; + sd_un->tspec.tv_nsec = ts.tv_nsec; + } + debug_return_bool(true); +} + +static bool +store_tuple(const char *str, union sudo_defs_val *sd_un, + struct def_values *tuple_vals) +{ + struct def_values *v; + debug_decl(store_tuple, SUDOERS_DEBUG_DEFAULTS); + + /* + * Look up tuple value by name to find enum def_tuple value. + * For negation to work the first element of enum def_tuple + * must be equivalent to boolean false. + */ + if (str == NULL) { + sd_un->ival = 0; + } else { + for (v = tuple_vals; v->sval != NULL; v++) { + if (strcmp(v->sval, str) == 0) { + sd_un->tuple = v->nval; + break; + } + } + if (v->sval == NULL) + debug_return_bool(false); + } + debug_return_bool(true); +} + +static int +store_str(const char *str, union sudo_defs_val *sd_un) +{ + debug_decl(store_str, SUDOERS_DEBUG_DEFAULTS); + + free(sd_un->str); + if (str == NULL) { + sd_un->str = NULL; + } else { + if ((sd_un->str = strdup(str)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + } + debug_return_int(true); +} + +static bool +store_list(const char *str, union sudo_defs_val *sd_un, int op) +{ + debug_decl(store_list, SUDOERS_DEBUG_DEFAULTS); + + /* Remove all old members. */ + if (op == false || op == true) + (void)list_op(NULL, 0, sd_un, freeall); + + /* Split str into multiple space-separated words and act on each one. */ + if (str != NULL) { + const char *cp, *ep; + const char *end = str + strlen(str); + const enum list_ops lop = op == '-' ? delete : add; + + for (cp = sudo_strsplit(str, end, " \t", &ep); cp != NULL; + cp = sudo_strsplit(NULL, end, " \t", &ep)) { + if (!list_op(cp, ep - cp, sd_un, lop)) + debug_return_bool(false); + } + } + debug_return_bool(true); +} + +static bool +store_syslogfac(const char *str, union sudo_defs_val *sd_un) +{ + debug_decl(store_syslogfac, SUDOERS_DEBUG_DEFAULTS); + + if (str == NULL) { + sd_un->ival = false; + debug_return_bool(true); + } + debug_return_bool(sudo_str2logfac(str, &sd_un->ival)); +} + +static bool +store_syslogpri(const char *str, union sudo_defs_val *sd_un) +{ + debug_decl(store_syslogpri, SUDOERS_DEBUG_DEFAULTS); + + if (str == NULL) { + sd_un->ival = -1; + debug_return_bool(true); + } + debug_return_bool(sudo_str2logpri(str, &sd_un->ival)); +} + +static bool +store_mode(const char *str, union sudo_defs_val *sd_un) +{ + mode_t mode; + const char *errstr; + debug_decl(store_mode, SUDOERS_DEBUG_DEFAULTS); + + if (str == NULL) { + sd_un->mode = ACCESSPERMS; + } else { + mode = sudo_strtomode(str, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s is %s", str, errstr); + debug_return_bool(false); + } + sd_un->mode = mode; + } + debug_return_bool(true); +} + +static bool +store_timeout(const char *str, union sudo_defs_val *sd_un) +{ + debug_decl(store_mode, SUDOERS_DEBUG_DEFAULTS); + + if (str == NULL) { + sd_un->ival = 0; + } else { + int seconds = parse_timeout(str); + if (seconds == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "%s", str); + debug_return_bool(false); + } + sd_un->ival = seconds; + } + debug_return_bool(true); +} + +static bool +valid_path(struct sudo_defs_types *def, const char *val, + const char *file, int line, int column, bool quiet) +{ + bool ret = true; + debug_decl(valid_path, SUDOERS_DEBUG_DEFAULTS); + + if (ISSET(def->type, T_CHPATH)) { + if (val[0] != '/' && val[0] != '~' && (val[0] != '*' || val[1] != '\0')) { + if (!quiet) { + if (line > 0) { + sudo_warnx( + U_("%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'"), + file, line, column, def->name); + } else { + sudo_warnx( + U_("%s: values for \"%s\" must start with a '/', '~', or '*'"), + file, def->name); + } + } + ret = false; + } + } else { + if (val[0] != '/') { + if (!quiet) { + if (line > 0) { + sudo_warnx( + U_("%s:%d:%d: values for \"%s\" must start with a '/'"), + file, line, column, def->name); + } else { + sudo_warnx( + U_("%s: values for \"%s\" must start with a '/'"), + file, def->name); + } + } + ret = false; + } + + } + debug_return_bool(ret); +} + +static bool +list_op(const char *str, size_t len, union sudo_defs_val *sd_un, + enum list_ops op) +{ + struct list_member *cur, *prev = NULL; + debug_decl(list_op, SUDOERS_DEBUG_DEFAULTS); + + if (op == freeall) { + while ((cur = SLIST_FIRST(&sd_un->list)) != NULL) { + SLIST_REMOVE_HEAD(&sd_un->list, entries); + free(cur->value); + free(cur); + } + debug_return_bool(true); + } + + SLIST_FOREACH(cur, &sd_un->list, entries) { + if ((strncmp(cur->value, str, len) == 0 && cur->value[len] == '\0')) { + + if (op == add) + debug_return_bool(true); /* already exists */ + + /* Delete node */ + if (prev == NULL) + SLIST_REMOVE_HEAD(&sd_un->list, entries); + else + SLIST_REMOVE_AFTER(prev, entries); + free(cur->value); + free(cur); + break; + } + prev = cur; + } + + /* Add new node to the head of the list. */ + if (op == add) { + cur = calloc(1, sizeof(struct list_member)); + if (cur == NULL || (cur->value = strndup(str, len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(cur); + debug_return_bool(false); + } + SLIST_INSERT_HEAD(&sd_un->list, cur, entries); + } + debug_return_bool(true); +} diff --git a/plugins/sudoers/defaults.h b/plugins/sudoers/defaults.h new file mode 100644 index 0000000..cf83963 --- /dev/null +++ b/plugins/sudoers/defaults.h @@ -0,0 +1,143 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2008-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDOERS_DEFAULTS_H +#define SUDOERS_DEFAULTS_H + +#include +#include +#include "sudo_queue.h" + +struct list_member { + SLIST_ENTRY(list_member) entries; + char *value; +}; + +SLIST_HEAD(list_members, list_member); + +enum list_ops { + add, + delete, + freeall +}; + +/* Mapping of tuple string value to enum def_tuple. */ +struct def_values { + char *sval; /* string value */ + enum def_tuple nval;/* numeric value */ +}; + +union sudo_defs_val { + int flag; + int ival; + unsigned int uival; + enum def_tuple tuple; + char *str; + mode_t mode; + struct timespec tspec; + struct list_members list; +}; + +/* + * Structure describing compile-time and run-time options. + */ +struct sudo_defs_types { + char *name; + int type; + char *desc; + struct def_values *values; + bool (*callback)(const union sudo_defs_val *); + union sudo_defs_val sd_un; +}; + +/* + * Defaults values to apply before others. + */ +struct early_default { + short idx; + short run_callback; +}; + +/* + * Four types of defaults: strings, integers, and flags. + * Also, T_INT, T_TIMESPEC or T_STR may be ANDed with T_BOOL to indicate that + * a value is not required. Flags are boolean by nature... + */ +#undef T_INT +#define T_INT 0x001 +#undef T_UINT +#define T_UINT 0x002 +#undef T_STR +#define T_STR 0x003 +#undef T_FLAG +#define T_FLAG 0x004 +#undef T_MODE +#define T_MODE 0x005 +#undef T_LIST +#define T_LIST 0x006 +#undef T_LOGFAC +#define T_LOGFAC 0x007 +#undef T_LOGPRI +#define T_LOGPRI 0x008 +#undef T_TUPLE +#define T_TUPLE 0x009 +#undef T_TIMESPEC +#define T_TIMESPEC 0x010 +#undef T_TIMEOUT +#define T_TIMEOUT 0x020 +#undef T_MASK +#define T_MASK 0x0FF +#undef T_BOOL +#define T_BOOL 0x100 +#undef T_PATH +#define T_PATH 0x200 +#undef T_CHPATH +#define T_CHPATH 0x400 + +/* + * Argument to update_defaults() + */ +#define SETDEF_GENERIC 0x01 +#define SETDEF_HOST 0x02 +#define SETDEF_USER 0x04 +#define SETDEF_RUNAS 0x08 +#define SETDEF_CMND 0x10 +#define SETDEF_ALL (SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER|SETDEF_RUNAS|SETDEF_CMND) + +/* + * Prototypes + */ +struct defaults_list; +struct sudoers_parse_tree; +void dump_default(void); +bool init_defaults(void); +struct early_default *is_early_default(const char *name); +bool run_early_defaults(void); +bool set_early_default(const char *var, const char *val, int op, const char *file, int line, int column, bool quiet, struct early_default *early); +bool set_default(const char *var, const char *val, int op, const char *file, int line, int column, bool quiet); +bool update_defaults(struct sudoers_parse_tree *parse_tree, struct defaults_list *defs, int what, bool quiet); +bool check_defaults(struct sudoers_parse_tree *parse_tree, bool quiet); + +extern struct sudo_defs_types sudo_defs_table[]; + +#endif /* SUDOERS_DEFAULTS_H */ diff --git a/plugins/sudoers/digestname.c b/plugins/sudoers/digestname.c new file mode 100644 index 0000000..e501de4 --- /dev/null +++ b/plugins/sudoers/digestname.c @@ -0,0 +1,55 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include "sudo_compat.h" +#include "sudo_digest.h" +#include "sudoers_debug.h" +#include "parse.h" + +const char * +digest_type_to_name(int digest_type) +{ + const char *digest_name; + debug_decl(digest_type_to_name, SUDOERS_DEBUG_UTIL); + + switch (digest_type) { + case SUDO_DIGEST_SHA224: + digest_name = "sha224"; + break; + case SUDO_DIGEST_SHA256: + digest_name = "sha256"; + break; + case SUDO_DIGEST_SHA384: + digest_name = "sha384"; + break; + case SUDO_DIGEST_SHA512: + digest_name = "sha512"; + break; + default: + digest_name = "unknown digest"; + break; + } + debug_return_const_str(digest_name); +} diff --git a/plugins/sudoers/editor.c b/plugins/sudoers/editor.c new file mode 100644 index 0000000..a0cd63d --- /dev/null +++ b/plugins/sudoers/editor.c @@ -0,0 +1,252 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" + +/* + * Non-destructive word-split that handles single and double quotes and + * escaped white space. Quotes are only recognized at the start of a word. + * They are treated as normal characters inside a word. + */ +static const char * +wordsplit(const char *str, const char *endstr, const char **last) +{ + const char *cp; + debug_decl(wordsplit, SUDO_DEBUG_UTIL); + + /* If no str specified, use last ptr (if any). */ + if (str == NULL) { + str = *last; + /* Consume end quote if present. */ + if (*str == '"' || *str == '\'') + str++; + } + + /* Skip leading white space characters. */ + while (str < endstr && (*str == ' ' || *str == '\t')) + str++; + + /* Empty string? */ + if (str >= endstr) { + *last = endstr; + debug_return_ptr(NULL); + } + + /* If word is quoted, skip to end quote and return. */ + if (*str == '"' || *str == '\'') { + const char *endquote = memchr(str + 1, *str, endstr - str); + if (endquote != NULL) { + *last = endquote; + debug_return_const_ptr(str + 1); + } + } + + /* Scan str until we encounter white space. */ + for (cp = str; cp < endstr; cp++) { + if (*cp == '\\') { + /* quoted char, do not interpret */ + cp++; + continue; + } + if (*cp == ' ' || *cp == '\t') { + /* end of word */ + break; + } + } + *last = cp; + debug_return_const_ptr(str); +} + +/* Copy len chars from string, collapsing chars escaped with a backslash. */ +static char * +copy_arg(const char *src, size_t len) +{ + const char *src_end = src + len; + char *copy, *dst; + debug_decl(copy_arg, SUDOERS_DEBUG_UTIL); + + if ((copy = malloc(len + 1)) != NULL) { + for (dst = copy; src < src_end; ) { + if (*src == '\\') { + src++; + continue; + } + *dst++ = *src++; + } + *dst = '\0'; + } + + debug_return_ptr(copy); +} + +/* + * Search for the specified editor in the user's PATH, checking + * the result against allowlist if non-NULL. An argument vector + * suitable for execve() is allocated and stored in argv_out. + * If nfiles is non-zero, files[] is added to the end of argv_out. + * + * Returns the path to be executed on success, else NULL. + * The caller is responsible for freeing the returned editor path + * as well as the argument vector. + */ +static char * +resolve_editor(const char *ed, size_t edlen, int nfiles, char **files, + int *argc_out, char ***argv_out, char * const *allowlist) +{ + char **nargv = NULL, *editor = NULL, *editor_path = NULL; + const char *tmp, *cp, *ep = NULL; + const char *edend = ed + edlen; + struct stat user_editor_sb; + int nargc; + debug_decl(resolve_editor, SUDOERS_DEBUG_UTIL); + + /* + * Split editor into an argument vector, including files to edit. + * The EDITOR and VISUAL environment variables may contain command + * line args so look for those and alloc space for them too. + */ + cp = wordsplit(ed, edend, &ep); + if (cp == NULL) + debug_return_str(NULL); + editor = copy_arg(cp, ep - cp); + if (editor == NULL) + goto oom; + + /* If we can't find the editor in the user's PATH, give up. */ + if (find_path(editor, &editor_path, &user_editor_sb, getenv("PATH"), NULL, + 0, allowlist) != FOUND) { + free(editor); + errno = ENOENT; + debug_return_str(NULL); + } + + /* Count rest of arguments and allocate editor argv. */ + for (nargc = 1, tmp = ep; wordsplit(NULL, edend, &tmp) != NULL; ) + nargc++; + if (nfiles != 0) + nargc += nfiles + 1; + nargv = reallocarray(NULL, nargc + 1, sizeof(char *)); + if (nargv == NULL) + goto oom; + + /* Fill in editor argv (assumes files[] is NULL-terminated). */ + nargv[0] = editor; + editor = NULL; + for (nargc = 1; (cp = wordsplit(NULL, edend, &ep)) != NULL; nargc++) { + /* Copy string, collapsing chars escaped with a backslash. */ + nargv[nargc] = copy_arg(cp, ep - cp); + if (nargv[nargc] == NULL) + goto oom; + } + if (nfiles != 0) { + nargv[nargc++] = "--"; + while (nfiles--) + nargv[nargc++] = *files++; + } + nargv[nargc] = NULL; + + *argc_out = nargc; + *argv_out = nargv; + debug_return_str(editor_path); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(editor); + free(editor_path); + if (nargv != NULL) { + while (nargc--) + free(nargv[nargc]); + free(nargv); + } + debug_return_str(NULL); +} + +/* + * Determine which editor to use based on the SUDO_EDITOR, VISUAL and + * EDITOR environment variables as well as the editor path in sudoers. + * If env_error is true, an editor environment variable that cannot be + * resolved is an error. + * + * Returns the path to be executed on success, else NULL. + * The caller is responsible for freeing the returned editor path + * as well as the argument vector. + */ +char * +find_editor(int nfiles, char **files, int *argc_out, char ***argv_out, + char * const *allowlist, const char **env_editor, bool env_error) +{ + char *ev[3], *editor_path = NULL; + unsigned int i; + debug_decl(find_editor, SUDOERS_DEBUG_UTIL); + + /* + * If any of SUDO_EDITOR, VISUAL or EDITOR are set, choose the first one. + */ + *env_editor = NULL; + ev[0] = "SUDO_EDITOR"; + ev[1] = "VISUAL"; + ev[2] = "EDITOR"; + for (i = 0; i < nitems(ev); i++) { + char *editor = getenv(ev[i]); + + if (editor != NULL && *editor != '\0') { + *env_editor = editor; + editor_path = resolve_editor(editor, strlen(editor), + nfiles, files, argc_out, argv_out, allowlist); + if (editor_path != NULL) + break; + if (errno != ENOENT) + debug_return_str(NULL); + } + } + if (editor_path == NULL) { + const char *def_editor_end = def_editor + strlen(def_editor); + const char *cp, *ep; + + if (env_error && *env_editor != NULL) { + /* User-specified editor could not be found. */ + debug_return_str(NULL); + } + + /* def_editor could be a path, split it up, avoiding strtok() */ + for (cp = sudo_strsplit(def_editor, def_editor_end, ":", &ep); + cp != NULL; cp = sudo_strsplit(NULL, def_editor_end, ":", &ep)) { + editor_path = resolve_editor(cp, (size_t)(ep - cp), nfiles, + files, argc_out, argv_out, allowlist); + if (editor_path != NULL) + break; + if (errno != ENOENT) + debug_return_str(NULL); + } + } + + debug_return_str(editor_path); +} diff --git a/plugins/sudoers/env.c b/plugins/sudoers/env.c new file mode 100644 index 0000000..a5b9f84 --- /dev/null +++ b/plugins/sudoers/env.c @@ -0,0 +1,1506 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2000-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#ifdef HAVE_LOGIN_CAP_H +# include +# ifndef LOGIN_SETENV +# define LOGIN_SETENV 0 +# endif +#endif /* HAVE_LOGIN_CAP_H */ +#include +#include +#include +#include + +#include "sudoers.h" + +/* + * Flags used in rebuild_env() + */ +#undef DID_TERM +#define DID_TERM 0x00000001 +#undef DID_PATH +#define DID_PATH 0x00000002 +#undef DID_HOME +#define DID_HOME 0x00000004 +#undef DID_SHELL +#define DID_SHELL 0x00000008 +#undef DID_LOGNAME +#define DID_LOGNAME 0x00000010 +#undef DID_USER +#define DID_USER 0x00000020 +#undef DID_LOGIN +#define DID_LOGIN 0x00000040 +#undef DID_MAIL +#define DID_MAIL 0x00000080 +#undef DID_MAX +#define DID_MAX 0x0000ffff + +#undef KEPT_TERM +#define KEPT_TERM 0x00010000 +#undef KEPT_PATH +#define KEPT_PATH 0x00020000 +#undef KEPT_HOME +#define KEPT_HOME 0x00040000 +#undef KEPT_SHELL +#define KEPT_SHELL 0x00080000 +#undef KEPT_LOGNAME +#define KEPT_LOGNAME 0x00100000 +#undef KEPT_USER +#define KEPT_USER 0x00200000 +#undef KEPT_LOGIN +#define KEPT_LOGIN 0x00400000 +#undef KEPT_MAIL +#define KEPT_MAIL 0x00800000 +#undef KEPT_MAX +#define KEPT_MAX 0xffff0000 + +/* + * AIX sets the LOGIN environment variable too. + */ +#ifdef _AIX +# define KEPT_USER_VARIABLES (KEPT_LOGIN|KEPT_LOGNAME|KEPT_USER) +#else +# define KEPT_USER_VARIABLES (KEPT_LOGNAME|KEPT_USER) +#endif + +/* + * Functions to open, close and parse an environment file, either + * a system file such as /etc/environment or one specified in sudoers. + */ +struct sudoers_env_file { + void * (*open)(const char *); + void (*close)(void *); + char * (*next)(void *, int *); +}; + +/* + * State for a local environment file. + */ +struct env_file_local { + FILE *fp; + char *line; + size_t linesize; +}; + +struct environment { + char **envp; /* pointer to the new environment */ + char **old_envp; /* pointer the old environment we allocated */ + size_t env_size; /* size of new_environ in char **'s */ + size_t env_len; /* number of slots used, not counting NULL */ +}; + +/* + * Copy of the sudo-managed environment. + */ +static struct environment env; + +/* + * Default table of "bad" variables to remove from the environment. + * XXX - how to omit TERMCAP if it starts with '/'? + */ +static const char *initial_badenv_table[] = { + "IFS", + "CDPATH", + "LOCALDOMAIN", + "RES_OPTIONS", + "HOSTALIASES", + "NLSPATH", + "PATH_LOCALE", + "LD_*", + "_RLD*", +#ifdef __hpux + "SHLIB_PATH", +#endif /* __hpux */ +#ifdef _AIX + "LDR_*", + "LIBPATH", + "AUTHSTATE", +#endif +#ifdef __APPLE__ + "DYLD_*", +#endif +#ifdef HAVE_KERB5 + "KRB5_CONFIG*", + "KRB5_KTNAME", +#endif /* HAVE_KERB5 */ +#ifdef HAVE_SECURID + "VAR_ACE", + "USR_ACE", + "DLC_ACE", +#endif /* HAVE_SECURID */ + "TERMINFO", /* terminfo, exclusive path to terminfo files */ + "TERMINFO_DIRS", /* terminfo, path(s) to terminfo files */ + "TERMPATH", /* termcap, path(s) to termcap files */ + "TERMCAP", /* XXX - only if it starts with '/' */ + "ENV", /* ksh, file to source before script runs */ + "BASH_ENV", /* bash, file to source before script runs */ + "PS4", /* bash, prefix for lines in xtrace mode */ + "GLOBIGNORE", /* bash, globbing patterns to ignore */ + "BASHOPTS", /* bash, initial "shopt -s" options */ + "SHELLOPTS", /* bash, initial "set -o" options */ + "JAVA_TOOL_OPTIONS", /* java, extra command line options */ + "PERLIO_DEBUG", /* perl, debugging output file */ + "PERLLIB", /* perl, search path for modules/includes */ + "PERL5LIB", /* perl 5, search path for modules/includes */ + "PERL5OPT", /* perl 5, extra command line options */ + "PERL5DB", /* perl 5, command used to load debugger */ + "FPATH", /* ksh, search path for functions */ + "NULLCMD", /* zsh, command for null file redirection */ + "READNULLCMD", /* zsh, command for null file redirection */ + "ZDOTDIR", /* zsh, search path for dot files */ + "TMPPREFIX", /* zsh, prefix for temporary files */ + "PYTHONHOME", /* python, module search path */ + "PYTHONPATH", /* python, search path */ + "PYTHONINSPECT", /* python, allow inspection */ + "PYTHONUSERBASE", /* python, per user site-packages directory */ + "RUBYLIB", /* ruby, library load path */ + "RUBYOPT", /* ruby, extra command line options */ + "*=()*", /* bash functions */ + NULL +}; + +/* + * Default table of variables to check for '%' and '/' characters. + */ +static const char *initial_checkenv_table[] = { + "COLORTERM", + "LANG", + "LANGUAGE", + "LC_*", + "LINGUAS", + "TERM", + "TZ", + NULL +}; + +/* + * Default table of variables to preserve in the environment. + */ +static const char *initial_keepenv_table[] = { + "COLORS", + "DISPLAY", + "HOSTNAME", + "KRB5CCNAME", + "LS_COLORS", + "PATH", + "PS1", + "PS2", + "XAUTHORITY", + "XAUTHORIZATION", + NULL +}; + +/* + * Initialize env based on envp. + */ +bool +env_init(char * const envp[]) +{ + char * const *ep; + size_t len; + debug_decl(env_init, SUDOERS_DEBUG_ENV); + + if (envp == NULL) { + /* Free the old envp we allocated, if any. */ + free(env.old_envp); + + /* Reset to initial state but keep a pointer to what we allocated. */ + env.old_envp = env.envp; + env.envp = NULL; + env.env_size = 0; + env.env_len = 0; + } else { + /* Make private copy of envp. */ + for (ep = envp; *ep != NULL; ep++) + continue; + len = (size_t)(ep - envp); + + env.env_len = len; + env.env_size = len + 1 + 128; + env.envp = reallocarray(NULL, env.env_size, sizeof(char *)); + if (env.envp == NULL) { + env.env_size = 0; + env.env_len = 0; + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } +#ifdef ENV_DEBUG + memset(env.envp, 0, env.env_size * sizeof(char *)); +#endif + memcpy(env.envp, envp, len * sizeof(char *)); + env.envp[len] = NULL; + + /* Free the old envp we allocated, if any. */ + free(env.old_envp); + env.old_envp = NULL; + } + + debug_return_bool(true); +} + +/* + * Getter for private copy of the environment. + */ +char ** +env_get(void) +{ + return env.envp; +} + +/* + * Swap the old and new copies of the environment. + */ +bool +env_swap_old(void) +{ + char **old_envp; + + if (env.old_envp == NULL) + return false; + old_envp = env.old_envp; + env.old_envp = env.envp; + env.envp = old_envp; + return true; +} + +/* + * Similar to putenv(3) but operates on sudo's private copy of the + * environment (not environ) and it always overwrites. The dupcheck param + * determines whether we need to verify that the variable is not already set. + * Will only overwrite an existing variable if overwrite is set. + * Does not include warnings or debugging to avoid recursive calls. + */ +static int +sudo_putenv_nodebug(char *str, bool dupcheck, bool overwrite) +{ + char **ep; + size_t len; + bool found = false; + + /* Make sure there is room for the new entry plus a NULL. */ + if (env.env_size > 2 && env.env_len > env.env_size - 2) { + char **nenvp; + size_t nsize; + + if (env.env_size > SIZE_MAX - 128) { + sudo_warnx_nodebug(U_("internal error, %s overflow"), + "sudo_putenv_nodebug"); + errno = EOVERFLOW; + return -1; + } + nsize = env.env_size + 128; + if (nsize > SIZE_MAX / sizeof(char *)) { + sudo_warnx_nodebug(U_("internal error, %s overflow"), + "sudo_putenv_nodebug"); + errno = EOVERFLOW; + return -1; + } + nenvp = reallocarray(env.envp, nsize, sizeof(char *)); + if (nenvp == NULL) + return -1; + env.envp = nenvp; + env.env_size = nsize; +#ifdef ENV_DEBUG + memset(env.envp + env.env_len, 0, + (env.env_size - env.env_len) * sizeof(char *)); +#endif + } + +#ifdef ENV_DEBUG + if (env.envp[env.env_len] != NULL) { + errno = EINVAL; + return -1; + } +#endif + + if (dupcheck) { + len = (strchr(str, '=') - str) + 1; + for (ep = env.envp; *ep != NULL; ep++) { + if (strncmp(str, *ep, len) == 0) { + if (overwrite) + *ep = str; + found = true; + break; + } + } + /* Prune out extra instances of the variable we just overwrote. */ + if (found && overwrite) { + while (*++ep != NULL) { + if (strncmp(str, *ep, len) == 0) { + char **cur = ep; + while ((*cur = *(cur + 1)) != NULL) + cur++; + ep--; + } + } + env.env_len = ep - env.envp; + } + } + + if (!found) { + ep = env.envp + env.env_len; + env.env_len++; + *ep++ = str; + *ep = NULL; + } + return 0; +} + +/* + * Similar to putenv(3) but operates on sudo's private copy of the + * environment (not environ) and it always overwrites. The dupcheck param + * determines whether we need to verify that the variable is not already set. + * Will only overwrite an existing variable if overwrite is set. + */ +static int +sudo_putenv(char *str, bool dupcheck, bool overwrite) +{ + int ret; + debug_decl(sudo_putenv, SUDOERS_DEBUG_ENV); + + sudo_debug_printf(SUDO_DEBUG_INFO, "sudo_putenv: %s", str); + + ret = sudo_putenv_nodebug(str, dupcheck, overwrite); + if (ret == -1) { +#ifdef ENV_DEBUG + if (env.envp[env.env_len] != NULL) { + sudo_warnx("%s", + U_("sudo_putenv: corrupted envp, length mismatch")); + } +#endif + } + debug_return_int(ret); +} + +/* + * Similar to setenv(3) but operates on a private copy of the environment. + * The dupcheck param determines whether we need to verify that the variable + * is not already set. + */ +static int +sudo_setenv2(const char *var, const char *val, bool dupcheck, bool overwrite) +{ + char *estring; + size_t esize; + int ret = -1; + debug_decl(sudo_setenv2, SUDOERS_DEBUG_ENV); + + esize = strlen(var) + 1 + strlen(val) + 1; + if ((estring = malloc(esize)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_int(-1); + } + + /* Build environment string and insert it. */ + if (strlcpy(estring, var, esize) >= esize || + strlcat(estring, "=", esize) >= esize || + strlcat(estring, val, esize) >= esize) { + + sudo_warnx(U_("internal error, %s overflow"), __func__); + errno = EOVERFLOW; + } else { + ret = sudo_putenv(estring, dupcheck, overwrite); + } + if (ret == -1) + free(estring); + else + sudoers_gc_add(GC_PTR, estring); + debug_return_int(ret); +} + +/* + * Similar to setenv(3) but operates on a private copy of the environment. + */ +int +sudo_setenv(const char *var, const char *val, int overwrite) +{ + return sudo_setenv2(var, val, true, (bool)overwrite); +} + +/* + * Similar to setenv(3) but operates on a private copy of the environment. + * Does not include warnings or debugging to avoid recursive calls. + */ +static int +sudo_setenv_nodebug(const char *var, const char *val, int overwrite) +{ + char *ep, *estring = NULL; + const char *cp; + size_t esize; + int ret = -1; + + if (var == NULL || *var == '\0') { + errno = EINVAL; + goto done; + } + + /* + * POSIX says a var name with '=' is an error but BSD + * just ignores the '=' and anything after it. + */ + for (cp = var; *cp && *cp != '='; cp++) + continue; + esize = (size_t)(cp - var) + 2; + if (val) { + esize += strlen(val); /* glibc treats a NULL val as "" */ + } + + /* Allocate and fill in estring. */ + if ((estring = ep = malloc(esize)) == NULL) + goto done; + for (cp = var; *cp && *cp != '='; cp++) + *ep++ = *cp; + *ep++ = '='; + if (val) { + for (cp = val; *cp; cp++) + *ep++ = *cp; + } + *ep = '\0'; + + ret = sudo_putenv_nodebug(estring, true, overwrite); +done: + if (ret == -1) + free(estring); + else + sudoers_gc_add(GC_PTR, estring); + return ret; +} + +/* + * Similar to unsetenv(3) but operates on a private copy of the environment. + * Does not include warnings or debugging to avoid recursive calls. + */ +static int +sudo_unsetenv_nodebug(const char *var) +{ + char **ep = env.envp; + size_t len; + + if (ep == NULL || var == NULL || *var == '\0' || strchr(var, '=') != NULL) { + errno = EINVAL; + return -1; + } + + len = strlen(var); + while (*ep != NULL) { + if (strncmp(var, *ep, len) == 0 && (*ep)[len] == '=') { + /* Found it; shift remainder + NULL over by one. */ + char **cur = ep; + while ((*cur = *(cur + 1)) != NULL) + cur++; + env.env_len--; + /* Keep going, could be multiple instances of the var. */ + } else { + ep++; + } + } + return 0; +} + +/* + * Similar to unsetenv(3) but operates on a private copy of the environment. + */ +int +sudo_unsetenv(const char *name) +{ + int ret; + debug_decl(sudo_unsetenv, SUDOERS_DEBUG_ENV); + + sudo_debug_printf(SUDO_DEBUG_INFO, "sudo_unsetenv: %s", name); + + ret = sudo_unsetenv_nodebug(name); + + debug_return_int(ret); +} + +/* + * Similar to getenv(3) but operates on a private copy of the environment. + * Does not include warnings or debugging to avoid recursive calls. + */ +static char * +sudo_getenv_nodebug(const char *name) +{ + char **ep, *val = NULL; + size_t namelen = 0; + + if (env.env_len != 0) { + /* For BSD compatibility, treat '=' in name like end of string. */ + while (name[namelen] != '\0' && name[namelen] != '=') + namelen++; + for (ep = env.envp; *ep != NULL; ep++) { + if (strncmp(*ep, name, namelen) == 0 && (*ep)[namelen] == '=') { + val = *ep + namelen + 1; + break; + } + } + } + return val; +} + +/* + * Similar to getenv(3) but operates on a private copy of the environment. + */ +char * +sudo_getenv(const char *name) +{ + char *val; + debug_decl(sudo_getenv, SUDOERS_DEBUG_ENV); + + sudo_debug_printf(SUDO_DEBUG_INFO, "sudo_getenv: %s", name); + + val = sudo_getenv_nodebug(name); + + debug_return_str(val); +} + +/* + * Check for var against patterns in the specified environment list. + * Returns true if the variable was found, else false. + */ +static bool +matches_env_list(const char *var, struct list_members *list, bool *full_match) +{ + struct list_member *cur; + bool is_logname = false; + debug_decl(matches_env_list, SUDOERS_DEBUG_ENV); + + switch (*var) { + case 'L': + if (strncmp(var, "LOGNAME=", 8) == 0) + is_logname = true; +#ifdef _AIX + else if (strncmp(var, "LOGIN=", 6) == 0) + is_logname = true; +#endif + break; + case 'U': + if (strncmp(var, "USER=", 5) == 0) + is_logname = true; + break; + } + + if (is_logname) { + /* + * We treat LOGIN, LOGNAME and USER specially. + * If one is preserved/deleted we want to preserve/delete them all. + */ + SLIST_FOREACH(cur, list, entries) { + if (matches_env_pattern(cur->value, "LOGNAME", full_match) || +#ifdef _AIX + matches_env_pattern(cur->value, "LOGIN", full_match) || +#endif + matches_env_pattern(cur->value, "USER", full_match)) + debug_return_bool(true); + } + } else { + SLIST_FOREACH(cur, list, entries) { + if (matches_env_pattern(cur->value, var, full_match)) + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +/* + * Check the env_delete blocklist. + * Returns true if the variable was found, else false. + */ +static bool +matches_env_delete(const char *var) +{ + bool full_match; /* unused */ + debug_decl(matches_env_delete, SUDOERS_DEBUG_ENV); + + /* Skip anything listed in env_delete. */ + debug_return_bool(matches_env_list(var, &def_env_delete, &full_match)); +} + +/* + * Verify the TZ environment variable is safe. + * On many systems it is possible to set this to a pathname. + */ +static bool +tz_is_safe(const char *tzval) +{ + const char *cp; + char lastch; + debug_decl(tz_is_safe, SUDOERS_DEBUG_ENV); + + /* tzcode treats a value beginning with a ':' as a path. */ + if (tzval[0] == ':') + tzval++; + + /* Reject fully-qualified TZ that doesn't being with the zoneinfo dir. */ + if (tzval[0] == '/') { +#ifdef _PATH_ZONEINFO + if (strncmp(tzval, _PATH_ZONEINFO, sizeof(_PATH_ZONEINFO) - 1) != 0 || + tzval[sizeof(_PATH_ZONEINFO) - 1] != '/') + debug_return_bool(false); +#else + /* Assume the worst. */ + debug_return_bool(false); +#endif + } + + /* + * Make sure TZ only contains printable non-space characters + * and does not contain a '..' path element. + */ + lastch = '/'; + for (cp = tzval; *cp != '\0'; cp++) { + if (isspace((unsigned char)*cp) || !isprint((unsigned char)*cp)) + debug_return_bool(false); + if (lastch == '/' && cp[0] == '.' && cp[1] == '.' && + (cp[2] == '/' || cp[2] == '\0')) + debug_return_bool(false); + lastch = *cp; + } + + /* Reject extra long TZ values (even if not a path). */ + if ((size_t)(cp - tzval) >= PATH_MAX) + debug_return_bool(false); + + debug_return_bool(true); +} + +/* + * Apply the env_check list. + * Returns true if the variable is allowed, false if denied + * or -1 if no match. + */ +static int +matches_env_check(const char *var, bool *full_match) +{ + int keepit = -1; + debug_decl(matches_env_check, SUDOERS_DEBUG_ENV); + + /* Skip anything listed in env_check that includes '/' or '%'. */ + if (matches_env_list(var, &def_env_check, full_match)) { + if (strncmp(var, "TZ=", 3) == 0) { + /* Special case for TZ */ + keepit = tz_is_safe(var + 3); + } else { + const char *val = strchr(var, '='); + if (val != NULL) + keepit = !strpbrk(++val, "/%"); + } + } + debug_return_int(keepit); +} + +/* + * Check the env_keep list. + * Returns true if the variable is allowed else false. + */ +static bool +matches_env_keep(const char *var, bool *full_match) +{ + bool keepit = false; + debug_decl(matches_env_keep, SUDOERS_DEBUG_ENV); + + /* Preserve SHELL variable for "sudo -s". */ + if (ISSET(sudo_mode, MODE_SHELL) && strncmp(var, "SHELL=", 6) == 0) { + keepit = true; + } else if (matches_env_list(var, &def_env_keep, full_match)) { + keepit = true; + } + debug_return_bool(keepit); +} + +/* + * Look up var in the env_delete and env_check. + * Returns true if we should delete the variable, else false. + */ +static bool +env_should_delete(const char *var) +{ + int delete_it; + bool full_match = false; + debug_decl(env_should_delete, SUDOERS_DEBUG_ENV); + + delete_it = matches_env_delete(var); + if (!delete_it) + delete_it = matches_env_check(var, &full_match) == false; + + sudo_debug_printf(SUDO_DEBUG_INFO, "delete %s: %s", + var, delete_it ? "YES" : "NO"); + debug_return_bool(delete_it); +} + +/* + * Lookup var in the env_check and env_keep lists. + * Returns true if the variable is allowed else false. + */ +static bool +env_should_keep(const char *var) +{ + int keepit; + bool full_match = false; + const char *cp; + debug_decl(env_should_keep, SUDOERS_DEBUG_ENV); + + keepit = matches_env_check(var, &full_match); + if (keepit == -1) + keepit = matches_env_keep(var, &full_match); + + /* Skip bash functions unless we matched on the value as well as name. */ + if (keepit && !full_match) { + if ((cp = strchr(var, '=')) != NULL) { + if (strncmp(cp, "=() ", 4) == 0) + keepit = false; + } + } + sudo_debug_printf(SUDO_DEBUG_INFO, "keep %s: %s", + var, keepit == true ? "YES" : "NO"); + debug_return_bool(keepit == true); +} + +#ifdef HAVE_PAM +/* + * Merge another environment with our private copy. + * Only overwrite an existing variable if it is not + * being preserved from the user's environment. + * Returns true on success or false on failure. + */ +bool +env_merge(char * const envp[]) +{ + char * const *ep; + bool ret = true; + debug_decl(env_merge, SUDOERS_DEBUG_ENV); + + for (ep = envp; *ep != NULL; ep++) { + /* XXX - avoid checking value here, should only check name */ + bool overwrite = def_env_reset ? !env_should_keep(*ep) : env_should_delete(*ep); + if (sudo_putenv(*ep, true, overwrite) == -1) { + /* XXX cannot undo on failure */ + ret = false; + break; + } + } + debug_return_bool(ret); +} +#endif /* HAVE_PAM */ + +static void +env_update_didvar(const char *ep, unsigned int *didvar) +{ + switch (*ep) { + case 'H': + if (strncmp(ep, "HOME=", 5) == 0) + SET(*didvar, DID_HOME); + break; + case 'L': +#ifdef _AIX + if (strncmp(ep, "LOGIN=", 8) == 0) + SET(*didvar, DID_LOGIN); +#endif + if (strncmp(ep, "LOGNAME=", 8) == 0) + SET(*didvar, DID_LOGNAME); + break; + case 'M': + if (strncmp(ep, "MAIL=", 5) == 0) + SET(*didvar, DID_MAIL); + break; + case 'P': + if (strncmp(ep, "PATH=", 5) == 0) + SET(*didvar, DID_PATH); + break; + case 'S': + if (strncmp(ep, "SHELL=", 6) == 0) + SET(*didvar, DID_SHELL); + break; + case 'T': + if (strncmp(ep, "TERM=", 5) == 0) + SET(*didvar, DID_TERM); + break; + case 'U': + if (strncmp(ep, "USER=", 5) == 0) + SET(*didvar, DID_USER); + break; + } +} + +#define CHECK_PUTENV(a, b, c) do { \ + if (sudo_putenv((a), (b), (c)) == -1) { \ + goto bad; \ + } \ +} while (0) + +#define CHECK_SETENV2(a, b, c, d) do { \ + if (sudo_setenv2((a), (b), (c), (d)) == -1) { \ + goto bad; \ + } \ +} while (0) + +/* + * Build a new environment and either clear potentially dangerous + * variables from the old one or start with a clean slate. + * Also adds sudo-specific variables (SUDO_*). + * Returns true on success or false on failure. + */ +bool +rebuild_env(void) +{ + char **ep, *cp, *ps1; + char idbuf[MAX_UID_T_LEN + 1]; + unsigned int didvar; + bool reset_home = false; + debug_decl(rebuild_env, SUDOERS_DEBUG_ENV); + + /* + * Either clean out the environment or reset to a safe default. + */ + ps1 = NULL; + didvar = 0; + env.env_len = 0; + env.env_size = 128; + free(env.old_envp); + env.old_envp = env.envp; + env.envp = reallocarray(NULL, env.env_size, sizeof(char *)); + if (env.envp == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + env.env_size = 0; + goto bad; + } +#ifdef ENV_DEBUG + memset(env.envp, 0, env.env_size * sizeof(char *)); +#else + env.envp[0] = NULL; +#endif + + /* Reset HOME based on target user if configured to. */ + if (ISSET(sudo_mode, MODE_RUN)) { + if (def_always_set_home || + ISSET(sudo_mode, MODE_RESET_HOME | MODE_LOGIN_SHELL) || + (ISSET(sudo_mode, MODE_SHELL) && def_set_home)) + reset_home = true; + } + + if (def_env_reset || ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + /* + * If starting with a fresh environment, initialize it based on + * /etc/environment or login.conf. For "sudo -i" we want those + * variables to override the invoking user's environment, so we + * defer reading them until later. + */ + if (!ISSET(sudo_mode, MODE_LOGIN_SHELL)) { +#ifdef HAVE_LOGIN_CAP_H + /* Insert login class environment variables. */ + if (login_class) { + login_cap_t *lc = login_getclass(login_class); + if (lc != NULL) { + setusercontext(lc, runas_pw, runas_pw->pw_uid, + LOGIN_SETPATH|LOGIN_SETENV); + login_close(lc); + } + } +#endif /* HAVE_LOGIN_CAP_H */ +#if defined(_AIX) || (defined(__linux__) && !defined(HAVE_PAM)) + /* Insert system-wide environment variables. */ + if (!read_env_file(_PATH_ENVIRONMENT, true, false)) + sudo_warn("%s", _PATH_ENVIRONMENT); +#endif + for (ep = env.envp; *ep; ep++) + env_update_didvar(*ep, &didvar); + } + + /* Pull in vars we want to keep from the old environment. */ + for (ep = env.old_envp; *ep; ep++) { + bool keepit; + + /* + * Look up the variable in the env_check and env_keep lists. + */ + keepit = env_should_keep(*ep); + + /* + * Do SUDO_PS1 -> PS1 conversion. + * This must happen *after* env_should_keep() is called. + */ + if (strncmp(*ep, "SUDO_PS1=", 9) == 0) + ps1 = *ep + 5; + + if (keepit) { + /* Preserve variable. */ + CHECK_PUTENV(*ep, true, false); + env_update_didvar(*ep, &didvar); + } + } + didvar |= didvar << 16; /* convert DID_* to KEPT_* */ + + /* + * Add in defaults. In -i mode these come from the runas user, + * otherwise they may be from the user's environment (depends + * on sudoers options). + */ + if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + CHECK_SETENV2("SHELL", runas_pw->pw_shell, + ISSET(didvar, DID_SHELL), true); +#ifdef _AIX + CHECK_SETENV2("LOGIN", runas_pw->pw_name, + ISSET(didvar, DID_LOGIN), true); +#endif + CHECK_SETENV2("LOGNAME", runas_pw->pw_name, + ISSET(didvar, DID_LOGNAME), true); + CHECK_SETENV2("USER", runas_pw->pw_name, + ISSET(didvar, DID_USER), true); + } else { + /* We will set LOGNAME later in the def_set_logname case. */ + if (!def_set_logname) { +#ifdef _AIX + if (!ISSET(didvar, DID_LOGIN)) + CHECK_SETENV2("LOGIN", user_name, false, true); +#endif + if (!ISSET(didvar, DID_LOGNAME)) + CHECK_SETENV2("LOGNAME", user_name, false, true); + if (!ISSET(didvar, DID_USER)) + CHECK_SETENV2("USER", user_name, false, true); + } + } + + /* If we didn't keep HOME, reset it based on target user. */ + if (!ISSET(didvar, KEPT_HOME)) + reset_home = true; + + /* + * Set MAIL to target user in -i mode or if MAIL is not preserved + * from user's environment. + */ + if (ISSET(sudo_mode, MODE_LOGIN_SHELL) || !ISSET(didvar, KEPT_MAIL)) { + if (_PATH_MAILDIR[sizeof(_PATH_MAILDIR) - 2] == '/') { + if (asprintf(&cp, "MAIL=%s%s", _PATH_MAILDIR, runas_pw->pw_name) == -1) + goto bad; + } else { + if (asprintf(&cp, "MAIL=%s/%s", _PATH_MAILDIR, runas_pw->pw_name) == -1) + goto bad; + } + if (sudo_putenv(cp, ISSET(didvar, DID_MAIL), true) == -1) { + free(cp); + goto bad; + } + sudoers_gc_add(GC_PTR, cp); + } + } else { + /* + * Copy environ entries as long as they don't match env_delete or + * env_check. + */ + for (ep = env.old_envp; *ep; ep++) { + /* Add variable unless it matches a black list. */ + if (!env_should_delete(*ep)) { + if (strncmp(*ep, "SUDO_PS1=", 9) == 0) + ps1 = *ep + 5; + else if (strncmp(*ep, "SHELL=", 6) == 0) + SET(didvar, DID_SHELL); + else if (strncmp(*ep, "PATH=", 5) == 0) + SET(didvar, DID_PATH); + else if (strncmp(*ep, "TERM=", 5) == 0) + SET(didvar, DID_TERM); + CHECK_PUTENV(*ep, true, false); + } + } + } + /* Replace the PATH envariable with a secure one? */ + if (def_secure_path && !user_is_exempt()) { + CHECK_SETENV2("PATH", def_secure_path, true, true); + SET(didvar, DID_PATH); + } + + /* + * Set LOGIN, LOGNAME, and USER to target if "set_logname" is not + * disabled. We skip this if we are running a login shell (because + * they have already been set). + */ + if (def_set_logname && !ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + if ((didvar & KEPT_USER_VARIABLES) == 0) { + /* Nothing preserved, set them all. */ +#ifdef _AIX + CHECK_SETENV2("LOGIN", runas_pw->pw_name, true, true); +#endif + CHECK_SETENV2("LOGNAME", runas_pw->pw_name, true, true); + CHECK_SETENV2("USER", runas_pw->pw_name, true, true); + } else if ((didvar & KEPT_USER_VARIABLES) != KEPT_USER_VARIABLES) { + /* + * Preserved some of LOGIN, LOGNAME, USER but not all. + * Make the unset ones match so we don't end up with some + * set to the invoking user and others set to the runas user. + */ + if (ISSET(didvar, KEPT_LOGNAME)) + cp = sudo_getenv("LOGNAME"); +#ifdef _AIX + else if (ISSET(didvar, KEPT_LOGIN)) + cp = sudo_getenv("LOGIN"); +#endif + else if (ISSET(didvar, KEPT_USER)) + cp = sudo_getenv("USER"); + else + cp = NULL; + if (cp != NULL) { +#ifdef _AIX + if (!ISSET(didvar, KEPT_LOGIN)) + CHECK_SETENV2("LOGIN", cp, true, true); +#endif + if (!ISSET(didvar, KEPT_LOGNAME)) + CHECK_SETENV2("LOGNAME", cp, true, true); + if (!ISSET(didvar, KEPT_USER)) + CHECK_SETENV2("USER", cp, true, true); + } + } + } + + /* Set $HOME to target user if not preserving user's value. */ + if (reset_home) + CHECK_SETENV2("HOME", runas_pw->pw_dir, true, true); + + /* Provide default values for $SHELL, $TERM and $PATH if not set. */ + if (!ISSET(didvar, DID_SHELL)) + CHECK_SETENV2("SHELL", runas_pw->pw_shell, false, false); + if (!ISSET(didvar, DID_TERM)) + CHECK_PUTENV("TERM=unknown", false, false); + if (!ISSET(didvar, DID_PATH)) + CHECK_SETENV2("PATH", _PATH_STDPATH, false, true); + + /* Set PS1 if SUDO_PS1 is set. */ + if (ps1 != NULL) + CHECK_PUTENV(ps1, true, true); + + /* Add the SUDO_COMMAND envariable (cmnd + args). */ + if (user_args) { + /* + * We limit user_args to 4096 bytes to avoid an execve() failure + * for very long argument vectors. The command's environment also + * counts against the ARG_MAX limit. + */ + if (asprintf(&cp, "SUDO_COMMAND=%s %.*s", user_cmnd, 4096, user_args) == -1) + goto bad; + if (sudo_putenv(cp, true, true) == -1) { + free(cp); + goto bad; + } + sudoers_gc_add(GC_PTR, cp); + } else { + CHECK_SETENV2("SUDO_COMMAND", user_cmnd, true, true); + } + + /* Add the SUDO_USER, SUDO_UID, SUDO_GID environment variables. */ + CHECK_SETENV2("SUDO_USER", user_name, true, true); + (void)snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_uid); + CHECK_SETENV2("SUDO_UID", idbuf, true, true); + (void)snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_gid); + CHECK_SETENV2("SUDO_GID", idbuf, true, true); + + debug_return_bool(true); + +bad: + sudo_warn("%s", U_("unable to rebuild the environment")); + debug_return_bool(false); +} + +/* + * Insert all environment variables in envp into the private copy + * of the environment. + * Returns true on success or false on failure. + */ +bool +insert_env_vars(char * const envp[]) +{ + char * const *ep; + bool ret = true; + debug_decl(insert_env_vars, SUDOERS_DEBUG_ENV); + + /* Add user-specified environment variables. */ + if (envp != NULL) { + for (ep = envp; *ep != NULL; ep++) { + /* XXX - no undo on failure */ + if (sudo_putenv(*ep, true, true) == -1) { + ret = false; + break; + } + } + } + debug_return_bool(ret); +} + +/* + * Validate the list of environment variables passed in on the command + * line against env_delete, env_check, and env_keep. + * Calls log_warning() if any specified variables are not allowed. + * Returns true if allowed, else false. + */ +bool +validate_env_vars(char * const env_vars[]) +{ + char * const *ep; + char *eq, errbuf[4096]; + bool okvar, ret = true; + debug_decl(validate_env_vars, SUDOERS_DEBUG_ENV); + + if (env_vars == NULL) + debug_return_bool(true); /* nothing to do */ + + /* Add user-specified environment variables. */ + errbuf[0] = '\0'; + for (ep = env_vars; *ep != NULL; ep++) { + if (def_secure_path && !user_is_exempt() && + strncmp(*ep, "PATH=", 5) == 0) { + okvar = false; + } else if (def_env_reset) { + okvar = env_should_keep(*ep); + } else { + okvar = !env_should_delete(*ep); + } + if (okvar == false) { + /* Not allowed, add to error string, allocating as needed. */ + if ((eq = strchr(*ep, '=')) != NULL) + *eq = '\0'; + if (errbuf[0] != '\0') + (void)strlcat(errbuf, ", ", sizeof(errbuf)); + if (strlcat(errbuf, *ep, sizeof(errbuf)) >= sizeof(errbuf)) { + errbuf[sizeof(errbuf) - 4] = '\0'; + (void)strlcat(errbuf, "...", sizeof(errbuf)); + } + if (eq != NULL) + *eq = '='; + } + } + if (errbuf[0] != '\0') { + /* XXX - audit? */ + log_warningx(0, + N_("sorry, you are not allowed to set the following environment variables: %s"), errbuf); + ret = false; + } + debug_return_bool(ret); +} + +static void * +env_file_open_local(const char *path) +{ + struct env_file_local *efl; + debug_decl(env_file_open_local, SUDOERS_DEBUG_ENV); + + efl = calloc(1, sizeof(*efl)); + if (efl != NULL) { + if ((efl->fp = fopen(path, "r")) == NULL) { + if (errno != ENOENT) { + free(efl); + efl = NULL; + } + } + } + debug_return_ptr(efl); +} + +static void +env_file_close_local(void *cookie) +{ + struct env_file_local *efl = cookie; + debug_decl(env_file_close_local, SUDOERS_DEBUG_ENV); + + if (efl != NULL) { + if (efl->fp != NULL) + fclose(efl->fp); + free(efl->line); + free(efl); + } + debug_return; +} + +/* + * Parse /etc/environment lines ala AIX and Linux. + * Lines may be in either of three formats: + * NAME=VALUE + * NAME="VALUE" + * NAME='VALUE' + * with an optional "export" prefix so the shell can source the file. + * Invalid lines, blank lines, or lines consisting solely of a comment + * character are skipped. + */ +static char * +env_file_next_local(void *cookie, int *errnum) +{ + struct env_file_local *efl = cookie; + char *var, *val, *ret = NULL; + size_t var_len, val_len; + debug_decl(env_file_next_local, SUDOERS_DEBUG_ENV); + + *errnum = 0; + if (efl->fp == NULL) + debug_return_ptr(NULL); + + for (;;) { + if (sudo_parseln(&efl->line, &efl->linesize, NULL, efl->fp, PARSELN_CONT_IGN) == -1) { + if (!feof(efl->fp)) + *errnum = errno; + break; + } + + /* Skip blank or comment lines */ + if (*(var = efl->line) == '\0') + continue; + + /* Skip optional "export " */ + if (strncmp(var, "export", 6) == 0 && isspace((unsigned char) var[6])) { + var += 7; + while (isspace((unsigned char) *var)) { + var++; + } + } + + /* Must be of the form name=["']value['"] */ + for (val = var; *val != '\0' && *val != '='; val++) + continue; + if (var == val || *val != '=') + continue; + var_len = (size_t)(val - var); + val_len = strlen(++val); + + /* Strip leading and trailing single/double quotes */ + if ((val[0] == '\'' || val[0] == '\"') && val[0] == val[val_len - 1]) { + val[val_len - 1] = '\0'; + val++; + val_len -= 2; + } + + if ((ret = malloc(var_len + 1 + val_len + 1)) == NULL) { + *errnum = errno; + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + } else { + memcpy(ret, var, var_len + 1); /* includes '=' */ + memcpy(ret + var_len + 1, val, val_len + 1); /* includes NUL */ + sudoers_gc_add(GC_PTR, ret); + } + break; + } + debug_return_str(ret); +} + +static struct sudoers_env_file env_file_sudoers = { + env_file_open_local, + env_file_close_local, + env_file_next_local +}; + +static struct sudoers_env_file env_file_system = { + env_file_open_local, + env_file_close_local, + env_file_next_local +}; + +void +register_env_file(void * (*ef_open)(const char *), void (*ef_close)(void *), + char * (*ef_next)(void *, int *), bool sys) +{ + struct sudoers_env_file *ef = sys ? &env_file_system : &env_file_sudoers; + + ef->open = ef_open; + ef->close = ef_close; + ef->next = ef_next; +} + +bool +read_env_file(const char *path, bool overwrite, bool restricted) +{ + struct sudoers_env_file *ef; + bool ret = true; + char *envstr; + void *cookie; + int errnum; + debug_decl(read_env_file, SUDOERS_DEBUG_ENV); + + /* + * The environment file may be handled differently depending on + * whether it is specified in sudoers or the system. + */ + if (path == def_env_file || path == def_restricted_env_file) + ef = &env_file_sudoers; + else + ef = &env_file_system; + + cookie = ef->open(path); + if (cookie == NULL) + debug_return_bool(false); + + for (;;) { + /* Keep reading until EOF or error. */ + if ((envstr = ef->next(cookie, &errnum)) == NULL) { + if (errnum != 0) + ret = false; + break; + } + + /* + * If the env file is restricted, apply env_check and env_keep + * when env_reset is set or env_delete when it is not. + */ + if (restricted) { + if (def_env_reset ? !env_should_keep(envstr) : env_should_delete(envstr)) { + free(envstr); + continue; + } + } + if (sudo_putenv(envstr, true, overwrite) == -1) { + /* XXX - no undo on failure */ + ret = false; + break; + } + } + ef->close(cookie); + + debug_return_bool(ret); +} + +bool +init_envtables(void) +{ + struct list_member *cur; + const char **p; + debug_decl(init_envtables, SUDOERS_DEBUG_ENV); + + /* Fill in the "env_delete" list. */ + for (p = initial_badenv_table; *p; p++) { + cur = calloc(1, sizeof(struct list_member)); + if (cur == NULL || (cur->value = strdup(*p)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(cur); + debug_return_bool(false); + } + SLIST_INSERT_HEAD(&def_env_delete, cur, entries); + } + + /* Fill in the "env_check" list. */ + for (p = initial_checkenv_table; *p; p++) { + cur = calloc(1, sizeof(struct list_member)); + if (cur == NULL || (cur->value = strdup(*p)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(cur); + debug_return_bool(false); + } + SLIST_INSERT_HEAD(&def_env_check, cur, entries); + } + + /* Fill in the "env_keep" list. */ + for (p = initial_keepenv_table; *p; p++) { + cur = calloc(1, sizeof(struct list_member)); + if (cur == NULL || (cur->value = strdup(*p)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(cur); + debug_return_bool(false); + } + SLIST_INSERT_HEAD(&def_env_keep, cur, entries); + } + debug_return_bool(true); +} + +int +sudoers_hook_getenv(const char *name, char **value, void *closure) +{ + static bool in_progress = false; /* avoid recursion */ + + if (in_progress || env.envp == NULL) + return SUDO_HOOK_RET_NEXT; + + in_progress = true; + + /* Hack to make GNU gettext() find the sudoers locale when needed. */ + if (*name == 'L' && sudoers_getlocale() == SUDOERS_LOCALE_SUDOERS) { + if (strcmp(name, "LANGUAGE") == 0 || strcmp(name, "LANG") == 0) { + *value = NULL; + goto done; + } + if (strcmp(name, "LC_ALL") == 0 || strcmp(name, "LC_MESSAGES") == 0) { + *value = def_sudoers_locale; + goto done; + } + } + + *value = sudo_getenv_nodebug(name); +done: + in_progress = false; + return SUDO_HOOK_RET_STOP; +} + +int +sudoers_hook_putenv(char *string, void *closure) +{ + static bool in_progress = false; /* avoid recursion */ + + if (in_progress || env.envp == NULL) + return SUDO_HOOK_RET_NEXT; + + in_progress = true; + sudo_putenv_nodebug(string, true, true); + in_progress = false; + return SUDO_HOOK_RET_STOP; +} + +int +sudoers_hook_setenv(const char *name, const char *value, int overwrite, void *closure) +{ + static bool in_progress = false; /* avoid recursion */ + + if (in_progress || env.envp == NULL) + return SUDO_HOOK_RET_NEXT; + + in_progress = true; + sudo_setenv_nodebug(name, value, overwrite); + in_progress = false; + return SUDO_HOOK_RET_STOP; +} + +int +sudoers_hook_unsetenv(const char *name, void *closure) +{ + static bool in_progress = false; /* avoid recursion */ + + if (in_progress || env.envp == NULL) + return SUDO_HOOK_RET_NEXT; + + in_progress = true; + sudo_unsetenv_nodebug(name); + in_progress = false; + return SUDO_HOOK_RET_STOP; +} diff --git a/plugins/sudoers/env_pattern.c b/plugins/sudoers/env_pattern.c new file mode 100644 index 0000000..d1b9a1b --- /dev/null +++ b/plugins/sudoers/env_pattern.c @@ -0,0 +1,93 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include + +#include "sudoers.h" + +/* extern for regress tests */ +bool +matches_env_pattern(const char *pattern, const char *var, bool *full_match) +{ + size_t len, sep_pos; + bool iswild = false, match = false; + bool saw_sep = false; + const char *cp; + debug_decl(matches_env_pattern, SUDOERS_DEBUG_ENV); + + /* Locate position of the '=' separator in var=value. */ + sep_pos = strcspn(var, "="); + + /* Locate '*' wildcard and compute len. */ + for (cp = pattern; *cp != '\0'; cp++) { + if (*cp == '*') { + iswild = true; + break; + } + } + len = (size_t)(cp - pattern); + + if (iswild) { + /* Match up to the '*' wildcard. */ + if (strncmp(pattern, var, len) == 0) { + while (*cp != '\0') { + if (*cp == '*') { + /* Collapse sequential '*'s */ + do { + cp++; + } while (*cp == '*'); + /* A '*' at the end of a pattern matches anything. */ + if (*cp == '\0') { + match = true; + break; + } + /* Keep track of whether we matched an equal sign. */ + if (*cp == '=') + saw_sep = true; + /* Look for first match of text after the '*' */ + while ((saw_sep || len != sep_pos) && + var[len] != '\0' && var[len] != *cp) + len++; + } + if (var[len] != *cp) + break; + cp++; + len++; + } + if (*cp == '\0' && (len == sep_pos || var[len] == '\0')) + match = true; + } + } else { + if (strncmp(pattern, var, len) == 0 && + (len == sep_pos || var[len] == '\0')) { + match = true; + } + } + if (match) + *full_match = len > sep_pos + 1; + debug_return_bool(match); +} diff --git a/plugins/sudoers/exptilde.c b/plugins/sudoers/exptilde.c new file mode 100644 index 0000000..4a21a32 --- /dev/null +++ b/plugins/sudoers/exptilde.c @@ -0,0 +1,99 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "pwutil.h" + +/* + * Expand leading tilde in *path, which must be dynamically allocated. + * Replaces path with the expanded version as needed, freeing the old one. + * Returns true on success, false on failure. + */ +bool +expand_tilde(char **path, const char *user) +{ + char *npath, *opath = *path; + char *slash = NULL; + struct passwd *pw; + int len; + debug_decl(expand_tilde, SUDOERS_DEBUG_UTIL); + + switch (*opath++) { + case '/': + /* A fully-qualified path, nothing to do. */ + debug_return_bool(true); + case '~': + /* See below. */ + break; + default: + /* Not a fully-qualified path or one that starts with a tilde. */ + debug_return_bool(false); + } + + switch (*opath) { + case '\0': + /* format: ~ */ + break; + case '/': + /* format: ~/foo */ + opath++; + break; + default: + /* format: ~user/foo */ + user = opath; + slash = strchr(opath, '/'); + if (slash != NULL) { + *slash = '\0'; + opath = slash + 1; + } else { + opath = ""; + } + } + pw = sudo_getpwnam(user); + if (slash != NULL) + *slash = '/'; + if (pw == NULL) { + /* Unknown user. */ + sudo_warnx(U_("unknown user: %s"), user); + debug_return_bool(false); + } + + len = asprintf(&npath, "%s%s%s", pw->pw_dir, slash ? "/" : "", opath); + sudo_pw_delref(pw); + if (len == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + + free(*path); + *path = npath; + debug_return_bool(true); +} diff --git a/plugins/sudoers/file.c b/plugins/sudoers/file.c new file mode 100644 index 0000000..5b12b8f --- /dev/null +++ b/plugins/sudoers/file.c @@ -0,0 +1,152 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include "sudoers.h" +#include "parse.h" +#include "sudo_lbuf.h" +#include + +struct sudo_file_handle { + FILE *fp; + struct sudoers_parse_tree parse_tree; +}; + +static int +sudo_file_close(struct sudo_nss *nss) +{ + debug_decl(sudo_file_close, SUDOERS_DEBUG_NSS); + struct sudo_file_handle *handle = nss->handle; + + if (handle != NULL) { + fclose(handle->fp); + sudoersin = NULL; + + free_parse_tree(&handle->parse_tree); + free(handle); + nss->handle = NULL; + } + + debug_return_int(0); +} + +static int +sudo_file_open(struct sudo_nss *nss) +{ + debug_decl(sudo_file_open, SUDOERS_DEBUG_NSS); + struct sudo_file_handle *handle; + + if (def_ignore_local_sudoers) + debug_return_int(-1); + + if (nss->handle != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with non-NULL handle %p", __func__, nss->handle); + sudo_file_close(nss); + } + + handle = malloc(sizeof(*handle)); + if (handle != NULL) { + handle->fp = open_sudoers(sudoers_file, false, NULL); + if (handle->fp != NULL) { + init_parse_tree(&handle->parse_tree, NULL, NULL); + } else { + free(handle); + handle = NULL; + } + } + nss->handle = handle; + debug_return_int(nss->handle ? 0 : -1); +} + +/* + * Parse and return the specified sudoers file. + */ +static struct sudoers_parse_tree * +sudo_file_parse(struct sudo_nss *nss) +{ + debug_decl(sudo_file_close, SUDOERS_DEBUG_NSS); + struct sudo_file_handle *handle = nss->handle; + int error; + + if (handle == NULL || handle->fp == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, "%s: called with NULL %s", + __func__, handle ? "file pointer" : "handle"); + debug_return_ptr(NULL); + } + + sudoersin = handle->fp; + error = sudoersparse(); + if (error || parse_error) { + if (errorlineno != -1) { + log_warningx(SLOG_SEND_MAIL|SLOG_NO_STDERR, + N_("parse error in %s near line %d"), errorfile, errorlineno); + } else { + log_warningx(SLOG_SEND_MAIL|SLOG_NO_STDERR, + N_("parse error in %s"), errorfile); + } + if (error || !sudoers_recovery) { + /* unrecoverable error */ + debug_return_ptr(NULL); + } + } + + /* Move parsed sudoers policy to nss handle. */ + reparent_parse_tree(&handle->parse_tree); + + debug_return_ptr(&handle->parse_tree); +} + +/* + * No need for explicit sudoers queries, the parse function handled it. + */ +static int +sudo_file_query(struct sudo_nss *nss, struct passwd *pw) +{ + debug_decl(sudo_file_query, SUDOERS_DEBUG_NSS); + debug_return_int(0); +} + +/* + * No need to get defaults for sudoers file, the parse function handled it. + */ +static int +sudo_file_getdefs(struct sudo_nss *nss) +{ + debug_decl(sudo_file_getdefs, SUDOERS_DEBUG_NSS); + debug_return_int(0); +} + +/* sudo_nss implementation */ +struct sudo_nss sudo_nss_file = { + { NULL, NULL }, + sudo_file_open, + sudo_file_close, + sudo_file_parse, + sudo_file_query, + sudo_file_getdefs +}; diff --git a/plugins/sudoers/filedigest.c b/plugins/sudoers/filedigest.c new file mode 100644 index 0000000..24807aa --- /dev/null +++ b/plugins/sudoers/filedigest.c @@ -0,0 +1,92 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_digest.h" + +unsigned char * +sudo_filedigest(int fd, const char *file, int digest_type, size_t *digest_len) +{ + unsigned char *file_digest = NULL; + unsigned char buf[32 * 1024]; + struct sudo_digest *dig = NULL; + FILE *fp = NULL; + size_t nread; + int fd2; + debug_decl(sudo_filedigest, SUDOERS_DEBUG_UTIL); + + *digest_len = sudo_digest_getlen(digest_type); + if (*digest_len == (size_t)-1) { + sudo_warnx(U_("unsupported digest type %d for %s"), digest_type, file); + goto bad; + } + + if ((dig = sudo_digest_alloc(digest_type)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + + if ((fd2 = dup(fd)) == -1) { + sudo_debug_printf(SUDO_DEBUG_INFO, "unable to dup %s: %s", + file, strerror(errno)); + goto bad; + } + if ((fp = fdopen(fd2, "r")) == NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, "unable to fdopen %s: %s", + file, strerror(errno)); + close(fd2); + goto bad; + } + if ((file_digest = malloc(*digest_len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + + while ((nread = fread(buf, 1, sizeof(buf), fp)) != 0) { + sudo_digest_update(dig, buf, nread); + } + if (ferror(fp)) { + sudo_warnx(U_("%s: read error"), file); + goto bad; + } + sudo_digest_final(dig, file_digest); + sudo_digest_free(dig); + fclose(fp); + + debug_return_ptr(file_digest); +bad: + sudo_digest_free(dig); + free(file_digest); + if (fp != NULL) + fclose(fp); + debug_return_ptr(NULL); +} diff --git a/plugins/sudoers/find_path.c b/plugins/sudoers/find_path.c new file mode 100644 index 0000000..5c44b4f --- /dev/null +++ b/plugins/sudoers/find_path.c @@ -0,0 +1,172 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2010-2015, 2017-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" + +/* + * Check the given command against the specified allowlist (NULL-terminated). + * On success, rewrites cmnd based on the allowlist and returns true. + * On failure, returns false. + */ +static bool +cmnd_allowed(char *cmnd, size_t cmnd_size, const char *runchroot, + struct stat *cmnd_sbp, char * const *allowlist) +{ + const char *cmnd_base; + char * const *al; + debug_decl(cmnd_allowed, SUDOERS_DEBUG_UTIL); + + if (!sudo_goodpath(cmnd, runchroot, cmnd_sbp)) + debug_return_bool(false); + + if (allowlist == NULL) + debug_return_bool(true); /* nothing to check */ + + /* We compare the base names to avoid excessive stat()ing. */ + if ((cmnd_base = strrchr(cmnd, '/')) == NULL) + debug_return_bool(false); /* can't happen */ + cmnd_base++; + + for (al = allowlist; *al != NULL; al++) { + const char *base, *path = *al; + struct stat sb; + + if ((base = strrchr(path, '/')) == NULL) + continue; /* XXX - warn? */ + base++; + + if (strcmp(cmnd_base, base) != 0) + continue; + + if (sudo_goodpath(path, runchroot, &sb) && + sb.st_dev == cmnd_sbp->st_dev && sb.st_ino == cmnd_sbp->st_ino) { + /* Overwrite cmnd with safe version from allowlist. */ + if (strlcpy(cmnd, path, cmnd_size) < cmnd_size) + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +/* + * This function finds the full pathname for a command and + * stores it in a statically allocated array, filling in a pointer + * to the array. Returns FOUND if the command was found, NOT_FOUND + * if it was not found, or NOT_FOUND_DOT if it would have been found + * but it is in '.' and IGNORE_DOT is set. + * The caller is responsible for freeing the output file. + */ +int +find_path(const char *infile, char **outfile, struct stat *sbp, + const char *path, const char *runchroot, int ignore_dot, + char * const *allowlist) +{ + char command[PATH_MAX]; + const char *cp, *ep, *pathend; + bool found = false; + bool checkdot = false; + int len; + debug_decl(find_path, SUDOERS_DEBUG_UTIL); + + /* + * If we were given a fully qualified or relative path + * there is no need to look at $PATH. + */ + if (strchr(infile, '/') != NULL) { + if (strlcpy(command, infile, sizeof(command)) >= sizeof(command)) { + errno = ENAMETOOLONG; + debug_return_int(NOT_FOUND_ERROR); + } + found = cmnd_allowed(command, sizeof(command), runchroot, sbp, + allowlist); + goto done; + } + + if (path == NULL) + debug_return_int(NOT_FOUND); + + pathend = path + strlen(path); + for (cp = sudo_strsplit(path, pathend, ":", &ep); cp != NULL; + cp = sudo_strsplit(NULL, pathend, ":", &ep)) { + + /* + * Search current dir last if it is in PATH. + * This will miss sneaky things like using './' or './/' (XXX) + */ + if (cp == ep || (*cp == '.' && cp + 1 == ep)) { + checkdot = 1; + continue; + } + + /* + * Resolve the path and exit the loop if found. + */ + len = snprintf(command, sizeof(command), "%.*s/%s", + (int)(ep - cp), cp, infile); + if (len < 0 || len >= ssizeof(command)) { + errno = ENAMETOOLONG; + debug_return_int(NOT_FOUND_ERROR); + } + found = cmnd_allowed(command, sizeof(command), runchroot, + sbp, allowlist); + if (found) + break; + } + + /* + * Check current dir if dot was in the PATH + */ + if (!found && checkdot) { + len = snprintf(command, sizeof(command), "./%s", infile); + if (len < 0 || len >= ssizeof(command)) { + errno = ENAMETOOLONG; + debug_return_int(NOT_FOUND_ERROR); + } + found = cmnd_allowed(command, sizeof(command), runchroot, + sbp, allowlist); + if (found && ignore_dot) + debug_return_int(NOT_FOUND_DOT); + } + +done: + if (found) { + if ((*outfile = strdup(command)) == NULL) + debug_return_int(NOT_FOUND_ERROR); + debug_return_int(FOUND); + } + debug_return_int(NOT_FOUND); +} diff --git a/plugins/sudoers/fmtsudoers.c b/plugins/sudoers/fmtsudoers.c new file mode 100644 index 0000000..07961a4 --- /dev/null +++ b/plugins/sudoers/fmtsudoers.c @@ -0,0 +1,478 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_lbuf.h" +#include + +/* + * Write the contents of a struct member to the lbuf. + * If alias_type is not UNSPEC, expand aliases using that type with + * the specified separator (which must not be NULL in the UNSPEC case). + */ +static bool +sudoers_format_member_int(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, char *name, int type, bool negated, + const char *separator, int alias_type) +{ + struct alias *a; + struct member *m; + struct sudo_command *c; + struct command_digest *digest; + debug_decl(sudoers_format_member_int, SUDOERS_DEBUG_UTIL); + + switch (type) { + case MYSELF: + sudo_lbuf_append(lbuf, "%s%s", negated ? "!" : "", + user_name ? user_name : ""); + break; + case ALL: + if (name == NULL) { + sudo_lbuf_append(lbuf, "%sALL", negated ? "!" : ""); + break; + } + FALLTHROUGH; + case COMMAND: + c = (struct sudo_command *) name; + TAILQ_FOREACH(digest, &c->digests, entries) { + sudo_lbuf_append(lbuf, "%s:%s%s ", + digest_type_to_name(digest->digest_type), + digest->digest_str, TAILQ_NEXT(digest, entries) ? "," : ""); + } + if (negated) + sudo_lbuf_append(lbuf, "!"); + sudo_lbuf_append_quoted(lbuf, SUDOERS_QUOTED" \t", "%s", + c->cmnd ? c->cmnd : "ALL"); + if (c->args) { + sudo_lbuf_append(lbuf, " "); + sudo_lbuf_append_quoted(lbuf, SUDOERS_QUOTED, "%s", c->args); + } + break; + case USERGROUP: + /* Special case for %#gid, %:non-unix-group, %:#non-unix-gid */ + if (strpbrk(name, " \t") == NULL) { + if (*++name == ':') { + name++; + sudo_lbuf_append(lbuf, "%s", "%:"); + } else { + sudo_lbuf_append(lbuf, "%s", "%"); + } + } + goto print_word; + case ALIAS: + if (alias_type != UNSPEC) { + if ((a = alias_get(parse_tree, name, alias_type)) != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + if (m != TAILQ_FIRST(&a->members)) + sudo_lbuf_append(lbuf, "%s", separator); + sudoers_format_member_int(lbuf, parse_tree, m->name, + m->type, negated ? !m->negated : m->negated, + separator, alias_type); + } + alias_put(a); + break; + } + } + FALLTHROUGH; + default: + print_word: + /* Do not quote UID/GID, all others get quoted. */ + if (name[0] == '#' && + name[strspn(name + 1, "0123456789") + 1] == '\0') { + sudo_lbuf_append(lbuf, "%s%s", negated ? "!" : "", name); + } else { + if (strpbrk(name, " \t") != NULL) { + sudo_lbuf_append(lbuf, "%s\"", negated ? "!" : ""); + sudo_lbuf_append_quoted(lbuf, "\"", "%s", name); + sudo_lbuf_append(lbuf, "\""); + } else { + sudo_lbuf_append_quoted(lbuf, SUDOERS_QUOTED, "%s%s", + negated ? "!" : "", name); + } + } + break; + } + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +bool +sudoers_format_member(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, struct member *m, + const char *separator, int alias_type) +{ + return sudoers_format_member_int(lbuf, parse_tree, m->name, m->type, + m->negated, separator, alias_type); +} + +/* + * Store a defaults entry as a command tag. + */ +bool +sudoers_defaults_to_tags(const char *var, const char *val, int op, + struct cmndtag *tags) +{ + bool ret = true; + debug_decl(sudoers_defaults_to_tags, SUDOERS_DEBUG_UTIL); + + if (op == true || op == false) { + if (strcmp(var, "authenticate") == 0) { + tags->nopasswd = op == false; + } else if (strcmp(var, "sudoedit_follow") == 0) { + tags->follow = op == true; + } else if (strcmp(var, "log_input") == 0) { + tags->log_input = op == true; + } else if (strcmp(var, "log_output") == 0) { + tags->log_output = op == true; + } else if (strcmp(var, "noexec") == 0) { + tags->noexec = op == true; + } else if (strcmp(var, "setenv") == 0) { + tags->setenv = op == true; + } else if (strcmp(var, "mail_all_cmnds") == 0 || + strcmp(var, "mail_always") == 0 || + strcmp(var, "mail_no_perms") == 0) { + tags->send_mail = op == true; + } else { + ret = false; + } + } else { + ret = false; + } + debug_return_bool(ret); +} + +/* + * Convert a defaults list to command tags. + */ +bool +sudoers_defaults_list_to_tags(struct defaults_list *defs, struct cmndtag *tags) +{ + bool ret = true; + struct defaults *d; + debug_decl(sudoers_defaults_list_to_tags, SUDOERS_DEBUG_UTIL); + + TAGS_INIT(tags); + if (defs != NULL) { + TAILQ_FOREACH(d, defs, entries) { + if (!sudoers_defaults_to_tags(d->var, d->val, d->op, tags)) { + if (d->val != NULL) { + sudo_debug_printf(SUDO_DEBUG_WARN, + "unable to convert defaults to tag: %s%s%s", d->var, + d->op == '+' ? "+=" : d->op == '-' ? "-=" : "=", d->val); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "unable to convert defaults to tag: %s%s%s", + d->op == false ? "!" : "", d->var, ""); + } + ret = false; + } + } + } + debug_return_bool(ret); +} + +#define FIELD_CHANGED(ocs, ncs, fld) \ + ((ocs) == NULL || (ncs)->fld != (ocs)->fld) + +#define TAG_CHANGED(ocs, ncs, t, tt) \ + (TAG_SET((t).tt) && FIELD_CHANGED(ocs, ncs, tags.tt)) + +/* + * Write a cmndspec to lbuf in sudoers format. + */ +bool +sudoers_format_cmndspec(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, struct cmndspec *cs, + struct cmndspec *prev_cs, struct cmndtag tags, bool expand_aliases) +{ + debug_decl(sudoers_format_cmndspec, SUDOERS_DEBUG_UTIL); + + /* Merge privilege-level tags with cmndspec tags. */ + TAGS_MERGE(tags, cs->tags); + +#ifdef HAVE_PRIV_SET + if (cs->privs != NULL && FIELD_CHANGED(prev_cs, cs, privs)) + sudo_lbuf_append(lbuf, "PRIVS=\"%s\" ", cs->privs); + if (cs->limitprivs != NULL && FIELD_CHANGED(prev_cs, cs, limitprivs)) + sudo_lbuf_append(lbuf, "LIMITPRIVS=\"%s\" ", cs->limitprivs); +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + if (cs->role != NULL && FIELD_CHANGED(prev_cs, cs, role)) + sudo_lbuf_append(lbuf, "ROLE=%s ", cs->role); + if (cs->type != NULL && FIELD_CHANGED(prev_cs, cs, type)) + sudo_lbuf_append(lbuf, "TYPE=%s ", cs->type); +#endif /* HAVE_SELINUX */ + if (cs->runchroot != NULL && FIELD_CHANGED(prev_cs, cs, runchroot)) + sudo_lbuf_append(lbuf, "CHROOT=%s ", cs->runchroot); + if (cs->runcwd != NULL && FIELD_CHANGED(prev_cs, cs, runcwd)) + sudo_lbuf_append(lbuf, "CWD=%s ", cs->runcwd); + if (cs->timeout > 0 && FIELD_CHANGED(prev_cs, cs, timeout)) { + char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2]; + (void)snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout); + sudo_lbuf_append(lbuf, "TIMEOUT=%s ", numbuf); + } + if (cs->notbefore != UNSPEC && FIELD_CHANGED(prev_cs, cs, notbefore)) { + char buf[sizeof("CCYYMMDDHHMMSSZ")]; + struct tm *tm = gmtime(&cs->notbefore); + if (strftime(buf, sizeof(buf), "%Y%m%d%H%M%SZ", tm) != 0) + sudo_lbuf_append(lbuf, "NOTBEFORE=%s ", buf); + } + if (cs->notafter != UNSPEC && FIELD_CHANGED(prev_cs, cs, notafter)) { + char buf[sizeof("CCYYMMDDHHMMSSZ")]; + struct tm *tm = gmtime(&cs->notafter); + if (strftime(buf, sizeof(buf), "%Y%m%d%H%M%SZ", tm) != 0) + sudo_lbuf_append(lbuf, "NOTAFTER=%s ", buf); + } + if (TAG_CHANGED(prev_cs, cs, tags, setenv)) + sudo_lbuf_append(lbuf, tags.setenv ? "SETENV: " : "NOSETENV: "); + if (TAG_CHANGED(prev_cs, cs, tags, noexec)) + sudo_lbuf_append(lbuf, tags.noexec ? "NOEXEC: " : "EXEC: "); + if (TAG_CHANGED(prev_cs, cs, tags, nopasswd)) + sudo_lbuf_append(lbuf, tags.nopasswd ? "NOPASSWD: " : "PASSWD: "); + if (TAG_CHANGED(prev_cs, cs, tags, log_input)) + sudo_lbuf_append(lbuf, tags.log_input ? "LOG_INPUT: " : "NOLOG_INPUT: "); + if (TAG_CHANGED(prev_cs, cs, tags, log_output)) + sudo_lbuf_append(lbuf, tags.log_output ? "LOG_OUTPUT: " : "NOLOG_OUTPUT: "); + if (TAG_CHANGED(prev_cs, cs, tags, send_mail)) + sudo_lbuf_append(lbuf, tags.send_mail ? "MAIL: " : "NOMAIL: "); + if (TAG_CHANGED(prev_cs, cs, tags, follow)) + sudo_lbuf_append(lbuf, tags.follow ? "FOLLOW: " : "NOFOLLOW: "); + sudoers_format_member(lbuf, parse_tree, cs->cmnd, ", ", + expand_aliases ? CMNDALIAS : UNSPEC); + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Write a privilege to lbuf in sudoers format. + */ +bool +sudoers_format_privilege(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, struct privilege *priv, + bool expand_aliases) +{ + struct cmndspec *cs, *prev_cs; + struct cmndtag tags; + struct member *m; + debug_decl(sudoers_format_privilege, SUDOERS_DEBUG_UTIL); + + /* Convert per-privilege defaults to tags. */ + sudoers_defaults_list_to_tags(&priv->defaults, &tags); + + /* Print hosts list. */ + TAILQ_FOREACH(m, &priv->hostlist, entries) { + if (m != TAILQ_FIRST(&priv->hostlist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + expand_aliases ? HOSTALIAS : UNSPEC); + } + + /* Print commands. */ + sudo_lbuf_append(lbuf, " = "); + prev_cs = NULL; + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + if (prev_cs == NULL || RUNAS_CHANGED(cs, prev_cs)) { + if (cs != TAILQ_FIRST(&priv->cmndlist)) + sudo_lbuf_append(lbuf, ", "); + if (cs->runasuserlist != NULL || cs->runasgrouplist != NULL) + sudo_lbuf_append(lbuf, "("); + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + if (m != TAILQ_FIRST(cs->runasuserlist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + expand_aliases ? RUNASALIAS : UNSPEC); + } + } + if (cs->runasgrouplist != NULL) { + sudo_lbuf_append(lbuf, " : "); + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + if (m != TAILQ_FIRST(cs->runasgrouplist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + expand_aliases ? RUNASALIAS : UNSPEC); + } + } + if (cs->runasuserlist != NULL || cs->runasgrouplist != NULL) + sudo_lbuf_append(lbuf, ") "); + } else if (cs != TAILQ_FIRST(&priv->cmndlist)) { + sudo_lbuf_append(lbuf, ", "); + } + sudoers_format_cmndspec(lbuf, parse_tree, cs, prev_cs, tags, + expand_aliases); + prev_cs = cs; + } + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Write a userspec to lbuf in sudoers format. + */ +bool +sudoers_format_userspec(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, + struct userspec *us, bool expand_aliases) +{ + struct privilege *priv; + struct sudoers_comment *comment; + struct member *m; + debug_decl(sudoers_format_userspec, SUDOERS_DEBUG_UTIL); + + /* Print comments (if any). */ + STAILQ_FOREACH(comment, &us->comments, entries) { + sudo_lbuf_append(lbuf, "# %s\n", comment->str); + } + + /* Print users list. */ + TAILQ_FOREACH(m, &us->users, entries) { + if (m != TAILQ_FIRST(&us->users)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + expand_aliases ? USERALIAS : UNSPEC); + } + + TAILQ_FOREACH(priv, &us->privileges, entries) { + if (priv != TAILQ_FIRST(&us->privileges)) + sudo_lbuf_append(lbuf, " : "); + else + sudo_lbuf_append(lbuf, " "); + if (!sudoers_format_privilege(lbuf, parse_tree, priv, expand_aliases)) + break; + } + sudo_lbuf_append(lbuf, "\n"); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Write a userspec_list to lbuf in sudoers format. + */ +bool +sudoers_format_userspecs(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, const char *separator, + bool expand_aliases, bool flush) +{ + struct userspec *us; + debug_decl(sudoers_format_userspecs, SUDOERS_DEBUG_UTIL); + + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + if (separator != NULL && us != TAILQ_FIRST(&parse_tree->userspecs)) + sudo_lbuf_append(lbuf, "%s", separator); + if (!sudoers_format_userspec(lbuf, parse_tree, us, expand_aliases)) + break; + sudo_lbuf_print(lbuf); + } + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Format and append a defaults entry to the specified lbuf. + */ +bool +sudoers_format_default(struct sudo_lbuf *lbuf, struct defaults *d) +{ + debug_decl(sudoers_format_default, SUDOERS_DEBUG_UTIL); + + if (d->val != NULL) { + sudo_lbuf_append(lbuf, "%s%s", d->var, + d->op == '+' ? "+=" : d->op == '-' ? "-=" : "="); + if (strpbrk(d->val, " \t") != NULL) { + sudo_lbuf_append(lbuf, "\""); + sudo_lbuf_append_quoted(lbuf, "\"", "%s", d->val); + sudo_lbuf_append(lbuf, "\""); + } else + sudo_lbuf_append_quoted(lbuf, SUDOERS_QUOTED, "%s", d->val); + } else { + sudo_lbuf_append(lbuf, "%s%s", d->op == false ? "!" : "", d->var); + } + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Format and append a defaults line to the specified lbuf. + * If next, is specified, it must point to the next defaults + * entry in the list; this is used to print multiple defaults + * entries with the same binding on a single line. + */ +bool +sudoers_format_default_line( struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, struct defaults *d, + struct defaults **next, bool expand_aliases) +{ + struct member *m; + int alias_type; + debug_decl(sudoers_format_default_line, SUDOERS_DEBUG_UTIL); + + /* Print Defaults type and binding (if present) */ + switch (d->type) { + case DEFAULTS_HOST: + sudo_lbuf_append(lbuf, "Defaults@"); + alias_type = expand_aliases ? HOSTALIAS : UNSPEC; + break; + case DEFAULTS_USER: + sudo_lbuf_append(lbuf, "Defaults:"); + alias_type = expand_aliases ? USERALIAS : UNSPEC; + break; + case DEFAULTS_RUNAS: + sudo_lbuf_append(lbuf, "Defaults>"); + alias_type = expand_aliases ? RUNASALIAS : UNSPEC; + break; + case DEFAULTS_CMND: + sudo_lbuf_append(lbuf, "Defaults!"); + alias_type = expand_aliases ? CMNDALIAS : UNSPEC; + break; + default: + sudo_lbuf_append(lbuf, "Defaults"); + alias_type = UNSPEC; + break; + } + TAILQ_FOREACH(m, d->binding, entries) { + if (m != TAILQ_FIRST(d->binding)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", alias_type); + } + + sudo_lbuf_append(lbuf, " "); + sudoers_format_default(lbuf, d); + + if (next != NULL) { + /* Merge Defaults with the same binding, there may be multiple. */ + struct defaults *n; + while ((n = TAILQ_NEXT(d, entries)) && d->binding == n->binding) { + sudo_lbuf_append(lbuf, ", "); + sudoers_format_default(lbuf, n); + d = n; + } + *next = n; + } + sudo_lbuf_append(lbuf, "\n"); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} diff --git a/plugins/sudoers/gc.c b/plugins/sudoers/gc.c new file mode 100644 index 0000000..9061b92 --- /dev/null +++ b/plugins/sudoers/gc.c @@ -0,0 +1,150 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#include "sudoers.h" + +struct sudoers_gc_entry { + SLIST_ENTRY(sudoers_gc_entry) entries; + enum sudoers_gc_types type; + union { + char **vec; + void *ptr; + } u; +}; +SLIST_HEAD(sudoers_gc_list, sudoers_gc_entry); +#ifdef NO_LEAKS +static struct sudoers_gc_list sudoers_gc_list = + SLIST_HEAD_INITIALIZER(sudoers_gc_list); +#endif + +bool +sudoers_gc_add(enum sudoers_gc_types type, void *v) +{ +#ifdef NO_LEAKS + struct sudoers_gc_entry *gc; + debug_decl(sudoers_gc_add, SUDOERS_DEBUG_UTIL); + + if (v == NULL) + debug_return_bool(false); + + gc = calloc(1, sizeof(*gc)); + if (gc == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + switch (type) { + case GC_PTR: + gc->u.ptr = v; + break; + case GC_VECTOR: + gc->u.vec = v; + break; + default: + free(gc); + sudo_warnx("unexpected garbage type %d", type); + debug_return_bool(false); + } + gc->type = type; + SLIST_INSERT_HEAD(&sudoers_gc_list, gc, entries); + debug_return_bool(true); +#else + return true; +#endif /* NO_LEAKS */ +} + +bool +sudoers_gc_remove(enum sudoers_gc_types type, void *v) +{ +#ifdef NO_LEAKS + struct sudoers_gc_entry *gc, *prev = NULL; + debug_decl(sudoers_gc_remove, SUDOERS_DEBUG_UTIL); + + SLIST_FOREACH(gc, &sudoers_gc_list, entries) { + switch (gc->type) { + case GC_PTR: + if (gc->u.ptr == v) + goto found; + break; + case GC_VECTOR: + if (gc->u.vec == v) + goto found; + break; + default: + sudo_warnx("unexpected garbage type %d in %p", gc->type, gc); + } + prev = gc; + } + return false; +found: + if (prev == NULL) + SLIST_REMOVE_HEAD(&sudoers_gc_list, entries); + else + SLIST_REMOVE_AFTER(prev, entries); + return true; +#else + return false; +#endif /* NO_LEAKS */ +} + +#ifdef NO_LEAKS +static void +sudoers_gc_run(void) +{ + struct sudoers_gc_entry *gc; + char **cur; + debug_decl(sudoers_gc_run, SUDOERS_DEBUG_UTIL); + + /* Collect garbage. */ + while ((gc = SLIST_FIRST(&sudoers_gc_list))) { + SLIST_REMOVE_HEAD(&sudoers_gc_list, entries); + switch (gc->type) { + case GC_PTR: + free(gc->u.ptr); + free(gc); + break; + case GC_VECTOR: + for (cur = gc->u.vec; *cur != NULL; cur++) + free(*cur); + free(gc->u.vec); + free(gc); + break; + default: + sudo_warnx("unexpected garbage type %d", gc->type); + } + } + + debug_return; +} +#endif /* NO_LEAKS */ + +void +sudoers_gc_init(void) +{ +#ifdef NO_LEAKS + atexit(sudoers_gc_run); +#endif +} diff --git a/plugins/sudoers/gentime.c b/plugins/sudoers/gentime.c new file mode 100644 index 0000000..7f7cf7e --- /dev/null +++ b/plugins/sudoers/gentime.c @@ -0,0 +1,157 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#include +#include + +#include "sudo_compat.h" +#include "sudoers_debug.h" +#include "parse.h" + +/* + * Parse a timestamp in Generalized Time format as per RFC4517. + * E.g. yyyymmddHHMMSS.FZ or yyyymmddHHMMSS.F[+-]TZOFF + * where minutes, seconds and fraction are optional. + * Returns the time in Unix time format or -1 on error. + */ +time_t +parse_gentime(const char *timestr) +{ + char tcopy[sizeof("yyyymmddHHMMSS.F")]; + const char *cp; + time_t result; + struct tm tm; + size_t len; + int items, tzoff = 0; + bool islocal = false; + debug_decl(parse_gentime, SUDOERS_DEBUG_PARSER); + + /* Make a copy of the time without time zone for easy parsing. */ + len = strspn(timestr, "0123456789.,"); + if (len >= sizeof(tcopy)) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to parse general time string %s", timestr); + debug_return_time_t(-1); + } + memcpy(tcopy, timestr, len); + tcopy[len] = '\0'; + + /* Parse general time, ignoring the timezone for now. */ + memset(&tm, 0, sizeof(tm)); + items = sscanf(tcopy, "%4d%2d%2d%2d%2d%2d", &tm.tm_year, &tm.tm_mon, + &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); + if (items == EOF || items < 4) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "only parsed %d items in general time string %s", items, timestr); + debug_return_time_t(-1); + } + cp = timestr + ((items + 1) * 2); + + /* Parse optional fractional hours/minute/second if present. */ + if ((cp[0] == '.' || cp[0] == ',') && isdigit((unsigned char)cp[1])) { + int frac = cp[1] - '0'; + switch (items) { + case 4: + /* convert fractional hour -> minutes */ + tm.tm_min += 60 / 10 * frac; + break; + case 5: + /* convert fractional minute -> seconds */ + tm.tm_sec += 60 / 10 * frac; + break; + case 6: + /* ignore fractional second */ + break; + } + cp += 2; /* skip over radix and fraction */ + } + + switch (*cp) { + case '-': + case '+': { + int hour = 0, min = 0; + + /* No DST */ + tm.tm_isdst = 0; + /* parse time zone offset */ + items = sscanf(cp + 1, "%2d%2d", &hour, &min); + if (items == EOF || items < 1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to parse time zone offset in %s, items %d", + timestr, items); + debug_return_time_t(-1); + } + if (*cp == '-') + tzoff = -((hour * 60) + min) * 60; + else + tzoff = ((hour * 60) + min) * 60; + cp += 1 + (items * 2); + break; + } + case 'Z': + /* GMT/UTC, no DST */ + tm.tm_isdst = 0; + cp++; + break; + case '\0': + /* no zone specified, use local time */ + tm.tm_isdst = -1; + islocal = true; + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to parse general time string %s", timestr); + debug_return_time_t(-1); + } + if (*cp != '\0') { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "trailing garbage in general time string %s", timestr); + debug_return_time_t(-1); + } + + /* Adjust from Generalized Time to struct tm */ + tm.tm_year -= 1900; + tm.tm_mon--; + + result = mktime(&tm); + if (result != -1) { + if (!islocal) { + /* Not local time, convert to GMT */ + result += get_gmtoff(&result); + /* Adjust time based on supplied GMT offset. */ + result -= tzoff; + } + } + + debug_return_time_t(result); +} diff --git a/plugins/sudoers/getdate.c b/plugins/sudoers/getdate.c new file mode 100644 index 0000000..b7d08d6 --- /dev/null +++ b/plugins/sudoers/getdate.c @@ -0,0 +1,1513 @@ +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include +#include +#include +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 +#define YYLEX yylex() +#define YYEMPTY -1 +#define yyclearin (yychar=(YYEMPTY)) +#define yyerrok (yyerrflag=0) +#define YYRECOVERING() (yyerrflag!=0) +#define YYPREFIX "yy" +#line 2 "getdate.y" +/* +** Originally written by Steven M. Bellovin while +** at the University of North Carolina at Chapel Hill. Later tweaked by +** a couple of people on Usenet. Completely overhauled by Rich $alz +** and Jim Berets in August, 1990; +** +** This grammar has 10 shift/reduce conflicts. +** +** This code is in the public domain and has no copyright. +*/ +/* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */ +/* SUPPRESS 288 on yyerrlab *//* Label unused */ + +/* PVS Studio suppression*/ +/* -V::1037, 1042*/ + +#include + +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include + +#include "sudo_compat.h" + + +#define EPOCH 1970 +#define HOUR(x) ((time_t)(x) * 60) +#define SECSPERDAY (24L * 60L * 60L) + + +/* +** An entry in the lexical lookup table. +*/ +typedef struct _TABLE { + char *name; + int type; + time_t value; +} TABLE; + + +/* +** Daylight-savings mode: on, off, or not yet known. +*/ +typedef enum _DSTMODE { + DSTon, DSToff, DSTmaybe +} DSTMODE; + +/* +** Meridian: am, pm, or 24-hour style. +*/ +typedef enum _MERIDIAN { + MERam, MERpm, MER24 +} MERIDIAN; + + +/* +** Global variables. We could get rid of most of these by using a good +** union as the yacc stack. (This routine was originally written before +** yacc had the %union construct.) Maybe someday; right now we only use +** the %union very rarely. +*/ +static char *yyInput; +static DSTMODE yyDSTmode; +static time_t yyDayOrdinal; +static time_t yyDayNumber; +static int yyHaveDate; +static int yyHaveDay; +static int yyHaveRel; +static int yyHaveTime; +static int yyHaveZone; +static time_t yyTimezone; +static time_t yyDay; +static time_t yyHour; +static time_t yyMinutes; +static time_t yyMonth; +static time_t yySeconds; +static time_t yyYear; +static MERIDIAN yyMeridian; +static time_t yyRelMonth; +static time_t yyRelSeconds; + +static int yyerror(const char *s); +static int yylex(void); + int yyparse(void); + +#line 97 "getdate.y" +#ifndef YYSTYPE_DEFINED +#define YYSTYPE_DEFINED +typedef union { + time_t Number; + enum _MERIDIAN Meridian; +} YYSTYPE; +#endif /* YYSTYPE_DEFINED */ +#line 115 "getdate.c" +#define tAGO 257 +#define tDAY 258 +#define tDAYZONE 259 +#define tID 260 +#define tMERIDIAN 261 +#define tMINUTE_UNIT 262 +#define tMONTH 263 +#define tMONTH_UNIT 264 +#define tSEC_UNIT 265 +#define tSNUMBER 266 +#define tUNUMBER 267 +#define tZONE 268 +#define tDST 269 +#define YYERRCODE 256 +const short yylhs[] = + { -1, + 0, 0, 2, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 4, 4, 4, 6, 6, 6, 5, + 5, 5, 5, 5, 5, 5, 5, 7, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 8, 1, + 1, +}; +const short yylen[] = + { 2, + 0, 2, 1, 1, 1, 1, 1, 1, 2, 4, + 4, 6, 6, 1, 1, 2, 1, 2, 2, 3, + 5, 3, 3, 2, 4, 2, 3, 2, 1, 2, + 2, 1, 2, 2, 1, 2, 2, 1, 1, 0, + 1, +}; +const short yydefred[] = + { 1, + 0, 0, 15, 32, 0, 38, 35, 0, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 0, 18, 0, + 31, 36, 33, 19, 9, 30, 0, 37, 34, 0, + 0, 0, 16, 28, 0, 23, 27, 22, 0, 0, + 25, 41, 11, 0, 10, 0, 0, 21, 13, 12, +}; +const short yydgoto[] = + { 1, + 45, 11, 12, 13, 14, 15, 16, 17, 18, +}; +const short yysindex[] = + { 0, + -249, -38, 0, 0, -260, 0, 0, -240, -47, -248, + 0, 0, 0, 0, 0, 0, 0, -237, 0, -18, + 0, 0, 0, 0, 0, 0, -262, 0, 0, -239, + -238, -236, 0, 0, -235, 0, 0, 0, -56, -19, + 0, 0, 0, -234, 0, -232, -258, 0, 0, 0,}; +const short yyrindex[] = + { 0, + 0, 1, 0, 0, 0, 0, 0, 0, 69, 12, + 0, 0, 0, 0, 0, 0, 0, 23, 0, 34, + 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 45, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0,}; +const short yygindex[] = + { 0, + -17, 0, 0, 0, 0, 0, 0, 0, 0, +}; +#define YYTABLESIZE 337 +const short yytable[] = + { 32, + 17, 44, 42, 36, 37, 19, 20, 49, 2, 3, + 31, 14, 4, 5, 6, 7, 8, 9, 10, 34, + 33, 21, 29, 22, 23, 35, 38, 46, 39, 50, + 40, 41, 47, 24, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 0, 39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 42, 0, 0, 0, 0, 43, + 24, 0, 0, 25, 26, 27, 28, 29, 30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, + 0, 0, 17, 17, 17, 17, 17, 17, 17, 14, + 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, + 29, 29, 0, 0, 29, 29, 29, 29, 29, 29, + 29, 24, 24, 0, 0, 24, 24, 24, 24, 24, + 24, 24, 20, 20, 0, 0, 20, 20, 20, 20, + 20, 20, 20, 40, 40, 0, 0, 40, 40, 40, + 40, 0, 40, 40, 26, 26, 0, 39, 26, 26, + 26, 26, 0, 0, 26, 39, 39, +}; +const short yycheck[] = + { 47, + 0, 58, 261, 266, 267, 44, 267, 266, 258, 259, + 58, 0, 262, 263, 264, 265, 266, 267, 268, 257, + 269, 262, 0, 264, 265, 44, 266, 47, 267, 47, + 267, 267, 267, 0, 267, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 261, -1, -1, -1, -1, 266, + 258, -1, -1, 261, 262, 263, 264, 265, 266, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 258, 259, + -1, -1, 262, 263, 264, 265, 266, 267, 268, 258, + 259, -1, -1, 262, 263, 264, 265, 266, 267, 268, + 258, 259, -1, -1, 262, 263, 264, 265, 266, 267, + 268, 258, 259, -1, -1, 262, 263, 264, 265, 266, + 267, 268, 258, 259, -1, -1, 262, 263, 264, 265, + 266, 267, 268, 258, 259, -1, -1, 262, 263, 264, + 265, -1, 267, 268, 258, 259, -1, 259, 262, 263, + 264, 265, -1, -1, 268, 267, 268, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 269 +#if YYDEBUG +const char * const yyname[] = + { +"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,"','",0,0,"'/'",0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"tAGO","tDAY", +"tDAYZONE","tID","tMERIDIAN","tMINUTE_UNIT","tMONTH","tMONTH_UNIT","tSEC_UNIT", +"tSNUMBER","tUNUMBER","tZONE","tDST", +}; +const char * const yyrule[] = + {"$accept : spec", +"spec :", +"spec : spec item", +"item : time", +"item : zone", +"item : date", +"item : day", +"item : rel", +"item : number", +"time : tUNUMBER tMERIDIAN", +"time : tUNUMBER ':' tUNUMBER o_merid", +"time : tUNUMBER ':' tUNUMBER tSNUMBER", +"time : tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid", +"time : tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER", +"zone : tZONE", +"zone : tDAYZONE", +"zone : tZONE tDST", +"day : tDAY", +"day : tDAY ','", +"day : tUNUMBER tDAY", +"date : tUNUMBER '/' tUNUMBER", +"date : tUNUMBER '/' tUNUMBER '/' tUNUMBER", +"date : tUNUMBER tSNUMBER tSNUMBER", +"date : tUNUMBER tMONTH tSNUMBER", +"date : tMONTH tUNUMBER", +"date : tMONTH tUNUMBER ',' tUNUMBER", +"date : tUNUMBER tMONTH", +"date : tUNUMBER tMONTH tUNUMBER", +"rel : relunit tAGO", +"rel : relunit", +"relunit : tUNUMBER tMINUTE_UNIT", +"relunit : tSNUMBER tMINUTE_UNIT", +"relunit : tMINUTE_UNIT", +"relunit : tSNUMBER tSEC_UNIT", +"relunit : tUNUMBER tSEC_UNIT", +"relunit : tSEC_UNIT", +"relunit : tSNUMBER tMONTH_UNIT", +"relunit : tUNUMBER tMONTH_UNIT", +"relunit : tMONTH_UNIT", +"number : tUNUMBER", +"o_merid :", +"o_merid : tMERIDIAN", +}; +#endif +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 10000 +#define YYMAXDEPTH 10000 +#endif +#endif +#define YYINITSTACKSIZE 200 +/* LINTUSED */ +int yydebug; +int yynerrs; +int yyerrflag; +int yychar; +short *yyssp; +YYSTYPE *yyvsp; +YYSTYPE yyval; +YYSTYPE yylval; +short *yyss; +short *yysslim; +YYSTYPE *yyvs; +unsigned int yystacksize; +int yyparse(void); +#line 316 "getdate.y" + +/* Month and day table. */ +static TABLE const MonthDayTable[] = { + { "january", tMONTH, 1 }, + { "february", tMONTH, 2 }, + { "march", tMONTH, 3 }, + { "april", tMONTH, 4 }, + { "may", tMONTH, 5 }, + { "june", tMONTH, 6 }, + { "july", tMONTH, 7 }, + { "august", tMONTH, 8 }, + { "september", tMONTH, 9 }, + { "sept", tMONTH, 9 }, + { "october", tMONTH, 10 }, + { "november", tMONTH, 11 }, + { "december", tMONTH, 12 }, + { "sunday", tDAY, 0 }, + { "monday", tDAY, 1 }, + { "tuesday", tDAY, 2 }, + { "tues", tDAY, 2 }, + { "wednesday", tDAY, 3 }, + { "wednes", tDAY, 3 }, + { "thursday", tDAY, 4 }, + { "thur", tDAY, 4 }, + { "thurs", tDAY, 4 }, + { "friday", tDAY, 5 }, + { "saturday", tDAY, 6 }, + { NULL } +}; + +/* Time units table. */ +static TABLE const UnitsTable[] = { + { "year", tMONTH_UNIT, 12 }, + { "month", tMONTH_UNIT, 1 }, + { "fortnight", tMINUTE_UNIT, 14 * 24 * 60 }, + { "week", tMINUTE_UNIT, 7 * 24 * 60 }, + { "day", tMINUTE_UNIT, 1 * 24 * 60 }, + { "hour", tMINUTE_UNIT, 60 }, + { "minute", tMINUTE_UNIT, 1 }, + { "min", tMINUTE_UNIT, 1 }, + { "second", tSEC_UNIT, 1 }, + { "sec", tSEC_UNIT, 1 }, + { NULL } +}; + +/* Assorted relative-time words. */ +static TABLE const OtherTable[] = { + { "tomorrow", tMINUTE_UNIT, 1 * 24 * 60 }, + { "yesterday", tMINUTE_UNIT, -1 * 24 * 60 }, + { "today", tMINUTE_UNIT, 0 }, + { "now", tMINUTE_UNIT, 0 }, + { "last", tUNUMBER, -1 }, + { "this", tUNUMBER, 0 }, + { "next", tUNUMBER, 2 }, + { "first", tUNUMBER, 1 }, +/* { "second", tUNUMBER, 2 }, */ + { "third", tUNUMBER, 3 }, + { "fourth", tUNUMBER, 4 }, + { "fifth", tUNUMBER, 5 }, + { "sixth", tUNUMBER, 6 }, + { "seventh", tUNUMBER, 7 }, + { "eighth", tUNUMBER, 8 }, + { "ninth", tUNUMBER, 9 }, + { "tenth", tUNUMBER, 10 }, + { "eleventh", tUNUMBER, 11 }, + { "twelfth", tUNUMBER, 12 }, + { "ago", tAGO, 1 }, + { NULL } +}; + +/* The timezone table. */ +/* Some of these are commented out because a time_t can't store a float. */ +static TABLE const TimezoneTable[] = { + { "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */ + { "ut", tZONE, HOUR( 0) }, /* Universal (Coordinated) */ + { "utc", tZONE, HOUR( 0) }, + { "wet", tZONE, HOUR( 0) }, /* Western European */ + { "bst", tDAYZONE, HOUR( 0) }, /* British Summer */ + { "wat", tZONE, HOUR( 1) }, /* West Africa */ + { "at", tZONE, HOUR( 2) }, /* Azores */ +#if 0 + /* For completeness. BST is also British Summer, and GST is + * also Guam Standard. */ + { "bst", tZONE, HOUR( 3) }, /* Brazil Standard */ + { "gst", tZONE, HOUR( 3) }, /* Greenland Standard */ +#endif +#if 0 + { "nft", tZONE, HOUR(3.5) }, /* Newfoundland */ + { "nst", tZONE, HOUR(3.5) }, /* Newfoundland Standard */ + { "ndt", tDAYZONE, HOUR(3.5) }, /* Newfoundland Daylight */ +#endif + { "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */ + { "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */ + { "est", tZONE, HOUR( 5) }, /* Eastern Standard */ + { "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */ + { "cst", tZONE, HOUR( 6) }, /* Central Standard */ + { "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */ + { "mst", tZONE, HOUR( 7) }, /* Mountain Standard */ + { "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */ + { "pst", tZONE, HOUR( 8) }, /* Pacific Standard */ + { "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */ + { "yst", tZONE, HOUR( 9) }, /* Yukon Standard */ + { "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */ + { "hst", tZONE, HOUR(10) }, /* Hawaii Standard */ + { "hdt", tDAYZONE, HOUR(10) }, /* Hawaii Daylight */ + { "cat", tZONE, HOUR(10) }, /* Central Alaska */ + { "ahst", tZONE, HOUR(10) }, /* Alaska-Hawaii Standard */ + { "nt", tZONE, HOUR(11) }, /* Nome */ + { "idlw", tZONE, HOUR(12) }, /* International Date Line West */ + { "cet", tZONE, -HOUR(1) }, /* Central European */ + { "met", tZONE, -HOUR(1) }, /* Middle European */ + { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */ + { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */ + { "swt", tZONE, -HOUR(1) }, /* Swedish Winter */ + { "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */ + { "fwt", tZONE, -HOUR(1) }, /* French Winter */ + { "fst", tDAYZONE, -HOUR(1) }, /* French Summer */ + { "eet", tZONE, -HOUR(2) }, /* Eastern Europe, USSR Zone 1 */ + { "bt", tZONE, -HOUR(3) }, /* Baghdad, USSR Zone 2 */ +#if 0 + { "it", tZONE, -HOUR(3.5) },/* Iran */ +#endif + { "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */ + { "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */ +#if 0 + { "ist", tZONE, -HOUR(5.5) },/* Indian Standard */ +#endif + { "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */ +#if 0 + /* For completeness. NST is also Newfoundland Stanard, and SST is + * also Swedish Summer. */ + { "nst", tZONE, -HOUR(6.5) },/* North Sumatra */ + { "sst", tZONE, -HOUR(7) }, /* South Sumatra, USSR Zone 6 */ +#endif /* 0 */ + { "wast", tZONE, -HOUR(7) }, /* West Australian Standard */ + { "wadt", tDAYZONE, -HOUR(7) }, /* West Australian Daylight */ +#if 0 + { "jt", tZONE, -HOUR(7.5) },/* Java (3pm in Cronusland!) */ +#endif + { "cct", tZONE, -HOUR(8) }, /* China Coast, USSR Zone 7 */ + { "jst", tZONE, -HOUR(9) }, /* Japan Standard, USSR Zone 8 */ +#if 0 + { "cast", tZONE, -HOUR(9.5) },/* Central Australian Standard */ + { "cadt", tDAYZONE, -HOUR(9.5) },/* Central Australian Daylight */ +#endif + { "east", tZONE, -HOUR(10) }, /* Eastern Australian Standard */ + { "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */ + { "gst", tZONE, -HOUR(10) }, /* Guam Standard, USSR Zone 9 */ + { "nzt", tZONE, -HOUR(12) }, /* New Zealand */ + { "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */ + { "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */ + { "idle", tZONE, -HOUR(12) }, /* International Date Line East */ + { NULL } +}; + +/* Military timezone table. */ +static TABLE const MilitaryTable[] = { + { "a", tZONE, HOUR( 1) }, + { "b", tZONE, HOUR( 2) }, + { "c", tZONE, HOUR( 3) }, + { "d", tZONE, HOUR( 4) }, + { "e", tZONE, HOUR( 5) }, + { "f", tZONE, HOUR( 6) }, + { "g", tZONE, HOUR( 7) }, + { "h", tZONE, HOUR( 8) }, + { "i", tZONE, HOUR( 9) }, + { "k", tZONE, HOUR( 10) }, + { "l", tZONE, HOUR( 11) }, + { "m", tZONE, HOUR( 12) }, + { "n", tZONE, HOUR(- 1) }, + { "o", tZONE, HOUR(- 2) }, + { "p", tZONE, HOUR(- 3) }, + { "q", tZONE, HOUR(- 4) }, + { "r", tZONE, HOUR(- 5) }, + { "s", tZONE, HOUR(- 6) }, + { "t", tZONE, HOUR(- 7) }, + { "u", tZONE, HOUR(- 8) }, + { "v", tZONE, HOUR(- 9) }, + { "w", tZONE, HOUR(-10) }, + { "x", tZONE, HOUR(-11) }, + { "y", tZONE, HOUR(-12) }, + { "z", tZONE, HOUR( 0) }, + { NULL } +}; + + + + +/* ARGSUSED */ +static int +yyerror(const char *s) +{ + return 0; +} + + +static time_t +ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian) +{ + if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59) + return -1; + switch (Meridian) { + case MER24: + if (Hours < 0 || Hours > 23) + return -1; + return (Hours * 60L + Minutes) * 60L + Seconds; + case MERam: + if (Hours < 1 || Hours > 12) + return -1; + if (Hours == 12) + Hours = 0; + return (Hours * 60L + Minutes) * 60L + Seconds; + case MERpm: + if (Hours < 1 || Hours > 12) + return -1; + if (Hours == 12) + Hours = 0; + return ((Hours + 12) * 60L + Minutes) * 60L + Seconds; + default: + abort (); + } + /* NOTREACHED */ +} + + +/* Year is either + * A negative number, which means to use its absolute value (why?) + * A number from 0 to 99, which means a year from 1900 to 1999, or + * The actual year (>=100). */ +static time_t +Convert(time_t Month, time_t Day, time_t Year, time_t Hours, time_t Minutes, + time_t Seconds, MERIDIAN Meridian, DSTMODE DSTmode) +{ + static int DaysInMonth[12] = { + 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 + }; + struct tm *tm; + time_t tod; + time_t Julian; + int i; + + if (Year < 0) + Year = -Year; + if (Year < 69) + Year += 2000; + else if (Year < 100) { + Year += 1900; + if (Year < EPOCH) + Year += 100; + } + DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) + ? 29 : 28; + /* 32-bit time_t cannot represent years past 2038 */ + if (Year < EPOCH || (sizeof(time_t) == sizeof(int) && Year > 2038) + || Month < 1 || Month > 12 + /* Lint fluff: "conversion from long may lose accuracy" */ + || Day < 1 || Day > DaysInMonth[(int)--Month]) + return -1; + + for (Julian = Day - 1, i = 0; i < Month; i++) + Julian += DaysInMonth[i]; + for (i = EPOCH; i < Year; i++) + Julian += 365 + (i % 4 == 0); + Julian *= SECSPERDAY; + Julian += yyTimezone * 60L; + if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0) + return -1; + Julian += tod; + if (DSTmode == DSTon + || (DSTmode == DSTmaybe && (tm = localtime(&Julian)) && tm->tm_isdst)) + Julian -= 60 * 60; + return Julian; +} + + +static time_t +DSTcorrect(time_t Start, time_t Future) +{ + struct tm *start_tm; + struct tm *future_tm; + time_t StartDay; + time_t FutureDay; + + start_tm = localtime(&Start); + future_tm = localtime(&Future); + if (!start_tm || !future_tm) + return -1; + + StartDay = (start_tm->tm_hour + 1) % 24; + FutureDay = (future_tm->tm_hour + 1) % 24; + return (Future - Start) + (StartDay - FutureDay) * 60L * 60L; +} + + +static time_t +RelativeDate(time_t Start, time_t DayOrdinal, time_t DayNumber) +{ + struct tm *tm; + time_t now; + + now = Start; + if (!(tm = localtime(&now))) + return -1; + now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7); + now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1); + return DSTcorrect(Start, now); +} + + +static time_t +RelativeMonth(time_t Start, time_t RelMonth) +{ + struct tm *tm; + time_t Month; + time_t Year; + + if (RelMonth == 0) + return 0; + if (!(tm = localtime(&Start))) + return -1; + Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth; + Year = Month / 12; + Month = Month % 12 + 1; + return DSTcorrect(Start, + Convert(Month, (time_t)tm->tm_mday, Year, + (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec, + MER24, DSTmaybe)); +} + + +static int +LookupWord(char *buff) +{ + char *p; + char *q; + const TABLE *tp; + int i; + int abbrev; + + /* Make it lowercase. */ + for (p = buff; *p; p++) + if (isupper((unsigned char)*p)) + *p = tolower((unsigned char)*p); + + if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) { + yylval.Meridian = MERam; + return tMERIDIAN; + } + if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) { + yylval.Meridian = MERpm; + return tMERIDIAN; + } + + /* See if we have an abbreviation for a month. */ + if (strlen(buff) == 3) + abbrev = 1; + else if (strlen(buff) == 4 && buff[3] == '.') { + abbrev = 1; + buff[3] = '\0'; + } + else + abbrev = 0; + + for (tp = MonthDayTable; tp->name; tp++) { + if (abbrev) { + if (strncmp(buff, tp->name, 3) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + else if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + + for (tp = TimezoneTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + if (strcmp(buff, "dst") == 0) + return tDST; + + for (tp = UnitsTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + /* Strip off any plural and try the units table again. */ + i = strlen(buff) - 1; + if (buff[i] == 's') { + buff[i] = '\0'; + for (tp = UnitsTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + buff[i] = 's'; /* Put back for "this" in OtherTable. */ + } + + for (tp = OtherTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + /* Military timezones. */ + if (buff[1] == '\0' && isalpha((unsigned char)*buff)) { + for (tp = MilitaryTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + + /* Drop out any periods and try the timezone table again. */ + for (i = 0, p = q = buff; *q; q++) + if (*q != '.') + *p++ = *q; + else + i++; + *p = '\0'; + if (i) + for (tp = TimezoneTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + return tID; +} + + +static int +yylex(void) +{ + char c; + char *p; + char buff[20]; + int Count; + int sign; + + for ( ; ; ) { + while (isspace((unsigned char)*yyInput)) + yyInput++; + + if (isdigit((unsigned char)(c = *yyInput)) || c == '-' || c == '+') { + if (c == '-' || c == '+') { + sign = c == '-' ? -1 : 1; + if (!isdigit((unsigned char)*++yyInput)) + /* skip the '-' sign */ + continue; + } + else + sign = 0; + for (yylval.Number = 0; isdigit((unsigned char)(c = *yyInput++)); ) + yylval.Number = 10 * yylval.Number + c - '0'; + yyInput--; + if (sign < 0) + yylval.Number = -yylval.Number; + return sign ? tSNUMBER : tUNUMBER; + } + if (isalpha((unsigned char)c)) { + for (p = buff; isalpha((unsigned char)(c = *yyInput++)) || c == '.'; ) + if (p < &buff[sizeof buff - 1]) + *p++ = c; + *p = '\0'; + yyInput--; + return LookupWord(buff); + } + if (c != '(') + return *yyInput++; + Count = 0; + do { + c = *yyInput++; + if (c == '\0') + return c; + if (c == '(') + Count++; + else if (c == ')') + Count--; + } while (Count > 0); + } +} + +#define TM_YEAR_ORIGIN 1900 + +/* Yield A - B, measured in seconds. */ +static long +difftm(struct tm *a, struct tm *b) +{ + int ay = a->tm_year + (TM_YEAR_ORIGIN - 1); + int by = b->tm_year + (TM_YEAR_ORIGIN - 1); + int days = ( + /* difference in day of year */ + a->tm_yday - b->tm_yday + /* + intervening leap days */ + + ((ay >> 2) - (by >> 2)) + - (ay/100 - by/100) + + ((ay/100 >> 2) - (by/100 >> 2)) + /* + difference in years * 365 */ + + (long)(ay-by) * 365 + ); + return (60*(60*(24*days + (a->tm_hour - b->tm_hour)) + + (a->tm_min - b->tm_min)) + + (a->tm_sec - b->tm_sec)); +} + +time_t +get_date(char *p) +{ + struct tm *tm, *gmt, gmtbuf; + time_t Start; + time_t tod; + time_t now; + time_t tz; + + yyInput = p; + (void)time (&now); + + gmt = gmtime (&now); + if (gmt != NULL) + { + /* Make a copy, in case localtime modifies *tm (I think + that comment now applies to *gmt, but I am too + lazy to dig into how gmtime and locatime allocate the + structures they return pointers to). */ + gmtbuf = *gmt; + gmt = &gmtbuf; + } + + if (! (tm = localtime (&now))) + return -1; + + if (gmt != NULL) + tz = difftm (gmt, tm) / 60; + else + /* We are on a system like VMS, where the system clock is + in local time and the system has no concept of timezones. + Hopefully we can fake this out (for the case in which the + user specifies no timezone) by just saying the timezone + is zero. */ + tz = 0; + + if(tm->tm_isdst) + tz += 60; + + yyYear = tm->tm_year + 1900; + yyMonth = tm->tm_mon + 1; + yyDay = tm->tm_mday; + yyTimezone = tz; + yyDSTmode = DSTmaybe; + yyHour = 0; + yyMinutes = 0; + yySeconds = 0; + yyMeridian = MER24; + yyRelSeconds = 0; + yyRelMonth = 0; + yyHaveDate = 0; + yyHaveDay = 0; + yyHaveRel = 0; + yyHaveTime = 0; + yyHaveZone = 0; + + if (yyparse() + || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1) + return -1; + + if (yyHaveDate || yyHaveTime || yyHaveDay) { + Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds, + yyMeridian, yyDSTmode); + if (Start < 0) + return -1; + } + else { + Start = now; + if (!yyHaveRel) + Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec; + } + + Start += yyRelSeconds; + Start += RelativeMonth(Start, yyRelMonth); + + if (yyHaveDay && !yyHaveDate) { + tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber); + Start += tod; + } + + /* Have to do *something* with a legitimate -1 so it's distinguishable + * from the error return value. (Alternately could set errno on error.) */ + return Start == -1 ? 0 : Start; +} + + +#ifdef TEST + +/* ARGSUSED */ +int +main(int argc, char *argv[]) +{ + char buff[128]; + time_t d; + + (void)printf("Enter date, or blank line to exit.\n\t> "); + (void)fflush(stdout); + while (fgets(buff, sizeof(buff), stdin) && buff[0]) { + d = get_date(buff); + if (d == -1) + (void)printf("Bad format - couldn't convert.\n"); + else + (void)printf("%s", ctime(&d)); + (void)printf("\t> "); + (void)fflush(stdout); + } + exit(0); + /* NOTREACHED */ +} +#endif /* TEST */ +#line 954 "getdate.c" +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(void) +{ + unsigned int newsize; + long sslen; + short *newss; + YYSTYPE *newvs; + + if ((newsize = yystacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; +#ifdef SIZE_MAX +#define YY_SIZE_MAX SIZE_MAX +#else +#define YY_SIZE_MAX 0xffffffffU +#endif + if (YY_SIZE_MAX / newsize < sizeof *newss) + goto bail; + sslen = yyssp - yyss; + newss = yyss ? realloc(yyss, newsize * sizeof *newss) : + malloc(newsize * sizeof *newss); /* overflow check above */ + if (newss == NULL) + goto bail; + yyss = newss; + yyssp = newss + sslen; + newvs = yyvs ? realloc(yyvs, newsize * sizeof *newvs) : + malloc(newsize * sizeof *newvs); /* overflow check above */ + if (newvs == NULL) + goto bail; + yyvs = newvs; + yyvsp = newvs + sslen; + yystacksize = newsize; + yysslim = yyss + newsize - 1; + return 0; +bail: + free(yyss); + free(yyvs); + yyss = yyssp = NULL; + yyvs = yyvsp = NULL; + yystacksize = 0; + return -1; +} + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab +int +yyparse(void) +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG"))) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif /* YYDEBUG */ + + yynerrs = 0; + yyerrflag = 0; + yychar = (-1); + + if (yyss == NULL && yygrowstack()) goto yyoverflow; + yyssp = yyss; + yyvsp = yyvs; + *yyssp = yystate = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = yylex()) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate = yytable[yyn]; + *++yyvsp = yylval; + yychar = (-1); + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; +#if defined(__GNUC__) + goto yynewerror; +#endif +yynewerror: + yyerror("syntax error"); +#if defined(__GNUC__) + goto yyerrlab; +#endif +yyerrlab: + ++yynerrs; +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate = yytable[yyn]; + *++yyvsp = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yyssp); +#endif + if (yyssp <= yyss) goto yyabort; + --yyssp; + --yyvsp; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = (-1); + goto yyloop; + } +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yyvsp[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 115 "getdate.y" +{ + yyHaveTime++; + } +break; +case 4: +#line 118 "getdate.y" +{ + yyHaveZone++; + } +break; +case 5: +#line 121 "getdate.y" +{ + yyHaveDate++; + } +break; +case 6: +#line 124 "getdate.y" +{ + yyHaveDay++; + } +break; +case 7: +#line 127 "getdate.y" +{ + yyHaveRel++; + } +break; +case 9: +#line 133 "getdate.y" +{ + yyHour = yyvsp[-1].Number; + yyMinutes = 0; + yySeconds = 0; + yyMeridian = yyvsp[0].Meridian; + } +break; +case 10: +#line 139 "getdate.y" +{ + yyHour = yyvsp[-3].Number; + yyMinutes = yyvsp[-1].Number; + yySeconds = 0; + yyMeridian = yyvsp[0].Meridian; + } +break; +case 11: +#line 145 "getdate.y" +{ + yyHour = yyvsp[-3].Number; + yyMinutes = yyvsp[-1].Number; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60); + } +break; +case 12: +#line 152 "getdate.y" +{ + yyHour = yyvsp[-5].Number; + yyMinutes = yyvsp[-3].Number; + yySeconds = yyvsp[-1].Number; + yyMeridian = yyvsp[0].Meridian; + } +break; +case 13: +#line 158 "getdate.y" +{ + yyHour = yyvsp[-5].Number; + yyMinutes = yyvsp[-3].Number; + yySeconds = yyvsp[-1].Number; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60); + } +break; +case 14: +#line 168 "getdate.y" +{ + yyTimezone = yyvsp[0].Number; + yyDSTmode = DSToff; + } +break; +case 15: +#line 172 "getdate.y" +{ + yyTimezone = yyvsp[0].Number; + yyDSTmode = DSTon; + } +break; +case 16: +#line 177 "getdate.y" +{ + yyTimezone = yyvsp[-1].Number; + yyDSTmode = DSTon; + } +break; +case 17: +#line 183 "getdate.y" +{ + yyDayOrdinal = 1; + yyDayNumber = yyvsp[0].Number; + } +break; +case 18: +#line 187 "getdate.y" +{ + yyDayOrdinal = 1; + yyDayNumber = yyvsp[-1].Number; + } +break; +case 19: +#line 191 "getdate.y" +{ + yyDayOrdinal = yyvsp[-1].Number; + yyDayNumber = yyvsp[0].Number; + } +break; +case 20: +#line 197 "getdate.y" +{ + yyMonth = yyvsp[-2].Number; + yyDay = yyvsp[0].Number; + } +break; +case 21: +#line 201 "getdate.y" +{ + if (yyvsp[-4].Number >= 100) { + yyYear = yyvsp[-4].Number; + yyMonth = yyvsp[-2].Number; + yyDay = yyvsp[0].Number; + } else { + yyMonth = yyvsp[-4].Number; + yyDay = yyvsp[-2].Number; + yyYear = yyvsp[0].Number; + } + } +break; +case 22: +#line 212 "getdate.y" +{ + /* ISO 8601 format. yyyy-mm-dd. */ + yyYear = yyvsp[-2].Number; + yyMonth = -yyvsp[-1].Number; + yyDay = -yyvsp[0].Number; + } +break; +case 23: +#line 218 "getdate.y" +{ + /* e.g. 17-JUN-1992. */ + yyDay = yyvsp[-2].Number; + yyMonth = yyvsp[-1].Number; + yyYear = -yyvsp[0].Number; + } +break; +case 24: +#line 224 "getdate.y" +{ + yyMonth = yyvsp[-1].Number; + yyDay = yyvsp[0].Number; + } +break; +case 25: +#line 228 "getdate.y" +{ + yyMonth = yyvsp[-3].Number; + yyDay = yyvsp[-2].Number; + yyYear = yyvsp[0].Number; + } +break; +case 26: +#line 233 "getdate.y" +{ + yyMonth = yyvsp[0].Number; + yyDay = yyvsp[-1].Number; + } +break; +case 27: +#line 237 "getdate.y" +{ + yyMonth = yyvsp[-1].Number; + yyDay = yyvsp[-2].Number; + yyYear = yyvsp[0].Number; + } +break; +case 28: +#line 244 "getdate.y" +{ + yyRelSeconds = -yyRelSeconds; + yyRelMonth = -yyRelMonth; + } +break; +case 30: +#line 251 "getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L; + } +break; +case 31: +#line 254 "getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L; + } +break; +case 32: +#line 257 "getdate.y" +{ + yyRelSeconds += yyvsp[0].Number * 60L; + } +break; +case 33: +#line 260 "getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number; + } +break; +case 34: +#line 263 "getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number; + } +break; +case 35: +#line 266 "getdate.y" +{ + yyRelSeconds++; + } +break; +case 36: +#line 269 "getdate.y" +{ + yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number; + } +break; +case 37: +#line 272 "getdate.y" +{ + yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number; + } +break; +case 38: +#line 275 "getdate.y" +{ + yyRelMonth += yyvsp[0].Number; + } +break; +case 39: +#line 280 "getdate.y" +{ + if (yyHaveTime && yyHaveDate && !yyHaveRel) + yyYear = yyvsp[0].Number; + else { + if(yyvsp[0].Number>10000) { + yyHaveDate++; + yyDay= (yyvsp[0].Number)%100; + yyMonth= (yyvsp[0].Number/100)%100; + yyYear = yyvsp[0].Number/10000; + } + else { + yyHaveTime++; + if (yyvsp[0].Number < 100) { + yyHour = yyvsp[0].Number; + yyMinutes = 0; + } + else { + yyHour = yyvsp[0].Number / 100; + yyMinutes = yyvsp[0].Number % 100; + } + yySeconds = 0; + yyMeridian = MER24; + } + } + } +break; +case 40: +#line 307 "getdate.y" +{ + yyval.Meridian = MER24; + } +break; +case 41: +#line 310 "getdate.y" +{ + yyval.Meridian = yyvsp[0].Meridian; + } +break; +#line 1434 "getdate.c" + } + yyssp -= yym; + yystate = *yyssp; + yyvsp -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yyssp = YYFINAL; + *++yyvsp = yyval; + if (yychar < 0) + { + if ((yychar = yylex()) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yyssp, yystate); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate; + *++yyvsp = yyval; + goto yyloop; +yyoverflow: + yyerror("yacc stack overflow"); +yyabort: + free(yyss); + free(yyvs); + yyss = yyssp = NULL; + yyvs = yyvsp = NULL; + yystacksize = 0; + return (1); +yyaccept: + free(yyss); + free(yyvs); + yyss = yyssp = NULL; + yyvs = yyvsp = NULL; + yystacksize = 0; + return (0); +} diff --git a/plugins/sudoers/getdate.y b/plugins/sudoers/getdate.y new file mode 100644 index 0000000..6e424a7 --- /dev/null +++ b/plugins/sudoers/getdate.y @@ -0,0 +1,936 @@ +%{ +/* +** Originally written by Steven M. Bellovin while +** at the University of North Carolina at Chapel Hill. Later tweaked by +** a couple of people on Usenet. Completely overhauled by Rich $alz +** and Jim Berets in August, 1990; +** +** This grammar has 10 shift/reduce conflicts. +** +** This code is in the public domain and has no copyright. +*/ +/* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */ +/* SUPPRESS 288 on yyerrlab *//* Label unused */ + +// PVS Studio suppression +// -V::1037, 1042 + +#include + +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include + +#include "sudo_compat.h" + + +#define EPOCH 1970 +#define HOUR(x) ((time_t)(x) * 60) +#define SECSPERDAY (24L * 60L * 60L) + + +/* +** An entry in the lexical lookup table. +*/ +typedef struct _TABLE { + char *name; + int type; + time_t value; +} TABLE; + + +/* +** Daylight-savings mode: on, off, or not yet known. +*/ +typedef enum _DSTMODE { + DSTon, DSToff, DSTmaybe +} DSTMODE; + +/* +** Meridian: am, pm, or 24-hour style. +*/ +typedef enum _MERIDIAN { + MERam, MERpm, MER24 +} MERIDIAN; + + +/* +** Global variables. We could get rid of most of these by using a good +** union as the yacc stack. (This routine was originally written before +** yacc had the %union construct.) Maybe someday; right now we only use +** the %union very rarely. +*/ +static char *yyInput; +static DSTMODE yyDSTmode; +static time_t yyDayOrdinal; +static time_t yyDayNumber; +static int yyHaveDate; +static int yyHaveDay; +static int yyHaveRel; +static int yyHaveTime; +static int yyHaveZone; +static time_t yyTimezone; +static time_t yyDay; +static time_t yyHour; +static time_t yyMinutes; +static time_t yyMonth; +static time_t yySeconds; +static time_t yyYear; +static MERIDIAN yyMeridian; +static time_t yyRelMonth; +static time_t yyRelSeconds; + +static int yyerror(const char *s); +static int yylex(void); + int yyparse(void); + +%} + +%union { + time_t Number; + enum _MERIDIAN Meridian; +} + +%token tAGO tDAY tDAYZONE tID tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT +%token tSEC_UNIT tSNUMBER tUNUMBER tZONE tDST + +%type tDAY tDAYZONE tMINUTE_UNIT tMONTH tMONTH_UNIT +%type tSEC_UNIT tSNUMBER tUNUMBER tZONE +%type tMERIDIAN o_merid + +%% + +spec : /* NULL */ + | spec item + ; + +item : time { + yyHaveTime++; + } + | zone { + yyHaveZone++; + } + | date { + yyHaveDate++; + } + | day { + yyHaveDay++; + } + | rel { + yyHaveRel++; + } + | number + ; + +time : tUNUMBER tMERIDIAN { + yyHour = $1; + yyMinutes = 0; + yySeconds = 0; + yyMeridian = $2; + } + | tUNUMBER ':' tUNUMBER o_merid { + yyHour = $1; + yyMinutes = $3; + yySeconds = 0; + yyMeridian = $4; + } + | tUNUMBER ':' tUNUMBER tSNUMBER { + yyHour = $1; + yyMinutes = $3; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - ($4 % 100 + ($4 / 100) * 60); + } + | tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid { + yyHour = $1; + yyMinutes = $3; + yySeconds = $5; + yyMeridian = $6; + } + | tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER { + yyHour = $1; + yyMinutes = $3; + yySeconds = $5; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - ($6 % 100 + ($6 / 100) * 60); + } + ; + +zone : tZONE { + yyTimezone = $1; + yyDSTmode = DSToff; + } + | tDAYZONE { + yyTimezone = $1; + yyDSTmode = DSTon; + } + | + tZONE tDST { + yyTimezone = $1; + yyDSTmode = DSTon; + } + ; + +day : tDAY { + yyDayOrdinal = 1; + yyDayNumber = $1; + } + | tDAY ',' { + yyDayOrdinal = 1; + yyDayNumber = $1; + } + | tUNUMBER tDAY { + yyDayOrdinal = $1; + yyDayNumber = $2; + } + ; + +date : tUNUMBER '/' tUNUMBER { + yyMonth = $1; + yyDay = $3; + } + | tUNUMBER '/' tUNUMBER '/' tUNUMBER { + if ($1 >= 100) { + yyYear = $1; + yyMonth = $3; + yyDay = $5; + } else { + yyMonth = $1; + yyDay = $3; + yyYear = $5; + } + } + | tUNUMBER tSNUMBER tSNUMBER { + /* ISO 8601 format. yyyy-mm-dd. */ + yyYear = $1; + yyMonth = -$2; + yyDay = -$3; + } + | tUNUMBER tMONTH tSNUMBER { + /* e.g. 17-JUN-1992. */ + yyDay = $1; + yyMonth = $2; + yyYear = -$3; + } + | tMONTH tUNUMBER { + yyMonth = $1; + yyDay = $2; + } + | tMONTH tUNUMBER ',' tUNUMBER { + yyMonth = $1; + yyDay = $2; + yyYear = $4; + } + | tUNUMBER tMONTH { + yyMonth = $2; + yyDay = $1; + } + | tUNUMBER tMONTH tUNUMBER { + yyMonth = $2; + yyDay = $1; + yyYear = $3; + } + ; + +rel : relunit tAGO { + yyRelSeconds = -yyRelSeconds; + yyRelMonth = -yyRelMonth; + } + | relunit + ; + +relunit : tUNUMBER tMINUTE_UNIT { + yyRelSeconds += $1 * $2 * 60L; + } + | tSNUMBER tMINUTE_UNIT { + yyRelSeconds += $1 * $2 * 60L; + } + | tMINUTE_UNIT { + yyRelSeconds += $1 * 60L; + } + | tSNUMBER tSEC_UNIT { + yyRelSeconds += $1; + } + | tUNUMBER tSEC_UNIT { + yyRelSeconds += $1; + } + | tSEC_UNIT { + yyRelSeconds++; + } + | tSNUMBER tMONTH_UNIT { + yyRelMonth += $1 * $2; + } + | tUNUMBER tMONTH_UNIT { + yyRelMonth += $1 * $2; + } + | tMONTH_UNIT { + yyRelMonth += $1; + } + ; + +number : tUNUMBER { + if (yyHaveTime && yyHaveDate && !yyHaveRel) + yyYear = $1; + else { + if($1>10000) { + yyHaveDate++; + yyDay= ($1)%100; + yyMonth= ($1/100)%100; + yyYear = $1/10000; + } + else { + yyHaveTime++; + if ($1 < 100) { + yyHour = $1; + yyMinutes = 0; + } + else { + yyHour = $1 / 100; + yyMinutes = $1 % 100; + } + yySeconds = 0; + yyMeridian = MER24; + } + } + } + ; + +o_merid : /* NULL */ { + $$ = MER24; + } + | tMERIDIAN { + $$ = $1; + } + ; + +%% + +/* Month and day table. */ +static TABLE const MonthDayTable[] = { + { "january", tMONTH, 1 }, + { "february", tMONTH, 2 }, + { "march", tMONTH, 3 }, + { "april", tMONTH, 4 }, + { "may", tMONTH, 5 }, + { "june", tMONTH, 6 }, + { "july", tMONTH, 7 }, + { "august", tMONTH, 8 }, + { "september", tMONTH, 9 }, + { "sept", tMONTH, 9 }, + { "october", tMONTH, 10 }, + { "november", tMONTH, 11 }, + { "december", tMONTH, 12 }, + { "sunday", tDAY, 0 }, + { "monday", tDAY, 1 }, + { "tuesday", tDAY, 2 }, + { "tues", tDAY, 2 }, + { "wednesday", tDAY, 3 }, + { "wednes", tDAY, 3 }, + { "thursday", tDAY, 4 }, + { "thur", tDAY, 4 }, + { "thurs", tDAY, 4 }, + { "friday", tDAY, 5 }, + { "saturday", tDAY, 6 }, + { NULL } +}; + +/* Time units table. */ +static TABLE const UnitsTable[] = { + { "year", tMONTH_UNIT, 12 }, + { "month", tMONTH_UNIT, 1 }, + { "fortnight", tMINUTE_UNIT, 14 * 24 * 60 }, + { "week", tMINUTE_UNIT, 7 * 24 * 60 }, + { "day", tMINUTE_UNIT, 1 * 24 * 60 }, + { "hour", tMINUTE_UNIT, 60 }, + { "minute", tMINUTE_UNIT, 1 }, + { "min", tMINUTE_UNIT, 1 }, + { "second", tSEC_UNIT, 1 }, + { "sec", tSEC_UNIT, 1 }, + { NULL } +}; + +/* Assorted relative-time words. */ +static TABLE const OtherTable[] = { + { "tomorrow", tMINUTE_UNIT, 1 * 24 * 60 }, + { "yesterday", tMINUTE_UNIT, -1 * 24 * 60 }, + { "today", tMINUTE_UNIT, 0 }, + { "now", tMINUTE_UNIT, 0 }, + { "last", tUNUMBER, -1 }, + { "this", tUNUMBER, 0 }, + { "next", tUNUMBER, 2 }, + { "first", tUNUMBER, 1 }, +/* { "second", tUNUMBER, 2 }, */ + { "third", tUNUMBER, 3 }, + { "fourth", tUNUMBER, 4 }, + { "fifth", tUNUMBER, 5 }, + { "sixth", tUNUMBER, 6 }, + { "seventh", tUNUMBER, 7 }, + { "eighth", tUNUMBER, 8 }, + { "ninth", tUNUMBER, 9 }, + { "tenth", tUNUMBER, 10 }, + { "eleventh", tUNUMBER, 11 }, + { "twelfth", tUNUMBER, 12 }, + { "ago", tAGO, 1 }, + { NULL } +}; + +/* The timezone table. */ +/* Some of these are commented out because a time_t can't store a float. */ +static TABLE const TimezoneTable[] = { + { "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */ + { "ut", tZONE, HOUR( 0) }, /* Universal (Coordinated) */ + { "utc", tZONE, HOUR( 0) }, + { "wet", tZONE, HOUR( 0) }, /* Western European */ + { "bst", tDAYZONE, HOUR( 0) }, /* British Summer */ + { "wat", tZONE, HOUR( 1) }, /* West Africa */ + { "at", tZONE, HOUR( 2) }, /* Azores */ +#if 0 + /* For completeness. BST is also British Summer, and GST is + * also Guam Standard. */ + { "bst", tZONE, HOUR( 3) }, /* Brazil Standard */ + { "gst", tZONE, HOUR( 3) }, /* Greenland Standard */ +#endif +#if 0 + { "nft", tZONE, HOUR(3.5) }, /* Newfoundland */ + { "nst", tZONE, HOUR(3.5) }, /* Newfoundland Standard */ + { "ndt", tDAYZONE, HOUR(3.5) }, /* Newfoundland Daylight */ +#endif + { "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */ + { "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */ + { "est", tZONE, HOUR( 5) }, /* Eastern Standard */ + { "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */ + { "cst", tZONE, HOUR( 6) }, /* Central Standard */ + { "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */ + { "mst", tZONE, HOUR( 7) }, /* Mountain Standard */ + { "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */ + { "pst", tZONE, HOUR( 8) }, /* Pacific Standard */ + { "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */ + { "yst", tZONE, HOUR( 9) }, /* Yukon Standard */ + { "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */ + { "hst", tZONE, HOUR(10) }, /* Hawaii Standard */ + { "hdt", tDAYZONE, HOUR(10) }, /* Hawaii Daylight */ + { "cat", tZONE, HOUR(10) }, /* Central Alaska */ + { "ahst", tZONE, HOUR(10) }, /* Alaska-Hawaii Standard */ + { "nt", tZONE, HOUR(11) }, /* Nome */ + { "idlw", tZONE, HOUR(12) }, /* International Date Line West */ + { "cet", tZONE, -HOUR(1) }, /* Central European */ + { "met", tZONE, -HOUR(1) }, /* Middle European */ + { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */ + { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */ + { "swt", tZONE, -HOUR(1) }, /* Swedish Winter */ + { "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */ + { "fwt", tZONE, -HOUR(1) }, /* French Winter */ + { "fst", tDAYZONE, -HOUR(1) }, /* French Summer */ + { "eet", tZONE, -HOUR(2) }, /* Eastern Europe, USSR Zone 1 */ + { "bt", tZONE, -HOUR(3) }, /* Baghdad, USSR Zone 2 */ +#if 0 + { "it", tZONE, -HOUR(3.5) },/* Iran */ +#endif + { "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */ + { "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */ +#if 0 + { "ist", tZONE, -HOUR(5.5) },/* Indian Standard */ +#endif + { "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */ +#if 0 + /* For completeness. NST is also Newfoundland Stanard, and SST is + * also Swedish Summer. */ + { "nst", tZONE, -HOUR(6.5) },/* North Sumatra */ + { "sst", tZONE, -HOUR(7) }, /* South Sumatra, USSR Zone 6 */ +#endif /* 0 */ + { "wast", tZONE, -HOUR(7) }, /* West Australian Standard */ + { "wadt", tDAYZONE, -HOUR(7) }, /* West Australian Daylight */ +#if 0 + { "jt", tZONE, -HOUR(7.5) },/* Java (3pm in Cronusland!) */ +#endif + { "cct", tZONE, -HOUR(8) }, /* China Coast, USSR Zone 7 */ + { "jst", tZONE, -HOUR(9) }, /* Japan Standard, USSR Zone 8 */ +#if 0 + { "cast", tZONE, -HOUR(9.5) },/* Central Australian Standard */ + { "cadt", tDAYZONE, -HOUR(9.5) },/* Central Australian Daylight */ +#endif + { "east", tZONE, -HOUR(10) }, /* Eastern Australian Standard */ + { "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */ + { "gst", tZONE, -HOUR(10) }, /* Guam Standard, USSR Zone 9 */ + { "nzt", tZONE, -HOUR(12) }, /* New Zealand */ + { "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */ + { "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */ + { "idle", tZONE, -HOUR(12) }, /* International Date Line East */ + { NULL } +}; + +/* Military timezone table. */ +static TABLE const MilitaryTable[] = { + { "a", tZONE, HOUR( 1) }, + { "b", tZONE, HOUR( 2) }, + { "c", tZONE, HOUR( 3) }, + { "d", tZONE, HOUR( 4) }, + { "e", tZONE, HOUR( 5) }, + { "f", tZONE, HOUR( 6) }, + { "g", tZONE, HOUR( 7) }, + { "h", tZONE, HOUR( 8) }, + { "i", tZONE, HOUR( 9) }, + { "k", tZONE, HOUR( 10) }, + { "l", tZONE, HOUR( 11) }, + { "m", tZONE, HOUR( 12) }, + { "n", tZONE, HOUR(- 1) }, + { "o", tZONE, HOUR(- 2) }, + { "p", tZONE, HOUR(- 3) }, + { "q", tZONE, HOUR(- 4) }, + { "r", tZONE, HOUR(- 5) }, + { "s", tZONE, HOUR(- 6) }, + { "t", tZONE, HOUR(- 7) }, + { "u", tZONE, HOUR(- 8) }, + { "v", tZONE, HOUR(- 9) }, + { "w", tZONE, HOUR(-10) }, + { "x", tZONE, HOUR(-11) }, + { "y", tZONE, HOUR(-12) }, + { "z", tZONE, HOUR( 0) }, + { NULL } +}; + + + + +/* ARGSUSED */ +static int +yyerror(const char *s) +{ + return 0; +} + + +static time_t +ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian) +{ + if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59) + return -1; + switch (Meridian) { + case MER24: + if (Hours < 0 || Hours > 23) + return -1; + return (Hours * 60L + Minutes) * 60L + Seconds; + case MERam: + if (Hours < 1 || Hours > 12) + return -1; + if (Hours == 12) + Hours = 0; + return (Hours * 60L + Minutes) * 60L + Seconds; + case MERpm: + if (Hours < 1 || Hours > 12) + return -1; + if (Hours == 12) + Hours = 0; + return ((Hours + 12) * 60L + Minutes) * 60L + Seconds; + default: + abort (); + } + /* NOTREACHED */ +} + + +/* Year is either + * A negative number, which means to use its absolute value (why?) + * A number from 0 to 99, which means a year from 1900 to 1999, or + * The actual year (>=100). */ +static time_t +Convert(time_t Month, time_t Day, time_t Year, time_t Hours, time_t Minutes, + time_t Seconds, MERIDIAN Meridian, DSTMODE DSTmode) +{ + static int DaysInMonth[12] = { + 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 + }; + struct tm *tm; + time_t tod; + time_t Julian; + int i; + + if (Year < 0) + Year = -Year; + if (Year < 69) + Year += 2000; + else if (Year < 100) { + Year += 1900; + if (Year < EPOCH) + Year += 100; + } + DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) + ? 29 : 28; + /* 32-bit time_t cannot represent years past 2038 */ + if (Year < EPOCH || (sizeof(time_t) == sizeof(int) && Year > 2038) + || Month < 1 || Month > 12 + /* Lint fluff: "conversion from long may lose accuracy" */ + || Day < 1 || Day > DaysInMonth[(int)--Month]) + return -1; + + for (Julian = Day - 1, i = 0; i < Month; i++) + Julian += DaysInMonth[i]; + for (i = EPOCH; i < Year; i++) + Julian += 365 + (i % 4 == 0); + Julian *= SECSPERDAY; + Julian += yyTimezone * 60L; + if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0) + return -1; + Julian += tod; + if (DSTmode == DSTon + || (DSTmode == DSTmaybe && (tm = localtime(&Julian)) && tm->tm_isdst)) + Julian -= 60 * 60; + return Julian; +} + + +static time_t +DSTcorrect(time_t Start, time_t Future) +{ + struct tm *start_tm; + struct tm *future_tm; + time_t StartDay; + time_t FutureDay; + + start_tm = localtime(&Start); + future_tm = localtime(&Future); + if (!start_tm || !future_tm) + return -1; + + StartDay = (start_tm->tm_hour + 1) % 24; + FutureDay = (future_tm->tm_hour + 1) % 24; + return (Future - Start) + (StartDay - FutureDay) * 60L * 60L; +} + + +static time_t +RelativeDate(time_t Start, time_t DayOrdinal, time_t DayNumber) +{ + struct tm *tm; + time_t now; + + now = Start; + if (!(tm = localtime(&now))) + return -1; + now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7); + now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1); + return DSTcorrect(Start, now); +} + + +static time_t +RelativeMonth(time_t Start, time_t RelMonth) +{ + struct tm *tm; + time_t Month; + time_t Year; + + if (RelMonth == 0) + return 0; + if (!(tm = localtime(&Start))) + return -1; + Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth; + Year = Month / 12; + Month = Month % 12 + 1; + return DSTcorrect(Start, + Convert(Month, (time_t)tm->tm_mday, Year, + (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec, + MER24, DSTmaybe)); +} + + +static int +LookupWord(char *buff) +{ + char *p; + char *q; + const TABLE *tp; + int i; + int abbrev; + + /* Make it lowercase. */ + for (p = buff; *p; p++) + if (isupper((unsigned char)*p)) + *p = tolower((unsigned char)*p); + + if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) { + yylval.Meridian = MERam; + return tMERIDIAN; + } + if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) { + yylval.Meridian = MERpm; + return tMERIDIAN; + } + + /* See if we have an abbreviation for a month. */ + if (strlen(buff) == 3) + abbrev = 1; + else if (strlen(buff) == 4 && buff[3] == '.') { + abbrev = 1; + buff[3] = '\0'; + } + else + abbrev = 0; + + for (tp = MonthDayTable; tp->name; tp++) { + if (abbrev) { + if (strncmp(buff, tp->name, 3) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + else if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + + for (tp = TimezoneTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + if (strcmp(buff, "dst") == 0) + return tDST; + + for (tp = UnitsTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + /* Strip off any plural and try the units table again. */ + i = strlen(buff) - 1; + if (buff[i] == 's') { + buff[i] = '\0'; + for (tp = UnitsTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + buff[i] = 's'; /* Put back for "this" in OtherTable. */ + } + + for (tp = OtherTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + /* Military timezones. */ + if (buff[1] == '\0' && isalpha((unsigned char)*buff)) { + for (tp = MilitaryTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + + /* Drop out any periods and try the timezone table again. */ + for (i = 0, p = q = buff; *q; q++) + if (*q != '.') + *p++ = *q; + else + i++; + *p = '\0'; + if (i) + for (tp = TimezoneTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + return tID; +} + + +static int +yylex(void) +{ + char c; + char *p; + char buff[20]; + int Count; + int sign; + + for ( ; ; ) { + while (isspace((unsigned char)*yyInput)) + yyInput++; + + if (isdigit((unsigned char)(c = *yyInput)) || c == '-' || c == '+') { + if (c == '-' || c == '+') { + sign = c == '-' ? -1 : 1; + if (!isdigit((unsigned char)*++yyInput)) + /* skip the '-' sign */ + continue; + } + else + sign = 0; + for (yylval.Number = 0; isdigit((unsigned char)(c = *yyInput++)); ) + yylval.Number = 10 * yylval.Number + c - '0'; + yyInput--; + if (sign < 0) + yylval.Number = -yylval.Number; + return sign ? tSNUMBER : tUNUMBER; + } + if (isalpha((unsigned char)c)) { + for (p = buff; isalpha((unsigned char)(c = *yyInput++)) || c == '.'; ) + if (p < &buff[sizeof buff - 1]) + *p++ = c; + *p = '\0'; + yyInput--; + return LookupWord(buff); + } + if (c != '(') + return *yyInput++; + Count = 0; + do { + c = *yyInput++; + if (c == '\0') + return c; + if (c == '(') + Count++; + else if (c == ')') + Count--; + } while (Count > 0); + } +} + +#define TM_YEAR_ORIGIN 1900 + +/* Yield A - B, measured in seconds. */ +static long +difftm(struct tm *a, struct tm *b) +{ + int ay = a->tm_year + (TM_YEAR_ORIGIN - 1); + int by = b->tm_year + (TM_YEAR_ORIGIN - 1); + int days = ( + /* difference in day of year */ + a->tm_yday - b->tm_yday + /* + intervening leap days */ + + ((ay >> 2) - (by >> 2)) + - (ay/100 - by/100) + + ((ay/100 >> 2) - (by/100 >> 2)) + /* + difference in years * 365 */ + + (long)(ay-by) * 365 + ); + return (60*(60*(24*days + (a->tm_hour - b->tm_hour)) + + (a->tm_min - b->tm_min)) + + (a->tm_sec - b->tm_sec)); +} + +time_t +get_date(char *p) +{ + struct tm *tm, *gmt, gmtbuf; + time_t Start; + time_t tod; + time_t now; + time_t tz; + + yyInput = p; + (void)time (&now); + + gmt = gmtime (&now); + if (gmt != NULL) + { + /* Make a copy, in case localtime modifies *tm (I think + that comment now applies to *gmt, but I am too + lazy to dig into how gmtime and locatime allocate the + structures they return pointers to). */ + gmtbuf = *gmt; + gmt = &gmtbuf; + } + + if (! (tm = localtime (&now))) + return -1; + + if (gmt != NULL) + tz = difftm (gmt, tm) / 60; + else + /* We are on a system like VMS, where the system clock is + in local time and the system has no concept of timezones. + Hopefully we can fake this out (for the case in which the + user specifies no timezone) by just saying the timezone + is zero. */ + tz = 0; + + if(tm->tm_isdst) + tz += 60; + + yyYear = tm->tm_year + 1900; + yyMonth = tm->tm_mon + 1; + yyDay = tm->tm_mday; + yyTimezone = tz; + yyDSTmode = DSTmaybe; + yyHour = 0; + yyMinutes = 0; + yySeconds = 0; + yyMeridian = MER24; + yyRelSeconds = 0; + yyRelMonth = 0; + yyHaveDate = 0; + yyHaveDay = 0; + yyHaveRel = 0; + yyHaveTime = 0; + yyHaveZone = 0; + + if (yyparse() + || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1) + return -1; + + if (yyHaveDate || yyHaveTime || yyHaveDay) { + Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds, + yyMeridian, yyDSTmode); + if (Start < 0) + return -1; + } + else { + Start = now; + if (!yyHaveRel) + Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec; + } + + Start += yyRelSeconds; + Start += RelativeMonth(Start, yyRelMonth); + + if (yyHaveDay && !yyHaveDate) { + tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber); + Start += tod; + } + + /* Have to do *something* with a legitimate -1 so it's distinguishable + * from the error return value. (Alternately could set errno on error.) */ + return Start == -1 ? 0 : Start; +} + + +#ifdef TEST + +/* ARGSUSED */ +int +main(int argc, char *argv[]) +{ + char buff[128]; + time_t d; + + (void)printf("Enter date, or blank line to exit.\n\t> "); + (void)fflush(stdout); + while (fgets(buff, sizeof(buff), stdin) && buff[0]) { + d = get_date(buff); + if (d == -1) + (void)printf("Bad format - couldn't convert.\n"); + else + (void)printf("%s", ctime(&d)); + (void)printf("\t> "); + (void)fflush(stdout); + } + exit(0); + /* NOTREACHED */ +} +#endif /* TEST */ diff --git a/plugins/sudoers/getspwuid.c b/plugins/sudoers/getspwuid.c new file mode 100644 index 0000000..650b3f3 --- /dev/null +++ b/plugins/sudoers/getspwuid.c @@ -0,0 +1,139 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2010-2012, 2014-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#ifdef HAVE_GETSPNAM +# include +#endif /* HAVE_GETSPNAM */ +#ifdef HAVE_GETPRPWNAM +# ifdef __hpux +# undef MAXINT +# include +# else +# include +# endif /* __hpux */ +# include +#endif /* HAVE_GETPRPWNAM */ + +#include "sudoers.h" + +/* + * Exported for auth/secureware.c + */ +#if defined(HAVE_GETPRPWNAM) && defined(__alpha) +int crypt_type = INT_MAX; +#endif /* HAVE_GETPRPWNAM && __alpha */ + +/* + * Return a copy of the encrypted password for the user described by pw. + * If shadow passwords are in use, look in the shadow file. + */ +char * +sudo_getepw(const struct passwd *pw) +{ + char *epw = NULL; + debug_decl(sudo_getepw, SUDOERS_DEBUG_AUTH); + + /* If there is a function to check for shadow enabled, use it... */ +#ifdef HAVE_ISCOMSEC + if (!iscomsec()) + goto done; +#endif /* HAVE_ISCOMSEC */ + +#ifdef HAVE_GETPWNAM_SHADOW + { + struct passwd *spw; + + /* On OpenBSD we need to closed the non-shadow passwd db first. */ + endpwent(); + if ((spw = getpwnam_shadow(pw->pw_name)) != NULL) + epw = spw->pw_passwd; + setpassent(1); + } +#endif /* HAVE_GETPWNAM_SHADOW */ +#ifdef HAVE_GETPRPWNAM + { + struct pr_passwd *spw; + + if ((spw = getprpwnam(pw->pw_name)) && spw->ufld.fd_encrypt) { +# ifdef __alpha + crypt_type = spw->ufld.fd_oldcrypt; +# endif /* __alpha */ + epw = spw->ufld.fd_encrypt; + } + } +#endif /* HAVE_GETPRPWNAM */ +#ifdef HAVE_GETSPNAM + { + struct spwd *spw; + + if ((spw = getspnam(pw->pw_name)) && spw->sp_pwdp) + epw = spw->sp_pwdp; + } +#endif /* HAVE_GETSPNAM */ + +#if defined(HAVE_ISCOMSEC) +done: +#endif + /* If no shadow password, fall back on regular password. */ + debug_return_str(strdup(epw ? epw : pw->pw_passwd)); +} + +void +sudo_setspent(void) +{ + debug_decl(sudo_setspent, SUDOERS_DEBUG_AUTH); + +#ifdef HAVE_GETPRPWNAM + setprpwent(); +#endif +#ifdef HAVE_GETSPNAM + setspent(); +#endif + debug_return; +} + +void +sudo_endspent(void) +{ + debug_decl(sudo_endspent, SUDOERS_DEBUG_AUTH); + +#ifdef HAVE_GETPRPWNAM + endprpwent(); +#endif +#ifdef HAVE_GETSPNAM + endspent(); +#endif + debug_return; +} diff --git a/plugins/sudoers/gmtoff.c b/plugins/sudoers/gmtoff.c new file mode 100644 index 0000000..dcf4489 --- /dev/null +++ b/plugins/sudoers/gmtoff.c @@ -0,0 +1,75 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include "sudo_compat.h" +#include "sudoers_debug.h" +#include "parse.h" + +/* + * Returns the offset from GMT in seconds (algorithm taken from sendmail). + * Warning: clobbers the static storage used by localtime() and gmtime(). + */ +#ifdef HAVE_STRUCT_TM_TM_GMTOFF +long +get_gmtoff(time_t *when) +{ + struct tm *local; + + local = localtime(when); + return local->tm_gmtoff; +} +#else +long +get_gmtoff(time_t *when) +{ + struct tm *gm, gmt, *local; + long offset; + + if ((gm = gmtime(when)) == NULL) + return 0; + gmt = *gm; + if ((local = localtime(when)) == NULL) + return 0; + + offset = (local->tm_sec - gmt.tm_sec) + + ((local->tm_min - gmt.tm_min) * 60) + + ((local->tm_hour - gmt.tm_hour) * 3600); + + /* Timezone may cause year rollover to happen on a different day. */ + if (local->tm_year < gmt.tm_year) + offset -= 24 * 3600; + else if (local->tm_year > gmt.tm_year) + offset -= 24 * 3600; + else if (local->tm_yday < gmt.tm_yday) + offset -= 24 * 3600; + else if (local->tm_yday > gmt.tm_yday) + offset += 24 * 3600; + + return offset; +} +#endif /* HAVE_TM_GMTOFF */ diff --git a/plugins/sudoers/goodpath.c b/plugins/sudoers/goodpath.c new file mode 100644 index 0000000..c4c8bbd --- /dev/null +++ b/plugins/sudoers/goodpath.c @@ -0,0 +1,73 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2010-2012, 2014-2016 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include + +#include "sudoers.h" + +/* + * Verify that path is a normal file and executable by root. + */ +bool +sudo_goodpath(const char *path, const char *runchroot, struct stat *sbp) +{ + bool ret = false; + debug_decl(sudo_goodpath, SUDOERS_DEBUG_UTIL); + + if (path != NULL) { + char pathbuf[PATH_MAX]; + struct stat sb; + + if (runchroot != NULL) { + const int len = + snprintf(pathbuf, sizeof(pathbuf), "%s%s", runchroot, path); + if (len >= ssizeof(pathbuf)) { + errno = ENAMETOOLONG; + goto done; + } + path = pathbuf; // -V507 + } + if (sbp == NULL) + sbp = &sb; + + if (stat(path, sbp) == 0) { + /* Make sure path describes an executable regular file. */ + if (S_ISREG(sbp->st_mode) && ISSET(sbp->st_mode, S_IXUSR|S_IXGRP|S_IXOTH)) + ret = true; + else + errno = EACCES; + } + } +done: + debug_return_bool(ret); +} diff --git a/plugins/sudoers/gram.c b/plugins/sudoers/gram.c new file mode 100644 index 0000000..0bb7285 --- /dev/null +++ b/plugins/sudoers/gram.c @@ -0,0 +1,3709 @@ +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include +/* A Bison parser, made by GNU Bison 3.7.4. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output, and Bison version. */ +#define YYBISON 30704 + +/* Bison version string. */ +#define YYBISON_VERSION "3.7.4" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + +/* Substitute the variable and function names. */ +#define yyparse sudoersparse +#define yylex sudoerslex +#define yyerror sudoerserror +#define yydebug sudoersdebug +#define yynerrs sudoersnerrs +#define yylval sudoerslval +#define yychar sudoerschar + +/* First part of user prologue. */ +#line 1 "gram.y" + +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#include + +#include +#include +#include +#include +#include +#if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__) +# include +#endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */ +#include + +#include "sudoers.h" +#include "sudo_digest.h" +#include "toke.h" + +#ifdef YYBISON +# define YYERROR_VERBOSE +#endif + +/* If we last saw a newline the entry is on the preceding line. */ +#define this_lineno (sudoerschar == '\n' ? sudolineno - 1 : sudolineno) + +// PVS Studio suppression +// -V::1037, 1042 + +/* + * Globals + */ +bool sudoers_warnings = true; +bool sudoers_strict = false; +bool parse_error = false; +int errorlineno = -1; +char *errorfile = NULL; + +static int alias_line, alias_column; + +struct sudoers_parse_tree parsed_policy = { + TAILQ_HEAD_INITIALIZER(parsed_policy.userspecs), + TAILQ_HEAD_INITIALIZER(parsed_policy.defaults), + NULL, /* aliases */ + NULL, /* lhost */ + NULL /* shost */ +}; + +/* + * Local prototypes + */ +static void init_options(struct command_options *opts); +static bool add_defaults(int, struct member *, struct defaults *); +static bool add_userspec(struct member *, struct privilege *); +static struct defaults *new_default(char *, char *, short); +static struct member *new_member(char *, int); +static struct sudo_command *new_command(char *, char *); +static struct command_digest *new_digest(int, char *); +static void alias_error(const char *name, int errnum); + +#line 160 "gram.c" + +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +/* Use api.header.include to #include this header + instead of duplicating it here. */ +#ifndef YY_SUDOERS_Y_TAB_H_INCLUDED +# define YY_SUDOERS_Y_TAB_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int sudoersdebug; +#endif + +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + COMMAND = 258, /* COMMAND */ + ALIAS = 259, /* ALIAS */ + DEFVAR = 260, /* DEFVAR */ + NTWKADDR = 261, /* NTWKADDR */ + NETGROUP = 262, /* NETGROUP */ + USERGROUP = 263, /* USERGROUP */ + WORD = 264, /* WORD */ + DIGEST = 265, /* DIGEST */ + INCLUDE = 266, /* INCLUDE */ + INCLUDEDIR = 267, /* INCLUDEDIR */ + DEFAULTS = 268, /* DEFAULTS */ + DEFAULTS_HOST = 269, /* DEFAULTS_HOST */ + DEFAULTS_USER = 270, /* DEFAULTS_USER */ + DEFAULTS_RUNAS = 271, /* DEFAULTS_RUNAS */ + DEFAULTS_CMND = 272, /* DEFAULTS_CMND */ + NOPASSWD = 273, /* NOPASSWD */ + PASSWD = 274, /* PASSWD */ + NOEXEC = 275, /* NOEXEC */ + EXEC = 276, /* EXEC */ + SETENV = 277, /* SETENV */ + NOSETENV = 278, /* NOSETENV */ + LOG_INPUT = 279, /* LOG_INPUT */ + NOLOG_INPUT = 280, /* NOLOG_INPUT */ + LOG_OUTPUT = 281, /* LOG_OUTPUT */ + NOLOG_OUTPUT = 282, /* NOLOG_OUTPUT */ + MAIL = 283, /* MAIL */ + NOMAIL = 284, /* NOMAIL */ + FOLLOWLNK = 285, /* FOLLOWLNK */ + NOFOLLOWLNK = 286, /* NOFOLLOWLNK */ + ALL = 287, /* ALL */ + HOSTALIAS = 288, /* HOSTALIAS */ + CMNDALIAS = 289, /* CMNDALIAS */ + USERALIAS = 290, /* USERALIAS */ + RUNASALIAS = 291, /* RUNASALIAS */ + ERROR = 292, /* ERROR */ + NOMATCH = 293, /* NOMATCH */ + CHROOT = 294, /* CHROOT */ + CWD = 295, /* CWD */ + TYPE = 296, /* TYPE */ + ROLE = 297, /* ROLE */ + PRIVS = 298, /* PRIVS */ + LIMITPRIVS = 299, /* LIMITPRIVS */ + CMND_TIMEOUT = 300, /* CMND_TIMEOUT */ + NOTBEFORE = 301, /* NOTBEFORE */ + NOTAFTER = 302, /* NOTAFTER */ + MYSELF = 303, /* MYSELF */ + SHA224_TOK = 304, /* SHA224_TOK */ + SHA256_TOK = 305, /* SHA256_TOK */ + SHA384_TOK = 306, /* SHA384_TOK */ + SHA512_TOK = 307 /* SHA512_TOK */ + }; + typedef enum yytokentype yytoken_kind_t; +#endif +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 +#define COMMAND 258 +#define ALIAS 259 +#define DEFVAR 260 +#define NTWKADDR 261 +#define NETGROUP 262 +#define USERGROUP 263 +#define WORD 264 +#define DIGEST 265 +#define INCLUDE 266 +#define INCLUDEDIR 267 +#define DEFAULTS 268 +#define DEFAULTS_HOST 269 +#define DEFAULTS_USER 270 +#define DEFAULTS_RUNAS 271 +#define DEFAULTS_CMND 272 +#define NOPASSWD 273 +#define PASSWD 274 +#define NOEXEC 275 +#define EXEC 276 +#define SETENV 277 +#define NOSETENV 278 +#define LOG_INPUT 279 +#define NOLOG_INPUT 280 +#define LOG_OUTPUT 281 +#define NOLOG_OUTPUT 282 +#define MAIL 283 +#define NOMAIL 284 +#define FOLLOWLNK 285 +#define NOFOLLOWLNK 286 +#define ALL 287 +#define HOSTALIAS 288 +#define CMNDALIAS 289 +#define USERALIAS 290 +#define RUNASALIAS 291 +#define ERROR 292 +#define NOMATCH 293 +#define CHROOT 294 +#define CWD 295 +#define TYPE 296 +#define ROLE 297 +#define PRIVS 298 +#define LIMITPRIVS 299 +#define CMND_TIMEOUT 300 +#define NOTBEFORE 301 +#define NOTAFTER 302 +#define MYSELF 303 +#define SHA224_TOK 304 +#define SHA256_TOK 305 +#define SHA384_TOK 306 +#define SHA512_TOK 307 + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +union YYSTYPE +{ +#line 83 "gram.y" + + struct cmndspec *cmndspec; + struct defaults *defaults; + struct member *member; + struct runascontainer *runas; + struct privilege *privilege; + struct command_digest *digest; + struct sudo_command command; + struct command_options options; + struct cmndtag tag; + char *string; + int tok; + +#line 331 "gram.c" + +}; +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + +extern YYSTYPE sudoerslval; + +int sudoersparse (void); + +#endif /* !YY_SUDOERS_Y_TAB_H_INCLUDED */ +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_COMMAND = 3, /* COMMAND */ + YYSYMBOL_ALIAS = 4, /* ALIAS */ + YYSYMBOL_DEFVAR = 5, /* DEFVAR */ + YYSYMBOL_NTWKADDR = 6, /* NTWKADDR */ + YYSYMBOL_NETGROUP = 7, /* NETGROUP */ + YYSYMBOL_USERGROUP = 8, /* USERGROUP */ + YYSYMBOL_WORD = 9, /* WORD */ + YYSYMBOL_DIGEST = 10, /* DIGEST */ + YYSYMBOL_INCLUDE = 11, /* INCLUDE */ + YYSYMBOL_INCLUDEDIR = 12, /* INCLUDEDIR */ + YYSYMBOL_DEFAULTS = 13, /* DEFAULTS */ + YYSYMBOL_DEFAULTS_HOST = 14, /* DEFAULTS_HOST */ + YYSYMBOL_DEFAULTS_USER = 15, /* DEFAULTS_USER */ + YYSYMBOL_DEFAULTS_RUNAS = 16, /* DEFAULTS_RUNAS */ + YYSYMBOL_DEFAULTS_CMND = 17, /* DEFAULTS_CMND */ + YYSYMBOL_NOPASSWD = 18, /* NOPASSWD */ + YYSYMBOL_PASSWD = 19, /* PASSWD */ + YYSYMBOL_NOEXEC = 20, /* NOEXEC */ + YYSYMBOL_EXEC = 21, /* EXEC */ + YYSYMBOL_SETENV = 22, /* SETENV */ + YYSYMBOL_NOSETENV = 23, /* NOSETENV */ + YYSYMBOL_LOG_INPUT = 24, /* LOG_INPUT */ + YYSYMBOL_NOLOG_INPUT = 25, /* NOLOG_INPUT */ + YYSYMBOL_LOG_OUTPUT = 26, /* LOG_OUTPUT */ + YYSYMBOL_NOLOG_OUTPUT = 27, /* NOLOG_OUTPUT */ + YYSYMBOL_MAIL = 28, /* MAIL */ + YYSYMBOL_NOMAIL = 29, /* NOMAIL */ + YYSYMBOL_FOLLOWLNK = 30, /* FOLLOWLNK */ + YYSYMBOL_NOFOLLOWLNK = 31, /* NOFOLLOWLNK */ + YYSYMBOL_ALL = 32, /* ALL */ + YYSYMBOL_HOSTALIAS = 33, /* HOSTALIAS */ + YYSYMBOL_CMNDALIAS = 34, /* CMNDALIAS */ + YYSYMBOL_USERALIAS = 35, /* USERALIAS */ + YYSYMBOL_RUNASALIAS = 36, /* RUNASALIAS */ + YYSYMBOL_37_ = 37, /* ':' */ + YYSYMBOL_38_ = 38, /* '=' */ + YYSYMBOL_39_ = 39, /* ',' */ + YYSYMBOL_40_ = 40, /* '!' */ + YYSYMBOL_41_ = 41, /* '+' */ + YYSYMBOL_42_ = 42, /* '-' */ + YYSYMBOL_43_ = 43, /* '(' */ + YYSYMBOL_44_ = 44, /* ')' */ + YYSYMBOL_45_n_ = 45, /* '\n' */ + YYSYMBOL_ERROR = 46, /* ERROR */ + YYSYMBOL_NOMATCH = 47, /* NOMATCH */ + YYSYMBOL_CHROOT = 48, /* CHROOT */ + YYSYMBOL_CWD = 49, /* CWD */ + YYSYMBOL_TYPE = 50, /* TYPE */ + YYSYMBOL_ROLE = 51, /* ROLE */ + YYSYMBOL_PRIVS = 52, /* PRIVS */ + YYSYMBOL_LIMITPRIVS = 53, /* LIMITPRIVS */ + YYSYMBOL_CMND_TIMEOUT = 54, /* CMND_TIMEOUT */ + YYSYMBOL_NOTBEFORE = 55, /* NOTBEFORE */ + YYSYMBOL_NOTAFTER = 56, /* NOTAFTER */ + YYSYMBOL_MYSELF = 57, /* MYSELF */ + YYSYMBOL_SHA224_TOK = 58, /* SHA224_TOK */ + YYSYMBOL_SHA256_TOK = 59, /* SHA256_TOK */ + YYSYMBOL_SHA384_TOK = 60, /* SHA384_TOK */ + YYSYMBOL_SHA512_TOK = 61, /* SHA512_TOK */ + YYSYMBOL_YYACCEPT = 62, /* $accept */ + YYSYMBOL_file = 63, /* file */ + YYSYMBOL_line = 64, /* line */ + YYSYMBOL_entry = 65, /* entry */ + YYSYMBOL_include = 66, /* include */ + YYSYMBOL_includedir = 67, /* includedir */ + YYSYMBOL_defaults_list = 68, /* defaults_list */ + YYSYMBOL_defaults_entry = 69, /* defaults_entry */ + YYSYMBOL_privileges = 70, /* privileges */ + YYSYMBOL_privilege = 71, /* privilege */ + YYSYMBOL_ophost = 72, /* ophost */ + YYSYMBOL_host = 73, /* host */ + YYSYMBOL_cmndspeclist = 74, /* cmndspeclist */ + YYSYMBOL_cmndspec = 75, /* cmndspec */ + YYSYMBOL_digestspec = 76, /* digestspec */ + YYSYMBOL_digestlist = 77, /* digestlist */ + YYSYMBOL_digcmnd = 78, /* digcmnd */ + YYSYMBOL_opcmnd = 79, /* opcmnd */ + YYSYMBOL_chdirspec = 80, /* chdirspec */ + YYSYMBOL_chrootspec = 81, /* chrootspec */ + YYSYMBOL_timeoutspec = 82, /* timeoutspec */ + YYSYMBOL_notbeforespec = 83, /* notbeforespec */ + YYSYMBOL_notafterspec = 84, /* notafterspec */ + YYSYMBOL_rolespec = 85, /* rolespec */ + YYSYMBOL_typespec = 86, /* typespec */ + YYSYMBOL_privsspec = 87, /* privsspec */ + YYSYMBOL_limitprivsspec = 88, /* limitprivsspec */ + YYSYMBOL_runasspec = 89, /* runasspec */ + YYSYMBOL_runaslist = 90, /* runaslist */ + YYSYMBOL_reserved_word = 91, /* reserved_word */ + YYSYMBOL_reserved_alias = 92, /* reserved_alias */ + YYSYMBOL_options = 93, /* options */ + YYSYMBOL_cmndtag = 94, /* cmndtag */ + YYSYMBOL_cmnd = 95, /* cmnd */ + YYSYMBOL_hostaliases = 96, /* hostaliases */ + YYSYMBOL_hostalias = 97, /* hostalias */ + YYSYMBOL_98_1 = 98, /* $@1 */ + YYSYMBOL_hostlist = 99, /* hostlist */ + YYSYMBOL_cmndaliases = 100, /* cmndaliases */ + YYSYMBOL_cmndalias = 101, /* cmndalias */ + YYSYMBOL_102_2 = 102, /* $@2 */ + YYSYMBOL_cmndlist = 103, /* cmndlist */ + YYSYMBOL_runasaliases = 104, /* runasaliases */ + YYSYMBOL_runasalias = 105, /* runasalias */ + YYSYMBOL_106_3 = 106, /* $@3 */ + YYSYMBOL_useraliases = 107, /* useraliases */ + YYSYMBOL_useralias = 108, /* useralias */ + YYSYMBOL_109_4 = 109, /* $@4 */ + YYSYMBOL_userlist = 110, /* userlist */ + YYSYMBOL_opuser = 111, /* opuser */ + YYSYMBOL_user = 112, /* user */ + YYSYMBOL_grouplist = 113, /* grouplist */ + YYSYMBOL_opgroup = 114, /* opgroup */ + YYSYMBOL_group = 115 /* group */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; + + + + +#ifdef short +# undef short +#endif + +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif +#endif + +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; +#else +typedef short yytype_int16; +#endif + +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; +#else +typedef short yytype_uint8; +#endif + +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; +#else +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned +# endif +#endif + +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_uint8 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ +#endif + +#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + + +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if !defined yyoverflow + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* !defined yyoverflow */ + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 88 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 320 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 62 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 54 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 149 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 248 + +/* YYMAXUTOK -- Last valid token kind. */ +#define YYMAXUTOK 307 + + +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 40, 2, 2, 2, 2, 2, 2, + 43, 44, 2, 41, 39, 42, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 37, 2, + 2, 38, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61 +}; + +#if YYDEBUG + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_int16 yyrline[] = +{ + 0, 192, 192, 195, 198, 199, 202, 205, 208, 215, + 222, 228, 231, 234, 237, 240, 244, 248, 252, 256, + 262, 265, 271, 274, 280, 281, 287, 294, 301, 308, + 315, 324, 325, 329, 335, 349, 353, 359, 366, 373, + 380, 387, 396, 397, 456, 511, 518, 525, 532, 541, + 542, 548, 551, 572, 576, 582, 594, 606, 611, 615, + 620, 625, 630, 634, 639, 642, 647, 662, 671, 680, + 689, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 718, 724, 727, 731, 735, 743, 751, 762, 768, + 774, 780, 788, 791, 794, 797, 800, 803, 806, 809, + 812, 815, 818, 821, 824, 827, 830, 835, 842, 849, + 865, 866, 869, 869, 879, 882, 883, 889, 890, 893, + 893, 903, 906, 907, 913, 914, 917, 917, 927, 930, + 931, 934, 934, 944, 947, 948, 954, 958, 964, 971, + 978, 985, 992, 1001, 1002, 1008, 1012, 1018, 1025, 1032 +}; +#endif + +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of file\"", "error", "\"invalid token\"", "COMMAND", "ALIAS", + "DEFVAR", "NTWKADDR", "NETGROUP", "USERGROUP", "WORD", "DIGEST", + "INCLUDE", "INCLUDEDIR", "DEFAULTS", "DEFAULTS_HOST", "DEFAULTS_USER", + "DEFAULTS_RUNAS", "DEFAULTS_CMND", "NOPASSWD", "PASSWD", "NOEXEC", + "EXEC", "SETENV", "NOSETENV", "LOG_INPUT", "NOLOG_INPUT", "LOG_OUTPUT", + "NOLOG_OUTPUT", "MAIL", "NOMAIL", "FOLLOWLNK", "NOFOLLOWLNK", "ALL", + "HOSTALIAS", "CMNDALIAS", "USERALIAS", "RUNASALIAS", "':'", "'='", "','", + "'!'", "'+'", "'-'", "'('", "')'", "'\\n'", "ERROR", "NOMATCH", "CHROOT", + "CWD", "TYPE", "ROLE", "PRIVS", "LIMITPRIVS", "CMND_TIMEOUT", + "NOTBEFORE", "NOTAFTER", "MYSELF", "SHA224_TOK", "SHA256_TOK", + "SHA384_TOK", "SHA512_TOK", "$accept", "file", "line", "entry", + "include", "includedir", "defaults_list", "defaults_entry", "privileges", + "privilege", "ophost", "host", "cmndspeclist", "cmndspec", "digestspec", + "digestlist", "digcmnd", "opcmnd", "chdirspec", "chrootspec", + "timeoutspec", "notbeforespec", "notafterspec", "rolespec", "typespec", + "privsspec", "limitprivsspec", "runasspec", "runaslist", "reserved_word", + "reserved_alias", "options", "cmndtag", "cmnd", "hostaliases", + "hostalias", "$@1", "hostlist", "cmndaliases", "cmndalias", "$@2", + "cmndlist", "runasaliases", "runasalias", "$@3", "useraliases", + "useralias", "$@4", "userlist", "opuser", "user", "grouplist", "opgroup", + "group", YY_NULLPTR +}; + +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) +{ + return yytname[yysymbol]; +} +#endif + +#ifdef YYPRINT +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ +static const yytype_int16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 58, 61, 44, + 33, 43, 45, 40, 41, 10, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307 +}; +#endif + +#define YYPACT_NINF (-114) + +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) + +#define YYTABLE_NINF (-4) + +#define yytable_value_is_error(Yyn) \ + 0 + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const yytype_int16 yypact[] = +{ + 178, -11, -114, -114, -114, -114, 27, 44, 9, 240, + 148, 148, 6, -114, 31, 40, 112, 121, 193, -114, + 75, 220, -114, -114, -114, 95, -114, -114, -114, 10, + 11, 16, 73, 32, -114, -114, -114, -114, -114, -114, + 255, -114, -114, 8, 12, 12, -114, -114, -114, 106, + 63, 70, 74, 89, -114, 66, -114, -114, -114, 34, + -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, + -114, -114, 107, 77, -114, -114, 120, 83, -114, -114, + 143, 87, -114, -114, 158, 92, -114, -114, -114, -114, + 148, 105, -114, 145, 88, -114, 102, -114, 189, 190, + 197, -114, 9, -114, -114, 240, 91, 101, 104, -114, + 198, 206, 207, 212, 209, -114, 6, 170, 169, 240, + 31, -114, 188, 6, 40, -114, 192, 148, 112, -114, + 201, 148, 121, -114, -114, 36, -114, 202, -114, -114, + -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, + -114, -114, -114, -114, -114, 240, 211, -114, 6, 218, + -114, 148, 219, -114, 148, 219, -114, -114, -114, 234, + 224, -114, -114, 211, 218, 219, 219, 99, 196, -21, + 202, 241, -114, -114, -114, 109, 236, -114, -114, -114, + 99, -114, 210, 213, 235, 238, 239, 243, 244, 245, + 246, -114, -114, -114, -114, -114, -114, -114, -114, -114, + 1, -114, 99, 236, 269, 270, 276, 277, 279, 289, + 290, 291, 292, -114, -114, -114, -114, -114, -114, -114, + -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, + -114, -114, -114, -114, -114, -114, -114, -114 +}; + + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 0, 138, 140, 141, 142, 0, 0, 0, 0, + 0, 0, 0, 139, 0, 0, 0, 0, 0, 6, + 0, 0, 4, 8, 9, 0, 134, 136, 7, 0, + 0, 26, 0, 0, 24, 37, 40, 39, 41, 38, + 0, 115, 35, 0, 0, 0, 109, 108, 107, 0, + 0, 0, 0, 0, 49, 0, 122, 51, 53, 0, + 112, 71, 72, 73, 78, 77, 79, 80, 74, 75, + 76, 81, 0, 0, 110, 119, 0, 0, 117, 131, + 0, 0, 129, 126, 0, 0, 124, 137, 1, 5, + 0, 0, 31, 0, 0, 20, 0, 22, 0, 0, + 0, 27, 0, 15, 36, 0, 0, 0, 0, 54, + 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, + 0, 12, 0, 0, 0, 13, 0, 0, 0, 11, + 0, 0, 0, 14, 135, 0, 10, 64, 21, 23, + 28, 29, 30, 25, 116, 18, 16, 17, 45, 46, + 47, 48, 50, 123, 19, 0, 114, 111, 0, 121, + 118, 0, 133, 130, 0, 128, 125, 33, 32, 66, + 34, 42, 82, 113, 120, 132, 127, 70, 0, 67, + 64, 92, 147, 149, 148, 0, 69, 143, 145, 65, + 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 83, 84, 87, 85, 86, 88, 89, 90, 91, + 0, 146, 0, 68, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 105, 106, 103, 104, 44, 144, 56, + 55, 61, 60, 62, 63, 57, 58, 59 +}; + + /* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -114, -114, -114, 281, -114, -114, 160, 203, -114, 168, + 199, 266, -114, 127, 194, -114, -113, 254, -114, -114, + -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, + -9, -114, -114, 261, -114, 191, -114, -7, -114, 195, + -114, -108, -114, 180, -114, -114, 185, -114, -10, 225, + 296, 126, 108, 132 +}; + + /* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 20, 21, 22, 23, 24, 33, 34, 91, 92, + 41, 42, 170, 171, 54, 55, 56, 57, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 172, 178, 71, + 72, 181, 210, 58, 73, 74, 118, 93, 77, 78, + 122, 59, 85, 86, 130, 81, 82, 126, 25, 26, + 27, 186, 187, 188 +}; + + /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 44, 45, 43, 153, 46, 47, 76, 80, 84, 46, + 47, 94, 96, 31, 31, 159, 190, 31, 90, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 48, 28, 60, 29, 167, 48, 31, + 35, 49, 36, 37, 75, 38, 49, 105, 32, 32, + 174, 90, 32, 30, 98, 95, 97, 99, 100, 50, + 51, 52, 53, 61, 50, 51, 52, 53, 39, 46, + 47, 102, 61, 116, 32, 88, 40, 103, 101, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 237, 48, 35, + 110, 36, 37, 182, 38, 114, 49, 111, 183, 46, + 47, 112, 156, 182, 120, 76, 79, 162, 183, 80, + 124, 165, 121, 84, 128, 83, 113, 39, 125, 132, + 102, 184, 129, 138, 90, 40, 145, 133, 48, 185, + 102, 184, 135, 102, 61, 119, 146, 139, 173, 147, + 136, 175, 2, 61, 176, 3, 4, 5, 123, 179, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 62, + 63, 64, 65, 66, 67, 68, 69, 70, -2, 1, + 13, 127, 2, 137, 105, 3, 4, 5, 18, 6, + 7, 8, 9, 10, 11, 12, 131, 2, 140, 141, + 3, 4, 5, 106, 107, 108, 142, 155, 148, 102, + 13, 14, 15, 16, 17, 154, 149, 150, 18, 117, + -3, 1, 151, 19, 2, 13, 158, 3, 4, 5, + 161, 6, 7, 8, 9, 10, 11, 12, 2, 164, + 189, 3, 4, 5, 35, 169, 36, 37, 214, 38, + 105, 215, 13, 14, 15, 16, 17, 116, 90, 35, + 18, 36, 37, 180, 38, 19, 13, 50, 51, 52, + 53, 177, 39, 216, 18, 212, 217, 218, 239, 240, + 40, 219, 220, 221, 222, 241, 242, 39, 243, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 244, 245, + 246, 247, 89, 168, 144, 143, 104, 191, 152, 115, + 109, 157, 166, 163, 87, 134, 213, 211, 0, 160, + 238 +}; + +static const yytype_int16 yycheck[] = +{ + 10, 11, 9, 116, 3, 4, 15, 16, 17, 3, + 4, 1, 1, 5, 5, 123, 37, 5, 39, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 45, 4, 9, 1, 32, 5, + 4, 40, 6, 7, 4, 9, 40, 39, 40, 40, + 158, 39, 40, 9, 38, 45, 45, 41, 42, 58, + 59, 60, 61, 32, 58, 59, 60, 61, 32, 3, + 4, 39, 32, 39, 40, 0, 40, 45, 5, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 210, 32, 4, + 37, 6, 7, 4, 9, 39, 40, 37, 9, 3, + 4, 37, 119, 4, 37, 124, 4, 127, 9, 128, + 37, 131, 45, 132, 37, 4, 37, 32, 45, 37, + 39, 32, 45, 45, 39, 40, 45, 45, 32, 40, + 39, 32, 37, 39, 32, 38, 45, 45, 155, 45, + 45, 161, 4, 32, 164, 7, 8, 9, 38, 169, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 0, 1, + 32, 38, 4, 38, 39, 7, 8, 9, 40, 11, + 12, 13, 14, 15, 16, 17, 38, 4, 9, 9, + 7, 8, 9, 43, 44, 45, 9, 38, 10, 39, + 32, 33, 34, 35, 36, 45, 10, 10, 40, 59, + 0, 1, 10, 45, 4, 32, 38, 7, 8, 9, + 38, 11, 12, 13, 14, 15, 16, 17, 4, 38, + 44, 7, 8, 9, 4, 43, 6, 7, 38, 9, + 39, 38, 32, 33, 34, 35, 36, 39, 39, 4, + 40, 6, 7, 39, 9, 45, 32, 58, 59, 60, + 61, 37, 32, 38, 40, 39, 38, 38, 9, 9, + 40, 38, 38, 38, 38, 9, 9, 32, 9, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 9, 9, + 9, 9, 21, 135, 105, 102, 40, 180, 114, 55, + 49, 120, 132, 128, 18, 90, 190, 185, -1, 124, + 212 +}; + + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_int8 yystos[] = +{ + 0, 1, 4, 7, 8, 9, 11, 12, 13, 14, + 15, 16, 17, 32, 33, 34, 35, 36, 40, 45, + 63, 64, 65, 66, 67, 110, 111, 112, 45, 9, + 9, 5, 40, 68, 69, 4, 6, 7, 9, 32, + 40, 72, 73, 99, 110, 110, 3, 4, 32, 40, + 58, 59, 60, 61, 76, 77, 78, 79, 95, 103, + 4, 32, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 91, 92, 96, 97, 4, 92, 100, 101, 4, + 92, 107, 108, 4, 92, 104, 105, 112, 0, 65, + 39, 70, 71, 99, 1, 45, 1, 45, 38, 41, + 42, 5, 39, 45, 73, 39, 68, 68, 68, 95, + 37, 37, 37, 37, 39, 79, 39, 68, 98, 38, + 37, 45, 102, 38, 37, 45, 109, 38, 37, 45, + 106, 38, 37, 45, 111, 37, 45, 38, 45, 45, + 9, 9, 9, 69, 72, 45, 45, 45, 10, 10, + 10, 10, 76, 78, 45, 38, 99, 97, 38, 103, + 101, 38, 110, 108, 38, 110, 105, 1, 71, 43, + 74, 75, 89, 99, 103, 110, 110, 37, 90, 110, + 39, 93, 4, 9, 32, 40, 113, 114, 115, 44, + 37, 75, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 94, 115, 39, 113, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 78, 114, 9, + 9, 9, 9, 9, 9, 9, 9, 9 +}; + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_int8 yyr1[] = +{ + 0, 62, 63, 63, 64, 64, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 66, 66, 67, 67, 68, 68, 69, 69, 69, 69, + 69, 70, 70, 70, 71, 72, 72, 73, 73, 73, + 73, 73, 74, 74, 75, 76, 76, 76, 76, 77, + 77, 78, 78, 79, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 89, 90, 90, 90, 90, + 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 92, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, + 96, 96, 98, 97, 97, 99, 99, 100, 100, 102, + 101, 101, 103, 103, 104, 104, 106, 105, 105, 107, + 107, 109, 108, 108, 110, 110, 111, 111, 112, 112, + 112, 112, 112, 113, 113, 114, 114, 115, 115, 115 +}; + + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 0, 1, 1, 2, 1, 2, 1, 1, + 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, + 3, 4, 3, 4, 1, 3, 1, 2, 3, 3, + 3, 1, 3, 3, 3, 1, 2, 1, 1, 1, + 1, 1, 1, 3, 4, 3, 3, 3, 3, 1, + 3, 1, 2, 1, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 3, 0, 1, 3, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, + 1, 3, 0, 4, 3, 1, 3, 1, 3, 0, + 4, 3, 1, 3, 1, 3, 0, 4, 3, 1, + 3, 0, 4, 3, 1, 3, 1, 2, 1, 1, + 1, 1, 1, 1, 3, 1, 2, 1, 1, 1 +}; + + +enum { YYENOMEM = -2 }; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +/* This macro is provided for backward compatibility. */ +# ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) +{ + FILE *yyoutput = yyo; + YYUSE (yyoutput); + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yykind < YYNTOKENS) + YYPRINT (yyo, yytoknum[yykind], *yyvaluep); +# endif + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YYUSE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ + +static void +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) +{ + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); + + yy_symbol_value_print (yyo, yykind, yyvaluep); + YYFPRINTF (yyo, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule) +{ + int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)]); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + + + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep) +{ + YYUSE (yyvaluep); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YYUSE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + +/* Lookahead token kind. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; +/* Number of syntax errors so far. */ +int yynerrs; + + + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (void) +{ + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; + + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; + + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; + + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yychar = YYEMPTY; /* Cause a token to be read. */ + goto yysetstate; + + +/*------------------------------------------------------------. +| yynewstate -- push a new state, which is found in yystate. | +`------------------------------------------------------------*/ +yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); + + if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + goto yyexhaustedlab; +#else + { + /* Get the current used size of the three stacks, in elements. */ + YYPTRDIFF_T yysize = yyssp - yyss + 1; + +# if defined yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; + } +# else /* defined YYSTACK_RELOCATE */ + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (); + } + + if (yychar <= YYEOF) + { + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + /* Discard the shifted token. */ + yychar = YYEMPTY; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: /* file: %empty */ +#line 192 "gram.y" + { + ; /* empty file */ + } +#line 1624 "gram.c" + break; + + case 6: /* entry: '\n' */ +#line 202 "gram.y" + { + ; /* blank line */ + } +#line 1632 "gram.c" + break; + + case 7: /* entry: error '\n' */ +#line 205 "gram.y" + { + yyerrok; + } +#line 1640 "gram.c" + break; + + case 8: /* entry: include */ +#line 208 "gram.y" + { + if (!push_include((yyvsp[0].string), false)) { + free((yyvsp[0].string)); + YYERROR; + } + free((yyvsp[0].string)); + } +#line 1652 "gram.c" + break; + + case 9: /* entry: includedir */ +#line 215 "gram.y" + { + if (!push_include((yyvsp[0].string), true)) { + free((yyvsp[0].string)); + YYERROR; + } + free((yyvsp[0].string)); + } +#line 1664 "gram.c" + break; + + case 10: /* entry: userlist privileges '\n' */ +#line 222 "gram.y" + { + if (!add_userspec((yyvsp[-2].member), (yyvsp[-1].privilege))) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1675 "gram.c" + break; + + case 11: /* entry: USERALIAS useraliases '\n' */ +#line 228 "gram.y" + { + ; + } +#line 1683 "gram.c" + break; + + case 12: /* entry: HOSTALIAS hostaliases '\n' */ +#line 231 "gram.y" + { + ; + } +#line 1691 "gram.c" + break; + + case 13: /* entry: CMNDALIAS cmndaliases '\n' */ +#line 234 "gram.y" + { + ; + } +#line 1699 "gram.c" + break; + + case 14: /* entry: RUNASALIAS runasaliases '\n' */ +#line 237 "gram.y" + { + ; + } +#line 1707 "gram.c" + break; + + case 15: /* entry: DEFAULTS defaults_list '\n' */ +#line 240 "gram.y" + { + if (!add_defaults(DEFAULTS, NULL, (yyvsp[-1].defaults))) + YYERROR; + } +#line 1716 "gram.c" + break; + + case 16: /* entry: DEFAULTS_USER userlist defaults_list '\n' */ +#line 244 "gram.y" + { + if (!add_defaults(DEFAULTS_USER, (yyvsp[-2].member), (yyvsp[-1].defaults))) + YYERROR; + } +#line 1725 "gram.c" + break; + + case 17: /* entry: DEFAULTS_RUNAS userlist defaults_list '\n' */ +#line 248 "gram.y" + { + if (!add_defaults(DEFAULTS_RUNAS, (yyvsp[-2].member), (yyvsp[-1].defaults))) + YYERROR; + } +#line 1734 "gram.c" + break; + + case 18: /* entry: DEFAULTS_HOST hostlist defaults_list '\n' */ +#line 252 "gram.y" + { + if (!add_defaults(DEFAULTS_HOST, (yyvsp[-2].member), (yyvsp[-1].defaults))) + YYERROR; + } +#line 1743 "gram.c" + break; + + case 19: /* entry: DEFAULTS_CMND cmndlist defaults_list '\n' */ +#line 256 "gram.y" + { + if (!add_defaults(DEFAULTS_CMND, (yyvsp[-2].member), (yyvsp[-1].defaults))) + YYERROR; + } +#line 1752 "gram.c" + break; + + case 20: /* include: INCLUDE WORD '\n' */ +#line 262 "gram.y" + { + (yyval.string) = (yyvsp[-1].string); + } +#line 1760 "gram.c" + break; + + case 21: /* include: INCLUDE WORD error '\n' */ +#line 265 "gram.y" + { + yyerrok; + (yyval.string) = (yyvsp[-2].string); + } +#line 1769 "gram.c" + break; + + case 22: /* includedir: INCLUDEDIR WORD '\n' */ +#line 271 "gram.y" + { + (yyval.string) = (yyvsp[-1].string); + } +#line 1777 "gram.c" + break; + + case 23: /* includedir: INCLUDEDIR WORD error '\n' */ +#line 274 "gram.y" + { + yyerrok; + (yyval.string) = (yyvsp[-2].string); + } +#line 1786 "gram.c" + break; + + case 25: /* defaults_list: defaults_list ',' defaults_entry */ +#line 281 "gram.y" + { + HLTQ_CONCAT((yyvsp[-2].defaults), (yyvsp[0].defaults), entries); + (yyval.defaults) = (yyvsp[-2].defaults); + } +#line 1795 "gram.c" + break; + + case 26: /* defaults_entry: DEFVAR */ +#line 287 "gram.y" + { + (yyval.defaults) = new_default((yyvsp[0].string), NULL, true); + if ((yyval.defaults) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1807 "gram.c" + break; + + case 27: /* defaults_entry: '!' DEFVAR */ +#line 294 "gram.y" + { + (yyval.defaults) = new_default((yyvsp[0].string), NULL, false); + if ((yyval.defaults) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1819 "gram.c" + break; + + case 28: /* defaults_entry: DEFVAR '=' WORD */ +#line 301 "gram.y" + { + (yyval.defaults) = new_default((yyvsp[-2].string), (yyvsp[0].string), true); + if ((yyval.defaults) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1831 "gram.c" + break; + + case 29: /* defaults_entry: DEFVAR '+' WORD */ +#line 308 "gram.y" + { + (yyval.defaults) = new_default((yyvsp[-2].string), (yyvsp[0].string), '+'); + if ((yyval.defaults) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1843 "gram.c" + break; + + case 30: /* defaults_entry: DEFVAR '-' WORD */ +#line 315 "gram.y" + { + (yyval.defaults) = new_default((yyvsp[-2].string), (yyvsp[0].string), '-'); + if ((yyval.defaults) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1855 "gram.c" + break; + + case 32: /* privileges: privileges ':' privilege */ +#line 325 "gram.y" + { + HLTQ_CONCAT((yyvsp[-2].privilege), (yyvsp[0].privilege), entries); + (yyval.privilege) = (yyvsp[-2].privilege); + } +#line 1864 "gram.c" + break; + + case 33: /* privileges: privileges ':' error */ +#line 329 "gram.y" + { + yyerrok; + (yyval.privilege) = (yyvsp[-2].privilege); + } +#line 1873 "gram.c" + break; + + case 34: /* privilege: hostlist '=' cmndspeclist */ +#line 335 "gram.y" + { + struct privilege *p = calloc(1, sizeof(*p)); + if (p == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + TAILQ_INIT(&p->defaults); + HLTQ_TO_TAILQ(&p->hostlist, (yyvsp[-2].member), entries); + HLTQ_TO_TAILQ(&p->cmndlist, (yyvsp[0].cmndspec), entries); + HLTQ_INIT(p, entries); + (yyval.privilege) = p; + } +#line 1890 "gram.c" + break; + + case 35: /* ophost: host */ +#line 349 "gram.y" + { + (yyval.member) = (yyvsp[0].member); + (yyval.member)->negated = false; + } +#line 1899 "gram.c" + break; + + case 36: /* ophost: '!' host */ +#line 353 "gram.y" + { + (yyval.member) = (yyvsp[0].member); + (yyval.member)->negated = true; + } +#line 1908 "gram.c" + break; + + case 37: /* host: ALIAS */ +#line 359 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), ALIAS); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1920 "gram.c" + break; + + case 38: /* host: ALL */ +#line 366 "gram.y" + { + (yyval.member) = new_member(NULL, ALL); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1932 "gram.c" + break; + + case 39: /* host: NETGROUP */ +#line 373 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), NETGROUP); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1944 "gram.c" + break; + + case 40: /* host: NTWKADDR */ +#line 380 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), NTWKADDR); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1956 "gram.c" + break; + + case 41: /* host: WORD */ +#line 387 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), WORD); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 1968 "gram.c" + break; + + case 43: /* cmndspeclist: cmndspeclist ',' cmndspec */ +#line 397 "gram.y" + { + struct cmndspec *prev; + prev = HLTQ_LAST((yyvsp[-2].cmndspec), cmndspec, entries); + HLTQ_CONCAT((yyvsp[-2].cmndspec), (yyvsp[0].cmndspec), entries); + + /* propagate runcwd and runchroot */ + if ((yyvsp[0].cmndspec)->runcwd == NULL) + (yyvsp[0].cmndspec)->runcwd = prev->runcwd; + if ((yyvsp[0].cmndspec)->runchroot == NULL) + (yyvsp[0].cmndspec)->runchroot = prev->runchroot; +#ifdef HAVE_SELINUX + /* propagate role and type */ + if ((yyvsp[0].cmndspec)->role == NULL && (yyvsp[0].cmndspec)->type == NULL) { + (yyvsp[0].cmndspec)->role = prev->role; + (yyvsp[0].cmndspec)->type = prev->type; + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* propagate privs & limitprivs */ + if ((yyvsp[0].cmndspec)->privs == NULL && (yyvsp[0].cmndspec)->limitprivs == NULL) { + (yyvsp[0].cmndspec)->privs = prev->privs; + (yyvsp[0].cmndspec)->limitprivs = prev->limitprivs; + } +#endif /* HAVE_PRIV_SET */ + /* propagate command time restrictions */ + if ((yyvsp[0].cmndspec)->notbefore == UNSPEC) + (yyvsp[0].cmndspec)->notbefore = prev->notbefore; + if ((yyvsp[0].cmndspec)->notafter == UNSPEC) + (yyvsp[0].cmndspec)->notafter = prev->notafter; + /* propagate command timeout */ + if ((yyvsp[0].cmndspec)->timeout == UNSPEC) + (yyvsp[0].cmndspec)->timeout = prev->timeout; + /* propagate tags and runas list */ + if ((yyvsp[0].cmndspec)->tags.nopasswd == UNSPEC) + (yyvsp[0].cmndspec)->tags.nopasswd = prev->tags.nopasswd; + if ((yyvsp[0].cmndspec)->tags.noexec == UNSPEC) + (yyvsp[0].cmndspec)->tags.noexec = prev->tags.noexec; + if ((yyvsp[0].cmndspec)->tags.setenv == UNSPEC && + prev->tags.setenv != IMPLIED) + (yyvsp[0].cmndspec)->tags.setenv = prev->tags.setenv; + if ((yyvsp[0].cmndspec)->tags.log_input == UNSPEC) + (yyvsp[0].cmndspec)->tags.log_input = prev->tags.log_input; + if ((yyvsp[0].cmndspec)->tags.log_output == UNSPEC) + (yyvsp[0].cmndspec)->tags.log_output = prev->tags.log_output; + if ((yyvsp[0].cmndspec)->tags.send_mail == UNSPEC) + (yyvsp[0].cmndspec)->tags.send_mail = prev->tags.send_mail; + if ((yyvsp[0].cmndspec)->tags.follow == UNSPEC) + (yyvsp[0].cmndspec)->tags.follow = prev->tags.follow; + if (((yyvsp[0].cmndspec)->runasuserlist == NULL && + (yyvsp[0].cmndspec)->runasgrouplist == NULL) && + (prev->runasuserlist != NULL || + prev->runasgrouplist != NULL)) { + (yyvsp[0].cmndspec)->runasuserlist = prev->runasuserlist; + (yyvsp[0].cmndspec)->runasgrouplist = prev->runasgrouplist; + } + (yyval.cmndspec) = (yyvsp[-2].cmndspec); + } +#line 2030 "gram.c" + break; + + case 44: /* cmndspec: runasspec options cmndtag digcmnd */ +#line 456 "gram.y" + { + struct cmndspec *cs = calloc(1, sizeof(*cs)); + if (cs == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + if ((yyvsp[-3].runas) != NULL) { + if ((yyvsp[-3].runas)->runasusers != NULL) { + cs->runasuserlist = + malloc(sizeof(*cs->runasuserlist)); + if (cs->runasuserlist == NULL) { + free(cs); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + HLTQ_TO_TAILQ(cs->runasuserlist, + (yyvsp[-3].runas)->runasusers, entries); + } + if ((yyvsp[-3].runas)->runasgroups != NULL) { + cs->runasgrouplist = + malloc(sizeof(*cs->runasgrouplist)); + if (cs->runasgrouplist == NULL) { + free(cs); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + HLTQ_TO_TAILQ(cs->runasgrouplist, + (yyvsp[-3].runas)->runasgroups, entries); + } + free((yyvsp[-3].runas)); + } +#ifdef HAVE_SELINUX + cs->role = (yyvsp[-2].options).role; + cs->type = (yyvsp[-2].options).type; +#endif +#ifdef HAVE_PRIV_SET + cs->privs = (yyvsp[-2].options).privs; + cs->limitprivs = (yyvsp[-2].options).limitprivs; +#endif + cs->notbefore = (yyvsp[-2].options).notbefore; + cs->notafter = (yyvsp[-2].options).notafter; + cs->timeout = (yyvsp[-2].options).timeout; + cs->runcwd = (yyvsp[-2].options).runcwd; + cs->runchroot = (yyvsp[-2].options).runchroot; + cs->tags = (yyvsp[-1].tag); + cs->cmnd = (yyvsp[0].member); + HLTQ_INIT(cs, entries); + /* sudo "ALL" implies the SETENV tag */ + if (cs->cmnd->type == ALL && !cs->cmnd->negated && + cs->tags.setenv == UNSPEC) + cs->tags.setenv = IMPLIED; + (yyval.cmndspec) = cs; + } +#line 2088 "gram.c" + break; + + case 45: /* digestspec: SHA224_TOK ':' DIGEST */ +#line 511 "gram.y" + { + (yyval.digest) = new_digest(SUDO_DIGEST_SHA224, (yyvsp[0].string)); + if ((yyval.digest) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2100 "gram.c" + break; + + case 46: /* digestspec: SHA256_TOK ':' DIGEST */ +#line 518 "gram.y" + { + (yyval.digest) = new_digest(SUDO_DIGEST_SHA256, (yyvsp[0].string)); + if ((yyval.digest) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2112 "gram.c" + break; + + case 47: /* digestspec: SHA384_TOK ':' DIGEST */ +#line 525 "gram.y" + { + (yyval.digest) = new_digest(SUDO_DIGEST_SHA384, (yyvsp[0].string)); + if ((yyval.digest) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2124 "gram.c" + break; + + case 48: /* digestspec: SHA512_TOK ':' DIGEST */ +#line 532 "gram.y" + { + (yyval.digest) = new_digest(SUDO_DIGEST_SHA512, (yyvsp[0].string)); + if ((yyval.digest) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2136 "gram.c" + break; + + case 50: /* digestlist: digestlist ',' digestspec */ +#line 542 "gram.y" + { + HLTQ_CONCAT((yyvsp[-2].digest), (yyvsp[0].digest), entries); + (yyval.digest) = (yyvsp[-2].digest); + } +#line 2145 "gram.c" + break; + + case 51: /* digcmnd: opcmnd */ +#line 548 "gram.y" + { + (yyval.member) = (yyvsp[0].member); + } +#line 2153 "gram.c" + break; + + case 52: /* digcmnd: digestlist opcmnd */ +#line 551 "gram.y" + { + struct sudo_command *c = + (struct sudo_command *) (yyvsp[0].member)->name; + + if ((yyvsp[0].member)->type != COMMAND && (yyvsp[0].member)->type != ALL) { + sudoerserror(N_("a digest requires a path name")); + YYERROR; + } + if (c == NULL) { + /* lazy-allocate sudo_command for ALL */ + if ((c = new_command(NULL, NULL)) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + (yyvsp[0].member)->name = (char *)c; + } + HLTQ_TO_TAILQ(&c->digests, (yyvsp[-1].digest), entries); + (yyval.member) = (yyvsp[0].member); + } +#line 2177 "gram.c" + break; + + case 53: /* opcmnd: cmnd */ +#line 572 "gram.y" + { + (yyval.member) = (yyvsp[0].member); + (yyval.member)->negated = false; + } +#line 2186 "gram.c" + break; + + case 54: /* opcmnd: '!' cmnd */ +#line 576 "gram.y" + { + (yyval.member) = (yyvsp[0].member); + (yyval.member)->negated = true; + } +#line 2195 "gram.c" + break; + + case 55: /* chdirspec: CWD '=' WORD */ +#line 582 "gram.y" + { + if ((yyvsp[0].string)[0] != '/' && (yyvsp[0].string)[0] != '~') { + if (strcmp((yyvsp[0].string), "*") != 0) { + sudoerserror(N_("values for \"CWD\" must" + " start with a '/', '~', or '*'")); + YYERROR; + } + } + (yyval.string) = (yyvsp[0].string); + } +#line 2210 "gram.c" + break; + + case 56: /* chrootspec: CHROOT '=' WORD */ +#line 594 "gram.y" + { + if ((yyvsp[0].string)[0] != '/' && (yyvsp[0].string)[0] != '~') { + if (strcmp((yyvsp[0].string), "*") != 0) { + sudoerserror(N_("values for \"CHROOT\" must" + " start with a '/', '~', or '*'")); + YYERROR; + } + } + (yyval.string) = (yyvsp[0].string); + } +#line 2225 "gram.c" + break; + + case 57: /* timeoutspec: CMND_TIMEOUT '=' WORD */ +#line 606 "gram.y" + { + (yyval.string) = (yyvsp[0].string); + } +#line 2233 "gram.c" + break; + + case 58: /* notbeforespec: NOTBEFORE '=' WORD */ +#line 611 "gram.y" + { + (yyval.string) = (yyvsp[0].string); + } +#line 2241 "gram.c" + break; + + case 59: /* notafterspec: NOTAFTER '=' WORD */ +#line 615 "gram.y" + { + (yyval.string) = (yyvsp[0].string); + } +#line 2249 "gram.c" + break; + + case 60: /* rolespec: ROLE '=' WORD */ +#line 620 "gram.y" + { + (yyval.string) = (yyvsp[0].string); + } +#line 2257 "gram.c" + break; + + case 61: /* typespec: TYPE '=' WORD */ +#line 625 "gram.y" + { + (yyval.string) = (yyvsp[0].string); + } +#line 2265 "gram.c" + break; + + case 62: /* privsspec: PRIVS '=' WORD */ +#line 630 "gram.y" + { + (yyval.string) = (yyvsp[0].string); + } +#line 2273 "gram.c" + break; + + case 63: /* limitprivsspec: LIMITPRIVS '=' WORD */ +#line 634 "gram.y" + { + (yyval.string) = (yyvsp[0].string); + } +#line 2281 "gram.c" + break; + + case 64: /* runasspec: %empty */ +#line 639 "gram.y" + { + (yyval.runas) = NULL; + } +#line 2289 "gram.c" + break; + + case 65: /* runasspec: '(' runaslist ')' */ +#line 642 "gram.y" + { + (yyval.runas) = (yyvsp[-1].runas); + } +#line 2297 "gram.c" + break; + + case 66: /* runaslist: %empty */ +#line 647 "gram.y" + { + (yyval.runas) = calloc(1, sizeof(struct runascontainer)); + if ((yyval.runas) != NULL) { + (yyval.runas)->runasusers = new_member(NULL, MYSELF); + /* $$->runasgroups = NULL; */ + if ((yyval.runas)->runasusers == NULL) { + free((yyval.runas)); + (yyval.runas) = NULL; + } + } + if ((yyval.runas) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2317 "gram.c" + break; + + case 67: /* runaslist: userlist */ +#line 662 "gram.y" + { + (yyval.runas) = calloc(1, sizeof(struct runascontainer)); + if ((yyval.runas) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + (yyval.runas)->runasusers = (yyvsp[0].member); + /* $$->runasgroups = NULL; */ + } +#line 2331 "gram.c" + break; + + case 68: /* runaslist: userlist ':' grouplist */ +#line 671 "gram.y" + { + (yyval.runas) = calloc(1, sizeof(struct runascontainer)); + if ((yyval.runas) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + (yyval.runas)->runasusers = (yyvsp[-2].member); + (yyval.runas)->runasgroups = (yyvsp[0].member); + } +#line 2345 "gram.c" + break; + + case 69: /* runaslist: ':' grouplist */ +#line 680 "gram.y" + { + (yyval.runas) = calloc(1, sizeof(struct runascontainer)); + if ((yyval.runas) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + /* $$->runasusers = NULL; */ + (yyval.runas)->runasgroups = (yyvsp[0].member); + } +#line 2359 "gram.c" + break; + + case 70: /* runaslist: ':' */ +#line 689 "gram.y" + { + (yyval.runas) = calloc(1, sizeof(struct runascontainer)); + if ((yyval.runas) != NULL) { + (yyval.runas)->runasusers = new_member(NULL, MYSELF); + /* $$->runasgroups = NULL; */ + if ((yyval.runas)->runasusers == NULL) { + free((yyval.runas)); + (yyval.runas) = NULL; + } + } + if ((yyval.runas) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2379 "gram.c" + break; + + case 71: /* reserved_word: ALL */ +#line 706 "gram.y" + { (yyval.string) = "ALL"; } +#line 2385 "gram.c" + break; + + case 72: /* reserved_word: CHROOT */ +#line 707 "gram.y" + { (yyval.string) = "CHROOT"; } +#line 2391 "gram.c" + break; + + case 73: /* reserved_word: CWD */ +#line 708 "gram.y" + { (yyval.string) = "CWD"; } +#line 2397 "gram.c" + break; + + case 74: /* reserved_word: CMND_TIMEOUT */ +#line 709 "gram.y" + { (yyval.string) = "CMND_TIMEOUT"; } +#line 2403 "gram.c" + break; + + case 75: /* reserved_word: NOTBEFORE */ +#line 710 "gram.y" + { (yyval.string) = "NOTBEFORE"; } +#line 2409 "gram.c" + break; + + case 76: /* reserved_word: NOTAFTER */ +#line 711 "gram.y" + { (yyval.string) = "NOTAFTER"; } +#line 2415 "gram.c" + break; + + case 77: /* reserved_word: ROLE */ +#line 712 "gram.y" + { (yyval.string) = "ROLE"; } +#line 2421 "gram.c" + break; + + case 78: /* reserved_word: TYPE */ +#line 713 "gram.y" + { (yyval.string) = "TYPE"; } +#line 2427 "gram.c" + break; + + case 79: /* reserved_word: PRIVS */ +#line 714 "gram.y" + { (yyval.string) = "PRIVS"; } +#line 2433 "gram.c" + break; + + case 80: /* reserved_word: LIMITPRIVS */ +#line 715 "gram.y" + { (yyval.string) = "LIMITPRIVS"; } +#line 2439 "gram.c" + break; + + case 81: /* reserved_alias: reserved_word */ +#line 718 "gram.y" + { + sudoerserrorf(U_("syntax error, reserved word %s used as an alias name"), (yyvsp[0].string)); + YYERROR; + } +#line 2448 "gram.c" + break; + + case 82: /* options: %empty */ +#line 724 "gram.y" + { + init_options(&(yyval.options)); + } +#line 2456 "gram.c" + break; + + case 83: /* options: options chdirspec */ +#line 727 "gram.y" + { + free((yyval.options).runcwd); + (yyval.options).runcwd = (yyvsp[0].string); + } +#line 2465 "gram.c" + break; + + case 84: /* options: options chrootspec */ +#line 731 "gram.y" + { + free((yyval.options).runchroot); + (yyval.options).runchroot = (yyvsp[0].string); + } +#line 2474 "gram.c" + break; + + case 85: /* options: options notbeforespec */ +#line 735 "gram.y" + { + (yyval.options).notbefore = parse_gentime((yyvsp[0].string)); + free((yyvsp[0].string)); + if ((yyval.options).notbefore == -1) { + sudoerserror(N_("invalid notbefore value")); + YYERROR; + } + } +#line 2487 "gram.c" + break; + + case 86: /* options: options notafterspec */ +#line 743 "gram.y" + { + (yyval.options).notafter = parse_gentime((yyvsp[0].string)); + free((yyvsp[0].string)); + if ((yyval.options).notafter == -1) { + sudoerserror(N_("invalid notafter value")); + YYERROR; + } + } +#line 2500 "gram.c" + break; + + case 87: /* options: options timeoutspec */ +#line 751 "gram.y" + { + (yyval.options).timeout = parse_timeout((yyvsp[0].string)); + free((yyvsp[0].string)); + if ((yyval.options).timeout == -1) { + if (errno == ERANGE) + sudoerserror(N_("timeout value too large")); + else + sudoerserror(N_("invalid timeout value")); + YYERROR; + } + } +#line 2516 "gram.c" + break; + + case 88: /* options: options rolespec */ +#line 762 "gram.y" + { +#ifdef HAVE_SELINUX + free((yyval.options).role); + (yyval.options).role = (yyvsp[0].string); +#endif + } +#line 2527 "gram.c" + break; + + case 89: /* options: options typespec */ +#line 768 "gram.y" + { +#ifdef HAVE_SELINUX + free((yyval.options).type); + (yyval.options).type = (yyvsp[0].string); +#endif + } +#line 2538 "gram.c" + break; + + case 90: /* options: options privsspec */ +#line 774 "gram.y" + { +#ifdef HAVE_PRIV_SET + free((yyval.options).privs); + (yyval.options).privs = (yyvsp[0].string); +#endif + } +#line 2549 "gram.c" + break; + + case 91: /* options: options limitprivsspec */ +#line 780 "gram.y" + { +#ifdef HAVE_PRIV_SET + free((yyval.options).limitprivs); + (yyval.options).limitprivs = (yyvsp[0].string); +#endif + } +#line 2560 "gram.c" + break; + + case 92: /* cmndtag: %empty */ +#line 788 "gram.y" + { + TAGS_INIT(&(yyval.tag)); + } +#line 2568 "gram.c" + break; + + case 93: /* cmndtag: cmndtag NOPASSWD */ +#line 791 "gram.y" + { + (yyval.tag).nopasswd = true; + } +#line 2576 "gram.c" + break; + + case 94: /* cmndtag: cmndtag PASSWD */ +#line 794 "gram.y" + { + (yyval.tag).nopasswd = false; + } +#line 2584 "gram.c" + break; + + case 95: /* cmndtag: cmndtag NOEXEC */ +#line 797 "gram.y" + { + (yyval.tag).noexec = true; + } +#line 2592 "gram.c" + break; + + case 96: /* cmndtag: cmndtag EXEC */ +#line 800 "gram.y" + { + (yyval.tag).noexec = false; + } +#line 2600 "gram.c" + break; + + case 97: /* cmndtag: cmndtag SETENV */ +#line 803 "gram.y" + { + (yyval.tag).setenv = true; + } +#line 2608 "gram.c" + break; + + case 98: /* cmndtag: cmndtag NOSETENV */ +#line 806 "gram.y" + { + (yyval.tag).setenv = false; + } +#line 2616 "gram.c" + break; + + case 99: /* cmndtag: cmndtag LOG_INPUT */ +#line 809 "gram.y" + { + (yyval.tag).log_input = true; + } +#line 2624 "gram.c" + break; + + case 100: /* cmndtag: cmndtag NOLOG_INPUT */ +#line 812 "gram.y" + { + (yyval.tag).log_input = false; + } +#line 2632 "gram.c" + break; + + case 101: /* cmndtag: cmndtag LOG_OUTPUT */ +#line 815 "gram.y" + { + (yyval.tag).log_output = true; + } +#line 2640 "gram.c" + break; + + case 102: /* cmndtag: cmndtag NOLOG_OUTPUT */ +#line 818 "gram.y" + { + (yyval.tag).log_output = false; + } +#line 2648 "gram.c" + break; + + case 103: /* cmndtag: cmndtag FOLLOWLNK */ +#line 821 "gram.y" + { + (yyval.tag).follow = true; + } +#line 2656 "gram.c" + break; + + case 104: /* cmndtag: cmndtag NOFOLLOWLNK */ +#line 824 "gram.y" + { + (yyval.tag).follow = false; + } +#line 2664 "gram.c" + break; + + case 105: /* cmndtag: cmndtag MAIL */ +#line 827 "gram.y" + { + (yyval.tag).send_mail = true; + } +#line 2672 "gram.c" + break; + + case 106: /* cmndtag: cmndtag NOMAIL */ +#line 830 "gram.y" + { + (yyval.tag).send_mail = false; + } +#line 2680 "gram.c" + break; + + case 107: /* cmnd: ALL */ +#line 835 "gram.y" + { + (yyval.member) = new_member(NULL, ALL); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2692 "gram.c" + break; + + case 108: /* cmnd: ALIAS */ +#line 842 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), ALIAS); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2704 "gram.c" + break; + + case 109: /* cmnd: COMMAND */ +#line 849 "gram.y" + { + struct sudo_command *c; + + if ((c = new_command((yyvsp[0].command).cmnd, (yyvsp[0].command).args)) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + (yyval.member) = new_member((char *)c, COMMAND); + if ((yyval.member) == NULL) { + free(c); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2723 "gram.c" + break; + + case 112: /* $@1: %empty */ +#line 869 "gram.y" + { + alias_line = this_lineno; + alias_column = sudolinebuf.toke_start + 1; + } +#line 2732 "gram.c" + break; + + case 113: /* hostalias: ALIAS $@1 '=' hostlist */ +#line 872 "gram.y" + { + if (!alias_add(&parsed_policy, (yyvsp[-3].string), HOSTALIAS, + sudoers, alias_line, alias_column, (yyvsp[0].member))) { + alias_error((yyvsp[-3].string), errno); + YYERROR; + } + } +#line 2744 "gram.c" + break; + + case 116: /* hostlist: hostlist ',' ophost */ +#line 883 "gram.y" + { + HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries); + (yyval.member) = (yyvsp[-2].member); + } +#line 2753 "gram.c" + break; + + case 119: /* $@2: %empty */ +#line 893 "gram.y" + { + alias_line = this_lineno; + alias_column = sudolinebuf.toke_start + 1; + } +#line 2762 "gram.c" + break; + + case 120: /* cmndalias: ALIAS $@2 '=' cmndlist */ +#line 896 "gram.y" + { + if (!alias_add(&parsed_policy, (yyvsp[-3].string), CMNDALIAS, + sudoers, alias_line, alias_column, (yyvsp[0].member))) { + alias_error((yyvsp[-3].string), errno); + YYERROR; + } + } +#line 2774 "gram.c" + break; + + case 123: /* cmndlist: cmndlist ',' digcmnd */ +#line 907 "gram.y" + { + HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries); + (yyval.member) = (yyvsp[-2].member); + } +#line 2783 "gram.c" + break; + + case 126: /* $@3: %empty */ +#line 917 "gram.y" + { + alias_line = this_lineno; + alias_column = sudolinebuf.toke_start + 1; + } +#line 2792 "gram.c" + break; + + case 127: /* runasalias: ALIAS $@3 '=' userlist */ +#line 920 "gram.y" + { + if (!alias_add(&parsed_policy, (yyvsp[-3].string), RUNASALIAS, + sudoers, alias_line, alias_column, (yyvsp[0].member))) { + alias_error((yyvsp[-3].string), errno); + YYERROR; + } + } +#line 2804 "gram.c" + break; + + case 131: /* $@4: %empty */ +#line 934 "gram.y" + { + alias_line = this_lineno; + alias_column = sudolinebuf.toke_start + 1; + } +#line 2813 "gram.c" + break; + + case 132: /* useralias: ALIAS $@4 '=' userlist */ +#line 937 "gram.y" + { + if (!alias_add(&parsed_policy, (yyvsp[-3].string), USERALIAS, + sudoers, alias_line, alias_column, (yyvsp[0].member))) { + alias_error((yyvsp[-3].string), errno); + YYERROR; + } + } +#line 2825 "gram.c" + break; + + case 135: /* userlist: userlist ',' opuser */ +#line 948 "gram.y" + { + HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries); + (yyval.member) = (yyvsp[-2].member); + } +#line 2834 "gram.c" + break; + + case 136: /* opuser: user */ +#line 954 "gram.y" + { + (yyval.member) = (yyvsp[0].member); + (yyval.member)->negated = false; + } +#line 2843 "gram.c" + break; + + case 137: /* opuser: '!' user */ +#line 958 "gram.y" + { + (yyval.member) = (yyvsp[0].member); + (yyval.member)->negated = true; + } +#line 2852 "gram.c" + break; + + case 138: /* user: ALIAS */ +#line 964 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), ALIAS); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2864 "gram.c" + break; + + case 139: /* user: ALL */ +#line 971 "gram.y" + { + (yyval.member) = new_member(NULL, ALL); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2876 "gram.c" + break; + + case 140: /* user: NETGROUP */ +#line 978 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), NETGROUP); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2888 "gram.c" + break; + + case 141: /* user: USERGROUP */ +#line 985 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), USERGROUP); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2900 "gram.c" + break; + + case 142: /* user: WORD */ +#line 992 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), WORD); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2912 "gram.c" + break; + + case 144: /* grouplist: grouplist ',' opgroup */ +#line 1002 "gram.y" + { + HLTQ_CONCAT((yyvsp[-2].member), (yyvsp[0].member), entries); + (yyval.member) = (yyvsp[-2].member); + } +#line 2921 "gram.c" + break; + + case 145: /* opgroup: group */ +#line 1008 "gram.y" + { + (yyval.member) = (yyvsp[0].member); + (yyval.member)->negated = false; + } +#line 2930 "gram.c" + break; + + case 146: /* opgroup: '!' group */ +#line 1012 "gram.y" + { + (yyval.member) = (yyvsp[0].member); + (yyval.member)->negated = true; + } +#line 2939 "gram.c" + break; + + case 147: /* group: ALIAS */ +#line 1018 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), ALIAS); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2951 "gram.c" + break; + + case 148: /* group: ALL */ +#line 1025 "gram.y" + { + (yyval.member) = new_member(NULL, ALL); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2963 "gram.c" + break; + + case 149: /* group: WORD */ +#line 1032 "gram.y" + { + (yyval.member) = new_member((yyvsp[0].string), WORD); + if ((yyval.member) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +#line 2975 "gram.c" + break; + + +#line 2979 "gram.c" + + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + + *++yyvsp = yyval; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + yyerror (YY_("syntax error")); + } + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + /* Pop stack until we find a state that shifts the error token. */ + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + YY_ACCESSING_SYMBOL (yystate), yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + + +#if !defined yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + goto yyreturn; +#endif + + +/*-------------------------------------------------------. +| yyreturn -- parsing is finished, clean up and return. | +`-------------------------------------------------------*/ +yyreturn: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + + return yyresult; +} + +#line 1040 "gram.y" + +/* Like yyerror() but takes a printf-style format string. */ +void +sudoerserrorf(const char *fmt, ...) +{ + debug_decl(sudoerserrorf, SUDOERS_DEBUG_PARSER); + + /* The lexer displays more detailed messages for ERROR tokens. */ + if (sudoerschar == ERROR) + debug_return; + + /* Save the line the first error occurred on. */ + if (errorlineno == -1) { + errorlineno = this_lineno; + rcstr_delref(errorfile); + errorfile = rcstr_addref(sudoers); + } + if (sudoers_warnings && fmt != NULL) { + LEXTRACE("<*> "); +#ifndef TRACELEXER + if (trace_print == NULL || trace_print == sudoers_trace_print) { + char *s, *tofree = NULL; + int oldlocale; + va_list ap; + + /* Warnings are displayed in the user's locale. */ + sudoers_setlocale(SUDOERS_LOCALE_USER, &oldlocale); + va_start(ap, fmt); + if (strcmp(fmt, "%s") == 0) { + /* Optimize common case, a single string. */ + s = _(va_arg(ap, char *)); + } else { + if (vasprintf(&s, fmt, ap) != -1) + tofree = s; + else + s = _("syntax error"); + } + sudo_printf(SUDO_CONV_ERROR_MSG, _("%s:%d:%d: %s\n"), sudoers, + this_lineno, (int)sudolinebuf.toke_start + 1, s); + free(tofree); + va_end(ap); + sudoers_setlocale(oldlocale, NULL); + + /* Display the offending line and token if possible. */ + if (sudolinebuf.len != 0) { + char tildes[128]; + size_t tlen = 0; + + sudo_printf(SUDO_CONV_ERROR_MSG, "%s%s", sudolinebuf.buf, + sudolinebuf.buf[sudolinebuf.len - 1] == '\n' ? "" : "\n"); + if (sudolinebuf.toke_end > sudolinebuf.toke_start) { + tlen = sudolinebuf.toke_end - sudolinebuf.toke_start - 1; + if (tlen >= sizeof(tildes)) + tlen = sizeof(tildes) - 1; + memset(tildes, '~', tlen); + } + tildes[tlen] = '\0'; + sudo_printf(SUDO_CONV_ERROR_MSG, "%*s^%s\n", + (int)sudolinebuf.toke_start, "", tildes); + } + } +#endif + } + parse_error = true; + debug_return; +} + +void +sudoerserror(const char *s) +{ + // -V:sudoerserror:575, 618 + if (s == NULL) + sudoerserrorf(NULL); + else + sudoerserrorf("%s", s); +} + +static void +alias_error(const char *name, int errnum) +{ + if (errnum == EEXIST) + sudoerserrorf(U_("Alias \"%s\" already defined"), name); + else + sudoerserror(N_("unable to allocate memory")); +} + +static struct defaults * +new_default(char *var, char *val, short op) +{ + struct defaults *d; + debug_decl(new_default, SUDOERS_DEBUG_PARSER); + + if ((d = calloc(1, sizeof(struct defaults))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + d->var = var; + d->val = val; + /* d->type = 0; */ + d->op = op; + /* d->binding = NULL */ + d->line = this_lineno; + d->column = sudolinebuf.toke_start + 1; + d->file = rcstr_addref(sudoers); + HLTQ_INIT(d, entries); + + debug_return_ptr(d); +} + +static struct member * +new_member(char *name, int type) +{ + struct member *m; + debug_decl(new_member, SUDOERS_DEBUG_PARSER); + + if ((m = calloc(1, sizeof(struct member))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + m->name = name; + m->type = type; + HLTQ_INIT(m, entries); + + debug_return_ptr(m); +} + +/* + * Like new_member() but uses ALL for the type. + * Used by the ldap and sssd back-ends, which don't include gram.h. + */ +struct member * +new_member_all(char *name) +{ + return new_member(name, ALL); +} + +static struct sudo_command * +new_command(char *cmnd, char *args) +{ + struct sudo_command *c; + debug_decl(new_command, SUDOERS_DEBUG_PARSER); + + if ((c = calloc(1, sizeof(*c))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + c->cmnd = cmnd; + c->args = args; + TAILQ_INIT(&c->digests); + + debug_return_ptr(c); +} + +static struct command_digest * +new_digest(int digest_type, char *digest_str) +{ + struct command_digest *digest; + debug_decl(new_digest, SUDOERS_DEBUG_PARSER); + + if ((digest = malloc(sizeof(*digest))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + HLTQ_INIT(digest, entries); + digest->digest_type = digest_type; + digest->digest_str = digest_str; + if (digest->digest_str == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(digest); + digest = NULL; + } + + debug_return_ptr(digest); +} + +/* + * Add a list of defaults structures to the defaults list. + * The binding, if non-NULL, specifies a list of hosts, users, or + * runas users the entries apply to (specified by the type). + */ +static bool +add_defaults(int type, struct member *bmem, struct defaults *defs) +{ + struct defaults *d, *next; + struct member_list *binding; + bool ret = true; + debug_decl(add_defaults, SUDOERS_DEBUG_PARSER); + + if (defs != NULL) { + /* + * We use a single binding for each entry in defs. + */ + if ((binding = malloc(sizeof(*binding))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + sudoerserror(N_("unable to allocate memory")); + debug_return_bool(false); + } + if (bmem != NULL) + HLTQ_TO_TAILQ(binding, bmem, entries); + else + TAILQ_INIT(binding); + + /* + * Set type and binding (who it applies to) for new entries. + * Then add to the global defaults list. + */ + HLTQ_FOREACH_SAFE(d, defs, entries, next) { + d->type = type; + d->binding = binding; + TAILQ_INSERT_TAIL(&parsed_policy.defaults, d, entries); + } + } + + debug_return_bool(ret); +} + +/* + * Allocate a new struct userspec, populate it, and insert it at the + * end of the userspecs list. + */ +static bool +add_userspec(struct member *members, struct privilege *privs) +{ + struct userspec *u; + debug_decl(add_userspec, SUDOERS_DEBUG_PARSER); + + if ((u = calloc(1, sizeof(*u))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_bool(false); + } + u->line = this_lineno; + u->column = sudolinebuf.toke_start + 1; + u->file = rcstr_addref(sudoers); + HLTQ_TO_TAILQ(&u->users, members, entries); + HLTQ_TO_TAILQ(&u->privileges, privs, entries); + STAILQ_INIT(&u->comments); + TAILQ_INSERT_TAIL(&parsed_policy.userspecs, u, entries); + + debug_return_bool(true); +} + +/* + * Free a member struct and its contents. + */ +void +free_member(struct member *m) +{ + debug_decl(free_member, SUDOERS_DEBUG_PARSER); + + if (m->type == COMMAND || (m->type == ALL && m->name != NULL)) { + struct command_digest *digest; + struct sudo_command *c = (struct sudo_command *)m->name; + free(c->cmnd); + free(c->args); + while ((digest = TAILQ_FIRST(&c->digests)) != NULL) { + TAILQ_REMOVE(&c->digests, digest, entries); + free(digest->digest_str); + free(digest); + } + } + free(m->name); + free(m); + + debug_return; +} + +/* + * Free a tailq of members but not the struct member_list container itself. + */ +void +free_members(struct member_list *members) +{ + struct member *m; + debug_decl(free_members, SUDOERS_DEBUG_PARSER); + + while ((m = TAILQ_FIRST(members)) != NULL) { + TAILQ_REMOVE(members, m, entries); + free_member(m); + } + + debug_return; +} + +void +free_defaults(struct defaults_list *defs) +{ + struct member_list *prev_binding = NULL; + struct defaults *def; + debug_decl(free_defaults, SUDOERS_DEBUG_PARSER); + + while ((def = TAILQ_FIRST(defs)) != NULL) { + TAILQ_REMOVE(defs, def, entries); + free_default(def, &prev_binding); + } + + debug_return; +} + +void +free_default(struct defaults *def, struct member_list **binding) +{ + debug_decl(free_default, SUDOERS_DEBUG_PARSER); + + if (def->binding != *binding) { + *binding = def->binding; + if (def->binding != NULL) { + free_members(def->binding); + free(def->binding); + } + } + rcstr_delref(def->file); + free(def->var); + free(def->val); + free(def); + + debug_return; +} + +void +free_privilege(struct privilege *priv) +{ + struct member_list *runasuserlist = NULL, *runasgrouplist = NULL; + struct member_list *prev_binding = NULL; + struct cmndspec *cs; + struct defaults *def; + char *runcwd = NULL, *runchroot = NULL; +#ifdef HAVE_SELINUX + char *role = NULL, *type = NULL; +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + char *privs = NULL, *limitprivs = NULL; +#endif /* HAVE_PRIV_SET */ + debug_decl(free_privilege, SUDOERS_DEBUG_PARSER); + + free(priv->ldap_role); + free_members(&priv->hostlist); + while ((cs = TAILQ_FIRST(&priv->cmndlist)) != NULL) { + TAILQ_REMOVE(&priv->cmndlist, cs, entries); + /* Only free the first instance of runcwd/runchroot. */ + if (cs->runcwd != runcwd) { + runcwd = cs->runcwd; + free(cs->runcwd); + } + if (cs->runchroot != runchroot) { + runchroot = cs->runchroot; + free(cs->runchroot); + } +#ifdef HAVE_SELINUX + /* Only free the first instance of a role/type. */ + if (cs->role != role) { + role = cs->role; + free(cs->role); + } + if (cs->type != type) { + type = cs->type; + free(cs->type); + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* Only free the first instance of privs/limitprivs. */ + if (cs->privs != privs) { + privs = cs->privs; + free(cs->privs); + } + if (cs->limitprivs != limitprivs) { + limitprivs = cs->limitprivs; + free(cs->limitprivs); + } +#endif /* HAVE_PRIV_SET */ + /* Only free the first instance of runas user/group lists. */ + if (cs->runasuserlist && cs->runasuserlist != runasuserlist) { + runasuserlist = cs->runasuserlist; + free_members(runasuserlist); + free(runasuserlist); + } + if (cs->runasgrouplist && cs->runasgrouplist != runasgrouplist) { + runasgrouplist = cs->runasgrouplist; + free_members(runasgrouplist); + free(runasgrouplist); + } + free_member(cs->cmnd); + free(cs); + } + while ((def = TAILQ_FIRST(&priv->defaults)) != NULL) { + TAILQ_REMOVE(&priv->defaults, def, entries); + free_default(def, &prev_binding); + } + free(priv); + + debug_return; +} + +void +free_userspecs(struct userspec_list *usl) +{ + struct userspec *us; + debug_decl(free_userspecs, SUDOERS_DEBUG_PARSER); + + while ((us = TAILQ_FIRST(usl)) != NULL) { + TAILQ_REMOVE(usl, us, entries); + free_userspec(us); + } + + debug_return; +} + +void +free_userspec(struct userspec *us) +{ + struct privilege *priv; + struct sudoers_comment *comment; + debug_decl(free_userspec, SUDOERS_DEBUG_PARSER); + + free_members(&us->users); + while ((priv = TAILQ_FIRST(&us->privileges)) != NULL) { + TAILQ_REMOVE(&us->privileges, priv, entries); + free_privilege(priv); + } + while ((comment = STAILQ_FIRST(&us->comments)) != NULL) { + STAILQ_REMOVE_HEAD(&us->comments, entries); + free(comment->str); + free(comment); + } + rcstr_delref(us->file); + free(us); + + debug_return; +} + +/* + * Initialized a sudoers parse tree. + */ +void +init_parse_tree(struct sudoers_parse_tree *parse_tree, const char *lhost, + const char *shost) +{ + TAILQ_INIT(&parse_tree->userspecs); + TAILQ_INIT(&parse_tree->defaults); + parse_tree->aliases = NULL; + parse_tree->shost = shost; + parse_tree->lhost = lhost; +} + +/* + * Move the contents of parsed_policy to new_tree. + */ +void +reparent_parse_tree(struct sudoers_parse_tree *new_tree) +{ + TAILQ_CONCAT(&new_tree->userspecs, &parsed_policy.userspecs, entries); + TAILQ_CONCAT(&new_tree->defaults, &parsed_policy.defaults, entries); + new_tree->aliases = parsed_policy.aliases; + parsed_policy.aliases = NULL; +} + +/* + * Free the contents of a sudoers parse tree and initialize it. + */ +void +free_parse_tree(struct sudoers_parse_tree *parse_tree) +{ + free_userspecs(&parse_tree->userspecs); + free_defaults(&parse_tree->defaults); + free_aliases(parse_tree->aliases); + parse_tree->aliases = NULL; +} + +/* + * Free up space used by data structures from a previous parser run and sets + * the current sudoers file to path. + */ +bool +init_parser(const char *path, bool quiet, bool strict) +{ + bool ret = true; + debug_decl(init_parser, SUDOERS_DEBUG_PARSER); + + free_parse_tree(&parsed_policy); + init_lexer(); + + rcstr_delref(sudoers); + if (path != NULL) { + if ((sudoers = rcstr_dup(path)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = false; + } + } else { + sudoers = NULL; + } + + parse_error = false; + errorlineno = -1; + rcstr_delref(errorfile); + errorfile = NULL; + sudoers_warnings = !quiet; + sudoers_strict = strict; + + debug_return_bool(ret); +} + +/* + * Initialize all options in a cmndspec. + */ +static void +init_options(struct command_options *opts) +{ + opts->notbefore = UNSPEC; + opts->notafter = UNSPEC; + opts->timeout = UNSPEC; + opts->runchroot = NULL; + opts->runcwd = NULL; +#ifdef HAVE_SELINUX + opts->role = NULL; + opts->type = NULL; +#endif +#ifdef HAVE_PRIV_SET + opts->privs = NULL; + opts->limitprivs = NULL; +#endif +} diff --git a/plugins/sudoers/gram.h b/plugins/sudoers/gram.h new file mode 100644 index 0000000..97c6638 --- /dev/null +++ b/plugins/sudoers/gram.h @@ -0,0 +1,197 @@ +/* A Bison parser, made by GNU Bison 3.7.4. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_SUDOERS_Y_TAB_H_INCLUDED +# define YY_SUDOERS_Y_TAB_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int sudoersdebug; +#endif + +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + COMMAND = 258, /* COMMAND */ + ALIAS = 259, /* ALIAS */ + DEFVAR = 260, /* DEFVAR */ + NTWKADDR = 261, /* NTWKADDR */ + NETGROUP = 262, /* NETGROUP */ + USERGROUP = 263, /* USERGROUP */ + WORD = 264, /* WORD */ + DIGEST = 265, /* DIGEST */ + INCLUDE = 266, /* INCLUDE */ + INCLUDEDIR = 267, /* INCLUDEDIR */ + DEFAULTS = 268, /* DEFAULTS */ + DEFAULTS_HOST = 269, /* DEFAULTS_HOST */ + DEFAULTS_USER = 270, /* DEFAULTS_USER */ + DEFAULTS_RUNAS = 271, /* DEFAULTS_RUNAS */ + DEFAULTS_CMND = 272, /* DEFAULTS_CMND */ + NOPASSWD = 273, /* NOPASSWD */ + PASSWD = 274, /* PASSWD */ + NOEXEC = 275, /* NOEXEC */ + EXEC = 276, /* EXEC */ + SETENV = 277, /* SETENV */ + NOSETENV = 278, /* NOSETENV */ + LOG_INPUT = 279, /* LOG_INPUT */ + NOLOG_INPUT = 280, /* NOLOG_INPUT */ + LOG_OUTPUT = 281, /* LOG_OUTPUT */ + NOLOG_OUTPUT = 282, /* NOLOG_OUTPUT */ + MAIL = 283, /* MAIL */ + NOMAIL = 284, /* NOMAIL */ + FOLLOWLNK = 285, /* FOLLOWLNK */ + NOFOLLOWLNK = 286, /* NOFOLLOWLNK */ + ALL = 287, /* ALL */ + HOSTALIAS = 288, /* HOSTALIAS */ + CMNDALIAS = 289, /* CMNDALIAS */ + USERALIAS = 290, /* USERALIAS */ + RUNASALIAS = 291, /* RUNASALIAS */ + ERROR = 292, /* ERROR */ + NOMATCH = 293, /* NOMATCH */ + CHROOT = 294, /* CHROOT */ + CWD = 295, /* CWD */ + TYPE = 296, /* TYPE */ + ROLE = 297, /* ROLE */ + PRIVS = 298, /* PRIVS */ + LIMITPRIVS = 299, /* LIMITPRIVS */ + CMND_TIMEOUT = 300, /* CMND_TIMEOUT */ + NOTBEFORE = 301, /* NOTBEFORE */ + NOTAFTER = 302, /* NOTAFTER */ + MYSELF = 303, /* MYSELF */ + SHA224_TOK = 304, /* SHA224_TOK */ + SHA256_TOK = 305, /* SHA256_TOK */ + SHA384_TOK = 306, /* SHA384_TOK */ + SHA512_TOK = 307 /* SHA512_TOK */ + }; + typedef enum yytokentype yytoken_kind_t; +#endif +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 +#define COMMAND 258 +#define ALIAS 259 +#define DEFVAR 260 +#define NTWKADDR 261 +#define NETGROUP 262 +#define USERGROUP 263 +#define WORD 264 +#define DIGEST 265 +#define INCLUDE 266 +#define INCLUDEDIR 267 +#define DEFAULTS 268 +#define DEFAULTS_HOST 269 +#define DEFAULTS_USER 270 +#define DEFAULTS_RUNAS 271 +#define DEFAULTS_CMND 272 +#define NOPASSWD 273 +#define PASSWD 274 +#define NOEXEC 275 +#define EXEC 276 +#define SETENV 277 +#define NOSETENV 278 +#define LOG_INPUT 279 +#define NOLOG_INPUT 280 +#define LOG_OUTPUT 281 +#define NOLOG_OUTPUT 282 +#define MAIL 283 +#define NOMAIL 284 +#define FOLLOWLNK 285 +#define NOFOLLOWLNK 286 +#define ALL 287 +#define HOSTALIAS 288 +#define CMNDALIAS 289 +#define USERALIAS 290 +#define RUNASALIAS 291 +#define ERROR 292 +#define NOMATCH 293 +#define CHROOT 294 +#define CWD 295 +#define TYPE 296 +#define ROLE 297 +#define PRIVS 298 +#define LIMITPRIVS 299 +#define CMND_TIMEOUT 300 +#define NOTBEFORE 301 +#define NOTAFTER 302 +#define MYSELF 303 +#define SHA224_TOK 304 +#define SHA256_TOK 305 +#define SHA384_TOK 306 +#define SHA512_TOK 307 + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +union YYSTYPE +{ +#line 83 "gram.y" + + struct cmndspec *cmndspec; + struct defaults *defaults; + struct member *member; + struct runascontainer *runas; + struct privilege *privilege; + struct command_digest *digest; + struct sudo_command command; + struct command_options options; + struct cmndtag tag; + char *string; + int tok; + +#line 185 "y.tab.h" + +}; +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + +extern YYSTYPE sudoerslval; + +int sudoersparse (void); + +#endif /* !YY_SUDOERS_Y_TAB_H_INCLUDED */ diff --git a/plugins/sudoers/gram.y b/plugins/sudoers/gram.y new file mode 100644 index 0000000..d4dcf0d --- /dev/null +++ b/plugins/sudoers/gram.y @@ -0,0 +1,1570 @@ +%{ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#include + +#include +#include +#include +#include +#include +#if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__) +# include +#endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */ +#include + +#include "sudoers.h" +#include "sudo_digest.h" +#include "toke.h" + +#ifdef YYBISON +# define YYERROR_VERBOSE +#endif + +/* If we last saw a newline the entry is on the preceding line. */ +#define this_lineno (sudoerschar == '\n' ? sudolineno - 1 : sudolineno) + +// PVS Studio suppression +// -V::1037, 1042 + +/* + * Globals + */ +bool sudoers_warnings = true; +bool sudoers_strict = false; +bool parse_error = false; +int errorlineno = -1; +char *errorfile = NULL; + +static int alias_line, alias_column; + +struct sudoers_parse_tree parsed_policy = { + TAILQ_HEAD_INITIALIZER(parsed_policy.userspecs), + TAILQ_HEAD_INITIALIZER(parsed_policy.defaults), + NULL, /* aliases */ + NULL, /* lhost */ + NULL /* shost */ +}; + +/* + * Local prototypes + */ +static void init_options(struct command_options *opts); +static bool add_defaults(int, struct member *, struct defaults *); +static bool add_userspec(struct member *, struct privilege *); +static struct defaults *new_default(char *, char *, short); +static struct member *new_member(char *, int); +static struct sudo_command *new_command(char *, char *); +static struct command_digest *new_digest(int, char *); +static void alias_error(const char *name, int errnum); +%} + +%union { + struct cmndspec *cmndspec; + struct defaults *defaults; + struct member *member; + struct runascontainer *runas; + struct privilege *privilege; + struct command_digest *digest; + struct sudo_command command; + struct command_options options; + struct cmndtag tag; + char *string; + int tok; +} + +%start file /* special start symbol */ +%token COMMAND /* absolute pathname w/ optional args */ +%token ALIAS /* an UPPERCASE alias name */ +%token DEFVAR /* a Defaults variable name */ +%token NTWKADDR /* ipv4 or ipv6 address */ +%token NETGROUP /* a netgroup (+NAME) */ +%token USERGROUP /* a usergroup (%NAME) */ +%token WORD /* a word */ +%token DIGEST /* a SHA-2 digest */ +%token INCLUDE /* @include */ +%token INCLUDEDIR /* @includedir */ +%token DEFAULTS /* Defaults entry */ +%token DEFAULTS_HOST /* Host-specific defaults entry */ +%token DEFAULTS_USER /* User-specific defaults entry */ +%token DEFAULTS_RUNAS /* Runas-specific defaults entry */ +%token DEFAULTS_CMND /* Command-specific defaults entry */ +%token NOPASSWD /* no passwd req for command */ +%token PASSWD /* passwd req for command (default) */ +%token NOEXEC /* preload fake execve() for cmnd */ +%token EXEC /* don't preload fake execve() */ +%token SETENV /* user may set environment for cmnd */ +%token NOSETENV /* user may not set environment */ +%token LOG_INPUT /* log user's cmnd input */ +%token NOLOG_INPUT /* don't log user's cmnd input */ +%token LOG_OUTPUT /* log cmnd output */ +%token NOLOG_OUTPUT /* don't log cmnd output */ +%token MAIL /* mail log message */ +%token NOMAIL /* don't mail log message */ +%token FOLLOWLNK /* follow symbolic links */ +%token NOFOLLOWLNK /* don't follow symbolic links */ +%token ALL /* ALL keyword */ +%token HOSTALIAS /* Host_Alias keyword */ +%token CMNDALIAS /* Cmnd_Alias keyword */ +%token USERALIAS /* User_Alias keyword */ +%token RUNASALIAS /* Runas_Alias keyword */ +%token ':' '=' ',' '!' '+' '-' /* union member tokens */ +%token '(' ')' /* runas tokens */ +%token '\n' /* newline (with optional comment) */ +%token ERROR /* error from lexer */ +%token NOMATCH /* no match from lexer */ +%token CHROOT /* root directory for command */ +%token CWD /* working directory for command */ +%token TYPE /* SELinux type */ +%token ROLE /* SELinux role */ +%token PRIVS /* Solaris privileges */ +%token LIMITPRIVS /* Solaris limit privileges */ +%token CMND_TIMEOUT /* command timeout */ +%token NOTBEFORE /* time restriction */ +%token NOTAFTER /* time restriction */ +%token MYSELF /* run as myself, not another user */ +%token SHA224_TOK /* sha224 token */ +%token SHA256_TOK /* sha256 token */ +%token SHA384_TOK /* sha384 token */ +%token SHA512_TOK /* sha512 token */ + +%type cmndspec +%type cmndspeclist +%type defaults_entry +%type defaults_list +%type cmnd +%type opcmnd +%type digcmnd +%type cmndlist +%type host +%type hostlist +%type ophost +%type opuser +%type user +%type userlist +%type opgroup +%type group +%type grouplist +%type runasspec +%type runaslist +%type privilege +%type privileges +%type cmndtag +%type options +%type chdirspec +%type chrootspec +%type rolespec +%type typespec +%type privsspec +%type limitprivsspec +%type timeoutspec +%type notbeforespec +%type notafterspec +%type include +%type includedir +%type digestspec +%type digestlist +%type reserved_word + +%% + +file : { + ; /* empty file */ + } + | line + ; + +line : entry + | line entry + ; + +entry : '\n' { + ; /* blank line */ + } + | error '\n' { + yyerrok; + } + | include { + if (!push_include($1, false)) { + free($1); + YYERROR; + } + free($1); + } + | includedir { + if (!push_include($1, true)) { + free($1); + YYERROR; + } + free($1); + } + | userlist privileges '\n' { + if (!add_userspec($1, $2)) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | USERALIAS useraliases '\n' { + ; + } + | HOSTALIAS hostaliases '\n' { + ; + } + | CMNDALIAS cmndaliases '\n' { + ; + } + | RUNASALIAS runasaliases '\n' { + ; + } + | DEFAULTS defaults_list '\n' { + if (!add_defaults(DEFAULTS, NULL, $2)) + YYERROR; + } + | DEFAULTS_USER userlist defaults_list '\n' { + if (!add_defaults(DEFAULTS_USER, $2, $3)) + YYERROR; + } + | DEFAULTS_RUNAS userlist defaults_list '\n' { + if (!add_defaults(DEFAULTS_RUNAS, $2, $3)) + YYERROR; + } + | DEFAULTS_HOST hostlist defaults_list '\n' { + if (!add_defaults(DEFAULTS_HOST, $2, $3)) + YYERROR; + } + | DEFAULTS_CMND cmndlist defaults_list '\n' { + if (!add_defaults(DEFAULTS_CMND, $2, $3)) + YYERROR; + } + ; + +include : INCLUDE WORD '\n' { + $$ = $2; + } + | INCLUDE WORD error '\n' { + yyerrok; + $$ = $2; + } + ; + +includedir : INCLUDEDIR WORD '\n' { + $$ = $2; + } + | INCLUDEDIR WORD error '\n' { + yyerrok; + $$ = $2; + } + ; + +defaults_list : defaults_entry + | defaults_list ',' defaults_entry { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +defaults_entry : DEFVAR { + $$ = new_default($1, NULL, true); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | '!' DEFVAR { + $$ = new_default($2, NULL, false); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | DEFVAR '=' WORD { + $$ = new_default($1, $3, true); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | DEFVAR '+' WORD { + $$ = new_default($1, $3, '+'); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | DEFVAR '-' WORD { + $$ = new_default($1, $3, '-'); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +privileges : privilege + | privileges ':' privilege { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + | privileges ':' error { + yyerrok; + $$ = $1; + } + ; + +privilege : hostlist '=' cmndspeclist { + struct privilege *p = calloc(1, sizeof(*p)); + if (p == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + TAILQ_INIT(&p->defaults); + HLTQ_TO_TAILQ(&p->hostlist, $1, entries); + HLTQ_TO_TAILQ(&p->cmndlist, $3, entries); + HLTQ_INIT(p, entries); + $$ = p; + } + ; + +ophost : host { + $$ = $1; + $$->negated = false; + } + | '!' host { + $$ = $2; + $$->negated = true; + } + ; + +host : ALIAS { + $$ = new_member($1, ALIAS); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | ALL { + $$ = new_member(NULL, ALL); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | NETGROUP { + $$ = new_member($1, NETGROUP); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | NTWKADDR { + $$ = new_member($1, NTWKADDR); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | WORD { + $$ = new_member($1, WORD); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +cmndspeclist : cmndspec + | cmndspeclist ',' cmndspec { + struct cmndspec *prev; + prev = HLTQ_LAST($1, cmndspec, entries); + HLTQ_CONCAT($1, $3, entries); + + /* propagate runcwd and runchroot */ + if ($3->runcwd == NULL) + $3->runcwd = prev->runcwd; + if ($3->runchroot == NULL) + $3->runchroot = prev->runchroot; +#ifdef HAVE_SELINUX + /* propagate role and type */ + if ($3->role == NULL && $3->type == NULL) { + $3->role = prev->role; + $3->type = prev->type; + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* propagate privs & limitprivs */ + if ($3->privs == NULL && $3->limitprivs == NULL) { + $3->privs = prev->privs; + $3->limitprivs = prev->limitprivs; + } +#endif /* HAVE_PRIV_SET */ + /* propagate command time restrictions */ + if ($3->notbefore == UNSPEC) + $3->notbefore = prev->notbefore; + if ($3->notafter == UNSPEC) + $3->notafter = prev->notafter; + /* propagate command timeout */ + if ($3->timeout == UNSPEC) + $3->timeout = prev->timeout; + /* propagate tags and runas list */ + if ($3->tags.nopasswd == UNSPEC) + $3->tags.nopasswd = prev->tags.nopasswd; + if ($3->tags.noexec == UNSPEC) + $3->tags.noexec = prev->tags.noexec; + if ($3->tags.setenv == UNSPEC && + prev->tags.setenv != IMPLIED) + $3->tags.setenv = prev->tags.setenv; + if ($3->tags.log_input == UNSPEC) + $3->tags.log_input = prev->tags.log_input; + if ($3->tags.log_output == UNSPEC) + $3->tags.log_output = prev->tags.log_output; + if ($3->tags.send_mail == UNSPEC) + $3->tags.send_mail = prev->tags.send_mail; + if ($3->tags.follow == UNSPEC) + $3->tags.follow = prev->tags.follow; + if (($3->runasuserlist == NULL && + $3->runasgrouplist == NULL) && + (prev->runasuserlist != NULL || + prev->runasgrouplist != NULL)) { + $3->runasuserlist = prev->runasuserlist; + $3->runasgrouplist = prev->runasgrouplist; + } + $$ = $1; + } + ; + +cmndspec : runasspec options cmndtag digcmnd { + struct cmndspec *cs = calloc(1, sizeof(*cs)); + if (cs == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + if ($1 != NULL) { + if ($1->runasusers != NULL) { + cs->runasuserlist = + malloc(sizeof(*cs->runasuserlist)); + if (cs->runasuserlist == NULL) { + free(cs); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + HLTQ_TO_TAILQ(cs->runasuserlist, + $1->runasusers, entries); + } + if ($1->runasgroups != NULL) { + cs->runasgrouplist = + malloc(sizeof(*cs->runasgrouplist)); + if (cs->runasgrouplist == NULL) { + free(cs); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + HLTQ_TO_TAILQ(cs->runasgrouplist, + $1->runasgroups, entries); + } + free($1); + } +#ifdef HAVE_SELINUX + cs->role = $2.role; + cs->type = $2.type; +#endif +#ifdef HAVE_PRIV_SET + cs->privs = $2.privs; + cs->limitprivs = $2.limitprivs; +#endif + cs->notbefore = $2.notbefore; + cs->notafter = $2.notafter; + cs->timeout = $2.timeout; + cs->runcwd = $2.runcwd; + cs->runchroot = $2.runchroot; + cs->tags = $3; + cs->cmnd = $4; + HLTQ_INIT(cs, entries); + /* sudo "ALL" implies the SETENV tag */ + if (cs->cmnd->type == ALL && !cs->cmnd->negated && + cs->tags.setenv == UNSPEC) + cs->tags.setenv = IMPLIED; + $$ = cs; + } + ; + +digestspec : SHA224_TOK ':' DIGEST { + $$ = new_digest(SUDO_DIGEST_SHA224, $3); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | SHA256_TOK ':' DIGEST { + $$ = new_digest(SUDO_DIGEST_SHA256, $3); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | SHA384_TOK ':' DIGEST { + $$ = new_digest(SUDO_DIGEST_SHA384, $3); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | SHA512_TOK ':' DIGEST { + $$ = new_digest(SUDO_DIGEST_SHA512, $3); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +digestlist : digestspec + | digestlist ',' digestspec { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +digcmnd : opcmnd { + $$ = $1; + } + | digestlist opcmnd { + struct sudo_command *c = + (struct sudo_command *) $2->name; + + if ($2->type != COMMAND && $2->type != ALL) { + sudoerserror(N_("a digest requires a path name")); + YYERROR; + } + if (c == NULL) { + /* lazy-allocate sudo_command for ALL */ + if ((c = new_command(NULL, NULL)) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + $2->name = (char *)c; + } + HLTQ_TO_TAILQ(&c->digests, $1, entries); + $$ = $2; + } + ; + +opcmnd : cmnd { + $$ = $1; + $$->negated = false; + } + | '!' cmnd { + $$ = $2; + $$->negated = true; + } + ; + +chdirspec : CWD '=' WORD { + if ($3[0] != '/' && $3[0] != '~') { + if (strcmp($3, "*") != 0) { + sudoerserror(N_("values for \"CWD\" must" + " start with a '/', '~', or '*'")); + YYERROR; + } + } + $$ = $3; + } + ; + +chrootspec : CHROOT '=' WORD { + if ($3[0] != '/' && $3[0] != '~') { + if (strcmp($3, "*") != 0) { + sudoerserror(N_("values for \"CHROOT\" must" + " start with a '/', '~', or '*'")); + YYERROR; + } + } + $$ = $3; + } + ; + +timeoutspec : CMND_TIMEOUT '=' WORD { + $$ = $3; + } + ; + +notbeforespec : NOTBEFORE '=' WORD { + $$ = $3; + } + +notafterspec : NOTAFTER '=' WORD { + $$ = $3; + } + ; + +rolespec : ROLE '=' WORD { + $$ = $3; + } + ; + +typespec : TYPE '=' WORD { + $$ = $3; + } + ; + +privsspec : PRIVS '=' WORD { + $$ = $3; + } + ; +limitprivsspec : LIMITPRIVS '=' WORD { + $$ = $3; + } + ; + +runasspec : /* empty */ { + $$ = NULL; + } + | '(' runaslist ')' { + $$ = $2; + } + ; + +runaslist : /* empty */ { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ != NULL) { + $$->runasusers = new_member(NULL, MYSELF); + /* $$->runasgroups = NULL; */ + if ($$->runasusers == NULL) { + free($$); + $$ = NULL; + } + } + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | userlist { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + $$->runasusers = $1; + /* $$->runasgroups = NULL; */ + } + | userlist ':' grouplist { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + $$->runasusers = $1; + $$->runasgroups = $3; + } + | ':' grouplist { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + /* $$->runasusers = NULL; */ + $$->runasgroups = $2; + } + | ':' { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ != NULL) { + $$->runasusers = new_member(NULL, MYSELF); + /* $$->runasgroups = NULL; */ + if ($$->runasusers == NULL) { + free($$); + $$ = NULL; + } + } + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +reserved_word : ALL { $$ = "ALL"; } + | CHROOT { $$ = "CHROOT"; } + | CWD { $$ = "CWD"; } + | CMND_TIMEOUT { $$ = "CMND_TIMEOUT"; } + | NOTBEFORE { $$ = "NOTBEFORE"; } + | NOTAFTER { $$ = "NOTAFTER"; } + | ROLE { $$ = "ROLE"; } + | TYPE { $$ = "TYPE"; } + | PRIVS { $$ = "PRIVS"; } + | LIMITPRIVS { $$ = "LIMITPRIVS"; } + ; + +reserved_alias : reserved_word { + sudoerserrorf(U_("syntax error, reserved word %s used as an alias name"), $1); + YYERROR; + } + ; + +options : /* empty */ { + init_options(&$$); + } + | options chdirspec { + free($$.runcwd); + $$.runcwd = $2; + } + | options chrootspec { + free($$.runchroot); + $$.runchroot = $2; + } + | options notbeforespec { + $$.notbefore = parse_gentime($2); + free($2); + if ($$.notbefore == -1) { + sudoerserror(N_("invalid notbefore value")); + YYERROR; + } + } + | options notafterspec { + $$.notafter = parse_gentime($2); + free($2); + if ($$.notafter == -1) { + sudoerserror(N_("invalid notafter value")); + YYERROR; + } + } + | options timeoutspec { + $$.timeout = parse_timeout($2); + free($2); + if ($$.timeout == -1) { + if (errno == ERANGE) + sudoerserror(N_("timeout value too large")); + else + sudoerserror(N_("invalid timeout value")); + YYERROR; + } + } + | options rolespec { +#ifdef HAVE_SELINUX + free($$.role); + $$.role = $2; +#endif + } + | options typespec { +#ifdef HAVE_SELINUX + free($$.type); + $$.type = $2; +#endif + } + | options privsspec { +#ifdef HAVE_PRIV_SET + free($$.privs); + $$.privs = $2; +#endif + } + | options limitprivsspec { +#ifdef HAVE_PRIV_SET + free($$.limitprivs); + $$.limitprivs = $2; +#endif + } + ; + +cmndtag : /* empty */ { + TAGS_INIT(&$$); + } + | cmndtag NOPASSWD { + $$.nopasswd = true; + } + | cmndtag PASSWD { + $$.nopasswd = false; + } + | cmndtag NOEXEC { + $$.noexec = true; + } + | cmndtag EXEC { + $$.noexec = false; + } + | cmndtag SETENV { + $$.setenv = true; + } + | cmndtag NOSETENV { + $$.setenv = false; + } + | cmndtag LOG_INPUT { + $$.log_input = true; + } + | cmndtag NOLOG_INPUT { + $$.log_input = false; + } + | cmndtag LOG_OUTPUT { + $$.log_output = true; + } + | cmndtag NOLOG_OUTPUT { + $$.log_output = false; + } + | cmndtag FOLLOWLNK { + $$.follow = true; + } + | cmndtag NOFOLLOWLNK { + $$.follow = false; + } + | cmndtag MAIL { + $$.send_mail = true; + } + | cmndtag NOMAIL { + $$.send_mail = false; + } + ; + +cmnd : ALL { + $$ = new_member(NULL, ALL); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | ALIAS { + $$ = new_member($1, ALIAS); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | COMMAND { + struct sudo_command *c; + + if ((c = new_command($1.cmnd, $1.args)) == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + $$ = new_member((char *)c, COMMAND); + if ($$ == NULL) { + free(c); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +hostaliases : hostalias + | hostaliases ':' hostalias + ; + +hostalias : ALIAS { + alias_line = this_lineno; + alias_column = sudolinebuf.toke_start + 1; + } '=' hostlist { + if (!alias_add(&parsed_policy, $1, HOSTALIAS, + sudoers, alias_line, alias_column, $4)) { + alias_error($1, errno); + YYERROR; + } + } + | reserved_alias '=' hostlist + ; + +hostlist : ophost + | hostlist ',' ophost { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +cmndaliases : cmndalias + | cmndaliases ':' cmndalias + ; + +cmndalias : ALIAS { + alias_line = this_lineno; + alias_column = sudolinebuf.toke_start + 1; + } '=' cmndlist { + if (!alias_add(&parsed_policy, $1, CMNDALIAS, + sudoers, alias_line, alias_column, $4)) { + alias_error($1, errno); + YYERROR; + } + } + | reserved_alias '=' cmndlist + ; + +cmndlist : digcmnd + | cmndlist ',' digcmnd { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +runasaliases : runasalias + | runasaliases ':' runasalias + ; + +runasalias : ALIAS { + alias_line = this_lineno; + alias_column = sudolinebuf.toke_start + 1; + } '=' userlist { + if (!alias_add(&parsed_policy, $1, RUNASALIAS, + sudoers, alias_line, alias_column, $4)) { + alias_error($1, errno); + YYERROR; + } + } + | reserved_alias '=' userlist + ; + +useraliases : useralias + | useraliases ':' useralias + ; + +useralias : ALIAS { + alias_line = this_lineno; + alias_column = sudolinebuf.toke_start + 1; + } '=' userlist { + if (!alias_add(&parsed_policy, $1, USERALIAS, + sudoers, alias_line, alias_column, $4)) { + alias_error($1, errno); + YYERROR; + } + } + | reserved_alias '=' userlist + ; + +userlist : opuser + | userlist ',' opuser { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +opuser : user { + $$ = $1; + $$->negated = false; + } + | '!' user { + $$ = $2; + $$->negated = true; + } + ; + +user : ALIAS { + $$ = new_member($1, ALIAS); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | ALL { + $$ = new_member(NULL, ALL); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | NETGROUP { + $$ = new_member($1, NETGROUP); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | USERGROUP { + $$ = new_member($1, USERGROUP); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | WORD { + $$ = new_member($1, WORD); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +grouplist : opgroup + | grouplist ',' opgroup { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +opgroup : group { + $$ = $1; + $$->negated = false; + } + | '!' group { + $$ = $2; + $$->negated = true; + } + ; + +group : ALIAS { + $$ = new_member($1, ALIAS); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | ALL { + $$ = new_member(NULL, ALL); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | WORD { + $$ = new_member($1, WORD); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; +%% +/* Like yyerror() but takes a printf-style format string. */ +void +sudoerserrorf(const char *fmt, ...) +{ + debug_decl(sudoerserrorf, SUDOERS_DEBUG_PARSER); + + /* The lexer displays more detailed messages for ERROR tokens. */ + if (sudoerschar == ERROR) + debug_return; + + /* Save the line the first error occurred on. */ + if (errorlineno == -1) { + errorlineno = this_lineno; + rcstr_delref(errorfile); + errorfile = rcstr_addref(sudoers); + } + if (sudoers_warnings && fmt != NULL) { + LEXTRACE("<*> "); +#ifndef TRACELEXER + if (trace_print == NULL || trace_print == sudoers_trace_print) { + char *s, *tofree = NULL; + int oldlocale; + va_list ap; + + /* Warnings are displayed in the user's locale. */ + sudoers_setlocale(SUDOERS_LOCALE_USER, &oldlocale); + va_start(ap, fmt); + if (strcmp(fmt, "%s") == 0) { + /* Optimize common case, a single string. */ + s = _(va_arg(ap, char *)); + } else { + if (vasprintf(&s, fmt, ap) != -1) + tofree = s; + else + s = _("syntax error"); + } + sudo_printf(SUDO_CONV_ERROR_MSG, _("%s:%d:%d: %s\n"), sudoers, + this_lineno, (int)sudolinebuf.toke_start + 1, s); + free(tofree); + va_end(ap); + sudoers_setlocale(oldlocale, NULL); + + /* Display the offending line and token if possible. */ + if (sudolinebuf.len != 0) { + char tildes[128]; + size_t tlen = 0; + + sudo_printf(SUDO_CONV_ERROR_MSG, "%s%s", sudolinebuf.buf, + sudolinebuf.buf[sudolinebuf.len - 1] == '\n' ? "" : "\n"); + if (sudolinebuf.toke_end > sudolinebuf.toke_start) { + tlen = sudolinebuf.toke_end - sudolinebuf.toke_start - 1; + if (tlen >= sizeof(tildes)) + tlen = sizeof(tildes) - 1; + memset(tildes, '~', tlen); + } + tildes[tlen] = '\0'; + sudo_printf(SUDO_CONV_ERROR_MSG, "%*s^%s\n", + (int)sudolinebuf.toke_start, "", tildes); + } + } +#endif + } + parse_error = true; + debug_return; +} + +void +sudoerserror(const char *s) +{ + // -V:sudoerserror:575, 618 + if (s == NULL) + sudoerserrorf(NULL); + else + sudoerserrorf("%s", s); +} + +static void +alias_error(const char *name, int errnum) +{ + if (errnum == EEXIST) + sudoerserrorf(U_("Alias \"%s\" already defined"), name); + else + sudoerserror(N_("unable to allocate memory")); +} + +static struct defaults * +new_default(char *var, char *val, short op) +{ + struct defaults *d; + debug_decl(new_default, SUDOERS_DEBUG_PARSER); + + if ((d = calloc(1, sizeof(struct defaults))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + d->var = var; + d->val = val; + /* d->type = 0; */ + d->op = op; + /* d->binding = NULL */ + d->line = this_lineno; + d->column = sudolinebuf.toke_start + 1; + d->file = rcstr_addref(sudoers); + HLTQ_INIT(d, entries); + + debug_return_ptr(d); +} + +static struct member * +new_member(char *name, int type) +{ + struct member *m; + debug_decl(new_member, SUDOERS_DEBUG_PARSER); + + if ((m = calloc(1, sizeof(struct member))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + m->name = name; + m->type = type; + HLTQ_INIT(m, entries); + + debug_return_ptr(m); +} + +/* + * Like new_member() but uses ALL for the type. + * Used by the ldap and sssd back-ends, which don't include gram.h. + */ +struct member * +new_member_all(char *name) +{ + return new_member(name, ALL); +} + +static struct sudo_command * +new_command(char *cmnd, char *args) +{ + struct sudo_command *c; + debug_decl(new_command, SUDOERS_DEBUG_PARSER); + + if ((c = calloc(1, sizeof(*c))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + c->cmnd = cmnd; + c->args = args; + TAILQ_INIT(&c->digests); + + debug_return_ptr(c); +} + +static struct command_digest * +new_digest(int digest_type, char *digest_str) +{ + struct command_digest *digest; + debug_decl(new_digest, SUDOERS_DEBUG_PARSER); + + if ((digest = malloc(sizeof(*digest))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + HLTQ_INIT(digest, entries); + digest->digest_type = digest_type; + digest->digest_str = digest_str; + if (digest->digest_str == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(digest); + digest = NULL; + } + + debug_return_ptr(digest); +} + +/* + * Add a list of defaults structures to the defaults list. + * The binding, if non-NULL, specifies a list of hosts, users, or + * runas users the entries apply to (specified by the type). + */ +static bool +add_defaults(int type, struct member *bmem, struct defaults *defs) +{ + struct defaults *d, *next; + struct member_list *binding; + bool ret = true; + debug_decl(add_defaults, SUDOERS_DEBUG_PARSER); + + if (defs != NULL) { + /* + * We use a single binding for each entry in defs. + */ + if ((binding = malloc(sizeof(*binding))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + sudoerserror(N_("unable to allocate memory")); + debug_return_bool(false); + } + if (bmem != NULL) + HLTQ_TO_TAILQ(binding, bmem, entries); + else + TAILQ_INIT(binding); + + /* + * Set type and binding (who it applies to) for new entries. + * Then add to the global defaults list. + */ + HLTQ_FOREACH_SAFE(d, defs, entries, next) { + d->type = type; + d->binding = binding; + TAILQ_INSERT_TAIL(&parsed_policy.defaults, d, entries); + } + } + + debug_return_bool(ret); +} + +/* + * Allocate a new struct userspec, populate it, and insert it at the + * end of the userspecs list. + */ +static bool +add_userspec(struct member *members, struct privilege *privs) +{ + struct userspec *u; + debug_decl(add_userspec, SUDOERS_DEBUG_PARSER); + + if ((u = calloc(1, sizeof(*u))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_bool(false); + } + u->line = this_lineno; + u->column = sudolinebuf.toke_start + 1; + u->file = rcstr_addref(sudoers); + HLTQ_TO_TAILQ(&u->users, members, entries); + HLTQ_TO_TAILQ(&u->privileges, privs, entries); + STAILQ_INIT(&u->comments); + TAILQ_INSERT_TAIL(&parsed_policy.userspecs, u, entries); + + debug_return_bool(true); +} + +/* + * Free a member struct and its contents. + */ +void +free_member(struct member *m) +{ + debug_decl(free_member, SUDOERS_DEBUG_PARSER); + + if (m->type == COMMAND || (m->type == ALL && m->name != NULL)) { + struct command_digest *digest; + struct sudo_command *c = (struct sudo_command *)m->name; + free(c->cmnd); + free(c->args); + while ((digest = TAILQ_FIRST(&c->digests)) != NULL) { + TAILQ_REMOVE(&c->digests, digest, entries); + free(digest->digest_str); + free(digest); + } + } + free(m->name); + free(m); + + debug_return; +} + +/* + * Free a tailq of members but not the struct member_list container itself. + */ +void +free_members(struct member_list *members) +{ + struct member *m; + debug_decl(free_members, SUDOERS_DEBUG_PARSER); + + while ((m = TAILQ_FIRST(members)) != NULL) { + TAILQ_REMOVE(members, m, entries); + free_member(m); + } + + debug_return; +} + +void +free_defaults(struct defaults_list *defs) +{ + struct member_list *prev_binding = NULL; + struct defaults *def; + debug_decl(free_defaults, SUDOERS_DEBUG_PARSER); + + while ((def = TAILQ_FIRST(defs)) != NULL) { + TAILQ_REMOVE(defs, def, entries); + free_default(def, &prev_binding); + } + + debug_return; +} + +void +free_default(struct defaults *def, struct member_list **binding) +{ + debug_decl(free_default, SUDOERS_DEBUG_PARSER); + + if (def->binding != *binding) { + *binding = def->binding; + if (def->binding != NULL) { + free_members(def->binding); + free(def->binding); + } + } + rcstr_delref(def->file); + free(def->var); + free(def->val); + free(def); + + debug_return; +} + +void +free_privilege(struct privilege *priv) +{ + struct member_list *runasuserlist = NULL, *runasgrouplist = NULL; + struct member_list *prev_binding = NULL; + struct cmndspec *cs; + struct defaults *def; + char *runcwd = NULL, *runchroot = NULL; +#ifdef HAVE_SELINUX + char *role = NULL, *type = NULL; +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + char *privs = NULL, *limitprivs = NULL; +#endif /* HAVE_PRIV_SET */ + debug_decl(free_privilege, SUDOERS_DEBUG_PARSER); + + free(priv->ldap_role); + free_members(&priv->hostlist); + while ((cs = TAILQ_FIRST(&priv->cmndlist)) != NULL) { + TAILQ_REMOVE(&priv->cmndlist, cs, entries); + /* Only free the first instance of runcwd/runchroot. */ + if (cs->runcwd != runcwd) { + runcwd = cs->runcwd; + free(cs->runcwd); + } + if (cs->runchroot != runchroot) { + runchroot = cs->runchroot; + free(cs->runchroot); + } +#ifdef HAVE_SELINUX + /* Only free the first instance of a role/type. */ + if (cs->role != role) { + role = cs->role; + free(cs->role); + } + if (cs->type != type) { + type = cs->type; + free(cs->type); + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* Only free the first instance of privs/limitprivs. */ + if (cs->privs != privs) { + privs = cs->privs; + free(cs->privs); + } + if (cs->limitprivs != limitprivs) { + limitprivs = cs->limitprivs; + free(cs->limitprivs); + } +#endif /* HAVE_PRIV_SET */ + /* Only free the first instance of runas user/group lists. */ + if (cs->runasuserlist && cs->runasuserlist != runasuserlist) { + runasuserlist = cs->runasuserlist; + free_members(runasuserlist); + free(runasuserlist); + } + if (cs->runasgrouplist && cs->runasgrouplist != runasgrouplist) { + runasgrouplist = cs->runasgrouplist; + free_members(runasgrouplist); + free(runasgrouplist); + } + free_member(cs->cmnd); + free(cs); + } + while ((def = TAILQ_FIRST(&priv->defaults)) != NULL) { + TAILQ_REMOVE(&priv->defaults, def, entries); + free_default(def, &prev_binding); + } + free(priv); + + debug_return; +} + +void +free_userspecs(struct userspec_list *usl) +{ + struct userspec *us; + debug_decl(free_userspecs, SUDOERS_DEBUG_PARSER); + + while ((us = TAILQ_FIRST(usl)) != NULL) { + TAILQ_REMOVE(usl, us, entries); + free_userspec(us); + } + + debug_return; +} + +void +free_userspec(struct userspec *us) +{ + struct privilege *priv; + struct sudoers_comment *comment; + debug_decl(free_userspec, SUDOERS_DEBUG_PARSER); + + free_members(&us->users); + while ((priv = TAILQ_FIRST(&us->privileges)) != NULL) { + TAILQ_REMOVE(&us->privileges, priv, entries); + free_privilege(priv); + } + while ((comment = STAILQ_FIRST(&us->comments)) != NULL) { + STAILQ_REMOVE_HEAD(&us->comments, entries); + free(comment->str); + free(comment); + } + rcstr_delref(us->file); + free(us); + + debug_return; +} + +/* + * Initialized a sudoers parse tree. + */ +void +init_parse_tree(struct sudoers_parse_tree *parse_tree, const char *lhost, + const char *shost) +{ + TAILQ_INIT(&parse_tree->userspecs); + TAILQ_INIT(&parse_tree->defaults); + parse_tree->aliases = NULL; + parse_tree->shost = shost; + parse_tree->lhost = lhost; +} + +/* + * Move the contents of parsed_policy to new_tree. + */ +void +reparent_parse_tree(struct sudoers_parse_tree *new_tree) +{ + TAILQ_CONCAT(&new_tree->userspecs, &parsed_policy.userspecs, entries); + TAILQ_CONCAT(&new_tree->defaults, &parsed_policy.defaults, entries); + new_tree->aliases = parsed_policy.aliases; + parsed_policy.aliases = NULL; +} + +/* + * Free the contents of a sudoers parse tree and initialize it. + */ +void +free_parse_tree(struct sudoers_parse_tree *parse_tree) +{ + free_userspecs(&parse_tree->userspecs); + free_defaults(&parse_tree->defaults); + free_aliases(parse_tree->aliases); + parse_tree->aliases = NULL; +} + +/* + * Free up space used by data structures from a previous parser run and sets + * the current sudoers file to path. + */ +bool +init_parser(const char *path, bool quiet, bool strict) +{ + bool ret = true; + debug_decl(init_parser, SUDOERS_DEBUG_PARSER); + + free_parse_tree(&parsed_policy); + init_lexer(); + + rcstr_delref(sudoers); + if (path != NULL) { + if ((sudoers = rcstr_dup(path)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = false; + } + } else { + sudoers = NULL; + } + + parse_error = false; + errorlineno = -1; + rcstr_delref(errorfile); + errorfile = NULL; + sudoers_warnings = !quiet; + sudoers_strict = strict; + + debug_return_bool(ret); +} + +/* + * Initialize all options in a cmndspec. + */ +static void +init_options(struct command_options *opts) +{ + opts->notbefore = UNSPEC; + opts->notafter = UNSPEC; + opts->timeout = UNSPEC; + opts->runchroot = NULL; + opts->runcwd = NULL; +#ifdef HAVE_SELINUX + opts->role = NULL; + opts->type = NULL; +#endif +#ifdef HAVE_PRIV_SET + opts->privs = NULL; + opts->limitprivs = NULL; +#endif +} diff --git a/plugins/sudoers/group_plugin.c b/plugins/sudoers/group_plugin.c new file mode 100644 index 0000000..829cf1e --- /dev/null +++ b/plugins/sudoers/group_plugin.c @@ -0,0 +1,233 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_dso.h" + +#if defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD) + +static void *group_handle; +static struct sudoers_group_plugin *group_plugin; +const char *path_plugin_dir = _PATH_SUDO_PLUGIN_DIR; + +/* + * Load the specified plugin and run its init function. + * Returns -1 if unable to open the plugin, else it returns + * the value from the plugin's init function. + */ +int +group_plugin_load(char *plugin_info) +{ + struct stat sb; + char *args, path[PATH_MAX]; + char **argv = NULL; + int len, rc = -1; + debug_decl(group_plugin_load, SUDOERS_DEBUG_UTIL); + + /* + * Fill in .so path and split out args (if any). + */ + if ((args = strpbrk(plugin_info, " \t")) != NULL) { + len = snprintf(path, sizeof(path), "%s%.*s", + (*plugin_info != '/') ? path_plugin_dir : "", + (int)(args - plugin_info), plugin_info); + args++; + } else { + len = snprintf(path, sizeof(path), "%s%s", + (*plugin_info != '/') ? path_plugin_dir : "", plugin_info); + } + if (len < 0 || len >= ssizeof(path)) { + errno = ENAMETOOLONG; + sudo_warn("%s%s", + (*plugin_info != '/') ? path_plugin_dir : "", plugin_info); + goto done; + } + + /* Check owner and mode of plugin path. */ + if (stat(path, &sb) != 0) { + sudo_warn("%s", path); + goto done; + } + if (!sudo_conf_developer_mode()) { + if (sb.st_uid != ROOT_UID) { + sudo_warnx(U_("%s must be owned by uid %d"), path, ROOT_UID); + goto done; + } + if ((sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) { + sudo_warnx(U_("%s must only be writable by owner"), path); + goto done; + } + } + + /* Open plugin and map in symbol. */ + group_handle = sudo_dso_load(path, SUDO_DSO_LAZY|SUDO_DSO_GLOBAL); + if (!group_handle) { + const char *errstr = sudo_dso_strerror(); + sudo_warnx(U_("unable to load %s: %s"), path, + errstr ? errstr : "unknown error"); + goto done; + } + group_plugin = sudo_dso_findsym(group_handle, "group_plugin"); + if (group_plugin == NULL) { + sudo_warnx(U_("unable to find symbol \"group_plugin\" in %s"), path); + goto done; + } + + if (SUDO_API_VERSION_GET_MAJOR(group_plugin->version) != GROUP_API_VERSION_MAJOR) { + sudo_warnx(U_("%s: incompatible group plugin major version %d, expected %d"), + path, SUDO_API_VERSION_GET_MAJOR(group_plugin->version), + GROUP_API_VERSION_MAJOR); + goto done; + } + + /* + * Split args into a vector if specified. + */ + if (args != NULL) { + int ac = 0; + bool wasblank = true; + char *cp, *last; + + for (cp = args; *cp != '\0'; cp++) { + if (isblank((unsigned char)*cp)) { + wasblank = true; + } else if (wasblank) { + wasblank = false; + ac++; + } + } + if (ac != 0) { + argv = reallocarray(NULL, ac + 1, sizeof(char *)); + if (argv == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + goto done; + } + ac = 0; + cp = strtok_r(args, " \t", &last); + while (cp != NULL) { + argv[ac++] = cp; + cp = strtok_r(NULL, " \t", &last); + } + argv[ac] = NULL; + } + } + + rc = (group_plugin->init)(GROUP_API_VERSION, sudo_printf, argv); + +done: + free(argv); + + if (rc != true) { + if (group_handle != NULL) { + sudo_dso_unload(group_handle); + group_handle = NULL; + group_plugin = NULL; + } + } + + debug_return_int(rc); +} + +void +group_plugin_unload(void) +{ + debug_decl(group_plugin_unload, SUDOERS_DEBUG_UTIL); + + if (group_plugin != NULL) { + (group_plugin->cleanup)(); + group_plugin = NULL; + } + if (group_handle != NULL) { + sudo_dso_unload(group_handle); + group_handle = NULL; + } + debug_return; +} + +int +group_plugin_query(const char *user, const char *group, + const struct passwd *pwd) +{ + debug_decl(group_plugin_query, SUDOERS_DEBUG_UTIL); + + if (group_plugin == NULL) + debug_return_int(false); + debug_return_int((group_plugin->query)(user, group, pwd)); +} + +#else /* !HAVE_DLOPEN && !HAVE_SHL_LOAD */ + +/* + * No loadable shared object support. + */ + +int +group_plugin_load(char *plugin_info) +{ + debug_decl(group_plugin_load, SUDOERS_DEBUG_UTIL); + debug_return_int(false); +} + +void +group_plugin_unload(void) +{ + debug_decl(group_plugin_unload, SUDOERS_DEBUG_UTIL); + debug_return; +} + +int +group_plugin_query(const char *user, const char *group, + const struct passwd *pwd) +{ + debug_decl(group_plugin_query, SUDOERS_DEBUG_UTIL); + debug_return_int(false); +} + +#endif /* HAVE_DLOPEN || HAVE_SHL_LOAD */ + +/* + * Group plugin sudoers callback. + */ +bool +cb_group_plugin(const union sudo_defs_val *sd_un) +{ + bool rc = true; + debug_decl(cb_group_plugin, SUDOERS_DEBUG_PLUGIN); + + /* Unload any existing group plugin before loading a new one. */ + group_plugin_unload(); + if (sd_un->str != NULL) + rc = group_plugin_load(sd_un->str); + debug_return_bool(rc); +} diff --git a/plugins/sudoers/hexchar.c b/plugins/sudoers/hexchar.c new file mode 100644 index 0000000..510d27c --- /dev/null +++ b/plugins/sudoers/hexchar.c @@ -0,0 +1,101 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include "sudoers.h" + +/* + * Converts a two-byte hex string to decimal. + * Returns the decimal value or -1 for invalid input. + */ +int +hexchar(const char *s) +{ + unsigned char result[2]; + int i; + debug_decl(hexchar, SUDOERS_DEBUG_UTIL); + + for (i = 0; i < 2; i++) { + switch (s[i]) { + case '0': + result[i] = 0; + break; + case '1': + result[i] = 1; + break; + case '2': + result[i] = 2; + break; + case '3': + result[i] = 3; + break; + case '4': + result[i] = 4; + break; + case '5': + result[i] = 5; + break; + case '6': + result[i] = 6; + break; + case '7': + result[i] = 7; + break; + case '8': + result[i] = 8; + break; + case '9': + result[i] = 9; + break; + case 'A': + case 'a': + result[i] = 10; + break; + case 'B': + case 'b': + result[i] = 11; + break; + case 'C': + case 'c': + result[i] = 12; + break; + case 'D': + case 'd': + result[i] = 13; + break; + case 'E': + case 'e': + result[i] = 14; + break; + case 'F': + case 'f': + result[i] = 15; + break; + default: + /* Invalid input. */ + debug_return_int(-1); + } + } + debug_return_int((result[0] << 4) | result[1]); +} diff --git a/plugins/sudoers/ins_2001.h b/plugins/sudoers/ins_2001.h new file mode 100644 index 0000000..d2ce989 --- /dev/null +++ b/plugins/sudoers/ins_2001.h @@ -0,0 +1,35 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998, 1999 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_2001_H +#define SUDOERS_INS_2001_H + + /* + * HAL insults (paraphrased) from 2001. + */ + + "Just what do you think you're doing Dave?", + "It can only be attributed to human error.", + "That's something I cannot allow to happen.", + "My mind is going. I can feel it.", + "Sorry about this, I know it's a bit silly.", + "Take a stress pill and think things over.", + "This mission is too important for me to allow you to jeopardize it.", + "I feel much better now.", + +#endif /* SUDOERS_INS_2001_H */ diff --git a/plugins/sudoers/ins_classic.h b/plugins/sudoers/ins_classic.h new file mode 100644 index 0000000..08d54d7 --- /dev/null +++ b/plugins/sudoers/ins_classic.h @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998, 1999 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_CLASSIC_H +#define SUDOERS_INS_CLASSIC_H + + /* + * Insults from the original sudo(8). + */ + + "Wrong! You cheating scum!", +#ifndef OFFENSIVE_INSULTS + "And you call yourself a Rocket Scientist!", +#else + "No soap, honkie-lips.", +#endif + "Where did you learn to type?", + "Are you on drugs?", + "My pet ferret can type better than you!", + "You type like i drive.", + "Do you think like you type?", + "Your mind just hasn't been the same since the electro-shock, has it?", + +#endif /* SUDOERS_INS_CLASSIC_H */ diff --git a/plugins/sudoers/ins_csops.h b/plugins/sudoers/ins_csops.h new file mode 100644 index 0000000..fe66cfa --- /dev/null +++ b/plugins/sudoers/ins_csops.h @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998, 1999, 2004 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_CSOPS_H +#define SUDOERS_INS_CSOPS_H + + /* + * CSOps insults (may be site dependent). + */ + + "Maybe if you used more than just two fingers...", + "BOB says: You seem to have forgotten your passwd, enter another!", + "stty: unknown mode: doofus", + "I can't hear you -- I'm using the scrambler.", + "The more you drive -- the dumber you get.", +#ifdef PC_INSULTS + "Listen, broccoli brains, I don't have time to listen to this trash.", +#else + "Listen, burrito brains, I don't have time to listen to this trash.", +#endif + "I've seen penguins that can type better than that.", + "Have you considered trying to match wits with a rutabaga?", + "You speak an infinite deal of nothing", + +#endif /* SUDOERS_INS_CSOPS_H */ diff --git a/plugins/sudoers/ins_goons.h b/plugins/sudoers/ins_goons.h new file mode 100644 index 0000000..34df45b --- /dev/null +++ b/plugins/sudoers/ins_goons.h @@ -0,0 +1,50 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998, 1999 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_GOONS_H +#define SUDOERS_INS_GOONS_H + + /* + * Insults from the "Goon Show." + */ + + "You silly, twisted boy you.", + "He has fallen in the water!", + "We'll all be murdered in our beds!", + "You can't come in. Our tiger has got flu", + "I don't wish to know that.", + "What, what, what, what, what, what, what, what, what, what?", + "You can't get the wood, you know.", + "You'll starve!", + "... and it used to be so popular...", + "Pauses for audience applause, not a sausage", + "Hold it up to the light --- not a brain in sight!", + "Have a gorilla...", + "There must be cure for it!", + "There's a lot of it about, you know.", + "You do that again and see what happens...", + "Ying Tong Iddle I Po", + "Harm can come to a young lad like that!", + "And with that remarks folks, the case of the Crown vs yourself was proven.", + "Speak English you fool --- there are no subtitles in this scene.", + "You gotta go owwwww!", + "I have been called worse.", + "It's only your word against mine.", + "I think ... err ... I think ... I think I'll go home", + +#endif /* SUDOERS_INS_GOONS_H */ diff --git a/plugins/sudoers/ins_python.h b/plugins/sudoers/ins_python.h new file mode 100644 index 0000000..16088f3 --- /dev/null +++ b/plugins/sudoers/ins_python.h @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_PYTHON_H +#define SUDOERS_INS_PYTHON_H + + /* + * Insults from "Monty Python's Flying Circus" and family. + */ + + "That is no basis for supreme executive power!", + "You empty-headed animal food trough wiper!", + "I fart in your general direction!", + "Your mother was a hamster and your father smelt of elderberries!", + "You must cut down the mightiest tree in the forest... with... a herring!", + "I wave my private parts at your aunties!", + "He's not the Messiah, he's a very naughty boy!", + "I wish to make a complaint.", + "When you're walking home tonight, and some homicidal maniac comes after you with a bunch of loganberries, don't come crying to me!", + "This man, he doesn't know when he's beaten! He doesn't know when he's winning, either. He has no... sort of... sensory apparatus...", + "There's nothing wrong with you that an expensive operation can't prolong.", + "I'm very sorry, but I'm not allowed to argue unless you've paid.", + +#endif /* SUDOERS_INS_PYTHON_H */ diff --git a/plugins/sudoers/insults.h b/plugins/sudoers/insults.h new file mode 100644 index 0000000..d7d8074 --- /dev/null +++ b/plugins/sudoers/insults.h @@ -0,0 +1,69 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1994-1996, 1998-1999, 2004 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INSULTS_H +#define SUDOERS_INSULTS_H + +#if defined(HAL_INSULTS) || defined(GOONS_INSULTS) || defined(CLASSIC_INSULTS) || defined(CSOPS_INSULTS) || defined(PYTHON_INSULTS) + +#include "sudo_rand.h" + +/* + * Use one or more set of insults as determined by configure + */ + +char *insults[] = { + +# ifdef HAL_INSULTS +# include "ins_2001.h" +# endif + +# ifdef GOONS_INSULTS +# include "ins_goons.h" +# endif + +# ifdef CLASSIC_INSULTS +# include "ins_classic.h" +# endif + +# ifdef CSOPS_INSULTS +# include "ins_csops.h" +# endif + +# ifdef PYTHON_INSULTS +# include "ins_python.h" +# endif + + NULL + +}; + +/* + * How may I insult you? Let me count the ways... + */ +#define NOFINSULTS (nitems(insults) - 1) + +/* + * return a pseudo-random insult. + */ +#define INSULT (insults[arc4random_uniform(NOFINSULTS)]) + +#endif /* HAL_INSULTS || GOONS_INSULTS || CLASSIC_INSULTS || CSOPS_INSULTS || PYTHON_INSULTS */ + +#endif /* SUDOERS_INSULTS_H */ diff --git a/plugins/sudoers/interfaces.c b/plugins/sudoers/interfaces.c new file mode 100644 index 0000000..c946fb1 --- /dev/null +++ b/plugins/sudoers/interfaces.c @@ -0,0 +1,138 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef NEED_RESOLV_H +# include +# include +#endif /* NEED_RESOLV_H */ +#include +#include + +#include "sudoers.h" +#include "interfaces.h" + +#ifndef INADDR_NONE +# define INADDR_NONE ((unsigned int)-1) +#endif + +static struct interface_list interfaces = SLIST_HEAD_INITIALIZER(interfaces); + +/* + * Parse a space-delimited list of IP address/netmask pairs and + * store in a list of interface structures. Returns true on + * success and false on parse error or memory allocation error. + */ +bool +set_interfaces(const char *ai) +{ + char *addrinfo, *addr, *mask, *last; + struct interface *ifp; + bool ret = false; + debug_decl(set_interfaces, SUDOERS_DEBUG_NETIF); + + if ((addrinfo = strdup(ai)) == NULL) + debug_return_bool(false); + for (addr = strtok_r(addrinfo, " \t", &last); addr != NULL; addr = strtok_r(NULL, " \t", &last)) { + /* Separate addr and mask. */ + if ((mask = strchr(addr, '/')) == NULL) + continue; + *mask++ = '\0'; + + /* Parse addr and store in list. */ + if ((ifp = calloc(1, sizeof(*ifp))) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + if (strchr(addr, ':')) { + /* IPv6 */ +#ifdef HAVE_STRUCT_IN6_ADDR + ifp->family = AF_INET6; + if (inet_pton(AF_INET6, addr, &ifp->addr.ip6) != 1) { + sudo_warnx(U_("unable to parse IP address \"%s\""), addr); + free(ifp); + goto done; + } + if (inet_pton(AF_INET6, mask, &ifp->netmask.ip6) != 1) { + sudo_warnx(U_("unable to parse netmask \"%s\""), mask); + free(ifp); + goto done; + } +#else + free(ifp); + continue; +#endif + } else { + /* IPv4 */ + ifp->family = AF_INET; + if (inet_pton(AF_INET, addr, &ifp->addr.ip4) != 1) { + sudo_warnx(U_("unable to parse IP address \"%s\""), addr); + free(ifp); + goto done; + } + if (inet_pton(AF_INET, mask, &ifp->netmask.ip4) != 1) { + sudo_warnx(U_("unable to parse netmask \"%s\""), mask); + free(ifp); + goto done; + } + } + SLIST_INSERT_HEAD(&interfaces, ifp, entries); + } + ret = true; + +done: + free(addrinfo); + debug_return_bool(ret); +} + +struct interface_list * +get_interfaces(void) +{ + return &interfaces; +} + +void +dump_interfaces(const char *ai) +{ + const char *cp, *ep; + const char *ai_end = ai + strlen(ai); + debug_decl(set_interfaces, SUDOERS_DEBUG_NETIF); + + sudo_printf(SUDO_CONV_INFO_MSG, + _("Local IP address and netmask pairs:\n")); + cp = sudo_strsplit(ai, ai_end, " \t", &ep); + while (cp != NULL) { + sudo_printf(SUDO_CONV_INFO_MSG, "\t%.*s\n", (int)(ep - cp), cp); + cp = sudo_strsplit(NULL, ai_end, " \t", &ep); + } + + debug_return; +} diff --git a/plugins/sudoers/interfaces.h b/plugins/sudoers/interfaces.h new file mode 100644 index 0000000..49cca72 --- /dev/null +++ b/plugins/sudoers/interfaces.h @@ -0,0 +1,57 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007, 2010-2013 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDOERS_INTERFACES_H +#define SUDOERS_INTERFACES_H + +/* + * Union to hold either strucr in_addr or in6_add + */ +union sudo_in_addr_un { + struct in_addr ip4; +#ifdef HAVE_STRUCT_IN6_ADDR + struct in6_addr ip6; +#endif +}; + +/* + * IP address and netmask pairs for checking against local interfaces. + */ +struct interface { + SLIST_ENTRY(interface) entries; + unsigned int family; /* AF_INET or AF_INET6 */ + union sudo_in_addr_un addr; + union sudo_in_addr_un netmask; +}; + +SLIST_HEAD(interface_list, interface); + +/* + * Prototypes for external functions. + */ +int get_net_ifs(char **addrinfo); +void dump_interfaces(const char *); +bool set_interfaces(const char *); +struct interface_list *get_interfaces(void); + +#endif /* SUDOERS_INTERFACES_H */ diff --git a/plugins/sudoers/iolog.c b/plugins/sudoers/iolog.c new file mode 100644 index 0000000..75af12d --- /dev/null +++ b/plugins/sudoers/iolog.c @@ -0,0 +1,1292 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_eventlog.h" +#include "sudo_iolog.h" +#include "log_client.h" + +static struct iolog_file iolog_files[] = { + { false }, /* IOFD_STDIN */ + { false }, /* IOFD_STDOUT */ + { false }, /* IOFD_STDERR */ + { false }, /* IOFD_TTYIN */ + { false }, /* IOFD_TTYOUT */ + { true, }, /* IOFD_TIMING */ +}; + +static struct sudoers_io_operations { + int (*open)(struct timespec *now); + void (*close)(int exit_status, int error, const char **errstr); + int (*log)(int event, const char *buf, unsigned int len, + struct timespec *delay, const char **errstr); + int (*change_winsize)(unsigned int lines, unsigned int cols, + struct timespec *delay, const char **errstr); + int (*suspend)(const char *signame, struct timespec *delay, + const char **errstr); +} io_operations; + +#ifdef SUDOERS_LOG_CLIENT +static struct client_closure *client_closure; +#endif +static struct log_details iolog_details; +static bool warned = false; +static int iolog_dir_fd = -1; +static struct timespec last_time; +static void sudoers_io_setops(void); + +/* sudoers_io is declared at the end of this file. */ +extern sudo_dso_public struct io_plugin sudoers_io; + +/* + * Sudoers callback for maxseq Defaults setting. + */ +bool +cb_maxseq(const union sudo_defs_val *sd_un) +{ + const char *errstr; + unsigned int value; + debug_decl(cb_maxseq, SUDOERS_DEBUG_UTIL); + + value = sudo_strtonum(sd_un->str, 0, SESSID_MAX, &errstr); + if (errstr != NULL) { + if (errno != ERANGE) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "bad maxseq: %s: %s", sd_un->str, errstr); + debug_return_bool(false); + } + /* Out of range, clamp to SESSID_MAX as documented. */ + value = SESSID_MAX; + } + iolog_set_maxseq(value); + debug_return_bool(true); +} + +/* + * Sudoers callback for iolog_user Defaults setting. + */ +bool +cb_iolog_user(const union sudo_defs_val *sd_un) +{ + const char *name = sd_un->str; + struct passwd *pw; + debug_decl(cb_iolog_user, SUDOERS_DEBUG_UTIL); + + /* NULL name means reset to default. */ + if (name == NULL) { + iolog_set_owner(ROOT_UID, ROOT_GID); + } else { + if ((pw = sudo_getpwnam(name)) == NULL) { + log_warningx(SLOG_SEND_MAIL, N_("unknown user: %s"), name); + debug_return_bool(false); + } + iolog_set_owner(pw->pw_uid, pw->pw_gid); + sudo_pw_delref(pw); + } + + debug_return_bool(true); +} + +/* + * Look up I/O log group-ID from group name. + */ +bool +cb_iolog_group(const union sudo_defs_val *sd_un) +{ + const char *name = sd_un->str; + struct group *gr; + debug_decl(cb_iolog_group, SUDOERS_DEBUG_UTIL); + + /* NULL name means reset to default. */ + if (name == NULL) { + iolog_set_gid(ROOT_GID); + } else { + if ((gr = sudo_getgrnam(name)) == NULL) { + log_warningx(SLOG_SEND_MAIL, N_("unknown group: %s"), name); + debug_return_bool(false); + } + iolog_set_gid(gr->gr_gid); + sudo_gr_delref(gr); + } + + debug_return_bool(true); +} + +/* + * Sudoers callback for iolog_mode Defaults setting. + */ +bool +cb_iolog_mode(const union sudo_defs_val *sd_un) +{ + iolog_set_mode(sd_un->mode); + return true; +} + +/* + * Make a shallow copy of a NULL-terminated argument or environment vector. + * Only the outer array is allocated, the pointers inside are copied. + * The caller is responsible for freeing the returned copy. + */ +static char ** +copy_vector_shallow(char * const *vec) +{ + char **copy; + size_t len; + debug_decl(copy_vector, SUDOERS_DEBUG_UTIL); + + for (len = 0; vec[len] != NULL; len++) + continue; + + if ((copy = reallocarray(NULL, len + 1, sizeof(char *))) != NULL) { + for (len = 0; vec[len] != NULL; len++) + copy[len] = vec[len]; + copy[len] = NULL; + } + + debug_return_ptr(copy); +} + +static void +free_iolog_details(void) +{ + debug_decl(free_iolog_details, SUDOERS_DEBUG_PLUGIN); + + if (iolog_details.evlog != NULL) { + /* We only make a shallow copy of argv and envp. */ + free(iolog_details.evlog->argv); + iolog_details.evlog->argv = NULL; + free(iolog_details.evlog->envp); + iolog_details.evlog->envp = NULL; + eventlog_free(iolog_details.evlog); + } + str_list_free(iolog_details.log_servers); +#if defined(HAVE_OPENSSL) + free(iolog_details.ca_bundle); + free(iolog_details.cert_file); + free(iolog_details.key_file); +#endif /* HAVE_OPENSSL */ + + debug_return; +} + +/* + * Convert a comma-separated list to a string list. + */ +static struct sudoers_str_list * +deserialize_stringlist(const char *s) +{ + struct sudoers_str_list *strlist; + struct sudoers_string *str; + const char *s_end = s + strlen(s); + const char *cp, *ep; + debug_decl(deserialize_stringlist, SUDOERS_DEBUG_UTIL); + + if ((strlist = str_list_alloc()) == NULL) + debug_return_ptr(NULL); + + for (cp = sudo_strsplit(s, s_end, ",", &ep); cp != NULL; + cp = sudo_strsplit(NULL, s_end, ",", &ep)) { + if (cp == ep) + continue; + if ((str = malloc(sizeof(*str))) == NULL) + goto bad; + if ((str->str = strndup(cp, (ep - cp))) == NULL) { + free(str); + goto bad; + } + STAILQ_INSERT_TAIL(strlist, str, entries); + } + if (STAILQ_EMPTY(strlist)) + goto bad; + + debug_return_ptr(strlist); + +bad: + str_list_free(strlist); + debug_return_ptr(NULL); +} + +/* + * Pull out I/O log related data from user_info and command_info arrays. + * Returns true if I/O logging is enabled, false if not and -1 on error. + */ +int +iolog_deserialize_info(struct log_details *details, char * const user_info[], + char * const command_info[], char * const argv[], char * const user_env[]) +{ + struct eventlog *evlog; + const char *runas_uid_str = "0", *runas_euid_str = NULL; + const char *runas_gid_str = "0", *runas_egid_str = NULL; + const char *errstr; + char idbuf[MAX_UID_T_LEN + 2]; + char * const *cur; + struct passwd *pw; + struct group *gr; + id_t id; + debug_decl(iolog_deserialize_info, SUDOERS_DEBUG_UTIL); + + if ((evlog = calloc(1, sizeof(*evlog))) == NULL) + goto oom; + details->evlog = evlog; + + evlog->lines = 24; + evlog->columns = 80; + evlog->runuid = ROOT_UID; + evlog->rungid = 0; + sudo_gettime_real(&evlog->submit_time); + + for (cur = user_info; *cur != NULL; cur++) { + switch (**cur) { + case 'c': + if (strncmp(*cur, "cols=", sizeof("cols=") - 1) == 0) { + int n = sudo_strtonum(*cur + sizeof("cols=") - 1, 1, INT_MAX, + NULL); + if (n > 0) + evlog->columns = n; + continue; + } + if (strncmp(*cur, "cwd=", sizeof("cwd=") - 1) == 0) { + evlog->cwd = strdup(*cur + sizeof("cwd=") - 1); + if (evlog->cwd == NULL) + goto oom; + continue; + } + break; + case 'h': + if (strncmp(*cur, "host=", sizeof("host=") - 1) == 0) { + evlog->submithost = strdup(*cur + sizeof("host=") - 1); + if (evlog->submithost == NULL) + goto oom; + continue; + } + break; + case 'l': + if (strncmp(*cur, "lines=", sizeof("lines=") - 1) == 0) { + int n = sudo_strtonum(*cur + sizeof("lines=") - 1, 1, INT_MAX, + NULL); + if (n > 0) + evlog->lines = n; + continue; + } + break; + case 't': + if (strncmp(*cur, "tty=", sizeof("tty=") - 1) == 0) { + evlog->ttyname = strdup(*cur + sizeof("tty=") - 1); + if (evlog->ttyname == NULL) + goto oom; + continue; + } + break; + case 'u': + if (strncmp(*cur, "user=", sizeof("user=") - 1) == 0) { + evlog->submituser = strdup(*cur + sizeof("user=") - 1); + if (evlog->submituser == NULL) + goto oom; + continue; + } + break; + } + } + + for (cur = command_info; *cur != NULL; cur++) { + switch (**cur) { + case 'c': + if (strncmp(*cur, "command=", sizeof("command=") - 1) == 0) { + evlog->command = strdup(*cur + sizeof("command=") - 1); + if (evlog->command == NULL) + goto oom; + continue; + } + if (strncmp(*cur, "chroot=", sizeof("chroot=") - 1) == 0) { + evlog->runchroot = strdup(*cur + sizeof("chroot=") - 1); + if (evlog->runchroot == NULL) + goto oom; + continue; + } + break; + case 'i': + if (strncmp(*cur, "ignore_iolog_errors=", sizeof("ignore_iolog_errors=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("ignore_iolog_errors=") - 1) == true) + details->ignore_log_errors = true; + continue; + } + if (strncmp(*cur, "iolog_path=", sizeof("iolog_path=") - 1) == 0) { + evlog->iolog_path = strdup(*cur + sizeof("iolog_path=") - 1); + if (evlog->iolog_path == NULL) + goto oom; + evlog->iolog_file = strrchr(evlog->iolog_path, '/'); + if (evlog->iolog_file != NULL) + evlog->iolog_file++; + continue; + } + if (strncmp(*cur, "iolog_stdin=", sizeof("iolog_stdin=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_stdin=") - 1) == true) + iolog_files[IOFD_STDIN].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_stdout=", sizeof("iolog_stdout=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_stdout=") - 1) == true) + iolog_files[IOFD_STDOUT].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_stderr=", sizeof("iolog_stderr=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_stderr=") - 1) == true) + iolog_files[IOFD_STDERR].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_ttyin=", sizeof("iolog_ttyin=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_ttyin=") - 1) == true) + iolog_files[IOFD_TTYIN].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_ttyout=", sizeof("iolog_ttyout=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_ttyout=") - 1) == true) + iolog_files[IOFD_TTYOUT].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_compress=", sizeof("iolog_compress=") - 1) == 0) { + int val = sudo_strtobool(*cur + sizeof("iolog_compress=") - 1); + if (val != -1) { + iolog_set_compress(val); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "%s: unable to parse %s", __func__, *cur); + } + continue; + } + if (strncmp(*cur, "iolog_flush=", sizeof("iolog_flush=") - 1) == 0) { + int val = sudo_strtobool(*cur + sizeof("iolog_flush=") - 1); + if (val != -1) { + iolog_set_flush(val); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "%s: unable to parse %s", __func__, *cur); + } + continue; + } + if (strncmp(*cur, "iolog_mode=", sizeof("iolog_mode=") - 1) == 0) { + mode_t mode = sudo_strtomode(*cur + sizeof("iolog_mode=") - 1, &errstr); + if (errstr == NULL) { + iolog_set_mode(mode); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "%s: unable to parse %s", __func__, *cur); + } + continue; + } + if (strncmp(*cur, "iolog_group=", sizeof("iolog_group=") - 1) == 0) { + gr = sudo_getgrnam(*cur + sizeof("iolog_group=") - 1); + if (gr == NULL) { + sudo_debug_printf(SUDO_DEBUG_WARN, "%s: unknown group %s", + __func__, *cur + sizeof("iolog_group=") - 1); + } else { + iolog_set_gid(gr->gr_gid); + sudo_gr_delref(gr); + } + continue; + } + if (strncmp(*cur, "iolog_user=", sizeof("iolog_user=") - 1) == 0) { + pw = sudo_getpwnam(*cur + sizeof("iolog_user=") - 1); + if (pw == NULL) { + sudo_debug_printf(SUDO_DEBUG_WARN, "%s: unknown user %s", + __func__, *cur + sizeof("iolog_user=") - 1); + } else { + iolog_set_owner(pw->pw_uid, pw->pw_gid); + sudo_pw_delref(pw); + } + continue; + } + break; + case 'l': + if (strncmp(*cur, "log_servers=", sizeof("log_servers=") - 1) == 0) { + details->log_servers = + deserialize_stringlist(*cur + sizeof("log_servers=") - 1); + if (!details->log_servers) + goto oom; + continue; + } + if (strncmp(*cur, "log_server_timeout=", sizeof("log_server_timeout=") - 1) == 0) { + details->server_timeout.tv_sec = + sudo_strtonum(*cur + sizeof("log_server_timeout=") - 1, 1, + TIME_T_MAX, NULL); + continue; + } + if (strncmp(*cur, "log_server_keepalive=", sizeof("log_server_keepalive=") - 1) == 0) { + int val = sudo_strtobool(*cur + sizeof("log_server_keepalive=") - 1); + if (val != -1) { + details->keepalive = val; + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "%s: unable to parse %s", __func__, *cur); + } + continue; + } +#if defined(HAVE_OPENSSL) + if (strncmp(*cur, "log_server_cabundle=", sizeof("log_server_cabundle=") - 1) == 0) { + details->ca_bundle = strdup(*cur + sizeof("log_server_cabundle=") - 1); + if (details->ca_bundle == NULL) + goto oom; + continue; + } + if (strncmp(*cur, "log_server_peer_cert=", sizeof("log_server_peer_cert=") - 1) == 0) { + details->cert_file = strdup(*cur + sizeof("log_server_peer_cert=") - 1); + if (details->cert_file == NULL) + goto oom; + continue; + } + if (strncmp(*cur, "log_server_peer_key=", sizeof("log_server_peer_key=") - 1) == 0) { + details->key_file = strdup(*cur + sizeof("log_server_peer_key=") - 1); + if (details->key_file == NULL) + goto oom; + continue; + } + if (strncmp(*cur, "log_server_verify=", sizeof("log_server_verify=") - 1) == 0) { + int val = sudo_strtobool(*cur + sizeof("log_server_verify=") - 1); + if (val != -1) { + details->keepalive = val; + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "%s: unable to parse %s", __func__, *cur); + } + continue; + } +#endif /* HAVE_OPENSSL */ + break; + case 'm': + if (strncmp(*cur, "maxseq=", sizeof("maxseq=") - 1) == 0) { + union sudo_defs_val sd_un; + sd_un.str = *cur + sizeof("maxseq=") - 1; + cb_maxseq(&sd_un); + continue; + } + break; + case 'r': + if (strncmp(*cur, "runas_gid=", sizeof("runas_gid=") - 1) == 0) { + runas_gid_str = *cur + sizeof("runas_gid=") - 1; + continue; + } + if (strncmp(*cur, "runas_egid=", sizeof("runas_egid=") - 1) == 0) { + runas_egid_str = *cur + sizeof("runas_egid=") - 1; + continue; + } + if (strncmp(*cur, "runas_uid=", sizeof("runas_uid=") - 1) == 0) { + runas_uid_str = *cur + sizeof("runas_uid=") - 1; + continue; + } + if (strncmp(*cur, "runas_euid=", sizeof("runas_euid=") - 1) == 0) { + runas_euid_str = *cur + sizeof("runas_euid=") - 1; + continue; + } + if (strncmp(*cur, "runcwd=", sizeof("runcwd=") - 1) == 0) { + evlog->runcwd = strdup(*cur + sizeof("runcwd=") - 1); + if (evlog->runcwd == NULL) + goto oom; + continue; + } + break; + } + } + + if (argv != NULL) { + evlog->argv = copy_vector_shallow(argv); + if (evlog->argv == NULL) + goto oom; + } + if (user_env != NULL) { + evlog->envp = copy_vector_shallow(user_env); + if (evlog->envp == NULL) + goto oom; + } + + /* + * Lookup runas user and group, preferring effective over real uid/gid. + */ + if (runas_euid_str != NULL) + runas_uid_str = runas_euid_str; + if (runas_uid_str != NULL) { + id = sudo_strtoid(runas_uid_str, &errstr); + if (errstr != NULL) + sudo_warnx("runas uid %s: %s", runas_uid_str, U_(errstr)); + else + evlog->runuid = (uid_t)id; + } + if (runas_egid_str != NULL) + runas_gid_str = runas_egid_str; + if (runas_gid_str != NULL) { + id = sudo_strtoid(runas_gid_str, &errstr); + if (errstr != NULL) + sudo_warnx("runas gid %s: %s", runas_gid_str, U_(errstr)); + else + evlog->rungid = (gid_t)id; + } + + pw = sudo_getpwuid(evlog->runuid); + if (pw != NULL) { + gid_t pw_gid = pw->pw_gid; + evlog->runuser = strdup(pw->pw_name); + sudo_pw_delref(pw); + if (evlog->runuser == NULL) + goto oom; + if (evlog->rungid != pw_gid) { + gr = sudo_getgrgid(evlog->rungid); + if (gr != NULL) { + evlog->rungroup = strdup(gr->gr_name); + sudo_gr_delref(gr); + if (evlog->rungroup == NULL) + goto oom; + } else { + idbuf[0] = '#'; + strlcpy(&idbuf[1], runas_gid_str, sizeof(idbuf) - 1); + evlog->rungroup = strdup(idbuf); + if (evlog->rungroup == NULL) + goto oom; + } + } + } else { + idbuf[0] = '#'; + strlcpy(&idbuf[1], runas_uid_str, sizeof(idbuf) - 1); + evlog->runuser = strdup(idbuf); + if (evlog->runuser == NULL) + goto oom; + } + + debug_return_int( + iolog_files[IOFD_STDIN].enabled || iolog_files[IOFD_STDOUT].enabled || + iolog_files[IOFD_STDERR].enabled || iolog_files[IOFD_TTYIN].enabled || + iolog_files[IOFD_TTYOUT].enabled); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); +} + +static int +sudoers_io_open_local(struct timespec *now) +{ + struct eventlog *evlog = iolog_details.evlog; + int i, ret = -1; + size_t len; + debug_decl(sudoers_io_open_local, SUDOERS_DEBUG_PLUGIN); + + /* If no I/O log path defined we need to figure it out ourselves. */ + if (evlog->iolog_path == NULL) { + /* Get next session ID and convert it into a path. */ + const size_t pathlen = sizeof(_PATH_SUDO_IO_LOGDIR "/00/00/00"); + if ((evlog->iolog_path = malloc(pathlen)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + len = strlcpy(evlog->iolog_path, _PATH_SUDO_IO_LOGDIR, pathlen); + if (len + strlen("/00/00/00") >= pathlen) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto done; + } + if (!iolog_nextid(evlog->iolog_path, evlog->sessid)) { + log_warning(SLOG_SEND_MAIL, N_("unable to update sequence file")); + warned = true; + goto done; + } + (void)snprintf(evlog->iolog_path + strlen(_PATH_SUDO_IO_LOGDIR), + pathlen - strlen(_PATH_SUDO_IO_LOGDIR), + "/%c%c/%c%c/%c%c", evlog->sessid[0], evlog->sessid[1], + evlog->sessid[2], evlog->sessid[3], evlog->sessid[4], + evlog->sessid[5]); + } + + /* + * Create I/O log path along with any intermediate subdirs. + * Calls mkdtemp() if iolog_path ends in XXXXXX. + */ + if (!iolog_mkpath(evlog->iolog_path)) { + log_warning(SLOG_SEND_MAIL, "%s", evlog->iolog_path); + warned = true; + goto done; + } + + iolog_dir_fd = iolog_openat(AT_FDCWD, evlog->iolog_path, O_RDONLY); + if (iolog_dir_fd == -1) { + log_warning(SLOG_SEND_MAIL, "%s", evlog->iolog_path); + warned = true; + goto done; + } + + /* Write log file with user and command details. */ + if (!iolog_write_info_file(iolog_dir_fd, iolog_details.evlog)) { + log_warningx(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), strerror(errno)); + warned = true; + goto done; + } + + /* Create the timing and I/O log files. */ + for (i = 0; i < IOFD_MAX; i++) { + if (!iolog_open(&iolog_files[i], iolog_dir_fd, i, "w")) { + log_warning(SLOG_SEND_MAIL, N_("unable to create %s/%s"), + evlog->iolog_path, iolog_fd_to_name(i)); + warned = true; + goto done; + } + } + + ret = true; + +done: + debug_return_int(ret); +} + +#ifdef SUDOERS_LOG_CLIENT +static int +sudoers_io_open_remote(struct timespec *now) +{ + debug_decl(sudoers_io_open_remote, SUDOERS_DEBUG_PLUGIN); + + /* Open connection to log server, send hello and accept messages. */ + client_closure = log_server_open(&iolog_details, now, true, SEND_ACCEPT, + NULL, sudoers_io.event_alloc); + if (client_closure != NULL) + debug_return_int(1); + + debug_return_int(-1); +} +#endif /* SUDOERS_LOG_CLIENT */ + +static int +sudoers_io_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t plugin_printf, char * const settings[], + char * const user_info[], char * const command_info[], + int argc, char * const argv[], char * const user_env[], char * const args[], + const char **errstr) +{ + struct sudo_conf_debug_file_list debug_files = TAILQ_HEAD_INITIALIZER(debug_files); + char * const *cur; + const char *cp, *plugin_path = NULL; + int ret = -1; + debug_decl(sudoers_io_open, SUDOERS_DEBUG_PLUGIN); + + sudo_conv = conversation; + sudo_printf = plugin_printf; + + bindtextdomain("sudoers", LOCALEDIR); + + /* Initialize the debug subsystem. */ + for (cur = settings; (cp = *cur) != NULL; cur++) { + if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) { + cp += sizeof("debug_flags=") - 1; + if (!sudoers_debug_parse_flags(&debug_files, cp)) + debug_return_int(-1); + continue; + } + if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) { + plugin_path = cp + sizeof("plugin_path=") - 1; + continue; + } + } + + if (!sudoers_debug_register(plugin_path, &debug_files)) { + ret = -1; + goto done; + } + + /* If we have no command (because -V was specified) just return. */ + if (argc == 0) + debug_return_int(true); + + /* + * Pull iolog settings out of command_info. + */ + ret = iolog_deserialize_info(&iolog_details, user_info, command_info, + argv, user_env); + if (ret != true) + goto done; + + /* Initialize io_operations. */ + sudoers_io_setops(); + + if (sudo_gettime_awake(&last_time) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to get time of day", __func__); + goto done; + } + + /* + * Create local I/O log file or connect to remote log server. + */ + if ((ret = io_operations.open(&last_time)) != true) + goto done; + + /* + * Clear I/O log function pointers for disabled log functions. + */ + if (!iolog_files[IOFD_STDIN].enabled) + sudoers_io.log_stdin = NULL; + if (!iolog_files[IOFD_STDOUT].enabled) + sudoers_io.log_stdout = NULL; + if (!iolog_files[IOFD_STDERR].enabled) + sudoers_io.log_stderr = NULL; + if (!iolog_files[IOFD_TTYIN].enabled) + sudoers_io.log_ttyin = NULL; + if (!iolog_files[IOFD_TTYOUT].enabled) + sudoers_io.log_ttyout = NULL; + +done: + if (ret != true) { + if (iolog_dir_fd != -1) { + close(iolog_dir_fd); + iolog_dir_fd = -1; + } + free_iolog_details(); + sudo_freepwcache(); + sudo_freegrcache(); + } + + /* Ignore errors if they occur if the policy says so. */ + if (ret == -1 && iolog_details.ignore_log_errors) + ret = 0; + + debug_return_int(ret); +} + +static void +sudoers_io_close_local(int exit_status, int error, const char **errstr) +{ + int i; + debug_decl(sudoers_io_close_local, SUDOERS_DEBUG_PLUGIN); + + /* Close the files. */ + for (i = 0; i < IOFD_MAX; i++) { + if (iolog_files[i].fd.v == NULL) + continue; + iolog_close(&iolog_files[i], errstr); + } + + /* Clear write bits from I/O timing file to indicate completion. */ + if (iolog_dir_fd != -1) { + struct stat sb; + if (fstatat(iolog_dir_fd, "timing", &sb, 0) != -1) { + CLR(sb.st_mode, S_IWUSR|S_IWGRP|S_IWOTH); + if (fchmodat(iolog_dir_fd, "timing", sb.st_mode, 0) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to fchmodat timing file", __func__); + } + } + close(iolog_dir_fd); + iolog_dir_fd = -1; + } + + debug_return; +} + +#ifdef SUDOERS_LOG_CLIENT +static void +sudoers_io_close_remote(int exit_status, int error, const char **errstr) +{ + debug_decl(sudoers_io_close_remote, SUDOERS_DEBUG_PLUGIN); + + log_server_close(client_closure, exit_status, error); + client_closure = NULL; + + debug_return; +} +#endif + +static void +sudoers_io_close(int exit_status, int error) +{ + const char *errstr = NULL; + debug_decl(sudoers_io_close, SUDOERS_DEBUG_PLUGIN); + + if (io_operations.close != NULL) + io_operations.close(exit_status, error, &errstr); + + if (errstr != NULL && !warned) { + /* Only warn about I/O log file errors once. */ + log_warningx(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), errstr); + warned = true; + } + + free_iolog_details(); + sudo_freepwcache(); + sudo_freegrcache(); + + /* sudoers_debug_deregister() calls sudo_debug_exit() for us. */ + sudoers_debug_deregister(); +} + +static int +sudoers_io_version(int verbose) +{ + debug_decl(sudoers_io_version, SUDOERS_DEBUG_PLUGIN); + + sudo_printf(SUDO_CONV_INFO_MSG, "Sudoers I/O plugin version %s\n", + PACKAGE_VERSION); + + debug_return_int(true); +} + +/* + * Write an I/O log entry to the local file system. + * Returns 1 on success and -1 on error. + * Fills in errstr on error. + */ +static int +sudoers_io_log_local(int event, const char *buf, unsigned int len, + struct timespec *delay, const char **errstr) +{ + struct iolog_file *iol; + char tbuf[1024]; + int ret = -1; + debug_decl(sudoers_io_log_local, SUDOERS_DEBUG_PLUGIN); + + if (event < 0 || event >= IOFD_MAX) { + *errstr = NULL; + sudo_warnx(U_("unexpected I/O event %d"), event); + debug_return_int(-1); + } + iol = &iolog_files[event]; + if (!iol->enabled) { + *errstr = NULL; + sudo_warnx(U_("%s: internal error, I/O log file for event %d not open"), + __func__, event); + debug_return_int(-1); + } + + /* Write I/O log file entry. */ + if (iolog_write(iol, buf, len, errstr) == -1) + goto done; + + /* Write timing file entry. */ + len = (unsigned int)snprintf(tbuf, sizeof(tbuf), "%d %lld.%09ld %u\n", + event, (long long)delay->tv_sec, delay->tv_nsec, len); + if (len >= sizeof(tbuf)) { + /* Not actually possible due to the size of tbuf[]. */ + *errstr = strerror(EOVERFLOW); + goto done; + } + if (iolog_write(&iolog_files[IOFD_TIMING], tbuf, len, errstr) == -1) + goto done; + + /* Success. */ + ret = 1; + +done: + debug_return_int(ret); +} + +#ifdef SUDOERS_LOG_CLIENT +/* + * Schedule an I/O log entry to be written to the log server. + * Returns 1 on success and -1 on error. + * Fills in errstr on error. + */ +static int +sudoers_io_log_remote(int event, const char *buf, unsigned int len, + struct timespec *delay, const char **errstr) +{ + int type, ret = -1; + debug_decl(sudoers_io_log_remote, SUDOERS_DEBUG_PLUGIN); + + if (client_closure->disabled) + debug_return_int(1); + + /* Track elapsed time for comparison with commit points. */ + sudo_timespecadd(delay, &client_closure->elapsed, &client_closure->elapsed); + + switch (event) { + case IO_EVENT_STDIN: + type = CLIENT_MESSAGE__TYPE_STDIN_BUF; + break; + case IO_EVENT_STDOUT: + type = CLIENT_MESSAGE__TYPE_STDOUT_BUF; + break; + case IO_EVENT_STDERR: + type = CLIENT_MESSAGE__TYPE_STDERR_BUF; + break; + case IO_EVENT_TTYIN: + type = CLIENT_MESSAGE__TYPE_TTYIN_BUF; + break; + case IO_EVENT_TTYOUT: + type = CLIENT_MESSAGE__TYPE_TTYOUT_BUF; + break; + default: + sudo_warnx(U_("unexpected I/O event %d"), event); + goto done; + } + if (fmt_io_buf(client_closure, type, buf, len, delay)) { + ret = client_closure->write_ev->add(client_closure->write_ev, + &iolog_details.server_timeout); + if (ret == -1) + sudo_warn("%s", U_("unable to add event to queue")); + } + +done: + debug_return_int(ret); +} +#endif /* SUDOERS_LOG_CLIENT */ + +/* + * Generic I/O logging function. Called by the I/O logging entry points. + * Returns 1 on success and -1 on error. + */ +static int +sudoers_io_log(const char *buf, unsigned int len, int event, const char **errstr) +{ + struct timespec now, delay; + const char *ioerror = NULL; + int ret = -1; + debug_decl(sudoers_io_log, SUDOERS_DEBUG_PLUGIN); + + if (sudo_gettime_awake(&now) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to get time of day", __func__); + ioerror = N_("unable to read the clock"); + goto bad; + } + sudo_timespecsub(&now, &last_time, &delay); + + ret = io_operations.log(event, buf, len, &delay, &ioerror); + + last_time.tv_sec = now.tv_sec; + last_time.tv_nsec = now.tv_nsec; + +bad: + if (ret == -1) { + if (ioerror != NULL) { + char *cp; + + if (asprintf(&cp, N_("unable to write to I/O log file: %s"), + ioerror) != -1) { + *errstr = cp; + } + if (!warned) { + /* Only warn about I/O log file errors once. */ + log_warningx(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), ioerror); + warned = true; + } + } + + /* Ignore errors if they occur if the policy says so. */ + if (iolog_details.ignore_log_errors) + ret = 1; + } + + debug_return_int(ret); +} + +static int +sudoers_io_log_stdin(const char *buf, unsigned int len, const char **errstr) +{ + return sudoers_io_log(buf, len, IO_EVENT_STDIN, errstr); +} + +static int +sudoers_io_log_stdout(const char *buf, unsigned int len, const char **errstr) +{ + return sudoers_io_log(buf, len, IO_EVENT_STDOUT, errstr); +} + +static int +sudoers_io_log_stderr(const char *buf, unsigned int len, const char **errstr) +{ + return sudoers_io_log(buf, len, IO_EVENT_STDERR, errstr); +} + +static int +sudoers_io_log_ttyin(const char *buf, unsigned int len, const char **errstr) +{ + return sudoers_io_log(buf, len, IO_EVENT_TTYIN, errstr); +} + +static int +sudoers_io_log_ttyout(const char *buf, unsigned int len, const char **errstr) +{ + return sudoers_io_log(buf, len, IO_EVENT_TTYOUT, errstr); +} + +static int +sudoers_io_change_winsize_local(unsigned int lines, unsigned int cols, + struct timespec *delay, const char **errstr) +{ + char tbuf[1024]; + int len, ret = -1; + debug_decl(sudoers_io_change_winsize_local, SUDOERS_DEBUG_PLUGIN); + + /* Write window change event to the timing file. */ + len = snprintf(tbuf, sizeof(tbuf), "%d %lld.%09ld %u %u\n", + IO_EVENT_WINSIZE, (long long)delay->tv_sec, delay->tv_nsec, + lines, cols); + if (len < 0 || len >= ssizeof(tbuf)) { + /* Not actually possible due to the size of tbuf[]. */ + *errstr = strerror(EOVERFLOW); + goto done; + } + if (iolog_write(&iolog_files[IOFD_TIMING], tbuf, len, errstr) == -1) + goto done; + + /* Success. */ + ret = 1; + +done: + debug_return_int(ret); +} + +#ifdef SUDOERS_LOG_CLIENT +static int +sudoers_io_change_winsize_remote(unsigned int lines, unsigned int cols, + struct timespec *delay, const char **errstr) +{ + int ret = -1; + debug_decl(sudoers_io_change_winsize_remote, SUDOERS_DEBUG_PLUGIN); + + if (client_closure->disabled) + debug_return_int(1); + + /* Track elapsed time for comparison with commit points. */ + sudo_timespecadd(delay, &client_closure->elapsed, &client_closure->elapsed); + + if (fmt_winsize(client_closure, lines, cols, delay)) { + ret = client_closure->write_ev->add(client_closure->write_ev, + &iolog_details.server_timeout); + if (ret == -1) + sudo_warn("%s", U_("unable to add event to queue")); + } + + debug_return_int(ret); +} +#endif /* SUDOERS_LOG_CLIENT */ + +static int +sudoers_io_change_winsize(unsigned int lines, unsigned int cols, const char **errstr) +{ + struct timespec now, delay; + const char *ioerror = NULL; + int ret = -1; + debug_decl(sudoers_io_change_winsize, SUDOERS_DEBUG_PLUGIN); + + if (sudo_gettime_awake(&now) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to get time of day", __func__); + ioerror = N_("unable to read the clock"); + goto bad; + } + sudo_timespecsub(&now, &last_time, &delay); + + ret = io_operations.change_winsize(lines, cols, &delay, &ioerror); + + last_time.tv_sec = now.tv_sec; + last_time.tv_nsec = now.tv_nsec; + +bad: + if (ret == -1) { + if (ioerror != NULL && !warned) { + char *cp; + + if (asprintf(&cp, N_("unable to write to I/O log file: %s"), + ioerror) != -1) { + *errstr = cp; + } + if (!warned) { + /* Only warn about I/O log file errors once. */ + log_warningx(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), ioerror); + warned = true; + } + } + + /* Ignore errors if they occur if the policy says so. */ + if (iolog_details.ignore_log_errors) + ret = 1; + } + + debug_return_int(ret); +} + +static int +sudoers_io_suspend_local(const char *signame, struct timespec *delay, + const char **errstr) +{ + unsigned int len; + char tbuf[1024]; + int ret = -1; + debug_decl(sudoers_io_suspend_local, SUDOERS_DEBUG_PLUGIN); + + /* Write suspend event to the timing file. */ + len = (unsigned int)snprintf(tbuf, sizeof(tbuf), "%d %lld.%09ld %s\n", + IO_EVENT_SUSPEND, (long long)delay->tv_sec, delay->tv_nsec, signame); + if (len >= sizeof(tbuf)) { + /* Not actually possible due to the size of tbuf[]. */ + *errstr = strerror(EOVERFLOW); + goto done; + } + if (iolog_write(&iolog_files[IOFD_TIMING], tbuf, len, errstr) == -1) + goto done; + + /* Success. */ + ret = 1; + +done: + debug_return_int(ret); +} + +#ifdef SUDOERS_LOG_CLIENT +static int +sudoers_io_suspend_remote(const char *signame, struct timespec *delay, + const char **errstr) +{ + int ret = -1; + debug_decl(sudoers_io_suspend_remote, SUDOERS_DEBUG_PLUGIN); + + if (client_closure->disabled) + debug_return_int(1); + + /* Track elapsed time for comparison with commit points. */ + sudo_timespecadd(delay, &client_closure->elapsed, &client_closure->elapsed); + + if (fmt_suspend(client_closure, signame, delay)) { + ret = client_closure->write_ev->add(client_closure->write_ev, + &iolog_details.server_timeout); + if (ret == -1) + sudo_warn("%s", U_("unable to add event to queue")); + } + + debug_return_int(ret); +} +#endif /* SUDOERS_LOG_CLIENT */ + +static int +sudoers_io_suspend(int signo, const char **errstr) +{ + struct timespec now, delay; + char signame[SIG2STR_MAX]; + const char *ioerror = NULL; + int ret = -1; + debug_decl(sudoers_io_suspend, SUDOERS_DEBUG_PLUGIN); + + if (signo <= 0 || sig2str(signo, signame) == -1) { + sudo_warnx(U_("%s: internal error, invalid signal %d"), + __func__, signo); + debug_return_int(-1); + } + + if (sudo_gettime_awake(&now) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to get time of day", __func__); + ioerror = N_("unable to read the clock"); + goto bad; + } + sudo_timespecsub(&now, &last_time, &delay); + + /* Write suspend event to the timing file. */ + ret = io_operations.suspend(signame, &delay, &ioerror); + + last_time.tv_sec = now.tv_sec; + last_time.tv_nsec = now.tv_nsec; + +bad: + if (ret == -1) { + if (ioerror != NULL && !warned) { + char *cp; + + if (asprintf(&cp, N_("unable to write to I/O log file: %s"), + ioerror) != -1) { + *errstr = cp; + } + if (!warned) { + /* Only warn about I/O log file errors once. */ + log_warningx(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), ioerror); + warned = true; + } + } + + /* Ignore errors if they occur if the policy says so. */ + if (iolog_details.ignore_log_errors) + ret = 1; + } + + debug_return_int(ret); +} + +/* + * Fill in the contents of io_operations, either local or remote. + */ +static void +sudoers_io_setops(void) +{ + debug_decl(sudoers_io_setops, SUDOERS_DEBUG_PLUGIN); + +#ifdef SUDOERS_LOG_CLIENT + if (sudoers_io.event_alloc != NULL && iolog_details.log_servers != NULL) { + io_operations.open = sudoers_io_open_remote; + io_operations.close = sudoers_io_close_remote; + io_operations.log = sudoers_io_log_remote; + io_operations.change_winsize = sudoers_io_change_winsize_remote; + io_operations.suspend = sudoers_io_suspend_remote; + } else +#endif /* SUDOERS_LOG_CLIENT */ + { + io_operations.open = sudoers_io_open_local; + io_operations.close = sudoers_io_close_local; + io_operations.log = sudoers_io_log_local; + io_operations.change_winsize = sudoers_io_change_winsize_local; + io_operations.suspend = sudoers_io_suspend_local; + } + + debug_return; +} + +sudo_dso_public struct io_plugin sudoers_io = { + SUDO_IO_PLUGIN, + SUDO_API_VERSION, + sudoers_io_open, + sudoers_io_close, + sudoers_io_version, + sudoers_io_log_ttyin, + sudoers_io_log_ttyout, + sudoers_io_log_stdin, + sudoers_io_log_stdout, + sudoers_io_log_stderr, + NULL, /* register_hooks */ + NULL, /* deregister_hooks */ + sudoers_io_change_winsize, + sudoers_io_suspend, + NULL /* event_alloc() filled in by sudo */ +}; diff --git a/plugins/sudoers/iolog_path_escapes.c b/plugins/sudoers/iolog_path_escapes.c new file mode 100644 index 0000000..e32d417 --- /dev/null +++ b/plugins/sudoers/iolog_path_escapes.c @@ -0,0 +1,141 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_iolog.h" + +static size_t +fill_seq(char *str, size_t strsize, void *v) +{ +#ifdef SUDOERS_NO_SEQ + debug_decl(fill_seq, SUDOERS_DEBUG_UTIL); + debug_return_size_t(strlcpy(str, "%{seq}", strsize)); +#else + char *logdir = v; + static char sessid[7]; + int len; + debug_decl(fill_seq, SUDOERS_DEBUG_UTIL); + + if (sessid[0] == '\0') { + if (!iolog_nextid(logdir, sessid)) + debug_return_size_t((size_t)-1); + } + + /* Path is of the form /var/log/sudo-io/00/00/01. */ + len = snprintf(str, strsize, "%c%c/%c%c/%c%c", sessid[0], + sessid[1], sessid[2], sessid[3], sessid[4], sessid[5]); + if (len < 0) + debug_return_size_t(strsize); /* handle non-standard snprintf() */ + debug_return_size_t(len); +#endif /* SUDOERS_NO_SEQ */ +} + +static size_t +fill_user(char *str, size_t strsize, void *unused) +{ + debug_decl(fill_user, SUDOERS_DEBUG_UTIL); + debug_return_size_t(strlcpy(str, user_name, strsize)); +} + +static size_t +fill_group(char *str, size_t strsize, void *unused) +{ + struct group *grp; + size_t len; + debug_decl(fill_group, SUDOERS_DEBUG_UTIL); + + if ((grp = sudo_getgrgid(user_gid)) != NULL) { + len = strlcpy(str, grp->gr_name, strsize); + sudo_gr_delref(grp); + } else { + len = strlen(str); + len = snprintf(str + len, strsize - len, "#%u", + (unsigned int) user_gid); + } + debug_return_size_t(len); +} + +static size_t +fill_runas_user(char *str, size_t strsize, void *unused) +{ + debug_decl(fill_runas_user, SUDOERS_DEBUG_UTIL); + debug_return_size_t(strlcpy(str, runas_pw->pw_name, strsize)); +} + +static size_t +fill_runas_group(char *str, size_t strsize, void *unused) +{ + struct group *grp; + size_t len; + debug_decl(fill_runas_group, SUDOERS_DEBUG_UTIL); + + if (runas_gr != NULL) { + len = strlcpy(str, runas_gr->gr_name, strsize); + } else { + if ((grp = sudo_getgrgid(runas_pw->pw_gid)) != NULL) { + len = strlcpy(str, grp->gr_name, strsize); + sudo_gr_delref(grp); + } else { + len = strlen(str); + len = snprintf(str + len, strsize - len, "#%u", + (unsigned int) runas_pw->pw_gid); + } + } + debug_return_size_t(len); +} + +static size_t +fill_hostname(char *str, size_t strsize, void *unused) +{ + debug_decl(fill_hostname, SUDOERS_DEBUG_UTIL); + debug_return_size_t(strlcpy(str, user_shost, strsize)); +} + +static size_t +fill_command(char *str, size_t strsize, void *unused) +{ + debug_decl(fill_command, SUDOERS_DEBUG_UTIL); + debug_return_size_t(strlcpy(str, user_base, strsize)); +} + +/* Note: "seq" must be first in the list. */ +static const struct iolog_path_escape path_escapes[] = { + { "seq", fill_seq }, + { "user", fill_user }, + { "group", fill_group }, + { "runas_user", fill_runas_user }, + { "runas_group", fill_runas_group }, + { "hostname", fill_hostname }, + { "command", fill_command }, + { NULL, NULL } +}; +const struct iolog_path_escape *sudoers_iolog_path_escapes = path_escapes; diff --git a/plugins/sudoers/ldap.c b/plugins/sudoers/ldap.c new file mode 100644 index 0000000..a13da73 --- /dev/null +++ b/plugins/sudoers/ldap.c @@ -0,0 +1,2099 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2003-2020 Todd C. Miller + * + * This code is derived from software contributed by Aaron Spangler. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LBER_H +# include +#endif +#include +#if defined(HAVE_LDAPSSL_H) +# include +#elif defined(HAVE_LDAP_SSL_H) +# include +#elif defined(HAVE_MPS_LDAP_SSL_H) +# include +#endif +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S +# ifdef HAVE_SASL_SASL_H +# include +# else +# include +# endif +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ + +#include "sudoers.h" +#include "sudo_lbuf.h" +#include "sudo_ldap.h" +#include "sudo_ldap_conf.h" +#include "sudo_dso.h" + +#ifndef LDAP_OPT_RESULT_CODE +# define LDAP_OPT_RESULT_CODE LDAP_OPT_ERROR_NUMBER +#endif + +#ifndef LDAP_OPT_SUCCESS +# define LDAP_OPT_SUCCESS LDAP_SUCCESS +#endif + +#if defined(HAVE_LDAP_SASL_INTERACTIVE_BIND_S) && !defined(LDAP_SASL_QUIET) +# define LDAP_SASL_QUIET 0 +#endif + +#ifndef HAVE_LDAP_UNBIND_EXT_S +#define ldap_unbind_ext_s(a, b, c) ldap_unbind_s(a) +#endif + +#ifndef HAVE_LDAP_SEARCH_EXT_S +# ifdef HAVE_LDAP_SEARCH_ST +# define ldap_search_ext_s(a, b, c, d, e, f, g, h, i, j, k) \ + ldap_search_st(a, b, c, d, e, f, i, k) +# else +# define ldap_search_ext_s(a, b, c, d, e, f, g, h, i, j, k) \ + ldap_search_s(a, b, c, d, e, f, k) +# endif +#endif + +#define LDAP_FOREACH(var, ld, res) \ + for ((var) = ldap_first_entry((ld), (res)); \ + (var) != NULL; \ + (var) = ldap_next_entry((ld), (var))) + +/* The TIMEFILTER_LENGTH is the length of the filter when timed entries + are used. The length is computed as follows: + 81 for the filter itself + + 2 * 17 for the now timestamp +*/ +#define TIMEFILTER_LENGTH 115 + +/* + * The ldap_search structure implements a linked list of ldap and + * search result pointers, which allows us to remove them after + * all search results have been combined in memory. + */ +struct ldap_search_result { + STAILQ_ENTRY(ldap_search_result) entries; + LDAP *ldap; + LDAPMessage *searchresult; +}; +STAILQ_HEAD(ldap_search_list, ldap_search_result); + +/* + * The ldap_entry_wrapper structure is used to implement sorted result entries. + * A double is used for the order to allow for insertion of new entries + * without having to renumber everything. + * Note: there is no standard floating point type in LDAP. + * As a result, some LDAP servers will only allow an integer. + */ +struct ldap_entry_wrapper { + LDAPMessage *entry; + double order; +}; + +/* + * The ldap_result structure contains the list of matching searches as + * well as an array of all result entries sorted by the sudoOrder attribute. + */ +struct ldap_result { + struct ldap_search_list searches; + struct ldap_entry_wrapper *entries; + unsigned int allocated_entries; + unsigned int nentries; +}; +#define ALLOCATION_INCREMENT 100 + +/* + * The ldap_netgroup structure implements a singly-linked tail queue of + * netgroups a user is a member of when querying netgroups directly. + */ +struct ldap_netgroup { + STAILQ_ENTRY(ldap_netgroup) entries; + char *name; +}; +STAILQ_HEAD(ldap_netgroup_list, ldap_netgroup); + +/* + * LDAP sudo_nss handle. + * We store the connection to the LDAP server and the passwd struct of the + * user the last query was performed for. + */ +struct sudo_ldap_handle { + LDAP *ld; + struct passwd *pw; + struct sudoers_parse_tree parse_tree; +}; + +#ifdef HAVE_LDAP_INITIALIZE +static char * +sudo_ldap_join_uri(struct ldap_config_str_list *uri_list) +{ + struct ldap_config_str *uri; + size_t len = 0; + char *buf = NULL; + debug_decl(sudo_ldap_join_uri, SUDOERS_DEBUG_LDAP); + + STAILQ_FOREACH(uri, uri_list, entries) { + if (ldap_conf.ssl_mode == SUDO_LDAP_STARTTLS) { + if (strncasecmp(uri->val, "ldaps://", 8) == 0) { + sudo_warnx("%s", U_("starttls not supported when using ldaps")); + ldap_conf.ssl_mode = SUDO_LDAP_SSL; + } + } + len += strlen(uri->val) + 1; + } + if (len == 0 || (buf = malloc(len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } else { + char *cp = buf; + + STAILQ_FOREACH(uri, uri_list, entries) { + cp += strlcpy(cp, uri->val, len - (cp - buf)); + *cp++ = ' '; + } + cp[-1] = '\0'; + } + debug_return_str(buf); +} +#endif /* HAVE_LDAP_INITIALIZE */ + +/* + * Wrapper for ldap_create() or ldap_init() that handles + * SSL/TLS initialization as well. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +static int +sudo_ldap_init(LDAP **ldp, const char *host, int port) +{ + LDAP *ld; + int ret = LDAP_CONNECT_ERROR; + debug_decl(sudo_ldap_init, SUDOERS_DEBUG_LDAP); + +#ifdef HAVE_LDAPSSL_INIT + if (ldap_conf.ssl_mode != SUDO_LDAP_CLEAR) { + const int defsecure = ldap_conf.ssl_mode == SUDO_LDAP_SSL; + DPRINTF2("ldapssl_clientauth_init(%s, %s)", + ldap_conf.tls_certfile ? ldap_conf.tls_certfile : "NULL", + ldap_conf.tls_keyfile ? ldap_conf.tls_keyfile : "NULL"); + ret = ldapssl_clientauth_init(ldap_conf.tls_certfile, NULL, + ldap_conf.tls_keyfile != NULL, ldap_conf.tls_keyfile, NULL); + /* + * Starting with version 5.0, Mozilla-derived LDAP SDKs require + * the cert and key paths to be a directory, not a file. + * If the user specified a file and it fails, try the parent dir. + */ + if (ret != LDAP_SUCCESS) { + bool retry = false; + if (ldap_conf.tls_certfile != NULL) { + char *cp = strrchr(ldap_conf.tls_certfile, '/'); + if (cp != NULL && strncmp(cp + 1, "cert", 4) == 0) { + *cp = '\0'; + retry = true; + } + } + if (ldap_conf.tls_keyfile != NULL) { + char *cp = strrchr(ldap_conf.tls_keyfile, '/'); + if (cp != NULL && strncmp(cp + 1, "key", 3) == 0) { + *cp = '\0'; + retry = true; + } + } + if (retry) { + DPRINTF2("retry ldapssl_clientauth_init(%s, %s)", + ldap_conf.tls_certfile ? ldap_conf.tls_certfile : "NULL", + ldap_conf.tls_keyfile ? ldap_conf.tls_keyfile : "NULL"); + ret = ldapssl_clientauth_init(ldap_conf.tls_certfile, NULL, + ldap_conf.tls_keyfile != NULL, ldap_conf.tls_keyfile, NULL); + } + } + if (ret != LDAP_SUCCESS) { + sudo_warnx(U_("unable to initialize SSL cert and key db: %s"), + ldapssl_err2string(ret)); + if (ldap_conf.tls_certfile == NULL) + sudo_warnx(U_("you must set TLS_CERT in %s to use SSL"), + path_ldap_conf); + goto done; + } + + DPRINTF2("ldapssl_init(%s, %d, %d)", host, port, defsecure); + if ((ld = ldapssl_init(host, port, defsecure)) != NULL) + ret = LDAP_SUCCESS; + } else +#elif defined(HAVE_LDAP_SSL_INIT) && defined(HAVE_LDAP_SSL_CLIENT_INIT) + if (ldap_conf.ssl_mode == SUDO_LDAP_SSL) { + int sslrc; + ret = ldap_ssl_client_init(ldap_conf.tls_keyfile, ldap_conf.tls_keypw, + 0, &sslrc); + if (ret != LDAP_SUCCESS) { + sudo_warnx("ldap_ssl_client_init(): %s: %s", + ldap_err2string(ret), ssl_err2string(sslrc)); + goto done; + } + DPRINTF2("ldap_ssl_init(%s, %d, NULL)", host, port); + if ((ld = ldap_ssl_init((char *)host, port, NULL)) != NULL) + ret = LDAP_SUCCESS; + } else +#endif + { +#ifdef HAVE_LDAP_CREATE + DPRINTF2("ldap_create()"); + if ((ret = ldap_create(&ld)) != LDAP_SUCCESS) + goto done; + DPRINTF2("ldap_set_option(LDAP_OPT_HOST_NAME, %s)", host); + ret = ldap_set_option(ld, LDAP_OPT_HOST_NAME, host); +#else + DPRINTF2("ldap_init(%s, %d)", host, port); + if ((ld = ldap_init((char *)host, port)) == NULL) + goto done; + ret = LDAP_SUCCESS; +#endif + } + + *ldp = ld; +done: + debug_return_int(ret); +} + +/* + * Wrapper for ldap_get_values_len() that fills in the response code + * on error. + */ +static struct berval ** +sudo_ldap_get_values_len(LDAP *ld, LDAPMessage *entry, char *attr, int *rc) +{ + struct berval **bval; + + bval = ldap_get_values_len(ld, entry, attr); + if (bval == NULL) { + int optrc = ldap_get_option(ld, LDAP_OPT_RESULT_CODE, rc); + if (optrc != LDAP_OPT_SUCCESS) + *rc = optrc; + } else { + *rc = LDAP_SUCCESS; + } + return bval; +} + +/* + * Walk through search results and return true if we have a matching + * non-Unix group (including netgroups), else false. + */ +static int +sudo_ldap_check_non_unix_group(LDAP *ld, LDAPMessage *entry, struct passwd *pw) +{ + struct berval **bv, **p; + bool ret = false; + char *val; + int rc; + debug_decl(sudo_ldap_check_non_unix_group, SUDOERS_DEBUG_LDAP); + + if (!entry) + debug_return_bool(ret); + + /* get the values from the entry */ + bv = sudo_ldap_get_values_len(ld, entry, "sudoUser", &rc); + if (bv == NULL) { + if (rc == LDAP_NO_MEMORY) + debug_return_int(-1); + debug_return_bool(false); + } + + /* walk through values */ + for (p = bv; *p != NULL && !ret; p++) { + val = (*p)->bv_val; + if (*val == '+') { + if (netgr_matches(val, def_netgroup_tuple ? user_runhost : NULL, + def_netgroup_tuple ? user_srunhost : NULL, pw->pw_name)) + ret = true; + DPRINTF2("ldap sudoUser netgroup '%s' ... %s", val, + ret ? "MATCH!" : "not"); + } else { + if (group_plugin_query(pw->pw_name, val + 2, pw)) + ret = true; + DPRINTF2("ldap sudoUser non-Unix group '%s' ... %s", val, + ret ? "MATCH!" : "not"); + } + } + + ldap_value_free_len(bv); /* cleanup */ + + debug_return_bool(ret); +} + +/* + * Extract the dn from an entry and return the first rdn from it. + */ +static char * +sudo_ldap_get_first_rdn(LDAP *ld, LDAPMessage *entry, int *rc) +{ +#ifdef HAVE_LDAP_STR2DN + char *dn, *rdn = NULL; + LDAPDN tmpDN; + debug_decl(sudo_ldap_get_first_rdn, SUDOERS_DEBUG_LDAP); + + if ((dn = ldap_get_dn(ld, entry)) == NULL) { + int optrc = ldap_get_option(ld, LDAP_OPT_RESULT_CODE, rc); + if (optrc != LDAP_OPT_SUCCESS) + *rc = optrc; + debug_return_str(NULL); + } + *rc = ldap_str2dn(dn, &tmpDN, LDAP_DN_FORMAT_LDAP); + if (*rc == LDAP_SUCCESS) { + ldap_rdn2str(tmpDN[0], &rdn, LDAP_DN_FORMAT_UFN); + ldap_dnfree(tmpDN); + } + ldap_memfree(dn); + debug_return_str(rdn); +#else + char *dn, **edn; + debug_decl(sudo_ldap_get_first_rdn, SUDOERS_DEBUG_LDAP); + + if ((dn = ldap_get_dn(ld, entry)) == NULL) { + int optrc = ldap_get_option(ld, LDAP_OPT_RESULT_CODE, rc); + if (optrc != LDAP_OPT_SUCCESS) + *rc = optrc; + debug_return_str(NULL); + } + edn = ldap_explode_dn(dn, 1); + ldap_memfree(dn); + if (edn == NULL) { + *rc = LDAP_NO_MEMORY; + debug_return_str(NULL); + } + *rc = LDAP_SUCCESS; + debug_return_str(edn[0]); +#endif +} + +/* + * Read sudoOption and fill in the defaults list. + * This is used to parse the cn=defaults entry. + */ +static bool +sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry, struct defaults_list *defs) +{ + struct berval **bv, **p; + char *cn, *cp, *source = NULL; + bool ret = false; + int rc; + debug_decl(sudo_ldap_parse_options, SUDOERS_DEBUG_LDAP); + + bv = sudo_ldap_get_values_len(ld, entry, "sudoOption", &rc); + if (bv == NULL) { + if (rc == LDAP_NO_MEMORY) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + debug_return_bool(true); + } + + /* Use sudoRole in place of file name in defaults. */ + cn = sudo_ldap_get_first_rdn(ld, entry, &rc); + if (cn == NULL) { + if (rc == LDAP_NO_MEMORY) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + } + if (asprintf(&cp, "sudoRole %s", cn ? cn : "UNKNOWN") == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + if ((source = rcstr_dup(cp)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(cp); + goto done; + } + + /* Walk through options, appending to defs. */ + for (p = bv; *p != NULL; p++) { + char *var, *val; + int op; + + op = sudo_ldap_parse_option((*p)->bv_val, &var, &val); + if (!sudo_ldap_add_default(var, val, op, source, defs)) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + } + + ret = true; + +done: + rcstr_delref(source); + if (cn) + ldap_memfree(cn); + ldap_value_free_len(bv); + + debug_return_bool(ret); +} + +/* + * Build an LDAP timefilter. + * + * Stores a filter in the buffer that makes sure only entries + * are selected that have a sudoNotBefore in the past and a + * sudoNotAfter in the future, i.e. a filter of the following + * structure (spaced out a little more for better readability: + * + * (& + * (| + * (!(sudoNotAfter=*)) + * (sudoNotAfter>__now__) + * ) + * (| + * (!(sudoNotBefore=*)) + * (sudoNotBefore<__now__) + * ) + * ) + * + * If either the sudoNotAfter or sudoNotBefore attributes are missing, + * no time restriction shall be imposed. + */ +static bool +sudo_ldap_timefilter(char *buffer, size_t buffersize) +{ + struct tm *tp; + time_t now; + char timebuffer[sizeof("20120727121554.0Z")]; + int len = -1; + debug_decl(sudo_ldap_timefilter, SUDOERS_DEBUG_LDAP); + + /* Make sure we have a formatted timestamp for __now__. */ + time(&now); + if ((tp = gmtime(&now)) == NULL) { + sudo_warn("%s", U_("unable to get GMT time")); + goto done; + } + + /* Format the timestamp according to the RFC. */ + if (strftime(timebuffer, sizeof(timebuffer), "%Y%m%d%H%M%S.0Z", tp) == 0) { + sudo_warnx("%s", U_("unable to format timestamp")); + goto done; + } + + /* Build filter. */ + len = snprintf(buffer, buffersize, "(&(|(!(sudoNotAfter=*))(sudoNotAfter>=%s))(|(!(sudoNotBefore=*))(sudoNotBefore<=%s)))", + timebuffer, timebuffer); + if (len < 0 || (size_t)len >= buffersize) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + errno = EOVERFLOW; + len = -1; + } + +done: + debug_return_bool(len != -1); +} + +/* + * Builds up a filter to search for default settings + */ +static char * +sudo_ldap_build_default_filter(void) +{ + char *filt; + debug_decl(sudo_ldap_build_default_filter, SUDOERS_DEBUG_LDAP); + + if (!ldap_conf.search_filter) + debug_return_str(strdup("cn=defaults")); + + if (asprintf(&filt, "(&%s(cn=defaults))", ldap_conf.search_filter) == -1) + debug_return_str(NULL); + + debug_return_str(filt); +} + +/* + * Determine length of query value after escaping characters + * as per RFC 4515. + */ +static size_t +sudo_ldap_value_len(const char *value) +{ + const char *s; + size_t len = 0; + + for (s = value; *s != '\0'; s++) { + switch (*s) { + case '\\': + case '(': + case ')': + case '*': + len += 2; + break; + } + } + len += (size_t)(s - value); + return len; +} + +/* + * Like strlcat() but escapes characters as per RFC 4515. + */ +static size_t +sudo_ldap_value_cat(char *dst, const char *src, size_t size) +{ + char *d = dst; + const char *s = src; + size_t n = size; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = size - dlen; + + if (n == 0) + return dlen + strlen(s); + while (*s != '\0') { + switch (*s) { + case '\\': + if (n < 3) + goto done; + *d++ = '\\'; + *d++ = '5'; + *d++ = 'c'; + n -= 3; + break; + case '(': + if (n < 3) + goto done; + *d++ = '\\'; + *d++ = '2'; + *d++ = '8'; + n -= 3; + break; + case ')': + if (n < 3) + goto done; + *d++ = '\\'; + *d++ = '2'; + *d++ = '9'; + n -= 3; + break; + case '*': + if (n < 3) + goto done; + *d++ = '\\'; + *d++ = '2'; + *d++ = 'a'; + n -= 3; + break; + default: + if (n < 1) + goto done; + *d++ = *s; + n--; + break; + } + s++; + } +done: + *d = '\0'; + while (*s != '\0') + s++; + return dlen + (s - src); /* count does not include NUL */ +} + +/* + * Like strdup() but escapes characters as per RFC 4515. + */ +static char * +sudo_ldap_value_dup(const char *src) +{ + char *dst; + size_t size; + + size = sudo_ldap_value_len(src) + 1; + dst = malloc(size); + if (dst == NULL) + return NULL; + + *dst = '\0'; + if (sudo_ldap_value_cat(dst, src, size) >= size) { + /* Should not be possible... */ + free(dst); + dst = NULL; + } + return dst; +} + +/* + * Check the netgroups list beginning at "start" for nesting. + * Parent nodes with a memberNisNetgroup that match one of the + * netgroups are added to the list and checked for further nesting. + * Return true on success or false if there was an internal overflow. + */ +static bool +sudo_netgroup_lookup_nested(LDAP *ld, char *base, struct timeval *timeout, + struct ldap_netgroup_list *netgroups, struct ldap_netgroup *start) +{ + LDAPMessage *entry, *result; + size_t filt_len; + char *filt; + int rc; + debug_decl(sudo_netgroup_lookup_nested, SUDOERS_DEBUG_LDAP); + + DPRINTF1("Checking for nested netgroups from netgroup_base '%s'", base); + do { + struct ldap_netgroup *ng, *old_tail; + + result = NULL; + old_tail = STAILQ_LAST(netgroups, ldap_netgroup, entries); + filt_len = strlen(ldap_conf.netgroup_search_filter) + 7; + for (ng = start; ng != NULL; ng = STAILQ_NEXT(ng, entries)) { + filt_len += sudo_ldap_value_len(ng->name) + 20; + } + if ((filt = malloc(filt_len)) == NULL) + goto oom; + CHECK_STRLCPY(filt, "(&", filt_len); + CHECK_STRLCAT(filt, ldap_conf.netgroup_search_filter, filt_len); + CHECK_STRLCAT(filt, "(|", filt_len); + for (ng = start; ng != NULL; ng = STAILQ_NEXT(ng, entries)) { + CHECK_STRLCAT(filt, "(memberNisNetgroup=", filt_len); + CHECK_LDAP_VCAT(filt, ng->name, filt_len); + CHECK_STRLCAT(filt, ")", filt_len); + } + CHECK_STRLCAT(filt, "))", filt_len); + DPRINTF1("ldap netgroup search filter: '%s'", filt); + rc = ldap_search_ext_s(ld, base, LDAP_SCOPE_SUBTREE, filt, + NULL, 0, NULL, NULL, timeout, 0, &result); + free(filt); + if (rc == LDAP_SUCCESS) { + LDAP_FOREACH(entry, ld, result) { + struct berval **bv; + + bv = sudo_ldap_get_values_len(ld, entry, "cn", &rc); + if (bv == NULL) { + if (rc == LDAP_NO_MEMORY) + goto oom; + } else { + /* Don't add a netgroup twice. */ + STAILQ_FOREACH(ng, netgroups, entries) { + /* Assumes only one cn per entry. */ + if (strcasecmp(ng->name, (*bv)->bv_val) == 0) + break; + } + if (ng == NULL) { + ng = malloc(sizeof(*ng)); + if (ng == NULL || + (ng->name = strdup((*bv)->bv_val)) == NULL) { + free(ng); + ldap_value_free_len(bv); + goto oom; + } +#ifdef __clang_analyzer__ + /* clang analyzer false positive */ + if (__builtin_expect(netgroups->stqh_last == NULL, 0)) + __builtin_trap(); +#endif + STAILQ_INSERT_TAIL(netgroups, ng, entries); + DPRINTF1("Found new netgroup %s for %s", ng->name, base); + } + ldap_value_free_len(bv); + } + } + } + ldap_msgfree(result); + + /* Check for nested netgroups in what we added. */ + start = old_tail ? STAILQ_NEXT(old_tail, entries) : STAILQ_FIRST(netgroups); + } while (start != NULL); + + debug_return_bool(true); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ldap_msgfree(result); + debug_return_bool(false); +overflow: + sudo_warnx(U_("internal error, %s overflow"), __func__); + free(filt); + debug_return_bool(false); +} + +/* + * Look up netgroups that the specified user is a member of. + * Appends new entries to the netgroups list. + * Return true on success or false if there was an internal overflow. + */ +static bool +sudo_netgroup_lookup(LDAP *ld, struct passwd *pw, + struct ldap_netgroup_list *netgroups) +{ + struct ldap_config_str *base; + struct ldap_netgroup *ng, *old_tail; + struct timeval tv, *tvp = NULL; + LDAPMessage *entry, *result = NULL; + const char *domain; + char *escaped_domain = NULL, *escaped_user = NULL; + char *escaped_host = NULL, *escaped_shost = NULL, *filt = NULL; + int filt_len, rc; + bool ret = false; + debug_decl(sudo_netgroup_lookup, SUDOERS_DEBUG_LDAP); + + if (ldap_conf.timeout > 0) { + tv.tv_sec = ldap_conf.timeout; + tv.tv_usec = 0; + tvp = &tv; + } + + /* Use NIS domain if set, else wildcard match. */ + domain = sudo_getdomainname(); + + /* Escape the domain, host names, and user name per RFC 4515. */ + if (domain != NULL) { + if ((escaped_domain = sudo_ldap_value_dup(domain)) == NULL) + goto oom; + } + if ((escaped_user = sudo_ldap_value_dup(pw->pw_name)) == NULL) + goto oom; + if (def_netgroup_tuple) { + escaped_host = sudo_ldap_value_dup(user_runhost); + if (user_runhost == user_srunhost) + escaped_shost = escaped_host; + else + escaped_shost = sudo_ldap_value_dup(user_srunhost); + if (escaped_host == NULL || escaped_shost == NULL) + goto oom; + } + + /* Build query, using NIS domain if it is set. */ + if (domain != NULL) { + if (escaped_host != escaped_shost) { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28,%s,%s\\29)" + "(nisNetgroupTriple=\\28%s,%s,%s\\29)" + "(nisNetgroupTriple=\\28%s,%s,%s\\29)" + "(nisNetgroupTriple=\\28,%s,\\29)" + "(nisNetgroupTriple=\\28%s,%s,\\29)" + "(nisNetgroupTriple=\\28%s,%s,\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, escaped_domain, + escaped_shost, escaped_user, escaped_domain, + escaped_host, escaped_user, escaped_domain, escaped_user, + escaped_shost, escaped_user, escaped_host, escaped_user); + } else if (escaped_shost != NULL) { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28,%s,%s\\29)" + "(nisNetgroupTriple=\\28%s,%s,%s\\29)" + "(nisNetgroupTriple=\\28,%s,\\29)" + "(nisNetgroupTriple=\\28%s,%s,\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, escaped_domain, + escaped_shost, escaped_user, escaped_domain, + escaped_user, escaped_shost, escaped_user); + } else { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28*,%s,%s\\29)" + "(nisNetgroupTriple=\\28*,%s,\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, escaped_domain, + escaped_user); + } + } else { + if (escaped_host != escaped_shost) { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28,%s,*\\29)" + "(nisNetgroupTriple=\\28%s,%s,*\\29)" + "(nisNetgroupTriple=\\28%s,%s,*\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, + escaped_shost, escaped_user, escaped_host, escaped_user); + } else if (escaped_shost != NULL) { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28,%s,*\\29)" + "(nisNetgroupTriple=\\28%s,%s,*\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, + escaped_shost, escaped_user); + } else { + filt_len = asprintf(&filt, + "(&%s(|(nisNetgroupTriple=\\28*,%s,*\\29)))", + ldap_conf.netgroup_search_filter, escaped_user); + } + } + if (filt_len == -1) + goto oom; + DPRINTF1("ldap netgroup search filter: '%s'", filt); + + STAILQ_FOREACH(base, &ldap_conf.netgroup_base, entries) { + DPRINTF1("searching from netgroup_base '%s'", base->val); + rc = ldap_search_ext_s(ld, base->val, LDAP_SCOPE_SUBTREE, filt, + NULL, 0, NULL, NULL, tvp, 0, &result); + if (rc != LDAP_SUCCESS) { + DPRINTF1("ldap netgroup search failed: %s", ldap_err2string(rc)); + ldap_msgfree(result); + result = NULL; + continue; + } + + old_tail = STAILQ_LAST(netgroups, ldap_netgroup, entries); + LDAP_FOREACH(entry, ld, result) { + struct berval **bv; + + bv = sudo_ldap_get_values_len(ld, entry, "cn", &rc); + if (bv == NULL) { + if (rc == LDAP_NO_MEMORY) + goto oom; + } else { + /* Don't add a netgroup twice. */ + STAILQ_FOREACH(ng, netgroups, entries) { + /* Assumes only one cn per entry. */ + if (strcasecmp(ng->name, (*bv)->bv_val) == 0) + break; + } + if (ng == NULL) { + ng = malloc(sizeof(*ng)); + if (ng == NULL || + (ng->name = strdup((*bv)->bv_val)) == NULL) { + free(ng); + ldap_value_free_len(bv); + goto oom; + } + STAILQ_INSERT_TAIL(netgroups, ng, entries); + DPRINTF1("Found new netgroup %s for %s", ng->name, + base->val); + } + ldap_value_free_len(bv); + } + } + ldap_msgfree(result); + result = NULL; + + /* Check for nested netgroups in what we added. */ + ng = old_tail ? STAILQ_NEXT(old_tail, entries) : STAILQ_FIRST(netgroups); + if (ng != NULL) { + if (!sudo_netgroup_lookup_nested(ld, base->val, tvp, netgroups, ng)) + goto done; + } + } + ret = true; + goto done; + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +done: + free(escaped_domain); + free(escaped_user); + free(escaped_host); + if (escaped_host != escaped_shost) + free(escaped_shost); + free(filt); + ldap_msgfree(result); + debug_return_bool(ret); +} + +/* + * Builds up a filter to check against LDAP. + */ +static char * +sudo_ldap_build_pass1(LDAP *ld, struct passwd *pw) +{ + char *buf, timebuffer[TIMEFILTER_LENGTH + 1], idbuf[MAX_UID_T_LEN + 1]; + struct ldap_netgroup_list netgroups; + struct ldap_netgroup *ng = NULL; + struct gid_list *gidlist; + struct group_list *grlist; + struct group *grp; + size_t sz = 0; + int i; + debug_decl(sudo_ldap_build_pass1, SUDOERS_DEBUG_LDAP); + + STAILQ_INIT(&netgroups); + + /* If there is a filter, allocate space for the global AND. */ + if (ldap_conf.timed || ldap_conf.search_filter) + sz += 3; + + /* Add LDAP search filter if present. */ + if (ldap_conf.search_filter) + sz += strlen(ldap_conf.search_filter); + + /* Then add (|(sudoUser=USERNAME)(sudoUser=#uid)(sudoUser=ALL)) + NUL */ + sz += 29 + (12 + MAX_UID_T_LEN) + sudo_ldap_value_len(pw->pw_name); + + /* Add space for primary and supplementary groups and gids */ + if ((grp = sudo_getgrgid(pw->pw_gid)) != NULL) { + sz += 12 + sudo_ldap_value_len(grp->gr_name); + } + sz += 13 + MAX_UID_T_LEN; + if ((grlist = sudo_get_grlist(pw)) != NULL) { + for (i = 0; i < grlist->ngroups; i++) { + if (grp != NULL && strcasecmp(grlist->groups[i], grp->gr_name) == 0) + continue; + sz += 12 + sudo_ldap_value_len(grlist->groups[i]); + } + } + if ((gidlist = sudo_get_gidlist(pw, ENTRY_TYPE_ANY)) != NULL) { + for (i = 0; i < gidlist->ngids; i++) { + if (pw->pw_gid == gidlist->gids[i]) + continue; + sz += 13 + MAX_UID_T_LEN; + } + } + + /* Add space for user netgroups if netgroup_base specified. */ + if (!STAILQ_EMPTY(&ldap_conf.netgroup_base)) { + DPRINTF1("Looking up netgroups for %s", pw->pw_name); + if (sudo_netgroup_lookup(ld, pw, &netgroups)) { + STAILQ_FOREACH(ng, &netgroups, entries) { + sz += 14 + strlen(ng->name); + } + } else { + /* sudo_netgroup_lookup() failed, clean up. */ + while ((ng = STAILQ_FIRST(&netgroups)) != NULL) { + STAILQ_REMOVE_HEAD(&netgroups, entries); + free(ng->name); + free(ng); + } + } + } + + /* If timed, add space for time limits. */ + if (ldap_conf.timed) + sz += TIMEFILTER_LENGTH; + if ((buf = malloc(sz)) == NULL) + goto bad; + *buf = '\0'; + + /* + * If timed or using a search filter, start a global AND clause to + * contain the search filter, search criteria, and time restriction. + */ + if (ldap_conf.timed || ldap_conf.search_filter) + CHECK_STRLCPY(buf, "(&", sz); + + if (ldap_conf.search_filter) + CHECK_STRLCAT(buf, ldap_conf.search_filter, sz); + + /* Global OR + sudoUser=user_name filter */ + CHECK_STRLCAT(buf, "(|(sudoUser=", sz); + CHECK_LDAP_VCAT(buf, pw->pw_name, sz); + CHECK_STRLCAT(buf, ")", sz); + + /* Append user-ID */ + (void) snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int)pw->pw_uid); + CHECK_STRLCAT(buf, "(sudoUser=#", sz); + CHECK_STRLCAT(buf, idbuf, sz); + CHECK_STRLCAT(buf, ")", sz); + + /* Append primary group and group-ID */ + if (grp != NULL) { + CHECK_STRLCAT(buf, "(sudoUser=%", sz); + CHECK_LDAP_VCAT(buf, grp->gr_name, sz); + CHECK_STRLCAT(buf, ")", sz); + } + (void) snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int)pw->pw_gid); + CHECK_STRLCAT(buf, "(sudoUser=%#", sz); + CHECK_STRLCAT(buf, idbuf, sz); + CHECK_STRLCAT(buf, ")", sz); + + /* Append supplementary groups and group-IDs */ + if (grlist != NULL) { + for (i = 0; i < grlist->ngroups; i++) { + if (grp != NULL && strcasecmp(grlist->groups[i], grp->gr_name) == 0) + continue; + CHECK_STRLCAT(buf, "(sudoUser=%", sz); + CHECK_LDAP_VCAT(buf, grlist->groups[i], sz); + CHECK_STRLCAT(buf, ")", sz); + } + } + if (gidlist != NULL) { + for (i = 0; i < gidlist->ngids; i++) { + if (pw->pw_gid == gidlist->gids[i]) + continue; + (void) snprintf(idbuf, sizeof(idbuf), "%u", + (unsigned int)gidlist->gids[i]); + CHECK_STRLCAT(buf, "(sudoUser=%#", sz); + CHECK_STRLCAT(buf, idbuf, sz); + CHECK_STRLCAT(buf, ")", sz); + } + } + + /* Done with groups. */ + if (gidlist != NULL) + sudo_gidlist_delref(gidlist); + if (grlist != NULL) + sudo_grlist_delref(grlist); + if (grp != NULL) + sudo_gr_delref(grp); + + /* Add netgroups (if any), freeing the list as we go. */ + while ((ng = STAILQ_FIRST(&netgroups)) != NULL) { + STAILQ_REMOVE_HEAD(&netgroups, entries); + CHECK_STRLCAT(buf, "(sudoUser=+", sz); + CHECK_LDAP_VCAT(buf, ng->name, sz); + CHECK_STRLCAT(buf, ")", sz); + free(ng->name); + free(ng); + } + + /* Add ALL to list and end the global OR. */ + CHECK_STRLCAT(buf, "(sudoUser=ALL)", sz); + + /* Add the time restriction, or simply end the global OR. */ + if (ldap_conf.timed) { + CHECK_STRLCAT(buf, ")", sz); /* closes the global OR */ + if (!sudo_ldap_timefilter(timebuffer, sizeof(timebuffer))) + goto bad; + CHECK_STRLCAT(buf, timebuffer, sz); + } else if (ldap_conf.search_filter) { + CHECK_STRLCAT(buf, ")", sz); /* closes the global OR */ + } + CHECK_STRLCAT(buf, ")", sz); /* closes the global OR or the global AND */ + + debug_return_str(buf); +overflow: + sudo_warnx(U_("internal error, %s overflow"), __func__); + if (ng != NULL) { + /* Overflow while traversing netgroups. */ + free(ng->name); + free(ng); + } + errno = EOVERFLOW; +bad: + while ((ng = STAILQ_FIRST(&netgroups)) != NULL) { + STAILQ_REMOVE_HEAD(&netgroups, entries); + free(ng->name); + free(ng); + } + free(buf); + debug_return_str(NULL); +} + +/* + * Builds up a filter to check against non-Unix group + * entries in LDAP, including netgroups. + */ +static char * +sudo_ldap_build_pass2(void) +{ + char *filt, timebuffer[TIMEFILTER_LENGTH + 1]; + bool query_netgroups = def_use_netgroups; + int len; + debug_decl(sudo_ldap_build_pass2, SUDOERS_DEBUG_LDAP); + + /* No need to query netgroups if using netgroup_base. */ + if (!STAILQ_EMPTY(&ldap_conf.netgroup_base)) + query_netgroups = false; + + /* Short circuit if no netgroups and no non-Unix groups. */ + if (!query_netgroups && !def_group_plugin) { + errno = ENOENT; + debug_return_str(NULL); + } + + if (ldap_conf.timed) { + if (!sudo_ldap_timefilter(timebuffer, sizeof(timebuffer))) + debug_return_str(NULL); + } + + /* + * Match all sudoUsers beginning with '+' or '%:'. + * If a search filter or time restriction is specified, + * those get ANDed in to the expression. + */ + if (query_netgroups && def_group_plugin) { + len = asprintf(&filt, "%s%s(|(sudoUser=+*)(sudoUser=%%:*))%s%s", + (ldap_conf.timed || ldap_conf.search_filter) ? "(&" : "", + ldap_conf.search_filter ? ldap_conf.search_filter : "", + ldap_conf.timed ? timebuffer : "", + (ldap_conf.timed || ldap_conf.search_filter) ? ")" : ""); + } else { + len = asprintf(&filt, "(&%s(sudoUser=*)(sudoUser=%s*)%s)", + ldap_conf.search_filter ? ldap_conf.search_filter : "", + query_netgroups ? "+" : "%:", + ldap_conf.timed ? timebuffer : ""); + } + if (len == -1) + filt = NULL; + + debug_return_str(filt); +} + +static char * +berval_iter(void **vp) +{ + struct berval **bv = *vp; + + *vp = bv + 1; + return *bv ? (*bv)->bv_val : NULL; +} + +/* + * Wrapper for sudo_ldap_role_to_priv() that takes an LDAPMessage. + * Returns a struct privilege on success or NULL on failure. + */ +static struct privilege * +ldap_entry_to_priv(LDAP *ld, LDAPMessage *entry, int *rc_out) +{ + struct berval **cmnds = NULL, **hosts = NULL; + struct berval **runasusers = NULL, **runasgroups = NULL; + struct berval **opts = NULL, **notbefore = NULL, **notafter = NULL; + struct privilege *priv = NULL; + char *cn = NULL; + int rc; + debug_decl(ldap_entry_to_priv, SUDOERS_DEBUG_LDAP); + + /* Ignore sudoRole without sudoCommand or sudoHost. */ + cmnds = sudo_ldap_get_values_len(ld, entry, "sudoCommand", &rc); + if (cmnds == NULL) + goto cleanup; + hosts = sudo_ldap_get_values_len(ld, entry, "sudoHost", &rc); + if (hosts == NULL) + goto cleanup; + + /* Get the entry's dn for long format printing. */ + if ((cn = sudo_ldap_get_first_rdn(ld, entry, &rc)) == NULL) + goto cleanup; + + /* Get sudoRunAsUser / sudoRunAsGroup */ + runasusers = sudo_ldap_get_values_len(ld, entry, "sudoRunAsUser", &rc); + if (runasusers == NULL) { + if (rc != LDAP_NO_MEMORY) + runasusers = sudo_ldap_get_values_len(ld, entry, "sudoRunAs", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + } + runasgroups = sudo_ldap_get_values_len(ld, entry, "sudoRunAsGroup", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + + /* Get sudoNotBefore / sudoNotAfter */ + if (ldap_conf.timed) { + notbefore = sudo_ldap_get_values_len(ld, entry, "sudoNotBefore", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + notafter = sudo_ldap_get_values_len(ld, entry, "sudoNotAfter", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + } + + /* Parse sudoOptions. */ + opts = sudo_ldap_get_values_len(ld, entry, "sudoOption", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + + priv = sudo_ldap_role_to_priv(cn, hosts, runasusers, runasgroups, + cmnds, opts, notbefore ? notbefore[0]->bv_val : NULL, + notafter ? notafter[0]->bv_val : NULL, false, true, berval_iter); + if (priv == NULL) { + rc = LDAP_NO_MEMORY; + goto cleanup; + } + +cleanup: + if (cn != NULL) + ldap_memfree(cn); + if (cmnds != NULL) + ldap_value_free_len(cmnds); + if (hosts != NULL) + ldap_value_free_len(hosts); + if (runasusers != NULL) + ldap_value_free_len(runasusers); + if (runasgroups != NULL) + ldap_value_free_len(runasgroups); + if (opts != NULL) + ldap_value_free_len(opts); + if (notbefore != NULL) + ldap_value_free_len(notbefore); + if (notafter != NULL) + ldap_value_free_len(notafter); + + *rc_out = rc; + debug_return_ptr(priv); +} + +static bool +ldap_to_sudoers(LDAP *ld, struct ldap_result *lres, + struct userspec_list *ldap_userspecs) +{ + struct userspec *us; + struct member *m; + unsigned int i; + int rc; + debug_decl(ldap_to_sudoers, SUDOERS_DEBUG_LDAP); + + /* We only have a single userspec */ + if ((us = calloc(1, sizeof(*us))) == NULL) + goto oom; + us->file = rcstr_dup("LDAP"); + TAILQ_INIT(&us->users); + TAILQ_INIT(&us->privileges); + STAILQ_INIT(&us->comments); + TAILQ_INSERT_TAIL(ldap_userspecs, us, entries); + + /* The user has already matched, use ALL as wildcard. */ + if ((m = new_member_all(NULL)) == NULL) + goto oom; + TAILQ_INSERT_TAIL(&us->users, m, entries); + + /* Treat each entry as a separate privilege. */ + for (i = 0; i < lres->nentries; i++) { + struct privilege *priv; + + priv = ldap_entry_to_priv(ld, lres->entries[i].entry, &rc); + if (priv == NULL) { + if (rc == LDAP_NO_MEMORY) + goto oom; + continue; + } + TAILQ_INSERT_TAIL(&us->privileges, priv, entries); + } + + debug_return_bool(true); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free_userspecs(ldap_userspecs); + debug_return_bool(false); +} + +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S +typedef unsigned int (*sudo_gss_krb5_ccache_name_t)(unsigned int *minor_status, const char *name, const char **old_name); +static sudo_gss_krb5_ccache_name_t sudo_gss_krb5_ccache_name; + +static int +sudo_set_krb5_ccache_name(const char *name, const char **old_name) +{ + int ret = 0; + unsigned int junk; + static bool initialized; + debug_decl(sudo_set_krb5_ccache_name, SUDOERS_DEBUG_LDAP); + + if (!initialized) { + sudo_gss_krb5_ccache_name = (sudo_gss_krb5_ccache_name_t) + sudo_dso_findsym(SUDO_DSO_DEFAULT, "gss_krb5_ccache_name"); + initialized = true; + } + + /* + * Try to use gss_krb5_ccache_name() if possible. + * We also need to set KRB5CCNAME since some LDAP libs may not use + * gss_krb5_ccache_name(). + */ + if (sudo_gss_krb5_ccache_name != NULL) { + ret = sudo_gss_krb5_ccache_name(&junk, name, old_name); + } else { + /* No gss_krb5_ccache_name(), fall back on KRB5CCNAME. */ + if (old_name != NULL) + *old_name = sudo_getenv("KRB5CCNAME"); + } + if (name != NULL && *name != '\0') { + if (sudo_setenv("KRB5CCNAME", name, true) == -1) + ret = -1; + } else { + if (sudo_unsetenv("KRB5CCNAME") == -1) + ret = -1; + } + + debug_return_int(ret); +} + +/* + * Make a copy of the credential cache file specified by KRB5CCNAME + * which must be readable by the user. The resulting cache file + * is root-owned and will be removed after authenticating via SASL. + */ +static char * +sudo_krb5_copy_cc_file(const char *old_ccname) +{ + int nfd, ofd = -1; + ssize_t nread, nwritten = -1; + static char new_ccname[sizeof(_PATH_TMP) + sizeof("sudocc_XXXXXXXX") - 1]; + char buf[10240], *ret = NULL; + debug_decl(sudo_krb5_copy_cc_file, SUDOERS_DEBUG_LDAP); + + old_ccname = sudo_krb5_ccname_path(old_ccname); + if (old_ccname != NULL) { + /* Open credential cache as user to prevent stolen creds. */ + if (!set_perms(PERM_USER)) + goto done; + ofd = open(old_ccname, O_RDONLY|O_NONBLOCK); + if (!restore_perms()) + goto done; + + if (ofd != -1) { + (void) fcntl(ofd, F_SETFL, 0); + if (sudo_lock_file(ofd, SUDO_LOCK)) { + (void)snprintf(new_ccname, sizeof(new_ccname), "%s%s", + _PATH_TMP, "sudocc_XXXXXXXX"); + nfd = mkstemp(new_ccname); + if (nfd != -1) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "copy ccache %s -> %s", old_ccname, new_ccname); + while ((nread = read(ofd, buf, sizeof(buf))) > 0) { + ssize_t off = 0; + do { + nwritten = write(nfd, buf + off, nread - off); + if (nwritten == -1) { + sudo_warn("error writing to %s", new_ccname); + goto write_error; + } + off += nwritten; + } while (off < nread); + } + if (nread == -1) + sudo_warn("unable to read %s", new_ccname); +write_error: + close(nfd); + if (nread != -1 && nwritten != -1) { + ret = new_ccname; /* success! */ + } else { + unlink(new_ccname); /* failed */ + } + } else { + sudo_warn("unable to create temp file %s", new_ccname); + } + } + } else { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to open %s", old_ccname); + } + } +done: + if (ofd != -1) + close(ofd); + debug_return_str(ret); +} + +static int +sudo_ldap_sasl_interact(LDAP *ld, unsigned int flags, void *_auth_id, + void *_interact) +{ + char *auth_id = (char *)_auth_id; + sasl_interact_t *interact = (sasl_interact_t *)_interact; + int ret = LDAP_SUCCESS; + debug_decl(sudo_ldap_sasl_interact, SUDOERS_DEBUG_LDAP); + + for (; interact->id != SASL_CB_LIST_END; interact++) { + if (interact->id != SASL_CB_USER) { + sudo_warnx("sudo_ldap_sasl_interact: unexpected interact id %lu", + interact->id); + ret = LDAP_PARAM_ERROR; + break; + } + + if (auth_id != NULL) + interact->result = auth_id; + else if (interact->defresult != NULL) + interact->result = interact->defresult; + else + interact->result = ""; + + interact->len = strlen(interact->result); +#if SASL_VERSION_MAJOR < 2 + interact->result = strdup(interact->result); + if (interact->result == NULL) { + ret = LDAP_NO_MEMORY; + break; + } +#endif /* SASL_VERSION_MAJOR < 2 */ + DPRINTF2("sudo_ldap_sasl_interact: SASL_CB_USER %s", + (const char *)interact->result); + } + debug_return_int(ret); +} +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ + +/* + * Create a new sudo_ldap_result structure. + */ +static struct ldap_result * +sudo_ldap_result_alloc(void) +{ + struct ldap_result *result; + debug_decl(sudo_ldap_result_alloc, SUDOERS_DEBUG_LDAP); + + result = calloc(1, sizeof(*result)); + if (result != NULL) + STAILQ_INIT(&result->searches); + + debug_return_ptr(result); +} + +/* + * Free the ldap result structure + */ +static void +sudo_ldap_result_free(struct ldap_result *lres) +{ + struct ldap_search_result *s; + debug_decl(sudo_ldap_result_free, SUDOERS_DEBUG_LDAP); + + if (lres != NULL) { + if (lres->nentries) { + free(lres->entries); + lres->entries = NULL; + } + while ((s = STAILQ_FIRST(&lres->searches)) != NULL) { + STAILQ_REMOVE_HEAD(&lres->searches, entries); + ldap_msgfree(s->searchresult); + free(s); + } + free(lres); + } + debug_return; +} + +/* + * Add a search result to the ldap_result structure. + */ +static struct ldap_search_result * +sudo_ldap_result_add_search(struct ldap_result *lres, LDAP *ldap, + LDAPMessage *searchresult) +{ + struct ldap_search_result *news; + debug_decl(sudo_ldap_result_add_search, SUDOERS_DEBUG_LDAP); + + /* Create new entry and add it to the end of the chain. */ + news = calloc(1, sizeof(*news)); + if (news != NULL) { + news->ldap = ldap; + news->searchresult = searchresult; + STAILQ_INSERT_TAIL(&lres->searches, news, entries); + } + + debug_return_ptr(news); +} + +/* + * Connect to the LDAP server specified by ld. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +static int +sudo_ldap_bind_s(LDAP *ld) +{ + int ret; + debug_decl(sudo_ldap_bind_s, SUDOERS_DEBUG_LDAP); + +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S + if (ldap_conf.rootuse_sasl == true || + (ldap_conf.rootuse_sasl != false && ldap_conf.use_sasl == true)) { + const char *old_ccname = NULL; + const char *new_ccname = ldap_conf.krb5_ccname; + const char *tmp_ccname = NULL; + void *auth_id = ldap_conf.rootsasl_auth_id ? + ldap_conf.rootsasl_auth_id : ldap_conf.sasl_auth_id; + int rc; + + /* Make temp copy of the user's credential cache as needed. */ + if (ldap_conf.krb5_ccname == NULL && user_ccname != NULL) { + new_ccname = tmp_ccname = sudo_krb5_copy_cc_file(user_ccname); + if (tmp_ccname == NULL) { + /* XXX - fatal error */ + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "unable to copy user ccache %s", user_ccname); + } + } + + if (new_ccname != NULL) { + rc = sudo_set_krb5_ccache_name(new_ccname, &old_ccname); + if (rc == 0) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "set ccache name %s -> %s", + old_ccname ? old_ccname : "(none)", new_ccname); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "sudo_set_krb5_ccache_name() failed: %d", rc); + } + } + ret = ldap_sasl_interactive_bind_s(ld, ldap_conf.binddn, + ldap_conf.sasl_mech, NULL, NULL, LDAP_SASL_QUIET, + sudo_ldap_sasl_interact, auth_id); + if (new_ccname != NULL) { + rc = sudo_set_krb5_ccache_name(old_ccname ? old_ccname : "", NULL); + if (rc == 0) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "restore ccache name %s -> %s", new_ccname, + old_ccname ? old_ccname : "(none)"); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "sudo_set_krb5_ccache_name() failed: %d", rc); + } + /* Remove temporary copy of user's credential cache. */ + if (tmp_ccname != NULL) + unlink(tmp_ccname); + } + if (ret != LDAP_SUCCESS) { + sudo_warnx("ldap_sasl_interactive_bind_s(): %s", + ldap_err2string(ret)); + goto done; + } + DPRINTF1("ldap_sasl_interactive_bind_s() ok"); + } else +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ +#ifdef HAVE_LDAP_SASL_BIND_S + { + struct berval bv; + + bv.bv_val = ldap_conf.bindpw ? ldap_conf.bindpw : ""; + bv.bv_len = strlen(bv.bv_val); + + ret = ldap_sasl_bind_s(ld, ldap_conf.binddn, LDAP_SASL_SIMPLE, &bv, + NULL, NULL, NULL); + if (ret != LDAP_SUCCESS) { + sudo_warnx("ldap_sasl_bind_s(): %s", ldap_err2string(ret)); + goto done; + } + DPRINTF1("ldap_sasl_bind_s() ok"); + } +#else + { + ret = ldap_simple_bind_s(ld, ldap_conf.binddn, ldap_conf.bindpw); + if (ret != LDAP_SUCCESS) { + sudo_warnx("ldap_simple_bind_s(): %s", ldap_err2string(ret)); + goto done; + } + DPRINTF1("ldap_simple_bind_s() ok"); + } +#endif +done: + debug_return_int(ret); +} + +/* + * Shut down the LDAP connection. + */ +static int +sudo_ldap_close(struct sudo_nss *nss) +{ + struct sudo_ldap_handle *handle = nss->handle; + debug_decl(sudo_ldap_close, SUDOERS_DEBUG_LDAP); + + if (handle != NULL) { + /* Unbind and close the LDAP connection. */ + if (handle->ld != NULL) { + ldap_unbind_ext_s(handle->ld, NULL, NULL); + handle->ld = NULL; + } + + /* Free the handle container. */ + if (handle->pw != NULL) + sudo_pw_delref(handle->pw); + free_parse_tree(&handle->parse_tree); + free(handle); + nss->handle = NULL; + } + debug_return_int(0); +} + +/* + * Open a connection to the LDAP server. + * Returns 0 on success and non-zero on failure. + */ +static int +sudo_ldap_open(struct sudo_nss *nss) +{ + LDAP *ld; + int rc = -1; + bool ldapnoinit = false; + struct sudo_ldap_handle *handle; + debug_decl(sudo_ldap_open, SUDOERS_DEBUG_LDAP); + + if (nss->handle != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with non-NULL handle %p", __func__, nss->handle); + sudo_ldap_close(nss); + } + + if (!sudo_ldap_read_config()) + goto done; + + /* Prevent reading of user ldaprc and system defaults. */ + if (sudo_getenv("LDAPNOINIT") == NULL) { + if (sudo_setenv("LDAPNOINIT", "1", true) == 0) + ldapnoinit = true; + } + + /* Set global LDAP options */ + if (sudo_ldap_set_options_global() != LDAP_SUCCESS) + goto done; + + /* Connect to LDAP server */ +#ifdef HAVE_LDAP_INITIALIZE + if (!STAILQ_EMPTY(&ldap_conf.uri)) { + char *buf = sudo_ldap_join_uri(&ldap_conf.uri); + if (buf == NULL) + goto done; + DPRINTF2("ldap_initialize(ld, %s)", buf); + rc = ldap_initialize(&ld, buf); + free(buf); + } else +#endif + rc = sudo_ldap_init(&ld, ldap_conf.host, ldap_conf.port); + if (rc != LDAP_SUCCESS) { + sudo_warnx(U_("unable to initialize LDAP: %s"), ldap_err2string(rc)); + goto done; + } + + /* Set LDAP per-connection options */ + rc = sudo_ldap_set_options_conn(ld); + if (rc != LDAP_SUCCESS) + goto done; + + if (ldapnoinit) + (void) sudo_unsetenv("LDAPNOINIT"); + + if (ldap_conf.ssl_mode == SUDO_LDAP_STARTTLS) { +#if defined(HAVE_LDAP_START_TLS_S) + rc = ldap_start_tls_s(ld, NULL, NULL); + if (rc != LDAP_SUCCESS) { + sudo_warnx("ldap_start_tls_s(): %s", ldap_err2string(rc)); + goto done; + } + DPRINTF1("ldap_start_tls_s() ok"); +#elif defined(HAVE_LDAP_SSL_CLIENT_INIT) && defined(HAVE_LDAP_START_TLS_S_NP) + int sslrc; + rc = ldap_ssl_client_init(ldap_conf.tls_keyfile, ldap_conf.tls_keypw, + 0, &sslrc); + if (rc != LDAP_SUCCESS) { + sudo_warnx("ldap_ssl_client_init(): %s: %s", + ldap_err2string(rc), ssl_err2string(sslrc)); + goto done; + } + rc = ldap_start_tls_s_np(ld, NULL); + if (rc != LDAP_SUCCESS) { + sudo_warnx("ldap_start_tls_s_np(): %s", ldap_err2string(rc)); + goto done; + } + DPRINTF1("ldap_start_tls_s_np() ok"); +#else + sudo_warnx("%s", + U_("start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()")); +#endif /* !HAVE_LDAP_START_TLS_S && !HAVE_LDAP_START_TLS_S_NP */ + } + + /* Actually connect */ + rc = sudo_ldap_bind_s(ld); + if (rc != LDAP_SUCCESS) + goto done; + + /* Create a handle container. */ + handle = calloc(1, sizeof(struct sudo_ldap_handle)); + if (handle == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + rc = -1; + goto done; + } + handle->ld = ld; + /* handle->pw = NULL; */ + init_parse_tree(&handle->parse_tree, NULL, NULL); + nss->handle = handle; + +done: + debug_return_int(rc == LDAP_SUCCESS ? 0 : -1); +} + +static int +sudo_ldap_getdefs(struct sudo_nss *nss) +{ + struct sudo_ldap_handle *handle = nss->handle; + struct timeval tv, *tvp = NULL; + struct ldap_config_str *base; + LDAPMessage *entry, *result = NULL; + char *filt = NULL; + int rc, ret = -1; + static bool cached; + debug_decl(sudo_ldap_getdefs, SUDOERS_DEBUG_LDAP); + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_int(-1); + } + + /* Use cached result if present. */ + if (cached) + debug_return_int(0); + + filt = sudo_ldap_build_default_filter(); + if (filt == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + DPRINTF1("Looking for cn=defaults: %s", filt); + + STAILQ_FOREACH(base, &ldap_conf.base, entries) { + LDAP *ld = handle->ld; + + if (ldap_conf.timeout > 0) { + tv.tv_sec = ldap_conf.timeout; + tv.tv_usec = 0; + tvp = &tv; + } + ldap_msgfree(result); + result = NULL; + rc = ldap_search_ext_s(ld, base->val, LDAP_SCOPE_SUBTREE, + filt, NULL, 0, NULL, NULL, tvp, 0, &result); + if (rc == LDAP_SUCCESS && (entry = ldap_first_entry(ld, result))) { + DPRINTF1("found:%s", ldap_get_dn(ld, entry)); + if (!sudo_ldap_parse_options(ld, entry, &handle->parse_tree.defaults)) + goto done; + } else { + DPRINTF1("no default options found in %s", base->val); + } + } + cached = true; + ret = 0; + +done: + ldap_msgfree(result); + free(filt); + + debug_return_int(ret); +} + +/* + * Comparison function for ldap_entry_wrapper structures, ascending order. + * This should match role_order_cmp() in parse_ldif.c. + */ +static int +ldap_entry_compare(const void *a, const void *b) +{ + const struct ldap_entry_wrapper *aw = a; + const struct ldap_entry_wrapper *bw = b; + debug_decl(ldap_entry_compare, SUDOERS_DEBUG_LDAP); + + debug_return_int(aw->order < bw->order ? -1 : + (aw->order > bw->order ? 1 : 0)); +} + +/* + * Return the last entry in the list of searches, usually the + * one currently being used to add entries. + */ +static struct ldap_search_result * +sudo_ldap_result_last_search(struct ldap_result *lres) +{ + debug_decl(sudo_ldap_result_last_search, SUDOERS_DEBUG_LDAP); + + debug_return_ptr(STAILQ_LAST(&lres->searches, ldap_search_result, entries)); +} + +/* + * Add an entry to the result structure. + */ +static struct ldap_entry_wrapper * +sudo_ldap_result_add_entry(struct ldap_result *lres, LDAPMessage *entry) +{ + struct ldap_search_result *last; + struct berval **bv; + double order = 0.0; + char *ep; + int rc; + debug_decl(sudo_ldap_result_add_entry, SUDOERS_DEBUG_LDAP); + + /* Determine whether the entry has the sudoOrder attribute. */ + last = sudo_ldap_result_last_search(lres); + if (last != NULL) { + bv = sudo_ldap_get_values_len(last->ldap, entry, "sudoOrder", &rc); + if (rc == LDAP_NO_MEMORY) { + /* XXX - return error */ + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } else { + if (ldap_count_values_len(bv) > 0) { + /* Get the value of this attribute, 0 if not present. */ + DPRINTF2("order attribute raw: %s", (*bv)->bv_val); + order = strtod((*bv)->bv_val, &ep); + if (ep == (*bv)->bv_val || *ep != '\0') { + sudo_warnx(U_("invalid sudoOrder attribute: %s"), + (*bv)->bv_val); + order = 0.0; + } + DPRINTF2("order attribute: %f", order); + } + ldap_value_free_len(bv); + } + } + + /* + * Enlarge the array of entry wrappers as needed, preallocating blocks + * of 100 entries to save on allocation time. + */ + if (++lres->nentries > lres->allocated_entries) { + int allocated_entries = lres->allocated_entries + ALLOCATION_INCREMENT; + struct ldap_entry_wrapper *entries = reallocarray(lres->entries, + allocated_entries, sizeof(lres->entries[0])); + if (entries == NULL) + debug_return_ptr(NULL); + lres->allocated_entries = allocated_entries; + lres->entries = entries; + } + + /* Fill in the new entry and return it. */ + lres->entries[lres->nentries - 1].entry = entry; + lres->entries[lres->nentries - 1].order = order; + + debug_return_ptr(&lres->entries[lres->nentries - 1]); +} + +/* + * Perform the LDAP query for the user. The caller is responsible for + * freeing the result with sudo_ldap_result_free(). + */ +static struct ldap_result * +sudo_ldap_result_get(struct sudo_nss *nss, struct passwd *pw) +{ + struct sudo_ldap_handle *handle = nss->handle; + struct ldap_config_str *base; + struct ldap_result *lres; + struct timeval tv, *tvp = NULL; + LDAPMessage *entry, *result; + LDAP *ld = handle->ld; + char *filt = NULL; + int pass, rc; + debug_decl(sudo_ldap_result_get, SUDOERS_DEBUG_LDAP); + + /* + * Okay - time to search for anything that matches this user + * Lets limit it to only two queries of the LDAP server + * + * The first pass will look by the username, groups, and + * the keyword ALL. We will then inspect the results that + * came back from the query. We don't need to inspect the + * sudoUser in this pass since the LDAP server already scanned + * it for us. + * + * The second pass will return all the entries that contain non- + * Unix groups, including netgroups. Then we take the non-Unix + * groups returned and try to match them against the username. + * + * Since we have to sort the possible entries before we make a + * decision, we perform the queries and store all of the results in + * an ldap_result object. The results are then sorted by sudoOrder. + */ + lres = sudo_ldap_result_alloc(); + if (lres == NULL) + goto oom; + for (pass = 0; pass < 2; pass++) { + filt = pass ? sudo_ldap_build_pass2() : sudo_ldap_build_pass1(ld, pw); + if (filt != NULL) { + DPRINTF1("ldap search '%s'", filt); + STAILQ_FOREACH(base, &ldap_conf.base, entries) { + DPRINTF1("searching from base '%s'", + base->val); + if (ldap_conf.timeout > 0) { + tv.tv_sec = ldap_conf.timeout; + tv.tv_usec = 0; + tvp = &tv; + } + result = NULL; + rc = ldap_search_ext_s(ld, base->val, LDAP_SCOPE_SUBTREE, filt, + NULL, 0, NULL, NULL, tvp, 0, &result); + if (rc != LDAP_SUCCESS) { + DPRINTF1("ldap search pass %d failed: %s", pass + 1, + ldap_err2string(rc)); + continue; + } + + /* Add the search result to list of search results. */ + DPRINTF1("adding search result"); + if (sudo_ldap_result_add_search(lres, ld, result) == NULL) + goto oom; + LDAP_FOREACH(entry, ld, result) { + if (pass != 0) { + /* Check non-unix group in 2nd pass. */ + switch (sudo_ldap_check_non_unix_group(ld, entry, pw)) { + case -1: + goto oom; + case false: + continue; + default: + break; + } + } + if (sudo_ldap_result_add_entry(lres, entry) == NULL) + goto oom; + } + DPRINTF1("result now has %d entries", lres->nentries); + } + free(filt); + filt = NULL; + } else if (errno != ENOENT) { + /* Out of memory? */ + goto oom; + } + } + + /* Sort the entries by the sudoOrder attribute. */ + if (lres->nentries != 0) { + DPRINTF1("sorting remaining %d entries", lres->nentries); + qsort(lres->entries, lres->nentries, sizeof(lres->entries[0]), + ldap_entry_compare); + } + + debug_return_ptr(lres); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(filt); + sudo_ldap_result_free(lres); + debug_return_ptr(NULL); +} + +/* + * Perform LDAP query for user and host and convert to sudoers + * parse tree. + */ +static int +sudo_ldap_query(struct sudo_nss *nss, struct passwd *pw) +{ + struct sudo_ldap_handle *handle = nss->handle; + struct ldap_result *lres = NULL; + int ret = -1; + debug_decl(sudo_ldap_query, SUDOERS_DEBUG_LDAP); + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_int(-1); + } + + /* Use cached result if it matches pw. */ + if (handle->pw != NULL) { + if (pw == handle->pw) { + ret = 0; + goto done; + } + sudo_pw_delref(handle->pw); + handle->pw = NULL; + } + + /* Free old userspecs, if any. */ + free_userspecs(&handle->parse_tree.userspecs); + + DPRINTF1("%s: ldap search user %s, host %s", __func__, pw->pw_name, + user_runhost); + if ((lres = sudo_ldap_result_get(nss, pw)) == NULL) + goto done; + + /* Convert to sudoers parse tree. */ + if (!ldap_to_sudoers(handle->ld, lres, &handle->parse_tree.userspecs)) + goto done; + + /* Stash a ref to the passwd struct in the handle. */ + sudo_pw_addref(pw); + handle->pw = pw; + + ret = 0; + +done: + /* Cleanup. */ + sudo_ldap_result_free(lres); + if (ret == -1) + free_userspecs(&handle->parse_tree.userspecs); + debug_return_int(ret); +} + +/* + * Return the initialized (but empty) sudoers parse tree. + * The contents will be populated by the getdefs() and query() functions. + */ +static struct sudoers_parse_tree * +sudo_ldap_parse(struct sudo_nss *nss) +{ + struct sudo_ldap_handle *handle = nss->handle; + debug_decl(sudo_ldap_parse, SUDOERS_DEBUG_LDAP); + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_ptr(NULL); + } + + debug_return_ptr(&handle->parse_tree); +} + +#if 0 +/* + * Create an ldap_result from an LDAP search result. + * + * This function is currently not used anywhere, it is left here as + * an example of how to use the cached searches. + */ +static struct ldap_result * +sudo_ldap_result_from_search(LDAP *ldap, LDAPMessage *searchresult) +{ + struct ldap_search_result *last; + struct ldap_result *result; + LDAPMessage *entry; + + /* + * An ldap_result is built from several search results, which are + * organized in a list. The head of the list is maintained in the + * ldap_result structure, together with the wrappers that point + * to individual entries, this has to be initialized first. + */ + result = sudo_ldap_result_alloc(); + if (result == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + + /* + * Build a new list node for the search result, this creates the + * list node. + */ + last = sudo_ldap_result_add_search(result, ldap, searchresult); + + /* + * Now add each entry in the search result to the array of of entries + * in the ldap_result object. + */ + LDAP_FOREACH(entry, last->ldap, last->searchresult) { + if (sudo_ldap_result_add_entry(result, entry) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_ldap_result_free(result); + result = NULL; + break; + } + } + DPRINTF1("sudo_ldap_result_from_search: %d entries found", + result ? result->nentries : -1); + return result; +} +#endif + +/* sudo_nss implementation */ +struct sudo_nss sudo_nss_ldap = { + { NULL, NULL }, + sudo_ldap_open, + sudo_ldap_close, + sudo_ldap_parse, + sudo_ldap_query, + sudo_ldap_getdefs +}; diff --git a/plugins/sudoers/ldap_conf.c b/plugins/sudoers/ldap_conf.c new file mode 100644 index 0000000..88e2b20 --- /dev/null +++ b/plugins/sudoers/ldap_conf.c @@ -0,0 +1,932 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2003-2020 Todd C. Miller + * + * This code is derived from software contributed by Aaron Spangler. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#ifdef HAVE_LBER_H +# include +#endif +#include +#if defined(HAVE_LDAP_SSL_H) +# include +#elif defined(HAVE_MPS_LDAP_SSL_H) +# include +#endif + +#include "sudoers.h" +#include "sudo_lbuf.h" +#include "sudo_ldap.h" +#include "sudo_ldap_conf.h" + +/* Older Netscape LDAP SDKs don't prototype ldapssl_set_strength() */ +#if defined(HAVE_LDAPSSL_SET_STRENGTH) && !defined(HAVE_LDAP_SSL_H) && !defined(HAVE_MPS_LDAP_SSL_H) +extern int ldapssl_set_strength(LDAP *ldap, int strength); +#endif + +#if !defined(LDAP_OPT_NETWORK_TIMEOUT) && defined(LDAP_OPT_CONNECT_TIMEOUT) +# define LDAP_OPT_NETWORK_TIMEOUT LDAP_OPT_CONNECT_TIMEOUT +#endif + +#ifndef LDAP_OPT_SUCCESS +# define LDAP_OPT_SUCCESS LDAP_SUCCESS +#endif + +#ifndef LDAPS_PORT +# define LDAPS_PORT 636 +#endif + +/* Default search filter. */ +#define DEFAULT_SEARCH_FILTER "(objectClass=sudoRole)" + +/* Default netgroup search filter. */ +#define DEFAULT_NETGROUP_SEARCH_FILTER "(objectClass=nisNetgroup)" + +/* LDAP configuration structure */ +struct ldap_config ldap_conf; + +static struct ldap_config_table ldap_conf_global[] = { + { "sudoers_debug", CONF_INT, -1, &ldap_conf.debug }, + { "host", CONF_STR, -1, &ldap_conf.host }, + { "port", CONF_INT, -1, &ldap_conf.port }, + { "ssl", CONF_STR, -1, &ldap_conf.ssl }, + { "sslpath", CONF_STR, -1, &ldap_conf.tls_certfile }, + { "uri", CONF_LIST_STR, -1, &ldap_conf.uri }, +#ifdef LDAP_OPT_DEBUG_LEVEL + { "debug", CONF_INT, LDAP_OPT_DEBUG_LEVEL, &ldap_conf.ldap_debug }, +#endif +#ifdef LDAP_OPT_X_TLS_REQUIRE_CERT + { "tls_checkpeer", CONF_BOOL, LDAP_OPT_X_TLS_REQUIRE_CERT, + &ldap_conf.tls_checkpeer }, + { "tls_reqcert", CONF_REQCERT_VAL, LDAP_OPT_X_TLS_REQUIRE_CERT, + &ldap_conf.tls_reqcert }, +#else + { "tls_checkpeer", CONF_BOOL, -1, &ldap_conf.tls_checkpeer }, +#endif +#ifdef LDAP_OPT_X_TLS_CACERTFILE + { "tls_cacertfile", CONF_STR, LDAP_OPT_X_TLS_CACERTFILE, + &ldap_conf.tls_cacertfile }, + { "tls_cacert", CONF_STR, LDAP_OPT_X_TLS_CACERTFILE, + &ldap_conf.tls_cacertfile }, +#endif +#ifdef LDAP_OPT_X_TLS_CACERTDIR + { "tls_cacertdir", CONF_STR, LDAP_OPT_X_TLS_CACERTDIR, + &ldap_conf.tls_cacertdir }, +#endif +#ifdef LDAP_OPT_X_TLS_RANDOM_FILE + { "tls_randfile", CONF_STR, LDAP_OPT_X_TLS_RANDOM_FILE, + &ldap_conf.tls_random_file }, +#endif +#ifdef LDAP_OPT_X_TLS_CIPHER_SUITE + { "tls_ciphers", CONF_STR, LDAP_OPT_X_TLS_CIPHER_SUITE, + &ldap_conf.tls_cipher_suite }, +#elif defined(LDAP_OPT_SSL_CIPHER) + { "tls_ciphers", CONF_STR, LDAP_OPT_SSL_CIPHER, + &ldap_conf.tls_cipher_suite }, +#endif +#ifdef LDAP_OPT_X_TLS_CERTFILE + { "tls_cert", CONF_STR, LDAP_OPT_X_TLS_CERTFILE, + &ldap_conf.tls_certfile }, +#else + { "tls_cert", CONF_STR, -1, &ldap_conf.tls_certfile }, +#endif +#ifdef LDAP_OPT_X_TLS_KEYFILE + { "tls_key", CONF_STR, LDAP_OPT_X_TLS_KEYFILE, + &ldap_conf.tls_keyfile }, +#else + { "tls_key", CONF_STR, -1, &ldap_conf.tls_keyfile }, +#endif +#ifdef HAVE_LDAP_SSL_CLIENT_INIT + { "tls_keypw", CONF_STR, -1, &ldap_conf.tls_keypw }, +#endif + { "binddn", CONF_STR, -1, &ldap_conf.binddn }, + { "bindpw", CONF_STR, -1, &ldap_conf.bindpw }, + { "rootbinddn", CONF_STR, -1, &ldap_conf.rootbinddn }, + { "sudoers_base", CONF_LIST_STR, -1, &ldap_conf.base }, + { "sudoers_timed", CONF_BOOL, -1, &ldap_conf.timed }, + { "sudoers_search_filter", CONF_STR, -1, &ldap_conf.search_filter }, + { "netgroup_base", CONF_LIST_STR, -1, &ldap_conf.netgroup_base }, + { "netgroup_search_filter", CONF_STR, -1, &ldap_conf.netgroup_search_filter }, +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S + { "use_sasl", CONF_BOOL, -1, &ldap_conf.use_sasl }, + { "sasl_mech", CONF_STR, -1, &ldap_conf.sasl_mech }, + { "sasl_auth_id", CONF_STR, -1, &ldap_conf.sasl_auth_id }, + { "rootuse_sasl", CONF_BOOL, -1, &ldap_conf.rootuse_sasl }, + { "rootsasl_auth_id", CONF_STR, -1, &ldap_conf.rootsasl_auth_id }, + { "krb5_ccname", CONF_STR, -1, &ldap_conf.krb5_ccname }, +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ + { NULL } +}; + +static struct ldap_config_table ldap_conf_conn[] = { +#ifdef LDAP_OPT_PROTOCOL_VERSION + { "ldap_version", CONF_INT, LDAP_OPT_PROTOCOL_VERSION, + &ldap_conf.version }, +#endif +#ifdef LDAP_OPT_NETWORK_TIMEOUT + { "bind_timelimit", CONF_INT, -1 /* needs timeval, set manually */, + &ldap_conf.bind_timelimit }, + { "network_timeout", CONF_INT, -1 /* needs timeval, set manually */, + &ldap_conf.bind_timelimit }, +#elif defined(LDAP_X_OPT_CONNECT_TIMEOUT) + { "bind_timelimit", CONF_INT, LDAP_X_OPT_CONNECT_TIMEOUT, + &ldap_conf.bind_timelimit }, + { "network_timeout", CONF_INT, LDAP_X_OPT_CONNECT_TIMEOUT, + &ldap_conf.bind_timelimit }, +#endif + { "timelimit", CONF_INT, LDAP_OPT_TIMELIMIT, &ldap_conf.timelimit }, +#ifdef LDAP_OPT_TIMEOUT + { "timeout", CONF_INT, -1 /* needs timeval, set manually */, + &ldap_conf.timeout }, +#endif +#ifdef LDAP_OPT_DEREF + { "deref", CONF_DEREF_VAL, LDAP_OPT_DEREF, &ldap_conf.deref }, +#endif +#ifdef LDAP_OPT_X_SASL_SECPROPS + { "sasl_secprops", CONF_STR, LDAP_OPT_X_SASL_SECPROPS, + &ldap_conf.sasl_secprops }, +#endif + { NULL } +}; + +#ifdef HAVE_LDAP_CREATE +/* + * Rebuild the hosts list and include a specific port for each host. + * ldap_create() does not take a default port parameter so we must + * append one if we want something other than LDAP_PORT. + */ +static bool +sudo_ldap_conf_add_ports(void) +{ + char *host, *last, *port, defport[13]; + char hostbuf[LINE_MAX * 2]; + int len; + debug_decl(sudo_ldap_conf_add_ports, SUDOERS_DEBUG_LDAP); + + hostbuf[0] = '\0'; + len = snprintf(defport, sizeof(defport), ":%d", ldap_conf.port); + if (len < 0 || len >= ssizeof(defport)) { + sudo_warnx(U_("%s: port too large"), __func__); + debug_return_bool(false); + } + + for ((host = strtok_r(ldap_conf.host, " \t", &last)); host; (host = strtok_r(NULL, " \t", &last))) { + if (hostbuf[0] != '\0') + CHECK_STRLCAT(hostbuf, " ", sizeof(hostbuf)); + CHECK_STRLCAT(hostbuf, host, sizeof(hostbuf)); + + /* Append port if there is not one already. */ + if ((port = strrchr(host, ':')) == NULL || + !isdigit((unsigned char)port[1])) { + CHECK_STRLCAT(hostbuf, defport, sizeof(hostbuf)); + } + } + + free(ldap_conf.host); + if ((ldap_conf.host = strdup(hostbuf)) == NULL) + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(ldap_conf.host != NULL); + +overflow: + sudo_warnx(U_("internal error, %s overflow"), __func__); + debug_return_bool(false); +} +#endif + +#ifndef HAVE_LDAP_INITIALIZE +/* + * For each uri, convert to host:port pairs. For ldaps:// enable SSL + * Accepts: uris of the form ldap:/// or ldap://hostname:portnum/ + * where the trailing slash is optional. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +static int +sudo_ldap_parse_uri(const struct ldap_config_str_list *uri_list) +{ + const struct ldap_config_str *entry; + char *buf, hostbuf[LINE_MAX]; + int nldap = 0, nldaps = 0; + int ret = -1; + debug_decl(sudo_ldap_parse_uri, SUDOERS_DEBUG_LDAP); + + hostbuf[0] = '\0'; + STAILQ_FOREACH(entry, uri_list, entries) { + char *cp, *host, *last, *port, *uri; + + buf = strdup(entry->val); + if (buf == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + for ((uri = strtok_r(buf, " \t", &last)); uri != NULL; (uri = strtok_r(NULL, " \t", &last))) { + if (strncasecmp(uri, "ldap://", 7) == 0) { + nldap++; + host = uri + 7; + } else if (strncasecmp(uri, "ldaps://", 8) == 0) { + nldaps++; + host = uri + 8; + } else { + sudo_warnx(U_("unsupported LDAP uri type: %s"), uri); + goto done; + } + + /* trim optional trailing slash */ + if ((cp = strrchr(host, '/')) != NULL && cp[1] == '\0') { + *cp = '\0'; + } + + if (hostbuf[0] != '\0') + CHECK_STRLCAT(hostbuf, " ", sizeof(hostbuf)); + + if (*host == '\0') + host = "localhost"; /* no host specified, use localhost */ + + CHECK_STRLCAT(hostbuf, host, sizeof(hostbuf)); + + /* If using SSL and no port specified, add port 636 */ + if (nldaps) { + if ((port = strrchr(host, ':')) == NULL || + !isdigit((unsigned char)port[1])) + CHECK_STRLCAT(hostbuf, ":636", sizeof(hostbuf)); + } + } + + if (nldaps != 0) { + if (nldap != 0) { + sudo_warnx("%s", U_("unable to mix ldap and ldaps URIs")); + goto done; + } + if (ldap_conf.ssl_mode == SUDO_LDAP_STARTTLS) + sudo_warnx("%s", U_("starttls not supported when using ldaps")); + ldap_conf.ssl_mode = SUDO_LDAP_SSL; + } + free(buf); + } + buf = NULL; + + /* Store parsed URI(s) in host for ldap_create() or ldap_init(). */ + free(ldap_conf.host); + if ((ldap_conf.host = strdup(hostbuf)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + + ret = LDAP_SUCCESS; + +done: + free(buf); + debug_return_int(ret); + +overflow: + sudo_warnx(U_("internal error, %s overflow"), __func__); + free(buf); + debug_return_int(-1); +} +#endif /* HAVE_LDAP_INITIALIZE */ + +/* + * Decode a secret if it is base64 encoded, else return NULL. + */ +static char * +sudo_ldap_decode_secret(const char *secret) +{ + unsigned char *result = NULL; + size_t len, reslen; + debug_decl(sudo_ldap_decode_secret, SUDOERS_DEBUG_LDAP); + + if (strncasecmp(secret, "base64:", sizeof("base64:") - 1) == 0) { + /* + * Decode a base64 secret. The decoded length is 3/4 the encoded + * length but padding may be missing so round up to a multiple of 4. + */ + secret += sizeof("base64:") - 1; + reslen = ((strlen(secret) + 3) / 4 * 3); + result = malloc(reslen + 1); + if (result == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } else { + len = base64_decode(secret, result, reslen); + if (len == (size_t)-1) { + free(result); + result = NULL; + } else { + result[len] = '\0'; + } + } + } + debug_return_str((char *)result); +} + +static void +sudo_ldap_read_secret(const char *path) +{ + FILE *fp; + char *line = NULL; + size_t linesize = 0; + ssize_t len; + debug_decl(sudo_ldap_read_secret, SUDOERS_DEBUG_LDAP); + + if ((fp = fopen(path_ldap_secret, "r")) != NULL) { + len = getdelim(&line, &linesize, '\n', fp); + if (len != -1) { + /* trim newline */ + while (len > 0 && line[len - 1] == '\n') + line[--len] = '\0'; + /* copy to bindpw and binddn */ + free(ldap_conf.bindpw); + ldap_conf.bindpw = sudo_ldap_decode_secret(line); + if (ldap_conf.bindpw == NULL) { + /* not base64 encoded, use directly */ + ldap_conf.bindpw = line; + line = NULL; + } + free(ldap_conf.binddn); + ldap_conf.binddn = ldap_conf.rootbinddn; + ldap_conf.rootbinddn = NULL; + } + fclose(fp); + free(line); + } + debug_return; +} + +/* + * Look up keyword in config tables. + * Returns true if found, else false. + */ +static bool +sudo_ldap_parse_keyword(const char *keyword, const char *value, + struct ldap_config_table *table) +{ + struct ldap_config_table *cur; + const char *errstr; + debug_decl(sudo_ldap_parse_keyword, SUDOERS_DEBUG_LDAP); + + /* Look up keyword in config tables */ + for (cur = table; cur->conf_str != NULL; cur++) { + if (strcasecmp(keyword, cur->conf_str) == 0) { + switch (cur->type) { + case CONF_DEREF_VAL: + if (strcasecmp(value, "searching") == 0) + *(int *)(cur->valp) = LDAP_DEREF_SEARCHING; + else if (strcasecmp(value, "finding") == 0) + *(int *)(cur->valp) = LDAP_DEREF_FINDING; + else if (strcasecmp(value, "always") == 0) + *(int *)(cur->valp) = LDAP_DEREF_ALWAYS; + else + *(int *)(cur->valp) = LDAP_DEREF_NEVER; + break; + case CONF_REQCERT_VAL: +#ifdef LDAP_OPT_X_TLS_REQUIRE_CERT + if (strcasecmp(value, "never") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_NEVER; + else if (strcasecmp(value, "allow") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_ALLOW; + else if (strcasecmp(value, "try") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_TRY; + else if (strcasecmp(value, "hard") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_HARD; + else if (strcasecmp(value, "demand") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_DEMAND; +#endif /* LDAP_OPT_X_TLS_REQUIRE_CERT */ + break; + case CONF_BOOL: + *(int *)(cur->valp) = sudo_strtobool(value) == true; + break; + case CONF_INT: + *(int *)(cur->valp) = sudo_strtonum(value, INT_MIN, INT_MAX, + &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s: %s: %s"), + path_ldap_conf, keyword, value, U_(errstr)); + } + break; + case CONF_STR: + { + char *cp = NULL; + + free(*(char **)(cur->valp)); + if (*value && (cp = strdup(value)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + *(char **)(cur->valp) = cp; + break; + } + case CONF_LIST_STR: + { + struct ldap_config_str_list *head; + struct ldap_config_str *str; + size_t len = strlen(value); + + if (len > 0) { + head = (struct ldap_config_str_list *)cur->valp; + if ((str = malloc(sizeof(*str) + len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + memcpy(str->val, value, len + 1); + STAILQ_INSERT_TAIL(head, str, entries); + } + } + break; + } + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S +const char * +sudo_krb5_ccname_path(const char *old_ccname) +{ + const char *ccname = old_ccname; + debug_decl(sudo_krb5_ccname_path, SUDOERS_DEBUG_LDAP); + + /* Strip off leading FILE: or WRFILE: prefix. */ + switch (ccname[0]) { + case 'F': + case 'f': + if (strncasecmp(ccname, "FILE:", 5) == 0) + ccname += 5; + break; + case 'W': + case 'w': + if (strncasecmp(ccname, "WRFILE:", 7) == 0) + ccname += 7; + break; + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "ccache %s -> %s", old_ccname, ccname); + + /* Credential cache must be a fully-qualified path name. */ + debug_return_const_str(*ccname == '/' ? ccname : NULL); +} + +static bool +sudo_check_krb5_ccname(const char *ccname) +{ + int fd = -1; + const char *ccname_path; + debug_decl(sudo_check_krb5_ccname, SUDOERS_DEBUG_LDAP); + + /* Strip off prefix to get path name. */ + ccname_path = sudo_krb5_ccname_path(ccname); + if (ccname_path == NULL) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "unsupported krb5 credential cache path: %s", ccname); + debug_return_bool(false); + } + /* Make sure credential cache is fully-qualified and exists. */ + fd = open(ccname_path, O_RDONLY|O_NONBLOCK, 0); + if (fd == -1) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "unable to open krb5 credential cache: %s", ccname_path); + debug_return_bool(false); + } + close(fd); + sudo_debug_printf(SUDO_DEBUG_INFO, + "using krb5 credential cache: %s", ccname_path); + debug_return_bool(true); +} +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ + +bool +sudo_ldap_read_config(void) +{ + char *cp, *keyword, *value, *line = NULL; + struct ldap_config_str *conf_str; + size_t linesize = 0; + FILE *fp; + debug_decl(sudo_ldap_read_config, SUDOERS_DEBUG_LDAP); + + /* defaults */ + ldap_conf.version = 3; + ldap_conf.port = -1; + ldap_conf.tls_checkpeer = -1; + ldap_conf.tls_reqcert = -1; + ldap_conf.timelimit = -1; + ldap_conf.timeout = -1; + ldap_conf.bind_timelimit = -1; + ldap_conf.use_sasl = -1; + ldap_conf.rootuse_sasl = -1; + ldap_conf.deref = -1; + ldap_conf.search_filter = strdup(DEFAULT_SEARCH_FILTER); + ldap_conf.netgroup_search_filter = strdup(DEFAULT_NETGROUP_SEARCH_FILTER); + STAILQ_INIT(&ldap_conf.uri); + STAILQ_INIT(&ldap_conf.base); + STAILQ_INIT(&ldap_conf.netgroup_base); + + if (ldap_conf.search_filter == NULL || ldap_conf.netgroup_search_filter == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + + if ((fp = fopen(path_ldap_conf, "r")) == NULL) + debug_return_bool(false); + + while (sudo_parseln(&line, &linesize, NULL, fp, PARSELN_COMM_BOL|PARSELN_CONT_IGN) != -1) { + if (*line == '\0') + continue; /* skip empty line */ + + /* split into keyword and value */ + keyword = cp = line; + while (*cp && !isblank((unsigned char) *cp)) + cp++; + if (*cp) + *cp++ = '\0'; /* terminate keyword */ + + /* skip whitespace before value */ + while (isblank((unsigned char) *cp)) + cp++; + value = cp; + + /* Look up keyword in config tables */ + if (!sudo_ldap_parse_keyword(keyword, value, ldap_conf_global)) + sudo_ldap_parse_keyword(keyword, value, ldap_conf_conn); + } + free(line); + fclose(fp); + + if (!ldap_conf.host) { + ldap_conf.host = strdup("localhost"); + if (ldap_conf.host == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + } + + DPRINTF1("LDAP Config Summary"); + DPRINTF1("==================="); + if (!STAILQ_EMPTY(&ldap_conf.uri)) { + STAILQ_FOREACH(conf_str, &ldap_conf.uri, entries) { + DPRINTF1("uri %s", conf_str->val); + } + } else { + DPRINTF1("host %s", + ldap_conf.host ? ldap_conf.host : "(NONE)"); + DPRINTF1("port %d", ldap_conf.port); + } + DPRINTF1("ldap_version %d", ldap_conf.version); + + if (!STAILQ_EMPTY(&ldap_conf.base)) { + STAILQ_FOREACH(conf_str, &ldap_conf.base, entries) { + DPRINTF1("sudoers_base %s", conf_str->val); + } + } else { + DPRINTF1("sudoers_base %s", "(NONE: LDAP disabled)"); + } + if (ldap_conf.search_filter) { + DPRINTF1("search_filter %s", ldap_conf.search_filter); + } + if (!STAILQ_EMPTY(&ldap_conf.netgroup_base)) { + STAILQ_FOREACH(conf_str, &ldap_conf.netgroup_base, entries) { + DPRINTF1("netgroup_base %s", conf_str->val); + } + } else { + DPRINTF1("netgroup_base %s", "(NONE: will use nsswitch)"); + } + if (ldap_conf.netgroup_search_filter) { + DPRINTF1("netgroup_search_filter %s", ldap_conf.netgroup_search_filter); + } + DPRINTF1("binddn %s", + ldap_conf.binddn ? ldap_conf.binddn : "(anonymous)"); + DPRINTF1("bindpw %s", + ldap_conf.bindpw ? ldap_conf.bindpw : "(anonymous)"); + if (ldap_conf.bind_timelimit > 0) { + DPRINTF1("bind_timelimit %d", ldap_conf.bind_timelimit); + } + if (ldap_conf.timelimit > 0) { + DPRINTF1("timelimit %d", ldap_conf.timelimit); + } + if (ldap_conf.deref != -1) { + DPRINTF1("deref %d", ldap_conf.deref); + } + DPRINTF1("ssl %s", ldap_conf.ssl ? ldap_conf.ssl : "(no)"); + if (ldap_conf.tls_checkpeer != -1) { + DPRINTF1("tls_checkpeer %s", + ldap_conf.tls_checkpeer ? "(yes)" : "(no)"); + } +#ifdef LDAP_OPT_X_TLS_REQUIRE_CERT + if (ldap_conf.tls_reqcert != -1) { + DPRINTF1("tls_reqcert %s", + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_NEVER ? "hard" : + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_ALLOW ? "allow" : + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_TRY ? "try" : + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_HARD ? "hard" : + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_DEMAND ? "demand" : + "unknown"); + } +#endif /* LDAP_OPT_X_TLS_REQUIRE_CERT */ + if (ldap_conf.tls_cacertfile != NULL) { + DPRINTF1("tls_cacertfile %s", ldap_conf.tls_cacertfile); + } + if (ldap_conf.tls_cacertdir != NULL) { + DPRINTF1("tls_cacertdir %s", ldap_conf.tls_cacertdir); + } + if (ldap_conf.tls_random_file != NULL) { + DPRINTF1("tls_random_file %s", ldap_conf.tls_random_file); + } + if (ldap_conf.tls_cipher_suite != NULL) { + DPRINTF1("tls_cipher_suite %s", ldap_conf.tls_cipher_suite); + } + if (ldap_conf.tls_certfile != NULL) { + DPRINTF1("tls_certfile %s", ldap_conf.tls_certfile); + } + if (ldap_conf.tls_keyfile != NULL) { + DPRINTF1("tls_keyfile %s", ldap_conf.tls_keyfile); + } +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S + if (ldap_conf.use_sasl != -1) { + if (ldap_conf.sasl_mech == NULL) { + /* Default mechanism is GSSAPI. */ + ldap_conf.sasl_mech = strdup("GSSAPI"); + if (ldap_conf.sasl_mech == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } + DPRINTF1("use_sasl %s", ldap_conf.use_sasl ? "yes" : "no"); + DPRINTF1("sasl_mech %s", ldap_conf.sasl_mech); + DPRINTF1("sasl_auth_id %s", + ldap_conf.sasl_auth_id ? ldap_conf.sasl_auth_id : "(NONE)"); + DPRINTF1("rootuse_sasl %d", + ldap_conf.rootuse_sasl); + DPRINTF1("rootsasl_auth_id %s", + ldap_conf.rootsasl_auth_id ? ldap_conf.rootsasl_auth_id : "(NONE)"); + DPRINTF1("sasl_secprops %s", + ldap_conf.sasl_secprops ? ldap_conf.sasl_secprops : "(NONE)"); + DPRINTF1("krb5_ccname %s", + ldap_conf.krb5_ccname ? ldap_conf.krb5_ccname : "(NONE)"); + } +#endif + DPRINTF1("==================="); + + if (STAILQ_EMPTY(&ldap_conf.base)) + debug_return_bool(false); /* if no base is defined, ignore LDAP */ + + if (ldap_conf.bind_timelimit > 0) + ldap_conf.bind_timelimit *= 1000; /* convert to ms */ + + /* + * Interpret SSL option + */ + if (ldap_conf.ssl != NULL) { + if (strcasecmp(ldap_conf.ssl, "start_tls") == 0) + ldap_conf.ssl_mode = SUDO_LDAP_STARTTLS; + else if (sudo_strtobool(ldap_conf.ssl) == true) + ldap_conf.ssl_mode = SUDO_LDAP_SSL; + } + +#if defined(HAVE_LDAPSSL_SET_STRENGTH) && !defined(LDAP_OPT_X_TLS_REQUIRE_CERT) + if (ldap_conf.tls_checkpeer != -1) { + ldapssl_set_strength(NULL, + ldap_conf.tls_checkpeer ? LDAPSSL_AUTH_CERT : LDAPSSL_AUTH_WEAK); + } +#endif + +#ifndef HAVE_LDAP_INITIALIZE + /* Convert uri list to host list if no ldap_initialize(). */ + if (!STAILQ_EMPTY(&ldap_conf.uri)) { + struct ldap_config_str *uri; + + if (sudo_ldap_parse_uri(&ldap_conf.uri) != LDAP_SUCCESS) + debug_return_bool(false); + while ((uri = STAILQ_FIRST(&ldap_conf.uri)) != NULL) { + STAILQ_REMOVE_HEAD(&ldap_conf.uri, entries); + free(uri); + } + ldap_conf.port = LDAP_PORT; + } +#endif + + if (STAILQ_EMPTY(&ldap_conf.uri)) { + /* Use port 389 for plaintext LDAP and port 636 for SSL LDAP */ + if (ldap_conf.port < 0) + ldap_conf.port = + ldap_conf.ssl_mode == SUDO_LDAP_SSL ? LDAPS_PORT : LDAP_PORT; + +#ifdef HAVE_LDAP_CREATE + /* + * Cannot specify port directly to ldap_create(), each host must + * include :port to override the default. + */ + if (ldap_conf.port != LDAP_PORT) { + if (!sudo_ldap_conf_add_ports()) + debug_return_bool(false); + } +#endif + } + + /* If search filter is not parenthesized, make it so. */ + if (ldap_conf.search_filter && ldap_conf.search_filter[0] != '(') { + size_t len = strlen(ldap_conf.search_filter); + cp = ldap_conf.search_filter; + ldap_conf.search_filter = malloc(len + 3); + if (ldap_conf.search_filter == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + ldap_conf.search_filter[0] = '('; + memcpy(ldap_conf.search_filter + 1, cp, len); + ldap_conf.search_filter[len + 1] = ')'; + ldap_conf.search_filter[len + 2] = '\0'; + free(cp); + } + + + /* If rootbinddn set, read in /etc/ldap.secret if it exists. */ + if (ldap_conf.rootbinddn) { + sudo_ldap_read_secret(path_ldap_secret); + } else if (ldap_conf.bindpw) { + cp = sudo_ldap_decode_secret(ldap_conf.bindpw); + if (cp != NULL) { + free(ldap_conf.bindpw); + ldap_conf.bindpw = cp; + } + } + + if (ldap_conf.tls_keypw) { + cp = sudo_ldap_decode_secret(ldap_conf.tls_keypw); + if (cp != NULL) { + free(ldap_conf.tls_keypw); + ldap_conf.tls_keypw = cp; + } + } + +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S + /* + * Make sure we can open the file specified by krb5_ccname. + */ + if (ldap_conf.krb5_ccname != NULL) { + if (!sudo_check_krb5_ccname(ldap_conf.krb5_ccname)) + ldap_conf.krb5_ccname = NULL; + } +#endif + + debug_return_bool(true); +} + +/* + * Set LDAP options from the specified options table + * Returns LDAP_SUCCESS on success, else non-zero. + */ +static int +sudo_ldap_set_options_table(LDAP *ld, struct ldap_config_table *table) +{ + struct ldap_config_table *cur; + int ival, rc, errors = 0; + char *sval; + debug_decl(sudo_ldap_set_options_table, SUDOERS_DEBUG_LDAP); + + for (cur = table; cur->conf_str != NULL; cur++) { + if (cur->opt_val == -1) + continue; + + switch (cur->type) { + case CONF_BOOL: + case CONF_INT: + ival = *(int *)(cur->valp); + if (ival >= 0) { + DPRINTF1("ldap_set_option: %s -> %d", cur->conf_str, ival); + rc = ldap_set_option(ld, cur->opt_val, &ival); + if (rc != LDAP_OPT_SUCCESS) { + sudo_warnx("ldap_set_option: %s -> %d: %s", + cur->conf_str, ival, ldap_err2string(rc)); + errors++; + } + } + break; + case CONF_STR: + sval = *(char **)(cur->valp); + if (sval != NULL) { + DPRINTF1("ldap_set_option: %s -> %s", cur->conf_str, sval); + rc = ldap_set_option(ld, cur->opt_val, sval); + if (rc != LDAP_OPT_SUCCESS) { + sudo_warnx("ldap_set_option: %s -> %s: %s", + cur->conf_str, sval, ldap_err2string(rc)); + errors++; + } + } + break; + } + } + debug_return_int(errors ? -1 : LDAP_SUCCESS); +} + +/* + * Set LDAP options based on the global config table. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +int +sudo_ldap_set_options_global(void) +{ + int ret; + debug_decl(sudo_ldap_set_options_global, SUDOERS_DEBUG_LDAP); + + /* Set ber options */ +#ifdef LBER_OPT_DEBUG_LEVEL + if (ldap_conf.ldap_debug) + ber_set_option(NULL, LBER_OPT_DEBUG_LEVEL, &ldap_conf.ldap_debug); +#endif + + /* Parse global LDAP options table. */ + ret = sudo_ldap_set_options_table(NULL, ldap_conf_global); + debug_return_int(ret); +} + +/* + * Set LDAP options based on the per-connection config table. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +int +sudo_ldap_set_options_conn(LDAP *ld) +{ + int rc; + debug_decl(sudo_ldap_set_options_conn, SUDOERS_DEBUG_LDAP); + + /* Parse per-connection LDAP options table. */ + rc = sudo_ldap_set_options_table(ld, ldap_conf_conn); + if (rc == -1) + debug_return_int(-1); + +#ifdef LDAP_OPT_TIMEOUT + /* Convert timeout to a timeval */ + if (ldap_conf.timeout > 0) { + struct timeval tv; + tv.tv_sec = ldap_conf.timeout; + tv.tv_usec = 0; + DPRINTF1("ldap_set_option(LDAP_OPT_TIMEOUT, %d)", ldap_conf.timeout); + rc = ldap_set_option(ld, LDAP_OPT_TIMEOUT, &tv); + if (rc != LDAP_OPT_SUCCESS) { + sudo_warnx("ldap_set_option(TIMEOUT, %d): %s", + ldap_conf.timeout, ldap_err2string(rc)); + } + } +#endif +#ifdef LDAP_OPT_NETWORK_TIMEOUT + /* Convert bind_timelimit to a timeval */ + if (ldap_conf.bind_timelimit > 0) { + struct timeval tv; + tv.tv_sec = ldap_conf.bind_timelimit / 1000; + tv.tv_usec = 0; + DPRINTF1("ldap_set_option(LDAP_OPT_NETWORK_TIMEOUT, %d)", + ldap_conf.bind_timelimit / 1000); + rc = ldap_set_option(ld, LDAP_OPT_NETWORK_TIMEOUT, &tv); +# if !defined(LDAP_OPT_CONNECT_TIMEOUT) || LDAP_VENDOR_VERSION != 510 + /* Tivoli Directory Server 6.3 libs always return a (bogus) error. */ + if (rc != LDAP_OPT_SUCCESS) { + sudo_warnx("ldap_set_option(NETWORK_TIMEOUT, %d): %s", + ldap_conf.bind_timelimit / 1000, ldap_err2string(rc)); + } +# endif + } +#endif + +#if defined(LDAP_OPT_X_TLS) && !defined(HAVE_LDAPSSL_INIT) + if (ldap_conf.ssl_mode == SUDO_LDAP_SSL) { + int val = LDAP_OPT_X_TLS_HARD; + DPRINTF1("ldap_set_option(LDAP_OPT_X_TLS, LDAP_OPT_X_TLS_HARD)"); + rc = ldap_set_option(ld, LDAP_OPT_X_TLS, &val); + if (rc != LDAP_SUCCESS) { + sudo_warnx("ldap_set_option(LDAP_OPT_X_TLS, LDAP_OPT_X_TLS_HARD): %s", + ldap_err2string(rc)); + debug_return_int(-1); + } + } +#endif + debug_return_int(LDAP_SUCCESS); +} diff --git a/plugins/sudoers/ldap_util.c b/plugins/sudoers/ldap_util.c new file mode 100644 index 0000000..080c77e --- /dev/null +++ b/plugins/sudoers/ldap_util.c @@ -0,0 +1,610 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013, 2016, 2018-2018 Todd C. Miller + * + * This code is derived from software contributed by Aaron Spangler. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "interfaces.h" +#include "sudo_lbuf.h" +#include "sudo_ldap.h" +#include "sudo_digest.h" +#include + +/* + * Returns true if the string pointed to by valp begins with an + * odd number of '!' characters. Intervening blanks are ignored. + * Stores the address of the string after '!' removal in valp. + */ +bool +sudo_ldap_is_negated(char **valp) +{ + char *val = *valp; + bool ret = false; + debug_decl(sudo_ldap_is_negated, SUDOERS_DEBUG_LDAP); + + while (*val == '!') { + ret = !ret; + do { + val++; + } while (isblank((unsigned char)*val)); + } + *valp = val; + debug_return_bool(ret); +} + +/* + * Parse an option string into a defaults structure. + * The members of def are pointers into optstr (which is modified). + */ +int +sudo_ldap_parse_option(char *optstr, char **varp, char **valp) +{ + char *cp, *val = NULL; + char *var = optstr; + int op; + debug_decl(sudo_ldap_parse_option, SUDOERS_DEBUG_LDAP); + + /* check for equals sign past first char */ + cp = strchr(var, '='); + if (cp > var) { + val = cp + 1; + op = cp[-1]; /* peek for += or -= cases */ + if (op == '+' || op == '-') { + /* case var+=val or var-=val */ + cp--; + } else { + /* case var=val */ + op = true; + } + /* Trim whitespace between var and operator. */ + while (cp > var && isblank((unsigned char)cp[-1])) + cp--; + /* Truncate variable name. */ + *cp = '\0'; + /* Trim leading whitespace from val. */ + while (isblank((unsigned char)*val)) + val++; + /* Strip double quotes if present. */ + if (*val == '"') { + char *ep = val + strlen(val); + if (ep != val && ep[-1] == '"') { + val++; + ep[-1] = '\0'; + } + } + } else { + /* Boolean value, either true or false. */ + op = sudo_ldap_is_negated(&var) ? false : true; + } + *varp = var; + *valp = val; + + debug_return_int(op); +} + +/* + * Convert an array of user/group names to a member list. + * The caller is responsible for freeing the returned struct member_list. + */ +static struct member_list * +array_to_member_list(void *a, sudo_ldap_iter_t iter) +{ + struct member_list negated_members = + TAILQ_HEAD_INITIALIZER(negated_members); + struct member_list *members; + struct member *m; + char *val; + debug_decl(bv_to_member_list, SUDOERS_DEBUG_LDAP); + + if ((members = calloc(1, sizeof(*members))) == NULL) + return NULL; + TAILQ_INIT(members); + + while ((val = iter(&a)) != NULL) { + if ((m = calloc(1, sizeof(*m))) == NULL) + goto bad; + m->negated = sudo_ldap_is_negated(&val); + + switch (val[0]) { + case '\0': + /* Empty RunAsUser means run as the invoking user. */ + m->type = MYSELF; + break; + case '+': + m->type = NETGROUP; + break; + case '%': + m->type = USERGROUP; + break; + case 'A': + if (strcmp(val, "ALL") == 0) { + m->type = ALL; + break; + } + FALLTHROUGH; + default: + m->type = WORD; + break; + } + if (m->type != ALL && m->type != MYSELF) { + if ((m->name = strdup(val)) == NULL) { + free(m); + goto bad; + } + } + if (m->negated) + TAILQ_INSERT_TAIL(&negated_members, m, entries); + else + TAILQ_INSERT_TAIL(members, m, entries); + } + + /* Negated members take precedence so we insert them at the end. */ + TAILQ_CONCAT(members, &negated_members, entries); + debug_return_ptr(members); +bad: + free_members(&negated_members); + free_members(members); + free(members); + debug_return_ptr(NULL); +} + +static bool +is_address(char *host) +{ + union sudo_in_addr_un addr; + bool ret = false; + char *slash; + debug_decl(is_address, SUDOERS_DEBUG_LDAP); + + /* Check for mask, not currently parsed. */ + if ((slash = strchr(host, '/')) != NULL) + *slash = '\0'; + + if (inet_pton(AF_INET, host, &addr.ip4) == 1) + ret = true; +#ifdef HAVE_STRUCT_IN6_ADDR + else if (inet_pton(AF_INET6, host, &addr.ip6) == 1) + ret = true; +#endif + + if (slash != NULL) + *slash = '/'; + + debug_return_bool(ret); +} + +static struct member * +host_to_member(char *host) +{ + struct member *m; + debug_decl(host_to_member, SUDOERS_DEBUG_LDAP); + + if ((m = calloc(1, sizeof(*m))) == NULL) + goto oom; + m->negated = sudo_ldap_is_negated(&host); + switch (*host) { + case '+': + m->type = NETGROUP; + break; + case 'A': + if (strcmp(host, "ALL") == 0) { + m->type = ALL; + break; + } + FALLTHROUGH; + default: + if (is_address(host)) { + m->type = NTWKADDR; + } else { + m->type = WORD; + } + break; + } + if (m->type != ALL) { + if ((m->name = strdup(host)) == NULL) + goto oom; + } + + debug_return_ptr(m); +oom: + free(m); + debug_return_ptr(NULL); +} + +bool +sudo_ldap_add_default(const char *var, const char *val, int op, + char *source, struct defaults_list *defs) +{ + struct defaults *def; + debug_decl(sudo_ldap_add_default, SUDOERS_DEBUG_LDAP); + + if ((def = calloc(1, sizeof(*def))) == NULL) + goto oom; + + def->type = DEFAULTS; + def->op = op; + if ((def->var = strdup(var)) == NULL) { + goto oom; + } + if (val != NULL) { + if ((def->val = strdup(val)) == NULL) + goto oom; + } + def->file = source; + rcstr_addref(source); + TAILQ_INSERT_TAIL(defs, def, entries); + debug_return_bool(true); + +oom: + if (def != NULL) { + free(def->var); + free(def->val); + free(def); + } + debug_return_bool(false); +} + +/* + * If a digest prefix is present, add it to struct command_digest_list + * and update cmnd to point to the command after the digest. + * Returns 1 if a digest was parsed, 0 if not and -1 on error. + */ +static int +sudo_ldap_extract_digest(char **cmnd, struct command_digest_list *digests) +{ + char *ep, *cp = *cmnd; + struct command_digest *digest; + int digest_type = SUDO_DIGEST_INVALID; + debug_decl(sudo_ldap_extract_digest, SUDOERS_DEBUG_LDAP); + + /* + * Check for and extract a digest prefix, e.g. + * sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1 /bin/ls + */ + if (cp[0] == 's' && cp[1] == 'h' && cp[2] == 'a') { + switch (cp[3]) { + case '2': + if (cp[4] == '2' && cp[5] == '4') + digest_type = SUDO_DIGEST_SHA224; + else if (cp[4] == '5' && cp[5] == '6') + digest_type = SUDO_DIGEST_SHA256; + break; + case '3': + if (cp[4] == '8' && cp[5] == '4') + digest_type = SUDO_DIGEST_SHA384; + break; + case '5': + if (cp[4] == '1' && cp[5] == '2') + digest_type = SUDO_DIGEST_SHA512; + break; + } + if (digest_type != SUDO_DIGEST_INVALID) { + cp += 6; + while (isblank((unsigned char)*cp)) + cp++; + if (*cp == ':') { + cp++; + while (isblank((unsigned char)*cp)) + cp++; + ep = cp; + while (*ep != '\0' && !isblank((unsigned char)*ep) && *ep != ',') + ep++; + if (isblank((unsigned char)*ep) || *ep == ',') { + if ((digest = malloc(sizeof(*digest))) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_int(-1); + } + digest->digest_type = digest_type; + digest->digest_str = strndup(cp, (size_t)(ep - cp)); + if (digest->digest_str == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + free(digest); + debug_return_int(-1); + } + while (isblank((unsigned char)*ep)) + ep++; + *cmnd = ep; + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s digest %s for %s", + digest_type_to_name(digest_type), + digest->digest_str, cp); + TAILQ_INSERT_TAIL(digests, digest, entries); + debug_return_int(1); + } + } + } + } + debug_return_int(0); +} + +/* + * If a digest list is present, fill in struct command_digest_list + * and update cmnd to point to the command after the digest. + * Returns false on error, else true. + */ +static bool +sudo_ldap_extract_digests(char **cmnd, struct command_digest_list *digests) +{ + char *cp = *cmnd; + int rc; + debug_decl(sudo_ldap_extract_digests, SUDOERS_DEBUG_LDAP); + + for (;;) { + rc = sudo_ldap_extract_digest(&cp, digests); + if (rc != 1) + break; + + /* Check for additional digestspecs, separated by a comma. */ + if (*cp != ',') + break; + do { + cp++; + } while (isblank((unsigned char)*cp)); + } + *cmnd = cp; + + debug_return_bool(rc != -1); +} + +/* + * Convert an LDAP sudoRole to a sudoers privilege. + * Pass in struct berval ** for LDAP or char *** for SSSD. + */ +struct privilege * +sudo_ldap_role_to_priv(const char *cn, void *hosts, void *runasusers, + void *runasgroups, void *cmnds, void *opts, const char *notbefore, + const char *notafter, bool warnings, bool store_options, + sudo_ldap_iter_t iter) +{ + struct cmndspec_list negated_cmnds = TAILQ_HEAD_INITIALIZER(negated_cmnds); + struct member_list negated_hosts = TAILQ_HEAD_INITIALIZER(negated_hosts); + struct cmndspec *prev_cmndspec = NULL; + struct privilege *priv; + struct member *m; + char *cmnd; + debug_decl(sudo_ldap_role_to_priv, SUDOERS_DEBUG_LDAP); + + if ((priv = calloc(1, sizeof(*priv))) == NULL) + goto oom; + TAILQ_INIT(&priv->hostlist); + TAILQ_INIT(&priv->cmndlist); + TAILQ_INIT(&priv->defaults); + + priv->ldap_role = strdup(cn ? cn : "UNKNOWN"); + if (priv->ldap_role == NULL) + goto oom; + + if (hosts == NULL) { + /* The host has already matched, use ALL as wildcard. */ + if ((m = new_member_all(NULL)) == NULL) + goto oom; + TAILQ_INSERT_TAIL(&priv->hostlist, m, entries); + } else { + char *host; + while ((host = iter(&hosts)) != NULL) { + if ((m = host_to_member(host)) == NULL) + goto oom; + if (m->negated) + TAILQ_INSERT_TAIL(&negated_hosts, m, entries); + else + TAILQ_INSERT_TAIL(&priv->hostlist, m, entries); + } + /* Negated hosts take precedence so we insert them at the end. */ + TAILQ_CONCAT(&priv->hostlist, &negated_hosts, entries); + } + + /* + * Parse sudoCommands and add to cmndlist. + */ + while ((cmnd = iter(&cmnds)) != NULL) { + bool negated = sudo_ldap_is_negated(&cmnd); + struct sudo_command *c = NULL; + struct cmndspec *cmndspec; + + /* Allocate storage upfront. */ + if ((cmndspec = calloc(1, sizeof(*cmndspec))) == NULL) + goto oom; + if ((m = calloc(1, sizeof(*m))) == NULL) { + free(cmndspec); + goto oom; + } + if (strcmp(cmnd, "ALL") != 0) { + if ((c = calloc(1, sizeof(*c))) == NULL) { + free(cmndspec); + free(m); + goto oom; + } + m->name = (char *)c; + TAILQ_INIT(&c->digests); + } + + /* Negated commands have precedence so insert them at the end. */ + if (negated) + TAILQ_INSERT_TAIL(&negated_cmnds, cmndspec, entries); + else + TAILQ_INSERT_TAIL(&priv->cmndlist, cmndspec, entries); + + /* Initialize cmndspec */ + TAGS_INIT(&cmndspec->tags); + cmndspec->notbefore = UNSPEC; + cmndspec->notafter = UNSPEC; + cmndspec->timeout = UNSPEC; + cmndspec->cmnd = m; + + if (prev_cmndspec != NULL) { + /* Inherit values from prior cmndspec (common to the sudoRole). */ + cmndspec->runasuserlist = prev_cmndspec->runasuserlist; + cmndspec->runasgrouplist = prev_cmndspec->runasgrouplist; + cmndspec->notbefore = prev_cmndspec->notbefore; + cmndspec->notafter = prev_cmndspec->notafter; + cmndspec->tags = prev_cmndspec->tags; + if (cmndspec->tags.setenv == IMPLIED) + cmndspec->tags.setenv = UNSPEC; + } else { + /* Parse sudoRunAsUser / sudoRunAs */ + if (runasusers != NULL) { + cmndspec->runasuserlist = + array_to_member_list(runasusers, iter); + if (cmndspec->runasuserlist == NULL) + goto oom; + } + + /* Parse sudoRunAsGroup */ + if (runasgroups != NULL) { + cmndspec->runasgrouplist = + array_to_member_list(runasgroups, iter); + if (cmndspec->runasgrouplist == NULL) + goto oom; + } + + /* Parse sudoNotBefore / sudoNotAfter */ + if (notbefore != NULL) + cmndspec->notbefore = parse_gentime(notbefore); + if (notafter != NULL) + cmndspec->notafter = parse_gentime(notafter); + + /* Parse sudoOptions. */ + if (opts != NULL) { + char *opt, *source = NULL; + + if (store_options) { + /* Use sudoRole in place of file name in defaults. */ + size_t slen = sizeof("sudoRole") + strlen(priv->ldap_role); + if ((source = rcstr_alloc(slen)) == NULL) + goto oom; + (void)snprintf(source, slen, "sudoRole %s", priv->ldap_role); + } + + while ((opt = iter(&opts)) != NULL) { + char *var, *val; + int op; + + op = sudo_ldap_parse_option(opt, &var, &val); + if (strcmp(var, "command_timeout") == 0 && val != NULL) { + cmndspec->timeout = parse_timeout(val); + } else if (strcmp(var, "runchroot") == 0 && val != NULL) { + if ((cmndspec->runchroot = strdup(val)) == NULL) + break; + } else if (strcmp(var, "runcwd") == 0 && val != NULL) { + if ((cmndspec->runcwd = strdup(val)) == NULL) + break; +#ifdef HAVE_SELINUX + } else if (strcmp(var, "role") == 0 && val != NULL) { + if ((cmndspec->role = strdup(val)) == NULL) + break; + } else if (strcmp(var, "type") == 0 && val != NULL) { + if ((cmndspec->type = strdup(val)) == NULL) + break; +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + } else if (strcmp(var, "privs") == 0 && val != NULL) { + if ((cmndspec->privs = strdup(val)) == NULL) + break; + } else if (strcmp(var, "limitprivs") == 0 && val != NULL) { + if ((cmndspec->limitprivs = strdup(val)) == NULL) + break; +#endif /* HAVE_PRIV_SET */ + } else if (store_options) { + if (!sudo_ldap_add_default(var, val, op, source, + &priv->defaults)) { + break; + } + } else { + /* Convert to tags. */ + bool converted = sudoers_defaults_to_tags(var, val, op, + &cmndspec->tags); + if (!converted) { + if (warnings) { + /* XXX - callback to process unsupported options. */ + if (val != NULL) { + sudo_warnx(U_("unable to convert sudoOption: %s%s%s"), var, op == '+' ? "+=" : op == '-' ? "-=" : "=", val); + } else { + sudo_warnx(U_("unable to convert sudoOption: %s%s%s"), op == false ? "!" : "", var, ""); + } + } + continue; + } + } + } + rcstr_delref(source); + if (opt != NULL) { + /* Defer oom until we drop the ref on source. */ + goto oom; + } + } + + /* So we can inherit previous values. */ + prev_cmndspec = cmndspec; + } + + /* Fill in command member now that options have been processed. */ + m->negated = negated; + if (c == NULL) { + /* No command name for "ALL" */ + m->type = ALL; + if (cmndspec->tags.setenv == UNSPEC) + cmndspec->tags.setenv = IMPLIED; + } else { + char *args; + + m->type = COMMAND; + + /* Fill in command with optional digests. */ + if (!sudo_ldap_extract_digests(&cmnd, &c->digests)) + goto oom; + if ((args = strpbrk(cmnd, " \t")) != NULL) { + *args++ = '\0'; + if ((c->args = strdup(args)) == NULL) + goto oom; + } + if ((c->cmnd = strdup(cmnd)) == NULL) + goto oom; + } + } + /* Negated commands take precedence so we insert them at the end. */ + TAILQ_CONCAT(&priv->cmndlist, &negated_cmnds, entries); + + debug_return_ptr(priv); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (priv != NULL) { + TAILQ_CONCAT(&priv->hostlist, &negated_hosts, entries); + TAILQ_CONCAT(&priv->cmndlist, &negated_cmnds, entries); + free_privilege(priv); + } + debug_return_ptr(NULL); +} diff --git a/plugins/sudoers/linux_audit.c b/plugins/sudoers/linux_audit.c new file mode 100644 index 0000000..e5eb2c2 --- /dev/null +++ b/plugins/sudoers/linux_audit.c @@ -0,0 +1,116 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_LINUX_AUDIT + +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "linux_audit.h" + +#define AUDIT_NOT_CONFIGURED -2 + +/* + * Open audit connection if possible. + * Returns audit fd on success and -1 on failure. + */ +static int +linux_audit_open(void) +{ + static int au_fd = -1; + debug_decl(linux_audit_open, SUDOERS_DEBUG_AUDIT); + + if (au_fd != -1) + debug_return_int(au_fd); + au_fd = audit_open(); + if (au_fd == -1) { + /* Kernel may not have audit support. */ + if (errno == EINVAL || errno == EPROTONOSUPPORT || errno == EAFNOSUPPORT) + au_fd = AUDIT_NOT_CONFIGURED; + else + sudo_warn("%s", U_("unable to open audit system")); + } else if (fcntl(au_fd, F_SETFD, FD_CLOEXEC) == -1) { + sudo_warn("%s", U_("unable to open audit system")); + audit_close(au_fd); + au_fd = -1; + } + debug_return_int(au_fd); +} + +int +linux_audit_command(char *const argv[], int result) +{ + int au_fd, rc = -1; + char *cp, *command = NULL; + char * const *av; + size_t size, n; + debug_decl(linux_audit_command, SUDOERS_DEBUG_AUDIT); + + /* Don't return an error if auditing is not configured. */ + if ((au_fd = linux_audit_open()) < 0) + debug_return_int(au_fd == AUDIT_NOT_CONFIGURED ? 0 : -1); + + /* Convert argv to a flat string. */ + for (size = 0, av = argv; *av != NULL; av++) + size += strlen(*av) + 1; + if (size != 0) + command = malloc(size); + if (command == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + for (av = argv, cp = command; *av != NULL; av++) { + n = strlcpy(cp, *av, size - (cp - command)); + if (n >= size - (cp - command)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto done; + } + cp += n; + *cp++ = ' '; + } + *--cp = '\0'; + + /* Log command, ignoring ECONNREFUSED on error. */ + if (audit_log_user_command(au_fd, AUDIT_USER_CMD, command, NULL, result) <= 0) { + if (errno != ECONNREFUSED) { + sudo_warn("%s", U_("unable to send audit message")); + goto done; + } + } + + rc = 0; + +done: + free(command); + + debug_return_int(rc); +} + +#endif /* HAVE_LINUX_AUDIT */ diff --git a/plugins/sudoers/linux_audit.h b/plugins/sudoers/linux_audit.h new file mode 100644 index 0000000..89c468b --- /dev/null +++ b/plugins/sudoers/linux_audit.h @@ -0,0 +1,24 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010, 2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_LINUX_AUDIT_H +#define SUDOERS_LINUX_AUDIT_H + +int linux_audit_command(char *const argv[], int result); + +#endif /* SUDOERS_LINUX_AUDIT_H */ diff --git a/plugins/sudoers/locale.c b/plugins/sudoers/locale.c new file mode 100644 index 0000000..7e5e9cc --- /dev/null +++ b/plugins/sudoers/locale.c @@ -0,0 +1,154 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2012-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ + +#define DEFAULT_TEXT_DOMAIN "sudoers" + +#include "sudo_compat.h" +#include "sudo_eventlog.h" +#include "sudo_fatal.h" +#include "sudo_gettext.h" +#include "sudoers_debug.h" + +#include "defaults.h" +#include "logging.h" + +static int current_locale = SUDOERS_LOCALE_USER; +static char *user_locale; +static char *sudoers_locale; + +int +sudoers_getlocale(void) +{ + debug_decl(sudoers_getlocale, SUDOERS_DEBUG_UTIL); + debug_return_int(current_locale); +} + +bool +sudoers_initlocale(const char *ulocale, const char *slocale) +{ + debug_decl(sudoers_initlocale, SUDOERS_DEBUG_UTIL); + + if (ulocale != NULL) { + free(user_locale); + if ((user_locale = strdup(ulocale)) == NULL) + debug_return_bool(false); + } + if (slocale != NULL) { + free(sudoers_locale); + if ((sudoers_locale = strdup(slocale)) == NULL) + debug_return_bool(false); + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: user locale %s, sudoers locale %s", + __func__, user_locale, sudoers_locale); + debug_return_bool(true); +} + +/* + * Set locale to user or sudoers value. + * Returns true on success and false on failure, + * If prev_locale is non-NULL it will be filled in with the + * old SUDOERS_LOCALE_* value. + */ +bool +sudoers_setlocale(int locale_type, int *prev_locale) +{ + char *res = NULL; + debug_decl(sudoers_setlocale, SUDOERS_DEBUG_UTIL); + + switch (locale_type) { + case SUDOERS_LOCALE_USER: + if (prev_locale) + *prev_locale = current_locale; + if (current_locale != SUDOERS_LOCALE_USER) { + current_locale = SUDOERS_LOCALE_USER; + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: setting locale to %s (user)", __func__, + user_locale ? user_locale : ""); + res = setlocale(LC_ALL, user_locale ? user_locale : ""); + if (res != NULL && user_locale == NULL) { + user_locale = setlocale(LC_ALL, NULL); + if (user_locale != NULL) + user_locale = strdup(user_locale); + if (user_locale == NULL) + res = NULL; + } + } + break; + case SUDOERS_LOCALE_SUDOERS: + if (prev_locale) + *prev_locale = current_locale; + if (current_locale != SUDOERS_LOCALE_SUDOERS) { + current_locale = SUDOERS_LOCALE_SUDOERS; + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: setting locale to %s (sudoers)", __func__, + sudoers_locale ? sudoers_locale : "C"); + res = setlocale(LC_ALL, sudoers_locale ? sudoers_locale : "C"); + if (res == NULL && sudoers_locale != NULL) { + if (strcmp(sudoers_locale, "C") != 0) { + free(sudoers_locale); + sudoers_locale = strdup("C"); + if (sudoers_locale != NULL) + res = setlocale(LC_ALL, "C"); + } + } + } + break; + } + debug_return_bool(res ? true : false); +} + +bool +sudoers_warn_setlocale(bool restore, int *cookie) +{ + debug_decl(sudoers_warn_setlocale, SUDOERS_DEBUG_UTIL); + + if (restore) + debug_return_bool(sudoers_setlocale(*cookie, NULL)); + debug_return_bool(sudoers_setlocale(SUDOERS_LOCALE_USER, cookie)); +} + +/* + * Callback for sudoers_locale sudoers setting. + */ +bool +sudoers_locale_callback(const union sudo_defs_val *sd_un) +{ + debug_decl(sudoers_locale_callback, SUDOERS_DEBUG_UTIL); + + if (sudoers_initlocale(NULL, sd_un->str)) { + if (setlocale(LC_ALL, sd_un->str) != NULL) + debug_return_bool(true); + } + debug_return_bool(false); +} diff --git a/plugins/sudoers/log_client.c b/plugins/sudoers/log_client.c new file mode 100644 index 0000000..07c7899 --- /dev/null +++ b/plugins/sudoers/log_client.c @@ -0,0 +1,2043 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "config.h" + +#ifdef SUDOERS_LOG_CLIENT + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include +#include +#include +#include +#include +#ifndef HAVE_GETADDRINFO +# include "compat/getaddrinfo.h" +#endif + +#if defined(HAVE_OPENSSL) +# include +# include +# include +#endif /* HAVE_OPENSSL */ + +#define NEED_INET_NTOP /* to expose sudo_inet_ntop in sudo_compat.h */ + +#include "sudoers.h" +#include "sudo_event.h" +#include "sudo_eventlog.h" +#include "sudo_iolog.h" +#include "hostcheck.h" +#include "log_client.h" + +/* Server callback may redirect to client callback for TLS. */ +static void client_msg_cb(int fd, int what, void *v); +static void server_msg_cb(int fd, int what, void *v); + +static void +connect_cb(int sock, int what, void *v) +{ + int optval, ret, *errnump = v; + socklen_t optlen = sizeof(optval); + debug_decl(connect_cb, SUDOERS_DEBUG_UTIL); + + if (what == SUDO_PLUGIN_EV_TIMEOUT) { + *errnump = ETIMEDOUT; + } else { + ret = getsockopt(sock, SOL_SOCKET, SO_ERROR, &optval, &optlen); + *errnump = ret == 0 ? optval : errno; + } + + debug_return; +} + +/* + * Like connect(2) but with a timeout. + */ +static int +timed_connect(int sock, const struct sockaddr *addr, socklen_t addrlen, + const struct timespec *timo) +{ + struct sudo_event_base *evbase = NULL; + struct sudo_event *connect_event = NULL; + int ret, errnum = 0; + debug_decl(timed_connect, SUDOERS_DEBUG_UTIL); + + ret = connect(sock, addr, addrlen); + if (ret == -1 && errno == EINPROGRESS) { + evbase = sudo_ev_base_alloc(); + connect_event = sudo_ev_alloc(sock, SUDO_PLUGIN_EV_WRITE, connect_cb, + &errnum); + if (evbase == NULL || connect_event == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + if (sudo_ev_add(evbase, connect_event, timo, false) == -1) { + sudo_warnx("%s", U_("unable to add event to queue")); + goto done; + } + if (sudo_ev_dispatch(evbase) == -1) { + sudo_warn("%s", U_("error in event loop")); + goto done; + } + if (errnum == 0) + ret = 0; + else + errno = errnum; + } + +done: + sudo_ev_base_free(evbase); + sudo_ev_free(connect_event); + + debug_return_int(ret); +} + +#if defined(HAVE_OPENSSL) +static int +verify_peer_identity(int preverify_ok, X509_STORE_CTX *ctx) +{ + HostnameValidationResult result; + struct client_closure *closure; + SSL *ssl; + X509 *current_cert; + X509 *peer_cert; + debug_decl(verify_peer_identity, SUDOERS_DEBUG_UTIL); + + /* if pre-verification of the cert failed, just propagate that result back */ + if (preverify_ok != 1) { + debug_return_int(0); + } + + /* since this callback is called for each cert in the chain, + * check that current cert is the peer's certificate + */ + current_cert = X509_STORE_CTX_get_current_cert(ctx); + peer_cert = X509_STORE_CTX_get0_cert(ctx); + + if (current_cert != peer_cert) { + debug_return_int(1); + } + + /* read out the attached object (closure) from the ssl connection object */ + ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); + closure = SSL_get_ex_data(ssl, 1); + + result = validate_hostname(peer_cert, closure->server_name, + closure->server_ip, 0); + + switch(result) + { + case MatchFound: + debug_return_int(1); + default: + debug_return_int(0); + } +} + +static bool +tls_init(struct client_closure *closure) +{ + const char *errstr; + debug_decl(tls_init, SUDOERS_DEBUG_PLUGIN); + + /* Only attempt to initialize TLS once, the parameters don't change. */ + if (closure->ssl_initialized) { + if (closure->ssl == NULL) + debug_return_bool(false); + SSL_clear(closure->ssl); + debug_return_bool(true); + } + + closure->ssl_initialized = true; + SSL_library_init(); + OpenSSL_add_all_algorithms(); + SSL_load_error_strings(); + + /* Create the ssl context and enforce TLS 1.2 or higher. */ + if ((closure->ssl_ctx = SSL_CTX_new(TLS_client_method())) == NULL) { + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx(U_("Creation of new SSL_CTX object failed: %s"), errstr); + goto bad; + } +#ifdef HAVE_SSL_CTX_SET_MIN_PROTO_VERSION + if (!SSL_CTX_set_min_proto_version(closure->ssl_ctx, TLS1_2_VERSION)) { + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to restrict min. protocol version: %s", errstr); + goto bad; + } +#else + SSL_CTX_set_options(closure->ssl_ctx, + SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1); +#endif + + /* Enable server cert verification if log_server_verify is set in sudoers */ + if (closure->log_details->verify_server) { + if (closure->log_details->ca_bundle != NULL) { + if (SSL_CTX_load_verify_locations(closure->ssl_ctx, + closure->log_details->ca_bundle, NULL) <= 0) { + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx(U_("%s: %s"), closure->log_details->ca_bundle, + errstr); + sudo_warnx(U_("unable to load certificate authority bundle %s"), + closure->log_details->ca_bundle); + goto bad; + } + } else { + if (!SSL_CTX_set_default_verify_paths(closure->ssl_ctx)) { + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx("SSL_CTX_set_default_verify_paths: %s", errstr); + goto bad; + } + } + SSL_CTX_set_verify(closure->ssl_ctx, SSL_VERIFY_PEER, verify_peer_identity); + } + + /* Load the client certificate file if it is set in sudoers. */ + if (closure->log_details->cert_file != NULL) { + if (!SSL_CTX_use_certificate_chain_file(closure->ssl_ctx, + closure->log_details->cert_file)) { + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx(U_("%s: %s"), closure->log_details->cert_file, errstr); + sudo_warnx(U_("unable to load certificate %s"), + closure->log_details->cert_file); + goto bad; + } + if (closure->log_details->key_file == NULL) { + /* No explicit key file set, try to use the cert file. */ + closure->log_details->key_file = closure->log_details->cert_file; + } + if (!SSL_CTX_use_PrivateKey_file(closure->ssl_ctx, + closure->log_details->key_file, SSL_FILETYPE_PEM) || + !SSL_CTX_check_private_key(closure->ssl_ctx)) { + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx(U_("%s: %s"), closure->log_details->key_file, errstr); + sudo_warnx(U_("unable to load private key %s"), + closure->log_details->key_file); + goto bad; + } + } + + /* Create the SSL object and attach the closure. */ + if ((closure->ssl = SSL_new(closure->ssl_ctx)) == NULL) { + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx(U_("Unable to allocate ssl object: %s"), errstr); + goto bad; + } + if (SSL_set_ex_data(closure->ssl, 1, closure) <= 0) { + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx(U_("Unable to attach user data to the ssl object: %s"), + errstr); + goto bad; + } + + debug_return_bool(true); + +bad: + SSL_free(closure->ssl); + closure->ssl = NULL; + SSL_CTX_free(closure->ssl_ctx); + closure->ssl_ctx = NULL; + debug_return_bool(false); +} + +struct tls_connect_closure { + bool tls_conn_status; + SSL *ssl; + const char *host; + const char *port; + struct sudo_event_base *evbase; + struct sudo_event *tls_connect_ev; +}; + +static void +tls_connect_cb(int sock, int what, void *v) +{ + struct tls_connect_closure *closure = v; + struct timespec timeo = { 10, 0 }; + int tls_con; + debug_decl(tls_connect_cb, SUDOERS_DEBUG_UTIL); + + if (what == SUDO_PLUGIN_EV_TIMEOUT) { + sudo_warnx("%s", U_("TLS handshake timeout occurred")); + goto bad; + } + + tls_con = SSL_connect(closure->ssl); + + if (tls_con == 1) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "TLS version: %s, negotiated cipher suite: %s", + SSL_get_version(closure->ssl), SSL_get_cipher(closure->ssl)); + closure->tls_conn_status = true; + } else { + const char *errstr; + + switch (SSL_get_error(closure->ssl, tls_con)) { + /* TLS handshake is not finished, reschedule event */ + case SSL_ERROR_WANT_READ: + sudo_debug_printf(SUDO_DEBUG_NOTICE|SUDO_DEBUG_LINENO, + "SSL_connect returns SSL_ERROR_WANT_READ"); + if (what != SUDO_EV_READ) { + if (sudo_ev_set(closure->tls_connect_ev, sock, + SUDO_EV_READ, tls_connect_cb, closure) == -1) { + sudo_warnx("%s", U_("unable to set event")); + goto bad; + } + } + if (sudo_ev_add(closure->evbase, closure->tls_connect_ev, + &timeo, false) == -1) { + sudo_warnx("%s", U_("unable to add event to queue")); + goto bad; + } + break; + case SSL_ERROR_WANT_WRITE: + sudo_debug_printf(SUDO_DEBUG_NOTICE|SUDO_DEBUG_LINENO, + "SSL_connect returns SSL_ERROR_WANT_WRITE"); + if (what != SUDO_EV_WRITE) { + if (sudo_ev_set(closure->tls_connect_ev, sock, + SUDO_EV_WRITE, tls_connect_cb, closure) == -1) { + sudo_warnx("%s", U_("unable to set event")); + goto bad; + } + } + if (sudo_ev_add(closure->evbase, closure->tls_connect_ev, + &timeo, false) == -1) { + sudo_warnx("%s", U_("unable to add event to queue")); + goto bad; + } + break; + case SSL_ERROR_SYSCALL: + sudo_warnx(U_("TLS connection to %s:%s failed: %s"), + closure->host, closure->port, strerror(errno)); + goto bad; + default: + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx(U_("TLS connection to %s:%s failed: %s"), + closure->host, closure->port, errstr); + goto bad; + } + } + + debug_return; + +bad: + /* Break out of tls connect event loop with an error. */ + sudo_ev_loopbreak(closure->evbase); + + debug_return; +} + +static bool +tls_timed_connect(SSL *ssl, const char *host, const char *port, + const struct timespec *timo) +{ + struct tls_connect_closure closure; + debug_decl(tls_timed_connect, SUDOERS_DEBUG_UTIL); + + memset(&closure, 0, sizeof(closure)); + closure.ssl = ssl; + closure.host = host; + closure.port = port; + closure.evbase = sudo_ev_base_alloc(); + closure.tls_connect_ev = sudo_ev_alloc(SSL_get_fd(ssl), + SUDO_PLUGIN_EV_WRITE, tls_connect_cb, &closure); + + if (closure.evbase == NULL || closure.tls_connect_ev == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + + if (sudo_ev_add(closure.evbase, closure.tls_connect_ev, timo, false) == -1) { + sudo_warnx("%s", U_("unable to add event to queue")); + goto done; + } + + if (sudo_ev_dispatch(closure.evbase) == -1) { + sudo_warnx("%s", U_("error in event loop")); + goto done; + } + +done: + if (closure.tls_connect_ev != NULL) + sudo_ev_free(closure.tls_connect_ev); + sudo_ev_base_free(closure.evbase); + + debug_return_bool(closure.tls_conn_status); +} +#endif /* HAVE_OPENSSL */ + +/* + * Connect to specified host:port + * If host has multiple addresses, the first one that connects is used. + * Returns open socket or -1 on error. + */ +static int +connect_server(const char *host, const char *port, bool tls, + struct client_closure *closure, const char **reason) +{ + const struct timespec *timo = &closure->log_details->server_timeout; + struct addrinfo hints, *res, *res0; + const char *addr, *cause = NULL; + int error, sock = -1; + debug_decl(connect_server, SUDOERS_DEBUG_UTIL); + +#if !defined(HAVE_OPENSSL) + if (tls) { + errno = EPROTONOSUPPORT; + sudo_warn("%s:%s(tls)", host, port); + debug_return_int(-1); + } +#endif + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + error = getaddrinfo(host, port, &hints, &res0); + if (error != 0) { + sudo_warnx(U_("unable to look up %s:%s: %s"), host, port, + gai_strerror(error)); + debug_return_int(-1); + } + + for (res = res0; res; res = res->ai_next) { + int flags, save_errno; + + sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (sock == -1) { + cause = "socket"; + continue; + } + flags = fcntl(sock, F_GETFL, 0); + if (flags == -1 || fcntl(sock, F_SETFL, flags | O_NONBLOCK) == -1) { + cause = "fcntl(O_NONBLOCK)"; + save_errno = errno; + close(sock); + errno = save_errno; + sock = -1; + continue; + } + if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) { + cause = "fcntl(FD_CLOEXEC)"; + save_errno = errno; + close(sock); + errno = save_errno; + sock = -1; + continue; + } + if (closure->log_details->keepalive) { + flags = 1; + if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &flags, + sizeof(flags)) == -1) { + cause = "setsockopt(SO_KEEPALIVE)"; + save_errno = errno; + close(sock); + errno = save_errno; + sock = -1; + continue; + } + } + if (timed_connect(sock, res->ai_addr, res->ai_addrlen, timo) == -1) { + /* No need to set cause, caller's error message is sufficient. */ + save_errno = errno; + close(sock); + errno = save_errno; + sock = -1; + continue; + } + switch (res->ai_family) { + case AF_INET: + addr = (char *)&((struct sockaddr_in *)res->ai_addr)->sin_addr; + break; + case AF_INET6: + addr = (char *)&((struct sockaddr_in6 *)res->ai_addr)->sin6_addr; + break; + default: + cause = "ai_family"; + save_errno = EAFNOSUPPORT; + close(sock); + errno = save_errno; + sock = -1; + continue; + } + if (inet_ntop(res->ai_family, addr, closure->server_ip, + sizeof(closure->server_ip)) == NULL) { + cause = "inet_ntop"; + save_errno = errno; + close(sock); + errno = save_errno; + sock = -1; + continue; + } + free(closure->server_name); + if ((closure->server_name = strdup(host)) == NULL) { + cause = "strdup"; + save_errno = errno; + close(sock); + errno = save_errno; + sock = -1; + continue; + } + +#if defined(HAVE_OPENSSL) + if (tls) { + if (!tls_init(closure) || !SSL_set_fd(closure->ssl, sock)) { + cause = U_("TLS initialization was unsuccessful"); + save_errno = errno; + close(sock); + errno = save_errno; + sock = -1; + continue; + } + /* Perform TLS handshake. */ + if (!tls_timed_connect(closure->ssl, host, port, timo)) { + cause = U_("TLS handshake was unsuccessful"); + save_errno = errno; + close(sock); + errno = save_errno; + sock = -1; + continue; + } + } else { + /* No TLS for this connection, make sure it is not initialized. */ + SSL_free(closure->ssl); + closure->ssl = NULL; + SSL_CTX_free(closure->ssl_ctx); + closure->ssl_ctx = NULL; + } +#endif /* HAVE_OPENSSL */ + break; /* success */ + } + freeaddrinfo(res0); + + if (sock == -1) + *reason = cause; + + debug_return_int(sock); +} + +/* + * Connect to the first server in the list. + * Stores socket in closure with O_NONBLOCK and close-on-exec flags set. + * Returns true on success, else false. + */ +bool +log_server_connect(struct client_closure *closure) +{ + struct sudoers_string *server; + char *host, *port, *copy = NULL; + const char *cause = NULL; + int sock; + bool tls, ret = false; + debug_decl(log_server_connect, SUDOERS_DEBUG_UTIL); + + STAILQ_FOREACH(server, closure->log_details->log_servers, entries) { + free(copy); + if ((copy = strdup(server->str)) == NULL) + break; + if (!iolog_parse_host_port(copy, &host, &port, &tls, DEFAULT_PORT, + DEFAULT_PORT_TLS)) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to parse %s", copy); + continue; + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "connecting to %s port %s%s", host, port, tls ? " (tls)" : ""); + sock = connect_server(host, port, tls, closure, &cause); + if (sock != -1) { + if (closure->read_ev->set(closure->read_ev, sock, + SUDO_PLUGIN_EV_READ|SUDO_PLUGIN_EV_PERSIST, + server_msg_cb, closure) == -1) { + cause = (U_("unable to add event to queue")); + break; + } + + if (closure->write_ev->set(closure->write_ev, sock, + SUDO_PLUGIN_EV_WRITE|SUDO_PLUGIN_EV_PERSIST, + client_msg_cb, closure) == -1) { + cause = (U_("unable to add event to queue")); + break; + } + + /* success */ + closure->sock = sock; + ret = true; + break; + } + } + free(copy); + + if (!ret && cause != NULL) + sudo_warn("%s", cause); + + debug_return_bool(ret); +} + +/* + * Free client closure and contents, not including log details. + */ +void +client_closure_free(struct client_closure *closure) +{ + struct connection_buffer *buf; + debug_decl(client_closure_free, SUDOERS_DEBUG_UTIL); + + if (closure == NULL) + debug_return; + +#if defined(HAVE_OPENSSL) + /* Shut down the TLS connection cleanly and free SSL data. */ + if (closure->ssl != NULL) { + SSL_shutdown(closure->ssl); + SSL_free(closure->ssl); + } + SSL_CTX_free(closure->ssl_ctx); +#endif + + if (closure->sock != -1) + close(closure->sock); + free(closure->server_name); + while ((buf = TAILQ_FIRST(&closure->write_bufs)) != NULL) { + TAILQ_REMOVE(&closure->write_bufs, buf, entries); + free(buf->data); + free(buf); + } + while ((buf = TAILQ_FIRST(&closure->free_bufs)) != NULL) { + TAILQ_REMOVE(&closure->free_bufs, buf, entries); + free(buf->data); + free(buf); + } + if (closure->read_ev != NULL) + closure->read_ev->free(closure->read_ev); + if (closure->write_ev != NULL) + closure->write_ev->free(closure->write_ev); + free(closure->read_buf.data); + free(closure->iolog_id); + + free(closure); + + debug_return; +} + +static struct connection_buffer * +get_free_buf(struct client_closure *closure) +{ + struct connection_buffer *buf; + debug_decl(get_free_buf, SUDOERS_DEBUG_UTIL); + + buf = TAILQ_FIRST(&closure->free_bufs); + if (buf != NULL) + TAILQ_REMOVE(&closure->free_bufs, buf, entries); + else + buf = calloc(1, sizeof(*buf)); + + debug_return_ptr(buf); +} + +/* + * Format a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +bool +fmt_client_message(struct client_closure *closure, ClientMessage *msg) +{ + struct connection_buffer *buf; + uint32_t msg_len; + bool ret = false; + size_t len; + debug_decl(fmt_client_message, SUDOERS_DEBUG_UTIL); + + if ((buf = get_free_buf(closure)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + + len = client_message__get_packed_size(msg); + if (len > MESSAGE_SIZE_MAX) { + sudo_warnx(U_("client message too large: %zu"), len); + goto done; + } + /* Wire message size is used for length encoding, precedes message. */ + msg_len = htonl((uint32_t)len); + len += sizeof(msg_len); + + /* Resize buffer as needed. */ + if (len > buf->size) { + free(buf->data); + buf->size = sudo_pow2_roundup(len); + if ((buf->data = malloc(buf->size)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + buf->size = 0; + goto done; + } + } + + memcpy(buf->data, &msg_len, sizeof(msg_len)); + client_message__pack(msg, buf->data + sizeof(msg_len)); + buf->len = len; + TAILQ_INSERT_TAIL(&closure->write_bufs, buf, entries); + buf = NULL; + + ret = true; + +done: + if (buf != NULL) { + free(buf->data); + free(buf); + } + debug_return_bool(ret); +} + +/* + * Build and format a ClientHello wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +bool +fmt_client_hello(struct client_closure *closure) +{ + ClientMessage client_msg = CLIENT_MESSAGE__INIT; + ClientHello hello_msg = CLIENT_HELLO__INIT; + bool ret = false; + debug_decl(fmt_client_hello, SUDOERS_DEBUG_UTIL); + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: sending ClientHello", __func__); + + /* Client name + version */ + hello_msg.client_id = "sudoers " PACKAGE_VERSION; + + /* Schedule ClientMessage */ + client_msg.u.hello_msg = &hello_msg; + client_msg.type_case = CLIENT_MESSAGE__TYPE_HELLO_MSG; + ret = fmt_client_message(closure, &client_msg); + + debug_return_bool(ret); +} + +/* + * Free an array of InfoMessage. + * Does not free the actual contents, other than strlistval arrays. + */ +static void +free_info_messages(InfoMessage **info_msgs, size_t n) +{ + debug_decl(free_info_messages, SUDOERS_DEBUG_UTIL); + + if (info_msgs != NULL) { + while (n-- != 0) { + /* A strlist array is dynamically allocated. */ + if (info_msgs[n]->value_case == INFO_MESSAGE__VALUE_STRLISTVAL) { + free(info_msgs[n]->u.strlistval); + } + free(info_msgs[n]); + } + free(info_msgs); + } + + debug_return; +} + +static InfoMessage ** +fmt_info_messages(struct client_closure *closure, size_t *n_info_msgs) +{ + struct log_details *details = closure->log_details; + struct eventlog *evlog = details->evlog; + InfoMessage__StringList *runargv = NULL; + InfoMessage__StringList *runenv = NULL; + InfoMessage **info_msgs = NULL; + size_t info_msgs_size, n = 0; + debug_decl(fmt_info_messages, SUDOERS_DEBUG_UTIL); + + /* Convert NULL-terminated vectors to StringList. */ + if (evlog->argv != NULL) { + if ((runargv = malloc(sizeof(*runargv))) == NULL) + goto bad; + info_message__string_list__init(runargv); + runargv->strings = evlog->argv; + while (runargv->strings[runargv->n_strings] != NULL) + runargv->n_strings++; + } + + if (evlog->envp != NULL) { + if ((runenv = malloc(sizeof(*runenv))) == NULL) + goto bad; + info_message__string_list__init(runenv); + runenv->strings = evlog->envp; + while (runenv->strings[runenv->n_strings] != NULL) + runenv->n_strings++; + } + + /* XXX - realloc as needed instead of preallocating */ + info_msgs_size = 24; + info_msgs = calloc(info_msgs_size, sizeof(InfoMessage *)); + if (info_msgs == NULL) + goto bad; + for (n = 0; n < info_msgs_size; n++) { + info_msgs[n] = malloc(sizeof(InfoMessage)); + if (info_msgs[n] == NULL) + goto bad; + info_message__init(info_msgs[n]); + } + + /* Fill in info_msgs */ + n = 0; + + /* TODO: clientargv (not currently supported by API) */ + /* TODO: clientpid */ + /* TODO: clientppid */ + /* TODO: clientsid */ + + info_msgs[n]->key = "columns"; + info_msgs[n]->u.numval = evlog->columns; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL; + n++; + + info_msgs[n]->key = "command"; + info_msgs[n]->u.strval = evlog->command; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; + n++; + + info_msgs[n]->key = "lines"; + info_msgs[n]->u.numval = evlog->lines; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL; + n++; + + if (runargv != NULL) { + info_msgs[n]->key = "runargv"; + info_msgs[n]->u.strlistval = runargv; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRLISTVAL; + n++; + } + + if (runenv != NULL) { + info_msgs[n]->key = "runenv"; + info_msgs[n]->u.strlistval = runenv; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRLISTVAL; + n++; + } + + if (evlog->rungroup != NULL) { + info_msgs[n]->key = "rungid"; + info_msgs[n]->u.numval = evlog->rungid; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL; + n++; + + info_msgs[n]->key = "rungroup"; + info_msgs[n]->u.strval = evlog->rungroup; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; + n++; + } + + /* TODO - rungids */ + /* TODO - rungroups */ + + info_msgs[n]->key = "runuid"; + info_msgs[n]->u.numval = evlog->runuid; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_NUMVAL; + n++; + + info_msgs[n]->key = "runuser"; + info_msgs[n]->u.strval = evlog->runuser; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; + n++; + + if (evlog->cwd != NULL) { + info_msgs[n]->key = "submitcwd"; + info_msgs[n]->u.strval = evlog->cwd; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; + n++; + } + + if (evlog->runcwd != NULL) { + info_msgs[n]->key = "runcwd"; + info_msgs[n]->u.strval = evlog->runcwd; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; + n++; + } + + if (evlog->runchroot != NULL) { + info_msgs[n]->key = "runchroot"; + info_msgs[n]->u.strval = evlog->runchroot; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; + n++; + } + + /* TODO - submitenv */ + /* TODO - submitgid */ + /* TODO - submitgids */ + /* TODO - submitgroup */ + /* TODO - submitgroups */ + + info_msgs[n]->key = "submithost"; + info_msgs[n]->u.strval = evlog->submithost; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; + n++; + + /* TODO - submituid */ + + info_msgs[n]->key = "submituser"; + info_msgs[n]->u.strval = evlog->submituser; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; + n++; + + if (evlog->ttyname != NULL) { + info_msgs[n]->key = "ttyname"; + info_msgs[n]->u.strval = evlog->ttyname; + info_msgs[n]->value_case = INFO_MESSAGE__VALUE_STRVAL; + n++; + } + + /* Free unused structs. */ + while (info_msgs_size > n) + free(info_msgs[--info_msgs_size]); + + *n_info_msgs = n; + debug_return_ptr(info_msgs); + +bad: + free_info_messages(info_msgs, n); + free(runargv); + free(runenv); + + *n_info_msgs = 0; + debug_return_ptr(NULL); +} + +/* + * Build and format an AcceptMessage wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +static bool +fmt_accept_message(struct client_closure *closure) +{ + ClientMessage client_msg = CLIENT_MESSAGE__INIT; + AcceptMessage accept_msg = ACCEPT_MESSAGE__INIT; + TimeSpec ts = TIME_SPEC__INIT; + struct timespec now; + bool ret = false; + debug_decl(fmt_accept_message, SUDOERS_DEBUG_UTIL); + + /* + * Fill in AcceptMessage and add it to ClientMessage. + */ + if (sudo_gettime_real(&now)) { + sudo_warn("%s", U_("unable to get time of day")); + debug_return_bool(false); + } + ts.tv_sec = now.tv_sec; + ts.tv_nsec = now.tv_nsec; + accept_msg.submit_time = &ts; + + /* Client will send IoBuffer messages. */ + accept_msg.expect_iobufs = closure->log_io; + + accept_msg.info_msgs = fmt_info_messages(closure, &accept_msg.n_info_msgs); + if (accept_msg.info_msgs == NULL) + goto done; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: sending AcceptMessage, array length %zu", __func__, + accept_msg.n_info_msgs); + + /* Schedule ClientMessage */ + client_msg.u.accept_msg = &accept_msg; + client_msg.type_case = CLIENT_MESSAGE__TYPE_ACCEPT_MSG; + ret = fmt_client_message(closure, &client_msg); + +done: + free_info_messages(accept_msg.info_msgs, accept_msg.n_info_msgs); + + debug_return_bool(ret); +} + +/* + * Build and format a RejectMessage wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +static bool +fmt_reject_message(struct client_closure *closure) +{ + ClientMessage client_msg = CLIENT_MESSAGE__INIT; + RejectMessage reject_msg = REJECT_MESSAGE__INIT; + TimeSpec ts = TIME_SPEC__INIT; + struct timespec now; + bool ret = false; + debug_decl(fmt_reject_message, SUDOERS_DEBUG_UTIL); + + /* + * Fill in RejectMessage and add it to ClientMessage. + */ + if (sudo_gettime_real(&now)) { + sudo_warn("%s", U_("unable to get time of day")); + debug_return_bool(false); + } + ts.tv_sec = now.tv_sec; + ts.tv_nsec = now.tv_nsec; + reject_msg.submit_time = &ts; + + /* Reason for rejecting the request. */ + reject_msg.reason = (char *)closure->reason; + + reject_msg.info_msgs = fmt_info_messages(closure, &reject_msg.n_info_msgs); + if (reject_msg.info_msgs == NULL) + goto done; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: sending RejectMessage, array length %zu", __func__, + reject_msg.n_info_msgs); + + /* Schedule ClientMessage */ + client_msg.u.reject_msg = &reject_msg; + client_msg.type_case = CLIENT_MESSAGE__TYPE_REJECT_MSG; + ret = fmt_client_message(closure, &client_msg); + +done: + free_info_messages(reject_msg.info_msgs, reject_msg.n_info_msgs); + + debug_return_bool(ret); +} + +/* + * Build and format an AlertMessage wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +static bool +fmt_alert_message(struct client_closure *closure) +{ + ClientMessage client_msg = CLIENT_MESSAGE__INIT; + AlertMessage alert_msg = ALERT_MESSAGE__INIT; + TimeSpec ts = TIME_SPEC__INIT; + struct timespec now; + bool ret = false; + debug_decl(fmt_alert_message, SUDOERS_DEBUG_UTIL); + + /* + * Fill in AlertMessage and add it to ClientMessage. + */ + if (sudo_gettime_real(&now)) { + sudo_warn("%s", U_("unable to get time of day")); + debug_return_bool(false); + } + ts.tv_sec = now.tv_sec; + ts.tv_nsec = now.tv_nsec; + alert_msg.alert_time = &ts; + + /* Reason for the alert. */ + alert_msg.reason = (char *)closure->reason; + + alert_msg.info_msgs = fmt_info_messages(closure, &alert_msg.n_info_msgs); + if (alert_msg.info_msgs == NULL) + goto done; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: sending AlertMessage, array length %zu", __func__, + alert_msg.n_info_msgs); + + /* Schedule ClientMessage */ + client_msg.u.alert_msg = &alert_msg; + client_msg.type_case = CLIENT_MESSAGE__TYPE_ALERT_MSG; + ret = fmt_client_message(closure, &client_msg); + +done: + free_info_messages(alert_msg.info_msgs, alert_msg.n_info_msgs); + + debug_return_bool(ret); +} + +/* + * Build and format an AcceptMessage, RejectMessage or AlertMessage + * (depending on initial_state) wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +static bool +fmt_initial_message(struct client_closure *closure) +{ + bool ret = true; + debug_decl(fmt_initial_message, SUDOERS_DEBUG_UTIL); + + closure->state = closure->initial_state; + switch (closure->state) { + case SEND_ACCEPT: + /* Format and schedule AcceptMessage. */ + if ((ret = fmt_accept_message(closure))) { + /* + * Move read/write events back to main sudo event loop. + * Server messages may occur at any time, so no timeout. + * Write event will be re-enabled later. + */ + closure->read_ev->setbase(closure->read_ev, NULL); + if (closure->read_ev->add(closure->read_ev, NULL) == -1) { + sudo_warn("%s", U_("unable to add event to queue")); + ret = false; + } + closure->write_ev->setbase(closure->write_ev, NULL); + } + break; + case SEND_REJECT: + /* Format and schedule RejectMessage. */ + ret = fmt_reject_message(closure); + break; + case SEND_ALERT: + /* Format and schedule AlertMessage. */ + ret = fmt_alert_message(closure); + break; + default: + sudo_warnx(U_("%s: unexpected state %d"), __func__, closure->state); + ret = false; + break; + } + debug_return_bool(ret); +} + +#ifdef notyet +/* + * Build and format a RestartMessage wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +bool +fmt_restart_message(struct client_closure *closure) +{ + ClientMessage client_msg = CLIENT_MESSAGE__INIT; + RestartMessage restart_msg = RESTART_MESSAGE__INIT; + TimeSpec tv = TIME_SPEC__INIT; + bool ret = false; + debug_decl(fmt_restart_message, SUDOERS_DEBUG_UTIL); + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: sending RestartMessage, [%lld, %ld]", __func__, + (long long)closure->restart->tv_sec, closure->restart->tv_nsec); + + tv.tv_sec = closure->restart->tv_sec; + tv.tv_nsec = closure->restart->tv_nsec; + restart_msg.resume_point = &tv; + restart_msg.log_id = closure->iolog_id; + + /* Schedule ClientMessage */ + client_msg.restart_msg = &restart_msg; + client_msg.type_case = CLIENT_MESSAGE__TYPE_RESTART_MSG; + ret = fmt_client_message(closure, &client_msg); + + debug_return_bool(ret); +} +#endif + +/* + * Build and format an ExitMessage wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +bool +fmt_exit_message(struct client_closure *closure, int exit_status, int error) +{ + ClientMessage client_msg = CLIENT_MESSAGE__INIT; + ExitMessage exit_msg = EXIT_MESSAGE__INIT; + TimeSpec ts = TIME_SPEC__INIT; + char signame[SIG2STR_MAX]; + bool ret = false; + struct timespec run_time; + debug_decl(fmt_exit_message, SUDOERS_DEBUG_UTIL); + + if (sudo_gettime_awake(&run_time) == -1) { + sudo_warn("%s", U_("unable to get time of day")); + goto done; + } + sudo_timespecsub(&run_time, &closure->start_time, &run_time); + + ts.tv_sec = run_time.tv_sec; + ts.tv_nsec = run_time.tv_nsec; + exit_msg.run_time = &ts; + + if (error != 0) { + /* Error executing the command. */ + exit_msg.error = strerror(error); + } else { + if (WIFEXITED(exit_status)) { + exit_msg.exit_value = WEXITSTATUS(exit_status); + } else if (WIFSIGNALED(exit_status)) { + int signo = WTERMSIG(exit_status); + if (signo <= 0 || sig2str(signo, signame) == -1) { + sudo_warnx(U_("%s: internal error, invalid signal %d"), + __func__, signo); + goto done; + } + exit_msg.signal = signame; + if (WCOREDUMP(exit_status)) + exit_msg.dumped_core = true; + exit_msg.exit_value = WTERMSIG(exit_status) | 128; + } else { + sudo_warnx(U_("%s: internal error, invalid exit status %d"), + __func__, exit_status); + goto done; + } + } + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: sending ExitMessage, exitval %d, error %s, signal %s, coredump %s", + __func__, exit_msg.exit_value, exit_msg.error ? exit_msg.error : "", + exit_msg.signal ? exit_msg.signal : "", + exit_msg.dumped_core ? "yes" : "no"); + + /* Send ClientMessage */ + client_msg.u.exit_msg = &exit_msg; + client_msg.type_case = CLIENT_MESSAGE__TYPE_EXIT_MSG; + if (!fmt_client_message(closure, &client_msg)) + goto done; + + closure->state = SEND_EXIT; + ret = true; + +done: + debug_return_bool(ret); +} + +/* + * Build and format an IoBuffer wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +bool +fmt_io_buf(struct client_closure *closure, int type, const char *buf, + unsigned int len, struct timespec *delay) +{ + ClientMessage client_msg = CLIENT_MESSAGE__INIT; + IoBuffer iobuf_msg = IO_BUFFER__INIT; + TimeSpec ts = TIME_SPEC__INIT; + bool ret = false; + debug_decl(fmt_io_buf, SUDOERS_DEBUG_UTIL); + + /* Fill in IoBuffer. */ + ts.tv_sec = delay->tv_sec; + ts.tv_nsec = delay->tv_nsec; + iobuf_msg.delay = &ts; + iobuf_msg.data.data = (void *)buf; + iobuf_msg.data.len = len; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: sending IoBuffer length %zu, type %d, size %zu", __func__, + iobuf_msg.data.len, type, io_buffer__get_packed_size(&iobuf_msg)); + + /* Schedule ClientMessage, it doesn't matter which IoBuffer we set. */ + client_msg.u.ttyout_buf = &iobuf_msg; + client_msg.type_case = type; + if (!fmt_client_message(closure, &client_msg)) + goto done; + + ret = true; + +done: + debug_return_bool(ret); +} + +/* + * Build and format a ChangeWindowSize message wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +bool +fmt_winsize(struct client_closure *closure, unsigned int lines, + unsigned int cols, struct timespec *delay) +{ + ClientMessage client_msg = CLIENT_MESSAGE__INIT; + ChangeWindowSize winsize_msg = CHANGE_WINDOW_SIZE__INIT; + TimeSpec ts = TIME_SPEC__INIT; + bool ret = false; + debug_decl(fmt_winsize, SUDOERS_DEBUG_UTIL); + + /* Fill in ChangeWindowSize message. */ + ts.tv_sec = delay->tv_sec; + ts.tv_nsec = delay->tv_nsec; + winsize_msg.delay = &ts; + winsize_msg.rows = lines; + winsize_msg.cols = cols; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: sending ChangeWindowSize, %dx%d", + __func__, winsize_msg.rows, winsize_msg.cols); + + /* Send ClientMessage */ + client_msg.u.winsize_event = &winsize_msg; + client_msg.type_case = CLIENT_MESSAGE__TYPE_WINSIZE_EVENT; + if (!fmt_client_message(closure, &client_msg)) + goto done; + + ret = true; + +done: + debug_return_bool(ret); +} + +/* + * Build and format a CommandSuspend message wrapped in a ClientMessage. + * Appends the wire format message to the closure's write queue. + * Returns true on success, false on failure. + */ +bool +fmt_suspend(struct client_closure *closure, const char *signame, struct timespec *delay) +{ + ClientMessage client_msg = CLIENT_MESSAGE__INIT; + CommandSuspend suspend_msg = COMMAND_SUSPEND__INIT; + TimeSpec ts = TIME_SPEC__INIT; + bool ret = false; + debug_decl(fmt_suspend, SUDOERS_DEBUG_UTIL); + + /* Fill in CommandSuspend message. */ + ts.tv_sec = delay->tv_sec; + ts.tv_nsec = delay->tv_nsec; + suspend_msg.delay = &ts; + suspend_msg.signal = (char *)signame; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: sending CommandSuspend, SIG%s", __func__, suspend_msg.signal); + + /* Send ClientMessage */ + client_msg.u.suspend_event = &suspend_msg; + client_msg.type_case = CLIENT_MESSAGE__TYPE_SUSPEND_EVENT; + if (!fmt_client_message(closure, &client_msg)) + goto done; + + ret = true; + +done: + debug_return_bool(ret); +} + +/* + * Additional work to do after a ClientMessage was sent to the server. + * Advances state and formats the next ClientMessage (if any). + * XXX - better name + */ +static bool +client_message_completion(struct client_closure *closure) +{ + debug_decl(client_message_completion, SUDOERS_DEBUG_UTIL); + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: state %d", __func__, closure->state); + + switch (closure->state) { + case RECV_HELLO: + /* Waiting for ServerHello, nothing else to do. */ + break; + case SEND_ALERT: + case SEND_REJECT: + /* Nothing else to send, we are done. */ + closure->write_ev->del(closure->write_ev); + closure->read_ev->del(closure->read_ev); + closure->state = FINISHED; + break; + case SEND_ACCEPT: + case SEND_RESTART: + closure->state = SEND_IO; + break; + case SEND_IO: + /* Arbitrary number of I/O log buffers, no state change. */ + break; + case SEND_EXIT: + if (closure->log_io) { + /* Done writing, just waiting for final commit point. */ + closure->write_ev->del(closure->write_ev); + closure->state = CLOSING; + + /* Enable timeout while waiting for final commit point. */ + if (closure->read_ev->add(closure->read_ev, + &closure->log_details->server_timeout) == -1) { + sudo_warn("%s", U_("unable to add event to queue")); + debug_return_bool(false); + } + } else { + /* No commit point to wait for, we are done. */ + closure->state = FINISHED; + closure->read_ev->del(closure->read_ev); + } + break; + default: + sudo_warnx(U_("%s: unexpected state %d"), __func__, closure->state); + debug_return_bool(false); + } + debug_return_bool(true); +} + +/* + * Read the ServerHello message from the log server. + * We do this synchronously, since we don't want the command to run + * before the log server connection is completely established. + */ +bool +read_server_hello(struct client_closure *closure) +{ + struct sudo_event_base *evbase = NULL; + bool ret = false; + debug_decl(read_server_hello, SUDOERS_DEBUG_UTIL); + + /* Get new event base so we can read ServerHello synchronously. */ + evbase = sudo_ev_base_alloc(); + if (evbase == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + + /* Write ClientHello. */ + if (!fmt_client_hello(closure)) + goto done; + closure->write_ev->setbase(closure->write_ev, evbase); + if (closure->write_ev->add(closure->write_ev, + &closure->log_details->server_timeout) == -1) { + sudo_warnx("%s", U_("unable to add event to queue")); + goto done; + } + + /* Read ServerHello. */ + closure->read_ev->setbase(closure->read_ev, evbase); + if (closure->read_ev->add(closure->read_ev, + &closure->log_details->server_timeout) == -1) { + sudo_warnx("%s", U_("unable to add event to queue")); + goto done; + } + + /* Read/write hello messages synchronously. */ + if (sudo_ev_dispatch(evbase) == -1) { + sudo_warnx("%s", U_("error in event loop")); + goto done; + } + + if (!sudo_ev_got_break(evbase)) + ret = true; + +done: + sudo_ev_base_free(evbase); + debug_return_bool(ret); +} + +/* + * Respond to a ServerHello message from the server. + * Returns true on success, false on error. + */ +static bool +handle_server_hello(ServerHello *msg, struct client_closure *closure) +{ + size_t n; + debug_decl(handle_server_hello, SUDOERS_DEBUG_UTIL); + + if (closure->state != RECV_HELLO) { + sudo_warnx(U_("%s: unexpected state %d"), __func__, closure->state); + debug_return_bool(false); + } + + /* Check that ServerHello is valid. */ + if (msg->server_id == NULL || msg->server_id[0] == '\0') { + sudo_warnx("%s", U_("invalid ServerHello")); + debug_return_bool(false); + } + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: server ID: %s", + __func__, msg->server_id); + /* TODO: handle redirect */ + if (msg->redirect != NULL && msg->redirect[0] != '\0') { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: redirect: %s", + __func__, msg->redirect); + } + for (n = 0; n < msg->n_servers; n++) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: server %zu: %s", + __func__, n + 1, msg->servers[n]); + } + + debug_return_bool(true); +} + +/* + * Respond to a CommitPoint message from the server. + * Returns true on success, false on error. + */ +static bool +handle_commit_point(TimeSpec *commit_point, struct client_closure *closure) +{ + debug_decl(handle_commit_point, SUDOERS_DEBUG_UTIL); + + /* Only valid after we have sent an IO buffer. */ + if (closure->state < SEND_IO) { + sudo_warnx(U_("%s: unexpected state %d"), __func__, closure->state); + debug_return_bool(false); + } + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: commit point: [%lld, %d]", + __func__, (long long)commit_point->tv_sec, commit_point->tv_nsec); + closure->committed.tv_sec = commit_point->tv_sec; + closure->committed.tv_nsec = commit_point->tv_nsec; + + if (closure->state == CLOSING) { + if (sudo_timespeccmp(&closure->elapsed, &closure->committed, ==)) { + /* Last commit point received, exit event loop. */ + closure->state = FINISHED; + closure->read_ev->del(closure->read_ev); + } + } + + debug_return_bool(true); +} + +/* + * Respond to a LogId message from the server. + * Always returns true. + */ +static bool +handle_log_id(char *id, struct client_closure *closure) +{ + debug_decl(handle_log_id, SUDOERS_DEBUG_UTIL); + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: remote log ID: %s", __func__, id); + if ((closure->iolog_id = strdup(id)) == NULL) + sudo_fatal(NULL); + debug_return_bool(true); +} + +/* + * Respond to a ServerError message from the server. + * Always returns false. + */ +static bool +handle_server_error(char *errmsg, struct client_closure *closure) +{ + debug_decl(handle_server_error, SUDOERS_DEBUG_UTIL); + + sudo_warnx(U_("error message received from server: %s"), errmsg); + debug_return_bool(false); +} + +/* + * Respond to a ServerAbort message from the server. + * Always returns false. + */ +static bool +handle_server_abort(char *errmsg, struct client_closure *closure) +{ + debug_decl(handle_server_abort, SUDOERS_DEBUG_UTIL); + + sudo_warnx(U_("abort message received from server: %s"), errmsg); + debug_return_bool(false); +} + +/* + * Respond to a ServerMessage from the server. + * Returns true on success, false on error. + */ +static bool +handle_server_message(uint8_t *buf, size_t len, + struct client_closure *closure) +{ + ServerMessage *msg; + bool ret = false; + debug_decl(handle_server_message, SUDOERS_DEBUG_UTIL); + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: unpacking ServerMessage", __func__); + msg = server_message__unpack(NULL, len, buf); + if (msg == NULL) { + sudo_warnx("%s", U_("unable to unpack ServerMessage")); + debug_return_bool(false); + } + + switch (msg->type_case) { + case SERVER_MESSAGE__TYPE_HELLO: + if (handle_server_hello(msg->u.hello, closure)) { + if ((ret = fmt_initial_message(closure))) { + if (closure->write_ev->add(closure->write_ev, + &closure->log_details->server_timeout) == -1) { + sudo_warn("%s", U_("unable to add event to queue")); + ret = false; + } + } + } + break; + case SERVER_MESSAGE__TYPE_COMMIT_POINT: + ret = handle_commit_point(msg->u.commit_point, closure); + break; + case SERVER_MESSAGE__TYPE_LOG_ID: + ret = handle_log_id(msg->u.log_id, closure); + break; + case SERVER_MESSAGE__TYPE_ERROR: + ret = handle_server_error(msg->u.error, closure); + closure->state = ERROR; + break; + case SERVER_MESSAGE__TYPE_ABORT: + ret = handle_server_abort(msg->u.abort, closure); + closure->state = ERROR; + break; + default: + sudo_warnx(U_("%s: unexpected type_case value %d"), + __func__, msg->type_case); + break; + } + + server_message__free_unpacked(msg, NULL); + debug_return_bool(ret); +} + +/* + * Expand buf as needed or just reset it. + * XXX - share with logsrvd/sendlog + */ +static bool +expand_buf(struct connection_buffer *buf, unsigned int needed) +{ + void *newdata; + debug_decl(expand_buf, SUDOERS_DEBUG_UTIL); + + if (buf->size < needed) { + /* Expand buffer. */ + needed = sudo_pow2_roundup(needed); + if ((newdata = malloc(needed)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + if (buf->off > 0) + memcpy(newdata, buf->data + buf->off, buf->len - buf->off); + free(buf->data); + buf->data = newdata; + buf->size = needed; + } else { + /* Just reset existing buffer. */ + if (buf->off > 0) { + memmove(buf->data, buf->data + buf->off, + buf->len - buf->off); + } + } + buf->len -= buf->off; + buf->off = 0; + + debug_return_bool(true); +} + +/* + * Read and unpack a ServerMessage (read callback). + */ +static void +server_msg_cb(int fd, int what, void *v) +{ + struct client_closure *closure = v; + struct connection_buffer *buf = &closure->read_buf; + ssize_t nread; + uint32_t msg_len; + debug_decl(server_msg_cb, SUDOERS_DEBUG_UTIL); + + /* For TLS we may need to read as part of SSL_write(). */ + if (closure->write_instead_of_read) { + closure->write_instead_of_read = false; + client_msg_cb(fd, what, v); + debug_return; + } + + if (what == SUDO_PLUGIN_EV_TIMEOUT) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: timed out reading from server", + __func__); + goto bad; + } + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: reading ServerMessage", __func__); +#if defined(HAVE_OPENSSL) + if (closure->ssl != NULL) { + nread = SSL_read(closure->ssl, buf->data + buf->len, buf->size - buf->len); + if (nread <= 0) { + const char *errstr; + int err; + + switch (SSL_get_error(closure->ssl, nread)) { + case SSL_ERROR_ZERO_RETURN: + /* ssl connection shutdown cleanly */ + nread = 0; + break; + case SSL_ERROR_WANT_READ: + /* ssl wants to read more, read event is always active */ + sudo_debug_printf(SUDO_DEBUG_NOTICE|SUDO_DEBUG_LINENO, + "SSL_read returns SSL_ERROR_WANT_READ"); + debug_return; + case SSL_ERROR_WANT_WRITE: + /* ssl wants to write, so schedule the write handler */ + sudo_debug_printf(SUDO_DEBUG_NOTICE|SUDO_DEBUG_LINENO, + "SSL_read returns SSL_ERROR_WANT_WRITE"); + if (!closure->write_ev->pending(closure->write_ev, + SUDO_PLUGIN_EV_WRITE, NULL)) { + /* Enable a temporary write event. */ + if (closure->write_ev->add(closure->write_ev, NULL) == -1) { + sudo_warn("%s", U_("unable to add event to queue")); + goto bad; + } + closure->temporary_write_event = true; + } + /* Redirect write event to finish SSL_read() */ + closure->read_instead_of_write = true; + debug_return; + case SSL_ERROR_SSL: + /* + * For TLS 1.3, if the cert verify function on the server + * returns an error, OpenSSL will send an internal error + * alert when we read ServerHello. Convert to a more useful + * message and hope that no actual internal error occurs. + */ + err = ERR_get_error(); + if (closure->state == RECV_HELLO && + ERR_GET_REASON(err) == SSL_R_TLSV1_ALERT_INTERNAL_ERROR) { + errstr = "host name does not match certificate"; + } else { + errstr = ERR_reason_error_string(err); + } + sudo_warnx("%s", errstr); + goto bad; + case SSL_ERROR_SYSCALL: + if (nread == 0) + sudo_warnx("%s", U_("lost connection to log server")); + else + sudo_warn("recv"); + goto bad; + default: + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx("recv: %s", errstr); + goto bad; + } + } + } else +#endif /* HAVE_OPENSSL */ + { + nread = recv(fd, buf->data + buf->len, buf->size - buf->len, 0); + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: received %zd bytes from server", + __func__, nread); + switch (nread) { + case -1: + if (errno == EAGAIN) + debug_return; + sudo_warn("recv"); + goto bad; + case 0: + sudo_warnx("%s", U_("lost connection to log server")); + goto bad; + default: + break; + } + buf->len += nread; + + while (buf->len - buf->off >= sizeof(msg_len)) { + /* Read wire message size (uint32_t in network byte order). */ + memcpy(&msg_len, buf->data + buf->off, sizeof(msg_len)); + msg_len = ntohl(msg_len); + + if (msg_len > MESSAGE_SIZE_MAX) { + sudo_warnx(U_("server message too large: %u"), msg_len); + goto bad; + } + + if (msg_len + sizeof(msg_len) > buf->len - buf->off) { + /* Incomplete message, we'll read the rest next time. */ + if (!expand_buf(buf, msg_len + sizeof(msg_len))) + goto bad; + debug_return; + } + + /* Parse ServerMessage, could be zero bytes. */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: parsing ServerMessage, size %u", __func__, msg_len); + buf->off += sizeof(msg_len); + if (!handle_server_message(buf->data + buf->off, msg_len, closure)) + goto bad; + buf->off += msg_len; + } + buf->len -= buf->off; + buf->off = 0; + debug_return; +bad: + if (closure->log_details->ignore_log_errors) { + /* Disable plugin, the command continues. */ + closure->disabled = true; + closure->read_ev->del(closure->read_ev); + } else { + /* Break out of sudo event loop and kill the command. */ + closure->read_ev->loopbreak(closure->read_ev); + } + debug_return; +} + +/* + * Send a ClientMessage to the server (write callback). + */ +static void +client_msg_cb(int fd, int what, void *v) +{ + struct client_closure *closure = v; + struct connection_buffer *buf; + ssize_t nwritten; + debug_decl(client_msg_cb, SUDOERS_DEBUG_UTIL); + + /* For TLS we may need to write as part of SSL_read(). */ + if (closure->read_instead_of_write) { + closure->read_instead_of_write = false; + /* Delete write event if it was only due to SSL_read(). */ + if (closure->temporary_write_event) { + closure->temporary_write_event = false; + closure->write_ev->del(closure->write_ev); + } + server_msg_cb(fd, what, v); + debug_return; + } + + if (what == SUDO_PLUGIN_EV_TIMEOUT) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: timed out writing to server", + __func__); + goto bad; + } + + if ((buf = TAILQ_FIRST(&closure->write_bufs)) == NULL) { + sudo_warnx("%s", U_("missing write buffer")); + goto bad; + } + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: sending %u bytes to server", __func__, buf->len - buf->off); + +#if defined(HAVE_OPENSSL) + if (closure->ssl != NULL) { + nwritten = SSL_write(closure->ssl, buf->data + buf->off, buf->len - buf->off); + if (nwritten <= 0) { + const char *errstr; + + switch (SSL_get_error(closure->ssl, nwritten)) { + case SSL_ERROR_ZERO_RETURN: + /* ssl connection shutdown */ + goto bad; + case SSL_ERROR_WANT_READ: + /* ssl wants to read, read event always active */ + sudo_debug_printf(SUDO_DEBUG_NOTICE|SUDO_DEBUG_LINENO, + "SSL_write returns SSL_ERROR_WANT_READ"); + /* Redirect read event to finish SSL_write() */ + closure->write_instead_of_read = true; + debug_return; + case SSL_ERROR_WANT_WRITE: + /* ssl wants to write more, write event remains active */ + sudo_debug_printf(SUDO_DEBUG_NOTICE|SUDO_DEBUG_LINENO, + "SSL_write returns SSL_ERROR_WANT_WRITE"); + debug_return; + case SSL_ERROR_SSL: + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx("%s", errstr); + goto bad; + case SSL_ERROR_SYSCALL: + sudo_warn("send"); + goto bad; + default: + errstr = ERR_reason_error_string(ERR_get_error()); + sudo_warnx("send: %s", errstr); + goto bad; + } + } + } else +#endif /* HAVE_OPENSSL */ + { + nwritten = send(fd, buf->data + buf->off, buf->len - buf->off, 0); + } + + if (nwritten == -1) { + sudo_warn("send"); + goto bad; + } + buf->off += nwritten; + + if (buf->off == buf->len) { + /* sent entire message, move buf to free list */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: finished sending %u bytes to server", __func__, buf->len); + buf->off = 0; + buf->len = 0; + TAILQ_REMOVE(&closure->write_bufs, buf, entries); + TAILQ_INSERT_TAIL(&closure->free_bufs, buf, entries); + if (TAILQ_EMPTY(&closure->write_bufs)) { + /* Write queue empty, check for state change. */ + closure->write_ev->del(closure->write_ev); + if (!client_message_completion(closure)) + goto bad; + } + } + debug_return; + +bad: + if (closure->log_details->ignore_log_errors) { + /* Disable plugin, the command continues. */ + closure->disabled = true; + closure->write_ev->del(closure->read_ev); + closure->write_ev->del(closure->write_ev); + } else { + /* Break out of sudo event loop and kill the command. */ + closure->write_ev->loopbreak(closure->write_ev); + } + debug_return; +} + +/* + * Allocate and initialize a new client closure + */ +static struct client_closure * +client_closure_alloc(struct log_details *details, struct timespec *now, + bool log_io, enum client_state initial_state, const char *reason, + struct sudo_plugin_event * (*event_alloc)(void)) +{ + struct client_closure *closure; + debug_decl(client_closure_alloc, SUDOERS_DEBUG_UTIL); + + if ((closure = calloc(1, sizeof(*closure))) == NULL) + goto oom; + + closure->sock = -1; + closure->log_io = log_io; + closure->reason = reason; + closure->state = RECV_HELLO; + closure->initial_state = initial_state; + + closure->start_time.tv_sec = now->tv_sec; + closure->start_time.tv_nsec = now->tv_nsec; + + closure->read_buf.size = 64 * 1024; + closure->read_buf.data = malloc(closure->read_buf.size); + if (closure->read_buf.data == NULL) + goto oom; + + TAILQ_INIT(&closure->write_bufs); + TAILQ_INIT(&closure->free_bufs); + + if ((closure->read_ev = event_alloc()) == NULL) + goto oom; + + if ((closure->write_ev = event_alloc()) == NULL) + goto oom; + + closure->log_details = details; + + debug_return_ptr(closure); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + client_closure_free(closure); + closure = NULL; + debug_return_ptr(NULL); +} + +struct client_closure * +log_server_open(struct log_details *details, struct timespec *now, + bool log_io, enum client_state initial_state, const char *reason, + struct sudo_plugin_event * (*event_alloc)(void)) +{ + struct client_closure *closure; + debug_decl(log_server_open, SUDOERS_DEBUG_UTIL); + + closure = client_closure_alloc(details, now, log_io, initial_state, + reason, event_alloc); + if (closure == NULL) + goto bad; + + /* Connect to log first available log server. */ + if (!log_server_connect(closure)) { + /* TODO: support offline logs if server unreachable */ + sudo_warn("%s", U_("unable to connect to log server")); + goto bad; + } + + /* Read ServerHello synchronously or fail. */ + if (read_server_hello(closure)) + debug_return_ptr(closure); + +bad: + client_closure_free(closure); + debug_return_ptr(NULL); +} + +/* + * Send ExitMessage, wait for final commit message and free closure. + */ +bool +log_server_close(struct client_closure *closure, int exit_status, int error) +{ + struct sudo_event_base *evbase = NULL; + bool ret = false; + debug_decl(log_server_close, SUDOERS_DEBUG_UTIL); + + if (closure->disabled) + goto done; + + /* Format and append an ExitMessage to the write queue. */ + if (!fmt_exit_message(closure, exit_status, error)) + goto done; + + /* + * Create private event base and reparent the read/write events. + * We cannot use the main sudo event loop as it has already exited. + */ + if ((evbase = sudo_ev_base_alloc()) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + + /* Enable read event to receive server messages. */ + closure->read_ev->setbase(closure->read_ev, evbase); + if (closure->read_ev->add(closure->read_ev, + &closure->log_details->server_timeout) == -1) { + sudo_warn("%s", U_("unable to add event to queue")); + goto done; + } + + /* Enable the write event to write the ExitMessage. */ + closure->write_ev->setbase(closure->write_ev, evbase); + if (closure->write_ev->add(closure->write_ev, + &closure->log_details->server_timeout) == -1) { + sudo_warn("%s", U_("unable to add event to queue")); + goto done; + } + + /* Loop until queues are flushed and final commit point received. */ + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "flushing buffers and waiting for final commit point"); + if (sudo_ev_dispatch(evbase) == -1 || sudo_ev_got_break(evbase)) { + sudo_warnx("%s", U_("error in event loop")); + goto done; + } + + ret = true; + +done: + sudo_ev_base_free(evbase); + client_closure_free(closure); + debug_return_bool(ret); +} + +#endif /* SUDOERS_LOG_CLIENT */ diff --git a/plugins/sudoers/log_client.h b/plugins/sudoers/log_client.h new file mode 100644 index 0000000..cb8a7a6 --- /dev/null +++ b/plugins/sudoers/log_client.h @@ -0,0 +1,124 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2019-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_LOG_CLIENT_H +#define SUDOERS_LOG_CLIENT_H + +#include /* for INET6?_ADDRSTRLEN */ +#if defined(HAVE_OPENSSL) +# include +#endif /* HAVE_OPENSSL */ + +#include "log_server.pb-c.h" +#include "strlist.h" + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error protobuf-c version 1.30 or higher required +#endif + +/* Default ports to listen on */ +#define DEFAULT_PORT "30343" +#define DEFAULT_PORT_TLS "30344" + +/* Maximum message size (2Mb) */ +#define MESSAGE_SIZE_MAX (2 * 1024 * 1024) + +/* TODO - share with logsrvd/sendlog */ +struct connection_buffer { + TAILQ_ENTRY(connection_buffer) entries; + uint8_t *data; + unsigned int size; + unsigned int len; + unsigned int off; +}; +TAILQ_HEAD(connection_buffer_list, connection_buffer); + +struct log_details { + struct eventlog *evlog; + struct sudoers_str_list *log_servers; + struct timespec server_timeout; +#if defined(HAVE_OPENSSL) + char *ca_bundle; + char *cert_file; + char *key_file; +#endif /* HAVE_OPENSSL */ + bool keepalive; + bool verify_server; + bool ignore_log_errors; +}; + +enum client_state { + ERROR, + RECV_HELLO, + SEND_RESTART, /* TODO: currently unimplemented */ + SEND_ACCEPT, + SEND_ALERT, + SEND_REJECT, + SEND_IO, + SEND_EXIT, + CLOSING, + FINISHED +}; + +/* Remote connection closure, non-zero fields must come first. */ +struct client_closure { + int sock; + bool read_instead_of_write; + bool write_instead_of_read; + bool temporary_write_event; + bool disabled; + bool log_io; + char *server_name; +#if defined(HAVE_STRUCT_IN6_ADDR) + char server_ip[INET6_ADDRSTRLEN]; +#else + char server_ip[INET_ADDRSTRLEN]; +#endif +#if defined(HAVE_OPENSSL) + SSL_CTX *ssl_ctx; + SSL *ssl; + bool ssl_initialized; +#endif /* HAVE_OPENSSL */ + enum client_state state; + enum client_state initial_state; /* XXX - bad name */ + struct connection_buffer_list write_bufs; + struct connection_buffer_list free_bufs; + struct connection_buffer read_buf; + struct sudo_plugin_event *read_ev; + struct sudo_plugin_event *write_ev; + struct log_details *log_details; + struct timespec start_time; + struct timespec elapsed; + struct timespec committed; + char *iolog_id; + const char *reason; +}; + +/* iolog_client.c */ +struct client_closure *log_server_open(struct log_details *details, struct timespec *now, bool log_io, enum client_state initial_state, const char *reason, struct sudo_plugin_event * (*event_alloc)(void)); +bool log_server_close(struct client_closure *closure, int exit_status, int error); +bool fmt_client_message(struct client_closure *closure, ClientMessage *msg); +bool fmt_exit_message(struct client_closure *closure, int exit_status, int error); +bool fmt_io_buf(struct client_closure *closure, int type, const char *buf, unsigned int len, struct timespec *delay); +bool fmt_suspend(struct client_closure *closure, const char *signame, struct timespec *delay); +bool fmt_winsize(struct client_closure *closure, unsigned int lines, unsigned int cols, struct timespec *delay); +bool log_server_connect(struct client_closure *closure); +void client_closure_free(struct client_closure *closure); +bool read_server_hello(struct client_closure *closure); + +#endif /* SUDOERS_LOG_CLIENT_H */ diff --git a/plugins/sudoers/logging.c b/plugins/sudoers/logging.c new file mode 100644 index 0000000..776f881 --- /dev/null +++ b/plugins/sudoers/logging.c @@ -0,0 +1,821 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1994-1996, 1998-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#ifdef __TANDEM +# include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_NL_LANGINFO +# include +#endif /* HAVE_NL_LANGINFO */ +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef HAVE_GETADDRINFO +# include "compat/getaddrinfo.h" +#endif + +#include "sudoers.h" +#include "log_client.h" + +static bool should_mail(int); +static bool warned = false; + +extern struct policy_plugin sudoers_policy; /* XXX */ + +#ifdef SUDOERS_LOG_CLIENT +/* + * Convert a defaults-style list to a stringlist. + */ +static struct sudoers_str_list * +list_to_strlist(struct list_members *list) +{ + struct sudoers_str_list *strlist; + struct sudoers_string *str; + struct list_member *item; + debug_decl(slist_to_strlist, SUDOERS_DEBUG_LOGGING); + + if ((strlist = str_list_alloc()) == NULL) + goto oom; + + SLIST_FOREACH(item, list, entries) { + if ((str = sudoers_string_alloc(item->value)) == NULL) + goto oom; + /* List is in reverse order, insert at head to fix that. */ + STAILQ_INSERT_HEAD(strlist, str, entries); + } + + debug_return_ptr(strlist); +oom: + str_list_free(strlist); + debug_return_ptr(NULL); +} + +bool +init_log_details(struct log_details *details, struct eventlog *evlog) +{ + struct sudoers_str_list *log_servers = NULL; + debug_decl(init_log_details, SUDOERS_DEBUG_LOGGING); + + memset(details, 0, sizeof(*details)); + + if ((log_servers = list_to_strlist(&def_log_servers)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + + details->evlog = evlog; + details->ignore_log_errors = def_ignore_logfile_errors; + details->log_servers = log_servers; + details->server_timeout.tv_sec = def_log_server_timeout; + details->keepalive = def_log_server_keepalive; +#if defined(HAVE_OPENSSL) + details->ca_bundle = def_log_server_cabundle; + details->cert_file = def_log_server_peer_cert; + details->key_file = def_log_server_peer_key; + details->verify_server = def_log_server_verify; +#endif /* HAVE_OPENSSL */ + + debug_return_bool(true); +} + +bool +log_server_reject(struct eventlog *evlog, const char *message, + struct sudo_plugin_event * (*event_alloc)(void)) +{ + struct client_closure *client_closure; + struct log_details details; + bool ret = false; + debug_decl(log_server_reject, SUDOERS_DEBUG_LOGGING); + + if (SLIST_EMPTY(&def_log_servers)) + debug_return_bool(true); + + if (!init_log_details(&details, evlog)) + debug_return_bool(false); + + /* Open connection to log server, send hello and reject messages. */ + client_closure = log_server_open(&details, &sudo_user.submit_time, false, + SEND_REJECT, message, event_alloc); + if (client_closure != NULL) { + client_closure_free(client_closure); + ret = true; + } + + /* Only the log_servers string list is dynamically allocated. */ + str_list_free(details.log_servers); + debug_return_bool(ret); +} + +bool +log_server_alert(struct eventlog *evlog, struct timespec *now, + const char *message, const char *errstr, + struct sudo_plugin_event * (*event_alloc)(void)) +{ + struct client_closure *client_closure; + struct log_details details; + char *emessage = NULL; + bool ret = false; + debug_decl(log_server_alert, SUDOERS_DEBUG_LOGGING); + + if (SLIST_EMPTY(&def_log_servers)) + debug_return_bool(true); + + if (!init_log_details(&details, evlog)) + goto done; + + if (errstr != NULL) { + if (asprintf(&emessage, _("%s: %s"), message, errstr) == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + } + + /* Open connection to log server, send hello and alert messages. */ + client_closure = log_server_open(&details, now, false, + SEND_ALERT, emessage ? emessage : message, event_alloc); + if (client_closure != NULL) { + client_closure_free(client_closure); + ret = true; + } + +done: + /* Only the log_servers string list is dynamically allocated. */ + free(emessage); + str_list_free(details.log_servers); + debug_return_bool(ret); +} +#else +bool +log_server_reject(struct eventlog *evlog, const char *message, + struct sudo_plugin_event * (*event_alloc)(void)) +{ + return true; +} + +bool +log_server_alert(struct eventlog *evlog, struct timespec *now, + const char *message, const char *errstr, + struct sudo_plugin_event * (*event_alloc)(void)) +{ + return true; +} +#endif /* SUDOERS_LOG_CLIENT */ + +/* + * Log a reject event to syslog, a log file, sudo_logsrvd and/or email. + */ +static bool +log_reject(const char *message, bool logit, bool mailit) +{ + int evl_flags = 0; + struct eventlog evlog; + bool ret = true; + debug_decl(log_reject, SUDOERS_DEBUG_LOGGING); + + if (mailit) { + SET(evl_flags, EVLOG_MAIL); + if (!logit) + SET(evl_flags, EVLOG_MAIL_ONLY); + } + sudoers_to_eventlog(&evlog, NewArgv, env_get()); + if (!eventlog_reject(&evlog, evl_flags, message, NULL, NULL)) + ret = false; + + if (!log_server_reject(&evlog, message, sudoers_policy.event_alloc)) + ret = false; + + debug_return_bool(ret); +} + +/* + * Log, audit and mail the denial message, optionally informing the user. + */ +bool +log_denial(int status, bool inform_user) +{ + const char *message; + int oldlocale; + bool mailit, ret = true; + debug_decl(log_denial, SUDOERS_DEBUG_LOGGING); + + /* Send mail based on status. */ + mailit = should_mail(status); + + /* Set error message. */ + if (ISSET(status, FLAG_NO_USER)) + message = N_("user NOT in sudoers"); + else if (ISSET(status, FLAG_NO_HOST)) + message = N_("user NOT authorized on host"); + else + message = N_("command not allowed"); + + /* Do auditing first (audit_failure() handles the locale itself). */ + audit_failure(NewArgv, "%s", message); + + if (def_log_denied || mailit) { + /* Log and mail messages should be in the sudoers locale. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + if (!log_reject(message, def_log_denied, mailit)) + ret = false; + + /* Restore locale. */ + sudoers_setlocale(oldlocale, NULL); + } + + /* Inform the user of the failure (in their locale). */ + if (inform_user) { + sudoers_setlocale(SUDOERS_LOCALE_USER, &oldlocale); + + if (ISSET(status, FLAG_NO_USER)) { + sudo_printf(SUDO_CONV_ERROR_MSG, _("%s is not in the sudoers " + "file. This incident will be reported.\n"), user_name); + } else if (ISSET(status, FLAG_NO_HOST)) { + sudo_printf(SUDO_CONV_ERROR_MSG, _("%s is not allowed to run sudo " + "on %s. This incident will be reported.\n"), + user_name, user_srunhost); + } else if (ISSET(status, FLAG_NO_CHECK)) { + sudo_printf(SUDO_CONV_ERROR_MSG, _("Sorry, user %s may not run " + "sudo on %s.\n"), user_name, user_srunhost); + } else { + sudo_printf(SUDO_CONV_ERROR_MSG, _("Sorry, user %s is not allowed " + "to execute '%s%s%s' as %s%s%s on %s.\n"), + user_name, user_cmnd, user_args ? " " : "", + user_args ? user_args : "", + list_pw ? list_pw->pw_name : runas_pw ? + runas_pw->pw_name : user_name, runas_gr ? ":" : "", + runas_gr ? runas_gr->gr_name : "", user_host); + } + sudoers_setlocale(oldlocale, NULL); + } + debug_return_bool(ret); +} + +/* + * Log and audit that user was not allowed to run the command. + */ +bool +log_failure(int status, int flags) +{ + bool ret, inform_user = true; + debug_decl(log_failure, SUDOERS_DEBUG_LOGGING); + + /* The user doesn't always get to see the log message (path info). */ + if (!ISSET(status, FLAG_NO_USER | FLAG_NO_HOST) && def_path_info && + (flags == NOT_FOUND_DOT || flags == NOT_FOUND)) + inform_user = false; + ret = log_denial(status, inform_user); + + if (!inform_user) { + /* + * We'd like to not leak path info at all here, but that can + * *really* confuse the users. To really close the leak we'd + * have to say "not allowed to run foo" even when the problem + * is just "no foo in path" since the user can trivially set + * their path to just contain a single dir. + */ + if (flags == NOT_FOUND) + sudo_warnx(U_("%s: command not found"), user_cmnd); + else if (flags == NOT_FOUND_DOT) + sudo_warnx(U_("ignoring \"%s\" found in '.'\nUse \"sudo ./%s\" if this is the \"%s\" you wish to run."), user_cmnd, user_cmnd, user_cmnd); + } + + debug_return_bool(ret); +} + +/* + * Format an authentication failure message, using either + * authfail_message from sudoers or a locale-specific message. + */ +static int +fmt_authfail_message(char **str, unsigned int tries) +{ + char *src, *dst0, *dst, *dst_end; + size_t size; + int len; + debug_decl(fmt_authfail_message, SUDOERS_DEBUG_LOGGING); + + if (def_authfail_message == NULL) { + debug_return_int(asprintf(str, ngettext("%u incorrect password attempt", + "%u incorrect password attempts", tries), tries)); + } + + src = def_authfail_message; + size = strlen(src) + 33; + if ((dst0 = dst = malloc(size)) == NULL) + debug_return_int(-1); + dst_end = dst + size; + + /* Always leave space for the terminating NUL. */ + while (*src != '\0' && dst + 1 < dst_end) { + if (src[0] == '%') { + switch (src[1]) { + case '%': + src++; + break; + case 'd': + len = snprintf(dst, dst_end - dst, "%u", tries); + if (len < 0 || len >= (int)(dst_end - dst)) + goto done; + dst += len; + src += 2; + continue; + default: + break; + } + } + *dst++ = *src++; + } +done: + *dst = '\0'; + + *str = dst0; +#ifdef __clang_analyzer__ + /* clang analyzer false positive */ + if (__builtin_expect(dst < dst0, 0)) + __builtin_trap(); +#endif + debug_return_int(dst - dst0); +} + +/* + * Log and audit that user was not able to authenticate themselves. + */ +bool +log_auth_failure(int status, unsigned int tries) +{ + char *message = NULL; + int oldlocale; + bool ret = true; + bool mailit = false; + bool logit = true; + debug_decl(log_auth_failure, SUDOERS_DEBUG_LOGGING); + + /* Do auditing first (audit_failure() handles the locale itself). */ + audit_failure(NewArgv, "%s", N_("authentication failure")); + + /* If sudoers denied the command we'll log that separately. */ + if (!ISSET(status, FLAG_BAD_PASSWORD|FLAG_NON_INTERACTIVE)) + logit = false; + + /* + * Do we need to send mail? + * We want to avoid sending multiple messages for the same command + * so if we are going to send an email about the denial, that takes + * precedence. + */ + if (ISSET(status, VALIDATE_SUCCESS)) { + /* Command allowed, auth failed; do we need to send mail? */ + if (def_mail_badpass || def_mail_always) + mailit = true; + if (!def_log_denied) + logit = false; + } else { + /* Command denied, auth failed; make sure we don't send mail twice. */ + if (def_mail_badpass && !should_mail(status)) + mailit = true; + /* Don't log the bad password message, we'll log a denial instead. */ + logit = false; + } + + if (logit || mailit) { + /* Log and mail messages should be in the sudoers locale. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + if (ISSET(status, FLAG_BAD_PASSWORD)) { + if (fmt_authfail_message(&message, tries) == -1) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + ret = false; + } else { + ret = log_reject(message, logit, mailit); + free(message); + } + } else { + ret = log_reject(_("a password is required"), logit, mailit); + } + + /* Restore locale. */ + sudoers_setlocale(oldlocale, NULL); + } + + /* Inform the user if they failed to authenticate (in their locale). */ + sudoers_setlocale(SUDOERS_LOCALE_USER, &oldlocale); + + if (ISSET(status, FLAG_BAD_PASSWORD)) { + if (fmt_authfail_message(&message, tries) == -1) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + ret = false; + } else { + sudo_warnx("%s", message); + free(message); + } + } else { + sudo_warnx("%s", _("a password is required")); + } + + sudoers_setlocale(oldlocale, NULL); + + debug_return_bool(ret); +} + +/* + * Log and potentially mail the allowed command. + */ +bool +log_allowed(void) +{ + struct eventlog evlog; + int oldlocale; + int evl_flags = 0; + bool mailit, ret = true; + debug_decl(log_allowed, SUDOERS_DEBUG_LOGGING); + + /* Send mail based on status. */ + mailit = should_mail(VALIDATE_SUCCESS); + + if (def_log_allowed || mailit) { + /* Log and mail messages should be in the sudoers locale. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + sudoers_to_eventlog(&evlog, NewArgv, env_get()); + if (mailit) { + SET(evl_flags, EVLOG_MAIL); + if (!def_log_allowed) + SET(evl_flags, EVLOG_MAIL_ONLY); + } + if (!eventlog_accept(&evlog, evl_flags, NULL, NULL)) + ret = false; + + sudoers_setlocale(oldlocale, NULL); + } + + debug_return_bool(ret); +} + +/* + * Perform logging for log_warning()/log_warningx(). + */ +static bool +vlog_warning(int flags, int errnum, const char *fmt, va_list ap) +{ + struct eventlog evlog; + struct timespec now; + const char *errstr = NULL; + char *message; + bool ret = true; + int len, oldlocale; + int evl_flags = 0; + va_list ap2; + debug_decl(vlog_warning, SUDOERS_DEBUG_LOGGING); + + /* Do auditing first (audit_failure() handles the locale itself). */ + if (ISSET(flags, SLOG_AUDIT)) { + va_copy(ap2, ap); + vaudit_failure(NewArgv, fmt, ap2); + va_end(ap2); + } + + /* Need extra copy of ap for sudo_vwarn()/sudo_vwarnx() below. */ + va_copy(ap2, ap); + + /* Log messages should be in the sudoers locale. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + /* Expand printf-style format + args. */ + len = vasprintf(&message, _(fmt), ap); + if (len == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = false; + goto done; + } + + if (ISSET(flags, SLOG_USE_ERRNO)) + errstr = strerror(errnum); + else if (ISSET(flags, SLOG_GAI_ERRNO)) + errstr = gai_strerror(errnum); + + /* Log to debug file. */ + if (errstr != NULL) { + sudo_debug_printf2(NULL, NULL, 0, + SUDO_DEBUG_WARN|sudo_debug_subsys, "%s: %s", message, errstr); + } else { + sudo_debug_printf2(NULL, NULL, 0, + SUDO_DEBUG_WARN|sudo_debug_subsys, "%s", message); + } + + if (ISSET(flags, SLOG_SEND_MAIL) || !ISSET(flags, SLOG_NO_LOG)) { + if (sudo_gettime_real(&now) == -1) { + sudo_warn("%s", U_("unable to get time of day")); + goto done; + } + if (ISSET(flags, SLOG_RAW_MSG)) + SET(evl_flags, EVLOG_RAW); + if (ISSET(flags, SLOG_SEND_MAIL)) { + SET(evl_flags, EVLOG_MAIL); + if (ISSET(flags, SLOG_NO_LOG)) + SET(evl_flags, EVLOG_MAIL_ONLY); + } + sudoers_to_eventlog(&evlog, NewArgv, env_get()); + eventlog_alert(&evlog, evl_flags, &now, message, errstr); + + log_server_alert(&evlog, &now, message, errstr, + sudoers_policy.event_alloc); + } + + /* + * Tell the user (in their locale). + */ + if (!ISSET(flags, SLOG_NO_STDERR)) { + sudoers_setlocale(SUDOERS_LOCALE_USER, NULL); + if (ISSET(flags, SLOG_USE_ERRNO)) { + errno = errnum; + sudo_vwarn_nodebug(_(fmt), ap2); + } else if (ISSET(flags, SLOG_GAI_ERRNO)) { + sudo_gai_vwarn_nodebug(errnum, _(fmt), ap2); + } else { + sudo_vwarnx_nodebug(_(fmt), ap2); + } + } + +done: + va_end(ap2); + sudoers_setlocale(oldlocale, NULL); + + debug_return_bool(ret); +} + +bool +log_warning(int flags, const char *fmt, ...) +{ + va_list ap; + bool ret; + debug_decl(log_warning, SUDOERS_DEBUG_LOGGING); + + /* Log the error. */ + va_start(ap, fmt); + ret = vlog_warning(flags|SLOG_USE_ERRNO, errno, fmt, ap); + va_end(ap); + + debug_return_bool(ret); +} + +bool +log_warningx(int flags, const char *fmt, ...) +{ + va_list ap; + bool ret; + debug_decl(log_warningx, SUDOERS_DEBUG_LOGGING); + + /* Log the error. */ + va_start(ap, fmt); + ret = vlog_warning(flags, 0, fmt, ap); + va_end(ap); + + debug_return_bool(ret); +} + +bool +gai_log_warning(int flags, int errnum, const char *fmt, ...) +{ + va_list ap; + bool ret; + debug_decl(gai_log_warning, SUDOERS_DEBUG_LOGGING); + + /* Log the error. */ + va_start(ap, fmt); + ret = vlog_warning(flags|SLOG_GAI_ERRNO, errnum, fmt, ap); + va_end(ap); + + debug_return_bool(ret); +} + +/* + * Determine whether we should send mail based on "status" and defaults options. + */ +static bool +should_mail(int status) +{ + debug_decl(should_mail, SUDOERS_DEBUG_LOGGING); + + debug_return_bool(def_mail_always || ISSET(status, VALIDATE_ERROR) || + (def_mail_all_cmnds && ISSET(sudo_mode, (MODE_RUN|MODE_EDIT))) || + (def_mail_no_user && ISSET(status, FLAG_NO_USER)) || + (def_mail_no_host && ISSET(status, FLAG_NO_HOST)) || + (def_mail_no_perms && !ISSET(status, VALIDATE_SUCCESS))); +} + +/* + * Build a struct eventlog from sudoers data. + * The values in the resulting eventlog struct should not be freed. + */ +void +sudoers_to_eventlog(struct eventlog *evlog, char * const argv[], + char * const envp[]) +{ + struct group *grp; + debug_decl(sudoers_to_eventlog, SUDOERS_DEBUG_LOGGING); + + /* We rely on the reference held by the group cache. */ + if ((grp = sudo_getgrgid(sudo_user.pw->pw_gid)) != NULL) + sudo_gr_delref(grp); + + memset(evlog, 0, sizeof(*evlog)); + evlog->iolog_file = sudo_user.iolog_file; + evlog->iolog_path = sudo_user.iolog_path; + evlog->command = safe_cmnd ? safe_cmnd : (argv ? argv[0] : NULL); + evlog->cwd = user_cwd; + if (def_runchroot != NULL && strcmp(def_runchroot, "*") != 0) { + evlog->runchroot = def_runchroot; + } + if (def_runcwd && strcmp(def_runcwd, "*") != 0) { + evlog->runcwd = def_runcwd; + } else if (ISSET(sudo_mode, MODE_LOGIN_SHELL) && runas_pw != NULL) { + evlog->runcwd = runas_pw->pw_dir; + } else { + evlog->runcwd = user_cwd; + } + evlog->rungroup = runas_gr ? runas_gr->gr_name : sudo_user.runas_group; + evlog->submithost = user_host; + evlog->submituser = user_name; + if (grp != NULL) + evlog->submitgroup = grp->gr_name; + evlog->ttyname = user_ttypath; + evlog->argv = (char **)argv; + evlog->env_add = (char **)sudo_user.env_vars; + evlog->envp = (char **)envp; + evlog->submit_time = sudo_user.submit_time; + evlog->lines = sudo_user.lines; + evlog->columns = sudo_user.cols; + if (runas_pw != NULL) { + evlog->rungid = runas_pw->pw_gid; + evlog->runuid = runas_pw->pw_uid; + evlog->runuser = runas_pw->pw_name; + } else { + evlog->rungid = (gid_t)-1; + evlog->runuid = (uid_t)-1; + evlog->runuser = sudo_user.runas_user; + } + + debug_return; +} + +static FILE * +sudoers_log_open(int type, const char *log_file) +{ + bool uid_changed; + FILE *fp = NULL; + mode_t oldmask; + int fd, flags; + char *omode; + debug_decl(sudoers_log_open, SUDOERS_DEBUG_LOGGING); + + switch (type) { + case EVLOG_SYSLOG: + openlog("sudo", def_syslog_pid ? LOG_PID : 0, def_syslog); + break; + case EVLOG_FILE: + /* Open log file as root, mode 0600 (cannot append to JSON). */ + if (def_log_format == json) { + flags = O_RDWR|O_CREAT; + omode = "w"; + } else { + flags = O_WRONLY|O_APPEND|O_CREAT; + omode = "a"; + } + oldmask = umask(S_IRWXG|S_IRWXO); + uid_changed = set_perms(PERM_ROOT); + fd = open(log_file, flags, S_IRUSR|S_IWUSR); + if (uid_changed && !restore_perms()) { + if (fd != -1) { + close(fd); + fd = -1; + } + } + (void) umask(oldmask); + if (fd == -1 || (fp = fdopen(fd, omode)) == NULL) { + if (!warned) { + warned = true; + log_warning(SLOG_SEND_MAIL|SLOG_NO_LOG, + N_("unable to open log file: %s"), log_file); + } + if (fd != -1) + close(fd); + } + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unsupported log type %d", type); + break; + } + + debug_return_ptr(fp); +} + +static void +sudoers_log_close(int type, FILE *fp) +{ + debug_decl(sudoers_log_close, SUDOERS_DEBUG_LOGGING); + + switch (type) { + case EVLOG_SYSLOG: + break; + case EVLOG_FILE: + if (fp == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "tried to close NULL log stream"); + break; + } + (void)fflush(fp); + if (ferror(fp) && !warned) { + warned = true; + log_warning(SLOG_SEND_MAIL|SLOG_NO_LOG, + N_("unable to write log file: %s"), def_logfile); + } + fclose(fp); + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unsupported log type %d", type); + break; + } + + debug_return; +} + +void +init_eventlog_config(void) +{ + int logtype = 0; +#ifdef NO_ROOT_MAILER + uid_t mailuid = user_uid; +#else + uid_t mailuid = ROOT_UID; +#endif + debug_decl(init_eventlog_config, SUDOERS_DEBUG_LOGGING); + + if (def_syslog) + logtype |= EVLOG_SYSLOG; + if (def_logfile) + logtype |= EVLOG_FILE; + + eventlog_set_type(logtype); + eventlog_set_format(def_log_format == sudo ? EVLOG_SUDO : EVLOG_JSON); + eventlog_set_syslog_acceptpri(def_syslog_goodpri); + eventlog_set_syslog_rejectpri(def_syslog_badpri); + eventlog_set_syslog_alertpri(def_syslog_badpri); + eventlog_set_syslog_maxlen(def_syslog_maxlen); + eventlog_set_file_maxlen(def_loglinelen); + eventlog_set_mailuid(mailuid); + eventlog_set_omit_hostname(!def_log_host); + eventlog_set_logpath(def_logfile); + eventlog_set_time_fmt(def_log_year ? "%h %e %T %Y" : "%h %e %T"); + eventlog_set_mailerpath(def_mailerpath); + eventlog_set_mailerflags(def_mailerflags); + eventlog_set_mailfrom(def_mailfrom); + eventlog_set_mailto(def_mailto); + eventlog_set_mailsub(def_mailsub); + eventlog_set_open_log(sudoers_log_open); + eventlog_set_close_log(sudoers_log_close); + + debug_return; +} diff --git a/plugins/sudoers/logging.h b/plugins/sudoers/logging.h new file mode 100644 index 0000000..029b561 --- /dev/null +++ b/plugins/sudoers/logging.h @@ -0,0 +1,74 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2009-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_LOGGING_H +#define SUDOERS_LOGGING_H + +#include + +/* + * Values for sudoers_setlocale() + */ +#define SUDOERS_LOCALE_USER 0 +#define SUDOERS_LOCALE_SUDOERS 1 + +/* Logging types */ +#define SLOG_SYSLOG 0x01 +#define SLOG_FILE 0x02 +#define SLOG_BOTH 0x03 + +/* Flags for log_warning()/log_warningx() */ +#define SLOG_USE_ERRNO 0x01 /* internal use only */ +#define SLOG_GAI_ERRNO 0x02 /* internal use only */ +#define SLOG_RAW_MSG 0x04 /* do not format msg before logging */ +#define SLOG_SEND_MAIL 0x08 /* log via mail */ +#define SLOG_NO_STDERR 0x10 /* do not log via stderr */ +#define SLOG_NO_LOG 0x20 /* do not log via file or syslog */ +#define SLOG_AUDIT 0x40 /* send message to audit as well */ + +/* XXX - needed for auditing */ +extern int NewArgc; +extern char **NewArgv; +extern char *audit_msg; + +union sudo_defs_val; +struct sudo_plugin_event; +struct log_details; + +bool sudoers_warn_setlocale(bool restore, int *cookie); +bool sudoers_setlocale(int locale_type, int *prev_locale); +int sudoers_getlocale(void); +int audit_failure(char *const argv[], char const *const fmt, ...) __printflike(2, 3); +int vaudit_failure(char *const argv[], char const *const fmt, va_list ap) __printflike(2, 0); +bool log_allowed(void); +bool log_auth_failure(int status, unsigned int tries); +bool log_denial(int status, bool inform_user); +bool log_failure(int status, int flags); +bool log_server_alert(struct eventlog *evlog, struct timespec *now, const char *message, const char *errstr, struct sudo_plugin_event * (*event_alloc)(void)); +bool log_server_reject(struct eventlog *evlog, const char *message, struct sudo_plugin_event * (*event_alloc)(void)); +bool log_warning(int flags, const char *fmt, ...) __printflike(2, 3); +bool log_warningx(int flags, const char *fmt, ...) __printflike(2, 3); +bool gai_log_warning(int flags, int errnum, const char *fmt, ...) __printflike(3, 4); +bool sudoers_initlocale(const char *ulocale, const char *slocale); +bool sudoers_locale_callback(const union sudo_defs_val *); +void sudoers_to_eventlog(struct eventlog *evlog, char * const argv[], char *const envp[]); +void init_eventlog_config(void); +bool init_log_details(struct log_details *details, struct eventlog *evlog); + +#endif /* SUDOERS_LOGGING_H */ diff --git a/plugins/sudoers/match.c b/plugins/sudoers/match.c new file mode 100644 index 0000000..eb77cf2 --- /dev/null +++ b/plugins/sudoers/match.c @@ -0,0 +1,675 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#ifdef HAVE_SYS_SYSTEMINFO_H +# include +#endif +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef HAVE_NETGROUP_H +# include +#else +# include +#endif /* HAVE_NETGROUP_H */ +#include +#include +#include +#include +#include +#ifdef HAVE_FNMATCH +# include +#else +# include "compat/fnmatch.h" +#endif /* HAVE_FNMATCH */ + +#include "sudoers.h" +#include + +static struct member_list empty = TAILQ_HEAD_INITIALIZER(empty); + +/* + * Check whether user described by pw matches member. + * Returns ALLOW, DENY or UNSPEC. + */ +int +user_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, + const struct member *m) +{ + const char *lhost = parse_tree->lhost ? parse_tree->lhost : user_runhost; + const char *shost = parse_tree->shost ? parse_tree->shost : user_srunhost; + int matched = UNSPEC; + struct alias *a; + debug_decl(user_matches, SUDOERS_DEBUG_MATCH); + + switch (m->type) { + case ALL: + matched = !m->negated; + break; + case NETGROUP: + if (netgr_matches(m->name, + def_netgroup_tuple ? lhost : NULL, + def_netgroup_tuple ? shost : NULL, pw->pw_name)) + matched = !m->negated; + break; + case USERGROUP: + if (usergr_matches(m->name, pw->pw_name, pw)) + matched = !m->negated; + break; + case ALIAS: + if ((a = alias_get(parse_tree, m->name, USERALIAS)) != NULL) { + /* XXX */ + int rc = userlist_matches(parse_tree, pw, &a->members); + if (rc != UNSPEC) + matched = m->negated ? !rc : rc; + alias_put(a); + break; + } + FALLTHROUGH; + case WORD: + if (userpw_matches(m->name, pw->pw_name, pw)) + matched = !m->negated; + break; + } + debug_return_int(matched); +} + +/* + * Check for user described by pw in a list of members. + * Returns ALLOW, DENY or UNSPEC. + */ +int +userlist_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, + const struct member_list *list) +{ + struct member *m; + int matched = UNSPEC; + debug_decl(userlist_matches, SUDOERS_DEBUG_MATCH); + + TAILQ_FOREACH_REVERSE(m, list, member_list, entries) { + if ((matched = user_matches(parse_tree, pw, m)) != UNSPEC) + break; + } + debug_return_int(matched); +} + +struct gid_list * +runas_getgroups(void) +{ + const struct passwd *pw; + debug_decl(runas_getgroups, SUDOERS_DEBUG_MATCH); + + if (def_preserve_groups) { + sudo_gidlist_addref(user_gid_list); + debug_return_ptr(user_gid_list); + } + + /* Only use results from a group db query, not the front end. */ + pw = runas_pw ? runas_pw : sudo_user.pw; + debug_return_ptr(sudo_get_gidlist(pw, ENTRY_TYPE_QUERIED)); +} + +/* + * Check for user described by pw in a list of members. + * If both lists are empty compare against def_runas_default. + * Returns ALLOW, DENY or UNSPEC. + */ +int +runaslist_matches(struct sudoers_parse_tree *parse_tree, + const struct member_list *user_list, const struct member_list *group_list, + struct member **matching_user, struct member **matching_group) +{ + const char *lhost = parse_tree->lhost ? parse_tree->lhost : user_runhost; + const char *shost = parse_tree->shost ? parse_tree->shost : user_srunhost; + int user_matched = UNSPEC; + int group_matched = UNSPEC; + struct member *m; + struct alias *a; + int rc; + debug_decl(runaslist_matches, SUDOERS_DEBUG_MATCH); + + if (ISSET(sudo_user.flags, RUNAS_USER_SPECIFIED) || !ISSET(sudo_user.flags, RUNAS_GROUP_SPECIFIED)) { + /* If no runas user or runas group listed in sudoers, use default. */ + if (user_list == NULL && group_list == NULL) { + debug_return_int(userpw_matches(def_runas_default, + runas_pw->pw_name, runas_pw)); + } + + if (user_list != NULL) { + TAILQ_FOREACH_REVERSE(m, user_list, member_list, entries) { + switch (m->type) { + case ALL: + user_matched = !m->negated; + break; + case NETGROUP: + if (netgr_matches(m->name, + def_netgroup_tuple ? lhost : NULL, + def_netgroup_tuple ? shost : NULL, + runas_pw->pw_name)) + user_matched = !m->negated; + break; + case USERGROUP: + if (usergr_matches(m->name, runas_pw->pw_name, runas_pw)) + user_matched = !m->negated; + break; + case ALIAS: + a = alias_get(parse_tree, m->name, RUNASALIAS); + if (a != NULL) { + rc = runaslist_matches(parse_tree, &a->members, + &empty, matching_user, NULL); + if (rc != UNSPEC) + user_matched = m->negated ? !rc : rc; + alias_put(a); + break; + } + FALLTHROUGH; + case WORD: + if (userpw_matches(m->name, runas_pw->pw_name, runas_pw)) + user_matched = !m->negated; + break; + case MYSELF: + if (!ISSET(sudo_user.flags, RUNAS_USER_SPECIFIED) || + strcmp(user_name, runas_pw->pw_name) == 0) + user_matched = !m->negated; + break; + } + if (user_matched != UNSPEC) { + if (matching_user != NULL && m->type != ALIAS) + *matching_user = m; + break; + } + } + } + } + + /* + * Skip checking runas group if none was specified. + */ + if (ISSET(sudo_user.flags, RUNAS_GROUP_SPECIFIED)) { + if (user_matched == UNSPEC) { + if (strcmp(user_name, runas_pw->pw_name) == 0) + user_matched = ALLOW; /* only changing group */ + } + if (group_list != NULL) { + TAILQ_FOREACH_REVERSE(m, group_list, member_list, entries) { + switch (m->type) { + case ALL: + group_matched = !m->negated; + break; + case ALIAS: + a = alias_get(parse_tree, m->name, RUNASALIAS); + if (a != NULL) { + rc = runaslist_matches(parse_tree, &empty, + &a->members, NULL, matching_group); + if (rc != UNSPEC) + group_matched = m->negated ? !rc : rc; + alias_put(a); + break; + } + FALLTHROUGH; + case WORD: + if (group_matches(m->name, runas_gr)) + group_matched = !m->negated; + break; + } + if (group_matched != UNSPEC) { + if (matching_group != NULL && m->type != ALIAS) + *matching_group = m; + break; + } + } + } + if (group_matched == UNSPEC) { + struct gid_list *runas_groups; + /* + * The runas group was not explicitly allowed by sudoers. + * Check whether it is one of the target user's groups. + */ + if (runas_pw->pw_gid == runas_gr->gr_gid) { + group_matched = ALLOW; /* runas group matches passwd db */ + } else if ((runas_groups = runas_getgroups()) != NULL) { + int i; + + for (i = 0; i < runas_groups->ngids; i++) { + if (runas_groups->gids[i] == runas_gr->gr_gid) { + group_matched = ALLOW; /* matched aux group vector */ + break; + } + } + sudo_gidlist_delref(runas_groups); + } + } + } + + if (user_matched == DENY || group_matched == DENY) + debug_return_int(DENY); + if (user_matched == group_matched || runas_gr == NULL) + debug_return_int(user_matched); + debug_return_int(UNSPEC); +} + +/* + * Check for lhost and shost in a list of members. + * Returns ALLOW, DENY or UNSPEC. + */ +static int +hostlist_matches_int(struct sudoers_parse_tree *parse_tree, + const struct passwd *pw, const char *lhost, const char *shost, + const struct member_list *list) +{ + struct member *m; + int matched = UNSPEC; + debug_decl(hostlist_matches, SUDOERS_DEBUG_MATCH); + + TAILQ_FOREACH_REVERSE(m, list, member_list, entries) { + matched = host_matches(parse_tree, pw, lhost, shost, m); + if (matched != UNSPEC) + break; + } + debug_return_int(matched); +} + +/* + * Check for user_runhost and user_srunhost in a list of members. + * Returns ALLOW, DENY or UNSPEC. + */ +int +hostlist_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, + const struct member_list *list) +{ + const char *lhost = parse_tree->lhost ? parse_tree->lhost : user_runhost; + const char *shost = parse_tree->shost ? parse_tree->shost : user_srunhost; + + return hostlist_matches_int(parse_tree, pw, lhost, shost, list); +} + +/* + * Check whether host or shost matches member. + * Returns ALLOW, DENY or UNSPEC. + */ +int +host_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, + const char *lhost, const char *shost, const struct member *m) +{ + struct alias *a; + int matched = UNSPEC; + debug_decl(host_matches, SUDOERS_DEBUG_MATCH); + + switch (m->type) { + case ALL: + matched = !m->negated; + break; + case NETGROUP: + if (netgr_matches(m->name, lhost, shost, + def_netgroup_tuple ? pw->pw_name : NULL)) + matched = !m->negated; + break; + case NTWKADDR: + if (addr_matches(m->name)) + matched = !m->negated; + break; + case ALIAS: + a = alias_get(parse_tree, m->name, HOSTALIAS); + if (a != NULL) { + /* XXX */ + int rc = hostlist_matches_int(parse_tree, pw, lhost, shost, + &a->members); + if (rc != UNSPEC) + matched = m->negated ? !rc : rc; + alias_put(a); + break; + } + FALLTHROUGH; + case WORD: + if (hostname_matches(shost, lhost, m->name)) + matched = !m->negated; + break; + } + debug_return_int(matched); +} + +/* + * Check for cmnd and args in a list of members. + * Returns ALLOW, DENY or UNSPEC. + */ +int +cmndlist_matches(struct sudoers_parse_tree *parse_tree, + const struct member_list *list, const char *runchroot, + struct cmnd_info *info) +{ + struct member *m; + int matched = UNSPEC; + debug_decl(cmndlist_matches, SUDOERS_DEBUG_MATCH); + + TAILQ_FOREACH_REVERSE(m, list, member_list, entries) { + matched = cmnd_matches(parse_tree, m, runchroot, info); + if (matched != UNSPEC) + break; + } + debug_return_int(matched); +} + +/* + * Check cmnd and args. + * Returns ALLOW, DENY or UNSPEC. + */ +int +cmnd_matches(struct sudoers_parse_tree *parse_tree, const struct member *m, + const char *runchroot, struct cmnd_info *info) +{ + struct alias *a; + struct sudo_command *c; + int rc, matched = UNSPEC; + debug_decl(cmnd_matches, SUDOERS_DEBUG_MATCH); + + switch (m->type) { + case ALL: + if (m->name == NULL) { + matched = !m->negated; + break; + } + FALLTHROUGH; + case COMMAND: + c = (struct sudo_command *)m->name; + if (command_matches(c->cmnd, c->args, runchroot, info, &c->digests)) + matched = !m->negated; + break; + case ALIAS: + a = alias_get(parse_tree, m->name, CMNDALIAS); + if (a != NULL) { + rc = cmndlist_matches(parse_tree, &a->members, runchroot, info); + if (rc != UNSPEC) + matched = m->negated ? !rc : rc; + alias_put(a); + } + break; + } + debug_return_int(matched); +} + +/* + * Returns true if the hostname matches the pattern, else false + */ +bool +hostname_matches(const char *shost, const char *lhost, const char *pattern) +{ + const char *host; + bool rc; + debug_decl(hostname_matches, SUDOERS_DEBUG_MATCH); + + host = strchr(pattern, '.') != NULL ? lhost : shost; + if (has_meta(pattern)) { + rc = !fnmatch(pattern, host, FNM_CASEFOLD); + } else { + rc = !strcasecmp(host, pattern); + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "host %s matches sudoers pattern %s: %s", + host, pattern, rc ? "true" : "false"); + debug_return_bool(rc); +} + +/* + * Returns true if the user/uid from sudoers matches the specified user/uid, + * else returns false. + */ +bool +userpw_matches(const char *sudoers_user, const char *user, const struct passwd *pw) +{ + const char *errstr; + uid_t uid; + bool rc; + debug_decl(userpw_matches, SUDOERS_DEBUG_MATCH); + + if (pw != NULL && *sudoers_user == '#') { + uid = (uid_t) sudo_strtoid(sudoers_user + 1, &errstr); + if (errstr == NULL && uid == pw->pw_uid) { + rc = true; + goto done; + } + } + if (def_case_insensitive_user) + rc = strcasecmp(sudoers_user, user) == 0; + else + rc = strcmp(sudoers_user, user) == 0; +done: + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "user %s matches sudoers user %s: %s", + user, sudoers_user, rc ? "true" : "false"); + debug_return_bool(rc); +} + +/* + * Returns true if the group/gid from sudoers matches the specified group/gid, + * else returns false. + */ +bool +group_matches(const char *sudoers_group, const struct group *gr) +{ + const char *errstr; + gid_t gid; + bool rc; + debug_decl(group_matches, SUDOERS_DEBUG_MATCH); + + if (*sudoers_group == '#') { + gid = (gid_t) sudo_strtoid(sudoers_group + 1, &errstr); + if (errstr == NULL && gid == gr->gr_gid) { + rc = true; + goto done; + } + } + if (def_case_insensitive_group) + rc = strcasecmp(sudoers_group, gr->gr_name) == 0; + else + rc = strcmp(sudoers_group, gr->gr_name) == 0; +done: + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "group %s matches sudoers group %s: %s", + gr->gr_name, sudoers_group, rc ? "true" : "false"); + debug_return_bool(rc); +} + +/* + * Returns true if the given user belongs to the named group, + * else returns false. + */ +bool +usergr_matches(const char *group, const char *user, const struct passwd *pw) +{ + bool matched = false; + struct passwd *pw0 = NULL; + debug_decl(usergr_matches, SUDOERS_DEBUG_MATCH); + + /* Make sure we have a valid usergroup, sudo style */ + if (*group++ != '%') { + sudo_debug_printf(SUDO_DEBUG_DIAG, "user group %s has no leading '%%'", + group); + goto done; + } + + /* Query group plugin for %:name groups. */ + if (*group == ':' && def_group_plugin) { + if (group_plugin_query(user, group + 1, pw) == true) + matched = true; + goto done; + } + + /* Look up user's primary gid in the passwd file. */ + if (pw == NULL) { + if ((pw0 = sudo_getpwnam(user)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_DIAG, "unable to find %s in passwd db", + user); + goto done; + } + pw = pw0; + } + + if (user_in_group(pw, group)) { + matched = true; + goto done; + } + + /* Query the group plugin for Unix groups too? */ + if (def_group_plugin && def_always_query_group_plugin) { + if (group_plugin_query(user, group, pw) == true) { + matched = true; + goto done; + } + } + +done: + if (pw0 != NULL) + sudo_pw_delref(pw0); + + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "user %s matches group %s: %s", user, group, matched ? "true" : "false"); + debug_return_bool(matched); +} + +#if defined(HAVE_GETDOMAINNAME) || defined(SI_SRPC_DOMAIN) +/* + * Check the domain for invalid characters. + * Linux getdomainname(2) returns (none) if no domain is set. + */ +static bool +valid_domain(const char *domain) +{ + const char *cp; + debug_decl(valid_domain, SUDOERS_DEBUG_MATCH); + + for (cp = domain; *cp != '\0'; cp++) { + /* Check for illegal characters, Linux may use "(none)". */ + if (*cp == '(' || *cp == ')' || *cp == ',' || *cp == ' ') + break; + } + if (cp == domain || *cp != '\0') + debug_return_bool(false); + debug_return_bool(true); +} + +/* + * Get NIS-style domain name and copy from static storage or NULL if none. + */ +const char * +sudo_getdomainname(void) +{ + static char *domain; + static bool initialized; + debug_decl(sudo_getdomainname, SUDOERS_DEBUG_MATCH); + + if (!initialized) { + size_t host_name_max; + int rc; + +# ifdef _SC_HOST_NAME_MAX + host_name_max = (size_t)sysconf(_SC_HOST_NAME_MAX); + if (host_name_max == (size_t)-1) +# endif + host_name_max = 255; /* POSIX and historic BSD */ + + domain = malloc(host_name_max + 1); + if (domain != NULL) { + domain[0] = '\0'; +# ifdef SI_SRPC_DOMAIN + rc = sysinfo(SI_SRPC_DOMAIN, domain, host_name_max + 1); +# else + rc = getdomainname(domain, host_name_max + 1); +# endif + if (rc == -1 || !valid_domain(domain)) { + /* Error or invalid domain name. */ + free(domain); + domain = NULL; + } + } else { + /* XXX - want to pass error back to caller */ + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + } + initialized = true; + } + debug_return_str(domain); +} +#else +const char * +sudo_getdomainname(void) +{ + debug_decl(sudo_getdomainname, SUDOERS_DEBUG_MATCH); + debug_return_ptr(NULL); +} +#endif /* HAVE_GETDOMAINNAME || SI_SRPC_DOMAIN */ + +/* + * Returns true if "host" and "user" belong to the netgroup "netgr", + * else return false. Either of "lhost", "shost" or "user" may be NULL + * in which case that argument is not checked... + */ +bool +netgr_matches(const char *netgr, const char *lhost, const char *shost, const char *user) +{ +#ifdef HAVE_INNETGR + const char *domain; +#endif + bool rc = false; + debug_decl(netgr_matches, SUDOERS_DEBUG_MATCH); + + if (!def_use_netgroups) { + sudo_debug_printf(SUDO_DEBUG_INFO, "netgroups are disabled"); + debug_return_bool(false); + } + +#ifdef HAVE_INNETGR + /* make sure we have a valid netgroup, sudo style */ + if (*netgr++ != '+') { + sudo_debug_printf(SUDO_DEBUG_DIAG, "netgroup %s has no leading '+'", + netgr); + debug_return_bool(false); + } + + /* get the domain name (if any) */ + domain = sudo_getdomainname(); + + if (innetgr(netgr, lhost, user, domain)) + rc = true; + else if (lhost != shost && innetgr(netgr, shost, user, domain)) + rc = true; + + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "netgroup %s matches (%s|%s, %s, %s): %s", netgr, lhost ? lhost : "", + shost ? shost : "", user ? user : "", domain ? domain : "", + rc ? "true" : "false"); +#endif /* HAVE_INNETGR */ + + debug_return_bool(rc); +} diff --git a/plugins/sudoers/match_addr.c b/plugins/sudoers/match_addr.c new file mode 100644 index 0000000..714c41c --- /dev/null +++ b/plugins/sudoers/match_addr.c @@ -0,0 +1,208 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef NEED_RESOLV_H +# include +# include +#endif /* NEED_RESOLV_H */ + +#include "sudoers.h" +#include "interfaces.h" + +static bool +addr_matches_if(const char *n) +{ + union sudo_in_addr_un addr; + struct interface *ifp; +#ifdef HAVE_STRUCT_IN6_ADDR + unsigned int j; +#endif + unsigned int family; + debug_decl(addr_matches_if, SUDOERS_DEBUG_MATCH); + +#ifdef HAVE_STRUCT_IN6_ADDR + if (inet_pton(AF_INET6, n, &addr.ip6) == 1) { + family = AF_INET6; + } else +#endif /* HAVE_STRUCT_IN6_ADDR */ + if (inet_pton(AF_INET, n, &addr.ip4) == 1) { + family = AF_INET; + } else { + debug_return_bool(false); + } + + SLIST_FOREACH(ifp, get_interfaces(), entries) { + if (ifp->family != family) + continue; + switch (family) { + case AF_INET: + if (ifp->addr.ip4.s_addr == addr.ip4.s_addr || + (ifp->addr.ip4.s_addr & ifp->netmask.ip4.s_addr) + == addr.ip4.s_addr) + debug_return_bool(true); + break; +#ifdef HAVE_STRUCT_IN6_ADDR + case AF_INET6: + if (memcmp(ifp->addr.ip6.s6_addr, addr.ip6.s6_addr, + sizeof(addr.ip6.s6_addr)) == 0) + debug_return_bool(true); + for (j = 0; j < sizeof(addr.ip6.s6_addr); j++) { + if ((ifp->addr.ip6.s6_addr[j] & ifp->netmask.ip6.s6_addr[j]) != addr.ip6.s6_addr[j]) + break; + } + if (j == sizeof(addr.ip6.s6_addr)) + debug_return_bool(true); + break; +#endif /* HAVE_STRUCT_IN6_ADDR */ + } + } + + debug_return_bool(false); +} + +static bool +addr_matches_if_netmask(const char *n, const char *m) +{ + unsigned int i; + union sudo_in_addr_un addr, mask; + struct interface *ifp; +#ifdef HAVE_STRUCT_IN6_ADDR + unsigned int j; +#endif + unsigned int family; + const char *errstr; + debug_decl(addr_matches_if, SUDOERS_DEBUG_MATCH); + +#ifdef HAVE_STRUCT_IN6_ADDR + if (inet_pton(AF_INET6, n, &addr.ip6) == 1) + family = AF_INET6; + else +#endif /* HAVE_STRUCT_IN6_ADDR */ + if (inet_pton(AF_INET, n, &addr.ip4) == 1) { + family = AF_INET; + } else { + debug_return_bool(false); + } + + if (family == AF_INET) { + if (strchr(m, '.')) { + if (inet_pton(AF_INET, m, &mask.ip4) != 1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "IPv4 netmask %s: %s", m, "invalid value"); + debug_return_bool(false); + } + } else { + i = sudo_strtonum(m, 1, 32, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "IPv4 netmask %s: %s", m, errstr); + debug_return_bool(false); + } + mask.ip4.s_addr = htonl(0xffffffffU << (32 - i)); + } + addr.ip4.s_addr &= mask.ip4.s_addr; + } +#ifdef HAVE_STRUCT_IN6_ADDR + else { + if (inet_pton(AF_INET6, m, &mask.ip6) != 1) { + j = sudo_strtonum(m, 1, 128, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "IPv6 netmask %s: %s", m, errstr); + debug_return_bool(false); + } + for (i = 0; i < sizeof(addr.ip6.s6_addr); i++) { + if (j < i * 8) + mask.ip6.s6_addr[i] = 0; + else if (i * 8 + 8 <= j) + mask.ip6.s6_addr[i] = 0xff; + else + mask.ip6.s6_addr[i] = 0xff00 >> (j - i * 8); + addr.ip6.s6_addr[i] &= mask.ip6.s6_addr[i]; + } + } + } +#endif /* HAVE_STRUCT_IN6_ADDR */ + + SLIST_FOREACH(ifp, get_interfaces(), entries) { + if (ifp->family != family) + continue; + switch (family) { + case AF_INET: + if ((ifp->addr.ip4.s_addr & mask.ip4.s_addr) == addr.ip4.s_addr) + debug_return_bool(true); + break; +#ifdef HAVE_STRUCT_IN6_ADDR + case AF_INET6: + for (j = 0; j < sizeof(addr.ip6.s6_addr); j++) { + if ((ifp->addr.ip6.s6_addr[j] & mask.ip6.s6_addr[j]) != addr.ip6.s6_addr[j]) + break; + } + if (j == sizeof(addr.ip6.s6_addr)) + debug_return_bool(true); + break; +#endif /* HAVE_STRUCT_IN6_ADDR */ + } + } + + debug_return_bool(false); +} + +/* + * Returns true if "n" is one of our ip addresses or if + * "n" is a network that we are on, else returns false. + */ +bool +addr_matches(char *n) +{ + char *m; + bool rc; + debug_decl(addr_matches, SUDOERS_DEBUG_MATCH); + + /* If there's an explicit netmask, use it. */ + if ((m = strchr(n, '/'))) { + *m++ = '\0'; + rc = addr_matches_if_netmask(n, m); + *(m - 1) = '/'; + } else + rc = addr_matches_if(n); + + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "IP address %s matches local host: %s", n, rc ? "true" : "false"); + debug_return_bool(rc); +} diff --git a/plugins/sudoers/match_command.c b/plugins/sudoers/match_command.c new file mode 100644 index 0000000..ff8e8dc --- /dev/null +++ b/plugins/sudoers/match_command.c @@ -0,0 +1,674 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#ifdef HAVE_GLOB +# include +#else +# include "compat/glob.h" +#endif /* HAVE_GLOB */ +#include +#include +#include +#ifdef HAVE_FNMATCH +# include +#else +# include "compat/fnmatch.h" +#endif /* HAVE_FNMATCH */ + +#include "sudoers.h" +#include + +#if !defined(O_EXEC) && defined(O_PATH) +# define O_EXEC O_PATH +#endif + +static bool +command_args_match(const char *sudoers_cmnd, const char *sudoers_args) +{ + int flags = 0; + debug_decl(command_args_match, SUDOERS_DEBUG_MATCH); + + /* + * If no args specified in sudoers, any user args are allowed. + * If the empty string is specified in sudoers, no user args are allowed. + */ + if (!sudoers_args || (!user_args && !strcmp("\"\"", sudoers_args))) + debug_return_bool(true); + + /* + * If args are specified in sudoers, they must match the user args. + * If running as sudoedit, all args are assumed to be paths. + */ + if (strcmp(sudoers_cmnd, "sudoedit") == 0) + flags = FNM_PATHNAME; + if (fnmatch(sudoers_args, user_args ? user_args : "", flags) == 0) + debug_return_bool(true); + + debug_return_bool(false); +} + +/* + * Stat file by fd is possible, else by path. + * Returns true on success, else false. + */ +static bool +do_stat(int fd, const char *path, const char *runchroot, struct stat *sb) +{ + char pathbuf[PATH_MAX]; + debug_decl(do_stat, SUDOERS_DEBUG_MATCH); + + if (fd != -1) + debug_return_bool(fstat(fd, sb) == 0); + + /* Make path relative to the new root, if any. */ + if (runchroot != NULL) { + const int len = + snprintf(pathbuf, sizeof(pathbuf), "%s%s", runchroot, path); + if (len >= ssizeof(pathbuf)) { + errno = ENAMETOOLONG; + debug_return_bool(false); + } + path = pathbuf; + } + debug_return_bool(stat(path, sb) == 0); +} + +/* + * Check whether the fd refers to a shell script with a "#!" shebang. + */ +static bool +is_script(int fd) +{ + bool ret = false; + char magic[2]; + debug_decl(is_script, SUDOERS_DEBUG_MATCH); + + if (pread(fd, magic, 2, 0) == 2) { + if (magic[0] == '#' && magic[1] == '!') + ret = true; + } + debug_return_int(ret); +} + +/* + * Open path if fdexec is enabled or if a digest is present. + * Returns false on error, else true. + */ +static bool +open_cmnd(const char *path, const char *runchroot, + const struct command_digest_list *digests, int *fdp) +{ + int fd = -1; + char pathbuf[PATH_MAX]; + debug_decl(open_cmnd, SUDOERS_DEBUG_MATCH); + + /* Only open the file for fdexec or for digest matching. */ + if (def_fdexec != always && TAILQ_EMPTY(digests)) + debug_return_bool(true); + + /* Make path relative to the new root, if any. */ + if (runchroot != NULL) { + const int len = + snprintf(pathbuf, sizeof(pathbuf), "%s%s", runchroot, path); + if (len >= ssizeof(pathbuf)) { + errno = ENAMETOOLONG; + debug_return_bool(false); + } + path = pathbuf; + } + + fd = open(path, O_RDONLY|O_NONBLOCK); +# ifdef O_EXEC + if (fd == -1 && errno == EACCES && TAILQ_EMPTY(digests)) { + /* Try again with O_EXEC if no digest is specified. */ + const int saved_errno = errno; + if ((fd = open(path, O_EXEC)) == -1) + errno = saved_errno; + } +# endif + if (fd == -1) + debug_return_bool(false); + + (void)fcntl(fd, F_SETFD, FD_CLOEXEC); + *fdp = fd; + debug_return_bool(true); +} + +static void +set_cmnd_fd(int fd) +{ + debug_decl(set_cmnd_fd, SUDOERS_DEBUG_MATCH); + + if (cmnd_fd != -1) + close(cmnd_fd); + + if (fd != -1) { + if (def_fdexec == never) { + /* Never use fexedcve() */ + close(fd); + fd = -1; + } else if (is_script(fd)) { + char fdpath[PATH_MAX]; + struct stat sb; + int flags; + + /* We can only use fexecve() on a script if /dev/fd/N exists. */ + (void)snprintf(fdpath, sizeof(fdpath), "/dev/fd/%d", fd); + if (stat(fdpath, &sb) != 0) { + /* Missing /dev/fd file, can't use fexecve(). */ + close(fd); + fd = -1; + } else { + /* + * Shell scripts go through namei twice so we can't have the + * close on exec flag set on the fd for fexecve(2). + */ + flags = fcntl(fd, F_GETFD) & ~FD_CLOEXEC; + (void)fcntl(fd, F_SETFD, flags); + } + } + } + + cmnd_fd = fd; + + debug_return; +} + +/* + * Return true if user_cmnd names one of the inodes in dir, else false. + */ +static bool +command_matches_dir(const char *sudoers_dir, size_t dlen, const char *runchroot, + const struct command_digest_list *digests) +{ + char buf[PATH_MAX], sdbuf[PATH_MAX]; + struct stat sudoers_stat; + struct dirent *dent; + size_t chrootlen = 0; + int fd = -1; + DIR *dirp; + debug_decl(command_matches_dir, SUDOERS_DEBUG_MATCH); + + /* Make sudoers_dir relative to the new root, if any. */ + if (runchroot != NULL) { + const int len = + snprintf(sdbuf, sizeof(sdbuf), "%s%s", runchroot, sudoers_dir); + if (len >= ssizeof(sdbuf)) { + errno = ENAMETOOLONG; + debug_return_bool(false); + } + sudoers_dir = sdbuf; + chrootlen = strlen(runchroot); + } + + /* + * Grot through directory entries, looking for user_base. + */ + dirp = opendir(sudoers_dir); + if (dirp == NULL) + debug_return_bool(false); + + if (strlcpy(buf, sudoers_dir, sizeof(buf)) >= sizeof(buf)) { + closedir(dirp); + debug_return_bool(false); + } + while ((dent = readdir(dirp)) != NULL) { + if (fd != -1) { + close(fd); + fd = -1; + } + + /* ignore paths > PATH_MAX (XXX - log) */ + buf[dlen] = '\0'; + if (strlcat(buf, dent->d_name, sizeof(buf)) >= sizeof(buf)) + continue; + + /* only stat if basenames are the same */ + if (strcmp(user_base, dent->d_name) != 0) + continue; + + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(buf, NULL, digests, &fd)) + continue; + if (!do_stat(fd, buf, NULL, &sudoers_stat)) + continue; + + if (user_stat == NULL || + (user_stat->st_dev == sudoers_stat.st_dev && + user_stat->st_ino == sudoers_stat.st_ino)) { + /* buf is already relative to runchroot */ + if (!digest_matches(fd, buf, NULL, digests)) + continue; + free(safe_cmnd); + if ((safe_cmnd = strdup(buf + chrootlen)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + dent = NULL; + } + break; + } + } + closedir(dirp); + + if (dent != NULL) { + set_cmnd_fd(fd); + debug_return_bool(true); + } + if (fd != -1) + close(fd); + debug_return_bool(false); +} + +static bool +command_matches_all(const char *runchroot, + const struct command_digest_list *digests) +{ + struct stat sb; /* XXX - unused */ + int fd = -1; + debug_decl(command_matches_all, SUDOERS_DEBUG_MATCH); + + if (user_cmnd[0] == '/') { + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(user_cmnd, runchroot, digests, &fd)) + goto bad; + if (!do_stat(fd, user_cmnd, runchroot, &sb)) + goto bad; + } + + /* Check digest of user_cmnd since we have no sudoers_cmnd for ALL. */ + if (!digest_matches(fd, user_cmnd, runchroot, digests)) + goto bad; + set_cmnd_fd(fd); + + /* No need to set safe_cmnd for ALL. */ + debug_return_bool(true); +bad: + if (fd != -1) { + close(fd); + fd = -1; + } + debug_return_bool(false); +} + +static bool +command_matches_fnmatch(const char *sudoers_cmnd, const char *sudoers_args, + const char *runchroot, const struct command_digest_list *digests) +{ + struct stat sb; /* XXX - unused */ + int fd = -1; + debug_decl(command_matches_fnmatch, SUDOERS_DEBUG_MATCH); + + /* + * Return true if fnmatch(3) succeeds AND + * a) there are no args in sudoers OR + * b) there are no args on command line and none required by sudoers OR + * c) there are args in sudoers and on command line and they match + * else return false. + * + * Neither sudoers_cmnd nor user_cmnd are relative to runchroot. + */ + if (fnmatch(sudoers_cmnd, user_cmnd, FNM_PATHNAME) != 0) + debug_return_bool(false); + if (command_args_match(sudoers_cmnd, sudoers_args)) { + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(user_cmnd, runchroot, digests, &fd)) + goto bad; + if (!do_stat(fd, user_cmnd, runchroot, &sb)) + goto bad; + /* Check digest of user_cmnd since sudoers_cmnd is a pattern. */ + if (!digest_matches(fd, user_cmnd, runchroot, digests)) + goto bad; + set_cmnd_fd(fd); + + /* No need to set safe_cmnd since user_cmnd matches sudoers_cmnd */ + debug_return_bool(true); +bad: + if (fd != -1) { + close(fd); + fd = -1; + } + debug_return_bool(false); + } + debug_return_bool(false); +} + +static bool +command_matches_glob(const char *sudoers_cmnd, const char *sudoers_args, + const char *runchroot, const struct command_digest_list *digests) +{ + struct stat sudoers_stat; + bool bad_digest = false; + char **ap, *base, *cp; + char pathbuf[PATH_MAX]; + int fd = -1; + size_t dlen, chrootlen = 0; + glob_t gl; + debug_decl(command_matches_glob, SUDOERS_DEBUG_MATCH); + + /* + * First check to see if we can avoid the call to glob(3). + * Short circuit if there are no meta chars in the command itself + * and user_base and basename(sudoers_cmnd) don't match. + */ + dlen = strlen(sudoers_cmnd); + if (sudoers_cmnd[dlen - 1] != '/') { + if ((base = strrchr(sudoers_cmnd, '/')) != NULL) { + base++; + if (!has_meta(base) && strcmp(user_base, base) != 0) + debug_return_bool(false); + } + } + + /* Make sudoers_cmnd relative to the new root, if any. */ + if (runchroot != NULL) { + const int len = + snprintf(pathbuf, sizeof(pathbuf), "%s%s", runchroot, sudoers_cmnd); + if (len >= ssizeof(pathbuf)) { + errno = ENAMETOOLONG; + debug_return_bool(false); + } + sudoers_cmnd = pathbuf; + chrootlen = strlen(runchroot); + } + + /* + * Return true if we find a match in the glob(3) results AND + * a) there are no args in sudoers OR + * b) there are no args on command line and none required by sudoers OR + * c) there are args in sudoers and on command line and they match + * else return false. + */ + if (glob(sudoers_cmnd, GLOB_NOSORT, NULL, &gl) != 0 || gl.gl_pathc == 0) { + globfree(&gl); + debug_return_bool(false); + } + /* If user_cmnd is fully-qualified, check for an exact match. */ + if (user_cmnd[0] == '/') { + for (ap = gl.gl_pathv; (cp = *ap) != NULL; ap++) { + if (fd != -1) { + close(fd); + fd = -1; + } + /* Remove the runchroot, if any. */ + cp += chrootlen; + + if (strcmp(cp, user_cmnd) != 0) + continue; + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(cp, runchroot, digests, &fd)) + continue; + if (!do_stat(fd, cp, runchroot, &sudoers_stat)) + continue; + if (user_stat == NULL || + (user_stat->st_dev == sudoers_stat.st_dev && + user_stat->st_ino == sudoers_stat.st_ino)) { + /* There could be multiple matches, check digest early. */ + if (!digest_matches(fd, cp, runchroot, digests)) { + bad_digest = true; + continue; + } + free(safe_cmnd); + if ((safe_cmnd = strdup(cp)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + cp = NULL; /* fail closed */ + } + } else { + /* Paths match, but st_dev and st_ino are different. */ + cp = NULL; /* fail closed */ + } + goto done; + } + } + /* No exact match, compare basename, st_dev and st_ino. */ + if (!bad_digest) { + for (ap = gl.gl_pathv; (cp = *ap) != NULL; ap++) { + if (fd != -1) { + close(fd); + fd = -1; + } + + /* Remove the runchroot, if any. */ + cp += chrootlen; + + /* If it ends in '/' it is a directory spec. */ + dlen = strlen(cp); + if (cp[dlen - 1] == '/') { + if (command_matches_dir(cp, dlen, runchroot, digests)) + debug_return_bool(true); + continue; + } + + /* Only proceed if user_base and basename(cp) match */ + if ((base = strrchr(cp, '/')) != NULL) + base++; + else + base = cp; + if (strcmp(user_base, base) != 0) + continue; + + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(cp, runchroot, digests, &fd)) + continue; + if (!do_stat(fd, cp, runchroot, &sudoers_stat)) + continue; + if (user_stat == NULL || + (user_stat->st_dev == sudoers_stat.st_dev && + user_stat->st_ino == sudoers_stat.st_ino)) { + if (!digest_matches(fd, cp, runchroot, digests)) + continue; + free(safe_cmnd); + if ((safe_cmnd = strdup(cp)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + cp = NULL; /* fail closed */ + } + goto done; + } + } + } +done: + globfree(&gl); + if (cp != NULL) { + if (command_args_match(sudoers_cmnd, sudoers_args)) { + /* safe_cmnd was set above. */ + set_cmnd_fd(fd); + debug_return_bool(true); + } + } + if (fd != -1) + close(fd); + debug_return_bool(false); +} + +static bool +command_matches_normal(const char *sudoers_cmnd, const char *sudoers_args, + const char *runchroot, const struct command_digest_list *digests) +{ + struct stat sudoers_stat; + const char *base; + size_t dlen; + int fd = -1; + debug_decl(command_matches_normal, SUDOERS_DEBUG_MATCH); + + /* If it ends in '/' it is a directory spec. */ + dlen = strlen(sudoers_cmnd); + if (sudoers_cmnd[dlen - 1] == '/') { + debug_return_bool(command_matches_dir(sudoers_cmnd, dlen, runchroot, + digests)); + } + + /* Only proceed if user_base and basename(sudoers_cmnd) match */ + if ((base = strrchr(sudoers_cmnd, '/')) == NULL) + base = sudoers_cmnd; + else + base++; + if (strcmp(user_base, base) != 0) + debug_return_bool(false); + + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(sudoers_cmnd, runchroot, digests, &fd)) + goto bad; + + /* + * Return true if command matches AND + * a) there are no args in sudoers OR + * b) there are no args on command line and none req by sudoers OR + * c) there are args in sudoers and on command line and they match + * d) there is a digest and it matches + */ + if (user_stat != NULL && do_stat(fd, sudoers_cmnd, runchroot, &sudoers_stat)) { + if (user_stat->st_dev != sudoers_stat.st_dev || + user_stat->st_ino != sudoers_stat.st_ino) + goto bad; + } else { + /* Either user or sudoers command does not exist, match by name. */ + if (strcmp(user_cmnd, sudoers_cmnd) != 0) + goto bad; + } + if (!command_args_match(sudoers_cmnd, sudoers_args)) + goto bad; + if (!digest_matches(fd, sudoers_cmnd, runchroot, digests)) { + /* XXX - log functions not available but we should log very loudly */ + goto bad; + } + free(safe_cmnd); + if ((safe_cmnd = strdup(sudoers_cmnd)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + set_cmnd_fd(fd); + debug_return_bool(true); +bad: + if (fd != -1) + close(fd); + debug_return_bool(false); +} + +/* + * If path doesn't end in /, return true iff cmnd & path name the same inode; + * otherwise, return true if user_cmnd names one of the inodes in path. + */ +bool +command_matches(const char *sudoers_cmnd, const char *sudoers_args, + const char *runchroot, struct cmnd_info *info, + const struct command_digest_list *digests) +{ + char *saved_user_cmnd = NULL; + struct stat saved_user_stat; + bool rc = false; + debug_decl(command_matches, SUDOERS_DEBUG_MATCH); + + if (user_runchroot != NULL) { + if (runchroot != NULL && strcmp(runchroot, "*") != 0 && + strcmp(runchroot, user_runchroot) != 0) { + /* CHROOT mismatch */ + goto done; + } + /* User-specified runchroot (user_stat already set appropriately). */ + runchroot = user_runchroot; + } else if (runchroot == NULL) { + /* No rule-specific runchroot, use global (user_stat already set). */ + if (def_runchroot != NULL && strcmp(def_runchroot, "*") != '\0') + runchroot = def_runchroot; + } else { + /* Rule-specific runchroot, reset user_cmnd and user_stat. */ + int status; + + saved_user_cmnd = user_cmnd; + if (user_stat != NULL) + saved_user_stat = *user_stat; + status = set_cmnd_path(runchroot); + if (status != FOUND) + saved_user_cmnd = NULL; + if (info != NULL) + info->status = status; + } + + if (sudoers_cmnd == NULL) { + rc = command_matches_all(runchroot, digests); + goto done; + } + + /* Check for pseudo-commands */ + if (sudoers_cmnd[0] != '/') { + /* + * Return true if both sudoers_cmnd and user_cmnd are "sudoedit" AND + * a) there are no args in sudoers OR + * b) there are no args on command line and none req by sudoers OR + * c) there are args in sudoers and on command line and they match + */ + if (strcmp(sudoers_cmnd, "sudoedit") == 0 && + strcmp(user_cmnd, "sudoedit") == 0 && + command_args_match(sudoers_cmnd, sudoers_args)) { + /* No need to set safe_cmnd since user_cmnd matches sudoers_cmnd */ + rc = true; + } + goto done; + } + + if (has_meta(sudoers_cmnd)) { + /* + * If sudoers_cmnd has meta characters in it, we need to + * use glob(3) and/or fnmatch(3) to do the matching. + */ + if (def_fast_glob) + rc = command_matches_fnmatch(sudoers_cmnd, sudoers_args, runchroot, digests); + else + rc = command_matches_glob(sudoers_cmnd, sudoers_args, runchroot, digests); + } else { + rc = command_matches_normal(sudoers_cmnd, sudoers_args, runchroot, digests); + } +done: + if (saved_user_cmnd != NULL) { + if (info != NULL) { + info->cmnd_path = user_cmnd; + if (user_stat != NULL) + info->cmnd_stat = *user_stat; + } else { + free(user_cmnd); + } + user_cmnd = saved_user_cmnd; + if (user_stat != NULL) + *user_stat = saved_user_stat; + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "user command \"%s%s%s\" matches sudoers command \"%s%s%s\"%s%s: %s", + user_cmnd, user_args ? " " : "", user_args ? user_args : "", + sudoers_cmnd, sudoers_args ? " " : "", sudoers_args ? sudoers_args : "", + runchroot ? ", chroot " : "", runchroot ? runchroot : "", + rc ? "true" : "false"); + debug_return_bool(rc); +} diff --git a/plugins/sudoers/match_digest.c b/plugins/sudoers/match_digest.c new file mode 100644 index 0000000..5c39f52 --- /dev/null +++ b/plugins/sudoers/match_digest.c @@ -0,0 +1,135 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_digest.h" +#include + +bool +digest_matches(int fd, const char *path, const char *runchroot, + const struct command_digest_list *digests) +{ + unsigned int digest_type = SUDO_DIGEST_INVALID; + unsigned char *file_digest = NULL; + unsigned char *sudoers_digest = NULL; + struct command_digest *digest; + size_t digest_len = (size_t)-1; + char pathbuf[PATH_MAX]; + bool matched = false; + debug_decl(digest_matches, SUDOERS_DEBUG_MATCH); + + if (TAILQ_EMPTY(digests)) { + /* No digest, no problem. */ + debug_return_bool(true); + } + + if (fd == -1) { + /* No file, no match. */ + goto done; + } + + if (runchroot != NULL) { + const int len = + snprintf(pathbuf, sizeof(pathbuf), "%s%s", runchroot, path); + if (len >= ssizeof(pathbuf)) { + errno = ENAMETOOLONG; + debug_return_bool(false); + } + path = pathbuf; + } + + TAILQ_FOREACH(digest, digests, entries) { + /* Compute file digest if needed. */ + if (digest->digest_type != digest_type) { + free(file_digest); + file_digest = sudo_filedigest(fd, path, digest->digest_type, + &digest_len); + if (lseek(fd, (off_t)0, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to rewind digest fd"); + } + digest_type = digest->digest_type; + } + if (file_digest == NULL) { + /* Warning (if any) printed by sudo_filedigest() */ + goto done; + } + + /* Convert the command digest from ascii to binary. */ + if ((sudoers_digest = malloc(digest_len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + if (strlen(digest->digest_str) == digest_len * 2) { + /* Convert ascii hex to binary. */ + unsigned int i; + for (i = 0; i < digest_len; i++) { + const int h = hexchar(&digest->digest_str[i + i]); + if (h == -1) + goto bad_format; + sudoers_digest[i] = (unsigned char)h; + } + } else { + /* Convert base64 to binary. */ + size_t len = base64_decode(digest->digest_str, sudoers_digest, digest_len); + if (len != digest_len) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "incorrect length for digest, expected %zu, got %zu", + digest_len, len); + goto bad_format; + } + } + if (memcmp(file_digest, sudoers_digest, digest_len) == 0) { + matched = true; + break; + } + + sudo_debug_printf(SUDO_DEBUG_DIAG|SUDO_DEBUG_LINENO, + "%s digest mismatch for %s, expecting %s", + digest_type_to_name(digest->digest_type), path, digest->digest_str); + free(sudoers_digest); + sudoers_digest = NULL; + } + goto done; + +bad_format: + sudo_warnx(U_("digest for %s (%s) is not in %s form"), path, + digest->digest_str, digest_type_to_name(digest->digest_type)); +done: + free(sudoers_digest); + free(file_digest); + debug_return_bool(matched); +} diff --git a/plugins/sudoers/mkdefaults b/plugins/sudoers/mkdefaults new file mode 100755 index 0000000..11a62fd --- /dev/null +++ b/plugins/sudoers/mkdefaults @@ -0,0 +1,163 @@ +#!/bin/sh +# +# Generate sudo_defs_table and associated defines +# +# Input should be formatted thusly: +# +# var_name +# TYPE +# description (or NULL) +# array of struct def_values if TYPE == T_TUPLE [optional] +# *callback [optional] + +# Deal with optional -o (output) argument +if [ "$1" = "-o" ]; then + OUTFILE="$2" + shift 2 +else + OUTFILE=def_data +fi +if [ $# -gt 0 ]; then + INFILE="$1" + shift +else + INFILE=def_data.in +fi +if [ $# -gt 0 ]; then + echo "usage: $0 [-o output] [input_file]" 1>&2 +fi + +${AWK-awk} -f - -v outfile=$OUTFILE $INFILE <<'EOF' +BEGIN { + tuple_values[0] = "never" + tuple_keys["never"] = 0 + ntuples = 1 + header = outfile ".h" + cfile = outfile ".c" + + type_map["T_INT"] = "ival" + type_map["T_UINT"] = "uival" + type_map["T_STR"] = "str" + type_map["T_FLAG"] = "flag" + type_map["T_MODE"] = "mode" + type_map["T_LIST"] = "list" + type_map["T_LOGFAC"] = "ival" + type_map["T_LOGPRI"] = "ival" + type_map["T_TUPLE"] = "tuple" + type_map["T_TIMESPEC"] = "tspec" + type_map["T_TIMEOUT"] = "ival" +} +{ + sub(/#.*/, "", $0) + if (/^[[:blank:]]*$/) next + if (/^[[:alpha:]]/) { + # Store previous record and begin new one + if (var) + records[count++] = sprintf("%s\n%s\n%s\n%s\n%s\n", var, type, desc, values, callback) + var = $1 + type = "" + desc = "" + values = "" + callback = "" + state = 0 + } else { + state++ + # Strip leading/trailing whitespace + gsub(/^[ \t]+|[ \t]+$/, "") + if (state == 1) { + # type + type = $1 + } else if (state == 2) { + # description + if ($0 == "NULL") { + desc = "NULL" + } else { + # Strip leading and trailing double quote and escape the rest + gsub(/^"|"$/, "") + gsub(/"/, "\\\"") + desc = sprintf("N_(\"%s\")", $0) + } + } else if (state == 3 || state == 4) { + if (/^\*/) { + callback = substr($0, 2) + } else { + if (type ~ /^T_TUPLE/) { + values = $0 + # Add to tuple_values as necessary + n = split(values, vals) + for (i = 1; i <= n; i++) { + if (!(vals[i] in tuple_keys)) { + tuple_keys[vals[i]] = ntuples + tuple_values[ntuples++] = vals[i] + } + } + } + } + } else { + die("syntax error in input near line " NR) + } + } +} +END { + if (var) + records[count++] = sprintf("%s\n%s\n%s\n%s\n%s\n", var, type, desc, values, callback) + + print "/* generated file, do not edit */\n" > header + print "/* generated file, do not edit */\n" > cfile + + # Print out value arrays + for (i = 0; i < count; i++) { + split(records[i], fields, "\n") + if (fields[4]) { + if (fields[2] !~ /^T_TUPLE/) + die("Values list specified for non-tuple " records[1]) + printf "static struct def_values def_data_%s[] = {\n", fields[1] > cfile + n = split(fields[4], t) + for (j = 1; j <= n; j++) { + printf " { \"%s\", %s },\n", t[j], t[j] > cfile + } + print " { NULL, 0 }," > cfile + print "};\n" > cfile + } + } + + # Print each record + print "struct sudo_defs_types sudo_defs_table[] = {\n {" > cfile + for (i = 0; i < count; i++) { + print_record(records[i], i) + } + print "\tNULL, 0, NULL\n }\n};" > cfile + + # Print out def_tuple + print "\nenum def_tuple {" > header + for (i = 0; i < ntuples; i++) + printf "%s %s", i ? ",\n" : "", tuple_values[i] > header + print "\n};" > header +} + +function die(msg) { + print msg > "/dev/stderr" + exit 1 +} + +function print_record(rec, recnum) { + split(rec, fields, "\n") + type = fields[2] + sub(/\|.*/, "", type) + if (!(type in type_map)) + die("unknown defaults type: " fields[2]) + + # each variable gets a macro to access its value + defname = "I_" toupper(fields[1]) + printf "#define %-23s %d\n", defname, recnum > header + printf "#define def_%-19s (sudo_defs_table[%s].sd_un.%s)\n", + fields[1], defname, type_map[type] > header + + printf "\t\"%s\", %s,\n\t%s,\n", fields[1], fields[2], fields[3] > cfile + printf "\t%s,\n", fields[4] ? "def_data_" fields[1] : "NULL" > cfile + if (fields[5]) { + printf "\t%s,\n", fields[5] > cfile + } + print " }, {" > cfile +} +EOF diff --git a/plugins/sudoers/parse.c b/plugins/sudoers/parse.c new file mode 100644 index 0000000..8236cde --- /dev/null +++ b/plugins/sudoers/parse.c @@ -0,0 +1,939 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_lbuf.h" +#include + +/* + * Look up the user in the sudoers parse tree for pseudo-commands like + * list, verify and kill. + */ +static int +sudoers_lookup_pseudo(struct sudo_nss_list *snl, struct passwd *pw, + int validated, int pwflag) +{ + int match; + struct sudo_nss *nss; + struct cmndspec *cs; + struct privilege *priv; + struct userspec *us; + struct defaults *def; + int nopass; + enum def_tuple pwcheck; + debug_decl(sudoers_lookup_pseudo, SUDOERS_DEBUG_PARSER); + + pwcheck = (pwflag == -1) ? never : sudo_defs_table[pwflag].sd_un.tuple; + nopass = (pwcheck == never || pwcheck == all) ? true : false; + + if (list_pw == NULL) + SET(validated, FLAG_NO_CHECK); + CLR(validated, FLAG_NO_USER); + CLR(validated, FLAG_NO_HOST); + match = DENY; + TAILQ_FOREACH(nss, snl, entries) { + if (nss->query(nss, pw) == -1) { + /* The query function should have printed an error message. */ + SET(validated, VALIDATE_ERROR); + break; + } + TAILQ_FOREACH(us, &nss->parse_tree->userspecs, entries) { + if (userlist_matches(nss->parse_tree, pw, &us->users) != ALLOW) + continue; + TAILQ_FOREACH(priv, &us->privileges, entries) { + int priv_nopass = UNSPEC; + + if (hostlist_matches(nss->parse_tree, pw, &priv->hostlist) != ALLOW) + continue; + TAILQ_FOREACH(def, &priv->defaults, entries) { + if (strcmp(def->var, "authenticate") == 0) + priv_nopass = !def->op; + } + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + if (pwcheck == any) { + if (cs->tags.nopasswd == true || priv_nopass == true) + nopass = true; + } else if (pwcheck == all) { + if (cs->tags.nopasswd != true && priv_nopass != true) + nopass = false; + } + if (match == ALLOW) + continue; + /* Only check the command when listing another user. */ + if (user_uid == 0 || list_pw == NULL || + user_uid == list_pw->pw_uid || + cmnd_matches(nss->parse_tree, cs->cmnd, cs->runchroot, + NULL) == ALLOW) + match = ALLOW; + } + } + } + } + if (match == ALLOW || user_uid == 0) { + /* User has an entry for this host. */ + SET(validated, VALIDATE_SUCCESS); + } else if (match == DENY) + SET(validated, VALIDATE_FAILURE); + if (pwcheck == always && def_authenticate) + SET(validated, FLAG_CHECK_USER); + else if (nopass == true) + def_authenticate = false; + debug_return_int(validated); +} + +static int +sudoers_lookup_check(struct sudo_nss *nss, struct passwd *pw, + int *validated, struct cmnd_info *info, struct cmndspec **matching_cs, + struct defaults_list **defs, time_t now) +{ + int host_match, runas_match, cmnd_match; + struct cmndspec *cs; + struct privilege *priv; + struct userspec *us; + struct member *matching_user; + debug_decl(sudoers_lookup_check, SUDOERS_DEBUG_PARSER); + + memset(info, 0, sizeof(*info)); + + TAILQ_FOREACH_REVERSE(us, &nss->parse_tree->userspecs, userspec_list, entries) { + if (userlist_matches(nss->parse_tree, pw, &us->users) != ALLOW) + continue; + CLR(*validated, FLAG_NO_USER); + TAILQ_FOREACH_REVERSE(priv, &us->privileges, privilege_list, entries) { + host_match = hostlist_matches(nss->parse_tree, pw, &priv->hostlist); + if (host_match == ALLOW) + CLR(*validated, FLAG_NO_HOST); + else + continue; + TAILQ_FOREACH_REVERSE(cs, &priv->cmndlist, cmndspec_list, entries) { + if (cs->notbefore != UNSPEC) { + if (now < cs->notbefore) + continue; + } + if (cs->notafter != UNSPEC) { + if (now > cs->notafter) + continue; + } + matching_user = NULL; + runas_match = runaslist_matches(nss->parse_tree, + cs->runasuserlist, cs->runasgrouplist, &matching_user, + NULL); + if (runas_match == ALLOW) { + cmnd_match = cmnd_matches(nss->parse_tree, cs->cmnd, + cs->runchroot, info); + if (cmnd_match != UNSPEC) { + /* + * If user is running command as himself, + * set runas_pw = sudo_user.pw. + * XXX - hack, want more general solution + */ + if (matching_user && matching_user->type == MYSELF) { + sudo_pw_delref(runas_pw); + sudo_pw_addref(sudo_user.pw); + runas_pw = sudo_user.pw; + } + *matching_cs = cs; + *defs = &priv->defaults; + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "userspec matched @ %s:%d:%d: %s", + us->file ? us->file : "???", us->line, us->column, + cmnd_match ? "allowed" : "denied"); + debug_return_int(cmnd_match); + } + free(info->cmnd_path); + memset(info, 0, sizeof(*info)); + } + } + } + } + debug_return_int(UNSPEC); +} + +/* + * Apply cmndspec-specific settngs including SELinux role/type, + * Solaris privs, and command tags. + */ +static bool +apply_cmndspec(struct cmndspec *cs) +{ + debug_decl(apply_cmndspec, SUDOERS_DEBUG_PARSER); + + if (cs != NULL) { +#ifdef HAVE_SELINUX + /* Set role and type if not specified on command line. */ + if (user_role == NULL) { + if (cs->role != NULL) { + user_role = strdup(cs->role); + if (user_role == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } else { + user_role = def_role; + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "user_role -> %s", user_role); + } + if (user_type == NULL) { + if (cs->type != NULL) { + user_type = strdup(cs->type); + if (user_type == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } else { + user_type = def_type; + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "user_type -> %s", user_type); + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* Set Solaris privilege sets */ + if (runas_privs == NULL) { + if (cs->privs != NULL) { + runas_privs = strdup(cs->privs); + if (runas_privs == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } else { + runas_privs = def_privs; + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "runas_privs -> %s", runas_privs); + } + if (runas_limitprivs == NULL) { + if (cs->limitprivs != NULL) { + runas_limitprivs = strdup(cs->limitprivs); + if (runas_limitprivs == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } else { + runas_limitprivs = def_limitprivs; + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "runas_limitprivs -> %s", runas_limitprivs); + } +#endif /* HAVE_PRIV_SET */ + if (cs->timeout > 0) { + def_command_timeout = cs->timeout; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_command_timeout -> %d", def_command_timeout); + } + if (cs->runcwd != NULL) { + free(def_runcwd); + def_runcwd = strdup(cs->runcwd); + if (def_runcwd == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_runcwd -> %s", def_runcwd); + } + if (cs->runchroot != NULL) { + free(def_runchroot); + def_runchroot = strdup(cs->runchroot); + if (def_runchroot == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_runchroot -> %s", def_runchroot); + } + if (cs->tags.nopasswd != UNSPEC) { + def_authenticate = !cs->tags.nopasswd; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_authenticate -> %s", def_authenticate ? "true" : "false"); + } + if (cs->tags.noexec != UNSPEC) { + def_noexec = cs->tags.noexec; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_noexec -> %s", def_noexec ? "true" : "false"); + } + if (cs->tags.setenv != UNSPEC) { + def_setenv = cs->tags.setenv; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_setenv -> %s", def_setenv ? "true" : "false"); + } + if (cs->tags.log_input != UNSPEC) { + def_log_input = cs->tags.log_input; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_log_input -> %s", def_log_input ? "true" : "false"); + } + if (cs->tags.log_output != UNSPEC) { + def_log_output = cs->tags.log_output; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_log_output -> %s", def_log_output ? "true" : "false"); + } + if (cs->tags.send_mail != UNSPEC) { + if (cs->tags.send_mail) { + def_mail_all_cmnds = true; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_mail_all_cmnds -> true"); + } else { + def_mail_all_cmnds = false; + def_mail_always = false; + def_mail_no_perms = false; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_mail_all_cmnds -> false, def_mail_always -> false, " + "def_mail_no_perms -> false"); + } + } + if (cs->tags.follow != UNSPEC) { + def_sudoedit_follow = cs->tags.follow; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_sudoedit_follow -> %s", def_sudoedit_follow ? "true" : "false"); + } + } + + debug_return_bool(true); +} + +/* + * Look up the user in the sudoers parse tree and check to see if they are + * allowed to run the specified command on this host as the target user. + */ +int +sudoers_lookup(struct sudo_nss_list *snl, struct passwd *pw, int *cmnd_status, + int pwflag) +{ + struct defaults_list *defs = NULL; + struct sudoers_parse_tree *parse_tree = NULL; + struct cmndspec *cs = NULL; + struct sudo_nss *nss; + struct cmnd_info info; + int validated = FLAG_NO_USER | FLAG_NO_HOST; + int m, match = UNSPEC; + time_t now; + debug_decl(sudoers_lookup, SUDOERS_DEBUG_PARSER); + + /* + * Special case checking the "validate", "list" and "kill" pseudo-commands. + */ + if (pwflag) + debug_return_int(sudoers_lookup_pseudo(snl, pw, validated, pwflag)); + + /* Need to be runas user while stat'ing things. */ + if (!set_perms(PERM_RUNAS)) + debug_return_int(validated); + + /* Query each sudoers source and check the user. */ + time(&now); + TAILQ_FOREACH(nss, snl, entries) { + if (nss->query(nss, pw) == -1) { + /* The query function should have printed an error message. */ + SET(validated, VALIDATE_ERROR); + break; + } + + m = sudoers_lookup_check(nss, pw, &validated, &info, &cs, &defs, now); + if (m != UNSPEC) { + match = m; + parse_tree = nss->parse_tree; + } + + if (!sudo_nss_can_continue(nss, m)) + break; + } + if (match != UNSPEC) { + if (info.cmnd_path != NULL) { + /* Update user_cmnd, user_stat, cmnd_status from matching entry. */ + free(user_cmnd); + user_cmnd = info.cmnd_path; + if (user_stat != NULL) + *user_stat = info.cmnd_stat; + *cmnd_status = info.status; + } + if (defs != NULL) + update_defaults(parse_tree, defs, SETDEF_GENERIC, false); + if (!apply_cmndspec(cs)) + SET(validated, VALIDATE_ERROR); + else if (match == ALLOW) + SET(validated, VALIDATE_SUCCESS); + else + SET(validated, VALIDATE_FAILURE); + } + if (!restore_perms()) + SET(validated, VALIDATE_ERROR); + debug_return_int(validated); +} + +static int +display_priv_short(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + struct userspec *us, struct sudo_lbuf *lbuf) +{ + struct privilege *priv; + int nfound = 0; + debug_decl(display_priv_short, SUDOERS_DEBUG_PARSER); + + TAILQ_FOREACH(priv, &us->privileges, entries) { + struct cmndspec *cs, *prev_cs = NULL; + struct cmndtag tags; + + if (hostlist_matches(parse_tree, pw, &priv->hostlist) != ALLOW) + continue; + + sudoers_defaults_list_to_tags(&priv->defaults, &tags); + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + /* Start a new line if RunAs changes. */ + if (prev_cs == NULL || RUNAS_CHANGED(cs, prev_cs)) { + struct member *m; + + if (cs != TAILQ_FIRST(&priv->cmndlist)) + sudo_lbuf_append(lbuf, "\n"); + sudo_lbuf_append(lbuf, " ("); + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + if (m != TAILQ_FIRST(cs->runasuserlist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + RUNASALIAS); + } + } else if (cs->runasgrouplist == NULL) { + sudo_lbuf_append(lbuf, "%s", def_runas_default); + } else { + sudo_lbuf_append(lbuf, "%s", pw->pw_name); + } + if (cs->runasgrouplist != NULL) { + sudo_lbuf_append(lbuf, " : "); + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + if (m != TAILQ_FIRST(cs->runasgrouplist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + RUNASALIAS); + } + } + sudo_lbuf_append(lbuf, ") "); + } else if (cs != TAILQ_FIRST(&priv->cmndlist)) { + sudo_lbuf_append(lbuf, ", "); + } + sudoers_format_cmndspec(lbuf, parse_tree, cs, prev_cs, tags, true); + prev_cs = cs; + nfound++; + } + sudo_lbuf_append(lbuf, "\n"); + } + debug_return_int(nfound); +} + +/* + * Compare the current cmndspec with the previous one to determine + * whether we need to start a new long entry for "sudo -ll". + * Returns true if we should start a new long entry, else false. + */ +static bool +new_long_entry(struct cmndspec *cs, struct cmndspec *prev_cs) +{ + debug_decl(new_long_entry, SUDOERS_DEBUG_PARSER); + + if (prev_cs == NULL) + debug_return_bool(true); + if (RUNAS_CHANGED(cs, prev_cs) || TAGS_CHANGED(prev_cs->tags, cs->tags)) + debug_return_bool(true); +#ifdef HAVE_PRIV_SET + if (cs->privs && (!prev_cs->privs || strcmp(cs->privs, prev_cs->privs) != 0)) + debug_return_bool(true); + if (cs->limitprivs && (!prev_cs->limitprivs || strcmp(cs->limitprivs, prev_cs->limitprivs) != 0)) + debug_return_bool(true); +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + if (cs->role && (!prev_cs->role || strcmp(cs->role, prev_cs->role) != 0)) + debug_return_bool(true); + if (cs->type && (!prev_cs->type || strcmp(cs->type, prev_cs->type) != 0)) + debug_return_bool(true); +#endif /* HAVE_SELINUX */ + if (cs->runchroot && (!prev_cs->runchroot || strcmp(cs->runchroot, prev_cs->runchroot) != 0)) + debug_return_bool(true); + if (cs->runcwd && (!prev_cs->runcwd || strcmp(cs->runcwd, prev_cs->runcwd) != 0)) + debug_return_bool(true); + if (cs->timeout != prev_cs->timeout) + debug_return_bool(true); + if (cs->notbefore != prev_cs->notbefore) + debug_return_bool(true); + if (cs->notafter != prev_cs->notafter) + debug_return_bool(true); + debug_return_bool(false); +} + +static int +display_priv_long(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + struct userspec *us, struct sudo_lbuf *lbuf) +{ + struct privilege *priv; + int nfound = 0; + debug_decl(display_priv_long, SUDOERS_DEBUG_PARSER); + + TAILQ_FOREACH(priv, &us->privileges, entries) { + struct cmndspec *cs, *prev_cs; + + if (hostlist_matches(parse_tree, pw, &priv->hostlist) != ALLOW) + continue; + prev_cs = NULL; + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + struct defaults *d; + struct member *m; + + if (new_long_entry(cs, prev_cs)) { + int olen; + + if (priv->ldap_role != NULL) { + sudo_lbuf_append(lbuf, _("\nLDAP Role: %s\n"), + priv->ldap_role); + } else { + sudo_lbuf_append(lbuf, "%s", _("\nSudoers entry:\n")); + } + sudo_lbuf_append(lbuf, "%s", _(" RunAsUsers: ")); + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + if (m != TAILQ_FIRST(cs->runasuserlist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + RUNASALIAS); + } + } else if (cs->runasgrouplist == NULL) { + sudo_lbuf_append(lbuf, "%s", def_runas_default); + } else { + sudo_lbuf_append(lbuf, "%s", pw->pw_name); + } + sudo_lbuf_append(lbuf, "\n"); + if (cs->runasgrouplist != NULL) { + sudo_lbuf_append(lbuf, "%s", _(" RunAsGroups: ")); + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + if (m != TAILQ_FIRST(cs->runasgrouplist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + RUNASALIAS); + } + sudo_lbuf_append(lbuf, "\n"); + } + olen = lbuf->len; + sudo_lbuf_append(lbuf, "%s", _(" Options: ")); + TAILQ_FOREACH(d, &priv->defaults, entries) { + sudoers_format_default(lbuf, d); + sudo_lbuf_append(lbuf, ", "); + } + if (TAG_SET(cs->tags.setenv)) + sudo_lbuf_append(lbuf, "%ssetenv, ", cs->tags.setenv ? "" : "!"); + if (TAG_SET(cs->tags.noexec)) + sudo_lbuf_append(lbuf, "%snoexec, ", cs->tags.noexec ? "" : "!"); + if (TAG_SET(cs->tags.nopasswd)) + sudo_lbuf_append(lbuf, "%sauthenticate, ", cs->tags.nopasswd ? "!" : ""); + if (TAG_SET(cs->tags.log_input)) + sudo_lbuf_append(lbuf, "%slog_input, ", cs->tags.log_input ? "" : "!"); + if (TAG_SET(cs->tags.log_output)) + sudo_lbuf_append(lbuf, "%slog_output, ", cs->tags.log_output ? "" : "!"); + if (lbuf->buf[lbuf->len - 2] == ',') { + lbuf->len -= 2; /* remove trailing ", " */ + sudo_lbuf_append(lbuf, "\n"); + } else { + lbuf->len = olen; /* no options */ + } +#ifdef HAVE_PRIV_SET + if (cs->privs) + sudo_lbuf_append(lbuf, " Privs: %s\n", cs->privs); + if (cs->limitprivs) + sudo_lbuf_append(lbuf, " Limitprivs: %s\n", cs->limitprivs); +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + if (cs->role) + sudo_lbuf_append(lbuf, " Role: %s\n", cs->role); + if (cs->type) + sudo_lbuf_append(lbuf, " Type: %s\n", cs->type); +#endif /* HAVE_SELINUX */ + if (cs->runchroot != NULL) + sudo_lbuf_append(lbuf, " Chroot: %s\n", cs->runchroot); + if (cs->runcwd != NULL) + sudo_lbuf_append(lbuf, " Cwd: %s\n", cs->runcwd); + if (cs->timeout > 0) { + char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2]; + (void)snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout); + sudo_lbuf_append(lbuf, " Timeout: %s\n", numbuf); + } + if (cs->notbefore != UNSPEC) { + char buf[sizeof("CCYYMMDDHHMMSSZ")]; + struct tm *tm = gmtime(&cs->notbefore); + if (strftime(buf, sizeof(buf), "%Y%m%d%H%M%SZ", tm) != 0) + sudo_lbuf_append(lbuf, " NotBefore: %s\n", buf); + } + if (cs->notafter != UNSPEC) { + char buf[sizeof("CCYYMMDDHHMMSSZ")]; + struct tm *tm = gmtime(&cs->notafter); + if (strftime(buf, sizeof(buf), "%Y%m%d%H%M%SZ", tm) != 0) + sudo_lbuf_append(lbuf, " NotAfter: %s\n", buf); + } + sudo_lbuf_append(lbuf, "%s", _(" Commands:\n")); + } + sudo_lbuf_append(lbuf, "\t"); + sudoers_format_member(lbuf, parse_tree, cs->cmnd, "\n\t", + CMNDALIAS); + sudo_lbuf_append(lbuf, "\n"); + prev_cs = cs; + nfound++; + } + } + debug_return_int(nfound); +} + +static int +sudo_display_userspecs(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + struct sudo_lbuf *lbuf, bool verbose) +{ + struct userspec *us; + int nfound = 0; + debug_decl(sudo_display_userspecs, SUDOERS_DEBUG_PARSER); + + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + if (userlist_matches(parse_tree, pw, &us->users) != ALLOW) + continue; + + if (verbose) + nfound += display_priv_long(parse_tree, pw, us, lbuf); + else + nfound += display_priv_short(parse_tree, pw, us, lbuf); + } + if (sudo_lbuf_error(lbuf)) + debug_return_int(-1); + debug_return_int(nfound); +} + +/* + * Display matching Defaults entries for the given user on this host. + */ +static int +display_defaults(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + struct sudo_lbuf *lbuf) +{ + struct defaults *d; + char *prefix; + int nfound = 0; + debug_decl(display_defaults, SUDOERS_DEBUG_PARSER); + + if (lbuf->len == 0 || isspace((unsigned char)lbuf->buf[lbuf->len - 1])) + prefix = " "; + else + prefix = ", "; + + TAILQ_FOREACH(d, &parse_tree->defaults, entries) { + switch (d->type) { + case DEFAULTS_HOST: + if (hostlist_matches(parse_tree, pw, d->binding) != ALLOW) + continue; + break; + case DEFAULTS_USER: + if (userlist_matches(parse_tree, pw, d->binding) != ALLOW) + continue; + break; + case DEFAULTS_RUNAS: + case DEFAULTS_CMND: + continue; + } + sudo_lbuf_append(lbuf, "%s", prefix); + sudoers_format_default(lbuf, d); + prefix = ", "; + nfound++; + } + if (sudo_lbuf_error(lbuf)) + debug_return_int(-1); + debug_return_int(nfound); +} + +/* + * Display Defaults entries of the given type. + */ +static int +display_bound_defaults_by_type(struct sudoers_parse_tree *parse_tree, + int deftype, struct sudo_lbuf *lbuf) +{ + struct defaults *d; + struct member_list *binding = NULL; + struct member *m; + char *dsep; + int atype, nfound = 0; + debug_decl(display_bound_defaults_by_type, SUDOERS_DEBUG_PARSER); + + switch (deftype) { + case DEFAULTS_HOST: + atype = HOSTALIAS; + dsep = "@"; + break; + case DEFAULTS_USER: + atype = USERALIAS; + dsep = ":"; + break; + case DEFAULTS_RUNAS: + atype = RUNASALIAS; + dsep = ">"; + break; + case DEFAULTS_CMND: + atype = CMNDALIAS; + dsep = "!"; + break; + default: + debug_return_int(-1); + } + TAILQ_FOREACH(d, &parse_tree->defaults, entries) { + if (d->type != deftype) + continue; + + nfound++; + if (binding != d->binding) { + binding = d->binding; + if (nfound != 1) + sudo_lbuf_append(lbuf, "\n"); + sudo_lbuf_append(lbuf, " Defaults%s", dsep); + TAILQ_FOREACH(m, binding, entries) { + if (m != TAILQ_FIRST(binding)) + sudo_lbuf_append(lbuf, ","); + sudoers_format_member(lbuf, parse_tree, m, ", ", atype); + sudo_lbuf_append(lbuf, " "); + } + } else + sudo_lbuf_append(lbuf, ", "); + sudoers_format_default(lbuf, d); + } + + if (sudo_lbuf_error(lbuf)) + debug_return_int(-1); + debug_return_int(nfound); +} + +/* + * Display Defaults entries that are per-runas or per-command + */ +static int +display_bound_defaults(struct sudoers_parse_tree *parse_tree, + struct passwd *pw, struct sudo_lbuf *lbuf) +{ + int nfound = 0; + debug_decl(display_bound_defaults, SUDOERS_DEBUG_PARSER); + + /* XXX - should only print ones that match what the user can do. */ + nfound += display_bound_defaults_by_type(parse_tree, DEFAULTS_RUNAS, lbuf); + nfound += display_bound_defaults_by_type(parse_tree, DEFAULTS_CMND, lbuf); + + if (sudo_lbuf_error(lbuf)) + debug_return_int(-1); + debug_return_int(nfound); +} + +static int +output(const char *buf) +{ + struct sudo_conv_message msg; + struct sudo_conv_reply repl; + debug_decl(output, SUDOERS_DEBUG_NSS); + + /* Call conversation function */ + memset(&msg, 0, sizeof(msg)); + msg.msg_type = SUDO_CONV_INFO_MSG; + msg.msg = buf; + memset(&repl, 0, sizeof(repl)); + if (sudo_conv(1, &msg, &repl, NULL) == -1) + debug_return_int(0); + debug_return_int(strlen(buf)); +} + +/* + * Print out privileges for the specified user. + * Returns true on success or -1 on error. + */ +int +display_privs(struct sudo_nss_list *snl, struct passwd *pw, bool verbose) +{ + struct sudo_nss *nss; + struct sudo_lbuf def_buf, priv_buf; + struct stat sb; + int cols, count, olen, n; + debug_decl(display_privs, SUDOERS_DEBUG_PARSER); + + cols = sudo_user.cols; + if (fstat(STDOUT_FILENO, &sb) == 0 && S_ISFIFO(sb.st_mode)) + cols = 0; + sudo_lbuf_init(&def_buf, output, 4, NULL, cols); + sudo_lbuf_init(&priv_buf, output, 8, NULL, cols); + + sudo_lbuf_append(&def_buf, _("Matching Defaults entries for %s on %s:\n"), + pw->pw_name, user_srunhost); + count = 0; + TAILQ_FOREACH(nss, snl, entries) { + n = display_defaults(nss->parse_tree, pw, &def_buf); + if (n == -1) + goto bad; + count += n; + } + if (count != 0) { + sudo_lbuf_append(&def_buf, "\n\n"); + } else { + /* Undo Defaults header. */ + def_buf.len = 0; + } + + /* Display Runas and Cmnd-specific defaults. */ + olen = def_buf.len; + sudo_lbuf_append(&def_buf, _("Runas and Command-specific defaults for %s:\n"), + pw->pw_name); + count = 0; + TAILQ_FOREACH(nss, snl, entries) { + n = display_bound_defaults(nss->parse_tree, pw, &def_buf); + if (n == -1) + goto bad; + count += n; + } + if (count != 0) { + sudo_lbuf_append(&def_buf, "\n\n"); + } else { + /* Undo Defaults header. */ + def_buf.len = olen; + } + + /* Display privileges from all sources. */ + sudo_lbuf_append(&priv_buf, + _("User %s may run the following commands on %s:\n"), + pw->pw_name, user_srunhost); + count = 0; + TAILQ_FOREACH(nss, snl, entries) { + if (nss->query(nss, pw) != -1) { + n = sudo_display_userspecs(nss->parse_tree, pw, &priv_buf, verbose); + if (n == -1) + goto bad; + count += n; + } + } + if (count == 0) { + def_buf.len = 0; + priv_buf.len = 0; + sudo_lbuf_append(&priv_buf, + _("User %s is not allowed to run sudo on %s.\n"), + pw->pw_name, user_srunhost); + } + if (sudo_lbuf_error(&def_buf) || sudo_lbuf_error(&priv_buf)) + goto bad; + + sudo_lbuf_print(&def_buf); + sudo_lbuf_print(&priv_buf); + + sudo_lbuf_destroy(&def_buf); + sudo_lbuf_destroy(&priv_buf); + + debug_return_int(true); +bad: + sudo_lbuf_destroy(&def_buf); + sudo_lbuf_destroy(&priv_buf); + + debug_return_int(-1); +} + +static int +display_cmnd_check(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + time_t now) +{ + int host_match, runas_match, cmnd_match; + struct cmndspec *cs; + struct privilege *priv; + struct userspec *us; + debug_decl(display_cmnd_check, SUDOERS_DEBUG_PARSER); + + TAILQ_FOREACH_REVERSE(us, &parse_tree->userspecs, userspec_list, entries) { + if (userlist_matches(parse_tree, pw, &us->users) != ALLOW) + continue; + TAILQ_FOREACH_REVERSE(priv, &us->privileges, privilege_list, entries) { + host_match = hostlist_matches(parse_tree, pw, &priv->hostlist); + if (host_match != ALLOW) + continue; + TAILQ_FOREACH_REVERSE(cs, &priv->cmndlist, cmndspec_list, entries) { + if (cs->notbefore != UNSPEC) { + if (now < cs->notbefore) + continue; + } + if (cs->notafter != UNSPEC) { + if (now > cs->notafter) + continue; + } + runas_match = runaslist_matches(parse_tree, cs->runasuserlist, + cs->runasgrouplist, NULL, NULL); + if (runas_match == ALLOW) { + cmnd_match = cmnd_matches(parse_tree, cs->cmnd, + cs->runchroot, NULL); + if (cmnd_match != UNSPEC) + debug_return_int(cmnd_match); + } + } + } + } + debug_return_int(UNSPEC); +} + +/* + * Check user_cmnd against sudoers and print the matching entry if the + * command is allowed. + * Returns true if the command is allowed, false if not or -1 on error. + */ +int +display_cmnd(struct sudo_nss_list *snl, struct passwd *pw) +{ + struct sudo_nss *nss; + int m, match = UNSPEC; + int ret = false; + time_t now; + debug_decl(display_cmnd, SUDOERS_DEBUG_PARSER); + + /* Iterate over each source, checking for the command. */ + time(&now); + TAILQ_FOREACH(nss, snl, entries) { + if (nss->query(nss, pw) == -1) { + /* The query function should have printed an error message. */ + debug_return_int(-1); + } + + m = display_cmnd_check(nss->parse_tree, pw, now); + if (m != UNSPEC) + match = m; + + if (!sudo_nss_can_continue(nss, m)) + break; + } + if (match == ALLOW) { + const int len = sudo_printf(SUDO_CONV_INFO_MSG, "%s%s%s\n", + safe_cmnd, user_args ? " " : "", user_args ? user_args : ""); + ret = len < 0 ? -1 : true; + } + debug_return_int(ret); +} diff --git a/plugins/sudoers/parse.h b/plugins/sudoers/parse.h new file mode 100644 index 0000000..711bf87 --- /dev/null +++ b/plugins/sudoers/parse.h @@ -0,0 +1,398 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2000, 2004, 2007-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_PARSE_H +#define SUDOERS_PARSE_H + +#include +#include "sudo_queue.h" + +/* Characters that must be quoted in sudoers. */ +#define SUDOERS_QUOTED ":\\,=#\"" + +/* Returns true if string 's' contains meta characters. */ +#define has_meta(s) (strpbrk(s, "\\?*[]") != NULL) + +#undef UNSPEC +#define UNSPEC -1 +#undef DENY +#define DENY 0 +#undef ALLOW +#define ALLOW 1 +#undef IMPLIED +#define IMPLIED 2 + +/* + * Initialize all tags to UNSPEC. + */ +#define TAGS_INIT(t) do { \ + (t)->follow = UNSPEC; \ + (t)->log_input = UNSPEC; \ + (t)->log_output = UNSPEC; \ + (t)->noexec = UNSPEC; \ + (t)->nopasswd = UNSPEC; \ + (t)->send_mail = UNSPEC; \ + (t)->setenv = UNSPEC; \ +} while (0) + +/* + * Copy any tags set in t2 into t, overriding the value in t. + */ +#define TAGS_MERGE(t, t2) do { \ + if ((t2).follow != UNSPEC) \ + (t).follow = (t2).follow; \ + if ((t2).log_input != UNSPEC) \ + (t).log_input = (t2).log_input; \ + if ((t2).log_output != UNSPEC) \ + (t).log_output = (t2).log_output; \ + if ((t2).noexec != UNSPEC) \ + (t).noexec = (t2).noexec; \ + if ((t2).nopasswd != UNSPEC) \ + (t).nopasswd = (t2).nopasswd; \ + if ((t2).send_mail != UNSPEC) \ + (t).send_mail = (t2).send_mail; \ + if ((t2).setenv != UNSPEC) \ + (t).setenv = (t2).setenv; \ +} while (0) + +/* + * Returns true if any tag are not UNSPEC, else false. + */ +#define TAGS_SET(t) \ + ((t).follow != UNSPEC || (t).log_input != UNSPEC || \ + (t).log_output != UNSPEC || (t).noexec != UNSPEC || \ + (t).nopasswd != UNSPEC || (t).send_mail != UNSPEC || \ + (t).setenv != UNSPEC) + +/* + * Returns true if the specified tag is not UNSPEC or IMPLIED, else false. + */ +#define TAG_SET(tt) \ + ((tt) != UNSPEC && (tt) != IMPLIED) + +/* + * Returns true if any tags set in nt differ between ot and nt, else false. + */ +#define TAGS_CHANGED(ot, nt) \ + ((TAG_SET((nt).follow) && (nt).follow != (ot).follow) || \ + (TAG_SET((nt).log_input) && (nt).log_input != (ot).log_input) || \ + (TAG_SET((nt).log_output) && (nt).log_output != (ot).log_output) || \ + (TAG_SET((nt).noexec) && (nt).noexec != (ot).noexec) || \ + (TAG_SET((nt).nopasswd) && (nt).nopasswd != (ot).nopasswd) || \ + (TAG_SET((nt).setenv) && (nt).setenv != (ot).setenv) || \ + (TAG_SET((nt).send_mail) && (nt).send_mail != (ot).send_mail)) + +/* + * Returns true if the runas user and group lists match, else false. + */ +#define RUNAS_CHANGED(cs1, cs2) \ + ((cs1)->runasuserlist != (cs2)->runasuserlist || \ + (cs1)->runasgrouplist != (cs2)->runasgrouplist) + +struct command_digest { + TAILQ_ENTRY(command_digest) entries; + unsigned int digest_type; + char *digest_str; +}; + +/* + * Tags associated with a command. + * Possible values: true, false, IMPLIED, UNSPEC. + */ +struct cmndtag { + signed int nopasswd: 3; + signed int noexec: 3; + signed int setenv: 3; + signed int log_input: 3; + signed int log_output: 3; + signed int send_mail: 3; + signed int follow: 3; +}; + +/* + * Per-command option container struct. + */ +struct command_options { + time_t notbefore; /* time restriction */ + time_t notafter; /* time restriction */ + int timeout; /* command timeout */ + char *runcwd; /* working directory */ + char *runchroot; /* root directory */ +#ifdef HAVE_SELINUX + char *role, *type; /* SELinux role and type */ +#endif +#ifdef HAVE_PRIV_SET + char *privs, *limitprivs; /* Solaris privilege sets */ +#endif +}; + +/* + * The parsed sudoers file is stored as a collection of linked lists, + * modelled after the yacc grammar. + * + * Other than the alias struct, which is stored in a red-black tree, + * the data structure used is a doubly-linked tail queue. While sudoers + * is being parsed, a headless tail queue is used where the first entry + * acts as the head and the prev pointer does double duty as the tail pointer. + * This makes it possible to trivially append sub-lists. In addition, the prev + * pointer is always valid (even if it points to itself). Unlike a circle + * queue, the next pointer of the last entry is NULL and does not point back + * to the head. When the tail queue is finalized, it is converted to a + * normal BSD tail queue. + */ + +/* + * Tail queue list head structures. + */ +TAILQ_HEAD(defaults_list, defaults); +TAILQ_HEAD(userspec_list, userspec); +TAILQ_HEAD(member_list, member); +TAILQ_HEAD(privilege_list, privilege); +TAILQ_HEAD(cmndspec_list, cmndspec); +TAILQ_HEAD(command_digest_list, command_digest); +STAILQ_HEAD(comment_list, sudoers_comment); + +/* + * Structure describing a user specification and list thereof. + */ +struct userspec { + TAILQ_ENTRY(userspec) entries; + struct member_list users; /* list of users */ + struct privilege_list privileges; /* list of privileges */ + struct comment_list comments; /* optional comments */ + int line; /* line number in sudoers */ + int column; /* column number in sudoers */ + char *file; /* name of sudoers file */ +}; + +/* + * Structure describing a privilege specification. + */ +struct privilege { + TAILQ_ENTRY(privilege) entries; + char *ldap_role; /* LDAP sudoRole */ + struct member_list hostlist; /* list of hosts */ + struct cmndspec_list cmndlist; /* list of Cmnd_Specs */ + struct defaults_list defaults; /* list of sudoOptions */ +}; + +/* + * A command with option args and digest. + * XXX - merge into struct member + */ +struct sudo_command { + char *cmnd; + char *args; + struct command_digest_list digests; +}; + +/* + * Structure describing a linked list of Cmnd_Specs. + * XXX - include struct command_options instead of its contents inline + */ +struct cmndspec { + TAILQ_ENTRY(cmndspec) entries; + struct member_list *runasuserlist; /* list of runas users */ + struct member_list *runasgrouplist; /* list of runas groups */ + struct member *cmnd; /* command to allow/deny */ + struct cmndtag tags; /* tag specificaion */ + int timeout; /* command timeout */ + time_t notbefore; /* time restriction */ + time_t notafter; /* time restriction */ + char *runcwd; /* working directory */ + char *runchroot; /* root directory */ +#ifdef HAVE_SELINUX + char *role, *type; /* SELinux role and type */ +#endif +#ifdef HAVE_PRIV_SET + char *privs, *limitprivs; /* Solaris privilege sets */ +#endif +}; + +/* + * Generic structure to hold users, hosts, commands. + */ +struct member { + TAILQ_ENTRY(member) entries; + char *name; /* member name */ + short type; /* type (see gram.h) */ + short negated; /* negated via '!'? */ +}; + +struct runascontainer { + struct member *runasusers; + struct member *runasgroups; +}; + +struct sudoers_comment { + STAILQ_ENTRY(sudoers_comment) entries; + char *str; +}; + +/* + * Generic structure to hold {User,Host,Runas,Cmnd}_Alias + * Aliases are stored in a red-black tree, sorted by name and type. + */ +struct alias { + char *name; /* alias name */ + unsigned short type; /* {USER,HOST,RUNAS,CMND}ALIAS */ + short used; /* "used" flag for cycle detection */ + int line; /* line number of alias entry */ + int column; /* column number of alias entry */ + char *file; /* file the alias entry was in */ + struct member_list members; /* list of alias members */ +}; + +/* + * Structure describing a Defaults entry in sudoers. + */ +struct defaults { + TAILQ_ENTRY(defaults) entries; + char *var; /* variable name */ + char *val; /* variable value */ + struct member_list *binding; /* user/host/runas binding */ + char *file; /* file Defaults entry was in */ + short type; /* DEFAULTS{,_USER,_RUNAS,_HOST} */ + char op; /* true, false, '+', '-' */ + char error; /* parse error flag */ + int line; /* line number of Defaults entry */ + int column; /* column number of Defaults entry */ +}; + +/* + * Parsed sudoers policy. + */ +struct sudoers_parse_tree { + struct userspec_list userspecs; + struct defaults_list defaults; + struct rbtree *aliases; + const char *shost, *lhost; +}; + +/* + * Info about the command being resolved. + */ +struct cmnd_info { + struct stat cmnd_stat; + char *cmnd_path; + int status; +}; + +/* alias.c */ +struct rbtree *alloc_aliases(void); +void free_aliases(struct rbtree *aliases); +bool no_aliases(struct sudoers_parse_tree *parse_tree); +bool alias_add(struct sudoers_parse_tree *parse_tree, char *name, int type, char *file, int line, int column, struct member *members); +const char *alias_type_to_string(int alias_type); +struct alias *alias_get(struct sudoers_parse_tree *parse_tree, const char *name, int type); +struct alias *alias_remove(struct sudoers_parse_tree *parse_tree, char *name, int type); +bool alias_find_used(struct sudoers_parse_tree *parse_tree, struct rbtree *used_aliases); +void alias_apply(struct sudoers_parse_tree *parse_tree, int (*func)(struct sudoers_parse_tree *, struct alias *, void *), void *cookie); +void alias_free(void *a); +void alias_put(struct alias *a); + +/* gram.c */ +extern struct sudoers_parse_tree parsed_policy; +bool init_parser(const char *path, bool quiet, bool strict); +struct member *new_member_all(char *name); +void free_member(struct member *m); +void free_members(struct member_list *members); +void free_privilege(struct privilege *priv); +void free_userspec(struct userspec *us); +void free_userspecs(struct userspec_list *usl); +void free_default(struct defaults *def, struct member_list **binding); +void free_defaults(struct defaults_list *defs); +void init_parse_tree(struct sudoers_parse_tree *parse_tree, const char *lhost, const char *shost); +void free_parse_tree(struct sudoers_parse_tree *parse_tree); +void reparent_parse_tree(struct sudoers_parse_tree *new_tree); + +/* match_addr.c */ +bool addr_matches(char *n); + +/* match_command.c */ +bool command_matches(const char *sudoers_cmnd, const char *sudoers_args, const char *runchroot, struct cmnd_info *info, const struct command_digest_list *digests); + +/* match_digest.c */ +bool digest_matches(int fd, const char *path, const char *runchroot, const struct command_digest_list *digests); + +/* match.c */ +struct group; +struct passwd; +bool group_matches(const char *sudoers_group, const struct group *gr); +bool hostname_matches(const char *shost, const char *lhost, const char *pattern); +bool netgr_matches(const char *netgr, const char *lhost, const char *shost, const char *user); +bool usergr_matches(const char *group, const char *user, const struct passwd *pw); +bool userpw_matches(const char *sudoers_user, const char *user, const struct passwd *pw); +int cmnd_matches(struct sudoers_parse_tree *parse_tree, const struct member *m, const char *runchroot, struct cmnd_info *info); +int cmndlist_matches(struct sudoers_parse_tree *parse_tree, const struct member_list *list, const char *runchroot, struct cmnd_info *info); +int host_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, const char *host, const char *shost, const struct member *m); +int hostlist_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, const struct member_list *list); +int runaslist_matches(struct sudoers_parse_tree *parse_tree, const struct member_list *user_list, const struct member_list *group_list, struct member **matching_user, struct member **matching_group); +int user_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, const struct member *m); +int userlist_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, const struct member_list *list); +const char *sudo_getdomainname(void); +struct gid_list *runas_getgroups(void); + +/* toke.c */ +void init_lexer(void); + +/* hexchar.c */ +int hexchar(const char *s); + +/* base64.c */ +size_t base64_decode(const char *str, unsigned char *dst, size_t dsize); +size_t base64_encode(const unsigned char *in, size_t in_len, char *out, size_t out_len); + +/* timeout.c */ +int parse_timeout(const char *timestr); + +/* gmtoff.c */ +long get_gmtoff(time_t *clock); + +/* gentime.c */ +time_t parse_gentime(const char *expstr); + +/* filedigest.c */ +unsigned char *sudo_filedigest(int fd, const char *file, int digest_type, size_t *digest_len); + +/* digestname.c */ +const char *digest_type_to_name(int digest_type); + +/* parse.c */ +struct sudo_nss_list; +int sudoers_lookup(struct sudo_nss_list *snl, struct passwd *pw, int *cmnd_status, int pwflag); +int display_privs(struct sudo_nss_list *snl, struct passwd *pw, bool verbose); +int display_cmnd(struct sudo_nss_list *snl, struct passwd *pw); + +/* parse_ldif.c */ +bool sudoers_parse_ldif(struct sudoers_parse_tree *parse_tree, FILE *fp, const char *sudoers_base, bool store_options); + +/* fmtsudoers.c */ +struct sudo_lbuf; +bool sudoers_format_cmndspec(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct cmndspec *cs, struct cmndspec *prev_cs, struct cmndtag tags, bool expand_aliases); +bool sudoers_format_default(struct sudo_lbuf *lbuf, struct defaults *d); +bool sudoers_format_default_line(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct defaults *d, struct defaults **next, bool expand_aliases); +bool sudoers_format_member(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct member *m, const char *separator, int alias_type); +bool sudoers_format_privilege(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct privilege *priv, bool expand_aliases); +bool sudoers_format_userspec(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct userspec *us, bool expand_aliases); +bool sudoers_format_userspecs(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, const char *separator, bool expand_aliases, bool flush); +bool sudoers_defaults_to_tags(const char *var, const char *val, int op, struct cmndtag *tags); +bool sudoers_defaults_list_to_tags(struct defaults_list *defs, struct cmndtag *tags); + +#endif /* SUDOERS_PARSE_H */ diff --git a/plugins/sudoers/parse_ldif.c b/plugins/sudoers/parse_ldif.c new file mode 100644 index 0000000..ce07c19 --- /dev/null +++ b/plugins/sudoers/parse_ldif.c @@ -0,0 +1,778 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#include "sudoers.h" +#include "sudo_ldap.h" +#include "redblack.h" +#include "strlist.h" +#include + +struct sudo_role { + STAILQ_ENTRY(sudo_role) entries; + char *cn; + char *notbefore; + char *notafter; + double order; + struct sudoers_str_list *cmnds; + struct sudoers_str_list *hosts; + struct sudoers_str_list *users; + struct sudoers_str_list *runasusers; + struct sudoers_str_list *runasgroups; + struct sudoers_str_list *options; +}; +STAILQ_HEAD(sudo_role_list, sudo_role); + +static void +sudo_role_free(struct sudo_role *role) +{ + debug_decl(sudo_role_free, SUDOERS_DEBUG_UTIL); + + if (role != NULL) { + free(role->cn); + free(role->notbefore); + free(role->notafter); + str_list_free(role->cmnds); + str_list_free(role->hosts); + str_list_free(role->users); + str_list_free(role->runasusers); + str_list_free(role->runasgroups); + str_list_free(role->options); + free(role); + } + + debug_return; +} + +static struct sudo_role * +sudo_role_alloc(void) +{ + struct sudo_role *role; + debug_decl(sudo_role_alloc, SUDOERS_DEBUG_UTIL); + + role = calloc(1, sizeof(*role)); + if (role != NULL) { + role->cmnds = str_list_alloc(); + role->hosts = str_list_alloc(); + role->users = str_list_alloc(); + role->runasusers = str_list_alloc(); + role->runasgroups = str_list_alloc(); + role->options = str_list_alloc(); + if (role->cmnds == NULL || role->hosts == NULL || + role->users == NULL || role->runasusers == NULL || + role->runasgroups == NULL || role->options == NULL) { + sudo_role_free(role); + role = NULL; + } + } + + debug_return_ptr(role); +} + +/* + * Parse an LDIF line, filling in attribute name and value. + * Modifies line, decodes base64 attribute values if present. + * See http://www.faqs.org/rfcs/rfc2849.html + */ +static bool +ldif_parse_attribute(char *line, char **name, char **value) +{ + bool encoded = false; + char *attr, *cp, *ep, *colon; + size_t len; + debug_decl(ldif_parse_attribute, SUDOERS_DEBUG_UTIL); + + /* Parse attribute name: [a-zA-Z][a-zA-Z0-9-]*: */ + if (!isalpha((unsigned char)*line)) + debug_return_bool(false); + for (cp = line + 1; *cp != ':' && *cp != '\0'; cp++) { + if (!isalnum((unsigned char)*cp) && *cp != '-') + debug_return_bool(false); + } + if (*cp != ':') + debug_return_bool(false); + colon = cp++; + + /* Check for foo:: base64str. */ + if (*cp == ':') { + encoded = true; + cp++; + } + + /* Trim leading and trailing space. */ + while (*cp == ' ') + cp++; + + ep = cp + strlen(cp); + while (ep > cp && ep[-1] == ' ') { + ep--; + /* Don't trim escaped trailing space if not base64. */ + if (!encoded && ep != cp && ep[-1] == '\\') + break; + *ep = '\0'; + } + + attr = cp; + if (encoded) { + /* + * Decode base64 inline and add NUL-terminator. + * The copy allows us to provide a useful message on error. + */ + char *copy = strdup(attr); + if (copy == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + len = base64_decode(attr, (unsigned char *)copy, strlen(copy)); + if (len == (size_t)-1) { + free(copy); + debug_return_bool(false); + } + memcpy(attr, copy, len); + attr[len] = '\0'; + free(copy); + } + + *colon = '\0'; + *name = line; + *value = attr; + + debug_return_bool(true); +} + +/* + * Allocate a struct sudoers_string, store str in it and + * insert into the specified strlist. + */ +static void +ldif_store_string(const char *str, struct sudoers_str_list *strlist, bool sorted) +{ + struct sudoers_string *ls; + debug_decl(ldif_store_string, SUDOERS_DEBUG_UTIL); + + if ((ls = sudoers_string_alloc(str)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + if (!sorted) { + STAILQ_INSERT_TAIL(strlist, ls, entries); + } else { + struct sudoers_string *prev, *next; + + /* Insertion sort, list is small. */ + prev = STAILQ_FIRST(strlist); + if (prev == NULL || strcasecmp(str, prev->str) <= 0) { + STAILQ_INSERT_HEAD(strlist, ls, entries); + } else { + while ((next = STAILQ_NEXT(prev, entries)) != NULL) { + if (strcasecmp(str, next->str) <= 0) + break; + prev = next; + } + STAILQ_INSERT_AFTER(strlist, prev, ls, entries); + } + } + + debug_return; +} + +/* + * Iterator for sudo_ldap_role_to_priv(). + * Takes a pointer to a struct sudoers_string *. + * Returns the string or NULL if we've reached the end. + */ +static char * +sudoers_string_iter(void **vp) +{ + struct sudoers_string *ls = *vp; + + if (ls == NULL) + return NULL; + + *vp = STAILQ_NEXT(ls, entries); + + return ls->str; +} + +static int +role_order_cmp(const void *va, const void *vb) +{ + const struct sudo_role *a = *(const struct sudo_role **)va; + const struct sudo_role *b = *(const struct sudo_role **)vb; + debug_decl(role_order_cmp, SUDOERS_DEBUG_LDAP); + + debug_return_int(a->order < b->order ? -1 : + (a->order > b->order ? 1 : 0)); +} + +/* + * Parse list of sudoOption and store in the parse tree's defaults list. + */ +static void +ldif_store_options(struct sudoers_parse_tree *parse_tree, + struct sudoers_str_list *options) +{ + struct defaults *d; + struct sudoers_string *ls; + char *var, *val; + debug_decl(ldif_store_options, SUDOERS_DEBUG_UTIL); + + STAILQ_FOREACH(ls, options, entries) { + if ((d = calloc(1, sizeof(*d))) == NULL || + (d->binding = malloc(sizeof(*d->binding))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + TAILQ_INIT(d->binding); + d->type = DEFAULTS; + d->op = sudo_ldap_parse_option(ls->str, &var, &val); + if ((d->var = strdup(var)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + if (val != NULL) { + if ((d->val = strdup(val)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + TAILQ_INSERT_TAIL(&parse_tree->defaults, d, entries); + } + debug_return; +} + +static int +str_list_cmp(const void *aa, const void *bb) +{ + const struct sudoers_str_list *a = aa; + const struct sudoers_str_list *b = bb; + const struct sudoers_string *lsa = STAILQ_FIRST(a); + const struct sudoers_string *lsb = STAILQ_FIRST(b); + int ret; + + while (lsa != NULL && lsb != NULL) { + if ((ret = strcasecmp(lsa->str, lsb->str)) != 0) + return ret; + lsa = STAILQ_NEXT(lsa, entries); + lsb = STAILQ_NEXT(lsb, entries); + } + return lsa == lsb ? 0 : (lsa == NULL ? -1 : 1); +} + +static int +str_list_cache(struct rbtree *cache, struct sudoers_str_list **strlistp) +{ + struct sudoers_str_list *strlist = *strlistp; + struct rbnode *node; + int ret; + debug_decl(str_list_cache, SUDOERS_DEBUG_UTIL); + + ret = rbinsert(cache, strlist, &node); + switch (ret) { + case 0: + /* new entry, take a ref for the cache */ + strlist->refcnt++; + break; + case 1: + /* already exists, use existing and take a ref. */ + str_list_free(strlist); + strlist = node->data; + strlist->refcnt++; + *strlistp = strlist; + break; + } + debug_return_int(ret); +} + +/* + * Convert a sudoRole to sudoers format and store in the parse tree. + */ +static void +role_to_sudoers(struct sudoers_parse_tree *parse_tree, struct sudo_role *role, + bool store_options, bool reuse_userspec, bool reuse_privilege, + bool reuse_runas) +{ + struct privilege *priv; + struct sudoers_string *ls; + struct userspec *us; + struct member *m; + debug_decl(role_to_sudoers, SUDOERS_DEBUG_UTIL); + + /* + * TODO: use cn to create a UserAlias if multiple users in it? + */ + + if (reuse_userspec) { + /* Re-use the previous userspec */ + us = TAILQ_LAST(&parse_tree->userspecs, userspec_list); + } else { + /* Allocate a new userspec and fill in the user list. */ + if ((us = calloc(1, sizeof(*us))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + TAILQ_INIT(&us->privileges); + TAILQ_INIT(&us->users); + STAILQ_INIT(&us->comments); + + STAILQ_FOREACH(ls, role->users, entries) { + char *user = ls->str; + + if ((m = calloc(1, sizeof(*m))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + m->negated = sudo_ldap_is_negated(&user); + switch (*user) { + case '\0': + /* Empty RunAsUser means run as the invoking user. */ + m->type = MYSELF; + break; + case '+': + m->type = NETGROUP; + break; + case '%': + m->type = USERGROUP; + break; + case 'A': + if (strcmp(user, "ALL") == 0) { + m->type = ALL; + break; + } + FALLTHROUGH; + default: + m->type = WORD; + break; + } + if (m->type != ALL && m->type != MYSELF) { + if ((m->name = strdup(user)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + TAILQ_INSERT_TAIL(&us->users, m, entries); + } + } + + /* Add source role as a comment. */ + if (role->cn != NULL) { + struct sudoers_comment *comment = NULL; + if (reuse_userspec) { + /* Try to re-use comment too. */ + STAILQ_FOREACH(comment, &us->comments, entries) { + if (strncasecmp(comment->str, "sudoRole ", 9) == 0) { + char *tmpstr; + if (asprintf(&tmpstr, "%s, %s", comment->str, role->cn) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + free(comment->str); + comment->str = tmpstr; + break; + } + } + } + if (comment == NULL) { + /* Create a new comment. */ + if ((comment = malloc(sizeof(*comment))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + if (asprintf(&comment->str, "sudoRole %s", role->cn) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + STAILQ_INSERT_TAIL(&us->comments, comment, entries); + } + } + + /* Convert role to sudoers privilege. */ + priv = sudo_ldap_role_to_priv(role->cn, STAILQ_FIRST(role->hosts), + STAILQ_FIRST(role->runasusers), STAILQ_FIRST(role->runasgroups), + STAILQ_FIRST(role->cmnds), STAILQ_FIRST(role->options), + role->notbefore, role->notafter, true, store_options, + sudoers_string_iter); + if (priv == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + + if (reuse_privilege) { + /* Hostspec unchanged, append cmndlist to previous privilege. */ + struct privilege *prev_priv = TAILQ_LAST(&us->privileges, privilege_list); + if (reuse_runas) { + /* Runas users and groups same if as in previous privilege. */ + struct member_list *runasuserlist = + TAILQ_FIRST(&prev_priv->cmndlist)->runasuserlist; + struct member_list *runasgrouplist = + TAILQ_FIRST(&prev_priv->cmndlist)->runasgrouplist; + struct cmndspec *cmndspec = TAILQ_FIRST(&priv->cmndlist); + + /* Free duplicate runas lists. */ + if (cmndspec->runasuserlist != NULL) { + free_members(cmndspec->runasuserlist); + free(cmndspec->runasuserlist); + } + if (cmndspec->runasgrouplist != NULL) { + free_members(cmndspec->runasgrouplist); + free(cmndspec->runasgrouplist); + } + + /* Update cmndspec with previous runas lists. */ + TAILQ_FOREACH(cmndspec, &priv->cmndlist, entries) { + cmndspec->runasuserlist = runasuserlist; + cmndspec->runasgrouplist = runasgrouplist; + } + } + TAILQ_CONCAT(&prev_priv->cmndlist, &priv->cmndlist, entries); + free_privilege(priv); + } else { + TAILQ_INSERT_TAIL(&us->privileges, priv, entries); + } + + /* Add finished userspec to the list if new. */ + if (!reuse_userspec) + TAILQ_INSERT_TAIL(&parse_tree->userspecs, us, entries); + + debug_return; +} + +/* + * Convert the list of sudoRoles to sudoers format and store in the parse tree. + */ +static void +ldif_to_sudoers(struct sudoers_parse_tree *parse_tree, + struct sudo_role_list *roles, unsigned int numroles, bool store_options) +{ + struct sudo_role **role_array, *role = NULL; + unsigned int n; + debug_decl(ldif_to_sudoers, SUDOERS_DEBUG_UTIL); + + /* Convert from list of roles to array and sort by order. */ + role_array = reallocarray(NULL, numroles + 1, sizeof(*role_array)); + for (n = 0; n < numroles; n++) { + if ((role = STAILQ_FIRST(roles)) == NULL) + break; /* cannot happen */ + STAILQ_REMOVE_HEAD(roles, entries); + role_array[n] = role; + } + role_array[n] = NULL; + qsort(role_array, numroles, sizeof(*role_array), role_order_cmp); + + /* + * Iterate over roles in sorted order, converting to sudoers. + */ + for (n = 0; n < numroles; n++) { + bool reuse_userspec = false; + bool reuse_privilege = false; + bool reuse_runas = false; + + role = role_array[n]; + + /* Check whether we can reuse the previous user and host specs */ + if (n > 0 && role->users == role_array[n - 1]->users) { + reuse_userspec = true; + + /* + * Since options are stored per-privilege we can't + * append to the previous privilege's cmndlist if + * we are storing options. + */ + if (!store_options) { + if (role->hosts == role_array[n - 1]->hosts) { + reuse_privilege = true; + + /* Reuse runasusers and runasgroups if possible. */ + if (role->runasusers == role_array[n - 1]->runasusers && + role->runasgroups == role_array[n - 1]->runasgroups) + reuse_runas = true; + } + } + } + + role_to_sudoers(parse_tree, role, store_options, reuse_userspec, + reuse_privilege, reuse_runas); + } + + /* Clean up. */ + for (n = 0; n < numroles; n++) + sudo_role_free(role_array[n]); + free(role_array); + + debug_return; +} + +/* + * Given a cn with possible quoted characters, return a copy of + * the cn with quote characters ('\\') removed. + * The caller is responsible for freeing the returned string. + */ +static +char *unquote_cn(const char *src) +{ + char *dst, *new_cn; + size_t len; + debug_decl(unquote_cn, SUDOERS_DEBUG_UTIL); + + len = strlen(src); + if ((new_cn = malloc(len + 1)) == NULL) + debug_return_str(NULL); + + for (dst = new_cn; *src != '\0';) { + if (src[0] == '\\' && src[1] != '\0') + src++; + *dst++ = *src++; + } + *dst = '\0'; + + debug_return_str(new_cn); +} + +/* + * Parse a sudoers file in LDIF format, https://tools.ietf.org/html/rfc2849 + * Parsed sudoRole objects are stored in the specified parse_tree which + * must already be initialized. + */ +bool +sudoers_parse_ldif(struct sudoers_parse_tree *parse_tree, + FILE *fp, const char *sudoers_base, bool store_options) +{ + struct sudo_role_list roles = STAILQ_HEAD_INITIALIZER(roles); + struct sudo_role *role = NULL; + struct rbtree *usercache, *groupcache, *hostcache; + unsigned numroles = 0; + bool in_role = false; + size_t linesize = 0; + char *attr, *name, *line = NULL, *savedline = NULL; + ssize_t savedlen = 0; + bool mismatch = false; + int errors = 0; + debug_decl(sudoers_parse_ldif, SUDOERS_DEBUG_UTIL); + + /* Free old contents of the parse tree (if any). */ + free_parse_tree(parse_tree); + + /* + * We cache user, group and host lists to make it eay to detect when there + * are identical lists (simple pointer compare). This makes it possible + * to merge multiplpe sudoRole objects into a single UserSpec and/or + * Privilege. The lists are sorted since LDAP order is arbitrary. + */ + usercache = rbcreate(str_list_cmp); + groupcache = rbcreate(str_list_cmp); + hostcache = rbcreate(str_list_cmp); + if (usercache == NULL || groupcache == NULL || hostcache == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Read through input, parsing into sudo_roles and global defaults. */ + for (;;) { + int ch; + ssize_t len = getdelim(&line, &linesize, '\n', fp); + + /* Trim trailing return or newline. */ + while (len > 0 && (line[len - 1] == '\r' || line[len - 1] == '\n')) + line[--len] = '\0'; + + /* Blank line or EOF terminates an entry. */ + if (len <= 0) { + if (in_role) { + if (role->cn != NULL && strcasecmp(role->cn, "defaults") == 0) { + ldif_store_options(parse_tree, role->options); + sudo_role_free(role); + } else if (STAILQ_EMPTY(role->users) || + STAILQ_EMPTY(role->hosts) || STAILQ_EMPTY(role->cmnds)) { + /* Incomplete role. */ + sudo_warnx(U_("ignoring incomplete sudoRole: cn: %s"), + role->cn ? role->cn : "UNKNOWN"); + sudo_role_free(role); + } else { + /* Cache users, hosts, runasusers and runasgroups. */ + if (str_list_cache(usercache, &role->users) == -1 || + str_list_cache(hostcache, &role->hosts) == -1 || + str_list_cache(usercache, &role->runasusers) == -1 || + str_list_cache(groupcache, &role->runasgroups) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + + /* Store finished role. */ + STAILQ_INSERT_TAIL(&roles, role, entries); + numroles++; + } + role = NULL; + in_role = false; + } + if (len == -1) { + /* EOF */ + break; + } + mismatch = false; + continue; + } + + if (savedline != NULL) { + char *tmp; + + /* Append to saved line. */ + linesize = savedlen + len + 1; + if ((tmp = realloc(savedline, linesize)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + memcpy(tmp + savedlen, line, len + 1); + free(line); + line = tmp; + savedline = NULL; + } + + /* Check for folded line */ + if ((ch = getc(fp)) == ' ') { + /* folded line, append to the saved portion. */ + savedlen = len; + savedline = line; + line = NULL; + linesize = 0; + continue; + } + ungetc(ch, fp); /* not folded, push back ch */ + + /* Skip comment lines or records that don't match the base. */ + if (*line == '#' || mismatch) + continue; + + /* Reject invalid LDIF. */ + if (!ldif_parse_attribute(line, &name, &attr)) { + sudo_warnx(U_("invalid LDIF attribute: %s"), line); + errors++; + continue; + } + + /* Parse dn and objectClass. */ + if (strcasecmp(name, "dn") == 0) { + /* Compare dn to base, if specified. */ + if (sudoers_base != NULL) { + /* Skip over cn if present. */ + if (strncasecmp(attr, "cn=", 3) == 0) { + for (attr += 3; *attr != '\0'; attr++) { + /* Handle escaped ',' chars. */ + if (*attr == '\\') + attr++; + if (*attr == ',') { + attr++; + break; + } + } + } + if (strcasecmp(attr, sudoers_base) != 0) { + /* Doesn't match base, skip the rest of it. */ + mismatch = true; + continue; + } + } + } else if (strcasecmp(name, "objectClass") == 0) { + if (strcasecmp(attr, "sudoRole") == 0) { + /* Allocate new role as needed. */ + if (role == NULL) { + if ((role = sudo_role_alloc()) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + in_role = true; + } + } + + /* Not in a sudoRole, keep reading. */ + if (!in_role) + continue; + + /* Part of a sudoRole, parse it. */ + if (strcasecmp(name, "cn") == 0) { + free(role->cn); + role->cn = unquote_cn(attr); + if (role->cn == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } else if (strcasecmp(name, "sudoUser") == 0) { + ldif_store_string(attr, role->users, true); + } else if (strcasecmp(name, "sudoHost") == 0) { + ldif_store_string(attr, role->hosts, true); + } else if (strcasecmp(name, "sudoRunAs") == 0) { + ldif_store_string(attr, role->runasusers, true); + } else if (strcasecmp(name, "sudoRunAsUser") == 0) { + ldif_store_string(attr, role->runasusers, true); + } else if (strcasecmp(name, "sudoRunAsGroup") == 0) { + ldif_store_string(attr, role->runasgroups, true); + } else if (strcasecmp(name, "sudoCommand") == 0) { + ldif_store_string(attr, role->cmnds, false); + } else if (strcasecmp(name, "sudoOption") == 0) { + ldif_store_string(attr, role->options, false); + } else if (strcasecmp(name, "sudoOrder") == 0) { + char *ep; + role->order = strtod(attr, &ep); + if (ep == attr || *ep != '\0') { + sudo_warnx(U_("invalid sudoOrder attribute: %s"), attr); + errors++; + } + } else if (strcasecmp(name, "sudoNotBefore") == 0) { + free(role->notbefore); + role->notbefore = strdup(attr); + if (role->notbefore == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } else if (strcasecmp(name, "sudoNotAfter") == 0) { + free(role->notafter); + role->notafter = strdup(attr); + if (role->notafter == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + } + sudo_role_free(role); + free(line); + + /* Convert from roles to sudoers data structures. */ + ldif_to_sudoers(parse_tree, &roles, numroles, store_options); + + /* Clean up. */ + rbdestroy(usercache, str_list_free); + rbdestroy(groupcache, str_list_free); + rbdestroy(hostcache, str_list_free); + + if (fp != stdin) + fclose(fp); + + debug_return_bool(errors == 0); +} diff --git a/plugins/sudoers/po/README b/plugins/sudoers/po/README new file mode 100644 index 0000000..ff9b845 --- /dev/null +++ b/plugins/sudoers/po/README @@ -0,0 +1,14 @@ +NLS Translations for sudo are coordinated through the Translation +Project, at http://translationproject.org/ + +If you would like to contribute a translation for sudo, please join +a translation team at the Translation Project instead of contributing +a po file directly. This will avoid duplicated work if there is +already a translation in progress. If you would like to become a +member of a translation team, please follow the instructions at +http://translationproject.org/html/translators.html + +The messages in sudo are split into two domains: sudo and sudoers. +The former is used by the sudo front-end and utility functions. +The latter is used by the sudoers policy and I/O logging plug-ins +as well as the sudoers-specific commands visudo and sudoreplay. diff --git a/plugins/sudoers/po/ast.mo b/plugins/sudoers/po/ast.mo new file mode 100644 index 0000000..05cd28b Binary files /dev/null and b/plugins/sudoers/po/ast.mo differ diff --git a/plugins/sudoers/po/ast.po b/plugins/sudoers/po/ast.po new file mode 100644 index 0000000..0957204 --- /dev/null +++ b/plugins/sudoers/po/ast.po @@ -0,0 +1,2343 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# +# Todd C. Miller , 2011-2016. +# enolp , 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.28b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-07-19 10:39-0600\n" +"PO-Revision-Date: 2019-08-03 14:37+0200\n" +"Last-Translator: enolp \n" +"Language-Team: Asturian \n" +"Language: ast\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 19.04.3\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "fallu de sintaxis" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Contraseña de %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] contraseña de %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Contraseña:" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Información de SEGURANZA pa %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Perdona pero volvi tentalo." + +#: gram.y:194 gram.y:242 gram.y:249 gram.y:256 gram.y:263 gram.y:270 +#: gram.y:286 gram.y:310 gram.y:317 gram.y:324 gram.y:331 gram.y:338 +#: gram.y:401 gram.y:409 gram.y:419 gram.y:452 gram.y:459 gram.y:466 +#: gram.y:473 gram.y:555 gram.y:562 gram.y:571 gram.y:580 gram.y:597 +#: gram.y:709 gram.y:716 gram.y:723 gram.y:731 gram.y:831 gram.y:838 +#: gram.y:845 gram.y:852 gram.y:859 gram.y:885 gram.y:892 gram.y:899 +#: gram.y:1022 gram.y:1296 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:664 plugins/sudoers/defaults.c:957 +#: plugins/sudoers/defaults.c:1128 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:85 plugins/sudoers/iolog_util.c:124 +#: plugins/sudoers/iolog_util.c:133 plugins/sudoers/iolog_util.c:143 +#: plugins/sudoers/iolog_util.c:151 plugins/sudoers/iolog_util.c:155 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1235 plugins/sudoers/ldap.c:1662 +#: plugins/sudoers/ldap.c:1699 plugins/sudoers/ldap.c:1780 +#: plugins/sudoers/ldap.c:1915 plugins/sudoers/ldap.c:2016 +#: plugins/sudoers/ldap.c:2032 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:445 +#: plugins/sudoers/ldap_conf.c:460 plugins/sudoers/ldap_conf.c:557 +#: plugins/sudoers/ldap_conf.c:590 plugins/sudoers/ldap_conf.c:682 +#: plugins/sudoers/ldap_conf.c:764 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:566 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:519 +#: plugins/sudoers/logging.c:545 plugins/sudoers/logging.c:586 +#: plugins/sudoers/logging.c:727 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:143 +#: plugins/sudoers/parse_ldif.c:170 plugins/sudoers/parse_ldif.c:239 +#: plugins/sudoers/parse_ldif.c:246 plugins/sudoers/parse_ldif.c:251 +#: plugins/sudoers/parse_ldif.c:327 plugins/sudoers/parse_ldif.c:338 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:369 +#: plugins/sudoers/parse_ldif.c:381 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:399 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:596 plugins/sudoers/parse_ldif.c:621 +#: plugins/sudoers/parse_ldif.c:681 plugins/sudoers/parse_ldif.c:700 +#: plugins/sudoers/parse_ldif.c:746 plugins/sudoers/parse_ldif.c:756 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:746 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:272 plugins/sudoers/pwutil.c:350 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:590 +#: plugins/sudoers/pwutil.c:661 plugins/sudoers/pwutil.c:820 +#: plugins/sudoers/pwutil.c:878 plugins/sudoers/pwutil.c:923 +#: plugins/sudoers/pwutil.c:982 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "nun pue allugase memoria" + +#: gram.y:484 +msgid "a digest requires a path name" +msgstr "un digest rique un nome de camín" + +#: gram.y:610 +msgid "invalid notbefore value" +msgstr "el valor de notbefore nun ye válidu" + +#: gram.y:618 +msgid "invalid notafter value" +msgstr "el valor de notafter nun ye válidu" + +#: gram.y:627 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "el valor de la escosa del tiempu d'espera ye pergrande" + +#: gram.y:629 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "la escosa del tiempu d'espera nun ye válida" + +#: gram.y:1296 plugins/sudoers/auth/pam.c:468 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:664 +#: plugins/sudoers/defaults.c:957 plugins/sudoers/defaults.c:1128 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:941 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:85 +#: plugins/sudoers/iolog_util.c:124 plugins/sudoers/iolog_util.c:133 +#: plugins/sudoers/iolog_util.c:143 plugins/sudoers/iolog_util.c:151 +#: plugins/sudoers/iolog_util.c:155 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1235 +#: plugins/sudoers/ldap.c:1662 plugins/sudoers/ldap.c:1699 +#: plugins/sudoers/ldap.c:1780 plugins/sudoers/ldap.c:1915 +#: plugins/sudoers/ldap.c:2016 plugins/sudoers/ldap.c:2032 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:445 plugins/sudoers/ldap_conf.c:460 +#: plugins/sudoers/ldap_conf.c:557 plugins/sudoers/ldap_conf.c:590 +#: plugins/sudoers/ldap_conf.c:681 plugins/sudoers/ldap_conf.c:764 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:566 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:142 +#: plugins/sudoers/parse_ldif.c:169 plugins/sudoers/parse_ldif.c:238 +#: plugins/sudoers/parse_ldif.c:245 plugins/sudoers/parse_ldif.c:250 +#: plugins/sudoers/parse_ldif.c:326 plugins/sudoers/parse_ldif.c:337 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:368 +#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:384 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:595 plugins/sudoers/parse_ldif.c:620 +#: plugins/sudoers/parse_ldif.c:680 plugins/sudoers/parse_ldif.c:699 +#: plugins/sudoers/parse_ldif.c:745 plugins/sudoers/parse_ldif.c:755 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:746 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:272 +#: plugins/sudoers/pwutil.c:350 plugins/sudoers/pwutil.c:524 +#: plugins/sudoers/pwutil.c:590 plugins/sudoers/pwutil.c:661 +#: plugins/sudoers/pwutil.c:820 plugins/sudoers/pwutil.c:878 +#: plugins/sudoers/pwutil.c:923 plugins/sudoers/pwutil.c:982 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Yá se definió l'alias «%s»" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:788 +msgid "unable to fork" +msgstr "nun pue biforcase" + +#: plugins/sudoers/auth/aix_auth.c:281 +#, fuzzy, c-format +#| msgid "unable to change expired password: %s" +msgid "unable to change password for %s" +msgstr "nun pue camudase la contraseña caducada: %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "nun pue consiguise la clas pal usuariu %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "la triba d'autenticación nun ye válida" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "nun pue aniciase l'autenticaciónde BSD" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "la to cuenta caducó" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "fallu de l'aprobación" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "nun pue lleese la configuración de fwtk" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "nun pue coneutase col sirvidor d'autenticación" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "perdióse la conexón col sirvidor d'autenticación" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"fallu del sirvidor d'autenticación:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: nun pue analizase «%s»: %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: nun pue resolvese la caché de credenciales: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: nun pue allugase les opciones: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: nun puen consiguise les credenciales: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: nun pue aniciase la caché de credenciales: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: nun pue atroxase la credencial na caché: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Nun pue verificase'l TGT, ¡quiciabes tean atacándote! : %s" + +#: plugins/sudoers/auth/pam.c:200 +msgid "unable to initialize PAM" +msgstr "nun pue aniciase PAM" + +#: plugins/sudoers/auth/pam.c:299 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Fallu d'autenticación PAM: %s" + +#: plugins/sudoers/auth/pam.c:318 +msgid "account validation failure, is your account locked?" +msgstr "fallu de la validación de la cuenta, ¿tienes la cuenta bloquiada?" + +#: plugins/sudoers/auth/pam.c:329 +msgid "Account or password is expired, reset your password and try again" +msgstr "Caducó la cuenta o la contraseña, reanicia la to contraseña y volvi tentalo" + +#: plugins/sudoers/auth/pam.c:337 +#, c-format +msgid "unable to change expired password: %s" +msgstr "nun pue camudase la contraseña caducada: %s" + +#: plugins/sudoers/auth/pam.c:348 +msgid "Password expired, contact your system administrator" +msgstr "Caducó la contraseña, contauta col alministrador de sistemes" + +#: plugins/sudoers/auth/pam.c:353 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "La cuenta caducó o a la configuración de PAM fálta-y la seición «account» pa sudo, contauta col alministrador de sistemes" + +#: plugins/sudoers/auth/pam.c:361 plugins/sudoers/auth/pam.c:367 +#, c-format +msgid "PAM account management error: %s" +msgstr "Fallu de la xesión de cuentes PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "nun esistes na base de datos %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "fallu al aniciar la biblioteca ACE API" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "nun pue contautase col sirvidor de SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "Falló la comunicación de SecurID" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "desconozse'l fallu de SecurID" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "nun pue aniciase la sesión SIA" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "métodos d'autenticación non válidos" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "¡Compiláronse en sudo métodos d'autenticación non válidos! Nun podríes combinar l'autenticación independiente y non independiente." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "nun hai métodos d'autenticación" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "¡Nun se compilaron en sudo métodos d'autenticación! Si quies desactivar l'autenticación, usa la opción de configuración --disable-authentication ." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Nun puen aniciase los métodos d'autenticación." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Métodos d'autenticación:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Nun pudo determinase la condición d'autoría" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "nun pue unviase'l rexistru d'auditoría" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:698 plugins/sudoers/sudoers.c:743 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "desconozse l'UID: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:917 plugins/sudoers/sudoers.c:1158 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "desconozse l'usuariu: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s versión %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "Gramática de %s na versión %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "nun se sofita'l formatu d'entrada %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "nun se sofita'l formatu de salida %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: los ficheros d'entrada y salida han ser diferentes" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:174 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "nun puen aniciase los valores predeterminaos de sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:435 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: desconozse la pallabra clave: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "la peñera nun ye válida: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:74 plugins/sudoers/sudoers.c:909 +#: plugins/sudoers/sudoreplay.c:335 plugins/sudoers/sudoreplay.c:1427 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "nun pue abrise %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "fallu al analizar el ficheru %s, fallu desconocíu" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "fallu d'analís en %s cierca de la llinia %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "fallu d'analís en %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1131 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "nun pue escribise en %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "desconozse lo predeterminao de la entrada «%s»" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "nun pue consiguise la hora GMT" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "nun pue formatiase la marca de tiempu" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1054 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1092 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:847 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "fallu internu, sobrecarga de %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "nun s'afitó la variable d'entornu SUDOERS_BASE y tampoco s'especificó la opción -b" + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "La prioridá a usar de syslog cuando un usuariu s'autentica con ésitu: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "La prioridá a usar de syslog cuando un usuariu nun s'autentica con ésitu: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Inora «.» en $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Unviar siempres un corréu cuando sudo ta n'execución" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Unvia un corréu si falla l'autenticación del usuariu" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Unvia un corréu si l'usuariu nun ta en sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Unvia un corréu si l'usuariu nun ta nel sudoers d'esti agospiu" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Unvia un corréu si l'usuariu nun tien permisu pa executar un comandu" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Unvia un corréu si l'usuariu tenta d'executar un comandu" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Ficheru que contién la llectura de sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Rique que los usuarios s'autentiquen por defeutu" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root podría executar sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Rexistra l'añu nel ficheru de rexistru (non syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Si s'invoca sudo ensin argumentos, anicia una shell" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Afita $HOME al usuariu de destín al aniciar una shell con -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Siempres afita $HOME al direutoriu d'aniciu del usuariu de destín" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permite la recoyida de della información pa dar mensaxes de fallu útiles" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulta al usuariu cuando introduza una contraseña incorreuta" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Namái permite que l'usuariu execute sudo si tien una TTY" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo va respetar la variable d'entornu EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Afita les variables d'entornu LOGNAME y USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Namái afita l'UID efeutivu al usuariu de destín, non al UID real" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Llargor al que s'axusten les llinies del ficheru de rexistru (0 pa nun axustar): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Escosa del tiempu d'espera de la marca de tiempu de l'autenticación: %.1f minutes" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Escosa del tiempu d'espera pa la introducción de contraseñes: %.1f minutes" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Númberu d'intentos pa introducir una contraseña: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Camín al ficheru de rexistru: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Camín al programa de corréu: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Banderes pal programa de corréu: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Direición a la qu'unviar correos: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Direición dende la qu'unviar correos: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Asuntu de los mensaxes de corréu: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Mensaxe de contraseña incorreuta: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Camín al direutoriu de marques de tiempu de l'autenticación: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Usuariu predeterminái pa executar comandos como: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valor col qu'anular el $PATH d'usuariu: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Camín al editor que va usar visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Si'l direutoriu LDAP ta activu, inoramos el ficheru sudoers llocal" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Si s'afita, los usuarios podríen anular el valor de «closefrom» cola opción -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permite que los usuarios afiten variables d'entornu arbitraries" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Reafita l'entornu al conxuntu de variables predetermináu" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Variables d'entornu a desaniciar:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Variables d'entornu a caltener:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "El rol de SELinux a usar nel contestu de seguranza nuevu: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "La triba de SELinux a usar nel contestu de seguranza nuevu: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Camín al ficheru d'entornu específicu de sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Camín al ficheru d'entornu restrinxíu y específicu de sudo: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "La locale a usar mentanto s'analiza sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permite a sudo pidir una contraseña magar que seya visible" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "El umask especificáu en sudoers va anular el del usuariu, magar que seya más permisivu" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Rexistra la entrada d'usuariu pal comandu que ta n'execución" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Rexistra la salida del comandu que ta n'execución" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Comprime los rexistros d'E/S usando zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Executa siempres los comandos nuna pseudoTTY" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Complementu pal sofitu de grupos non Unix: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Direutoriu nel que s'atroxen los rexistros d'entrada/salida: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Ficheru nel que s'atroxen los rexistros d'entrada/salida: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Amiesta una entrada al ficheru utmp/utmpx al allugar una PTY" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Conxuntu de privilexos permitíos: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Conxuntu de privilexos llendaos: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Executa comandos nuna PTY en segundu planu" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nome del serviciu PAM a usar: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nome del serviciu PAM a usar pa les shells d'aniciu de sesión: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tenta d'afitar les credenciales de PAM pal usuariu de destín" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Crea una sesión PAM nueva pal comandu que va executase nella" + +#: plugins/sudoers/def_data.c:402 +#, fuzzy +#| msgid "PAM account management error: %s" +msgid "Perform PAM account validation management" +msgstr "Fallu de la xesión de cuentes PAM: %s" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Númberu máximu de secuencies de rexistru d'E/S: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Comprueba'l permisu d'escritura nos direutorios parentales al editar ficheros con sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Sigue enllaces simbólicos cuando s'editen ficheros con sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permite que los comandos s'executen magar que sudo nun puea escribir nel rexistru d'auditoría" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permite que los comandos s'executen magar que sudo nun puea escribir nel rexistru d'E/S" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permite que los comandos s'executen magar que sudo nun puea escribir nel ficheru de rexistru " + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Les entraes mayores qu'esti valor nun van dixebrase en mensaxes de syslog múltiples: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "L'usuariu que va ser propietariu de los ficheros de rexistru d'E/S: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "El grupu que va ser propietariu de los ficheros de rexistru d'E/S: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Executa comandos pol descriptor de ficheru en cuentes de pol camín: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "El tiempu en segundos tres el que'l comandu va terminar: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permite que l'usuariu especifique na llinia de comandos una escosa del tiempu d'espera" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Rexistru de la marca de tiempu de la triba d'autentiación: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Mensaxe del fallu d'autenticación: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d desconozse lo predeterminao de la entrada «%s»" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: desconozse lo predeterminao de la entrada «%s»" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d nun s'especificó dengún valor pa «%s»" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nun s'especificó dengún valor pa «%s»" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d los valores pa «%s» han apenzar per «/»" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s los valores pa «%s» han apenzar per «/»" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d la opción «%s» nun garra dengún valor" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: la opción «%s» nun garra dengún valor" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d el valor «%s» nun ye válidu pa la opción «%s»" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: el valor «%s» nun ye válidu pa la opción «%s»" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "nun pue construyise de nueves l'entornu" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "perdona pero nun tienes permisu p'afitar les variables d'entornu de darréu: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "fallu d'analís en %s cierca de la llinia %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "fallu d'analís en %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nun se sofita la triba de digest %d pa %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: fallu de llectura" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s ha ser propiedá del UID %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s ha ser namái escribible pol dueñu" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:563 +#, c-format +msgid "unable to load %s: %s" +msgstr "nun pue cargase %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "nun pue alcontrase'l símbolu «group_plugin» en %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "nun pue analizase la direición IP «%s»" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "nun pue analizase la mázcara de rede «%s»" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s esiste pero nun ye un direutoriu (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nun pue camudse'l mou de %s a 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1189 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "desconozse'l grupu: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:913 +#: plugins/sudoers/sudoreplay.c:842 plugins/sudoers/sudoreplay.c:1538 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "nun pue lleese %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:799 +#, c-format +msgid "unable to create %s" +msgstr "nun pue crease %s" + +#: plugins/sudoers/iolog.c:822 plugins/sudoers/iolog.c:1037 +#: plugins/sudoers/iolog.c:1113 plugins/sudoers/iolog.c:1207 +#: plugins/sudoers/iolog.c:1267 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "nun pue escribise nel ficheru de rexistru d'E/S %s" + +#: plugins/sudoers/iolog.c:1071 +#, fuzzy, c-format +#| msgid "%s: internal error, file index %d not open" +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: fallu internu, l'índiz de ficheros %d nun ta abiertu" + +#: plugins/sudoers/iolog.c:1230 +#, fuzzy, c-format +#| msgid "%s: internal error, file index %d not open" +msgid "%s: internal error, invalid signal %d" +msgstr "%s: fallu internu, l'índiz de ficheros %d nun ta abiertu" + +#: plugins/sudoers/iolog_util.c:89 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: el ficheru de rexistru nun ye válidu" + +#: plugins/sudoers/iolog_util.c:107 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: falta'l ficheru de marques de tiempu" + +#: plugins/sudoers/iolog_util.c:113 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: plugins/sudoers/iolog_util.c:120 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: falta'l campu d'usuariu" + +#: plugins/sudoers/iolog_util.c:129 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/iolog_util.c:138 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "nun se sofita starttls cuando s'usa LDAPS" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "nun pue aniciase la base de datos de claves y certificaos SSL: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "ha afitar TLS_CERT en %s pa usar SSL" + +#: plugins/sudoers/ldap.c:1614 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "nun pue aniciase LDAP: %s" + +#: plugins/sudoers/ldap.c:1650 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:1787 plugins/sudoers/parse_ldif.c:737 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "atributu sudoOrder non válidu: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: el puertu ye pergrande" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nun se sofita la triba URI de LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "nun puen mecese les URIs de LDAP y LDAPS" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "nun pue convertise sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "nun pue abrise'l sistema d'auditoría" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "nun pue unviase'l mensaxe d'auditoría" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (el comandu siguió) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "nun pue abrise'l ficheru de rexistru: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "nun pue bloquiase'l fiheru de rexistru: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "nun pue escribise nel ficheru de rexistru: %s" + +#: plugins/sudoers/logging.c:247 +msgid "No user or host" +msgstr "" + +#: plugins/sudoers/logging.c:249 +msgid "validation failure" +msgstr "fallu de validación" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT in sudoers" +msgstr "l'usuariu NUN ta en sudoers" + +#: plugins/sudoers/logging.c:258 +msgid "user NOT authorized on host" +msgstr "l'usuariu NUN ta autorizáu nel agospiu" + +#: plugins/sudoers/logging.c:260 +msgid "command not allowed" +msgstr "comandu non permitíu" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nun ta nel ficheru sudoers. Va informase d'esti incidente.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nun tien permisu pa executar sudo en %s. Va informase d'esti accidente.\n" + +#: plugins/sudoers/logging.c:302 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Perdona pero l'usuariu %s podría nun executar sudo en %s.\n" + +#: plugins/sudoers/logging.c:305 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Perdona pero l'usuariu %s nun tien permisu pa executar «%s%s%s» como %s%s%s en %s.\n" + +#: plugins/sudoers/logging.c:342 plugins/sudoers/sudoers.c:440 +#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444 +#: plugins/sudoers/sudoers.c:446 plugins/sudoers/sudoers.c:601 +#: plugins/sudoers/sudoers.c:603 +#, c-format +msgid "%s: command not found" +msgstr "%s: nun s'alcontró'l comandu" + +#: plugins/sudoers/logging.c:344 plugins/sudoers/sudoers.c:436 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:361 +msgid "authentication failure" +msgstr "fallu d'autenticación" + +#: plugins/sudoers/logging.c:387 +msgid "a password is required" +msgstr "ríquese una contraseña" + +#: plugins/sudoers/logging.c:450 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/logging.c:715 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "nun pue facese dup a stdin: %m" + +#: plugins/sudoers/logging.c:755 +#, c-format +msgid "unable to execute %s: %m" +msgstr "nun pue executase %s: %m" + +#: plugins/sudoers/logging.c:796 plugins/sudoers/logging.c:852 +#, c-format +msgid "unable to fork: %m" +msgstr "nun pue biforcase: %m" + +#: plugins/sudoers/logging.c:842 +#, c-format +msgid "unable to open pipe: %m" +msgstr "nun pue abrise la tubería: %m" + +#: plugins/sudoers/match_digest.c:100 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "el digest pa %s (%s) nun ta na forma %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:938 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "nun pue facese stat a %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Rol LADAP: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"entrada de sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Opciones: " + +#: plugins/sudoers/parse.c:535 +#, c-format +msgid " Commands:\n" +msgstr " Comandos:\n" + +#: plugins/sudoers/parse.c:726 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:744 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:762 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'usuariu %s podría executar los comandos de darréu en %s:\n" + +#: plugins/sudoers/parse.c:777 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/parse_ldif.c:147 +#, fuzzy, c-format +#| msgid "invalid timeout value" +msgid "ignoring invalid attribute value: %s" +msgstr "la escosa del tiempu d'espera nun ye válida" + +#: plugins/sudoers/parse_ldif.c:586 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "nun pue analizase la llista de direiciones de rede" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "el nome d'usuariu nun lu afitó'l frontal de sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user ID not set by sudo front-end" +msgstr "el fontal de sudo nun la afitó la ID d'usuariu" + +#: plugins/sudoers/policy.c:447 +msgid "group ID not set by sudo front-end" +msgstr "el fontal de sudo nun la afitó la ID de grupu" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "el nome d'agospiu nun lu afitó'l frontal de sudo" + +#: plugins/sudoers/policy.c:804 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "nun pue executase %s" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Versión %s del complementu de polítiques de sudoers\n" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versión %d de la gramática del ficheru sudoers\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Camín de sudoers: %s\n" + +#: plugins/sudoers/policy.c:944 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "camín de nsswitch: %s\n" + +#: plugins/sudoers/policy.c:946 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "camín de ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:947 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "camín de ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:980 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:241 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "nun pue atroxase na caché l'UID %u, nun hai memoria" + +#: plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "nun pue atroxase na caché l'UID %u, yá esiste" + +#: plugins/sudoers/pwutil.c:296 plugins/sudoers/pwutil.c:314 +#: plugins/sudoers/pwutil.c:377 plugins/sudoers/pwutil.c:422 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "nun pue atroxase na caché l'usuariu %s, nun hai memoria" + +#: plugins/sudoers/pwutil.c:309 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "nun pue atroxase na caché l'usuariu %s, yá esiste" + +#: plugins/sudoers/pwutil.c:541 plugins/sudoers/pwutil.c:560 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "nun pue atroxase na caché'l GID %u, nun hai memoria" + +#: plugins/sudoers/pwutil.c:554 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "nun pue atroxase na caché'l GID %u, yá esiste" + +#: plugins/sudoers/pwutil.c:608 plugins/sudoers/pwutil.c:626 +#: plugins/sudoers/pwutil.c:674 plugins/sudoers/pwutil.c:716 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "nun pue atroxase na caché'l grupu %s, nun hai memoria" + +#: plugins/sudoers/pwutil.c:621 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "nun pue atroxase na caché'l grupu %s, yá esiste" + +#: plugins/sudoers/pwutil.c:843 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:1001 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "nun pue atroxase na caché la llista de grupos pa %s, yá esiste" + +#: plugins/sudoers/pwutil.c:849 plugins/sudoers/pwutil.c:901 +#: plugins/sudoers/pwutil.c:953 plugins/sudoers/pwutil.c:1006 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "nun pue atroxase na caché la llista de grupos pa %s, nun hai memoria" + +#: plugins/sudoers/pwutil.c:890 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:995 +#, c-format +msgid "unable to parse gids for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "nun pue camudase'l GID de root" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "nun pue camudase'l GID de runas" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "nun pue afitase'l vector de grupos de runas" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "nun pue camudase l'UID de runas" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "nun pue camudase'l GID de sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "milenta procesos" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "nun pue consiguise'l direutoriu actual de trabayu" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "el mensaxe d'audit_failure ye pergrande" + +#: plugins/sudoers/sssd.c:565 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "nun pue aniciase la fonte SSS. ¿Ta SSSD instaláu nel sistema?" + +#: plugins/sudoers/sssd.c:573 plugins/sudoers/sssd.c:582 +#: plugins/sudoers/sssd.c:591 plugins/sudoers/sssd.c:600 +#: plugins/sudoers/sssd.c:609 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nun pue alcontrase'l símbolu «%s» en %s" + +#: plugins/sudoers/sudoers.c:210 plugins/sudoers/sudoers.c:866 +msgid "problem with defaults entries" +msgstr "problema coles entraes predeterminaes" + +#: plugins/sudoers/sudoers.c:214 +msgid "no valid sudoers sources found, quitting" +msgstr "nun s'alcontró denguna fonte de sudoers válida, colando" + +#: plugins/sudoers/sudoers.c:252 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers especifica que root nun tien permisu pa usar sudo" + +#: plugins/sudoers/sudoers.c:310 +msgid "you are not permitted to use the -C option" +msgstr "nun tienes permisu pa usar la opción -C" + +#: plugins/sudoers/sudoers.c:357 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:372 +msgid "no tty" +msgstr "nun hai denguna TTY" + +#: plugins/sudoers/sudoers.c:373 +msgid "sorry, you must have a tty to run sudo" +msgstr "perdona pero has tener una tty pa executar sudo" + +#: plugins/sudoers/sudoers.c:435 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:454 +msgid "sorry, you are not allowed set a command timeout" +msgstr "perdona pero nun tienes permisu p'afitar una escosa del tiempu d'espera de los comandos" + +#: plugins/sudoers/sudoers.c:462 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "perdona pero nun tienes permisu pa calternet l'entornu" + +#: plugins/sudoers/sudoers.c:810 +msgid "command too long" +msgstr "el comandu ye perllargu" + +#: plugins/sudoers/sudoers.c:942 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nun ye un ficheru regular" + +#: plugins/sudoers/sudoers.c:946 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s ye propiedá del UID %u, debería ser %u" + +#: plugins/sudoers/sudoers.c:950 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s ye escribible por tol mundu" + +#: plugins/sudoers/sudoers.c:954 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s ye propiedá del GID %u, debería ser %u" + +#: plugins/sudoers/sudoers.c:987 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "namái root pue usar «-c %s»" + +#: plugins/sudoers/sudoers.c:1006 +#, c-format +msgid "unknown login class: %s" +msgstr "desconozse la clas d'aniciu de sesión: %s" + +#: plugins/sudoers/sudoers.c:1091 plugins/sudoers/sudoers.c:1105 +#, c-format +msgid "unable to resolve host %s" +msgstr "nun pue resolvese l'agospiu %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "opción non válida de peñera: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "tiempu máximu d'espera non válidu: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "fautor de velocidá non válidu: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/sincronía: %s" + +#: plugins/sudoers/sudoreplay.c:327 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/sincronía: %s" + +#: plugins/sudoers/sudoreplay.c:343 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Reproduciendo la sesión de sudo: %s" + +#: plugins/sudoers/sudoreplay.c:541 plugins/sudoers/sudoreplay.c:588 +#: plugins/sudoers/sudoreplay.c:785 plugins/sudoers/sudoreplay.c:894 +#: plugins/sudoers/sudoreplay.c:979 plugins/sudoers/sudoreplay.c:994 +#: plugins/sudoers/sudoreplay.c:1001 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1170 +msgid "unable to add event to queue" +msgstr "nun pue amestase l'eventu a la cola" + +#: plugins/sudoers/sudoreplay.c:656 +msgid "unable to set tty to raw mode" +msgstr "nun pue afitase'l mou en bruto a la TTY" + +#: plugins/sudoers/sudoreplay.c:707 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Alvertencia: la terminal ye mui pequeña como pa reproducir el rexistru afayadizamente.\n" + +#: plugins/sudoers/sudoreplay.c:708 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "La xeometría del rexistru ye %d x %d, la de la to terminal ye %d x %d" + +#: plugins/sudoers/sudoreplay.c:736 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:768 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1204 plugins/sudoers/sudoreplay.c:1229 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "espresión ambigua «%s»" + +#: plugins/sudoers/sudoreplay.c:1251 +msgid "unmatched ')' in expression" +msgstr "nun s'abrió «)» na espresión" + +#: plugins/sudoers/sudoreplay.c:1255 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "desconozse'l términu de gueta «%s»" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "%s requires an argument" +msgstr "%s rique un argumentu" + +#: plugins/sudoers/sudoreplay.c:1273 plugins/sudoers/sudoreplay.c:1514 +#, c-format +msgid "invalid regular expression: %s" +msgstr "espresión regular non válida: %s" + +#: plugins/sudoers/sudoreplay.c:1277 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "nun pudo analizase la data «%s»" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "unmatched '(' in expression" +msgstr "nun se zarró «(» na espresión" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1340 +#, c-format +msgid "unknown search type %d" +msgstr "desconozse la triba de gueta %d" + +#: plugins/sudoers/sudoreplay.c:1607 +#, fuzzy, c-format +#| msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "usu: %s [-hnR] [-d direutoriu] [-m númberu] [-s númberu] ID\n" + +#: plugins/sudoers/sudoreplay.c:1610 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "usu: %s [-h] [-d direutoriu] -l [espresión de gueta]\n" + +#: plugins/sudoers/sudoreplay.c:1619 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reproduz los rexistros de sesión de sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1621 +#, fuzzy +#| msgid "" +#| "\n" +#| "Options:\n" +#| " -d, --directory=dir specify directory for session logs\n" +#| " -f, --filter=filter specify which I/O type(s) to display\n" +#| " -h, --help display help message and exit\n" +#| " -l, --list list available session IDs, with optional expression\n" +#| " -m, --max-wait=num max number of seconds to wait between events\n" +#| " -s, --speed=num speed up or slow down output\n" +#| " -V, --version display version information and exit" +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opciones:\n" +" -d, --directory=dir especifica'l direutoriu pa los rexistros de la sesión\n" +" -f, --filter=filter especifica les tribes d'E/S que van amosase\n" +" -h, --help amuesa esti mensaxe d'ayuda y cola\n" +" -l, --list llista les IDs de sesión disponibles, con una espresión opcional\n" +" -m, --max-wait=num númberu máximu de segundos a esperar ente eventos\n" +" -s, --speed=num acelera o vuelve lenta la salida\n" +" -V, --version amuesa la información de la versión y cola" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Comandu permitíu" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Comandu ñegáu" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Comandu ensin coincidencies" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s ye escribible pol grupu" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "nun pue lleese'l reló" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "inorando la marca de tiempu del futuru" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "nun pue bloquiase'l ficheru de marque de tiempu %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "la opción -x va desaniciase en llanzamientos futuros" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "primi retrocesu pa editar %s:" + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "l'editor especificáu (%s) nun esiste" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nun s'alcontró dengún editor (camín del editor = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "fallu d'escritura" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "nun pue facese stat al ficheru temporal (%s), %s nun camudó" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "falló l'editor (%s), %s nun camudó" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s nun camudó" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "nun pue abrise de nueves el ficheru temporal (%s), %s nun camudó." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "nun pudo analizase'l ficheru temporal (%s), fallu desconocíu" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "fallu internu, ¡nun pue alcontrase %s na llista!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "nun pue afitase l'UID o GID de %s a (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s y %s nun tán nel mesmu sistema de ficheros, usando mv pa renomar" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "falló'l comandu: «%s %s %s», %s nun camudó" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "fallu al renomar %s, %s nun camudó" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "¿Y agora qué?" + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "nun pue executase %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s ta ocupáu, volvi tentalo más sero" + +#: plugins/sudoers/visudo.c:995 +#, fuzzy, c-format +#| msgid "unable to open %s" +msgid "unable to lock %s" +msgstr "nun pue abrise %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Fallu: %s:%d %s «%s» referencióse pero nun se definió" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Alvertencia: %s:%d %s «%s» referencióse pero nun se definió" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - edita de mou seguru'l ficheru sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opciones:\n" +" -c, --check mou de namái comprobación\n" +" -f, --file=sudoers especifica l'allugamientu del ficheru sudoers\n" +" -h, --help amuesa esti mensaxe d'ayuda y cola\n" +" -q, --quiet mensaxes menos detallaos (silenciosos) de los fallos de sintaxis\n" +" -s, --strict comprobación estricta de la sintaxis\n" +" -V, --version amuesa la información de la versión y cola\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "milenta niveles d'inclusión" diff --git a/plugins/sudoers/po/ca.mo b/plugins/sudoers/po/ca.mo new file mode 100644 index 0000000..21dc169 Binary files /dev/null and b/plugins/sudoers/po/ca.mo differ diff --git a/plugins/sudoers/po/ca.po b/plugins/sudoers/po/ca.po new file mode 100644 index 0000000..02b7f75 --- /dev/null +++ b/plugins/sudoers/po/ca.po @@ -0,0 +1,2440 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# Walter Garcia-Fontes , 2020. +# +# Glossari +# +# principal - Es refereix a "Principals may represent users, network hosts, or network services. A principal that corresponds to a network host is called a host principal", s'ha traduït com a "principal". +# tty - el terminal, això prové de l'acrònim en anglès per a teletip (tty) i ara s'usa per a un terminal obert on es pot entrar informació +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2020-03-03 12:42+0100\n" +"Last-Translator: Walter Garcia-Fontes \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "error de sintaxi" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "contrasenya de %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] contrasenya per a %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Contrasenya: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informació de SEGURETAT per a %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Ho sentim, proveu un altre cop." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "no es pot assignar memòria" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "au un resum li cal un nom de camí" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "valor notbefore no vàlid" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "valor invàlid de notafter" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "valor massa llarg de temps d'espera" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "valor no vàlid de temps d'espera" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "L'àlies «%s» ja està definit" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "no es pot bifurcar" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "no s'ha pogut canviar la contrasenya per a %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "no s'ha pogut obtenir la classe d'inici de sessió per a l'usuari %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "no s'ha pogut iniciar l'autenticació bsd" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "tipus no vàlida d'autenticació" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "no s'ha pogut inicialitzar l'autenticació BSD" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "el vostre compte ha caducat" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "ha fallat l'aprovació" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "no s'ha pogut llegir la configuració fwtk" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "no s'ha pogut connectar al servidor d'autenticació" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "s'ha perdut la connexió al servidor d'autenticació" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"error de servidor d'autenticació:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: no s'ha pogut convertir el principal a la cadena de caràcters ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: no s'ha pogut analitzar '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: no s'ha pogut resoldre el cau de credencials : %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: no s'han pogut assignar les opcions: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: no s'ha pogut obtenir les credencials: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: no s'ha pogut inicialitzar el cau de credencials: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: no s'ha pogut emmagatzemar la credencial al cau: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: no s'ha pogut obtenir el principal de l'amfitrió: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: No s'ha pogut verificar TGT! Possible atac!: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "no s'ha pogut inicialitzar PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Error d'autenticació PAM: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "fallada de validació de compte, està bloquejat el vostre compte?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Ha expirat el compte o la contrasenya, restabliu la vostra contrasenya i proveu un altre cop" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "no s'ha pogut canviar la contrasenya expirada: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Ha expirat la contrasenya, contacteu el vostre administrador de sistema" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Ha expirat el compte o la configuració PAM no té una secció \"compte\" per a sudo, contacteu el vostre administrador de sistema" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Error de gestió de compte PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "no existiu a la base de dades %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "ha fallat la inicialització de la biblioteca ACE API" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "no s'ha pogut contactar el servidor SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "L'ID de l'usuari esta bloquejat per a Autenticació SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "nom d'usuari no vàlid per a SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "Mànec d'Autenticació no vàlid per a SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "Ha fallat la comunicació SecurID" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "error desconegut de SecurID" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "longitud no vàlida de contrasenya per a SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "no s'ha pogut inicialitzar la sessió SIA" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "mètodes no vàlids d'autenticació" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Mètodes no vàlids d'autenticació compilats dins del sudo! No podeu barrejar l'autenticació independent i no independent." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "no hi ha mètodes d'autenticació" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "No hi ha mètodes d'autenticació compilats dins del sudo! Si voleu deshabilitar l'autenticació, useu l'opció de configuració --disable-authentication" + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "No s'han pogut inicialitzar els mètodes d'autenticació." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Mètodes d'autenticació:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "No s'ha pogut determinar la condició d'auditoria" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "no s'ha pogut validar el registre d'auditoria" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Confiem que heu rebut la llissó habitual de l'Administrador del\n" +"Sistema. Generalment es resumeix en aquestes tres coses:\n" +"\n" +" #1) Respecteu la privacitat dels altres.\n" +" #2) Penseu abans d'escriure.\n" +" #3) Tenir molt de poder està associat amb tenir molta responsabilitat.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "uid desconegut: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "usuari desconegut: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "increment d'ordre: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordre d'inici: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "ordre de farciment: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s versió %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s versió de la gramàtica %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "format d'entrada %s no suportat" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "format de sortida %s no suportat" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: els fitxers d'entrada i de sortida han de ser diferents" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "no s'han pogut inicialitzar el valors predeterminats dels sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: paraula clau desconeguda: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "tipus no vàlid de valors predeterminats: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "opció no vàlida de supressió: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "filtre no vàlid: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "no s'ha pogut obrir %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "no s'ha pogut analitzar el fitxer %s, error desconegut" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "error d'anàlisi a %s a prop de la línia %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "error d'anàlisi a %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "no s'ha pogut escriure a %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - converteix entre formats de fitxer de sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options:\n" +" -b, --base=dn el DN de base per a demandes LDAP de sudo\n" +" -c, --config=conf_file el camí al fitxer de configuració\n" +" -d, --defaults=deftypes convertieix únicament valors predeterminats dels tipus especificats\n" +" -e, --expand-aliases expandeix els alias a les conversions\n" +" -f, --output-format=format estableix el format de sortida: JSON, LDIF o sudoers\n" +" -i, --input-format=format estableix el format d'entrada: LDIF o sudoers\n" +" -I, --increment=num quantitat a incrementar cada sudoOrder per\n" +" -h, --help mostra el missatge d'ajuda i surt\n" +" -m, --match=filter converteix sols les entrades que concorden amb el filtre\n" +" -M, --match-local el filtre de concordar usa passwd i bases de dades de grup\n" +" -o, --output=output_file escriu el sudoers convertit a output_file\n" +" -O, --order-start=num punt d'inici del primer sudoOrder\n" +" -p, --prune-matches neteja els usuaris, grups i amfitrions no concordats\n" +" -P, --padding=num farciment de base per a l'increment de sudoOrder\n" +" -s, --suppress=sections suprimeix la sortida de certes seccions\n" +" -V, --version mostra la informació de versió i surt" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "entrada «%s» desconeguda de paràmetres predeterminats" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "no s'ha pogut obtenir l'hora GMT" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "no s'ha pogut donar format a la marca horària" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "error intern, desbordament de %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "massa entrades sudoers, el màxim és %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "la variable d'entorn SUDOERS_BASE no està establerta i no s'ha especificat l'opció -b" + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Eina syslog si s'està usant syslog per als registres: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Prioritat de syslog a usar quan l'usuari s'autentica amb èxit: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Prioritat de syslog a usar quan l'usuari no té èxit a autenticar- %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Poseu la pregunta OTP a la seva pròpia línia" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignoreu '.' al $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Envia sempre correu electrònic quan s'executi sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Envia correu electrònic si falla l'autenticació de l'usuari" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Envia correu electrònic si l'usuari no està als sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Envia el correu electrònic si l'usuari no està als sudoers per a aquesta amfitrió" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Envia correu electrònic si l'usuari no té permís per executar aquesta ordre" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Envia correu electrònic si l'usuari intenta executar una ordre" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Usa una marca horària separada per a cada combinació usuari/terminal" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Dóna una llissó a l'usuari cada cop que executi sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fitxer que conté la llissó de sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Requereix de forma predeterminada que els usuaris s'autentiquin" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "L'usuari primari pot executar sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Registra el nom del sistema amfitrió al fitxer de registre (que no és syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Registra l'any al fitxer de registre (que no és syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Si sudo s'invoca sense arguments, inicia un intèrpret d'ordres" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Estableix $HOME per a l'usuari destí quan s'inicia un d'ordres amb -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Estableix sempre $HOME al directori de l'usuari destí" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permet recollir alguna informació per donar missatges d'error útils" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Requereix noms de sistema amfitrió qualificats completament al sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulta a l'usuari quen entri una contrasenya incorrecta" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Permet a l'usuari executar sudo únicament si té un terminal" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo tindrà en compte la variable d'entorn EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Pregunta per la contrasenya de l'usuari primari, no la de l'usuari normal" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pregunta per la contrasenya de l'usuari runas_default, no la de l'usuari normal" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pregunta per la contrasenya de l'usuari destí, no la de l'usuari normal" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Aplica els paràmetres predeterminats a la classe d'inici de sessió de l'usuari destí si hi ha una" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Estableix les variables d'entorn LOGNAME i USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Estableix únicament l'uid efectiu de l'usuari destí, no l'uid real" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "No inicialitzis el vector de grup perquè coincideixi amb el de l'usuari destí" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "longitud a la qual ajustar les línies del fitxer de registres (0 per a no ajustar): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Temps màxim d'espera per a la marca horària de l'autenticació: %.1f minuts" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Temps màxim d'espera per a la pregunta de la contrasenya: %.1f minuts" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Nombre de intents per entrar una contrasenya: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask a usar o 0777 per usar la de l'usuari: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Camí al fitxer de registre: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Camí al programa de correu electrònic: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Indicadors per al programa de correu electrònic: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adreça per enviar correu electrònic: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adreça per enviar correu electrònic des de: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Línia d'assumpte per als missatges de correu electrònic: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Missatge de contrasenya incorrecta: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Camí al directori d'estat de la llissó: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Camí del directori de marques horàries d'autenticació: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Propietari del directori de marques horàries d'autenticació: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Els usuaris d'aquest grup estan exempts dels requeriments contrasenya i PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Pregunta predeterminada de contrasenya: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Si està establert, la pregunta de contrasenya primarà sobre la pregunta del sistema en tots els casos." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Usuari predeterminat per executar ordres com a: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valor per anul·lar el $PATH de l'usuari amb: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Camí a l'editor a usar per visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quan requerir una contrasenya per a la pseudo-ordre 'list': %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quan requerir una contrasenya per a la pseudo-ordre 'verify': %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Pre-carrega les funcions dummy exex contingudes a la biblioteca sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Si el directori LDAP està actiu, ignorem el fitxer local sudoers?" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Els descriptors de fitxer >= %d es tancaran abans d'executar una ordre" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Si està establert, els usuaris podran anul·lar el valor de `closeform' amb l'opció -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permet als usuaris fixar variables arbitràries d'entorn" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Restableix l'entorn a un conjunt predeterminat de variables" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Les variables d'entorn per comprovar la validesa:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Variables d'entorn a suprimir:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Variables d'entorn a preservar:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Rol SELinux a usar al nou context de seguretat: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Tipus SELinux a usar al nou context de seguretat: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Camí al fitxer d'entorn sudo-específic: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Camí al fitxer restringit d'entorn especific de sudo: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Configuració local a usar quan s'estan analitzant els sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permet a sudo preguntar per una contrasenya tot i que pugui ser visible" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Proveeix retroalimentació a la pregunta de contrasenya quan hi ha una entrada per l'usuari" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Usa una expansió que és menys precisa però no accedeix el sistema de fitxers" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Els permisos umask als sudoers anul·larà els permisos de l'usuari, tot i que siguin més permissius" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Registra l'entrada feta per l'usuari per a l'ordre que s'està executant" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Registra la sortida de l'ordre que s'està executant" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Comprimeix els registres d'entrada/sortida usant zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Executa sempre les ordres en un pseudo-terminal" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Connector per a suport de grup no Unix: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Directori on arxivar els registres entrada/sortida: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fitxer on arxivar el registre entrada/sortida: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Afegeix una entrada al fitxer utmp/utmpx quan s'estigui assignant un pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Estableix l'usuari a utmp perquè sigui l'usuari runas, no l'usuari invocant" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Conjunt de privilegis permesos: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Conjunt de privilegis límit: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Executa les ordres a un pseudo-terminal (pty) al fons" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nom del servei PAM a usar: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nom del servei PAM a usar per a intèrprets d'ordres d'inici de sessió: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Intent d'establir credencials PAM per a l'usuari destí" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Crea una nova sessió PAM on s'executi l'ordre" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Realitza la gestió de validació del compte PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Número màxim de seqüència de registre d'entrada/sortida: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Habilita el suport de netgroup dels sudoers" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Comprova que el directori pare tingui permisos d'escriptura quan s'estiguin editant fitxers amb sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Segueix els enllaços simbòlics quan s'estiguin editant fitxers amb sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Consulta al connector de grups per grups desconeguts de sistema" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Fes concordar els grups de xarxa en base al conjunt sencer: usuari, amfitrió i domini" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permet que s'executin les ordres tot i que sudo no pot escriure al registre d'auditoria" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permet que s'executin les ordres tot i que sudo no pot escriure al registre d'entrada/sortida" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permet que s'executin les ordres tot i que sudo no pot escriure al fitxer de registre" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Resol els grups a sudoers i fes concordar amb l'identificador de grup, no el nom" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Les entrades de registre més grans que aquest valor es dividiran en múltiples missatges de syslog: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "L'usuari que serà el propietari dels fitxers d'entrada/sortida: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "El grup que serà el propietari dels fitxers de registre d'entrada/sortida: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Mode de fitxer a usar per als fitxers de registre d'entrada/sortida: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Executa les ordres pel descriptor de fitxer en comptes de pel camí: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignora les entrades desconegudes de valores predeterminats al sudoers en comptes de produir un advertiment" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Temps en segons després del qual es finalitzarà l'ordre: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permet a l'usuari especificar un temps d'espera a la línia d'ordres" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Purga les dades de registre I/O a disc immediatament en comptes de posar-les a la memòria intermèdia" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Inclou l'ID de procés quan escriguis registres mitjançant syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipus de registre de marca de temps d'autenticació: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Missatge de fallada d'autenticació: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignora majúscules i minúscules quan concordis noms d'usuaris" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignora majúscules i minúscules quan concordis noms de grups" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Escriure un registre quan s'autoritza un ordre per sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Escriu un registre quan es denega un ordre per sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d entrada «%s» desconeguda de paràmetres predeterminats" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: entrada «%s» desconeguda de paràmetres predeterminats" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d no s'ha especificat un valor per a «%s»" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: no s'ha especificat un valor per a «%s»" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d els valors per a «%s» han de començar amb un «/»" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: els valors per a «%s» han de començar amb un «/»" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d l'opció «%s» no pren un valor" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: l'opció «%s» no pren un valor" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d tipus de paràmetres predeterminats 0x%x per a l'opció «%s»" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: tipus 0x%x no vàlid de paràmetres predeterminats per a l'opció «%s»" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d el valor «%s» no és vàlid per a l'opció «%s»" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: el valor «%s» no és vàlid per a l'opció «%s»" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp corrupte, discordança de longitud" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "no s'ha pogut reconstruir l'entorn" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "ho sentim, no teniu permís d'establir les següents variables d'entorn: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "error d'anàlisi a %s a prop de la línia %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "error d'anàlisi a la línia %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tipus de resum no suportat %d per a %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: error de lectura" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s ha de ser propietat de l'uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s ha de ser modificable sols pel seu propietari" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "no s'ha pogut carregar %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "no s'ha pogut trobar el símbol \"group_plugin\" a %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: connector incompatible de group versió principal %d, s'esperava %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "no s'ha pogut analitzar l'adreça IP «%s»" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "no s'ha pogut analitzar la màscara de xarxa «%s»" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Adreça local IP i parelles netmask:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existeix però no és un directori (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "no s'ha pogut mkdir %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "no s'ha pogut canviar el mode de %s a 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "grup desconegut: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "no s'ha pogut llegir %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "no s'ha pogut crear %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "no s'ha pogut escriure al fitxer de registre d'entrada/sortida: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: error intern, no està obert el fitxer de registre I/O per a l'event %d" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: error intern, senyal %d no vàlid" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: fitxer no vàlid de registre" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: no hi ha el camp de marca horària " + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: marca horària %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: no hi ha el camp d'usuari runas" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: no hi ha el camp del grup runas" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: no es troba el camp del grup runas" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls no suportat quan s'està usant ldaps" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "no s'ha pogut inicialitzar el certificat SSL i la clau db: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "heu d'establir TLS_CERT a %s per usar SSL" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "no s'ha pogut inicialitzar LDAP: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "s'ha especificat start_tls però les biblioteques LDAP no donen suport a ldap_start_tls_s() o ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "atribut sudoOrder no vàlid: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: el port és massa gran" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tipus d'uri LDAP no suportat: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "no s'han pogut barrejar el ldap i els ldaps URIs " + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "no s'ha pogut convertir l'opció de sudo: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "no s'ha pogut obrir el sistema d'auditoria" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "no s'ha pogut enviar el missatge d'auditoria" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (ordre continuada) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "no s'ha pogut obrir el fitxer de registre: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "no s'ha pogut bloquejar el fitxer de registre: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "no s'ha pogut escriure el fitxer de registre: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "No hi ha usuari o amfitrió" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "ha fallat la validació" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "l'usuari NO ESTÀ als sudoers" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "l'usuari NO està autoritzat a l'amfitrió" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "ordre no permesa" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s no està al fitxer sudoers. S'informarà d'aquest incident.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s no té permís per executar sudo a %s. S'informarà d'aquest incident.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Ho sentim, l'usuari %s no pot executar sudo a %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Ho sentim, l'usuari %s no pot executar '%s%s%s' com a %s%s%s a %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: no s'ha trobat l'ordre" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"s'ignorarà «%s» trobat a «.»\n" +"Useu «sudo ./%s» si aquest és el «%s» que voleu executar." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "ha fallat l'autenticació" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "es requereix una contrasenya" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u intent incorrecte de contrasenya" +msgstr[1] "%u intents incorrectes de contrasenya" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "no es pot duplicar l'entrada estàndard: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "no es pot executar %s: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "no est pot bifurcar: %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "no es pot obrir la canonada: %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "digest per a %s (%s) no està en forma %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "no s'ha pogut accedir %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Rol LDAP: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Entrada de sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Opcions: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Ordres:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Entrades predeterminades concordants per a %s a %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas i valors predeterminats específics d'ordres per a %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'usuari %s pot executar les ordres següents a %s:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "L'usuari %s no té permisos per executar sudo a %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignora completament a sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "atribut LDIF no vàlid: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s establert pel frontal de sudo" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "no s'ha pogut analitzar la llista d'adreces de xarxa" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "nom d'usuari no establert pel frontal de sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "ID d'usuari no establers pel frontal de sudo" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "ID de grup no establert pel frontal de sudo" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "nom d'amfitrió no establert pel frontal de sudo" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "no s'ha pogut executar %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Versió del connector de política de sudoers %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versió de gramàtica del fitxer sudoers %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Camí del sudoers: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "camí del nsswitch: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "camí de ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "camí del ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "no s'ha pogut registrar el lligam de tipus %d (versió %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "no s'ha pogut posar al cau l'uid %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "no s'ha pogut posar l'uid %u al cau, ja existeix" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "no s'ha pogut posar al cau l'usuari %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "no s'ha pogut posar l'usuari %s al cau, ja existeix" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "no s'ha pogut posar el gid %u al cau" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "no s'ha pogut posar el gid %u al cau, ja existeix" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "no s'ha pogut posar al cau al grup %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "no s'ha pogut posar el grup %s al cau, ja existeix" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "no s'ha pogut la llista de grups al cau per a %s, ja existeix" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "no s'ha pogut posar al cau a la llista de grup %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "no s'han pogut analitzar els grups per a %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "no s'han pogut analitzar els identificadors de grups per a %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "desbordament de la pila de permisos" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "subdesbordament de la pila de permisos" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "no s'ha pogut canvir el gid de l'usuari primari" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "no s'ha pogut canviar el gid runas" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "no s'ha pogut configurar el vector de grup runas" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "no s'ha pogut canviar l'uid runas" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "no s'ha pogut canvir el gid del sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "massa processos" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "no s'ha pogut obtenir el directori actual de treball" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "camí truncat d'auditoria use_cmd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "camí truncat d'auditoria argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "missatge audit_failure massa llarg" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "no s'ha pogut inicialitzar la font del SSS. Està el SSSD instal·lat al vostre sistema?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "no s'ha pogut trobar el símbol \"%s\" a %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "hi ha un problema amb les entrades predeterminades" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "no s'han trobat fonts vàlides de sudoers, se sortirà" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "el fitxer sudoers especifica que l'usuari primar no pot executar sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "no teniu permisos per usar l'opció -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "propietari de la marca horària (%s): No existeix aquest usuari" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "no hi ha una terminal" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "ho sentim, heu de tenir una terminal per executar sudo" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "ordre al directori actual" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "ho sentim, no teniu permisos per posar un temps d'espera d'ordre" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "ho sentim, no teniu permisos per preserver l'entorn" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "ordre massa llarga" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s no és un fitxer regular" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s és propietat de l'uid %u, hauria de ser %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s te permís universal d'escriptura" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s és propietat del gid %u, hauria de ser %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "sols l'usuari primari pot usar «-c %s»" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "classe desconeguda d'inici de sessió: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "no s'ha pogut resoldre l'amfitrió %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "opció no vàlida de filtre: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "espera màxima no vàlida: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "factor no vàlid de velocitat: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/sincronització: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/sincronització: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/temporització: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "S'està reproduint la sessió sudo: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "no s'ha pogut afegir l'esdeveniment a la cua" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "no s'ha pogut configurar el terminal a mode de dades en brut" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Advertiment: el vostre terminal és massa petit per reproduir apropiadament el registre.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "La geometria del registre és %d x %d, la geometria del vostre terminal és %d x %d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Reproducció acabada, premeu qualsevol tecla per restablir la terminal." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "línia no vàlida de fitxer de sincronització: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "expressió ambigua \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "')' sense concordança a l'expressió" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "terme desconegut de cerca \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s requereix un argument" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expressió regular no vàlida: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "no s'ha pogut analitzar la data \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "'(' sense concordança a l'expressió" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "\"or\" final il·legal" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "\"!\" final il·legal" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "tipus desconegut de cerca %d" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "ús: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "usage: %s [-h] [-d dir] -l [cerca l'expressió]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reprodueix els registres de la sessió sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opcions:\n" +" -d, --directori=dir especifiqueu el directori per als registres de la sessió\n" +" -f, --filter=filtre especifiqueu quin(s) tipus d'entrada/sortida mostrar\n" +" -h, --help mostra el missatge d'ajuda i surt\n" +" -l, --list mostra una llista dels IDs de les sessions\n" +" disponibles, amb expressions opcionals\n" +" -m, --max-wait=num nombre màxim de segons a esperar entre esdeveniments\n" +" -n, --non-interactive sense preguntes, la sessió s'envia a la sortida estàndard\n" +" -R, --no-resize no intentis redimensionar la terminal\n" +" -S, --suspend-wait espera mentre s'ha suspès l'ordre\n" +" -s, --speed=num accelera o alenteix la sortida\n" +" -V, --version mostra la versió d'informació i surt" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tamfitrió sense concordança" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Ordre permesa" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Ordre denegada" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Ordre sense concordança" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s és modificable pel grup" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "no s'ha pogut truncar el fitxer de marca horària a %lld bytes" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "no s'ha pogut llegir el rellotge" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "s'ignorarà la marca horària del futur" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "la marca horària està massa lluny en el futur: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "no s'ha pogut bloquejar el fitxer de marca horària %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "el camí de la lliçó es massa llarg: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "s'eliminarà l'opció -x en una versió futura" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "si us plau considereu usar la utilitat cvtsudoers en canvi" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "prem la tecla d'introducció per editar %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "l'editor especificat (%s) no existeix" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "no s'ha trobat un editor (el camí de l'editor = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "error d'escriptura" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "no s'ha pogut accedir al fitxer temporal (%s), no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "fitxer temporal amb longitud nul·la (%s), no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "l'editor (%s) ha fallat, no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "no s'ha pogut reobrir el fitxer temporal (%s), no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "no s'ha pogut analitzar el fitxer temporal (%s), error desconegut" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "error intern, no s'ha pogut trobar %s a la llista!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "no s'ha pogut establir (uid, gid) de %s a (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s i %s no estan al mateix sistema de fitxers, s'usarà mv per reanomenar" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "l'ordre ha fallat: '%s %s %s', no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "error quan s'estava reanomenant %s, no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Què fem ara? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Les opcions són:\n" +" (e)dita el fitxer sudoers un altre cop\n" +" (x) surt sense desar els canvis al fitxer sudoers\n" +" (Q) surt i desa el canvis el fitxer sudoers (PERILL!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "no s'ha pogut executar %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: propietari incorrecte (uid, gid) hauria de ser (%uk, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: permisos dolents, hauria de ser mode 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: s'analitzat correctament\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s està ocupat, proveu un altre cop més tard" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "no s'ha pogut bloquejar %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Editar igualment? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Error: %s:%d cicle a %s «%s»" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Advertiment: %s:%d cicle a %s «%s»" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Error: %s:%d %s «%s» s'ha referenciat però no s'ha definit " + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Advertiment: %s:%d %s «%s» s'ha referenciat però no s'ha definit " + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Advertiment: %s:%d sense usar %s «%s»" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - edita amb seguretat el fitxer sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opcions:\n" +" -c, --check mode de sols verificació\n" +" -f, --file=sudoers especifiqueu la ubicació del fitxer sudoers\n" +" -h, --help mostra el missatge d'ajuda i surt\n" +" -q, --quiet missatges d'error de sintaxi menys informatius (silenciós)\n" +" -s, --strict verificació estricta de la sintaxi\n" +" -V, --version mostra la informació de la versió i surt\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "massa nivells d'inclusions" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Rol LDAP: DESCONEGUT\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Ordre: %s\n" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "no s'ha pogut posar l'usuari %s, s'ha exhaurit la memòria" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "no s'ha pogut posar el grup %s al cau, s'ha exhaurit" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "no s'ha pogut la llista de grups al cau per a %s, s'ha exhaurit la memòria" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "Rol SSDD: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Rol SSSD: DESCONEGUT\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Advertiment: cicle a %s `%s'" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Advertiment: s'ha referenciat però no s'ha definit %s `%s'" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Advertiment: %s `%s' sense usar" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: s'ha exhaurit l'espai quan s'estava expandint hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: s'ha exhaurit l'espai construint hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "discordança d'assignació de sudo_ldap_build_pass1" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "el camí de la marca horària és massa llarg: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "no s'ha pogut accedir l'editor (%s)" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "error intern: espai insuficient per a la línia de registre" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: desbordament de la memòria intermèdia" diff --git a/plugins/sudoers/po/cs.mo b/plugins/sudoers/po/cs.mo new file mode 100644 index 0000000..bbc1c60 Binary files /dev/null and b/plugins/sudoers/po/cs.mo differ diff --git a/plugins/sudoers/po/cs.po b/plugins/sudoers/po/cs.po new file mode 100644 index 0000000..a5d6ec9 --- /dev/null +++ b/plugins/sudoers/po/cs.po @@ -0,0 +1,3238 @@ +# Czech translation for sudo. +# This file is distributed under the same license as the sudo package. +# Todd C. Miller , 2011-2013 +# Petr Pisar , 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# Petr Pisar , 2020. +# +# (AIX) registry → (AIXový) registr +# timestamp → časové údaje +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-17 17:14+01:00\n" +"Last-Translator: Petr Pisar \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "chyba syntaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Heslo pro %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] heslo pro %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Heslo: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** BEZPEČNOSTNÍ hlášení o %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Je nám líto, zkuste to znovu." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "nelze alokovat paměť" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "kontrolní součet vyžaduje název cesty" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "hodnoty „CWD“ musí začínat na „/“, „~“ nebo „*“" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "hodnoty „CHROOT“ musí začínat na „/“, „~“ nebo „*“" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "chyba syntaxe, vyhrazené slovo %s použito jako název aliasu" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "neplatná hodnota notbefore (začátek platnosti)" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "neplatná hodnota notafter (konec platnosti)" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "hodnota časového limitu je příliš velká" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "neplatná hodnota časového limitu" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "vnitřní chyba, přetečení %s" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "nelze zdvojit standardní vstup: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "nelze spustit %s: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "nelze vytvořit proces" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "nelze vytvořit proces: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "nelze otevřít rouru: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (příkaz pokračuje) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existuje, ale nejedná se o adresář (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "nelze vytvořit adresář %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nelze změnit práva %s na 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "očekáván JSON_STRING, obdrženo %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "v názvu chybí dvojitá uvozovka" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "očekáván JSON_OBJECT, obdrženo %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "neodpovídající uzavírací složená závorka" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "nečekané pole" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "neodpovídající uzavírající hranatá závorka" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "nečekaný řetězec" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "za názvem chybí dvojtečka" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "nečekaná pravdivostní hodnota" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "nečekané číslo" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u „%s“ nelze rozebrat" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: neplatný soubor s protokolem" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: chybí položka s časovým údajem" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: čas %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: chybí položka s uživatelem" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: chybí položka s runas uživatelem" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s chybí položka s runas skupinou" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "chyba při čtení časovacího souboru: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "neplatný řádek s časovacím souborem: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "protokol byl již dokončen, nelze jej restartovat" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "protokol nelze navázat" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "nelze otevřít %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "chybí vstupně-výstupní soubor s protokolem %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: nelze skočit vpřed o %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "nelze nalézt bod obnovy [%lld, %ld] v %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "chyba stavového automatu" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "neplatná zpráva AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "chyba při rozboru zprávy AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "chyba při vytváření vstupně-výstupního protokolu" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "chyba při protokolování události přijetí" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "neplatná zpráva RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "chyba při rozboru zprávy RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "chyba při protokolování události zamítnutí" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "neplatná zpráva AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "chyba při rozboru zprávy AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "chyba při protokolování události upozornění" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "chyba protokolu" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "chyba při zápisu IoBuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "chyba při zápisu ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "chyba při zápisu CommandSuspend" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "nerozpoznaný druh zprávy ClientMessage" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "zpráva od klienta je příliš velká" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "šifru TLS 1.2 nelze nastavit na %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "šifru TLS 1.3 nelze nastavit na %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "nelze získat metodu TLS serveru: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "nelze vytvořit kontext TLS: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "nelze zavést certifikát %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "nelze zavést svazek certifikátů autorit %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "nelze zavést soukromý klíč %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "nelze nastavit parametry Diffieho-Hellmana: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "nelze nastavit minimální verzi protokolu na TLS 1.2: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "nelze získat vzdálenou IP adresu" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "K objektu SSL nelze připojit uživatelská data: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "událost nelze přidat do fronty" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "nelze nastavit naslouchací socket" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s – odešle vstupně-výstupní protokol vzdálenému serveru\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Přepínače:\n" +" -f, --file cesta ke konfiguračnímu souboru\n" +" -h, --help zobrazí nápovědu a skončí\n" +" -n, --no-fork zůstane běžet na popředí\n" +" -R, --random-drop procentuální pravděpodobnost, že se spojení ztratí\n" +" -V, --version zobrazí údaje o verzi a skončí\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Je vyžadována knihovna Protobuf-C verze 1.3 nebo vyšší" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "neplatná hodnota pravděpodobnosti ztráty: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s verze %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "protokol TLS není podporován" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: cesta není plně kvalifikovaná" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d nepárová „[“: %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d neplatný konfigurační oddíl: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d neplatný řádek s konfigurací: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d očekávaný název oddílu: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "neplatná hodnota pro %s: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d: neznámý klíč: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "neznámý obor systémového protokolu %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "neznámá priorita systémového protokolu: %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Přepínače:\n" +" --help zobrazí nápovědu a skončí\n" +" -A, --accept zašle pouze událost přijetí (žádný vstup a výstup)\n" +" -h, --host stroj, kam posílat protokol\n" +" -i, --iolog_id vzdálený identifikátor vstupně-výstupního protokolu,\n" +" na který se má navázat\n" +" -p, --port port, který se použije při připojování na stroj\n" +" -r, --restart restartuje předchozí přenos vstupně-výstupního\n" +" protokolu\n" +" -R, --reject zamítne příkaz se zadaným důvodem\n" +" -b, --ca-bundle soubor se svazkem certifikátů, proti kterému se\n" +" bude ověřovat certifikát serveru\n" +" -c, --cert soubor s certifikátem pro navázání spojení TLS\n" +" -k, --key soubor se soukromým klíčem\n" +" -n, --no-verify neověřuje certifikát serveru\n" +" -t, --test otestuje auditní server zasláním vybraných\n" +" vstupně-výstupních protokolů n-krát souběžně\n" +" -V, --version zobrazí údaje o verzi a skončí\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "%s:%s nelze vyhledat: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "nelze získat IP adresu serveru" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "%s/%s nelze přečíst: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "zpráva od klienta je příliš velká: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: vyrovnávací paměť pro zápis se již používá" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "nečekaná I/O událost %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: nečekaný stav %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "neplatná správa ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "od serveru byla přijata chybová zpráva: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "od serveru byla přijata zpráva o zrušení: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "zprávu ServerMessage nelze rozbalit" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: nečekaná hodnota type_case %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "při čtení ze serveru vypršel časový limit" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "předčasný konec souboru" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "správa od serveru je příliš velká: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "při zapisování do serveru vypršel časový limit" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "Při navazování spojení TLS vypršel časový limit" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "událost nelze nastavit" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "spojení TLS selhalo: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Kontext SSL nelze inicializovat: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Objekt SSL nelze alokovat: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "K objektu SSL nelze připojit socket: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "musí být zadán jak bod navázání, tak i identifikátor iolog" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "bod navázání nelze nastavit, když žádný vstup/výstup nebyl odeslán" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "ukončeno předčasně ve stavu %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "uplynulý čas zaslaný serveru [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "od server byl přijat bod zápisu [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias „%s“ je již definován" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "nelze získat čas" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "prošlé heslo pro %s nelze změnit" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "nelze získat přihlašovací třídu uživatele %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "nelze zahájit BSD autentizaci" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "neplatný druh autentizace" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "nelze inicializovat BSD autentizaci" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "vašemu účtu skončila platnost" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "schválení selhalo" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "nelze načíst konfiguraci FWTK" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "k autentizačnímu serveru se nelze připojit" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "spojení k autentizačnímu serveru ztraceno" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"chyba autentizačního serveru:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: principála nelze převést na řetězec („%s“): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: „%s“ nelze rozebrat: %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: nelze najít keš s pověřeními: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: nelze alokovat volby: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: nelze získat pověření: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: nelze inicializovat keš s pověřeními: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: pověření nelze uložit do keše: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: nelze získat principála stroje: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT nelze ověřit! Podezření na útok!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "PAM nelze inicializovat: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Chyba autentizace PAM: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "ověření účtu selhalo, není váš účet zamknutý?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Účtu nebo heslu vypršela platnost, nastavte si nové heslo a zkuste to znovu" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "prošlé heslo nelze změnit: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Heslu vypršela platnost, kontaktujte správce svého systému" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Účtu vypršela platnost nebo v konfiguraci PAM pro sudo chybí sekce „account“. Kontaktujte správce svého systému" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Chyba správy účtů PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "v databázi %s neexistujete" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "inicializace knihovny ACE selhala" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "nelze kontaktovat server SecurID" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "ID uživatele je pro autentizaci SecurID uzamčeno" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "neplatná délka uživatelského jména pro SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "neplatný deskriptor autentizace pro SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "komunikace se SecurID selhala" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "neznámá chyba SecurID" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "neplatná délka kódu pro SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "nelze inicializovat relaci SIA" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "neplatné autentizační metody" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Sudo bylo sestaveno s neplatnými autentizačními metodami! Nesmíte míchat samostatnou a nesamostatnou autentizaci." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "žádné autentizační metody" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Sudo bylo sestaveno bez autentizačních metod! Chcete-li vypnout autentizaci, použijte při sestavování přepínač --disable-autentizaci." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Nelze inicializovat metody autentizace." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Autentizační metody:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Nebylo možné určit podmínku pro audit" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "auditní zprávu nelze odeslat" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Věříme, že jste od správce místního systému obdrželi obvyklé školení.\n" +"Obvykle se jedná o tyto tři věci:\n" +"\n" +" 1. Respektujte soukromí druhých.\n" +" 2. Přemýšlejte, než začnete psát.\n" +" 3. S velkými právy přichází velká zodpovědnost.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "neznámé UID: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "neznámý uživatel: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "přírůstek pořadí: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "počáteční pořadí: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "odsazení pořadí: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "verze gramatiky %s je %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "nepodporovaný formát vstupu %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "nepodporovaný formát výstupu %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: vstupní a výstupní soubory se musí lišit" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "nelze inicializovat výchozí hodnoty sudoers" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: neznámé klíčové slovo: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "neplatný druh položky defaults: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "neplatný druh potlačení: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "neplatný filtr: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "nelze otevřít %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "rozbor souboru %s se nezdařil, neznámá chyba" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "chyba při rozboru %s kolem řádku %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "chyba při rozboru %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "do %s nelze zapsat" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s – převádí mezí formáty souboru sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Přepínače:\n" +" -b, --base=dn base DN pro ldapové dotazy suda\n" +" -c, --config=konfigurační_soubor\n" +" cesta ke konfiguračnímu souboru\n" +" -d, --defaults=druhydef převede pouze Defaults zadaných druhů\n" +" -e, --expand-aliases při převodu expanduje aliasy\n" +" -f, --output-format=formát nastaví formát výstupu: JSON, LDIF nebo sudoers\n" +" -i, --input-format=formát nastaví formát vstupu: LDIF nebo sudoers\n" +" -I, --increment=číslo množství, o které zvýšit každou definici sudoOrder\n" +" -h, --help zobrazí zprávu s nápovědou a skončí\n" +" -m, --match=filtr převede pouze položky, které odpovídají filtru\n" +" -M, --match-local porovnávací filtr použije databáze passwd a group\n" +" -o, --output=výstupní_soubor\n" +" zapíše převedený sudoers to výstupního_souboru\n" +" -O, --order-start=číslo počáteční bod pro první sudoOrder\n" +" -p, --prune-matches odstraní neodpovídající uživatele, skupiny a stroje\n" +" -P, --padding=číslo základní odsazení přírůstku sudoOrder\n" +" -s, --suppress=oddíl potlačí výstup jistých oddílů\n" +" -V, --version zobrazí údaje o verzi a skončí" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "neznámá položka defaults „%s“" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "nelze získat čas GMT" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "nelze naformátovat časový údaj" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "příliš mnoho záznamů sudoers, maximum je %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "proměnná prostředí SUDOERS_BASE není nastavená a přepínač -b nebyl zadán." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Obor systémového protokolu, je-li syslog použit pro protokolování: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Priorita systémového protokolu, která se použije při úspěšné autentizaci uživatele: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Priorita systémového protokolu, která se použije při neúspěšné autentizaci: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Dotaz na jednorázový kód bude na vlastním řádku" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ignoruje „.“ v PATH" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Vždy, když se použije sudo, odešle e-mail" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Odešle e-mail, když autentizace uživatele selže" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Odešle e-mail, pokud uživatel není v sudoers" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Odešle e-mail, když uživatel není v sudoers uveden pro tento stroj" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Odešle e-mail, když uživatel nemá dovoleno spustit příkaz" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Odešle e-mail, když uživatel zkusí spustit příkaz" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Pro každou kombinaci uživatele a TTY použije samostatný časovač" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Před prvním použitím sudo proškolí uživatele" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Soubor obsahující školení k sudo: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Standardně vyžaduje, aby se uživatelé autentizovali" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Root může spustit sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Do (nesyslogového) protokolu zaznamenává název stroje" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Do (nesyslogového) protokolu zaznamenává rok" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Je-li sudo zavoláno bez argumentů, spustí shell" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Nastaví HOME na cílového uživatele, když se pouští shell s -s" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Vždy nastaví HOME na domovský adresář cílového uživatele" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Dovolí sběr některých údajů za účelem užitečných chybových zpráv" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Vyžaduje v souboru sudoers plně kvalifikované názvy strojů" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Urazí uživatele, pokud zadá chybné heslo" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Dovolí uživateli spustit sudo, pouze když má TTY" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo bude dodržovat proměnou prostředí EDITOR" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Ptá se heslo roota, ne na heslo uživatele" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Ptá se na heslo runas_default uživatele, ne na heslo uživatele" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Ptá se na heslo cílového uživatele, ne na heslo uživatele" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Použije výchozí nastavení v přihlašovací třídě cílového uživatele, existuje-li" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Nastaví proměnné prostředí LOGNAME a USER" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Nastaví pouze efektivní UID na cílového uživatele, nikoliv reálné UID" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Neinicializuje vektor skupin na vektor cílového uživatele" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Délka zlomu řádků v protokolu (0 pro nezalamování): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Limit na časové údaje autentizace: %.1f min" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Limit na výzvu k heslu: %.1f min" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Počet pokusů na zadání hesla: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask nebo 0777 pro hodnotu uživatele: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Cesta k souboru s protokolem: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Cesta k poštovnímu programu: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Přepínače pro poštovní program: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adresa, kam zasílat poštu: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adrese, ze které zasílat poštu: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Řádek s předmětem pro poštovní zprávy: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Zpráva při chybném hesle: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Cesta k adresáři se stavy lekcí: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Cesta k adresáři s časovými údaji autentizace: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Vlastník adresáře s časovými údaji autentizace: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Uživatelé v této skupině jsou vyjmuti z požadavků na heslo na PATH: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Výchozí výzva pro heslo: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Je-li nastaveno, passprompt přebije systémovou výzvu ve všech případech." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Výchozí uživatel, pro kterým spouštět příkazy: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Hodnota, kterou přebít PATH uživatele: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Cesta k editoru pro potřeby visudo: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kdy vyžadovat heslo pro pseudopříkaz „list“: %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kdy vyžadovat heslo pro pseudopříkaz „verify“: %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Zavést knihovnu sudo_noexec, která nahrazuje funkce exec" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Pokud je adresář LDAP dostupný, ignorovat místní soubor sudoers" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Souborové deskriptory >= %d budou před spuštěním příkazu uzavřeny" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Je-li nastaveno, uživatelé mohou přebít hodnotu „closefrom“ přepínačem -C" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Dovolit uživatelům nastavit libovolné proměnné prostředí" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Vrátit prostředí do výchozí množiny proměnných" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Proměnné prostředí kontrolované na bezpečnost:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Proměnné prostředí, které se mají odstranit:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Proměnné prostředí, které se mají zachovat:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Selinuxový role, která se použije v novém bezpečnostním kontextu: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Selinuxový typ, který se použije v novém bezpečnostním kontextu: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Cesta k souboru s prostředím určeném pro sudo: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Cesta k souboru s omezeným prostředím určeném pro sudo: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Národní prostředí, které se použije pro rozbor sudoers: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Dovolit sudu ptát se na heslo, i kdyby bylo čitelné" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Indikovat vstup uživatele při dotazu na heslo" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Použit rychlejší expanzi globů, která je méně přesná, ale nepřistupuje k souborovému systému" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Umask zadaná v sudoers přebije uživatelovu, i když je volnější" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Zaznamenávat vstup uživatele pro spouštěný příkaz" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Zaznamenávat výstup spouštěného příkazu" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Komprimovat protokoly o vstupu/výstupu pomocí zlib" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Vždy spouštět příkazy v pseudoTTY" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Modul pro podporu neunixových skupin: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Adresář, kam ukládat protokoly o vstupu/výstupu: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Soubor, do kterého ukládat protokol o vstupu/výstupu: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Při alokaci PTY přidat záznam do souboru utmp/utmpx" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Do utmp zapisovat runas uživatele, nikoliv uživatele volajícího" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Množina povolujících práv: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Množina omezujících práv: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Spouštět příkazy v PTY na pozadí" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Použít tuto službu PAM: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Název služby PAM, který se použije pro přihlašovací shelly: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Pokusit se získat pověření PAM pro cílového uživatele" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Vytvořit pro spouštěný příkaz novou relaci PAM" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Ověřit platnost účtu pomocí PAM" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Maximální pořadové číslo protokolu vstupu/výstupu: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Zapnout v sudoers podporu netgroup" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontrolovat nadřazené adresáře na možnost zápisu při úpravě souborů pomocí sudoedit" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Následovat symbolické odkazy při úpravě souborů pomocí sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Dotazovat se modulu pro skupiny na neznámé systémové skupiny" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Porovnávat netgroups na celou n-tici: uživatel, stroj a doména" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Dovolit spuštění příkazu, i když sudo nemůže zapsat do auditního protokolu" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Dovolit spuštění příkazu, i když sudo nemůže zapsat do I/O protokolu" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Dovolit spuštění příkazu, i když sudo nemůže zapsat do souboru s protokolem" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Překládat skupiny v sudoers a hledat shodu na ID skupiny, ne na jméně" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Položky protokolu větší než tato hodnota budou rozděleny do více zpráv syslogu: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Uživatel, který bude vlastnit soubory s I/O protokolem: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Skupina, která bude vlastnit soubory s I/O protokolem: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Přístupová práva k souboru s I/O protokolem: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Spustit příkazy podle deskriptoru souboru namísto podle cesty: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorovat neznámé položky Defaults v sudoers namísto vypisování varování" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Čas v sekundách, po kterém bude příkaz ukončen: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Povolit uživateli zadat časový limit na příkazovém řádku" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Zapisovat log na disk ihned namísto po větších částech" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Při protokolování přes syslog zahrnout ID procesu" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Druh záznamu s časovým údajem autentizace: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Zpráva o selhání autentizace: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Ignorovat velikost znaků při porovnávání jmen uživatelů" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Ignorovat velikost znaků při porovnávání názvů skupin" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Zaznamenat do protokolu, když je příkaz povolen v sudoers" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Zaznamenat do protokolu, když je příkaz zakázán v sudoers" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Protokolový server(y) suda, kam se připojit s volitelným portem" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Časový limit protokolového serveru suda v sekundách: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Zapnout volbu socketu SO_KEEPALIVE na socketu připojeném k protokolovému serveru" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Cesta k souboru se svazkem certifikátů autorit auditního serveru: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Cesta k souboru s certifikátem sudoers: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Cesta k souboru se soukromým klíčem sudoers: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Ověřit, že certifikát protokolovacího serveru je platný" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Dovolit použití neznámých ID uživatelů a/nebo skupin u klíčového slova runas" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Pouze dovolit spuštění příkazů jako uživatel s platným shellem" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Nastavit vzdáleného uživatele PAM na uživatele, který spustil sudo" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Nastavit vzdálený stroj PAM na název tohoto stroje" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Kam změnit pracovní adresář před spuštěním příkazu: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Kam změnit kořenový adresář před spuštěním příkazu: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "Vytvářet protokol v tomto formátu: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: neznámá položka defaults „%s“" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: neznámá položka defaults „%s“" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: u „%s“ nebyla zadána žádná hodnota" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: u „%s“ nebyla zadána žádná hodnota" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: volba „%s“ nebere hodnotu" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: volba „%s“ nebere hodnotu" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: neplatný typ Defaults 0x%x u volby „%s“" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: neplatný typ Defaults 0x%x u volby „%s“" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: hodnota „%s“ je pro volbu „%s“ neplatná" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: hodnota „%s“ není pro volbu „%s“ platná" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: hodnoty „%s“ musí začínat na „/“, „~“ nebo „*“" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: hodnoty „%s“ musí začínat na „/“, „~“ nebo „*“" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: hodnoty „%s“ musí začínat na „/“" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: hodnoty „%s“ musí začínat na „/“" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: poškozené pole envp, délka nesouhlasí" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "prostředí nelze znovu sestavit" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "je nám líto, ale nemáte dovoleno nastavovat následující proměnné prostředí: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "chyba rozboru v %s kolem řádku %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "chyba rozboru v %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nepodporovaný druh kontrolního součtu %d pro %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: chyba při čtení" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s musí být vlastněn UID %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s smí být zapisovatelný jen pro vlastníka" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "nelze zavést %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "v %s nelze nalézt symbol „group_plugin“" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: nekompatibilní hlavní verze modulu pro skupiny %d, očekávána %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "nelze rozebrat IP adresu „%s“" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "nelze rozebrat síťovou masku „%s“" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Pár místní IP adresy a masky sítě:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "neznámá skupina: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "nelze aktualizovat soubor s pořadovým číslem" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "nelze zapsat do souboru s I/O protokolem: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "%s/%s nelze vytvořit" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: vnitřní chyba, soubor s I/O protokolem pro událost %d není otevřen" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "nelze přečíst hodiny" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: vnitřní chyba, neplatný signál %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "při použití ldaps není starttls podporováno" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "nelze inicializovat certifikát SSL a databázi klíčů: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "pro SSL musíte v %s nastavit TLS_CERT" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "LDAP nelze inicializovat: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls uvedeno, ale knihovna LDAP nepodporuje ldap_start_tls_s_np() ani ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "neplatný atribut sudoOrder: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: port je příliš velký" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nepodporovaný typ ldapového URI: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "nelze míchat URI ldap a ldaps" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "nelze převést sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "nelze otevřít auditní systém" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "nelze odeslat auditní zprávu" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "chyba ve smyčce událostí" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Vytvoření nového objektu SSL_CTX selhalo: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "Spojení TLS s %s:%s selhalo: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "Inicializace TLS nebyla úspěšná" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "Ustanovení spojení TLS nebylo úspěšné" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: vnitřní chyba, neplatný návratový kód %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "spojení k protokolovému serveru ztraceno" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "chybí vyrovnávací paměť pro zápis" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "k protokolovacímu serveru se nelze připojit" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "uživatel NENÍ v sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "uživatel NENÍ na stroji autorizován" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "příkaz nedovolen" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s není v souboru sudoers. Tato událost bude ohlášena.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nemá dovoleno spouštět sudo na %s. Tato událost bude ohlášena.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Je nám líto, uživatel %s nesmí spouštět sudo na %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Je nám líto, uživatel %s nemá dovoleno spouštět „%s%s%s“ jako %s%s%s na %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: příkaz nenalezen" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignoruje se „%s“ nalezený v „.“\n" +"Použijte „sudo ./%s„, je-li toto „%s“', který chcete spustit." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u chybný pokus zadat heslo" +msgstr[1] "%u chybné pokusy zadat heslo" +msgstr[2] "%u chybných pokusů zadat heslo" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "selhání autentizace" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "je vyžadováno heslo" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "nelze otevřít soubor protokolu: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "nelze zapsat soubor protokolu: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "součet pro %s (%s) nemá tvar %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Role LDAP: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Položka v sudoers:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Volby: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Příkazy:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Odpovídající položky Defaults pro %s na %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Výchozí hodnoty Runas a Command pro %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Uživatel %s smí spustit následující příkazy na %s:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Uživatel %s nemá dovoleno spustit sudo na %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "neúplná definice sudoRole se ignoruje: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "neplatný atribut LDIF: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "neplatné %.*s nenastaveno vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "nelze rozebrat seznam síťových adres" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "uživatelské jméno nenastaveno vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "ID uživatele nenastaveno vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "ID skupiny nenastaveno vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "název počítače nenastaven vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "neplatný pracovní adresář: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "neplatný kořenový adresář: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "nelze vykonat %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Verze modulu s politikami sudoers je %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Verze gramatiky souboru sudoers je %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Cesta sudoers: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "cesta k nsswitch: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "cesta k ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "cesta k ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "nelze zaregistrovat háček typu %d (verze %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "nelze si zapamatovat UID %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "nelze zapamatovat si UID %u, již existuje" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "uživatele %s si nelze zapamatovat" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "nelze zapamatovat si uživatele %s, již existuje" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "GID %u si nelze zapamatovat" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "nelze zapamatovat si GID %u, již existuje" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "skupinu %s si nelze zapamatovat" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "nelze zapamatovat si skupinu %s, již existuje" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "nelze zapamatovat si seznam skupin pro %s, již existuje" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "nelze si zapamatovat seznam skupin pro %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "nelze rozebrat skupiny pro %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "nelze rozebrat čísla GID pro %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "přetečení zásobníku oprávnění" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "podtečení zásobníku oprávnění" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "nelze přepnout GID na root" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "nelze přepnout na běhové GID" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "nelze nastavit vektor běhových skupin" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "nelze přepnout na běhové UID" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "nelze přepnout na GID sudoers" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "příliš mnoho procesů" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "současný pracovní adresář nelze zjistit" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "zkrácená auditní cesta user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "zkrácená auditní cesta argv[0]: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "nelze inicializovat zdroj SSS. Je SSSD nainstalován na vašem stroji?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nelze nalézt symbol „%s“ v %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "problém s položkami defaults" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "nenalezeny žádné platné zdroje sudoers, končí se" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "uživatel nemá dovoleno změnit kořenový adresář na %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "nemáte dovoleno použít přepínač -R s %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "uživatel nemá dovoleno změnit adresář na %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "nemáte dovoleno použít přepínač -D s %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers udává, že root nemá dovoleno použít sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "uživatel nemá dovoleno přebít omezení „closefrom“" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "nemáte dovoleno použít přepínač -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "vlastník časového údaje (%s): Takový uživatel neexistuje" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "žádné TTY" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "je nám líto, ale pro spuštění sudo musíte mít TTY" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "neplatný shell pro uživatele %s: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "příkaz v aktuálním adresáři" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "uživatel nemá dovoleno nastavit časový limit příkazu" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "je nám líto, ale nastavit časový limit nemáte dovoleno" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "uživatel nemá dovoleno zachovat prostředí" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "je nám líto, ale zachovat prostředí nemáte dovoleno" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "příkaz je příliš dlouhý" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit není nutné spouštět přes sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "%s nelze číst" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "nelze zjistit údaje o %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s není běžný soubor" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s je vlastněn UID %u, měl by být vlastněn %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s je zapisovatelný pro všechny" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s je vlastněn GID %u, mělo by být %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "pouze root může použít „-c %s“" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "neznáma přihlašovací třída: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "nelze přeložit název stroje %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "neplatná volba filtru: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "neplatná maximální doba čekání: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "neplatný násobek rychlosti: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/časování: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Přehrává se relace sudo: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "TTY nelze nastavit do přímého režimu" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Pozor: váš terminál je příliš malý pro správné zobrazení záznamu.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Rozměry záznamu jsou %d × %d, váš terminál má rozměry %d × %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Přehrávání skončilo, pro obnovení terminálu stiskněte libovolnou klávesu." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "nejednoznačný výraz „%s“" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "ve výrazu neodpovídá „)“" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "neznámý vyhledávací výraz „%s“" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s vyžaduje argument" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "neplatný regulární výraz: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "datum „%s“ se nepodařilo rozebrat" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "ve výrazu neodpovídá „(“" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "zakázané zakončení „or“" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "zakázané zakončení „!“" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "neznámý vyhledávácí typ %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "použití: %s [-hnRS] [-d adresář] [-m číslo] [-s číslo] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "použití: %s [-h] [-d adresář] -l [vyhledávací_výraz]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s – přehraje záznam relace sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Přepínače:\n" +" -d, --directory=adresář\n" +" určuje adresář pro záznamy relace\n" +" -f, --filter=filtr určuje, které druhy I/O se mají zobrazit\n" +" -h, --help zobrazí nápovědu a skončí\n" +" -l, --list vypíše seznam ID dostupných relací, s volitelným\n" +" výrazem\n" +" -m, --max-wait=číslo čeká maximálně počet sekund mezi událostmi\n" +" -n, --non-interactive žádné výzvy, relace se pošle na standardní výstup\n" +" -R, --no-resize nepokouší ze změnit velikost terminálu\n" +" -S, --suspend-wait čeká pokud byl příkaz pozastaven\n" +" -s, --speed=číslo zrychlí nebo zpomalí výstup\n" +" -V, --version zobrazí údaje o verzi a skončí" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\tstroj se neshoduje" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Příkaz povolen" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Příkaz odepřen" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Příkaz se neshoduje" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s je zapisovatelný pro skupinu" + +# TODO: pluralize +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "nelze zkrátit soubor s časovými údaji na %lld bajtů" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "časový údaj z budoucnosti se ignoruje" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "časový údaj ukazuje příliš do budoucna: %20.20s" + +# TODO: pluralize +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "soubor s časovými údaji %s nelze zamknout" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "cesta ke stavům lekce je příliš dlouhý: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit by neměl být uveden s cestou" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "přepínač -x bude v příštím vydání odstraněn" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "prosím, zvažte použití nástroje cvtsudoers" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "pro úpravu %s stiskněte enter: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "zadaný editor (%s) neexistuje" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "žádný editor nenalezen (cesta k editoru = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "chyba zápisu" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "nelze získat údaje o dočasném souboru (%s), %s nezměněno" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "dočasný soubor o nulové velikosti (%s), %s nezměněno" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editor (%s) selhal, %s nezměněno" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s nezměněno" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "nelze znovu otevřít dočasný soubor (%s), %s nezměněno." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "není možné rozebrat dočasný soubor (%s), neznámá chyba" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "vnitřní chyba, v seznamu nelze nalézt %s!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "nelze nastavit (UID, GID) %s na (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s a %s se nenachází na jednom souborovém systému, pro přejmenování se použije mv" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "příkaz selhal: „'%s %s %s“, %s nezměněno" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "chyba při přejmenování %s, %s nezměněno" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Co teď? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Možnosti jsou:\n" +" (e) upravit soubor sudoers znovu\n" +" (x) skončit bez uložení změn do souboru sudoers\n" +" (Q) skončit a uložit změny do souboru sudoers (NEBEZPEČNÉ!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "nelze spustit %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: chybný vlastník (UID, GID), měl by být (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: chybná práva, měla by být 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: rozbor úspěšný\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s je zaneprázdněn, zkuste to později" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "%s nelze uzamknout" + +# The code indeed checks for non-localized "y" character. +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Přesto upravit? [y pro ano / N pro ne]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Chyba: %s:%d:%d: smyčka v %s „%s“" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Pozor: %s:%d:%d: smyčka v %s „%s“" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Chyba: %s:%d:%d: %s „%s“ použit, ale nedefinován" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Pozor: %s:%d:%d: %s „%s“ použit, ale nedefinován" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Pozor: %s:%d:%d: nepoužitý %s „%s“" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s – bezpečně upraví soubor sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Přepínače:\n" +" -c, --check pouze kontroluje\n" +" -f, --file=sudoers\n" +" určuje umístění souboru sudoers\n" +" -h, --help zobrazí nápovědu a skončí\n" +" -q, --quiet méně upovídaná (stručnější) hlášení chyb syntaxe\n" +" -s, --strict přísná kontrola syntaxe\n" +" -V, --version zobrazí údaje o verzi a skončí\n" + +#: toke.l:179 +msgid "empty string" +msgstr "prázdný řetězec" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "prázdná skupina" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "prázdná síťová skupina" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "neplatné pokračování řádku" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "neplatná IPv6 adresa" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "nečekané zalomení řádku uvnitř řetězce" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "příliš mnoho úrovní zanoření" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "Přednačíst prázdné spouštěcí funkce obsažené v knihovně sudo_noexec" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "nelze zamknout soubor protokolu: %s" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports: port je příliš velký" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "Funkce SSL_connect selhala: chyba_SSL=%d, zásobník=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "Soubor se svazkem certifikátů autorit nebyl zadán" + +#~ msgid "Client certificate was not specified" +#~ msgstr "Certifikát klienta nebyl zadán" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "Objekt SSL nelze alokovat: %s\n" + +#~ msgid "Unable to attach socket to the ssl object: %s\n" +#~ msgstr "K objektu SSL nelze připojit socket: %s\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "velikost zprávy od klienta je příliš velká: %zu\n" + +#~ msgid "server message too large: %u\n" +#~ msgstr "zpráva od serveru je příliš veliká: %u\n" + +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "V sudoers není nastaven soubor se svazkem certifikátů autorit" + +#~ msgid "Calling SSL_CTX_load_verify_locations() failed: %s" +#~ msgstr "Volání SSL_CTX_load_verify_locations() selhalo: %s " + +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "V sudoers není nastaven soubor s podepsaným certifikátem" + +#~ msgid "Unable to load private key into the ssl context: %s" +#~ msgstr "Do kontextu SSL nelze zavést soukromý klíč: %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s" +#~ msgstr "Funkce SSL_connect selhala: chyba_SSL=%d, zásobník=%s" + +#~ msgid "SSL_read failed: ssl_error=%d, stack=%s" +#~ msgstr "Funkce SSL_read selhala: chyba_SSL=%d, zásobník=%s" + +#~ msgid "SSL_write failed: ssl_error=%d, stack=%s" +#~ msgstr "Funkce SSL_write selhala: chyba_SSL=%d, zásobník=%s" + +#~ msgid "unknown address family: %d" +#~ msgstr "neznámá rodina síťových adres: %d" + +#~ msgid "audit_failure message too long" +#~ msgstr "zpráva audit_failure je příliš dlouhá" + +#~ msgid "No user or host" +#~ msgstr "Žádný uživatel nebo stroj" + +#~ msgid "validation failure" +#~ msgstr "selhání ověření" + +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/časování: %s" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "neplatná hodnota hodnota atributu se ignoruje: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "nelze zapamatovat si uživatele %s, nedostatek paměti" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "nelze zapamatovat si skupinu %s, nedostatek paměti" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "nelze zapamatovat si seznam skupin pro %s, nedostatek paměti" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Role LDAP: NEZNÁMÁ\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Pořadí: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "Role SSSD: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Role SSSD: NEZNÁMÁ\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Pozor: smyčka v %s „%s“" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Pozor: %s „%s“ použit, ale nedefinován" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Pozor: nepožitý %s „%s“" + +#~ msgid "unable allocate memory" +#~ msgstr "nelze alokovat paměť" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "cesta k časovým údajům je příliš dlouhá: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "nelze zjisti údaje o editoru (%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: nedostatek místa na rozšíření hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: nedostatek místo pro vytvoření hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "nesouhlasí alokace sudo_ldap_build_pass1" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "vnitřní chyba: nedostatek místa pro řádek protokolu" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: přetečení bufferu" diff --git a/plugins/sudoers/po/da.mo b/plugins/sudoers/po/da.mo new file mode 100644 index 0000000..c1ccaef Binary files /dev/null and b/plugins/sudoers/po/da.mo differ diff --git a/plugins/sudoers/po/da.po b/plugins/sudoers/po/da.po new file mode 100644 index 0000000..c1cb6f4 --- /dev/null +++ b/plugins/sudoers/po/da.po @@ -0,0 +1,2344 @@ +# Danish translation of sudoers. +# This file is put in the public domain. +# Joe Hansen , 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018. +# +# audit -> overvågning +# dummy -> attrap +# epoch -> epoke +# execute -> udføre (run -> kør) +# overflow -> overløb +# principal -> værtshovedstol +# runas -> runas ? (eller måske bedre med kør som. den er valgt indtil videre) +# stat -> stat +# timeout -> tidsudløb (eller ventetid, er dog lidt noget andet) +# +# der bliver brugt masser af forskellige citationstegn i den her ('' \" \" ``, +# nogle gange også tre styk). De er alle lavet med »« på dansk. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.24b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-07-31 07:13-0600\n" +"PO-Revision-Date: 2018-08-12 07:48+0200\n" +"Last-Translator: joe Hansen \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.8.11\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "syntaksfejl" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%ps adgangskode: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] adgangskode for %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Adgangskode: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SIKKERHEDSINFORMATION for %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Beklager, prøv igen." + +#: gram.y:194 gram.y:242 gram.y:249 gram.y:256 gram.y:263 gram.y:270 +#: gram.y:286 gram.y:310 gram.y:317 gram.y:324 gram.y:331 gram.y:338 +#: gram.y:401 gram.y:409 gram.y:419 gram.y:452 gram.y:459 gram.y:466 +#: gram.y:473 gram.y:555 gram.y:562 gram.y:571 gram.y:580 gram.y:597 +#: gram.y:709 gram.y:716 gram.y:723 gram.y:731 gram.y:831 gram.y:838 +#: gram.y:845 gram.y:852 gram.y:859 gram.y:885 gram.y:892 gram.y:899 +#: gram.y:1022 gram.y:1296 plugins/sudoers/alias.c:122 +#: plugins/sudoers/alias.c:129 plugins/sudoers/alias.c:145 +#: plugins/sudoers/auth/bsdauth.c:141 plugins/sudoers/auth/kerb5.c:119 +#: plugins/sudoers/auth/kerb5.c:145 plugins/sudoers/auth/pam.c:519 +#: plugins/sudoers/auth/rfc1938.c:109 plugins/sudoers/auth/sia.c:59 +#: plugins/sudoers/cvtsudoers.c:116 plugins/sudoers/cvtsudoers.c:157 +#: plugins/sudoers/cvtsudoers.c:174 plugins/sudoers/cvtsudoers.c:185 +#: plugins/sudoers/cvtsudoers.c:278 plugins/sudoers/cvtsudoers.c:405 +#: plugins/sudoers/cvtsudoers.c:538 plugins/sudoers/cvtsudoers.c:555 +#: plugins/sudoers/cvtsudoers.c:660 plugins/sudoers/cvtsudoers.c:773 +#: plugins/sudoers/cvtsudoers.c:781 plugins/sudoers/cvtsudoers.c:1186 +#: plugins/sudoers/cvtsudoers.c:1190 plugins/sudoers/cvtsudoers.c:1290 +#: plugins/sudoers/cvtsudoers_ldif.c:147 plugins/sudoers/cvtsudoers_ldif.c:189 +#: plugins/sudoers/cvtsudoers_ldif.c:236 plugins/sudoers/cvtsudoers_ldif.c:255 +#: plugins/sudoers/cvtsudoers_ldif.c:325 plugins/sudoers/cvtsudoers_ldif.c:380 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:405 +#: plugins/sudoers/cvtsudoers_ldif.c:414 plugins/sudoers/cvtsudoers_ldif.c:560 +#: plugins/sudoers/cvtsudoers_ldif.c:753 plugins/sudoers/cvtsudoers_ldif.c:780 +#: plugins/sudoers/cvtsudoers_ldif.c:848 plugins/sudoers/cvtsudoers_ldif.c:855 +#: plugins/sudoers/cvtsudoers_ldif.c:860 plugins/sudoers/cvtsudoers_ldif.c:936 +#: plugins/sudoers/cvtsudoers_ldif.c:947 plugins/sudoers/cvtsudoers_ldif.c:953 +#: plugins/sudoers/cvtsudoers_ldif.c:978 plugins/sudoers/cvtsudoers_ldif.c:990 +#: plugins/sudoers/cvtsudoers_ldif.c:994 +#: plugins/sudoers/cvtsudoers_ldif.c:1008 +#: plugins/sudoers/cvtsudoers_ldif.c:1176 +#: plugins/sudoers/cvtsudoers_ldif.c:1208 +#: plugins/sudoers/cvtsudoers_ldif.c:1233 +#: plugins/sudoers/cvtsudoers_ldif.c:1262 +#: plugins/sudoers/cvtsudoers_ldif.c:1312 +#: plugins/sudoers/cvtsudoers_ldif.c:1358 +#: plugins/sudoers/cvtsudoers_ldif.c:1368 plugins/sudoers/defaults.c:656 +#: plugins/sudoers/defaults.c:952 plugins/sudoers/defaults.c:1123 +#: plugins/sudoers/editor.c:65 plugins/sudoers/editor.c:83 +#: plugins/sudoers/editor.c:94 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:61 plugins/sudoers/filedigest.c:77 +#: plugins/sudoers/gc.c:52 plugins/sudoers/group_plugin.c:131 +#: plugins/sudoers/interfaces.c:71 plugins/sudoers/iolog.c:938 +#: plugins/sudoers/iolog_path.c:167 plugins/sudoers/ldap.c:177 +#: plugins/sudoers/ldap.c:408 plugins/sudoers/ldap.c:412 +#: plugins/sudoers/ldap.c:424 plugins/sudoers/ldap.c:715 +#: plugins/sudoers/ldap.c:879 plugins/sudoers/ldap.c:1228 +#: plugins/sudoers/ldap.c:1654 plugins/sudoers/ldap.c:1691 +#: plugins/sudoers/ldap.c:1771 plugins/sudoers/ldap.c:1906 +#: plugins/sudoers/ldap.c:2007 plugins/sudoers/ldap.c:2023 +#: plugins/sudoers/ldap_conf.c:214 plugins/sudoers/ldap_conf.c:245 +#: plugins/sudoers/ldap_conf.c:297 plugins/sudoers/ldap_conf.c:333 +#: plugins/sudoers/ldap_conf.c:422 plugins/sudoers/ldap_conf.c:437 +#: plugins/sudoers/ldap_conf.c:533 plugins/sudoers/ldap_conf.c:566 +#: plugins/sudoers/ldap_conf.c:647 plugins/sudoers/ldap_conf.c:729 +#: plugins/sudoers/ldap_util.c:519 plugins/sudoers/ldap_util.c:575 +#: plugins/sudoers/linux_audit.c:76 plugins/sudoers/logging.c:190 +#: plugins/sudoers/logging.c:506 plugins/sudoers/logging.c:527 +#: plugins/sudoers/logging.c:568 plugins/sudoers/logging.c:745 +#: plugins/sudoers/logging.c:1003 plugins/sudoers/match.c:693 +#: plugins/sudoers/match.c:740 plugins/sudoers/match.c:781 +#: plugins/sudoers/match.c:809 plugins/sudoers/match.c:897 +#: plugins/sudoers/match.c:977 plugins/sudoers/parse.c:192 +#: plugins/sudoers/parse.c:204 plugins/sudoers/parse.c:219 +#: plugins/sudoers/parse.c:231 plugins/sudoers/policy.c:497 +#: plugins/sudoers/policy.c:739 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:263 +#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514 +#: plugins/sudoers/pwutil.c:580 plugins/sudoers/pwutil.c:650 +#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:147 plugins/sudoers/sssd.c:387 +#: plugins/sudoers/sssd.c:450 plugins/sudoers/sssd.c:494 +#: plugins/sudoers/sssd.c:541 plugins/sudoers/sssd.c:732 +#: plugins/sudoers/stubs.c:96 plugins/sudoers/stubs.c:104 +#: plugins/sudoers/sudoers.c:265 plugins/sudoers/sudoers.c:275 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:325 +#: plugins/sudoers/sudoers.c:648 plugins/sudoers/sudoers.c:774 +#: plugins/sudoers/sudoers.c:818 plugins/sudoers/sudoers.c:1092 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:1265 +#: plugins/sudoers/sudoreplay.c:1377 plugins/sudoers/sudoreplay.c:1417 +#: plugins/sudoers/sudoreplay.c:1426 plugins/sudoers/sudoreplay.c:1436 +#: plugins/sudoers/sudoreplay.c:1444 plugins/sudoers/sudoreplay.c:1448 +#: plugins/sudoers/sudoreplay.c:1604 plugins/sudoers/sudoreplay.c:1608 +#: plugins/sudoers/testsudoers.c:125 plugins/sudoers/testsudoers.c:215 +#: plugins/sudoers/testsudoers.c:232 plugins/sudoers/testsudoers.c:554 +#: plugins/sudoers/timestamp.c:401 plugins/sudoers/timestamp.c:445 +#: plugins/sudoers/timestamp.c:923 plugins/sudoers/toke_util.c:55 +#: plugins/sudoers/toke_util.c:108 plugins/sudoers/toke_util.c:145 +#: plugins/sudoers/tsdump.c:125 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:307 plugins/sudoers/visudo.c:313 +#: plugins/sudoers/visudo.c:423 plugins/sudoers/visudo.c:601 +#: plugins/sudoers/visudo.c:920 plugins/sudoers/visudo.c:987 +#: plugins/sudoers/visudo.c:1076 toke.l:847 toke.l:948 toke.l:1105 +msgid "unable to allocate memory" +msgstr "kan ikke tildele hukommelse" + +#: gram.y:484 +msgid "a digest requires a path name" +msgstr "et sammendrag kræver et stinavn" + +#: gram.y:610 +msgid "invalid notbefore value" +msgstr "ugyldig notbefore-værdi" + +#: gram.y:618 +msgid "invalid notafter value" +msgstr "ugyldig notafter-værdi" + +#: gram.y:627 plugins/sudoers/policy.c:313 +msgid "timeout value too large" +msgstr "værdi for tidsudløb er for stor" + +#: gram.y:629 plugins/sudoers/policy.c:315 +msgid "invalid timeout value" +msgstr "ugyldig værdi for tidsudløb" + +#: gram.y:1296 plugins/sudoers/auth/pam.c:349 plugins/sudoers/auth/pam.c:519 +#: plugins/sudoers/auth/rfc1938.c:109 plugins/sudoers/cvtsudoers.c:116 +#: plugins/sudoers/cvtsudoers.c:156 plugins/sudoers/cvtsudoers.c:173 +#: plugins/sudoers/cvtsudoers.c:184 plugins/sudoers/cvtsudoers.c:277 +#: plugins/sudoers/cvtsudoers.c:404 plugins/sudoers/cvtsudoers.c:537 +#: plugins/sudoers/cvtsudoers.c:554 plugins/sudoers/cvtsudoers.c:660 +#: plugins/sudoers/cvtsudoers.c:773 plugins/sudoers/cvtsudoers.c:780 +#: plugins/sudoers/cvtsudoers.c:1186 plugins/sudoers/cvtsudoers.c:1190 +#: plugins/sudoers/cvtsudoers.c:1290 plugins/sudoers/cvtsudoers_ldif.c:146 +#: plugins/sudoers/cvtsudoers_ldif.c:188 plugins/sudoers/cvtsudoers_ldif.c:235 +#: plugins/sudoers/cvtsudoers_ldif.c:254 plugins/sudoers/cvtsudoers_ldif.c:324 +#: plugins/sudoers/cvtsudoers_ldif.c:379 plugins/sudoers/cvtsudoers_ldif.c:387 +#: plugins/sudoers/cvtsudoers_ldif.c:404 plugins/sudoers/cvtsudoers_ldif.c:413 +#: plugins/sudoers/cvtsudoers_ldif.c:559 plugins/sudoers/cvtsudoers_ldif.c:752 +#: plugins/sudoers/cvtsudoers_ldif.c:779 plugins/sudoers/cvtsudoers_ldif.c:847 +#: plugins/sudoers/cvtsudoers_ldif.c:854 plugins/sudoers/cvtsudoers_ldif.c:859 +#: plugins/sudoers/cvtsudoers_ldif.c:935 plugins/sudoers/cvtsudoers_ldif.c:946 +#: plugins/sudoers/cvtsudoers_ldif.c:952 plugins/sudoers/cvtsudoers_ldif.c:977 +#: plugins/sudoers/cvtsudoers_ldif.c:989 plugins/sudoers/cvtsudoers_ldif.c:993 +#: plugins/sudoers/cvtsudoers_ldif.c:1007 +#: plugins/sudoers/cvtsudoers_ldif.c:1176 +#: plugins/sudoers/cvtsudoers_ldif.c:1207 +#: plugins/sudoers/cvtsudoers_ldif.c:1232 +#: plugins/sudoers/cvtsudoers_ldif.c:1261 +#: plugins/sudoers/cvtsudoers_ldif.c:1311 +#: plugins/sudoers/cvtsudoers_ldif.c:1357 +#: plugins/sudoers/cvtsudoers_ldif.c:1367 plugins/sudoers/defaults.c:656 +#: plugins/sudoers/defaults.c:952 plugins/sudoers/defaults.c:1123 +#: plugins/sudoers/editor.c:65 plugins/sudoers/editor.c:83 +#: plugins/sudoers/editor.c:94 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:61 plugins/sudoers/filedigest.c:77 +#: plugins/sudoers/gc.c:52 plugins/sudoers/group_plugin.c:131 +#: plugins/sudoers/interfaces.c:71 plugins/sudoers/iolog.c:938 +#: plugins/sudoers/iolog_path.c:167 plugins/sudoers/ldap.c:177 +#: plugins/sudoers/ldap.c:408 plugins/sudoers/ldap.c:412 +#: plugins/sudoers/ldap.c:424 plugins/sudoers/ldap.c:715 +#: plugins/sudoers/ldap.c:879 plugins/sudoers/ldap.c:1228 +#: plugins/sudoers/ldap.c:1654 plugins/sudoers/ldap.c:1691 +#: plugins/sudoers/ldap.c:1771 plugins/sudoers/ldap.c:1906 +#: plugins/sudoers/ldap.c:2007 plugins/sudoers/ldap.c:2023 +#: plugins/sudoers/ldap_conf.c:214 plugins/sudoers/ldap_conf.c:245 +#: plugins/sudoers/ldap_conf.c:297 plugins/sudoers/ldap_conf.c:333 +#: plugins/sudoers/ldap_conf.c:422 plugins/sudoers/ldap_conf.c:437 +#: plugins/sudoers/ldap_conf.c:533 plugins/sudoers/ldap_conf.c:566 +#: plugins/sudoers/ldap_conf.c:646 plugins/sudoers/ldap_conf.c:729 +#: plugins/sudoers/ldap_util.c:519 plugins/sudoers/ldap_util.c:575 +#: plugins/sudoers/linux_audit.c:76 plugins/sudoers/logging.c:190 +#: plugins/sudoers/logging.c:506 plugins/sudoers/logging.c:527 +#: plugins/sudoers/logging.c:567 plugins/sudoers/logging.c:1003 +#: plugins/sudoers/match.c:692 plugins/sudoers/match.c:739 +#: plugins/sudoers/match.c:781 plugins/sudoers/match.c:809 +#: plugins/sudoers/match.c:897 plugins/sudoers/match.c:976 +#: plugins/sudoers/parse.c:191 plugins/sudoers/parse.c:203 +#: plugins/sudoers/parse.c:218 plugins/sudoers/parse.c:230 +#: plugins/sudoers/policy.c:127 plugins/sudoers/policy.c:136 +#: plugins/sudoers/policy.c:145 plugins/sudoers/policy.c:171 +#: plugins/sudoers/policy.c:298 plugins/sudoers/policy.c:313 +#: plugins/sudoers/policy.c:315 plugins/sudoers/policy.c:341 +#: plugins/sudoers/policy.c:351 plugins/sudoers/policy.c:395 +#: plugins/sudoers/policy.c:405 plugins/sudoers/policy.c:414 +#: plugins/sudoers/policy.c:423 plugins/sudoers/policy.c:497 +#: plugins/sudoers/policy.c:739 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:263 +#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514 +#: plugins/sudoers/pwutil.c:580 plugins/sudoers/pwutil.c:650 +#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 plugins/sudoers/sssd.c:146 +#: plugins/sudoers/sssd.c:387 plugins/sudoers/sssd.c:450 +#: plugins/sudoers/sssd.c:494 plugins/sudoers/sssd.c:541 +#: plugins/sudoers/sssd.c:732 plugins/sudoers/stubs.c:96 +#: plugins/sudoers/stubs.c:104 plugins/sudoers/sudoers.c:265 +#: plugins/sudoers/sudoers.c:275 plugins/sudoers/sudoers.c:283 +#: plugins/sudoers/sudoers.c:325 plugins/sudoers/sudoers.c:648 +#: plugins/sudoers/sudoers.c:774 plugins/sudoers/sudoers.c:818 +#: plugins/sudoers/sudoers.c:1092 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1377 +#: plugins/sudoers/sudoreplay.c:1417 plugins/sudoers/sudoreplay.c:1426 +#: plugins/sudoers/sudoreplay.c:1436 plugins/sudoers/sudoreplay.c:1444 +#: plugins/sudoers/sudoreplay.c:1448 plugins/sudoers/sudoreplay.c:1604 +#: plugins/sudoers/sudoreplay.c:1608 plugins/sudoers/testsudoers.c:125 +#: plugins/sudoers/testsudoers.c:215 plugins/sudoers/testsudoers.c:232 +#: plugins/sudoers/testsudoers.c:554 plugins/sudoers/timestamp.c:401 +#: plugins/sudoers/timestamp.c:445 plugins/sudoers/timestamp.c:923 +#: plugins/sudoers/toke_util.c:55 plugins/sudoers/toke_util.c:108 +#: plugins/sudoers/toke_util.c:145 plugins/sudoers/tsdump.c:125 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:307 +#: plugins/sudoers/visudo.c:313 plugins/sudoers/visudo.c:423 +#: plugins/sudoers/visudo.c:601 plugins/sudoers/visudo.c:920 +#: plugins/sudoers/visudo.c:987 plugins/sudoers/visudo.c:1076 toke.l:847 +#: toke.l:948 toke.l:1105 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:140 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias »%s« er allerede defineret" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kan ikke hente logindklasse for bruger %s" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "kan ikke starte bsd-godkendelse" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "ugyldig godkendelsestype" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "kan ikke initialisere BSD-godkendelse" + +#: plugins/sudoers/auth/bsdauth.c:178 +msgid "your account has expired" +msgstr "din konto er udløbet" + +#: plugins/sudoers/auth/bsdauth.c:180 +msgid "approval failed" +msgstr "godkendelse mislykkedes" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "kan ikke læse fwtk-konfiguration" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "kan ikke forbinde til godkendelsesserver" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:119 +msgid "lost connection to authentication server" +msgstr "mistede forbindelsen til godkendelseserveren" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"godkendelsesserverfejl:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: Kan ikke konvertere værtshovedstol til streng (»%s«): %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: Kan ikke fortolke »%s«: %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: Kan ikke slå akkreditivmellemlager op: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: Kan ikke allokere tilvalg: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: Kan ikke indhente akkreditiver: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: Kan ikke initialisere akkreditivmellemlager: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: Kan ikke gemme akkreditiver i mellemlager: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: Kan ikke indhente værtshovedstol: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Kan ikke verifiere TGT! Muligt angreb!: %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "kan ikke initialisere PAM" + +#: plugins/sudoers/auth/pam.c:199 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM-godkendelsesserverfejl: %s" + +#: plugins/sudoers/auth/pam.c:216 +msgid "account validation failure, is your account locked?" +msgstr "valideringsfejl for konto, er din konto låst?" + +#: plugins/sudoers/auth/pam.c:224 +msgid "Account or password is expired, reset your password and try again" +msgstr "Konto eller adgangskoder er udløbet, nulstil din adgangskode og forsøg igen" + +#: plugins/sudoers/auth/pam.c:233 +#, c-format +msgid "unable to change expired password: %s" +msgstr "kan ikke ændre udløbet adgangskode: %s" + +#: plugins/sudoers/auth/pam.c:241 +msgid "Password expired, contact your system administrator" +msgstr "Adgangskode udløbet, kontakt din systemadministrator" + +#: plugins/sudoers/auth/pam.c:245 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Konto udløbet eller PAM-konfiguration mangler et »kontoafsnit« for sudo. Kontakt din systemadministrator" + +#: plugins/sudoers/auth/pam.c:252 plugins/sudoers/auth/pam.c:257 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM-kontohåndteringsfejl: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "du findes ikke i %s-databasen" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "kunne ikke initialisere ACE API-biblioteket" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "kan ikke kontakte SecurID-serveren" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "Bruger-ID låst for SecurID-godkendelse" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "ugyldigt brugernavnslængde for SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "ugyldigt godkendelseshåndtag for SecurID" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "SecurID-kommunikation fejlede" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "ukendt SecurID-fejl" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "ugyldig adgangskodelængde for SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:124 +msgid "unable to initialize SIA session" +msgstr "kan ikke initialisere SIA-session" + +#: plugins/sudoers/auth/sudo_auth.c:131 +msgid "invalid authentication methods" +msgstr "ugyldige godkendelsesmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:133 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Ugyldige godkendelsesmetoder kompileret ind i sudo! Du kan ikke blande uafhængig og ikkeuafhængig godkendelse." + +#: plugins/sudoers/auth/sudo_auth.c:254 plugins/sudoers/auth/sudo_auth.c:304 +msgid "no authentication methods" +msgstr "ingen godkendelsesmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:256 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Der er ingen godkendelsesmetoder kompileret ind i sudo! Hvis du ønsker at fravælge godkendelse så brug konfigurationstilvalget --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:306 +msgid "Unable to initialize authentication methods." +msgstr "Kan ikke initialisere godkendelsesmetoder." + +#: plugins/sudoers/auth/sudo_auth.c:472 +msgid "Authentication methods:" +msgstr "Godkendelsesmetoder:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "Kunne ikke bestemme overvågningsbetingelse" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "kan ikke indsende overvågningspost" + +#: plugins/sudoers/check.c:262 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Vi stoler på, at du har modtaget den gængse advarsel fra den lokale\n" +"systemadministrator. Det drejer sig normalt om følgende tre ting:\n" +"\n" +" #1) Respekter andres privatliv.\n" +" #2) Tænk før du taster.\n" +" #3) Med stor magt følger stort ansvar.\n" +"\n" + +#: plugins/sudoers/check.c:305 plugins/sudoers/check.c:315 +#: plugins/sudoers/sudoers.c:691 plugins/sudoers/sudoers.c:736 +#: plugins/sudoers/tsdump.c:121 +#, c-format +msgid "unknown uid: %u" +msgstr "ukendt uid: %u" + +#: plugins/sudoers/check.c:310 plugins/sudoers/iolog.c:257 +#: plugins/sudoers/policy.c:912 plugins/sudoers/sudoers.c:1131 +#: plugins/sudoers/testsudoers.c:206 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "ukendt bruger: %s" + +#: plugins/sudoers/cvtsudoers.c:191 +#, c-format +msgid "order increment: %s: %s" +msgstr "rækkefølgeforøgelse: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:207 +#, c-format +msgid "starting order: %s: %s" +msgstr "startrækkefølge: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:218 plugins/sudoers/sudoreplay.c:310 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s version %s\n" + +#: plugins/sudoers/cvtsudoers.c:220 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s grammatikversion %d\n" + +#: plugins/sudoers/cvtsudoers.c:237 +#, c-format +msgid "unsupported input format %s" +msgstr "ej understøttet inddataformat %s" + +#: plugins/sudoers/cvtsudoers.c:252 +#, c-format +msgid "unsupported output format %s" +msgstr "ej understøttet uddataformat %s" + +#: plugins/sudoers/cvtsudoers.c:292 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: inddata- og uddatafiler skal være forskellige" + +#: plugins/sudoers/cvtsudoers.c:308 plugins/sudoers/sudoers.c:168 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/visudo.c:233 +#: plugins/sudoers/visudo.c:589 plugins/sudoers/visudo.c:911 +msgid "unable to initialize sudoers default values" +msgstr "kan ikke initialisere sudoers' standardværdier" + +#: plugins/sudoers/cvtsudoers.c:393 plugins/sudoers/ldap_conf.c:412 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:452 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: ukendt nøgleord: %s" + +#: plugins/sudoers/cvtsudoers.c:498 +#, c-format +msgid "invalid defaults type: %s" +msgstr "ugyldig type for standarder: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid suppression type: %s" +msgstr "ugyldig undertrykkelsestype: %s" + +#: plugins/sudoers/cvtsudoers.c:561 plugins/sudoers/cvtsudoers.c:575 +#, c-format +msgid "invalid filter: %s" +msgstr "ugyldigt filter: %s" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/cvtsudoers.c:1250 +#: plugins/sudoers/cvtsudoers_json.c:1113 +#: plugins/sudoers/cvtsudoers_ldif.c:627 +#: plugins/sudoers/cvtsudoers_ldif.c:1163 plugins/sudoers/iolog.c:415 +#: plugins/sudoers/sudoers.c:898 plugins/sudoers/sudoreplay.c:356 +#: plugins/sudoers/sudoreplay.c:1366 plugins/sudoers/sudoreplay.c:1570 +#: plugins/sudoers/timestamp.c:410 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:907 +#, c-format +msgid "unable to open %s" +msgstr "kan ikke åbne %s" + +#: plugins/sudoers/cvtsudoers.c:656 plugins/sudoers/visudo.c:916 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "kunne ikke fortolke %s-fil, ukendt fejl" + +#: plugins/sudoers/cvtsudoers.c:664 plugins/sudoers/visudo.c:933 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "fortolkningsfejl i %s nær linje %d\n" + +#: plugins/sudoers/cvtsudoers.c:667 plugins/sudoers/visudo.c:936 +#, c-format +msgid "parse error in %s\n" +msgstr "fortolkningsfejl i %s\n" + +#: plugins/sudoers/cvtsudoers.c:1297 plugins/sudoers/iolog.c:502 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:294 +#: plugins/sudoers/timestamp.c:297 +#, c-format +msgid "unable to write to %s" +msgstr "kan ikke skrive til %s" + +#: plugins/sudoers/cvtsudoers.c:1320 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konverter mellem sudoers-filformater\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1322 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Tilvalg:\n" +" -b, --base=dn base-DN'en for sudo LDAP-forespørgsler\n" +" -d, --defaults=deftyper konverter kun Standarder for angivne typer\n" +" -e, --expand-aliases udvid aliasser under konvertering\n" +" -f, --output-format=format angiv uddataformat: JSON, LDIF eller sudoers\n" +" -i, --input-format=format angiv inddataformat: LDIF eller sudoers\n" +" -I, --increment=num mængde at øge hver sudoOrder med\n" +" -h, --help vis denne hjælpetekst og afslut\n" +" -m, --match=filter konverter kun poster som matcher filteret\n" +" -M, --match-local matchfilter bruger passwd og gruppedatabaser\n" +" -o, --output=uddatafil skriv konverteret sudoers til uddatafil\n" +" -O, --order-start=num startpunkt for første sudoOrder\n" +" -p, --prune-matches trim ikkematchende brugere, grupper og værter\n" +" -s, --suppress=sektioner undertryk uddata for bestemte sektioner\n" +" -V, --version vis information om version og afslut" + +#: plugins/sudoers/cvtsudoers_json.c:673 plugins/sudoers/cvtsudoers_json.c:708 +#: plugins/sudoers/cvtsudoers_json.c:924 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "ukendt indgang »%s« for standarder" + +#: plugins/sudoers/cvtsudoers_json.c:844 plugins/sudoers/cvtsudoers_json.c:859 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:310 +#: plugins/sudoers/ldap.c:474 +msgid "unable to get GMT time" +msgstr "kan ikke indhente GMT-tid" + +#: plugins/sudoers/cvtsudoers_json.c:847 plugins/sudoers/cvtsudoers_json.c:862 +#: plugins/sudoers/cvtsudoers_ldif.c:302 plugins/sudoers/cvtsudoers_ldif.c:313 +#: plugins/sudoers/ldap.c:480 +msgid "unable to format timestamp" +msgstr "kan ikke formatere tidsstempel" + +#: plugins/sudoers/cvtsudoers_ldif.c:517 plugins/sudoers/env.c:295 +#: plugins/sudoers/env.c:302 plugins/sudoers/env.c:407 +#: plugins/sudoers/ldap.c:488 plugins/sudoers/ldap.c:719 +#: plugins/sudoers/ldap.c:1046 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:308 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/logging.c:1008 plugins/sudoers/policy.c:618 +#: plugins/sudoers/policy.c:628 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:840 plugins/sudoers/testsudoers.c:236 +#: plugins/sudoers/toke_util.c:157 +#, c-format +msgid "internal error, %s overflow" +msgstr "intern fejl, %s-overløb" + +#: plugins/sudoers/cvtsudoers_ldif.c:622 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "miljøvariablen SUDOERS_BASE er ikke angivet og tilvalget -b var ikke angivet." + +#: plugins/sudoers/cvtsudoers_ldif.c:757 +#, c-format +msgid "ignoring invalid attribute value: %s" +msgstr "ignorerer ugyldig attributværdi: %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:1197 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorerer ufuldstændig sudoRole: cn: %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:1349 plugins/sudoers/ldap.c:1778 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "ugyldig sudoOrder-attribut: %s" + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-facilitet hvis syslog bruges til logning: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioritet at bruge når brugergodkendelser går igennem: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioritet at bruge når brugergodkendelser ikke går igennem: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Placer OTP-prompter på deres egen linje" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignorer ».« i $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Send altid post når sudo køres" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Send post hvis brugergodkendelse fejler" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Send post hvis brugeren ikke er i suoders" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Send post hvis brugeren ikke er i sudoers for denne vært" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Send post hvis brugeren ikke har tilladelse til at køre en kommando" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Send post hvis brugeren forsøger at køre en kommando" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Brug et separat tidsstempel for hver bruger/tty-kombination" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Undervis brugere den første gang de kører sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fil indeholdende sudo-undervisningen: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Kræv som standard at brugere skal godkendes" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root kan køre sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Log værtsnavnet i logfilen (non-syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Log året i logfilen (non-syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Hvis sudo er startet op uden argumenter så start en skal" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Angiv $HOME for målbrugeren når der startes en skal med -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Angiv altid $HOME for målbrugerens hjemmemappe" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Tillad lidt informationsindsamling for at lave brugbare fejlbeskeder" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Kræv fuldkvalificerede værtsnavne i sudoersfilen" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Fornærm brugeren når de indtaster en forkert adgangskode" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Tillad kun brugeren at køre sudo hvis de har en tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo vil overholde EDITOR-miljøvariablen" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Spørg om adgangskoden for root, ikke brugerens" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Spørg om brugerens kør som_standard adgangskode, ikke brugernes" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Spørg om målbrugerens adgangskode, ikke brugernes" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Brug standarder i målbrugerens logindklasse hvis der er en" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Angiv LOGNAME- og USER-miljøvariablerne" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Angiv kun den effektive uid til målbrugeren, ikke den reelle uid" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Initialiser ikke gruppevektoren til målbrugerens" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Længde hvor logfillinjer skal ombrydes (0 for ingen ombrydning): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Tidsudløb for godkendelsestidsstempel: %.1f minutter" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Tidsudløb for adgangskodeprompt: %.1f minutter" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Antal forsøg for indtastning af adgangskode: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask at bruge eller 0777 for at bruge brugers: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Sti til logfil: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Stil til postprogram: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Flag for postprogram: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adresse at sende post til: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adresse at sende post fra: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Emnelinje for postbeskeder: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Ugyldig adgangskodebesked: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Sti til undervisningsstatusmappen: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Sti til mappe for godkendelsestidsstempel: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Ejer af mappen for godkendelsestidsstempel: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Brugere i denne gruppe er undtaget fra adgangskode og STI-krav: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standard for adgangskodeprompt: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Hvis angivet vil adgangsprompt overskrive systemprompt i alle tilfælde." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standardbruger at køre kommandoer som: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Værdi at overskrive brugers $PATH med: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Sti til redigeringsprogrammet for brug af visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Hvornår der skal kræves en adgangskode for »list« pseudokommando: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Hvornår der skal kræves en adgangskode for »verify« pseudokommando: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Præindlæs attrap-udførelsesfunktioner indeholdt i biblioteket sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Hvis LDAP-mappe er sat op, ignorer vi så lokal sudoersfil" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Filbeskrivelser >= %d vil blive lukket før udførelse af en kommando" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Hvis angivet kan brugere overskrive værdien af »closeform« med tilvalget -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Tillad at brugere kan angive arbitrære miljøvariabler" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Nulstil miljøet til et standardsæt af variabler" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Miljøvariabler at indstillingskontrollere:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Miljøvariabler at fjerne:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Miljøvariabler at bevare:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux-rolle at bruge i den nye sikkerhedskontekst: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux-type at bruge i den nye sikkerhedskontekst: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Sti til den sudo-specifikke miljøfil: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Sti til det begrænsede sudo-specifikke miljøfil: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Sprog at bruge under fortolkning af sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Tillad at sudo spørger om en adgangskode selv om den vil være synlig" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Tilbyd visuel tilbagemeldning ved adgangskodeprompten når der er brugerinddata" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Brug hurtigere globbing som er mindre præcis, men som ikke tilgår filsystemet" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Umask'en angivet i sudoers vil overskrive brugerens, også selv om den er mere tilladende" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Log brugers inddata for kommandoen der bliver kørt" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Log uddata for kommandoen der bliver kørt" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Komprimer I/O-log med brug af zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Kør altid kommandoer i en pseudo-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Udvidelsesmodul for ikke-Unix-gruppeunderstøttelse: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Mappe at gemme inddata-/uddatalogge i: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fil at gemme inddata-/uddatalog i: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Tilføjer et punkt til utmp/utmpx-filen når der allokeres en pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Angiv brugeren i utmp til brugeren kør som, ikke den opstartende bruger" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Sæt af tilladte privilegier: %s" + +# Det skal forstås som et sæt af grænseprivilegier +# https://www.sudo.ws/man/1.8.21/sudoers.man.html (se limitprivs) +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Sæt af grænseprivilegier: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Kør kommandoer på en pty i baggrunden" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "PAM-tjenestenavn der skal bruges: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-tjenestenavn der skal bruges for logindskaller: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Forsøg på at etablere PAM-akkreditiver for målbrugeren" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Opret en ny PAM-session som kommandoen kan køre i" + +#: plugins/sudoers/def_data.c:402 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Maksimalt I/O-logsekvenstal: %u" + +#: plugins/sudoers/def_data.c:406 +msgid "Enable sudoers netgroup support" +msgstr "Aktiver sudoers netgroup-understøttelse" + +#: plugins/sudoers/def_data.c:410 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontroller overmappers skriverettigheder ved redigering af filer med sudoedit" + +#: plugins/sudoers/def_data.c:414 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Følg symbolske henvisninger når filer redigeres med sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Query the group plugin for unknown system groups" +msgstr "Forespørg gruppe-udvidelsesmodulet for ukendte systemgrupper" + +#: plugins/sudoers/def_data.c:422 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Sammenlign netgrupper baseret på hele tuplen: bruger, vært og domæne" + +#: plugins/sudoers/def_data.c:426 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Tillader at kommandoer køres, selv om sudo ikke kan skrive til revisionsloggen" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Tillader at kommandoer køres, selv om sudo ikke kan skrive til I/O-loggen" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Tillader at kommandoer køres, selv om sudo ikke kan skrive til logfilen" + +#: plugins/sudoers/def_data.c:438 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Slå grupper op i sudoers og match efter gruppe-id, ikke navnet" + +#: plugins/sudoers/def_data.c:442 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Logposter større end denne værdi vil blive opdelt i flere syslogbeskeder: %u" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Bruger som vil eje I/O-logfilerne: %s" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Gruppe som vil eje I/O-logfilerne: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Filtilstand der skal bruges for I/O-logfilerne: 0%o" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Kør kommandoer efter fildeskriptor i stedet for efter sti: %s" + +# Defaults-punkter/indgange", vil jeg tro +# Vil mene at det er en overskrift i konfigurationsfilen eller lignende +#: plugins/sudoers/def_data.c:462 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorer ukendte Defaults-punkter i sudoere i stedet for at give en advarsel" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tid i sekunder hvorefter kommandoen vil blive afsluttet: %u" + +#: plugins/sudoers/def_data.c:470 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Tillad at brugeren angiver et tidsudløb på kommandolinjen" + +#: plugins/sudoers/def_data.c:474 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Tøm I/O-logdata til disken med det samme i stedet for at mellemlagre den" + +#: plugins/sudoers/def_data.c:478 +msgid "Include the process ID when logging via syslog" +msgstr "Inkluder proces-id'et når der logges via syslog" + +#: plugins/sudoers/def_data.c:482 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Elementtype for godkendelsestidsstempel: %s" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Authentication failure message: %s" +msgstr "godkendelsesfejlbesked: %s" + +#: plugins/sudoers/def_data.c:490 +msgid "Ignore case when matching user names" +msgstr "Ignorer store/små bogstaver når brugernavne matches" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching group names" +msgstr "Ignorer store/små bogstaver når gruppenavne matches" + +#: plugins/sudoers/defaults.c:224 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d ukendt indgang »%s« for standarder" + +#: plugins/sudoers/defaults.c:227 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: ukendt indgang »%s« for standarder" + +#: plugins/sudoers/defaults.c:270 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d ingen værdi angivet for »%s«" + +#: plugins/sudoers/defaults.c:273 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: ingen værdi angivet for »%s«" + +#: plugins/sudoers/defaults.c:293 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d værdier for »%s« skal begynde med en »/«" + +#: plugins/sudoers/defaults.c:296 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: værdier for »%s« skal begynde med en »/«" + +#: plugins/sudoers/defaults.c:318 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d indstillingen »%s« kan ikke modtage en værdi" + +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: indstillingen »%s« kan ikke modtage en værdi" + +#: plugins/sudoers/defaults.c:346 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d ugyldig standardtype 0x%x for tilvalget »%s«" + +#: plugins/sudoers/defaults.c:349 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: ugyldig standardtype 0x%x for tilvalget »%s«" + +#: plugins/sudoers/defaults.c:359 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d værdien »%s« er ugyldig for tilvalget »%s«" + +#: plugins/sudoers/defaults.c:362 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: værdien »%s« er ugyldig for tilvalget »%s«" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: ødelagt envp, forskellig længde" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "kan ikke genopbygge miljøet" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "beklager, du har ikke tilladelse til at angive de følgende miljøvariabler: %s" + +#: plugins/sudoers/file.c:111 +#, c-format +msgid "parse error in %s near line %d" +msgstr "fortolkningsfejl i %s nær linje %d" + +#: plugins/sudoers/file.c:114 +#, c-format +msgid "parse error in %s" +msgstr "fortolkningsfejl i %s" + +#: plugins/sudoers/filedigest.c:56 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "ej understøttet sammendragstype %d for %s" + +#: plugins/sudoers/filedigest.c:85 +#, c-format +msgid "%s: read error" +msgstr "%s: læsefejl" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s skal være ejet af uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s skal være skrivbar af ejer" + +#: plugins/sudoers/group_plugin.c:95 plugins/sudoers/sssd.c:550 +#, c-format +msgid "unable to load %s: %s" +msgstr "kan ikke indlæse %s: %s" + +#: plugins/sudoers/group_plugin.c:101 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "kan ikke finde symbol »group_plugin« i %s" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: inkompatibel gruppeudvidelsesmodul for hovedversion %d, forventede %d" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "kan ikke fortolke IP-adressen »%s«" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "kan ikke fortolke netmasken »%s«" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "Lokal IP-adresse og netmaskepar:\n" + +#: plugins/sudoers/iolog.c:119 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s findes men er ikke en mappe (0%o)" + +#: plugins/sudoers/iolog.c:144 plugins/sudoers/iolog.c:184 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:174 +#, c-format +msgid "unable to mkdir %s" +msgstr "kan ikke mkdir %s" + +#: plugins/sudoers/iolog.c:188 plugins/sudoers/visudo.c:718 +#: plugins/sudoers/visudo.c:728 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "kan ikke ændre tilstand på %s til 0%o" + +#: plugins/sudoers/iolog.c:296 plugins/sudoers/sudoers.c:1162 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "ukendt gruppe: %s" + +#: plugins/sudoers/iolog.c:466 plugins/sudoers/sudoers.c:902 +#: plugins/sudoers/sudoreplay.c:868 plugins/sudoers/sudoreplay.c:1681 +#: plugins/sudoers/tsdump.c:140 +#, c-format +msgid "unable to read %s" +msgstr "kan ikke læse %s" + +#: plugins/sudoers/iolog.c:581 plugins/sudoers/iolog.c:800 +#, c-format +msgid "unable to create %s" +msgstr "kan ikke oprette %s" + +#: plugins/sudoers/iolog.c:1032 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1188 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "kan ikke skrive til I/O-logfilen: %s" + +#: plugins/sudoers/iolog.c:1066 +#, c-format +msgid "%s: internal error, file index %d not open" +msgstr "%s: intern fejl, filindekset %d er ikke åbent" + +#: plugins/sudoers/ldap.c:170 plugins/sudoers/ldap_conf.c:287 +msgid "starttls not supported when using ldaps" +msgstr "starttls er ikke understøttet, når der bruges ldaps" + +#: plugins/sudoers/ldap.c:241 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "kan ikke initialisere SSL-cert og key db: %s" + +#: plugins/sudoers/ldap.c:244 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "du skal angive at TLS_CERT i %s skal bruge SSL" + +#: plugins/sudoers/ldap.c:1606 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "kan ikke initialisere LDAP: %s" + +#: plugins/sudoers/ldap.c:1642 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls angivet men LDAP libs understøtter ikke ldap_start_tls_s() eller ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap_conf.c:196 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: port for stor" + +#: plugins/sudoers/ldap_conf.c:256 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "ikkeunderstøttet LDAP uri-type: %s" + +#: plugins/sudoers/ldap_conf.c:283 +msgid "unable to mix ldap and ldaps URIs" +msgstr "kan ikke blande ldap og ldaps URI'er" + +#: plugins/sudoers/ldap_util.c:470 plugins/sudoers/ldap_util.c:472 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "kan ikke konvertere sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "kan ikke åbne overvågningssystem" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "kan ikke sende overvågningsbesked" + +#: plugins/sudoers/logging.c:108 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s: (kommando fortsat) %s" + +#: plugins/sudoers/logging.c:165 +#, c-format +msgid "unable to open log file: %s" +msgstr "kan ikke åbne logfilen: %s" + +#: plugins/sudoers/logging.c:173 +#, c-format +msgid "unable to lock log file: %s" +msgstr "kan ikke låse logfilen: %s" + +#: plugins/sudoers/logging.c:206 +#, c-format +msgid "unable to write log file: %s" +msgstr "kan ikke skrive til logfilen: %s" + +#: plugins/sudoers/logging.c:235 +msgid "No user or host" +msgstr "Ingen bruger eller vært" + +#: plugins/sudoers/logging.c:237 +msgid "validation failure" +msgstr "valideringsfejl" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "bruger IKKE i sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "bruger IKKE autoriseret på vært" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "kommando ikke tilladt" + +#: plugins/sudoers/logging.c:283 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s er ikke sudoersfilen. Denne handling vil blive rapporteret.\n" + +#: plugins/sudoers/logging.c:286 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s har ikke tilladelse til at køre sudo på %s. Denne handling vil blive rapporteret.\n" + +#: plugins/sudoers/logging.c:290 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Beklager. Bruger %s må ikke køre sudo på %s.\n" + +#: plugins/sudoers/logging.c:293 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Beklager. Bruger %s har ikke tilladelse til at køre »%s%s%s« som %s%s%s på %s.\n" + +#: plugins/sudoers/logging.c:330 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:435 plugins/sudoers/sudoers.c:437 +#: plugins/sudoers/sudoers.c:439 plugins/sudoers/sudoers.c:594 +#: plugins/sudoers/sudoers.c:596 +#, c-format +msgid "%s: command not found" +msgstr "%s: Kommando ikke fundet" + +#: plugins/sudoers/logging.c:332 plugins/sudoers/sudoers.c:429 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignorerer »%s« fundet i ».«\n" +"Brug »sudo ./%s«, hvis dette er den »%s«, du ønsker at køre." + +#: plugins/sudoers/logging.c:349 +msgid "authentication failure" +msgstr "godkendelsesfejl" + +#: plugins/sudoers/logging.c:375 +msgid "a password is required" +msgstr "der kræves en adgangskode" + +#: plugins/sudoers/logging.c:438 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u ukorrekt adgangskodeforsøg" +msgstr[1] "%u ukorrekte adgangskodeforsøg" + +#: plugins/sudoers/logging.c:659 +msgid "unable to fork" +msgstr "kan ikke forgrene" + +#: plugins/sudoers/logging.c:667 plugins/sudoers/logging.c:719 +#, c-format +msgid "unable to fork: %m" +msgstr "kan ikke forgrene: %m" + +#: plugins/sudoers/logging.c:709 +#, c-format +msgid "unable to open pipe: %m" +msgstr "kan ikke åbne datakanal: %m" + +#: plugins/sudoers/logging.c:734 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "kan ikke dup stdin: %m" + +#: plugins/sudoers/logging.c:772 +#, c-format +msgid "unable to execute %s: %m" +msgstr "kan ikke køre %s: %m" + +#: plugins/sudoers/match.c:842 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "sammendrag for %s (%s) er ikke i %s-form" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:913 +#: plugins/sudoers/visudo.c:416 plugins/sudoers/visudo.c:712 +#, c-format +msgid "unable to stat %s" +msgstr "kan ikke stat %s" + +#: plugins/sudoers/parse.c:434 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-rolle: %s\n" + +#: plugins/sudoers/parse.c:437 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-punkt:\n" + +#: plugins/sudoers/parse.c:439 +#, c-format +msgid " RunAsUsers: " +msgstr " KørSomBrugere: " + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsGroups: " +msgstr " KørSomGrupper: " + +#: plugins/sudoers/parse.c:464 +#, c-format +msgid " Options: " +msgstr " Tilvalg: " + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid " Commands:\n" +msgstr " Kommandoer:\n" + +#: plugins/sudoers/parse.c:709 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Matchende standardpunkter for %s på %s:\n" + +#: plugins/sudoers/parse.c:727 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Kør som og kommandospecifikke standarder for %s:\n" + +#: plugins/sudoers/parse.c:745 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Bruger %s må køre de følgende kommandoer på %s:\n" + +#: plugins/sudoers/parse.c:760 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Bruger %s har ikke tilladelse til at køre sudo på %s.\n" + +#: plugins/sudoers/policy.c:83 plugins/sudoers/policy.c:109 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "ugyldig %.*s angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:288 plugins/sudoers/testsudoers.c:259 +msgid "unable to parse network address list" +msgstr "kan ikke fortolke netværksadresseliste" + +#: plugins/sudoers/policy.c:432 +msgid "user name not set by sudo front-end" +msgstr "brugernavn er ikke angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:436 +msgid "user ID not set by sudo front-end" +msgstr "bruger-id er ikke angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:440 +msgid "group ID not set by sudo front-end" +msgstr "gruppe-id er ikke angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:444 +msgid "host name not set by sudo front-end" +msgstr "værtsnavn er ikke angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:797 plugins/sudoers/visudo.c:215 +#: plugins/sudoers/visudo.c:845 +#, c-format +msgid "unable to execute %s" +msgstr "kan ikke udføre %s" + +#: plugins/sudoers/policy.c:930 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Udvidelsesmodulversion %s for sudoerspolitik\n" + +#: plugins/sudoers/policy.c:932 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Grammatikversion %d for sudoersfil\n" + +#: plugins/sudoers/policy.c:936 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-sti: %s\n" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-sti: %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-sti: %s\n" + +#: plugins/sudoers/policy.c:942 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-sti: %s\n" + +# lidt i tvivl om hvad hook er her, så har beholdt den uoversat +# Er OK. Er enig med hensyn til hook, skal nok forstås som +# fastgøringspunkt, men lyder for bøvlet +#: plugins/sudoers/policy.c:975 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "kan ikke registrere »hook« af typen %d (version %d.%d)" + +#: plugins/sudoers/pwutil.c:214 plugins/sudoers/pwutil.c:233 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "kan ikke cache uid %u, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:227 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "kan ikke cache uid %u, findes allerede" + +#: plugins/sudoers/pwutil.c:287 plugins/sudoers/pwutil.c:305 +#: plugins/sudoers/pwutil.c:367 plugins/sudoers/pwutil.c:412 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "kan ikke cache bruger %s, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:300 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "kan ikke cache bruger %s, findes allerede" + +#: plugins/sudoers/pwutil.c:531 plugins/sudoers/pwutil.c:550 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "kan ikke cache gid %u, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:544 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "kan ikke cache gid %u, findes allerede" + +#: plugins/sudoers/pwutil.c:598 plugins/sudoers/pwutil.c:616 +#: plugins/sudoers/pwutil.c:663 plugins/sudoers/pwutil.c:705 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "kan ikke cache gruppe %s, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:611 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "kan ikke cache gruppe %s, findes allerede" + +#: plugins/sudoers/pwutil.c:831 plugins/sudoers/pwutil.c:883 +#: plugins/sudoers/pwutil.c:934 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "kan ikke cache gruppeliste for %s, findes allerede" + +#: plugins/sudoers/pwutil.c:837 plugins/sudoers/pwutil.c:888 +#: plugins/sudoers/pwutil.c:940 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "kan ikke cache gruppeliste for %s, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:877 +#, c-format +msgid "unable to parse groups for %s" +msgstr "kan ikke fortolke grupper for %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "kan ikke fortolke gid'er for %s" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "permanent stakoverløb" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "permanent stakunderløb" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "kan ikke ændre til root gid" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "kan ikke ændre til kør som gid" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "kan ikke angive kør som gruppevektor" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "kan ikke ændre til kør som uid" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "kan ikke ændre til sudoers gid" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "for mange processer" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "kan ikke hente nuværende arbejdsmappe" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "afkortet revisionssti user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "afkortet revisionssti argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "audit_failure-besked er for lang" + +#: plugins/sudoers/sssd.c:552 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "kan ikke initialisere SSS-kilde. Er SSSD installeret på din maskine?" + +#: plugins/sudoers/sssd.c:560 plugins/sudoers/sssd.c:569 +#: plugins/sudoers/sssd.c:578 plugins/sudoers/sssd.c:587 +#: plugins/sudoers/sssd.c:596 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "kan ikke finde symbol »%s« i %s" + +#: plugins/sudoers/sudoers.c:204 plugins/sudoers/sudoers.c:859 +msgid "problem with defaults entries" +msgstr "problem med standardpunkter" + +#: plugins/sudoers/sudoers.c:208 +msgid "no valid sudoers sources found, quitting" +msgstr "ingen gyldige sudoerskilder fundet, afslutter" + +#: plugins/sudoers/sudoers.c:246 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers angiver at administrator (root) ikke har tilladelse til sudo" + +#: plugins/sudoers/sudoers.c:303 +msgid "you are not permitted to use the -C option" +msgstr "du har ikke tilladelse til at bruge tilvalget -C" + +#: plugins/sudoers/sudoers.c:350 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "tidsstempelejer (%s): Ingen sådan bruger" + +#: plugins/sudoers/sudoers.c:365 +msgid "no tty" +msgstr "ingen tty" + +#: plugins/sudoers/sudoers.c:366 +msgid "sorry, you must have a tty to run sudo" +msgstr "beklager, du skal bruge en tty for at køre sudo" + +#: plugins/sudoers/sudoers.c:428 +msgid "command in current directory" +msgstr "kommando i aktuel mappe" + +#: plugins/sudoers/sudoers.c:447 +msgid "sorry, you are not allowed set a command timeout" +msgstr "beklager, men du har ikke tilladelse til at angive tidsudløb for kommando" + +#: plugins/sudoers/sudoers.c:455 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "beklager, men du har ikke tilladelse til at bevare miljøet" + +#: plugins/sudoers/sudoers.c:803 +msgid "command too long" +msgstr "kommando er for lang" + +#: plugins/sudoers/sudoers.c:917 +#, c-format +msgid "%s is not a regular file" +msgstr "%s er ikke en regulær fil" + +#: plugins/sudoers/sudoers.c:921 plugins/sudoers/timestamp.c:221 toke.l:968 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s er ejet af uid %u, bør være %u" + +#: plugins/sudoers/sudoers.c:925 toke.l:973 +#, c-format +msgid "%s is world writable" +msgstr "%s er skrivbar for alle" + +#: plugins/sudoers/sudoers.c:929 toke.l:976 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s er eget af gid %u, bør være %u" + +#: plugins/sudoers/sudoers.c:962 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "kun administrator (root) kan bruge »-c %s«" + +#: plugins/sudoers/sudoers.c:981 +#, c-format +msgid "unknown login class: %s" +msgstr "ukendt logindklasse: %s" + +#: plugins/sudoers/sudoers.c:1064 plugins/sudoers/sudoers.c:1078 +#, c-format +msgid "unable to resolve host %s" +msgstr "kan ikke slå vært %s op" + +#: plugins/sudoers/sudoreplay.c:274 +#, c-format +msgid "invalid filter option: %s" +msgstr "ugyldigt filtertilvalg: %s" + +#: plugins/sudoers/sudoreplay.c:287 +#, c-format +msgid "invalid max wait: %s" +msgstr "ugyldig maks ventetid: %s" + +#: plugins/sudoers/sudoreplay.c:307 +#, c-format +msgid "invalid speed factor: %s" +msgstr "ugyldig hastighedsfaktor: %s" + +#: plugins/sudoers/sudoreplay.c:342 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:348 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:364 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Genafspiller sudosession: %s" + +#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:609 +#: plugins/sudoers/sudoreplay.c:816 plugins/sudoers/sudoreplay.c:906 +#: plugins/sudoers/sudoreplay.c:985 plugins/sudoers/sudoreplay.c:1000 +#: plugins/sudoers/sudoreplay.c:1007 plugins/sudoers/sudoreplay.c:1014 +#: plugins/sudoers/sudoreplay.c:1021 plugins/sudoers/sudoreplay.c:1028 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "kan ikke tilføje hændelse til køen" + +#: plugins/sudoers/sudoreplay.c:677 +msgid "unable to set tty to raw mode" +msgstr "kan ikke angive tty til rå (raw) tilstand" + +#: plugins/sudoers/sudoreplay.c:728 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Advarsel: Din terminal er for lille til korrekt at afspille loggen.\n" + +#: plugins/sudoers/sudoreplay.c:729 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Loggeometri er %d x %d, din terminals geometri er %d x %d." + +#: plugins/sudoers/sudoreplay.c:757 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Genafspilning er afsluttet. Tryk på en tast for at gendanne terminalen." + +#: plugins/sudoers/sudoreplay.c:790 +#, c-format +msgid "invalid timing file line: %s" +msgstr "ugyldig timingfillinje: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "tvetydigt udtryk »%s«" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "manglende »)« i udtryk" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "ukendt søgeterm »%s«" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s kræver et argument" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1657 +#, c-format +msgid "invalid regular expression: %s" +msgstr "ugyldigt regulært udtryk: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "kunne ikke fortolke dato »%s«" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "mangler »(« i udtryk" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "ugyldig kæde »or« (eller)" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "ugyldig kæde »!«" + +#: plugins/sudoers/sudoreplay.c:1343 +#, c-format +msgid "unknown search type %d" +msgstr "ukendt søgeterm %d" + +#: plugins/sudoers/sudoreplay.c:1381 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: Ugyldig logfil" + +#: plugins/sudoers/sudoreplay.c:1399 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: Tidsstempelfelt mangler" + +#: plugins/sudoers/sudoreplay.c:1406 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: Tidsstempel %s: %s" + +#: plugins/sudoers/sudoreplay.c:1413 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: Brugerfelt mangler" + +#: plugins/sudoers/sudoreplay.c:1422 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: runas-brugerfelt mangler" + +#: plugins/sudoers/sudoreplay.c:1431 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: runas-gruppefelt mangler" + +#: plugins/sudoers/sudoreplay.c:1837 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "brug: %s [-hnR] [-d mappe] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1840 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "brug: %s [-h] [-d mappe] -l [søgeudtryk]\n" + +#: plugins/sudoers/sudoreplay.c:1849 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - genafspil sudosessionslogge\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1851 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Tilvalg:\n" +" -d, --directory=dir angiv mappe for sessionslogge\n" +" -f, --filter=filter angiv hvilken I/O-type at vise\n" +" -h, --help vis denne hjælpetekst og afslut\n" +" -l, --list vis tilgængelige sessions-ID'er med valgfrit udtryk\n" +" -m, --max-wait=num maks antal sekunder at vente mellem hændelser\n" +" -s, --speed=num øg eller sænk uddata\n" +" -V, --version vis versionsinformation og afslut" + +#: plugins/sudoers/testsudoers.c:328 +msgid "\thost unmatched" +msgstr "\thost matchede ikke" + +#: plugins/sudoers/testsudoers.c:331 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Kommando tilladt" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Kommando nægtet" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Kommando ikke matchet" + +#: plugins/sudoers/timestamp.c:229 +#, c-format +msgid "%s is group writable" +msgstr "%s er gruppe-skrivbar" + +#: plugins/sudoers/timestamp.c:305 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "kan ikke afkorte tidsstempelfil til %lld byte" + +#: plugins/sudoers/timestamp.c:792 plugins/sudoers/timestamp.c:884 +#: plugins/sudoers/visudo.c:477 plugins/sudoers/visudo.c:483 +msgid "unable to read the clock" +msgstr "kan ikke læse uret" + +#: plugins/sudoers/timestamp.c:803 +msgid "ignoring time stamp from the future" +msgstr "ignorerer tidsstempel fra fremtiden" + +#: plugins/sudoers/timestamp.c:826 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tidsstempel for langt ude i fremtiden: %20.20s" + +#: plugins/sudoers/timestamp.c:948 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "kan ikke låse tidsstempelfilen %s" + +#: plugins/sudoers/timestamp.c:992 plugins/sudoers/timestamp.c:1012 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "undervisningsstatussti er for lang: %s/%s" + +#: plugins/sudoers/visudo.c:211 +msgid "the -x option will be removed in a future release" +msgstr "tilvalget -x vil blive fjernet i fremtidige udgivelser" + +#: plugins/sudoers/visudo.c:212 +msgid "please consider using the cvtsudoers utility instead" +msgstr "overvej i stedet for at bruge redskabet cvtsudoers" + +#: plugins/sudoers/visudo.c:263 plugins/sudoers/visudo.c:645 +#, c-format +msgid "press return to edit %s: " +msgstr "tryk retur for at redigere %s: " + +#: plugins/sudoers/visudo.c:324 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "angivet redigeringsprogram (%s) findes ikke" + +#: plugins/sudoers/visudo.c:326 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "intet redigeringsprogram fundet (sti for redigeringsprogram = %s)" + +#: plugins/sudoers/visudo.c:436 plugins/sudoers/visudo.c:444 +msgid "write error" +msgstr "skrivefejl" + +#: plugins/sudoers/visudo.c:490 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "kan ikke stat midlertidig fil (%s), %s unchanged" + +#: plugins/sudoers/visudo.c:497 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "midlertidig fil med nullængde (%s), %s uændret" + +#: plugins/sudoers/visudo.c:503 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "redigeringsprogram (%s) fejlede, %s uændret" + +#: plugins/sudoers/visudo.c:525 +#, c-format +msgid "%s unchanged" +msgstr "%s uændret" + +#: plugins/sudoers/visudo.c:584 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "kan ikke genåbne midlertidig fil (%s), %s uændrede." + +#: plugins/sudoers/visudo.c:596 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "kan ikke fortolke midlertidig fil (%s), ukendt fejl" + +#: plugins/sudoers/visudo.c:634 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "intern fejl, kan ikke finde %s på listen!" + +#: plugins/sudoers/visudo.c:714 plugins/sudoers/visudo.c:723 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "kan ikke angive (uid, gid) af %s til (%u, %u)" + +#: plugins/sudoers/visudo.c:745 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s og %s er ikke på det samme filsystem, bruger mv til at omdøbe" + +#: plugins/sudoers/visudo.c:759 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "kommando fejlede: »%s %s %s«, %s uændret" + +#: plugins/sudoers/visudo.c:769 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "fejl under omdøbing af %s, %s uændret" + +#: plugins/sudoers/visudo.c:790 +msgid "What now? " +msgstr "Hvad nu? " + +#: plugins/sudoers/visudo.c:804 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Tilvalg er:\n" +" r(e)diger sudoersfil igen\n" +" afslut(x) uden at gemme ændringer til sudoersfil\n" +" afslut(Q) og gem ændringer til sudoersfil (FARLIGT!)\n" + +#: plugins/sudoers/visudo.c:850 +#, c-format +msgid "unable to run %s" +msgstr "kan ikke køre %s" + +#: plugins/sudoers/visudo.c:880 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: forkert ejer (uid, gid) bør være (%u, %u)\n" + +#: plugins/sudoers/visudo.c:887 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: ugyldige rettigheder, bør være tilstand 0%o\n" + +#: plugins/sudoers/visudo.c:944 plugins/sudoers/visudo.c:951 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: fortolket o.k.\n" + +#: plugins/sudoers/visudo.c:998 +#, c-format +msgid "%s busy, try again later" +msgstr "%s travl, forsøg igen senere" + +#: plugins/sudoers/visudo.c:1038 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Fejl: %s:%d: cyklus i %s »%s«" + +#: plugins/sudoers/visudo.c:1039 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Advarsel: %s:%d: cyklus i %s »%s«" + +#: plugins/sudoers/visudo.c:1043 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Fejl: %s:%d %s »%s« refereret men ikke defineret" + +#: plugins/sudoers/visudo.c:1044 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Advarsel: %s:%d %s »%s« refereret men ikke defineret" + +# (ental) +#: plugins/sudoers/visudo.c:1137 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Advarsel: %s:%d ubrugt %s »%s«" + +#: plugins/sudoers/visudo.c:1252 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - rediger sikkert sudoersfilen\n" +"\n" + +#: plugins/sudoers/visudo.c:1254 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Tilvalg:\n" +" -c, --check kun kontroltilstand\n" +" -f, --file=file angiv filplacering for sudoers\n" +" -h, --help vis denne hjælpetekst og afslut\n" +" -q, --quiet mindre uddybende (stille) beskeder for syntaksfejl\n" +" -s, --strict streng syntakskontrol\n" +" -V, --version vis information om version og afslut\n" + +#: toke.l:942 +msgid "too many levels of includes" +msgstr "for mange niveauer af includes (inkluderinger)" diff --git a/plugins/sudoers/po/de.mo b/plugins/sudoers/po/de.mo new file mode 100644 index 0000000..49ad81d Binary files /dev/null and b/plugins/sudoers/po/de.mo differ diff --git a/plugins/sudoers/po/de.po b/plugins/sudoers/po/de.po new file mode 100644 index 0000000..76a76a8 --- /dev/null +++ b/plugins/sudoers/po/de.po @@ -0,0 +1,3101 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# Todd C. Miller , 2011-2013 +# Hendrik Knackstedt , 2013 +# Mario Blättermann , 2015. +# Jochen Hein , 2001-2020. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-22 05:35+0100\n" +"Last-Translator: Jochen Hein \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.3\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "Syntax-Fehler" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p's Passwort: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] Passwort für %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Passwort: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Sicherheits-Information für %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Das hat nicht funktioniert, bitte nochmal probieren." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "Es kann kein Speicher mehr alloziert werden" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "Eine Prüfsumme erfordert einen Pfadnamen" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "Werte für »CWD« müssen mit »/«, »~« oder »*« beginnen" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "Werte für »CHROOT« müssen mit »/«, »~« oder »*« beginnen" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "Syntaxfehler, das reservierte Wort »%s« wird als Aliasname verwendet" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "ungültiger Wert für »notbefore«" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "ungültiger Wert für »notafter«" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "Wert für Timeout ist zu groß" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "ungültiger Wert für Timeout" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "Interner Fehler, %s-Überlauf" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "Die Standardeingabe kann nicht dupliziert werden: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "%s kann nicht ausgeführt werden: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "Fehler bei fork()" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "Fehler bei fork(): %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "Die Pipe kann nicht geöffnet werden: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (Befehl fortgesetzt) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existiert, aber ist kein Verzeichnis (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "Das Verzeichnis »%s« kann nicht erstellt werden" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "Ändern des Modus von %s auf 0%o gescheitert" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "JSON_STRING erwartet, aber »%d« bekommen" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "Im Name fehlt das doppelte Anführungszeichen" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "JSON_OBJECT erwartet, aber »%d« bekommen" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "unpassende schließende geschweifte Klammer" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "unerwartetes Array" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "unpassende schließende eckige Klammer" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "unerwartete Zeichenkette" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "fehlender Doppelpunkt nach dem Name" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "unerwarteter boolescher Wert (true/false)" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "unerwartete Zahl" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u »%s« kann nicht ausgewertet werden" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ungültige Protokolldatei" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: Das Feld für den Zeitstempel fehlt" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: Zeitstempel %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: Das Benutzerfeld fehlt" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: Das Feld für den »runas«-Benutzer fehlt" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: Das Feld für die »runas«-Gruppe fehlt" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "Fehler beim Lesen der Zeitdateizeile: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "Ungültige Zeitdateizeile: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "Das Log ist bereits abgeschlossen, kann nicht neu gestartet werden" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "Das Log konnte nicht wieder begonnen werden" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "Die Datei »%s/%s« kann nicht geöffnet werden" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "Die I/O Logdatei %s/%s fehlt" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: kann nicht zur Position %zu springen" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "Der Wiederaufsetz-Punkt [%lld, %ld] in %s/%s kann nicht gefunden werden" + +# XXX geht das besser? +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "Fehler der State Machine" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "ungültige AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "Fehler beim Parsen der AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "Fehler beim Erstellen des Ein-/Ausgabe-Protokolls" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "Fehler beim Protokolliereb des Accept-Events" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "ungültige RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "Fehler beim Parsen der RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "Fehler beim Protokollieren des Reject-Events" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "ungültige AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "Fehler beim Parsen der AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "Fehler beim Protokollieren des Alert-Events" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "Protokollfehler" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "Fehler beim Schreiben des IoBuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "Fehler beim Schreiben der ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "Fehler beim Schreiben des CommandSusped" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "unbekannter ClientMessage-Typ" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "Client-Nachricht ist zu groß" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "Die TLS 1.2 Cyphersuite kann nicht auf »%s« gesetzt werden: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "Die TLS 1.3 Cyphersuite kann nicht auf »%s« gesetzt werden: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "Kann die TLS Server Methode nicht bestimmen: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "SSL-Kontext kann nicht erzeugt werden: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "Laden von Zertifikat »%s« fehlgeschlagen" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "Kann das CA-Bundle »%s« nicht laden" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "Laden des privaten Schlüssels »%s« fehlgeschlagen" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "Kann die Diffie-Hellman Parameter nicht setzen: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "Kann die minimale Protokollversion nicht auf TLS 1.2 setzen: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "Kann die entfernte IP-Adresse nicht finden" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Kann die User-Daten nicht an das SSL-Objekt anhängen: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "Event kann nicht zur Warteschlange hinzugefügt werden" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "Konnte keinen Socket zum »Lauschen« einrichten" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - sende sudo I/O-Log zu einem entfernten Server\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Optionen:\n" +" -f, --file\t\t gibt den Namen der Konfigurationsdatei an\n" +" -h, --help diese Hilfe anzeigen und beenden\n" +" -n, --no-fork im Vordergrund laufen\n" +" -R, --random-drop prozentuale Change, dass die Verbindung abbricht\n" +" -V, --version Versionsinformation anzeigen und beenden\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Protobuf-C Version 1.3 oder höher ist notwendig" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "ungültiger Wert für »random drop«: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s Version %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS ist nicht unterstützt" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: ist kein voll qualifizierter Pfad" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s: %d »[« ohne schliessende Klammer »]«: %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s/%d Ungültiger Konfigurations-Abschnitt: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s/%d Ungültige Konfigurationszeile: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d erwartetder Section Name: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "Ungültiger Wert für %s: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d unbekannter Schlüssel: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "Unbekannte Syslog-Facility %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "Unbekannte Syslog-Priorität %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Optionen:\n" +" --help zeige diese Nachricht und beenden\n" +" -A, --accept Sende nur einen »accept« Event (kein I/O)\n" +" -h, --host send Logs an diesen Server\n" +" -i, --iolog_id entfernte ID des I/O Logs zur Wiederaufnahme\n" +" -p, --port Port für die Verbindung zum Server\n" +" -r, --restart restarte vorhergegangene I/O Log Übertragung\n" +" -R, --reject Lehne das Kommando mit dem angegebenen Grund ab\n" +" -t, --test teste Audit Server mit dem Senden des ausgewählten I/O Logs mit Parallelität n\n" +" -b, --ca-bundle Zertificats-Bündel-Datei zum Prüfen des Server-Zertifikats\n" +" -c, --cert Zertifikatsdatei für TLS-Handshake\n" +" -k, --key Datei mit dem privaten Schlüssel\n" +" -n, --no-verify Server-Zertifikate nicht verifizieren\n" +" -t, --test teste Audit-Server durch Senden vom ausgewählem I/O-Protokoll n Mal parallel\n" +" -V, --version zeige Versioninformationen und beende\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "Fehler beim Lookup %s:%s: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "Kann die Server IP-Adresse nicht finden" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "Fehler beim Lesen %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "Client-Nachricht ist zu groß: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: Schreib-Puffer wird bereits verwendet" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "unerwarteter I/O Event %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: unerwarteter Status %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "ungültiges ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "Fehler beim Empfangen der Nachricht vom Server: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "Abbruch-Nachricht vom Server empfangen: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "Kann die ServerNessage nicht auspacken" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: unerwarteter type_case Wert %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "Zeitablauf beim Lesen vom Server" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "unerwartetes Datei-Ende" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "Server-Nachricht ist zu groß: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "Zeitablauf beim Senden an den Server" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "Timeout beim TLS-Handshake erreicht" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "Konnte den Event nicht setzen" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "TLS-Kommunikation fehlgeschlagen: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "SSL-Kontext kann nicht initialisiert werden: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Kann kein SSL-Objekt anlegen: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Kann den Socket nicht an das SSL-Objekt anhängen: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "Sowohl Restart-Punkt als auch die I/O-Log ID sind notwendig" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "Ein Restart-Punkt kann nicht angegeben werden, wenn keine Ein/Ausgabe gesendet ist." + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "Vorzeitig beendet mit Status %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "Abgelaufene Zeit zum Server gesendet [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "Commit Punkt vom Server empfangen [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias »%s« ist bereits definiert" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "Die aktuelle Zeit kann nicht ausgelesen werden" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "Das Passwort für %s« kann nicht geändert werden" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "Die Anmeldeklasse des Benutzers »%s« kann nicht gelesen werden" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "Die BSD-Authentifizierung kann nicht begonnen werden" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "Ungültiger Authentifizierungstyp" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "Die BSD-Authentifizierung kann nicht begonnen werden" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "Ihr Account ist abgelaufen" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "Genehmigung fehlgeschlagen" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "Die fwtk-Konfiguration kann nicht gelesen werden" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "Verbindung zum Authentifizierungsserver kann nicht aufgebaut werden" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "Verbindung zum Authentisierungsserver verloren" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"Fehler des Authentifizierungsservers:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: Principal kann nicht in eine Zeichenkette umgewandelt werden (»%s«): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: »%s« kann nicht ausgewertet werden: %s" + +# XXX check source? +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: Anmeldedaten-Zwischenspeicher kann nicht aufgelöst werden: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: Optionen können nicht zugewiesen werden: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: Anmeldedaten können nicht bekommen werden: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: Anmeldedaten-Zwischenspeicher kann nicht initialisiert werden: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: Anmeldedaten können nicht im Zwischenspeicher abgelegt werden: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: Rechner-Principal kann nicht bekommen werden: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT kann nicht verifiziert werden! Möglicher Angriff!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "PAM kann nicht initialisiert werden: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Fehler bei der PAM-Authentifizierung: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "Fehler bei der Validierung des Kontos, ist das Konto gesperrt?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Konto oder Passwort ist abgelaufen, bitte Passwort zurücksetzen und nochmal probieren" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "Das abgelaufene Passwort kann nicht geändert werden: %s«" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Das Passwort ist abgelaufen, bitte wenden Sie sich an den Systemadministrator" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Das Konto ist abgelaufen oder in der PAM-Konfiguration fehlt der »account«-Abschnitt für sudo. Bitte wenden Sie sich an den Systemadministrator" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Fehler beim PAM-Account-Management: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "Der Benutzer existiert in der %s-Datenbank nicht" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "Die ACE-API-Bibliothek konnte nicht initialisiert werden" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "SecurID-Server kann nicht erreicht werden" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "Benutzer-ID ist für SecurID-Authentifizierung gesperrt" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "Ungültige Länge des Benutzernamens für SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "Ungültiges Authentifizierungs-Handle für SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "SecurID-Kommunikation fehlgeschlagen" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "Unbekannter SecurID-Fehler" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "Ungültige Länge des Passcodes für SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "Die SIA-Sitzung kann nicht initialisiert werden" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "Ungültige Authentifizierungsmethoden" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Ungültige Authentifizierungsmethoden sind in sudo einkompiliert! Standalone- und Nicht-Standalone-Authentifizierung können nicht zusammen verwendet werden." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "Keine Authentifizierungsmethoden" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Es sind keine Authentifizierungsmethoden in sudo einkompiliert! Wenn Sie die Authentifizierung wirklich abschalten wollen, verwenden Sie bitte die configure-Option »--disable-authentication«." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Die Authentifizierungsmethoden können nicht initialisiert werden." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Authentifizierungsmethoden:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Der Audit-Zustand kann nicht bestimmt werden" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "Audit-Satz kann nicht auf Platte geschrieben werden" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die\n" +"Regeln erklärt hat. Normalerweise läuft es auf drei Regeln hinaus:\n" +"\n" +" #1) Respektieren Sie die Privatsphäre anderer.\n" +" #2) Denken Sie nach, bevor Sie tippen.\n" +" #3) Mit großer Macht kommt große Verantwortung.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "Unbekannte Benutzer-ID: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "Unbekannter Benutzer: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "Schrittgröße: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "Start der Folge: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "Auffüllen der Folge: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s-Grammatik Version %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "Nicht unterstütztes Eingabeformat %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "Nicht unterstütztes Ausgabeformat %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: Eingabe- und Ausgabedatei müssen unterschiedlich sein" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "Standardwerte für sudoers können nicht initialisiert werden" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: unbekanntes Schlüsselwort: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "Ungültiger Standardtyp: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "ungültiger suppression Typ: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "Ungültiger Filter: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "Die Datei »%s« kann nicht geöffnet werden" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "Analyse der Datei %s gescheitert, unbekannter Fehler" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "Analysefehler in %s nahe Zeile %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "Analysefehler in %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "In die Datei »%s« kann nicht geschrieben werden" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s – zwischen sudoers Dateiformaten konvertieren\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Optionen:\n" +" -b, --base=dn Der Basis DN für sudo LDAP Abfragen\n" +" -d, --defaults=deftypes Konvertiere nur Defaults von spezifischen Typen\n" +" -e, --expand-aliases Expandiere Aliase beim Konvertieren\n" +" -f, --output-format=format Ausgabeformat: JSON, LDIF oder sudoers\n" +" -i, --input-format=format Eingabeformat: LDIF oder sudoers\n" +" -I, --increment=num Größe der Schrittweite für sudoOrder\n" +" -h, --help Zeige diese Hilfe an und Ende\n" +" -m, --match=filter Konvertiere nur Einträge die zum Filter passen\n" +" -M, --match-local Filter verwendet passwd und group Databank\n" +" -o, --output=output_file Schreibe die konvertiere sudoers in die Ausgabe-Datei\n" +" -O, --order-start=num Start für die erste sudoOrder\n" +" -p, --prune-matches nicht passende Benutzer, Gruppen und Hosts nicht ausgeben\n" +" -P, --padding=num Auffüllen der sudoOrder Folge\n" +" -s, --suppress=sections Unterdrücke Ausgabe von bestimmten Abschnitten\n" +" -V, --version Zeige Versionsinformationen an und Ende" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "unbekannter defaults-Eintrag »%s«" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "Die GMT-Zeit kann nicht bekommen werden" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "Der Zeitstempel kann nicht formatiert werden" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "Zu viele sudoers Einträge, Maximum ist %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "Die Umgebunsvariable SUDOERS_BASE ist nicht gesetzt und die Option -b ist nicht angegeben." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog Facility, wenn syslog für Protokollierung verwendet wird: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-Priorität, wenn sich der Benutzer erfolgreich authentifiziert: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-Priorität, wenn sich der Benutzer nicht erfolgreich authentifiziert: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Die OTP-Eingabeaufforderung (One-Time-Passwords) in eine eigene Zeile schreiben" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "».« in $PATH ignorieren" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Immer eine Mail senden, wenn sudo gestartet wird" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Eine Mail senden, wenn die Authentifizierung des Benutzers fehlschlägt" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Eine Mail senden, wenn der Benutzer nicht in der sudoers-Datei steht" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Eine Mail senden, wenn der Benutzer nicht in der sudoers-Datei für diesen Rechner steht" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Eine Mail senden, wenn der Benutzer nicht berechtigt ist, einen Befehl auszuführen" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Eine Mail senden, wenn der Benutzer versucht, einen Befehl auszuführen" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Getrennte Zeitstempel für jede Benutzer/tty-Kombination verwenden" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Den Benutzer beim ersten Aufruf von sudo belehren" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Datei mit der sudo-Belehrung: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Standardmäßig muss sich der Benutzer authentifizieren" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Root darf sudo verwenden" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Den Hostnamen in der (nicht-syslog-)Protokolldatei speichern" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Das Jahr in der (nicht-syslog-)Protokolldatei speichern" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Eine Shell starten, wenn sudo ohne Parameter aufgerufen wird" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Die Umgebungsvariable $HOME beim Starten einer Shell mit »-s« setzen" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Immer die Variable $HOME auf das Home-Verzeichnis des Ziel-Benutzers setzen" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Informationssammlung für nützliche Fehlermeldungen erlauben" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Vollständige Hostnamen in der sudoers-Datei erfordern" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "»Beschimpfung« bei Eingabe eines falschen Passwortes" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Der Benutzer darf sudo nur aufrufen, wenn ein tty vorhanden ist" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo beachtet die Umgebungsvariable »EDITOR«" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Nach dem root-Passwort fragen, nicht nach dem Passwort des Benutzers" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Nach dem Passwort des Benutzers »runas_default« fragen, nicht nach dem Passwort des aufrufenden Benutzers" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Nach dem Passwort des Ziel-Benutzers fragen, nicht nach dem Passwort des aufrufenden Benutzers" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Standards auf die Anmeldeklasse des Zielbenutzers anwenden, falls diese vorhanden ist" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Die Umgebungsvariablen »LOGNAME« und »USER« setzen" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Nur die effektive UID auf den Ziel-Benutzer setzen, nicht die reale UID" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Die sekundären Gruppen nicht auf die Gruppen des Ziel-Benutzers setzen" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Zeilenlänge der Protokolldatei für Zeilenumbruch (0 für keinen Zeilenumbruch): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Zeitlimit für den Authentifizierungszeitstempel: %.1f Minuten" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Zeitlimit bei der Eingabe des Passwortes: %.1f Minuten" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Anzahl Versuche zur Eingabe des Passwortes: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Zu verwendende Umask oder 0777, um die Umask des Benutzers zu verwenden: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Pfad zur Protokolldatei: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Pfad zum Mail-Programm: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Parameter für das Mail-Programm: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Mail-Adresse des Empfängers: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Mail-Adresse des Absenders: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Betreffzeile für Mails: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Meldung bei Eingabe eines falschen Passwortes: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Verzeichnis für den Belehrungsstatus: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Pfad zum Authentifizierungszeitstempel-Verzeichnis: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Besitzer des Authentifizierungszeitstempelverzeichnisses: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Benutzer in dieser Gruppe sind von Passwort- und PATH-Anforderungen ausgenommen: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standard-Eingabeaufforderung für das Passwort: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Überschreibt in allen Fällen bei der Passwortabfrage die Systemabfrage, falls gesetzt." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standardbenutzer, unter dem die Befehle ausgeführt werden: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Wert, mit dem der Inhalt von $PATH des Benutzers überschrieben werden soll: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Pfad zum Editor, den visudo verwenden soll: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Wann soll ein Passwort für den Pseudobefehl »list« erforderlich sein: %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Wann soll ein Passwort für den Pseudobefehl »verify« erforderlich sein: %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Preload der »sudo_noexec« Bibliothek zum Ersetzen der »exec« Funktionen" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Wenn das LDAP-Verzeichnis erreichbar ist, ignorieren wir die lokale sudoers-Datei" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Datei-Deskriptoren >= %d werden geschlossen, bevor ein Befehl ausgeführt wird" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Benutzer können den Wert für »closefrom« mit der der Option -C überschreiben, wenn diese Option gesetzt ist" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Benutzern das Setzen beliebiger Umgebungsvariablen erlauben" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Die Umgebung auf einen Standardsatz an Variablen zurücksetzen" + +# XXX gibt es da einen sinnvollen Begriff? +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Folgende Umgebungsvariablen prüfen:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Folgende Umgebungsvariablen löschen:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Folgende Umgebungsvariablen bewahren:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Im neuen Security-Kontext von SELinux wird diese Rolle verwendet: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Im neuen Security-Kontext von SELinux wird dieser Typ verwendet: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Pfad zur sudo-spezifischen »environment«-Datei: %s" + +# XXX +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Pfad zur eingeschränkten sudo »environment«-Datei: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Beim Auswerten der sudoers-Datei wird diese Locale verwendet: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "sudo erlauben, nach einem Passwort zu fragen, auch wenn das Passwort sichtbar wird" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Sichtbare Rückmeldung bei der Passworteingabeaufforderung, wenn der Benutzer etwas eingibt" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Schnelleren Musterabgleich verwenden, der zwar ungenauer ist, aber nicht auf das Dateisystem zugreift" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Die umask in sudoers überschreibt die umask des Benutzers, selbst wenn diese mehr Berechtigungen zulässt" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Benutzereingaben für den ausgeführten Befehl protokollieren" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Die Ausgabe des ausgeführten Befehls protokollieren" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Ein-/Ausgabe-Protokolle mittels zlib protokollieren" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Befehle immer in einem Pseudo-TTY ausführen" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plugin für Unterstützung von Nicht-Unix-Gruppen: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Verzeichnis zur Speicherung der Ein-/Ausgabe-Protokolle: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Datei zur Speicherung der Ein-/Ausgabe-Protokolle: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Einen Eintrag in die utmp/utmpx-Datei einfügen, wenn ein Pseudo-TTY erzeugt wird" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Für den Eintrag in der utmp-Datei den runas-Benutzer verwenden, nicht den aufrufenden Benutzer" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Menge der erlaubten Privilegien: %s" + +# XXX einschränkenden? +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Menge der eingeschränkten Privilegien: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Befehle mit einem Pseudo-TTY im Hintergrund starten" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Verwendeter PAM-Service-Name: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-Service-Namen für Anmelde-Shells: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Versuchen, die PAM-Anmeldedaten für den Ziel-Benutzer zu bekommen" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Eine neue PAM-Sitzung erzeugen, um den Befehl auszuführen" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Ausführen vom PAM-Account-Management" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Maximale Sequenznummer des Ein-/Ausgabe-Protokolls: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Unterstützung für netgroups in sudoers aktivieren" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Prüfe die übergeordneten Verzeichnisse auf Schreibbarkeit beim Editieren von Dateien mit »sudoedit«" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Folge symbolischen Links beim Editieren von Dateien mit sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Frage das Group-Plugin nach unbekannten System-Gruppen" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Prüfe die Netgroup-Zuordnung aufgrund des gesamten Tupels: Benutzer, Host und Domain" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Erlaubt das Ausführen von Kommandos, auch wenn kein Audit-Log geschrieben werden kann" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Erlaubt das Ausführen von Kommandos, auch wenn kein I/O-Log geschrieben werden kann" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Erlaubt das Ausführen von Kommandos, auch wenn kein Log geschrieben werden kann" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Beim Auflösen von Gruppen in der sudoers nach der Guppen-ID suchen, nicht nach dem Gruppenname" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Log-Einträge größer als dieser Wert werden auf mehrere Syslog Einträge verteilt: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Eigentümer der I/O Logdateien: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Gruppe der I/O Logdateien: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Dateimode der I/O Logdatei: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Führe Kommandos mit Hilfe eines Dateideskriptors anstelle des Pfades aus: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignoriere unbekannte Default-Einträge in der Datei »sudoers« anstatt eine Warnung auszugeben" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Laufzeit in Sekunde, nach der das Kommando abgebrochen wird: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Erlaube dem Benutzer per Kommandozeile einen Timeout anzugeben" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Schreibe Log-Daten direkt ohne zu puffern" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Protokolliere auch die Prozess-ID beim Schreiben ins Systemlog" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Typ des Authentifizierungszeitstempelprotokolls: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Fehler bei der Authentifizierung: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Ignoriere Groß-/Kleinschreibung beim Matchen von Benutzernamen" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Ignoriere Groß-/Kleinschreibung beim Matchen von Gruppennamen" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Protokolliere von sudo erlaubte Kommandos" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Protokolliere von sudo verweigerte Kommandos" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Sudo Log Server mit optionalem Port für die Verbindung" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Sudo Log-Server Timeout in Secunden: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Verwende die SO_KEEPALIVE Socket Option für die Verbindung zum Logserver" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Pfad zur Zertifikats-Bündel-Datei des Audit Servers: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Pfad zur sudoers Zertifikats-Datei: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Pfad zur sudoers Datei mit dem privaten Schlüssel: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Prüfe das Log-Server-Zertifikat auf Gültigkeit" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Erlaube die Verwendung eines unbekannten »runas« Benutzers oder Gruppen-ID" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Nur die Ausführung von Kommandos erlauben für Benutzer mit einer gültigen Shell" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Setze den PAM remote Benutzer auf den Benutzer, der sudo ausführt" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Setze den PAM remote Rechner auf den lokalen Hostname" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Arbeitsverzeichnis um vor Ausführung des Kommandos dorthin zu wechseln: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Root-Verzeichnis zur Verwendung, bevor ein Befehl ausgeführt wird: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "Das Format der zu schreibenden Logs: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: unbekannter defaults-Eintrag »%s«" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: unbekannter defaults-Eintrag »%s«" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: Kein Wert für »%s« angegeben" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: Kein Wert für »%s« angegeben" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: Die Option »%s« wird ohne Wert verwendet" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: Die Option »%s« wird ohne Wert verwendet" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: Ungültiger »Defaults« Typ 0x%x für Option »%s«" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: Ungültiger »Defaults« Typ 0x%x für Option »%s«" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: Der Wert »%s« ist für die Option »%s« ungültig" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: Der Wert »%s« ist für die Option »%s« ungültig" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: Werte für »%s« müssen mit »/«, »~« oder »*« beginnen" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: Werte für »%s« müssen mit »/«, »~« oder »*« beginnen" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: Werte für »%s« müssen mit einem »/« beginnen" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: Werte für »%s« müssen mit einem »/« beginnen" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp ist beschädigt, die Längen passen nicht" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "Das Environment kann nicht neu erstellt werden" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "Leider dürfen die folgenden Umgebungsvariablen nicht gesetzt werden: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "Syntax-Fehler in %s bei der Zeile %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "Syntax-Fehler in %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "Prüfsummentyp %d wird für %s nicht unterstützt" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: Fehler beim Lesen" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s muss der uid %d gehören" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s darf nur für den Eigentümer der Datei schreibbar sein" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "Laden von %s fehlgeschlagen: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "Das Symbol »group_plugin« kann in %s nicht gefunden werden" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: Die Major-Version %d des Group-Plugins ist inkompatibel, erwartet wird %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "»%s« ist keine gültige IP-Adresse" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "»%s« ist keine gültige Netzmaske" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Lokale IP-Adresse und Netzmaske:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "Unbekannte Gruppe: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "Kann die Sequenz-Datei nicht aktualisieren" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "In die I/O Logdatei kann nicht geschrieben werden: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "Die Datei %s%s kann nicht erstellt werden" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: Interner Fehler, Logdatei für Event %d nicht geöffnet" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "Die Uhrzeit kann nicht ausgelesen werden" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: Interner Fehler, ungültiges Signal %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls wird für ldaps nicht unterstützt" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "Die Zertifikat- und Schlüsseldatenbank für SSL kann nicht initialisiert werden: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "In der Datei »%s« muss »TLS_CERT« angegeben sein, um SSL zu nutzen" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "LDAP kann nicht initialisiert werden: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls ist angegeben, aber die LDAP-Bibliotheken unterstützen ldap_start_tls_s() und ldap_start_tls_s_np() nicht" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "Ungültiges »sudoOrder« Attribut: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: Portnummer ist zu groß" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "LDAP-Adresstyp wird nicht unterstützt: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ldap- und ldaps-Adressen können nicht zusammen verwendet werden" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "sudoOption kann nicht konvertiert werden: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "Das Audit-System kann nicht geöffnet werden" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "Die Audit-Nachricht kann nicht gesendet werden" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "Fehler in der Event-Schleife" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Erzeugen eines neuen SSL_CTX Objektes fehlgeschlagen: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "TLS Verbindung zu %s:%s fehlgeschlagen: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "TLS Initialisierung war nicht erfolgreich" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "TLS Handshake war nicht erfolgreich" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: Interner Fehler, ungültiger Exit-Status %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "Verbindung zum Logserver verloren" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "Schreib-Puffer fehlt" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "Verbindung zum Logserver kann nicht aufgebaut werden" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "Der Benutzer ist NICHT in der sudoers-Datei enthalten" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "Der Benutzer ist NICHT auf dem Rechner autorisiert" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "Der Befehl ist nicht erlaubt" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s ist nicht in der sudoers-Datei. Dieser Vorfall wird gemeldet.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s darf sudo für %s nicht verwenden. Dieser Vorfall wird gemeldet.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Leider darf der Benutzer %s sudo für %s nicht verwenden.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Leider darf der Benutzer %s »%s%s%s« als %s%s%s auf %s nicht ausführen.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: Befehl nicht gefunden" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"Im aktuellen Verzeichnis ».« gefundenes »%s« wird ignoriert.\n" +"Verwenden Sie »sudo ./%s«, wenn dies der gewünschte Befehl »%s« ist." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u Fehlversuch bei der Passwort-Eingabe" +msgstr[1] "%u Fehlversuche bei der Passwort-Eingabe" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "Fehler bei der Authentifizierung" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "Ein Passwort ist notwendig" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "Die Protokolldatei kann nicht geöffnet werden: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "In die Logdatei kann nicht geschrieben werden: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "Prüfsumme für %s (%s) ist nicht in der Form %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-Rolle: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-Eintrag:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Optionen: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Befehle:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Passende Defaults-Einträge für %s auf %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas und befehlsspezifische Standardwerte für %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Der Benutzer %s darf die folgenden Befehle auf %s ausführen:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Der Benutzer %s darf sudo auf dem Rechner %s nicht ausführen.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignoriere die unvollständige sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "Ungültiges LDIF-Attribut: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "ungültige Option »%.*s« durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "Die Netzwerkadressliste kann nicht eingelesen werden" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "Benutzername nicht durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "User-ID nicht durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "Gruppen-ID nicht durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "Hostname nicht durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "Ungültiges Arbeitsverzeichnis: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "Ungültiges »chroot« Verzeichnis: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "%s kann nicht ausgeführt werden" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers-Policy-Plugin Version %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers-Datei-Grammatik-Version %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-Pfad: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-Pfad: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-Pfad: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-Pfad: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "Der Hook vom Typ %d kann nicht registriert werden (Version %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "Die Benutzer-ID %u kann nicht zwischengespeichert werden" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "Die Benutzer-ID %u kann nicht zwischengespeichert werden, sie existiert bereits" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "Der Benutzer %s kann nicht zwischengespeichert werden" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "Der Benutzer %s kann nicht in den Zwischenspeicher aufgenommen werden, er existiert bereits" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "Die Gruppen-ID %u kann nicht in den Zwischenspeicher aufgenommen werden" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "Die Gruppen-ID %u kann nicht in den Zwischenspeicher aufgenommen werden, sie existiert bereits" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "Die Gruppe %s kann nicht zwischengespeichert werden" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "Die Gruppe %s kann nicht in den Zwischenspeicher aufgenommen werden, sie existiert bereits" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "Die Gruppen-Liste für %s kann nicht in den Zwischenspeicher aufgenommen werden, sie existiert bereits" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "Die Gruppenliste für %s können nicht zwischengespeichert werden" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "Die Gruppen für %s können nicht eingelesen werden" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "Die Gruppen für %s können nicht geparst werden" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "Stack-Überlauf der Zugriffsrechte" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "Stack-Bereichsunterschreitung der Zugriffsrechte" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "Wechsel zur root-GID ist nicht möglich" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "Wechsel zur runas-UID ist nicht möglich" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "Die runas-Gruppen können nicht gesetzt werden" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "Wechsel zur runas-GID ist nicht möglich" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "Wechsel zur sudoers-GID ist nicht möglich" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "Zu viele Prozesse" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "Das aktuelle Arbeitsverzeichnis kann nicht bestimmt werden" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "Audit-Pfad user_cmnd abgeschnitten: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "Audit-Pfad argv[0] abgeschnitten: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "Die SSS-Quelle kann nicht initialisiert werden. Ist SSSD auf dem Rechner installiert?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "Das Symbol »%s« kann in %s nicht gefunden werden" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "Problem mit den Standard-Einträgen" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "Keine gültige sudoers-Quelle gefunden, Programmende" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "Der Benutzer darf das root-Verzeichnis nicht auf »%s« ändern" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "Sie dürfen die Option -R nicht mit dem Kommando »%s« verwenden" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "Der Benutzer darf das Verzeichnis nicht auf %s ändern" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "Sie dürfen die Option -C nicht mit dem Kommando »%s« verwenden" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers gibt an, dass root sudo nicht verwenden darf" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "Der Benutzer darf das »closefrom«-Limit nicht überschreiben" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "Sie dürfen die Option -C nicht verwenden" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "Zeitstempelbesitzer (%s): Benutzer existiert nicht" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "Kein tty" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "Sie müssen ein TTY haben, um sudo zu verwenden" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "Ungültiger Shell für den Benutzer %s: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "Befehl ist im aktuellen Verzeichnis" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "Der Benutzer darf keinen Kommand-Timeout angeben" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "Sie dürfen keinen Timeout angeben" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "Der Benutzer darf das Environment nicht erhalten" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "Sie dürfen das Environment nicht erhalten" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "Der Befehl ist zu lang" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "»sudoedit« muss nicht mittels »sudo« aufgerufen werden" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "Die Datei »%s« kann nicht gelesen werden" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "stat konnte nicht auf %s angewendet werden" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ist keine reguläre Datei" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s gehört UID %u, sollte UID %u gehören" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s ist für alle beschreibbar (world writable)" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s gehört GID %u, sollte allerdings %u gehören" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "Nur root kann »-c %s« verwenden" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "Unbekannte Anmeldeklasse: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "Hostname %s kann nicht aufgelöst werden" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "Ungültige Filteroption: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "Ungültige maximale Wartezeit: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "Ungültiger Geschwindigkeitsfaktor: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/Zeit: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Sudo-Sitzung wird abgespielt: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "TTY konnte nicht in den Raw-Modus versetzt werden" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" +"Warnung: Ihr Terminal ist zu klein, um das Protokoll korrekt\n" +"wiederzugeben.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Protokollgeometrie ist %d x %d, die Geometrie Ihres Terminals ist %d x %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Wiedergabe beendet, eine Taste drücken um das Terminal wiederherzustellen." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "Mehrdeutiger Ausdruck »%s«" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "»)« ohne öffnende Klammer im Ausdruck" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "Unbekannter Suchbegriff »%s«" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s erfordert ein Argument" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "ungültiger regulärer Ausdruck: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "Datum »%s« konnte nicht analysiert werden" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "»(« ohne schließende Klammer im Ausdruck" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "Ungültiges nachgestelltes »or«" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "Ungültiges nachgestelltes »!«" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "Unbekannter Suchtyp %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "Aufruf: %s [-hnRS] [-d Verzeichnis] [-m Max_Wartezeit] [-s Geschwindigkeitsfaktor] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "Aufruf: %s [-h] [-d Verzeichnis] -l [Suchausdruck]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s – sudo-Sitzungsprotokolle abspielen\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Optionen:\n" +" -d, --directory=Verzeichnis gibt ein Verzeichnis für Sitzungsprotokolle an\n" +" -f, --filter=Filter gibt an, welcher E/A-Typ angezeigt werden soll\n" +" -h, --help zeigt einen Hilfetext an und beendet\n" +" das Programm\n" +" -l, --list zeigt verfügbare Sitzungs-IDs an, die mit dem\n" +" Ausdruck übereinstimmen\n" +" -m, --max-wait=Zahl gibt die maximale Wartezeit zwischen Ereignissen\n" +" in Sekunden an\n" +" -n, --non-interactive keine Prompts, Sitzung wird auf die Standard-\n" +" Ausgabe gesendet\n" +" -R, --no-resize Terminal-Größe wird nicht verändert\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=Zahl beschleunigt oder verlangsamt die Wiedergabe\n" +" -V, --version zeigt Versionsinformationen an und beendet\n" +" das Programm" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\tHost stimmt nicht überein" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Befehl erlaubt" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Befehl verweigert" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Befehl nicht erkannt" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s ist für die Gruppe beschreibbar" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "Die Zeitstempeldatei kann nicht auf %lld Bytes abgeschnitten werden" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "Zeitstempel aus der Zukunft wird ignoriert" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "Zeitstempel ist zu weit in der Zukunft: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "Die Zeitstempeldatei »%s« kann nicht gesperrt werden" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "Pfad zur Belehrung ist zu lang: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "»sudoedit« sollte nicht mit einem Pfad angegeben werden" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "Die Option »-x» wird in einer zukünftigen Version entfernt" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "Bitte verwenden Sie stattdessen das Programm »cvtsudoers«" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "Drücken Sie die Eingabetaste, um %s zu bearbeiten: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "Der angegebene Editor (%s) ist nicht vorhanden" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "Kein Editor gefunden (Pfad zum Editor = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "Schreibfehler" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "Anwenden von stat auf die temporäre Datei (%s) gescheitert, %s ist unverändert" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "Leere temporäre Datei (%s), %s ist unverändert" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "Editor-Aufruf (%s) ist gescheitert, %s ist unverändert" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s unverändert" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "Erneutes Öffnen der temporären Datei (%s) gescheitert, %s ist unverändert." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "Analyse der temporären Datei (%s) gescheitert, unbekannter Fehler" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "Interner Fehler, %s in der Liste nicht gefunden!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "Festlegen von (uid, gid) von %s auf (%u, %u) gescheitert" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s und %s befinden sich nicht im gleichen Dateisystem, werden mit mv umbenannt" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "Befehl gescheitert: »%s %s %s«, %s unverändert" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "Fehler beim Umbenennen von %s, %s unverändert" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Was jetzt? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Optionen sind:\n" +" sudoers-Datei (e)rneut bearbeiten\n" +" Beenden, ohne die Änderungen an der sudoers-Datei zu speichern (mit x)\n" +" Beenden und Änderungen an der sudoers-Datei speichern (mit Q, VORSICHT!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "%s konnte nicht ausgeführt werden" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: Falsche Besitzer-(uid, gid), sollte (%u, %u) sein\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: Falsche Zugriffsrechte, sollte Modus 0%o sein\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: Analyse OK\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s ist in Verwendung, versuchen Sie es später erneut" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "Die Datei »%s« kann nicht gesperrt werden" + +# XXX +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Trotzdem ändern? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Fehler: %s:%d:%d: Zyklus in %s »%s«" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Warnung: %s:%d:%d: Zyklus in %s »%s«" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Fehler: %s:%d:%d: %s »%s« wird verwendet, ist aber nicht definiert" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Warnung: %s:%d:%d: %s »%s« wird verwendet, ist aber nicht definiert" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Warnung: %s:%d:%d: nicht verwendet: %s »%s«" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s – Die sudoers-Datei sicher bearbeiten\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Optionen:\n" +" -c, --check nur den Prüf-Modus verwenden\n" +" -f, --file=sudoers gibt den Namen der sudoers Datei an\n" +" -h, --help diese Hilfe anzeigen und beenden\n" +" -q, --quiet weniger ausführliche Syntaxfehler-Meldungen\n" +" -s, --strict strikte Syntax-Prüfung\n" +" -V, --version Versionsinformation anzeigen und beenden\n" + +#: toke.l:179 +msgid "empty string" +msgstr "leere Zeichenkette" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "leere Gruppe" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "leere Netgroup" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "Ungültiger Zeilenfortsetzung" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "Ungültiges IPv6 Adresse: %s" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "unerwarteter Zeilenumbruch in Zeichenkette" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "Zu viele geschachtelte include-Einträge" diff --git a/plugins/sudoers/po/el.mo b/plugins/sudoers/po/el.mo new file mode 100644 index 0000000..9cae8b9 Binary files /dev/null and b/plugins/sudoers/po/el.mo differ diff --git a/plugins/sudoers/po/el.po b/plugins/sudoers/po/el.po new file mode 100644 index 0000000..781bb8e --- /dev/null +++ b/plugins/sudoers/po/el.po @@ -0,0 +1,1718 @@ +# Translation of sudoers to Greek +# Todd C. Miller <Todd.Miller@courtesan.com>, 2011-2013 +# This file is distributed under the same license as the sudo package. +# Dimitris Spingos (Δημήτρης Σπίγγος) , 2014. +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.10b3\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2014-02-07 15:13-0700\n" +"PO-Revision-Date: 2014-06-04 08:01+0300\n" +"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" +"Language-Team: Greek \n" +"Language: el\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.0\n" + +#: confstr.sh:2 +msgid "Password:" +msgstr "Κωδικός πρόσβασης:" + +#: confstr.sh:3 +msgid "*** SECURITY information for %h ***" +msgstr "*** Πληροφορίες ΑΣΦΑΛΕΙΑΣ για το %h ***" + +#: confstr.sh:4 +msgid "Sorry, try again." +msgstr "Συγνώμη, δοκιμάστε ξανά." + +#: plugins/sudoers/alias.c:136 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Έχει ήδη οριστεί το ψευδώνυμο `%s'" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "αδύνατη η λήψη κλάσης σύνδεσης για τον χρήστη %s" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "unable to begin bsd authentication" +msgstr "αδύνατη η έναρξη της πιστοποίησης bsd" + +#: plugins/sudoers/auth/bsdauth.c:89 +msgid "invalid authentication type" +msgstr "άκυρος τύπος πιστοποίησης" + +#: plugins/sudoers/auth/bsdauth.c:98 +msgid "unable to initialize BSD authentication" +msgstr "αδύνατη η αρχικοποίηση της πιστοποίησης BSD" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "αδύνατη η ανάγνωση του fwtk config" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "αδύνατη η σύνδεση με τον εξυπηρετητή πιστοποίησης" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:127 +msgid "lost connection to authentication server" +msgstr "απώλεια σύνδεσης με τον εξυπηρετητή πιστοποίησης" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"σφάλμα εξυπηρετητή πιστοποίησης:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:116 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: αδύνατη η μετατροπή της αρχής ασφάλειας σε συμβολοσειρά ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:159 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: αδύνατη η ανάλυση του '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: αδύνατη η επίλυση κρυφής μνήμης διαπιστευτήριων: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: αδύνατη η κατανομή επιλογών: %s" + +#: plugins/sudoers/auth/kerb5.c:233 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: αδύνατη η λήψη διαπιστευτηρίων: %s" + +#: plugins/sudoers/auth/kerb5.c:246 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: αδύνατη η αρχικοποίηση κρυφής μνήμης διαπιστευτηρίων: %s" + +#: plugins/sudoers/auth/kerb5.c:250 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: αδύνατη η αποθήκευση διαπιστευτηρίων στην κρυφή μνήμη: %s" + +#: plugins/sudoers/auth/kerb5.c:315 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: αδύνατη η λήψη αρχής ασφάλειας του οικοδεσπότη: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Αδύνατη η επιβεβαίωση TGT! Πιθανή επίθεση!: %s" + +#: plugins/sudoers/auth/pam.c:98 +msgid "unable to initialize PAM" +msgstr "αδύνατη η αρχικοποίηση του PAM" + +#: plugins/sudoers/auth/pam.c:149 +msgid "account validation failure, is your account locked?" +msgstr "αποτυχία επικύρωσης λογαριασμού, είναι κλειδωμένος ο λογαριασμός σας;" + +#: plugins/sudoers/auth/pam.c:153 +msgid "Account or password is expired, reset your password and try again" +msgstr "Ο λογαριασμός ή ο κωδικός πρόσβασης έχει λήξει, επαναφέρτε τον κωδικό πρόσβασής σας και ξαναδοκιμάστε" + +#: plugins/sudoers/auth/pam.c:161 +#, c-format +msgid "unable to change expired password: %s" +msgstr "αδύνατη η αλλαγή του ληγμένου κωδικού πρόσβασης: %s" + +#: plugins/sudoers/auth/pam.c:166 +msgid "Password expired, contact your system administrator" +msgstr "Ο κωδικός πρόσβασης έχει λήξει, επικοινωνήστε με τον διαχειριστή του συστήματος" + +#: plugins/sudoers/auth/pam.c:170 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Ο λογαριασμός έχει λήξει ή το PAM config στερείται μιας ενότητας \"λογαριασμού\" για sudo, επικοινωνήστε με τον διαχειριστή του συστήματός σας" + +#: plugins/sudoers/auth/pam.c:187 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Σφάλμα πιστοποίησης PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:103 plugins/sudoers/visudo.c:222 +#, c-format +msgid "you do not exist in the %s database" +msgstr "δεν υπάρχετε στη βάση δεδομένων %s" + +#: plugins/sudoers/auth/securid5.c:80 +msgid "failed to initialise the ACE API library" +msgstr "αποτυχία αρχικοποίησης της βιβλιοθήκης ACE API" + +#: plugins/sudoers/auth/securid5.c:106 +msgid "unable to contact the SecurID server" +msgstr "αδύνατη η επικοινωνία με τον εξυπηρετητή SecurID" + +#: plugins/sudoers/auth/securid5.c:115 +msgid "User ID locked for SecurID Authentication" +msgstr "Το αναγνωριστικό του χρήστη για πιστοποίηση SecurID είναι κλειδωμένο" + +#: plugins/sudoers/auth/securid5.c:119 plugins/sudoers/auth/securid5.c:170 +msgid "invalid username length for SecurID" +msgstr "άκυρο μήκος ονόματος χρήστη για SecurID" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:175 +msgid "invalid Authentication Handle for SecurID" +msgstr "άκυρη διαχείριση πιστοποίησης για SecurID" + +#: plugins/sudoers/auth/securid5.c:127 +msgid "SecurID communication failed" +msgstr "αποτυχία επικοινωνίας SecurID" + +#: plugins/sudoers/auth/securid5.c:131 plugins/sudoers/auth/securid5.c:214 +msgid "unknown SecurID error" +msgstr "άγνωστο σφάλμα SecurID" + +#: plugins/sudoers/auth/securid5.c:165 +msgid "invalid passcode length for SecurID" +msgstr "άκυρο μήκος κωδικού περάσματος για το SecurID" + +#: plugins/sudoers/auth/sia.c:108 +msgid "unable to initialize SIA session" +msgstr "αδύνατη η αρχικοποίηση της συνεδρίας SIA" + +#: plugins/sudoers/auth/sudo_auth.c:119 +msgid "invalid authentication methods" +msgstr "άκυρες μέθοδοι πιστοποίησης" + +#: plugins/sudoers/auth/sudo_auth.c:120 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Άκυρες μεταγλωττισμένες μέθοδοι πιστοποίησης στο sudo! Δεν μπορείτε να αναμίξετε αυτόνομη και μη αυτόνομη πιστοποίηση." + +#: plugins/sudoers/auth/sudo_auth.c:203 +msgid "no authentication methods" +msgstr "δεν υπάρχουν μέθοδοι πιστοποίησης" + +#: plugins/sudoers/auth/sudo_auth.c:205 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Δεν υπάρχουν μεταγλωττισμένες μέθοδοι πιστοποίησης στο sudo! Αν θέλετε να απενεργοποιήσετε την πιστοποίηση, χρησιμοποιήστε την επιλογή ρύθμισης --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:389 +msgid "Authentication methods:" +msgstr "Μέθοδοι πιστοποίησης:" + +#: plugins/sudoers/bsm_audit.c:91 plugins/sudoers/bsm_audit.c:158 +msgid "Could not determine audit condition" +msgstr "Αδυναμία εντοπισμού συνθήκης ελέγχου" + +#: plugins/sudoers/bsm_audit.c:134 plugins/sudoers/bsm_audit.c:199 +msgid "unable to commit audit record" +msgstr "αδύνατη η υποβολή εγγραφής ελέγχου" + +#: plugins/sudoers/check.c:189 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Εμπιστευόμαστε ότι έχετε δεχτεί τις συνηθισμένες οδηγίες από τον\n" +"διαχειριστή του τοπικού συστήματος. Συνήθως συμπυκνώνεται σε τρία πράγματα:\n" +"\n" +" #1) Σεβασμός της ιδιωτικότητας των άλλων.\n" +" #2) Σκεφτείτε πριν πληκτρολογήσετε.\n" +" #3) Η μεγάλη ισχύς συνυπάρχει με τη μεγάλη ευθύνη.\n" +"\n" + +#: plugins/sudoers/check.c:232 plugins/sudoers/check.c:238 +#: plugins/sudoers/sudoers.c:562 plugins/sudoers/sudoers.c:588 +#, c-format +msgid "unknown uid: %u" +msgstr "άγνωστο uid: %u" + +#: plugins/sudoers/check.c:235 plugins/sudoers/policy.c:657 +#: plugins/sudoers/sudoers.c:850 plugins/sudoers/testsudoers.c:211 +#: plugins/sudoers/testsudoers.c:363 +#, c-format +msgid "unknown user: %s" +msgstr "άγνωστος χρήστης: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Ευκολία Syslog αν το syslog χρησιμοποιείται για καταγραφή: %s" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Προτεραιότητα χρήσης Syslog, όταν ο χρήστης πιστοποιείται επιτυχώς: %s" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Προτεραιότητα χρήσης Syslog, όταν ο χρήστης πιστοποιείται ανεπιτυχώς: %s" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "Τοποθέτηση της προτροπής OTP στη δική της γραμμή" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "Παράβλεψη '.' στο $PATH" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "Να στέλνετε πάντα μήνυμα όταν εκτελείται το sudo" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "Να στέλνετε μήνυμα αν η πιστοποίηση χρήστη αποτύχει" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "Να στέλνετε μήνυμα αν ο χρήστης δεν είναι στους χρήστες sudo" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Να στέλνετε μήνυμα αν ο χρήστης δεν είναι στους χρήστες sudo για αυτόν τον οικοδεσπότη" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Να στέλνετε μήνυμα αν ο χρήστης δεν επιτρέπεται να εκτελέσει μια εντολή" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Να χρησιμοποιείται ξεχωριστή χρονική σήμανση για κάθε χρήστη/σύνθετο tty" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "Να δίνονται οδηγίες στον χρήστη την πρώτη φορά που εκτελεί sudo" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Το αρχείο που περιέχει τις οδηγίες sudo: %s" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "Να απαιτείται από τους χρήστες να πιστοποιούνται από προεπιλογή" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "Ο υπερχρήστης μπορεί να εκτελεί sudo" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Καταγραφή του ονόματος οικοδεσπότη στο αρχείο καταγραφής (non-syslog)" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "Καταγραφή του έτους στο αρχείο καταγραφής (non-syslog)" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Αν το sudo κλήθηκε χωρίς ορίσματα, να αρχίσει ένα κέλυφος" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Ορίστε το $HOME του προοριζόμενου χρήστη όταν ξεκινάτε ένα κέλυφος με -s" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "Να ορίζεται πάντα το $HOME στον προσωπικό κατάλογο του προοριζόμενου χρήστη" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "Να επιτρέπεται η συγκέντρωση κάποιων πληροφοριών για να δίνονται χρήσιμα μηνύματα σφαλμάτων" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Να απαιτούνται πλήρως χαρακτηρισμένα ονόματα οικοδεσπότη στο αρχείο χρηστών sudo" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "Να ειδοποιείται ο χρήστης όταν εισάγει έναν εσφαλμένο κωδικό πρόσβασης" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Να επιτρέπεται στον χρήστη να εκτελεί sudo μόνο αν έχει ένα tty" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Το Visudo θα σεβαστεί τη μεταβλητή περιβάλλοντος του EDITOR" + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "Να ζητιέται ο κωδικός πρόσβασης του υπερχρήστη, όχι του χρήστη" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Να ζητιέται ο κωδικός πρόσβασης των χρηστών runas_default, όχι των χρηστών" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "Να ζητιέται ο κωδικός πρόσβασης του προοριζόμενου χρήστη, όχι των χρηστών" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Να εφαρμόζονται οι προεπιλογές στην κλάση σύνδεσης του προοριζόμενου χρήστη αν υπάρχει κάποιες" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Να ορίζονται οι μεταβλητές περιβάλλοντος LOGNAME και USER" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Να ορίζεται μόνο το ενεργό uid του προοριζόμενου χρήστη, όχι το πραγματικό uid" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Να μην αρχικοποιείται το διάνυσμα ομάδας σε αυτό του προοριζόμενου χρήστη" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Το μήκος στο οποίο θα αναδιπλώνονται οι γραμμές του αρχείου καταγραφής (0 για χωρίς αναδίπλωση): %u" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Όριο χρόνου χρονικής σήμανσης πιστοποίησης: %.1f λεπτά" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Όριο χρόνου προτροπής κωδικού πρόσβασης: %.1f λεπτά" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Αριθμός προσπαθειών για να εισάγετε έναν κωδικό πρόσβασης: %u" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Χρησιμοποιήστε umask ή 0777 για να χρησιμοποιήσετε του χρήστη: 0%o" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "Διαδρομή για το αρχείο καταγραφής: %s" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "Διαδρομή για το πρόγραμμα αλληλογραφίας: %s" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Σημαίες για το πρόγραμμα αλληλογραφίας: %s" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Διεύθυνση αποστολής αλληλογραφίας προς: %s" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Διεύθυνση λήψης αλληλογραφίας από: %s" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Γραμμή θέματος για μηνύματα αλληλογραφίας: %s" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Εσφαλμένο μήνυμα κωδικού πρόσβασης: %s" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Διαδρομή για τον κατάλογο κατάστασης οδηγιών: %s" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Διαδρομή για τον κατάλογο χρονικής σήμανσης πιστοποίησης: %s" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Κάτοχος καταλόγου χρονικής σήμανσης πιστοποίησης: %s" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Οι χρήστες αυτής της ομάδας εξαιρούνται από τον κωδικό πρόσβασης και της απαιτήσεις PATH: %s" + +#: plugins/sudoers/def_data.c:219 +#, c-format +msgid "Default password prompt: %s" +msgstr "Προτροπή προεπιλεγμένου κωδικού πρόσβασης: %s" + +#: plugins/sudoers/def_data.c:223 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Αν οριστεί, η προτροπή περάσματος θα αντικαταστήσει την προτροπή συστήματος σε όλες τις περιπτώσεις." + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Προεπιλεγμένος χρήστης για να εκτελεί εντολές ως: %s" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Τιμή που θα αντικαθιστά τη $PATH χρήστη με: %s" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Διαδρομή για τον επεξεργαστή για χρήση από το visudo: %s" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Πότε θα απαιτείται κωδικός πρόσβασης για τον 'κατάλογο' ψευδοεντολών: %s" + +#: plugins/sudoers/def_data.c:243 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Πότε θα απαιτείται κωδικός πρόσβασης για 'επιβεβαίωση' ψευδοεντολής: %s" + +#: plugins/sudoers/def_data.c:247 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Να προφορτώνονται οι εικονικές συναρτήσεις εκτέλεσης στη βιβλιοθήκη sudo_noexec" + +#: plugins/sudoers/def_data.c:251 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Αν ο κατάλογος LDAP είναι ανεβασμένος, παραβλέπουμε το τοπικό αρχείο χρηστών sudo." + +#: plugins/sudoers/def_data.c:255 +#, fuzzy, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Οι περιγραφείς αρχείων >= %d να είναι κλειστοί πριν την εκτέλεση μιας εντολής" + +#: plugins/sudoers/def_data.c:259 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Αν οριστεί, οι χρήστες μπορούν να αντικαθιστούν την τιμή του `closefrom' με την επιλογή -C" + +#: plugins/sudoers/def_data.c:263 +msgid "Allow users to set arbitrary environment variables" +msgstr "Να επιτρέπεται στους χρήστες να ορίζουν ελεύθερες μεταβλητές περιβάλλοντος" + +#: plugins/sudoers/def_data.c:267 +msgid "Reset the environment to a default set of variables" +msgstr "Να επαναρρυθμίζεται το περιβάλλον σε ένα προεπιλεγμένο σύνολο μεταβλητών" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to check for sanity:" +msgstr "Οι μεταβλητές περιβάλλοντος που θα ελέγχονται για ακεραιότητα:" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to remove:" +msgstr "Οι μεταβλητές περιβάλλοντος προς αφαίρεση:" + +#: plugins/sudoers/def_data.c:279 +msgid "Environment variables to preserve:" +msgstr "Οι μεταβλητές περιβάλλοντος για διατήρηση:" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Ο ρόλος του SELinux που θα χρησιμοποιηθεί στο νέο περιεχόμενο ασφάλειας: %s" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Ο τύπος SELinux που θα χρησιμοποιηθεί στο νέο περιεχόμενο ασφάλειας: %s" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Η διαδρομή προς το αρχείο περιβάλλοντος που είναι ειδικό για sudo: %s" + +#: plugins/sudoers/def_data.c:295 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Οι τοπικές ρυθμίσεις που θα χρησιμοποιηθούν κατά την ανάλυση των χρηστών sudo: %s" + +#: plugins/sudoers/def_data.c:299 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Να επιτρέπεται στο sudo να ζητά κωδικό πρόσβασης ακόμα κι αν θα είναι ορατό" + +#: plugins/sudoers/def_data.c:303 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Να παρέχεται οπτική ανάδραση στην προτροπή κωδικού πρόσβασης όταν υπάρχει είσοδος χρήστη" + +#: plugins/sudoers/def_data.c:307 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Να χρησιμοποιείται γρηγορότερη επέκταση (globbing) που είναι λιγότερο ακριβές, αλλά δεν έχει πρόσβαση στο σύστημα αρχείων" + +#: plugins/sudoers/def_data.c:311 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Η umask που ορίστηκε στους χρήστες sudo θα αντικαταστήσει αυτή του χρήστη, ακόμα κι αν δίνει περισσότερα δικαιώματα." + +#: plugins/sudoers/def_data.c:315 +msgid "Log user's input for the command being run" +msgstr "Να καταγράφεται η είσοδος χρήστη για την εκτελούμενη εντολή" + +#: plugins/sudoers/def_data.c:319 +msgid "Log the output of the command being run" +msgstr "Να καταγράφεται η έξοδος της εκτελούμενης εντολής" + +#: plugins/sudoers/def_data.c:323 +msgid "Compress I/O logs using zlib" +msgstr "Συμπίεση καταγραφών εισόδου/εξόδου χρησιμοποιώντας το zlib" + +#: plugins/sudoers/def_data.c:327 +msgid "Always run commands in a pseudo-tty" +msgstr "Να εκτελούνται πάντα εντολές σε ψευδο-tty" + +#: plugins/sudoers/def_data.c:331 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Πρόσθετο για υποστήριξη ομάδας μη Γιούνιξ: %s" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Κατάλογος στον οποίο αποθηκεύονται οι καταγραφές εισόδου/εξόδου: %s" + +#: plugins/sudoers/def_data.c:339 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Αρχείο στο οποίο θα αποθηκεύεται η καταγραφή εισόδου/εξόδου: %s" + +#: plugins/sudoers/def_data.c:343 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Να προστίθεται μια καταχώριση στο αρχείο utmp/utmpx κατά την εκχώρηση ενός pty" + +#: plugins/sudoers/def_data.c:347 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Να ορίζεται ο χρήστης στο utmp στον χρήστη runas, να μην καλείται ο χρήστης" + +#: plugins/sudoers/def_data.c:351 +msgid "Set of permitted privileges" +msgstr "Να ορίζονται τα επιτρεπόμενα δικαιώματα" + +#: plugins/sudoers/def_data.c:355 +msgid "Set of limit privileges" +msgstr "Να ορίζονται τα δικαιώματα ορίου" + +#: plugins/sudoers/def_data.c:359 +msgid "Run commands on a pty in the background" +msgstr "Να εκτελούνται εντολές σε ένα pty στο παρασκήνιο" + +#: plugins/sudoers/def_data.c:363 +msgid "PAM service name to use" +msgstr "Το όνομα υπηρεσίας PAM που θα χρησιμοποιηθεί" + +#: plugins/sudoers/def_data.c:367 +msgid "PAM service name to use for login shells" +msgstr "Το όνομα υπηρεσίας PAM που θα χρησιμοποιηθεί για κελύφη σύνδεσης" + +#: plugins/sudoers/def_data.c:371 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Να γίνεται προσπάθεια δημιουργίας διαπιστευτηρίων για τον προοριζόμενο χρήστη" + +#: plugins/sudoers/def_data.c:375 +msgid "Create a new PAM session for the command to run in" +msgstr "Να δημιουργείται μια νέα συνεδρία PAM για την εκτελούμενη εντολή" + +#: plugins/sudoers/def_data.c:379 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Μέγιστος αριθμός αλληλουχίας καταγραφών εισόδου/εξόδου: %u" + +#: plugins/sudoers/def_data.c:383 +msgid "Enable sudoers netgroup support" +msgstr "Να ενεργοποιείται η υποστήριξη ομάδας δικτύου στους χρήστες sudo" + +#: plugins/sudoers/defaults.c:210 plugins/sudoers/defaults.c:600 +#: plugins/sudoers/visudo_json.c:611 plugins/sudoers/visudo_json.c:647 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "άγνωστες προεπιλογές καταχώρισης `%s'" + +#: plugins/sudoers/defaults.c:218 plugins/sudoers/defaults.c:228 +#: plugins/sudoers/defaults.c:248 plugins/sudoers/defaults.c:261 +#: plugins/sudoers/defaults.c:274 plugins/sudoers/defaults.c:287 +#: plugins/sudoers/defaults.c:300 plugins/sudoers/defaults.c:320 +#: plugins/sudoers/defaults.c:330 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "η τιμή `%s' είναι άκυρη για την επιλογή `%s'" + +#: plugins/sudoers/defaults.c:221 plugins/sudoers/defaults.c:231 +#: plugins/sudoers/defaults.c:239 plugins/sudoers/defaults.c:256 +#: plugins/sudoers/defaults.c:269 plugins/sudoers/defaults.c:282 +#: plugins/sudoers/defaults.c:295 plugins/sudoers/defaults.c:315 +#: plugins/sudoers/defaults.c:326 +#, c-format +msgid "no value specified for `%s'" +msgstr "δεν ορίστηκε τιμή για το `%s'" + +#: plugins/sudoers/defaults.c:244 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "οι τιμές για το `%s' πρέπει να αρχίζουν με ένα '/'" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "option `%s' does not take a value" +msgstr "η επιλογή `%s' δεν παίρνει τιμή" + +#: plugins/sudoers/env.c:288 plugins/sudoers/env.c:293 +#: plugins/sudoers/env.c:395 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/policy.c:442 plugins/sudoers/policy.c:449 +#: plugins/sudoers/prompt.c:171 plugins/sudoers/sudoers.c:656 +#: plugins/sudoers/testsudoers.c:241 +#, c-format +msgid "internal error, %s overflow" +msgstr "εσωτερικό σφάλμα, υπερχείλιση του %s" + +#: plugins/sudoers/env.c:367 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: αλλοιωμένο envp, ασυμφωνία μήκους" + +#: plugins/sudoers/env.c:1014 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "συγνώμη, δεν σας επιτρέπετε να ορίσετε τις παρακάτω μεταβλητές περιβάλλοντος: %s" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "το %s πρέπει να κατέχεται από το uid %d" + +#: plugins/sudoers/group_plugin.c:98 +#, c-format +msgid "%s must only be writable by owner" +msgstr "το %s πρέπει να είναι εγγράψιμο μόνο από τον κάτοχο" + +#: plugins/sudoers/group_plugin.c:105 plugins/sudoers/sssd.c:251 +#, c-format +msgid "unable to load %s: %s" +msgstr "αδύνατη η φόρτωση του %s: %s" + +#: plugins/sudoers/group_plugin.c:110 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "αδύνατη η εύρεση συμβόλου \"group_plugin\" στο %s" + +#: plugins/sudoers/group_plugin.c:115 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: ασύμβατη μεγάλη έκδοση %d του προσθέτου ομάδας, αναμενόταν %d" + +#: plugins/sudoers/interfaces.c:116 +msgid "Local IP address and netmask pairs:\n" +msgstr "Ζεύγη τοπικής διεύθυνσης IP και μάσκας δικτύου:\n" + +#: plugins/sudoers/iolog.c:99 plugins/sudoers/iolog.c:112 +#: plugins/sudoers/timestamp.c:227 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "το %s υπάρχει, αλλά δεν είναι κατάλογος (0%o)" + +#: plugins/sudoers/iolog.c:109 plugins/sudoers/iolog.c:123 +#: plugins/sudoers/iolog.c:127 plugins/sudoers/timestamp.c:221 +#: plugins/sudoers/timestamp.c:242 +#, c-format +msgid "unable to mkdir %s" +msgstr "αδύνατο το mkdir %s" + +#: plugins/sudoers/iolog.c:190 plugins/sudoers/sudoers.c:710 +#: plugins/sudoers/sudoreplay.c:342 plugins/sudoers/sudoreplay.c:813 +#: plugins/sudoers/sudoreplay.c:1010 plugins/sudoers/timestamp.c:345 +#: plugins/sudoers/visudo.c:823 plugins/sudoers/visudo_json.c:995 +#: plugins/sudoers/visudo_json.c:1001 +#, c-format +msgid "unable to open %s" +msgstr "αδύνατο το άνοιγμα του %s" + +#: plugins/sudoers/iolog.c:229 plugins/sudoers/sudoers.c:713 +#: plugins/sudoers/sudoreplay.c:1117 +#, c-format +msgid "unable to read %s" +msgstr "αδύνατη η ανάγνωση του %s" + +#: plugins/sudoers/iolog.c:259 plugins/sudoers/sudoreplay.c:582 +#: plugins/sudoers/timestamp.c:184 +#, c-format +msgid "unable to write to %s" +msgstr "αδύνατη η εγγραφή σε %s" + +#: plugins/sudoers/iolog.c:319 plugins/sudoers/iolog.c:512 +#, c-format +msgid "unable to create %s" +msgstr "αδύνατη η δημιουργία του %s" + +#: plugins/sudoers/ldap.c:406 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: υπερβολικά μεγάλη θύρα" + +#: plugins/sudoers/ldap.c:429 +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "sudo_ldap_conf_add_ports: εκτός χώρου επέκτασης hostbuf" + +#: plugins/sudoers/ldap.c:461 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "ανυποστήρικτος τύπος LDAP uri: %s" + +#: plugins/sudoers/ldap.c:492 +msgid "unable to mix ldap and ldaps URIs" +msgstr "αδύνατη η ανάμιξη URIs ldap και ldaps" + +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:528 +msgid "starttls not supported when using ldaps" +msgstr "το starttls δεν υποστηρίζεται όταν χρησιμοποιείται το ldaps" + +#: plugins/sudoers/ldap.c:514 +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "sudo_ldap_parse_uri: εκτός χώρου δόμησης του hostbuf" + +#: plugins/sudoers/ldap.c:595 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "αδύνατη η αρχικοποίηση των cert SSL και db κλειδιών: %s" + +#: plugins/sudoers/ldap.c:598 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "πρέπει να ορίσετε το TLS_CERT σε %s για να χρησιμοποιήσετε το SSL" + +#: plugins/sudoers/ldap.c:1089 +msgid "unable to get GMT time" +msgstr "αδύνατη η λήψη χρόνου GMT" + +#: plugins/sudoers/ldap.c:1095 +msgid "unable to format timestamp" +msgstr "αδύνατη η μορφοποίηση της χρονικής σήμανσης" + +#: plugins/sudoers/ldap.c:1103 +msgid "unable to build time filter" +msgstr "αδύνατη η δόμηση φίλτρου χρόνου" + +#: plugins/sudoers/ldap.c:1322 +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "ασυμφωνία κατανομής sudo_ldap_build_pass1" + +#: plugins/sudoers/ldap.c:1433 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/ldap.c:1909 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Ρόλος LDAP: %s\n" + +#: plugins/sudoers/ldap.c:1911 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"Ρόλος LDAP: ΑΓΝΩΣΤΟΣ\n" + +#: plugins/sudoers/ldap.c:1958 +#, c-format +msgid " Order: %s\n" +msgstr " Σειρά: %s\n" + +#: plugins/sudoers/ldap.c:1966 plugins/sudoers/parse.c:504 +#: plugins/sudoers/sssd.c:1295 +#, c-format +msgid " Commands:\n" +msgstr " Εντολές:\n" + +#: plugins/sudoers/ldap.c:2509 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "αδύνατη η αρχικοποίηση του LDAP: %s" + +#: plugins/sudoers/ldap.c:2551 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "ορίστηκε το start_tls, αλλά οι βιβλιοθήκες LDAP υποστηρίζουν ldap_start_tls_s() ή ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:2784 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "άκυρο γνώρισμα sudoOrder: %s" + +#: plugins/sudoers/linux_audit.c:57 +msgid "unable to open audit system" +msgstr "αδύνατο το άνοιγμα συστήματος ελέγχου" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "αδύνατη η αποστολή μηνύματος ελέγχου" + +#: plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:164 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (συνεχιζόμενη εντολή) %s" + +#: plugins/sudoers/logging.c:189 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "αδύνατο το άνοιγμα αρχείου καταγραφής: %s: %s" + +#: plugins/sudoers/logging.c:192 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "αδύνατο το κλείδωμα αρχείου καταγραφής: %s: %s" + +#: plugins/sudoers/logging.c:243 +msgid "No user or host" +msgstr "Χωρίς χρήστη ή οικοδεσπότη" + +#: plugins/sudoers/logging.c:245 +msgid "validation failure" +msgstr "αποτυχία επικύρωσης" + +#: plugins/sudoers/logging.c:252 +msgid "user NOT in sudoers" +msgstr "ο χρήστης ΔΕΝ είναι στους sudo" + +#: plugins/sudoers/logging.c:254 +msgid "user NOT authorized on host" +msgstr "ο χρήστης ΔΕΝ εξουσιοδοτήθηκε στον οικοδεσπότη" + +#: plugins/sudoers/logging.c:256 +msgid "command not allowed" +msgstr "μη επιτρεπόμενη εντολή" + +#: plugins/sudoers/logging.c:286 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "το %s δεν είναι στο αρχείο χρηστών sudo. Αυτό το συμβάν θα αναφερθεί.\n" + +#: plugins/sudoers/logging.c:289 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "ο %s δεν επιτρέπεται να εκτελέσει sudo στο %s. Αυτό το συμβάν θα αναφερθεί.\n" + +#: plugins/sudoers/logging.c:293 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Συγνώμη, ο χρήστης %s δεν μπορεί να εκτελέσει sudo στο %s.\n" + +#: plugins/sudoers/logging.c:296 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Συγνώμη, ο χρήστης %s δεν επιτρέπεται να εκτελέσει '%s%s%s' ως %s%s%s στο %s.\n" + +#: plugins/sudoers/logging.c:333 plugins/sudoers/sudoers.c:382 +#: plugins/sudoers/sudoers.c:383 plugins/sudoers/sudoers.c:385 +#: plugins/sudoers/sudoers.c:386 plugins/sudoers/sudoers.c:1017 +#: plugins/sudoers/sudoers.c:1018 +#, c-format +msgid "%s: command not found" +msgstr "%s: δεν βρέθηκε η εντολή" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:378 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" +"παραβλέπεται το `%s' που βρέθηκε στο '.'\n" +"Χρησιμοποιήστε `sudo ./%s' αν αυτό είναι το `%s' που θέλετε να εκτελέσετε." + +#: plugins/sudoers/logging.c:351 +msgid "authentication failure" +msgstr "αποτυχία πιστοποίησης" + +#: plugins/sudoers/logging.c:377 +msgid "a password is required" +msgstr "απαιτείται κωδικός πρόσβασης" + +#: plugins/sudoers/logging.c:441 plugins/sudoers/logging.c:495 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u ανεπιτυχής προσπάθεια κωδικού πρόσβασης" +msgstr[1] "%u ανεπιτυχείς προσπάθειες κωδικού πρόσβασης" + +#: plugins/sudoers/logging.c:581 +msgid "unable to fork" +msgstr "αδύνατη η διακλάδωση" + +#: plugins/sudoers/logging.c:588 plugins/sudoers/logging.c:644 +#, c-format +msgid "unable to fork: %m" +msgstr "αδύνατη η διακλάδωση: %m" + +#: plugins/sudoers/logging.c:634 +#, c-format +msgid "unable to open pipe: %m" +msgstr "αδύνατο το άνοιγμα της διοχέτευσης: %m" + +#: plugins/sudoers/logging.c:659 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "αδύνατο να dup στην τυπική είσοδο: %m" + +#: plugins/sudoers/logging.c:694 +#, c-format +msgid "unable to execute %s: %m" +msgstr "αδύνατη η εκτέλεση %s: %m" + +#: plugins/sudoers/logging.c:914 +msgid "internal error: insufficient space for log line" +msgstr "εσωτερικό σφάλμα: ανεπαρκής χώρος για γραμμή καταγραφής" + +#: plugins/sudoers/match.c:617 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "ανυποστήρικτος τύπος αφομοίωσης %d για %s" + +#: plugins/sudoers/match.c:647 +#, c-format +msgid "%s: read error" +msgstr "%s: σφάλμα ανάγνωσης" + +#: plugins/sudoers/match.c:661 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "η αφομοίωση για το %s (%s) δεν είναι στη μορφή %s" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "σφάλμα ανάλυσης στο %s κοντά στη γραμμή %d" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "ανάλυση σφάλματος για %s" + +#: plugins/sudoers/parse.c:451 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Καταχώριση χρηστών sudo:\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:466 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:475 +#, c-format +msgid " Options: " +msgstr " Επιλογές: " + +#: plugins/sudoers/policy.c:109 plugins/sudoers/policy.c:116 +#: plugins/sudoers/policy.c:123 plugins/sudoers/policy.c:145 +#: plugins/sudoers/policy.c:259 plugins/sudoers/policy.c:277 +#: plugins/sudoers/policy.c:284 plugins/sudoers/policy.c:312 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:327 +#: plugins/sudoers/set_perms.c:363 plugins/sudoers/set_perms.c:702 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1357 +#: plugins/sudoers/set_perms.c:1525 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/policy.c:539 plugins/sudoers/visudo.c:764 +#, c-format +msgid "unable to execute %s" +msgstr "Αδύνατη η εκτέλεση του %s." + +#: plugins/sudoers/policy.c:681 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Η έκδοση προσθέτου πολιτικής χρηστών sudo %s\n" + +#: plugins/sudoers/policy.c:683 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Η έκδοση γραμματικής αρχείου χρηστών sudo %d\n" + +#: plugins/sudoers/policy.c:687 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"διαδρομή χρηστών sudo: %s\n" + +#: plugins/sudoers/policy.c:690 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "διαδρομή nsswitch: %s\n" + +#: plugins/sudoers/policy.c:692 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "διαδρομή ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:693 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "διαδρομή ldap.secret: %s\n" + +#: plugins/sudoers/pwutil.c:148 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "αδύνατη η αποθήκευση του uid %u, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:190 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "αδύνατη η αποθήκευση του %s χρήστη, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:393 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "αδύνατη η αποθήκευση του gid %u, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:429 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "αδύνατη η αποθήκευση ομάδας %s, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:592 plugins/sudoers/pwutil.c:614 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "αδύνατη η αποθήκευση καταλόγου ομάδας %s, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to parse groups for %s" +msgstr "αδύνατη η ανάλυση ομάδων για %s" + +#: plugins/sudoers/set_perms.c:124 plugins/sudoers/set_perms.c:449 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1149 +#: plugins/sudoers/set_perms.c:1441 +msgid "perm stack overflow" +msgstr "υπερχείλιση στοίβας perm" + +#: plugins/sudoers/set_perms.c:132 plugins/sudoers/set_perms.c:457 +#: plugins/sudoers/set_perms.c:860 plugins/sudoers/set_perms.c:1157 +#: plugins/sudoers/set_perms.c:1449 +msgid "perm stack underflow" +msgstr "υποχείλιση στοίβας perm" + +#: plugins/sudoers/set_perms.c:191 plugins/sudoers/set_perms.c:504 +#: plugins/sudoers/set_perms.c:1208 plugins/sudoers/set_perms.c:1481 +msgid "unable to change to root gid" +msgstr "αδύνατη η αλλαγή σε gid υπερχρήστη" + +#: plugins/sudoers/set_perms.c:280 plugins/sudoers/set_perms.c:601 +#: plugins/sudoers/set_perms.c:989 plugins/sudoers/set_perms.c:1285 +msgid "unable to change to runas gid" +msgstr "αδύνατη η αλλαγή σε gid runas" + +#: plugins/sudoers/set_perms.c:292 plugins/sudoers/set_perms.c:613 +#: plugins/sudoers/set_perms.c:999 plugins/sudoers/set_perms.c:1295 +msgid "unable to change to runas uid" +msgstr "αδύνατη η αλλαγή σε uid runas" + +#: plugins/sudoers/set_perms.c:310 plugins/sudoers/set_perms.c:631 +#: plugins/sudoers/set_perms.c:1015 plugins/sudoers/set_perms.c:1311 +msgid "unable to change to sudoers gid" +msgstr "αδύνατη η αλλαγή σε gid χρηστών sudo" + +#: plugins/sudoers/set_perms.c:363 plugins/sudoers/set_perms.c:702 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1357 +#: plugins/sudoers/set_perms.c:1525 +msgid "too many processes" +msgstr "υπερβολικά πολλές διεργασίες" + +#: plugins/sudoers/set_perms.c:1595 +msgid "unable to set runas group vector" +msgstr "αδύνατος ο ορισμός διανύσματος ομάδας runas" + +#: plugins/sudoers/sssd.c:252 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "αδύνατη η αρχικοποίηση πηγής SSS. Είναι το SSSD εγκατεστημένο στο μηχάνημά σας;" + +#: plugins/sudoers/sssd.c:259 plugins/sudoers/sssd.c:267 +#: plugins/sudoers/sssd.c:275 plugins/sudoers/sssd.c:283 +#: plugins/sudoers/sssd.c:291 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "αδύνατη η εύρεση συμβόλου \"%s\" στο %s" + +#: plugins/sudoers/sudo_nss.c:283 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Συμφωνία προεπιλεγμένων καταχωρίσεων για %s στο %s:\n" + +#: plugins/sudoers/sudo_nss.c:296 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas και προεπιλεγμένες ειδικές εντολές για το %s:\n" + +#: plugins/sudoers/sudo_nss.c:309 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Ο χρήστης %s μπορεί να εκτελέσει τις παρακάτω εντολές στο %s:\n" + +#: plugins/sudoers/sudo_nss.c:318 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Ο χρήστης %s δεν επιτρέπεται να εκτελέσει sudo στο %s.\n" + +#: plugins/sudoers/sudoers.c:154 plugins/sudoers/sudoers.c:188 +#: plugins/sudoers/sudoers.c:675 +msgid "problem with defaults entries" +msgstr "πρόβλημα με τις προεπιλεγμένες καταχωρίσεις" + +#: plugins/sudoers/sudoers.c:160 +msgid "no valid sudoers sources found, quitting" +msgstr "δεν βρέθηκαν έγκυρες πηγές χρηστών sudo, έξοδος" + +#: plugins/sudoers/sudoers.c:222 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "οι χρήστες sudo καθορίζουν ότι ο υπερχρήστης δεν επιτρέπεται να εκτελέσει sudo" + +#: plugins/sudoers/sudoers.c:261 +msgid "you are not permitted to use the -C option" +msgstr "δεν επιτρέπετε να χρησιμοποιήσετε την επιλογή -C" + +#: plugins/sudoers/sudoers.c:314 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "κάτοχος χρονικής σήμανσης (%s): Δεν υπάρχει τέτοιος χρήστης" + +#: plugins/sudoers/sudoers.c:328 +msgid "no tty" +msgstr "χωρίς tty" + +#: plugins/sudoers/sudoers.c:329 +msgid "sorry, you must have a tty to run sudo" +msgstr "συγνώμη, πρέπει να έχετε ένα tty για να εκτελέσετε sudo" + +#: plugins/sudoers/sudoers.c:377 +msgid "command in current directory" +msgstr "εντολή στο τρέχοντα κατάλογο" + +#: plugins/sudoers/sudoers.c:394 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "συγνώμη, δεν σας επιτρέπεται να διατηρήσετε το περιβάλλον" + +#: plugins/sudoers/sudoers.c:725 plugins/sudoers/visudo.c:326 +#: plugins/sudoers/visudo.c:590 +#, c-format +msgid "unable to stat %s" +msgstr "αδύνατο να εκτελεστεί stat %s" + +#: plugins/sudoers/sudoers.c:728 +#, c-format +msgid "%s is not a regular file" +msgstr "το %s δεν είναι ένα κανονικό αρχείο" + +#: plugins/sudoers/sudoers.c:731 plugins/sudoers/timestamp.c:283 toke.l:923 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "το %s κατέχεται από uid %u, θα έπρεπε να είναι %u" + +#: plugins/sudoers/sudoers.c:735 toke.l:930 +#, c-format +msgid "%s is world writable" +msgstr "Το %s είναι εγγράψιμο από όλους" + +#: plugins/sudoers/sudoers.c:738 toke.l:935 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "το %s κατέχεται από gid %u, θα έπρεπε να είναι %u" + +#: plugins/sudoers/sudoers.c:764 +#, c-format +msgid "only root can use `-c %s'" +msgstr "μόνο ο υπερχρήστης μπορεί να χρησιμοποιήσει `-c %s'" + +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:783 +#, c-format +msgid "unknown login class: %s" +msgstr "άγνωστη κλάση σύνδεσης: %s" + +#: plugins/sudoers/sudoers.c:815 +#, c-format +msgid "unable to resolve host %s" +msgstr "αδύνατη η επίλυση οικοδεσπότη %s" + +#: plugins/sudoers/sudoers.c:878 plugins/sudoers/testsudoers.c:387 +#, c-format +msgid "unknown group: %s" +msgstr "άγνωστη ομάδα: %s" + +#: plugins/sudoers/sudoreplay.c:274 +#, c-format +msgid "invalid filter option: %s" +msgstr "άκυρη επιλογή φίλτρου: %s" + +#: plugins/sudoers/sudoreplay.c:287 +#, c-format +msgid "invalid max wait: %s" +msgstr "άκυρη μέγιστη αναμονή: %s" + +#: plugins/sudoers/sudoreplay.c:293 +#, c-format +msgid "invalid speed factor: %s" +msgstr "άκυρος συντελεστής ταχύτητας: %s" + +#: plugins/sudoers/sudoreplay.c:296 plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s έκδοση %s\n" + +#: plugins/sudoers/sudoreplay.c:328 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/χρονισμός: %s" + +#: plugins/sudoers/sudoreplay.c:334 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/χρονισμός: %s" + +#: plugins/sudoers/sudoreplay.c:350 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "Αναπαράγεται η συνεδρία sudo: %s\n" + +#: plugins/sudoers/sudoreplay.c:356 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Προειδοποίηση: το τερματικό σας είναι υπερβολικά μικρό για σωστή επανάληψη του ημερολογίου.\n" + +#: plugins/sudoers/sudoreplay.c:357 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Η γεωμετρία του ημερολογίου είναι %d x %d, η γεωμετρία του τερματικού σας είναι %d x %d." + +#: plugins/sudoers/sudoreplay.c:412 +msgid "unable to set tty to raw mode" +msgstr "αδύνατος ο ορισμός σε ακατέργαστη κατάσταση" + +#: plugins/sudoers/sudoreplay.c:443 +#, c-format +msgid "invalid timing file line: %s" +msgstr "άκυρη γραμμή αρχείου χρονισμού: %s" + +#: plugins/sudoers/sudoreplay.c:649 plugins/sudoers/sudoreplay.c:674 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "ασαφής παράσταση \"%s\"" + +#: plugins/sudoers/sudoreplay.c:696 +msgid "unmatched ')' in expression" +msgstr "ασύμφωνο ')' σε παράσταση" + +#: plugins/sudoers/sudoreplay.c:700 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "άγνωστος όρος αναζήτησης \"%s\"" + +#: plugins/sudoers/sudoreplay.c:714 +#, c-format +msgid "%s requires an argument" +msgstr "το %s απαιτεί ένα όρισμα" + +#: plugins/sudoers/sudoreplay.c:718 plugins/sudoers/sudoreplay.c:1090 +#, c-format +msgid "invalid regular expression: %s" +msgstr "άκυρη κανονική έκφραση: %s" + +#: plugins/sudoers/sudoreplay.c:724 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "αδύνατη η ανάλυση ημερομηνίας \"%s\"" + +#: plugins/sudoers/sudoreplay.c:733 +msgid "unmatched '(' in expression" +msgstr "ασύμφωνο '(' σε παράσταση" + +#: plugins/sudoers/sudoreplay.c:735 +msgid "illegal trailing \"or\"" +msgstr "απαράδεκτο τελικό \"or\"" + +#: plugins/sudoers/sudoreplay.c:737 +msgid "illegal trailing \"!\"" +msgstr "απαράδεκτο τελικό \"!\"" + +#: plugins/sudoers/sudoreplay.c:790 +#, c-format +msgid "unknown search type %d" +msgstr "άγνωστος τύπος αναζήτησης %d" + +#: plugins/sudoers/sudoreplay.c:827 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: άκυρο αρχείο ημερολογίου" + +#: plugins/sudoers/sudoreplay.c:845 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: το πεδίο σήμανσης χρόνου λείπει" + +#: plugins/sudoers/sudoreplay.c:852 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: η σήμανση χρόνου %s: %s" + +#: plugins/sudoers/sudoreplay.c:859 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: το πεδίο χρήστη λείπει" + +#: plugins/sudoers/sudoreplay.c:867 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: το πεδίο χρήστη runas λείπει" + +#: plugins/sudoers/sudoreplay.c:875 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: το πεδίο ομάδας runas λείπει" + +#: plugins/sudoers/sudoreplay.c:1230 +#, c-format +msgid "usage: %s [-h] [-d dir] [-m num] [-s num] ID\n" +msgstr "χρήση: %s [-h] [-d dir] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "χρήση: %s [-h] [-d dir] -l [παράσταση αναζήτησης]\n" + +#: plugins/sudoers/sudoreplay.c:1242 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - επανάληψη ημερολογίων συνεδρίας sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1244 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Επιλογές:\n" +" -d, --directory=κατάλογος καθορισμός καταλόγου για ημερολόγια συνεδρίας\n" +" -f, --filter=φίλτρο ορισμός ποιοι τύποι εισόδου/εξόδου να εμφανίζονται\n" +" -h, --help εμφάνιση μηνύματος βοήθειας και έξοδος\n" +" -l, --list κατάλογος διαθέσιμων αναγνωριστικών συνεδρίας, με προαιρετική παράσταση\n" +" -m, --max-wait=αριθ μέγιστος αριθμός δευτερολέπτων αναμονής μεταξύ συμβάντων\n" +" -s, --speed=αριθ επιτάχυνση ή επιβράδυνση εξόδου\n" +" -V, --version εμφάνιση πληροφοριών έκδοσης και έξοδος" + +#: plugins/sudoers/testsudoers.c:326 +msgid "\thost unmatched" +msgstr " ασύμφωνος οικοδεσπότης" + +#: plugins/sudoers/testsudoers.c:329 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Επιτρεπόμενη εντολή" + +#: plugins/sudoers/testsudoers.c:330 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Απαγορευμένη εντολή" + +#: plugins/sudoers/testsudoers.c:330 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"ασύμφωνη εντολή" + +#: plugins/sudoers/timestamp.c:191 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "αδύνατη η περικοπή αρχείου σήμανσης χρόνου σε %lld ψηφιολέξεις" + +#: plugins/sudoers/timestamp.c:291 +#, c-format +msgid "%s is group writable" +msgstr "το %s είναι εγγράψιμη ομάδα" + +#: plugins/sudoers/timestamp.c:311 +#, c-format +msgid "timestamp path too long: %s/%s" +msgstr "η διαδρομή χρονικής σήμανσης είναι υπερβολικά μεγάλη: %s/%s" + +#: plugins/sudoers/timestamp.c:484 +msgid "ignoring time stamp from the future" +msgstr "να αγνοείται η χρονική σήμανση στο μέλλον" + +#: plugins/sudoers/timestamp.c:496 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "η χρονική σήμανση υπερβολικά μακρινή στο μέλλον: %20.20s" + +#: plugins/sudoers/timestamp.c:596 plugins/sudoers/timestamp.c:618 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "η διαδρομή κατάστασης οδηγίας υπερβολικά μεγάλη: %s/%s" + +#: plugins/sudoers/toke_util.c:176 +msgid "fill_args: buffer overflow" +msgstr "fill_args: υπερχείλιση ενδιάμεσης μνήμης" + +#: plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "γραμματική %s έκδοση %d\n" + +#: plugins/sudoers/visudo.c:257 plugins/sudoers/visudo.c:543 +#, c-format +msgid "press return to edit %s: " +msgstr "πατήστε return για να επεξεργαστείτε το %s: " + +#: plugins/sudoers/visudo.c:342 plugins/sudoers/visudo.c:348 +msgid "write error" +msgstr "σφάλμα εγγραφής" + +#: plugins/sudoers/visudo.c:430 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "αδύνατη η εκτέλεση stat προσωρινού αρχείου (%s), το %s δεν άλλαξε" + +#: plugins/sudoers/visudo.c:435 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "προσωρινό αρχείο μηδενικού μήκους (%s), το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:441 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "αποτυχία επεξεργασίας του (%s), το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:463 +#, c-format +msgid "%s unchanged" +msgstr "αμετάβλητο %s" + +#: plugins/sudoers/visudo.c:488 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "αδύνατο το ξαναάνοιγμα του προσωρινού αρχείου (%s), το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:498 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "αδύνατη η ανάλυση του προσωρινού αρχείου (%s), άγνωστο σφάλμα" + +#: plugins/sudoers/visudo.c:534 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "εσωτερικό σφάλμα, αδύνατη η εύρεση του %s στον κατάλογο!" + +#: plugins/sudoers/visudo.c:592 plugins/sudoers/visudo.c:601 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "αδύνατος ο ορισμός (uid, gid) του %s στο (%u, %u)" + +#: plugins/sudoers/visudo.c:596 plugins/sudoers/visudo.c:606 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "αδύνατη η αλλαγή κατάστασης του %s στο 0%o" + +#: plugins/sudoers/visudo.c:623 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "τα %s και %s δεν έχουν το ίδιο σύστημα αρχείων, χρησιμοποιήστε το mv για μετονομασία" + +#: plugins/sudoers/visudo.c:637 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "αποτυχία εντολής: '%s %s %s', το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:647 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "σφάλμα μετονομασίας του %s, το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:709 +msgid "What now? " +msgstr "Τι να γίνει τώρα; " + +#: plugins/sudoers/visudo.c:723 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Οι επιλογές είναι:\n" +" (e)dit νέα επεξεργασία του αρχείου χρηστών sudo\n" +" e(x)it έξοδος χωρίς αποθήκευση αλλαγών στο αρχείο χρηστών sudo\n" +" (Q)uit έξοδος και αποθήκευση αλλαγών στο αρχείο χρηστών sudo (ΚΙΝΔΥΝΟΣ!)\n" + +#: plugins/sudoers/visudo.c:771 +#, c-format +msgid "unable to run %s" +msgstr "αδύνατη η εκτέλεση του %s" + +#: plugins/sudoers/visudo.c:797 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: εσφαλμένος κάτοχος (uid, gid) πρέπει να είναι (%u, %u)\n" + +#: plugins/sudoers/visudo.c:804 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: εσφαλμένα δικαιώματα, πρέπει να είναι κατάσταση 0%o\n" + +#: plugins/sudoers/visudo.c:829 plugins/sudoers/visudo_json.c:1008 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "αποτυχία ανάλυσης αρχείου %s, άγνωστο σφάλμα" + +#: plugins/sudoers/visudo.c:845 plugins/sudoers/visudo_json.c:1017 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "ανάλυση σφάλματος στο %s κοντά στη γραμμή %d\n" + +#: plugins/sudoers/visudo.c:848 plugins/sudoers/visudo_json.c:1020 +#, c-format +msgid "parse error in %s\n" +msgstr "ανάλυση σφάλματος %s\n" + +#: plugins/sudoers/visudo.c:856 plugins/sudoers/visudo.c:863 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: επιτυχής ανάλυση\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s busy, try again later" +msgstr "το %s είναι απασχολημένο, ξαναδοκιμάστε αργότερα" + +#: plugins/sudoers/visudo.c:953 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "ο συγκεκριμένος επεξεργαστής (%s) δεν υπάρχει" + +#: plugins/sudoers/visudo.c:976 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "αδύνατο να εκτελέσουμε stat στον επεξεργαστή (%s)" + +#: plugins/sudoers/visudo.c:1024 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "δεν βρέθηκε κανένας επεξεργαστής (διαδρομή επεξεργαστή = %s)" + +#: plugins/sudoers/visudo.c:1117 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "Σφάλμα: κύκλος στο %s_Alias `%s'" + +#: plugins/sudoers/visudo.c:1118 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "Προειδοποίηση: κύκλος στο %s_Alias `%s'" + +#: plugins/sudoers/visudo.c:1124 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "Σφάλμα: αναφέρθηκε το %s_Alias `%s', αλλά δεν ορίστηκε" + +#: plugins/sudoers/visudo.c:1125 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "Προειδοποίηση: αναφέρθηκε το %s_Alias `%s', αλλά δεν ορίστηκε" + +#: plugins/sudoers/visudo.c:1267 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "%s: αχρησιμοποίητο %s_Alias %s" + +#: plugins/sudoers/visudo.c:1329 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - ασφαλής επεξεργασία του αρχείου χρηστών sudo\n" +"\n" + +#: plugins/sudoers/visudo.c:1331 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=file specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=file export sudoers in JSON format" +msgstr "" +"\n" +"Επιλογές:\n" +" -c, --check κατάσταση μόνο ελέγχου\n" +" -f, --file=αρχείο καθορισμός θέσης αρχείου χρηστών sudo\n" +" -h, --help εμφάνιση μηνύματος βοήθειας και έξοδος\n" +" -q, --quiet λιγότερο αναλυτική (αθόρυβη) σύνταξη μηνυμάτων σφαλμάτων\n" +" -s, --strict αυστηρός έλεγχος σύνταξης\n" +" -V, --version εμφάνιση πληροφοριών έκδοσης και έξοδος\n" +" -x, --export=αρχείο εξαγωγή χρηστών sudo σε μορφή JSON" + +#: toke.l:894 +msgid "too many levels of includes" +msgstr "περιλαμβάνει υπερβολικά πολλά επίπεδα" diff --git a/plugins/sudoers/po/eo.mo b/plugins/sudoers/po/eo.mo new file mode 100644 index 0000000..bbc1851 Binary files /dev/null and b/plugins/sudoers/po/eo.mo differ diff --git a/plugins/sudoers/po/eo.po b/plugins/sudoers/po/eo.po new file mode 100644 index 0000000..05402b9 --- /dev/null +++ b/plugins/sudoers/po/eo.po @@ -0,0 +1,3087 @@ +# Esperanto translations for sudo package. +# This file is distributed under the same license as the sudo package. +# Keith Bowes , 2012, 2019, 2020. +# Felipe Castro , 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-18 16:11-0500\n" +"Last-Translator: Keith Bowes \n" +"Language-Team: Esperanto \n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.7\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "sintaksa eraro" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Pasvorto de %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] pasvorto por %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Pasvorto: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SEKURECO: informoj por %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Malĝuste, reprovu." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "ne eblas rezervi memoron" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "resumo postulas vojnomon" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "valoroj por \"CWD\" devas komenciĝi per '/', '~' aŭ '*'" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "valoroj por \"CHROOT\" devas komenciĝi per '/', '~' aŭ '*'" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "sintakseraro: rezervita vorto %s uzata kiel kromnomo" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "malvalida valoro notafter" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "validiga valoro notafter" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "eksvalidiĝo-valoro tro grandas" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "malvalida eksvalidiĝo-valoro" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "interna eraro, troo en %s" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "ne eblas kopii enigon: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "ne eblas plenumigi %s-on: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "ne eblas forki" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "ne eblas forki: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "ne eblas malfermi tubon: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s: %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (komando daŭrigis) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s ekzistas sed ne dosierujo (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "ne eblas mkdir-i: %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "ne eblas ŝanĝi reĝimon de %s al 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "atendita JSON_STRING, %d ricevita" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "mankas duobla citilo en nomo" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "atendita JSON_OBJECT, %d ricevita" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "'}' sen kongruanta '{'" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "neatendita tabelo" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "']' sen kongruanta '['" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "neatendita ĉeno" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "mankas dupunkto post nomo" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "neatendita bulea valoro" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "neatendita nombro" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u ne eblas analizi: \"%s\"" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: malvalida protokolo-dosiero" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: mankas temp-indikila kampo" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: temp-indikilo %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: mankas kampo de uzanto" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: mankas kampo de runa uzanto" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: mankas kampo de runa grupo" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "nelegebla tempo-registra dosiero: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "malvalida linio en la tempo-registran dosieron: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "protokolo jam estas kompleta, ne eblas restartigi ĝin" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "ne eblas restartigi protokolon" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "ne eblas malfermi: %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "mankas eneliga protokolo %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: ne eblas serĉi antaŭen: %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "ne eblas trovi daŭrigan punkton [%lld, %ld] en %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "statmaŝina eraro" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "nevalida AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "neanalizebla AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "malsukcesis kreiĝo de eneliga protokolo" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "malsukcesis protokoli akcepto-eventon" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "nevalida RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "neanalizebla RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "malsukcesis protokoli malakcepto-eventon" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "nevalida AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "neanalizebla AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "malsukcesis protokoli alarmo-eventon" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "protokolo-eraro" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "neskribebla IoBuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "neskribela ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "neskribela CommandSuspend" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "nekonata ClientMessage-tipo" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "klienta mesaĝo tro grandas" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "ne agordi ĉifraron de TLS 1.2 al %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "ne agordi ĉifraron de TLS 1.3 al %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "ne eblas akiri metodon de TLS-servilo: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "ne eblas krei TLS-kuntekston: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "ne eblas ŝargi atestilon %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "Ne eblas ŝargi aŭtoritatan atestilaron: %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "ne eblas ŝarĝi privatŝlosilon %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "ne ablas agordi parametrojn de diffie-hellman: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "ne ablas elekti minimuman eldonon de TLS al 1.2: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "ne eblas atingi foran IP-adreson" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Ne eblas almeti uzanto-datumojn al la SSL-objekto: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "ne eblas aldoni eventon al atendovico" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "ne eblas agordi aŭskultan ŝtopilingon" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - sendi sudo-eneligo-protokolon al fora servilo\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Elektoj:\n" +" -f, --file=sudoers indiki lokon de la dosiero sudoers\n" +" -h, --help montri helpan mesaĝon kaj eliri\n" +" -n, --no-fork ne forki, plenumi malfore\n" +" -R, --random-drop elcenta ŝanco, ke la kontektoj interrompiĝos\n" +" -V, --version montri eldonon kaj eliri\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Protobuf-C, eldono 1.3 aŭ pli postulata" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "validiga hazarda interrompiĝo-valoro: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s eldono %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS ne regata" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: ne tute kvalifikita vojo" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d '[' sen kongruanta ']': %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d nevalida agordo-sekcio: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d nevalida agordo-dosiera linio: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d atendas sekcian nomon: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "nevalida valoro por %s: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d nekonata ŝlosilvorto: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "nekonata syslog-instalaĵo: %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "nekonata syslog-prioritato: %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Elektoj:\n" +" --help montri helpilon kaj fini\n" +" -A, --accept sendi nur akcepto-eventon (neniun eneligon)\n" +" -h, --host retnodo al kiu sendi protokolojn\n" +" -i, --iolog_id fara identigilo de eneliga logo daŭrigota\n" +" -p, --port pordo uzota dum konektiĝi al retnodo\n" +" -r, --restart restartigi antaŭan eneligo-protokolan transigon\n" +" -R, --reject malakcepti la komandon kun donita kialo\n" +" -b, --ca-bundle atestilara dosiero kontraŭ kiu konstati la atestilon de la servilo\n" +" -c, --cert atestila dosiero por TLS-manpremo\n" +" -k, --key privatŝlosila dosiero\n" +" -n, --no-verify ne konstati la servilan atestilon\n" +" -t, --test provi kontrolan servilon per sendado de la elektita eneliga protokolo n-foje paralele\n" +" -V, --version montri eldonon kaj fini\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "ne eblas serĉi je %s:%s %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "ne eblas atingi servilan IP-adreson" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "ne eblas legi je %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "klienta mesaĝo tro grandas: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: skribobufo jam uzata" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "neatendita eneliga evento %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: neatendita stato %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "nevalida ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "erarmesaĝo ricevita el servilo: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "abortiga mesaĝo ricevita el servilo: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "neelpakebla ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s neatendita valoro %d de type_case" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "eksvalidiĝo dum legado el servilo" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "trofrua dosierfino" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "servila mesaĝo tro granda: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "eksvalidiĝo dum skribado al servilo" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "Eksvalidiĝo de TLS-manpremo okazis" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "ne eblas apliki eventon" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "TLS-konekto malsukcesis: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "ne eblas ekigi SSL-kuntekston: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Ne eblas generi SSL-objekton: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Ne eblas almeti ŝtopilingon al la SSL-objekton: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "kaj restartiga punkto kaj iolog-identigilo estas specifendaj" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "ne rajtas estigi restartigan punkton kiam neniu eneligaĵo estas sendita" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "trofrue finiĝis kun stato %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "pasinta tempo sentita al servilo [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "kunsendita punkto ricevita el servilo [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Kromnomo \"%s\" jam ekzistas" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "ne eblas akiri la tempon de la tago" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "ne eblas ŝanĝi pasvorton por %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "ne eblas akiri ensalutan klason por uzanto %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "ne eblas komenci bsd-aŭtentikigon" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "malvalida aŭtentikiga tipo" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "ne eblas komenci BSD-aŭtentikigon" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "via konto ekzvalidiĝis" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "aprobo malsukcesis" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "ne eblas legi fwtk-agordon" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "ne eblas konektiĝi al aŭtentikiga servilo" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "konekto al aŭtentikiga servilo perdita" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"eraro de aŭtentikiga servilo:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s ne eblas konverti ĉefon al ĉeno ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: ne eblas analizi: '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: ne eblas trovi ccache-on: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: ne eblas generi elektojn: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: ne eblas akiri atestilojn: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: ne eblas ekigi atestilan kaŝmemoron: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: ne eblas konservi atestilon en kaŝmemoro: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: ne eblas atingi gastiganton ĉefan: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Ne eblas kontroli TGT! Ebla atako!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "ne eblas ekigi PAM: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Eraro de aŭtentikiga servilo: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "malsukceso ĉe konta validigo, ĉu via konto estas ŝlosita?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Konto aŭ pasvorto eksvalidiĝis, restarigu vian pasvorton kaj reprovu" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "ne eblas ŝanĝi eksvalidan pasvorton: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Pasvorto eksvalidiĝis, kontaktu vian sistemestron" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Konto eksvalidiĝis aŭ PAM-agordon malhavas sekcion \"account\" por sudo, kontaktu vian sistemestron" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Eraro de administro de konto PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "vi ne ekzistas en la datumbazo %s" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "malsukcesis ekigi la bibliotekon de la API ACE" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "ne eblas kontakti la servilon de SecurID" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "Uzanto-identigilo ŝlosita pro Aŭtentikigo SecurID" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "malvalida salutnoma longo por SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "malvalida Aŭtentikiga Traktilo por SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "Komunikiĝo kun SecurID malsukcesis" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "nekonata SecurID-eraro" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "malvalida paskoda longo por SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "ne eblas ekigi SIA-seascon" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "malvalidaj aŭtentikigaj metodoj" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Nevalidaj aŭtentikigaj metodoj kompilitaj en sudo! Vi ne rajtas miksi dependan kaj sendependan aŭtentikigon." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "neniu aŭtentikiga metodo" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Ekzistas neniaj aŭtentikigaj metodoj kompilitaj en sudo! Se vi volas malŝalti aŭtentikigon, uzu la agordan parametron --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Ne eblas komenci aŭtentikigajn metodojn." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Aŭtentikigaj metodoj:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Ne eblis determini revizian kondiĉon" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "ne eblis konservi revizian rikordon" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Ni fidas, ke vi ricevis la kutiman admonojn de la loka\n" +"sistemestro. Resume memoru la jenajn punktojn:\n" +"\n" +" #1) Estimu la privatecon de aliaj.\n" +" #2) Pensu antaŭ ol tajpi.\n" +" #3) Granda povo devigas grandan responson.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "nekonata uid: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "nekonata uzanto: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "alkremento de ordo: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "komenca ordo: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "ŝtopado de ordo: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s gramatika eldono %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "nesubtenata enig-formo %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "nesubtenata elig-formo %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: eliga kaj eniga dosieroj devas esti malsamaj" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "ne eblas ekigi aŭtomatajn valorojn de sudoers" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: nekonata ŝlosilvorto: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "malvalida defaŭlto-tipo: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "malvalida demeto-tipo: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "malvalida filtro: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "ne eblas malfermi: %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "malsukcesis analizi dosieron %s, nekonata eraro" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "analiza eraro en %s proksime al linio %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "analiza eraro en %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "ne eblas skribi al %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konverti inter dosierformoj de sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Modifiloj:\n" +" -b, --base=DN la baza DN por petoj de sudo LDAP\n" +" -c, --config=agordo la vojo al la agordo-dosiero\n" +" -d, --defaults=deftipoj nur konverti Defaŭltojn el la indikitaj tipoj\n" +" -e, --expand-aliases disvolvigi kromnomojn dum konverto\n" +" -f, --output-format=formo difini elig-formon: JSON, LDIF aŭ sudoers\n" +" -i, --input-format=formo difini enig-formon: LDIF aŭ sudoers\n" +" -I, --increment=num kiom alkrementi po ĉiu sudoOrder\n" +" -h, --help montri helpmesaĝo kaj eliri\n" +" -m, --match=filtro nur konverti enigojn kiuj akordas al la filtro\n" +" -M, --match-local akordo-filtro uzas datumbazojn de passwd kaj de group\n" +" -o, --output=elig_dosiero skribi konvertitan sudoers al elig-dosiero\n" +" -O, --order-start=num ekpunkto por la unua sudoOrder\n" +" -p, --prune-matches pritondi nekongruantajn uzantojn, grupojn kaj gastigantojn\n" +" -P, --padding=num baza ŝtopo por alkremento de sudoOrder\n" +" -s, --suppress=sekcioj demeti eligon el kelkaj sekcioj\n" +" -V, --version montri informon pri versio kaj eliri" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "en defaults estas nekonata enigo \"%s\"" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "ne eblas atingi GMT-tempon" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "ne eblas aranĝi tempo-indikilon" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "tro multaj enigoj de sudoers, maksimume %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "la medivariablo SUDOERS_BASE ne estas difinita kaj la modifilo -b ne estis indikata." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-trajto se syslog estas uzata por protokoli: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioritato por uzi, kiam uzanto sukcese aŭtentikiĝas: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioritato por uzi kiam uzanto malsukcese aŭtentikigas: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Meti OTP-demandilon en sia propra linio" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ignori '.' en $PATH" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Ĉiam sendi retmesaĝon kiam sudo plenumiĝas" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Sendi retmesaĝon se uzanto-aŭtentikiĝo malsukcesas" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Sendi retmesaĝon se la uzanto ne estas en sudoers" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Sendi retmesaĝon se la uzanto ne estas en sudors por la gastiganto" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Sendi retmesaĝon se la uzanto ne estas permesata plenumigi komandon" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Sendi retmesaĝon se la uzanto provi plenumigi komandon" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Uzi apartan tempo-indikilon por ĉiu uzanto/tty-kombino" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Averti uzanton dum la unua fojo ĝi plenumigas je sudo" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Dosiero havanta la sudo-averton: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Postulas, ke uzantoj aŭtentikiĝu aŭtomate" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Ĉefuzanto rajtas plenumigi: sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Protokoli la gastignomon en la (ne syslog) protokolo" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Protokoli la jaron en la (ne syslog) protokolo" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Se sudo estas vokata kun neniuj parametroj, komencu ŝelon" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Valorizi medivariablon $HOME al la cela uzanto dum komenci ŝelon kun -s" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Ĉiam valorizi medivariablon $HOME al la hejma dosierujo de la cela uzanto" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permesi, ke iu informokolektado por doni utilajn eraromesaĝojn" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Postuli tute kvalifikitajn gastiganto-nomojn en la dosiero sudoers" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulti la uzanton, kiam si enmetas malĝustan pasvorton" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Nur permesi, ke uzanto plenumigu sudo-on se si havas tty-on" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo honoru la medivariablon EDITOR" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Peti la ĉefuzantan pasvorton, ne la uzanto-pasvorton" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Peti la pasvorton de runas_default, ne de la uzanto" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Peti la pasvorton de la cela uzanto, ne la nuna uzanto" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Apliki aŭtomataĵojn en la ensaluta klaso de la cela uzanto, se ĝi ekzistas" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Valorizi la medivariablojn LOGNAME kaj USER" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Nur valorizi la efikan uid-on al la cela uzanto, ne la realan uid-on" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ne ekigi la grupon vektoron al tio de la cela uzanto" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Longo je kiu linfaldi la protokol-dosieraj linioj (0 por senfalda): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Eksvalidiĝo de la aŭtentikiga tempo-indikilo: %.1f minutoj" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Eksvalidiĝo de la pasvortilo: %.1f minutoj" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Nombro da provoj por enmeti pasvorton: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask uzi aŭ 07777 por uzi uzanton: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Vojo al protokolo: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Vojo al retpoŝtilo: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Parametroj por retpoŝtilo: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Retpoŝtadreso adresata: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Retpoŝtadreso adresanta: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Subjekta linio por ĉiuj mesaĝoj: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Neĝusta pasvorta mesaĝo: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Vojo al dosierujo de prelega stato: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Vojo al dosierujo de aŭtentikiga tempo-indikilo: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Estro de la dosierujo de aŭtentikiga tempo-indikilo: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Uzantoj en la grupo en devas plenumi la postulojn de pasvorto kaj PATH: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Defaŭlta pasvorta peto: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Se aktivigita, passprompt superregas sistemajn invitojn ĉiuokaze." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Defaŭlta uzanto por plenumigi komandojn: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valoro per kiu superregi la PATH-on de uzanto: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Vojo al la tekstoredaktilo uzota de visudo: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kiam postuli pasvorton por la pseŭdokomando 'list' : %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kiam postuli pasvorton por la pseŭdokamando 'verify' : %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Antaŭŝargi la bibliotekon sudo_noexec, kiu anstataŭas la exec-funkciojn" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Se LDAP-dosierujo estas aktiva, ni ignoru la lokan suders-dosieron" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Dosiero-priskribiloj >= %d fermiĝos antaŭ ol plenumigi komandon" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Se elektita, uzantoj rajtas superregi la valoron de \"closefrom\" per la parametro -C" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permesi, ke uzantoj valorizu arbitrajn medivariablojn" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Restarigi la medion al apriora aro da variabloj" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Medivariabloj por kontroli por sekureco:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Medivariabloj por forigi:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Medivariabloj konservi:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux-rolo por uzi en la nova sekureca kunteksto: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux-tipo por uzi en la nova sekureca kunteksto: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Vojo al media dosiero specifa al sudo: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Vojo al la neatingebla sudo-specifa medio-dosiero: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Lokaĵaro por uzi dum analizi dosieron sudoers: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permesi, ke sudo peti pasvorton eĉ se ĝi estus videbla" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Doni vidajn indikojn je la pasvorta enmetanta kiam ekzistas enmeto" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Uzi pli rapida kunigo, kiu estas malpli ĝusta sed ne atingas la dosiersistemon" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "La umask specifa en sudors superregos tio de la uzanto, eĉ se ĝi estas pli permesema" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Protokoli enmeton de uzanto por la komando, kiun si plenumigas" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Protokoli la eligon de la komando, kiu estas plenumiĝi" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Kunpremi eneligaj protokoloj per zlib" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Ĉiam protokoli komandojn en pseŭda tty" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Kromprogramo por kompreno de ne-uniksaj grupoj: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Dosierujo en kiu konservi eneligaj protokoloj: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Dosiero en kiu konservi la eneliga protokolo: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Aldoni eron al la utmp/utmpx-dosiero dum generi pty-on" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Valorizi uzanton en utmp al la plenumigkiela uzanto, ne la vokanta uzanto" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Aro da permesitaj privilegioj: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Aro da limigaj privilegioj: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Plenumigi komandojn en pty en la fono" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "PAM-servonomo uzota: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-servonomo uzota por ensalutaj ŝeloj: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Ne eblas establi PAM-atestilojn por la cela uzanto" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Krei novan PAM-seancon en kiu la komando plenumiĝos" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Administradi validigon de konto PAM" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Maksimuma sinsekva numero de la eneliga protokolo: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Aktivigi retgrupan regon de sudoers" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontroli gepatrajn dosierujojn pri skribeblo dum redakto de dosieroj per sudoedit" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Sekvi simbolajn ligojn dum redakto de dosieroj per sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Informo-mendi la grupan kromprogramon por nekonataj sistem-grupoj" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Kongrui retgrupoj surbaze de entuta n-opo: uzanto, gastiganto kaj domajno" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permesi ke komandoj estu plenumataj eĉ se sudo ne povas skribi al la ekzamena protokolo" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permesi ke komandoj estu plenumataj eĉ se sudo ne povas skribi al la eneliga protokolo" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permesi ke komandoj estu plenumataj eĉ se sudo ne povas skribi al la protokola dosiero" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Solvi grupojn en sudoers kaj kongrui al la grupa ID, ne la nomo" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Protokoleroj pli grandaj ol tiu ĉi valoro estos dividitaj en multoblajn mesaĝojn en syslog: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Uzanto kiu posedos la eneligajn protokol-dosierojn: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupo kiu posedos la eneligajn protokol-dosierojn: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Dosier-reĝimo uzota por la eneligaj protokol-dosieroj: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Plenumigi komandojn laŭ dosiernumero anstataŭ laŭ vojo: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignori nekonatajn erojn Defaults en sudoers anstataŭ prezenti averton" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tempo laŭ sekundoj pust kiu la komando finiĝos: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permesi al la uzanto specifi eksvalidiĝon per la komandlinio" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Tuj elbufrigi eneligo-protokolajn datumojn en diskon anstataŭ enbufrigi ĝin" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Inkluzivigi la procezan identigilon dum protokoli per syslog" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipo de tempindika rikordo por aŭtentikigo: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Mesaĝo pri malsukceso dum aŭtentikigo: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Preteratenti usklecon dum kongruo al uzantnomoj" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Preteratenti usklecon dum kongruo al grupnomoj" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Protokoli kiam komando estas permesata de sudoers" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Protokoli kiam komando estas malpermesata de sudoers" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Sudo: protokoli servilo(j)n al kiuj konektiĝi kun libervola pordo" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Sudo: protokoli servilan eksvalidiĝon laŭ sekundoj: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Ebligi ŝtopilingan elekton SO_KEEPALIVE por la ŝtopilingo konektita al la protokolservilo" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Vojo al atestilara dosiero de la kontrola servilo: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Vojo al atestila dosiero de sudoers: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Vojo al la privatŝlosila dosiero de sudoers: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Konstati ke la atestilo de la protokolo-servilo validas" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Permesi la uzon de nekonata plenumkiel-uzanto kajaŭ grupa identigilo" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Permesi nur plenumigi komandojn kiel uzanto kun valida ŝelo" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Agordi la PAM-foran uzanton al la uzanto, kiu plenumigas je sudo" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Agordi la PAM-foran retnodon al la loka nodnomo" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Kuranta dosierujo ŝanĝota antaŭ ol plenumi la komandon: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Radika dosierujo ŝanĝota antaŭ ol plenumi la komandon: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "La formato de protokoloj por produkti je %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: nekonata ero de defaults \"%s\"" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: nekonata enigo de defaults \"%s\"" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: neniu valoro indikita por \"%s\"" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: neniu valoro indikita por \"%s\"" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: parametro \"%s\" ne povas havi valoron" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: parametro \"%s\" ne povas havi valoron" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: malvalida Defaults-tipo 0x%x por parametro \"%s\"" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: malvalida Defaults-tipo 0x%x por parametro \"%s\"" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: valoro \"%s\" estas malvalida por parametro \"%s\"" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: valoro \"%s\" estas malvalida por parametro \"%s\"" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: valoroj por \"%s\" devas komenciĝi per '/', '~' aŭ '*'" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: valoroj por \"%s\" devas komenciĝi per '/', '~' aŭ '*'" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: valoroj por \"%s\" devas komenciĝi per '/'" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: valoroj por \"%s\" devas komenciĝi per '/'" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: medio tro granda" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "ne eblas rekonstrui la medion" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "bedaŭre vi ne estas permesata valorizi la jenajn medivariablojn: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "analiza eraro en %s proksime al linio %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "analiza eraro en %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nekonata resuma tipo %d por %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: lega eraro" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s devas esti estrata de uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s devas esti skribebla nur de estro" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "ne eblas ŝarĝi je %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "ne eblas trovi simbolon \"group_plugin\" en %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: nekongrua grupa kromprogramo: ĉefa eldono %d, atendita %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "ne eblas trakti IP-adreson \"%s\"" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "ne eblas trakti retmaskon \"%s\"" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Loka IP-adresa kaj retmaska paroj:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "nekonata grupo: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "ne eblas ĝisdatigi sinsekvan dosieron" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "ne eblas skribi al eneliga protokoldosiero: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "ne eblas krei: %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: interna eraro, protokola dosiero de en/eligo por evento %d ne estas malferma" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "ne eblas legi la horloĝon" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: interna eraro, malvalida signalo %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls ne estas regata dum uzo de ldaps" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "ne eblas ekigi SSL-asertilon kaj ŝlosilan datumbazon: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "por uzi SSL, TLS_CERT devas havi valoron en %s" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "ne eblas ekigi LDAP-on: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls specifita sed LDAP-bibliotekoj ne havas la funkciojn ldap_start_tls_s() kaj ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "malvalida atributo de sudoOrder: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: pordo tro grandas" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nekonata retadresa tipo de LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ne eblas miksi sekurajn kaj nesekurajn retadresojn de LDAP" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "ne eblas konverti sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "ne eblas malfermi revizian sistemon" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "ne eblas sendi revizian mesaĝon" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "eraro en evento-iteracio" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Kreiĝo de nova objekto SSL_CTX malsukcesis: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "TLS-konekto al %s:%s malsukcesis: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "TLS-komenciĝo malsukcesis" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "TLS-manpremo malsukcesis" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: interna eraro, malvalida finiĝo-stato %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "konekto al protokolo-servilo perdita" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "mankanta skribobufo" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "ne eblas konektiĝi al protokolo-servilo" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "uzanto NE estas en sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "uzanto NE permesata en gastiganto" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "komando ne permesata" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s ne estas en la dosiero sudoers. Ĉi tiu estos raportita.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s ne estas permesata plenumigi sudo-on en %s. Ĉi tio estos raportita.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Bedaŭre uzanto %s ne rajtas plenumigi sudo en %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Bedaŭre uzanto %s ne rajtas plenumigi '%s%s%s' kiel %s%s%s en %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: komando ne trovita" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ni malatentas \"%s\" trovita en '.'\n" +"Uzu \"sudo ./%s\" se tio estas la \"%s\" , kiun vi volas plenumigi." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u malĝusta pasvorta provo" +msgstr[1] "%u malĝustaj pasvortaj provoj" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "aŭtentiga malsukceso" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "pasvorto estas bezonata" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "ne eblas malfermi protokolon: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "ne eblas skribi al protokolo: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "resumo por %s (%s) ne estas laŭ la formo %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-rolo: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Ero en sudoers:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Modifiloj: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Komandoj:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Kongruantaj eroj de Defaults: %s en %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Plenumigkiela komando-specifaj aŭtomataĵoj por %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Uzanto %s rajtas plenumigi la jenajn komandojn en %s:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Uzanto %s ne rajtas plenumigi sudo-on en %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ni preteratentas malkompletan sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "malvalida LDIF-atributo: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "malvalida %.*s difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "ne eblas trakti reto-adresan liston" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "uzantnomo ne difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "uzanto-ID ne difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "grupo-ID ne difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "gastiganta nomo ne difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "nevalida kuranta dosierujo: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "malvalida chroot-dosierujo: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "ne eblas plenumigi: %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Eldono %s de la konduta kromprogramo\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Eldono %d de la gramatikilo de sudoers\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Vojo de sudoers: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "vojo de nsswitch: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "vojo de ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "vojo de ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "ne eblas registri hokon el tipo %d (versio %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "ne eblas konservi uid-on %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "ne eblas konservi uid-on %u, jam ekzistas" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "ne eblas krei tenejan uzanton: %s" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "ne eblas konservi uzanton %s, jam ekzistas" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "ne eblas konservi gid-on %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "ne eblas konservi gid-on %u, jam ekzistas" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "ne eblas konservi grupon %s" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "ne eblas konservi grupon %s, jam ekzistas" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "ne eblas konservi grupan liston por %s, jam ekzistas" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "ne eblas konservi grupliston por %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "ne eblas trakti grupon en %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "ne eblas trakti gids por %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "permeso-staka troo" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "permeso-staka maltroo" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "ne eblas ŝanĝi al radika gid" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "ne eblas ŝanĝi al plenumigkiela gid" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "ne eblas elekti vektoron de plenumigkiela grupo" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "ne eblas ŝanĝi al plenumigkiela uid" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "ne eblas ŝanĝi al gid de sudo-redaktantoj" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "tro da procezoj" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "ne eblas scii la nunan labor-dosierujon" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "tranĉita ekzamen-vojo user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "tranĉita ekzamen-vojo argv[0]: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "ne eblas ekigi SSS-fonton. Ĉu SSSD estas instalita en via maŝino?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "ne eblas trovi simbolon \"%s\" en %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "problemoj kun aŭtomataj eroj" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "ne validaj fontotekstoj de sudoers trovita, ĉesiganta" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "uzanto ne rajtas ŝanĝi radikan dosierujon al %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "vi ne rajtas uzi la parametron -R kun %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "uzanto ne rajtas ŝanĝi dosierujon al %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "vi ne rajtas uzi la parametron -D kun %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers specifas, ke ĉefuzanto ne rajtas sudo-i" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "uzanto ne permesata superregi la limigon de closefrom" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "vi ne rajtas uzi la parametron -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "tempo-indikila posedanto (%s): Nenia uzanto" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "neniu tty" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "bedaŭre vi devas havi tty-on por plenumigi sudo-on" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "nevalida ŝelo por uzanto %s: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "komando en nuna dosierujo" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "uzanto ne rajtas elekti komando-eksvalidiĝon" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "bedaŭre vi ne rajtas elekti komando-eksvalidiĝon" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "uzanto ne rajtas konservi la medion" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "bedaŭre vi ne rajtas konservi la medion" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "komando tro longas" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit ne devas plenumiĝi per sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "ne eblas legi %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "ne eblas apliki stat al %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ne estas normala dosiero" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s estas estrita de uid %u, devas esti %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s estas skribebla de ĉiuj" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s estas estrita de gid %u, devas esti %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "nur ĉefuzanto rajtas uzi \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "nekonata ensaluta klaso: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "ne eblas trovi gastiganton %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "malvalida filtrila elekto: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "malvalida maksimuma atendo: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "malvalida rapida faktoro: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/tempo-registrado: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Refaranta sudo-seancon: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "ne eblas elekti tty-on en nudan reĝimon" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Averto: via terminalo estas tro malgranda por konvene reskribi la protokolon.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Protokola grando estas %dx%d, sed via terminala grando estas %dx%d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Refarado finita, premu iu ajn klavon por restarigi la terminalon." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "ambigua esprimo \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "mankas krampo kongruanta al ')' en esprimo" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "nekonata serĉaĵo \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s bezonas parametron" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "malvalida regulesprimo: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "ne eblis analizi daton \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "mankas krampo kongruanta al '(' en esprimo" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "malvalida posta \"or\"" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "malvalida posta \"!\"" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "nekonata serĉtipo %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uzado: %s [-hnRS] [-d ujo] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uzado: %s [-h] [-d ujo] -l [serĉaĵo]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - refari sudo-seancajn protokolojn\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Modifiloj:\n" +" -d ,--directory=ujo specifi dosierujon por seancaj protokoloj\n" +" -f, --filter=filtrilo specifi kiajn eneligajn tipo(j)n por montri\n" +" -h, --help montri helpan mesaĝon kaj eliri\n" +" -l, --list listigi haveblajn seancajn ID, kun nedeviga esprimo\n" +" -m, --max-wait=num maksimuma nombro da sekundoj por atendi inter okazoj\n" +" -n, --non-interactive neniu invito, seanco estas sendata al la norma eligo\n" +" -R, --no-resize ne provi regrandigi la terminalon\n" +" -S, --suspend-wait atendi dum la komando estas paŭzigita\n" +" -s, --speed=num rapidigi aŭ malrapidigi eligon\n" +" -V, --version eligi eldonan informon kaj eliri" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\thost sen egalo" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Komando permesata" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Komando rifuzata" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Komando sen egalo" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s estas skribebla de la grupo" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "ne eblas mallongigi tempo-indikilan dosieron ĝis %lld bajtoj" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "ignoranta tempo-indikilon el la estonteco" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tempo-indikilo tro estonte: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "ne eblas ŝlosi tempo-indikilan dosieron %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "vojo de prelega stato tro longas: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit plej bone ne specifiĝu kun vojo" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "la domifilo -x estos forigita en posta eldono" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "bonvolu konsideri uzi la utilaĵon cvtsudoers anstataŭe" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "premu enen-klavon por redakti %s-on: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "specifita tekstoredaktilo (%s) ne ekzistas" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "neniu tekstoredaktilo trovita (vojo = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "skriba eraro" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "ne eblas apliki stat al provizora dosiero (%s), %s neŝanĝita" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "nul-longa provizora dosiero (%s), %s neŝanĝita" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "redaktilo (%s) malsukcesis, %s neŝanĝita" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s neŝanĝita" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "ne eblas remalfermi provizoran dosieron (%s), %s neŝanĝita." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "ne eblas analizi provizoran dosieron (%s), nekonata eraro" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "interna eraro, ne eblas trovi %s en listo!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "ne eblas ŝanĝi (uid, gid) de %s al (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s kaj %s ne estas la sama dosiersistemo, uzanta mv-on por alinomi" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "komando malsukcesis: '%s %s %s', %s neŝanĝita" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "eraro dum alinomi %s-on; %s neŝanĝita" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Kion nun? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Elektoj estas:\n" +" r(e)dakti refoje sudoers-dosieron\n" +" (x) eliri sen konservi ŝanĝojn al sudoers-dosiero\n" +" (Q) Eliri kaj konservi ŝanĝojn al sudoers-dosiero (DANĜERA!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "ne eblas plenumigi: %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: malĝusta estro (uid, gid) devas esti (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: misaj permesoj, devas esti reĝimo 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: analizita senerare\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s okupata, reprovu pli malfrue" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "ne eblas ŝlosi: %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Ĉu redakti ja? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Eraro: %s:%d:%d: ciklo en %s \"%s\"" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Averto: %s:%d:%d: ciklo en %s \"%s\"" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Eraro: %s:%d:%d: %s \"%s\" estas referencita sed ne difinita" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Averto: %s:%d:%d: %s \"%s\" estas referencita sed ne difinita" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Averto: %s:%d:%d: neuzata %s \"%s\"" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sekure redakti la dosieron sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Elektoj:\n" +" -c, --check nur kontroli\n" +" -f, --file=sudoers indiki lokon de la dosiero sudoers\n" +" -h, --help montri helpan mesaĝon kaj eliri\n" +" -q, --quiet pli silenta (quiet) pri sintaksaj eraroj\n" +" -s, --strict severa kontrolado de sintakso\n" +" -V, --version montri eldonon kaj eliri\n" + +#: toke.l:179 +msgid "empty string" +msgstr "malplena ĉeno" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "malplena grupo" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "malplena retgrupo" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "malvalida linio-daŭrigo" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "malvalida IPv6-adreso" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "neatendita linirompo en ĉeno" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "tro da niveloj de inkluzivaĵoj" diff --git a/plugins/sudoers/po/eu.mo b/plugins/sudoers/po/eu.mo new file mode 100644 index 0000000..5220f12 Binary files /dev/null and b/plugins/sudoers/po/eu.mo differ diff --git a/plugins/sudoers/po/eu.po b/plugins/sudoers/po/eu.po new file mode 100644 index 0000000..6fa330e --- /dev/null +++ b/plugins/sudoers/po/eu.po @@ -0,0 +1,1679 @@ +# Basque translation of sudoers. +# Copyright (C) 2011 Free Software Foundation, Inc. +# This file is distributed under the same license as the sudo package. +# Mikel Olasagasti Uranga , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.2-rc2\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2011-06-04 18:27-0400\n" +"PO-Revision-Date: 2011-06-06 19:15+0100\n" +"Last-Translator: Mikel Olasagasti Uranga \n" +"Language-Team: Basque \n" +"Language: \n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: plugins/sudoers/alias.c:122 +#, c-format +msgid "Alias `%s' already defined" +msgstr "`%s' alias-a lehendik ere definitua dago" + +#: plugins/sudoers/bsm_audit.c:58 plugins/sudoers/bsm_audit.c:61 +#: plugins/sudoers/bsm_audit.c:109 plugins/sudoers/bsm_audit.c:113 +#: plugins/sudoers/bsm_audit.c:163 plugins/sudoers/bsm_audit.c:167 +msgid "getaudit: failed" +msgstr "getaudit: huts egin du" + +#: plugins/sudoers/bsm_audit.c:87 plugins/sudoers/bsm_audit.c:148 +msgid "Could not determine audit condition" +msgstr "Ezin izan da auditoretza baldintza finkatu" + +#: plugins/sudoers/bsm_audit.c:98 +msgid "getauid failed" +msgstr "getauid-ek huts egin du" + +#: plugins/sudoers/bsm_audit.c:100 plugins/sudoers/bsm_audit.c:157 +msgid "au_open: failed" +msgstr "au_open: huts egin du" + +#: plugins/sudoers/bsm_audit.c:115 plugins/sudoers/bsm_audit.c:169 +msgid "au_to_subject: failed" +msgstr "au_to_subject: huts egin du" + +#: plugins/sudoers/bsm_audit.c:119 plugins/sudoers/bsm_audit.c:173 +msgid "au_to_exec_args: failed" +msgstr "au_to_exec_args: huts egin du" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:182 +msgid "au_to_return32: failed" +msgstr "au_to_return32: huts egin du" + +#: plugins/sudoers/bsm_audit.c:126 plugins/sudoers/bsm_audit.c:185 +msgid "unable to commit audit record" +msgstr "ezin da auditoretza sarrera gorde" + +#: plugins/sudoers/bsm_audit.c:155 +msgid "getauid: failed" +msgstr "getauid: huts egin du" + +#: plugins/sudoers/bsm_audit.c:178 +msgid "au_to_text: failed" +msgstr "au_to_text: huts egin du" + +#: plugins/sudoers/check.c:141 +#, c-format +msgid "sorry, a password is required to run %s" +msgstr "barkatu, pasahitz bat behar da %s abiarazteko" + +#: plugins/sudoers/check.c:225 plugins/sudoers/iolog.c:169 +#: plugins/sudoers/sudoers.c:939 plugins/sudoers/sudoreplay.c:325 +#: plugins/sudoers/sudoreplay.c:334 plugins/sudoers/sudoreplay.c:675 +#: plugins/sudoers/sudoreplay.c:767 plugins/sudoers/visudo.c:700 +#, c-format +msgid "unable to open %s" +msgstr "ezin da %s ireki" + +#: plugins/sudoers/check.c:229 plugins/sudoers/iolog.c:199 +#, c-format +msgid "unable to write to %s" +msgstr "ezin da %s-(e)ra idatzi" + +#: plugins/sudoers/check.c:237 plugins/sudoers/check.c:475 +#: plugins/sudoers/check.c:525 plugins/sudoers/iolog.c:122 +#: plugins/sudoers/iolog.c:153 +#, c-format +msgid "unable to mkdir %s" +msgstr "ezin da mkdir %s egin" + +#: plugins/sudoers/check.c:370 +#, c-format +msgid "internal error, expand_prompt() overflow" +msgstr "barne errorea, expand_prompt() overflow" + +#: plugins/sudoers/check.c:426 +#, c-format +msgid "timestamp path too long: %s" +msgstr "" + +#: plugins/sudoers/check.c:454 plugins/sudoers/check.c:498 +#: plugins/sudoers/iolog.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existitzen da baina ez da direktorio bat (0%o)" + +#: plugins/sudoers/check.c:457 plugins/sudoers/check.c:501 +#: plugins/sudoers/check.c:546 +#, c-format +msgid "%s owned by uid %u, should be uid %u" +msgstr "%s-(r)en jabea %u uid-a da, %u uid-a beharko luke" + +#: plugins/sudoers/check.c:462 plugins/sudoers/check.c:506 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0700" +msgstr "" + +#: plugins/sudoers/check.c:470 plugins/sudoers/check.c:514 +#: plugins/sudoers/check.c:582 plugins/sudoers/sudoers.c:925 +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:500 +#, c-format +msgid "unable to stat %s" +msgstr "ezin da stat egin %s-(r)engan" + +#: plugins/sudoers/check.c:540 +#, c-format +msgid "%s exists but is not a regular file (0%o)" +msgstr "" + +#: plugins/sudoers/check.c:552 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0600" +msgstr "" + +#: plugins/sudoers/check.c:606 +#, c-format +msgid "timestamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/check.c:652 +#, c-format +msgid "unable to remove %s (%s), will reset to the epoch" +msgstr "" + +#: plugins/sudoers/check.c:659 +#, c-format +msgid "unable to reset %s to the epoch" +msgstr "" + +#: plugins/sudoers/check.c:713 plugins/sudoers/check.c:719 +#, c-format +msgid "unknown uid: %u" +msgstr "uid ezezaguna: %u" + +#: plugins/sudoers/check.c:716 plugins/sudoers/sudoers.c:736 +#: plugins/sudoers/sudoers.c:802 plugins/sudoers/sudoers.c:803 +#: plugins/sudoers/sudoers.c:1056 plugins/sudoers/sudoers.c:1057 +#: plugins/sudoers/testsudoers.c:200 plugins/sudoers/testsudoers.c:330 +#, c-format +msgid "unknown user: %s" +msgstr "erabiltzaile ezezaguna: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "root-ek sudo abiarizi lezake" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo-k EDITOR ingurune aldagaia erabiliko du" + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %d" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %d" +msgstr "" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +msgid "Preload the dummy exec functions contained in 'noexec_file'" +msgstr "" + +#: plugins/sudoers/def_data.c:247 +#, c-format +msgid "File containing dummy exec functions: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:251 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +msgid "Allow sudo to prompt for a password even if it would be visisble" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:323 +msgid "Compress I/O logs using zlib" +msgstr "Trinkotu S/E gertaerak zlib erabiliz" + +#: plugins/sudoers/def_data.c:327 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +msgid "Plugin for non-Unix group support" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +msgid "Directory in which to store input/output logs" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +msgid "File in which to store the input/output log" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:347 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/defaults.c:197 +msgid "" +"Available options in a sudoers ``Defaults'' line:\n" +"\n" +msgstr "" + +#: plugins/sudoers/defaults.c:204 plugins/sudoers/defaults.c:215 +#, c-format +msgid "%s: %s\n" +msgstr "%s: %s\n" + +#: plugins/sudoers/defaults.c:211 +#, c-format +msgid "%s: %.*s\n" +msgstr "%s: %.*s\n" + +#: plugins/sudoers/defaults.c:241 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:249 plugins/sudoers/defaults.c:259 +#: plugins/sudoers/defaults.c:279 plugins/sudoers/defaults.c:292 +#: plugins/sudoers/defaults.c:305 plugins/sudoers/defaults.c:318 +#: plugins/sudoers/defaults.c:331 plugins/sudoers/defaults.c:351 +#: plugins/sudoers/defaults.c:361 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "`%s' balorea baliogabea da `%s' aukerarentzat" + +#: plugins/sudoers/defaults.c:252 plugins/sudoers/defaults.c:262 +#: plugins/sudoers/defaults.c:270 plugins/sudoers/defaults.c:287 +#: plugins/sudoers/defaults.c:300 plugins/sudoers/defaults.c:313 +#: plugins/sudoers/defaults.c:326 plugins/sudoers/defaults.c:346 +#: plugins/sudoers/defaults.c:357 +#, c-format +msgid "no value specified for `%s'" +msgstr "ez da baliorik ezarri `%s'-(r)entzat" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:337 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:259 +#, c-format +msgid "internal error, sudo_setenv() overflow" +msgstr "" + +#: plugins/sudoers/env.c:289 +#, c-format +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:694 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/find_path.c:68 plugins/sudoers/find_path.c:107 +#: plugins/sudoers/find_path.c:122 plugins/sudoers/iolog.c:124 +#: plugins/sudoers/sudoers.c:868 toke.l:663 toke.l:814 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: gram.y:103 +#, c-format +msgid ">>> %s: %s near line %d <<<" +msgstr "" + +#: plugins/sudoers/group_plugin.c:91 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: plugins/sudoers/group_plugin.c:103 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:114 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:119 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:124 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:109 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:176 plugins/sudoers/sudoers.c:946 +#, c-format +msgid "unable to read %s" +msgstr "ezin da %s irakurri" + +#: plugins/sudoers/iolog.c:179 +#, c-format +msgid "invalid sequence number %s" +msgstr "" + +#: plugins/sudoers/iolog.c:225 plugins/sudoers/iolog.c:228 +#: plugins/sudoers/iolog.c:478 plugins/sudoers/iolog.c:483 +#: plugins/sudoers/iolog.c:489 plugins/sudoers/iolog.c:497 +#: plugins/sudoers/iolog.c:505 plugins/sudoers/iolog.c:513 +#: plugins/sudoers/iolog.c:521 +#, c-format +msgid "unable to create %s" +msgstr "ezin da %s sortu" + +#: plugins/sudoers/iolog_path.c:245 plugins/sudoers/sudoers.c:361 +#, c-format +msgid "unable to set locale to \"%s\", using \"C\"" +msgstr "" + +#: plugins/sudoers/ldap.c:363 +#, c-format +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: port too large" + +#: plugins/sudoers/ldap.c:386 +#, c-format +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "sudo_ldap_conf_add_ports: out of space expanding hostbuf" + +#: plugins/sudoers/ldap.c:415 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:444 +#, c-format +msgid "invalid uri: %s" +msgstr "baliogabeko uri-a: %s" + +#: plugins/sudoers/ldap.c:450 +#, c-format +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:454 +#, c-format +msgid "unable to mix ldaps and starttls" +msgstr "" + +#: plugins/sudoers/ldap.c:473 +#, c-format +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:536 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:932 +#, c-format +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:938 +#, c-format +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:946 +#, c-format +msgid "unable to build time filter" +msgstr "" + +#: plugins/sudoers/ldap.c:1044 +#, c-format +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "" + +#: plugins/sudoers/ldap.c:1539 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1541 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1588 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1596 +#, c-format +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1983 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2014 +#, c-format +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:2245 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:55 +#, c-format +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:79 +#, c-format +msgid "internal error, linux_audit_command() overflow" +msgstr "" + +#: plugins/sudoers/linux_audit.c:88 +#, c-format +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/logging.c:193 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:196 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:295 +msgid "user NOT in sudoers" +msgstr "erabiltzailea ez dago sudoers-en" + +#: plugins/sudoers/logging.c:297 +msgid "user NOT authorized on host" +msgstr "erabiltzailea ez dago baimendutako ostalarian" + +#: plugins/sudoers/logging.c:299 +msgid "command not allowed" +msgstr "komandua ez dago baimenduta" + +#: plugins/sudoers/logging.c:309 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s ez dago sudoers fitxatzegian. Gertaeraren berri emango da.\n" + +#: plugins/sudoers/logging.c:312 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s ez dago baimenduta sudo abiarazteko %s-(e)n. Gertaeraren berri emango da.\n" + +#: plugins/sudoers/logging.c:316 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Barkatu, %s erabiltzaileak ez luke sudo abiariazi beharko %s-(e)n.\n" + +#: plugins/sudoers/logging.c:319 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Barkatu, %s erabiltzaileak ez du '%s%s%s' %s%s%s bezala exekutatzeko baimenik %s-(e)n.\n" + +#: plugins/sudoers/logging.c:454 +#, c-format +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:461 plugins/sudoers/logging.c:518 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:511 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:530 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:564 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/logging.c:774 +#, c-format +msgid "internal error: insufficient space for log line" +msgstr "" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:369 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:371 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:386 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:395 +#, c-format +msgid "" +" Commands:\n" +"\t" +msgstr "" + +#: plugins/sudoers/plugin_error.c:100 plugins/sudoers/plugin_error.c:105 +msgid ": " +msgstr ": " + +#: plugins/sudoers/pwutil.c:244 +#, c-format +msgid "unable to cache uid %u (%s), already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:252 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:288 plugins/sudoers/pwutil.c:297 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:511 +#, c-format +msgid "unable to cache gid %u (%s), already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:519 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:548 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/set_perms.c:249 plugins/sudoers/set_perms.c:476 +#: plugins/sudoers/set_perms.c:710 +#, c-format +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:290 plugins/sudoers/set_perms.c:514 +#: plugins/sudoers/set_perms.c:748 plugins/sudoers/set_perms.c:882 +msgid "too many processes" +msgstr "prozesu gehiegi" + +#: plugins/sudoers/set_perms.c:943 plugins/sudoers/set_perms.c:959 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:952 +msgid "unable to get runas group vector" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:217 +msgid "unable to reset group vector" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:223 +msgid "unable to get group vector" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:266 +#, c-format +msgid "Matching Defaults entries for %s on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:279 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:292 +#, c-format +msgid "User %s may run the following commands on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:302 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:206 plugins/sudoers/sudoers.c:241 +#: plugins/sudoers/sudoers.c:876 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:210 +#, c-format +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:264 +#, c-format +msgid "unable to execute %s: %s" +msgstr "ezin da %s exekutatu: %s" + +#: plugins/sudoers/sudoers.c:311 +#, c-format +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:318 +#, c-format +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:407 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "data-zigiluaren jabea (%s): ez dago horrelako erabiltzailerik" + +#: plugins/sudoers/sudoers.c:423 +msgid "no tty" +msgstr "tty gabe" + +#: plugins/sudoers/sudoers.c:424 +#, c-format +msgid "sorry, you must have a tty to run sudo" +msgstr "barkatu, tty bat behar duzu sudo abiarazteko" + +#: plugins/sudoers/sudoers.c:470 +msgid "No user or host" +msgstr "Ez dago erabiltzaile edo ostalaririk" + +#: plugins/sudoers/sudoers.c:484 plugins/sudoers/sudoers.c:505 +#: plugins/sudoers/sudoers.c:506 plugins/sudoers/sudoers.c:1413 +#: plugins/sudoers/sudoers.c:1414 +#, c-format +msgid "%s: command not found" +msgstr "%s: komandoa ez da aurkitu" + +#: plugins/sudoers/sudoers.c:486 plugins/sudoers/sudoers.c:502 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/sudoers.c:491 +msgid "validation failure" +msgstr "balidazio hutsegitea" + +#: plugins/sudoers/sudoers.c:501 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:513 +#, c-format +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:860 +#, c-format +msgid "internal error, set_cmnd() overflow" +msgstr "" + +#: plugins/sudoers/sudoers.c:904 +#, c-format +msgid "fixed mode on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:908 +#, c-format +msgid "set group on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:911 +#, c-format +msgid "unable to set group on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:914 +#, c-format +msgid "unable to fix mode on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:927 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:929 +#, c-format +msgid "%s is mode 0%o, should be 0%o" +msgstr "" + +#: plugins/sudoers/sudoers.c:933 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:936 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:980 +#, c-format +msgid "only root can use `-c %s'" +msgstr "soilik root-ek erabili dezake `-c %s'" + +#: plugins/sudoers/sudoers.c:990 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1024 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1076 plugins/sudoers/testsudoers.c:342 +#, c-format +msgid "unknown group: %s" +msgstr "talde ezezaguna: %s" + +#: plugins/sudoers/sudoers.c:1108 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1114 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-en bidea: %s\n" + +#: plugins/sudoers/sudoers.c:1117 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-en bidea: %s\n" + +#: plugins/sudoers/sudoers.c:1119 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-en bidea: %s\n" + +#: plugins/sudoers/sudoers.c:1120 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-en bidea: %s\n" + +#: plugins/sudoers/sudoreplay.c:265 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:278 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:284 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:287 plugins/sudoers/visudo.c:174 +#, c-format +msgid "%s version %s\n" +msgstr "%s bertsioa %s\n" + +#: plugins/sudoers/sudoreplay.c:310 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:316 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "invalid log file %s" +msgstr "baliogabeko %s log fitxategia" + +#: plugins/sudoers/sudoreplay.c:343 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:369 +#, c-format +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:383 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:425 +#, c-format +msgid "writing to standard output" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:455 +#, c-format +msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:503 plugins/sudoers/sudoreplay.c:528 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:545 +#, c-format +msgid "too many parenthesized expressions, max %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:556 +#, c-format +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:562 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:576 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:580 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:586 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:599 +#, c-format +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:601 +#, c-format +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:603 +#, c-format +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:819 +#, c-format +msgid "invalid regex: %s" +msgstr "baliogabeko regex-a: %s" + +#: plugins/sudoers/sudoreplay.c:941 +#, c-format +msgid "usage: %s [-h] [-d directory] [-m max_wait] [-s speed_factor] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:944 +#, c-format +msgid "usage: %s [-h] [-d directory] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:953 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:955 +msgid "" +"\n" +"Options:\n" +" -d directory specify directory for session logs\n" +" -f filter specify which I/O type to display\n" +" -h display help message and exit\n" +" -l [expression] list available session IDs that match expression\n" +" -m max_wait max number of seconds to wait between events\n" +" -s speed_factor speed up or slow down output\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:228 +#, c-format +msgid "internal error, init_vars() overflow" +msgstr "" + +#: plugins/sudoers/testsudoers.c:304 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:307 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:308 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:308 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: toke.l:667 toke.l:793 toke.l:818 toke.l:904 plugins/sudoers/toke_util.c:111 +#: plugins/sudoers/toke_util.c:163 plugins/sudoers/toke_util.c:202 +msgid "unable to allocate memory" +msgstr "" + +#: toke.l:786 +msgid "too many levels of includes" +msgstr "include maila gehiegi" + +#: plugins/sudoers/toke_util.c:213 +msgid "fill_args: buffer overflow" +msgstr "fill_args: buffer overflow" + +#: plugins/sudoers/visudo.c:175 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:208 plugins/sudoers/auth/rfc1938.c:103 +#, c-format +msgid "you do not exist in the %s database" +msgstr "ez zara %s datubasean existitzen" + +#: plugins/sudoers/visudo.c:238 plugins/sudoers/visudo.c:470 +#, c-format +msgid "press return to edit %s: " +msgstr "sakatu intro %s editatzeko:" + +#: plugins/sudoers/visudo.c:300 plugins/sudoers/visudo.c:306 +#, c-format +msgid "write error" +msgstr "idazketa errorea" + +#: plugins/sudoers/visudo.c:360 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:365 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:371 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:394 +#, c-format +msgid "%s unchanged" +msgstr "%s aldatu gabea" + +#: plugins/sudoers/visudo.c:418 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:428 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:463 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:502 plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to set (uid, gid) of %s to (%d, %d)" +msgstr "" + +#: plugins/sudoers/visudo.c:506 plugins/sudoers/visudo.c:516 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:533 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:547 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:557 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:617 +msgid "What now? " +msgstr "Eta orain?" + +#: plugins/sudoers/visudo.c:631 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:668 +#, c-format +msgid "unable to execute %s" +msgstr "ezin da %s exekutatu" + +#: plugins/sudoers/visudo.c:675 +#, c-format +msgid "unable to run %s" +msgstr "ezin da %s abiarazi" + +#: plugins/sudoers/visudo.c:706 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:718 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:721 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:723 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:737 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%d, %d)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:744 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:783 +#, c-format +msgid "%s busy, try again later" +msgstr "%s okupatuta, saiatu berriz beranduago" + +#: plugins/sudoers/visudo.c:826 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:849 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "" + +#: plugins/sudoers/visudo.c:897 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:986 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:987 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:990 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:991 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1128 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "" + +#: plugins/sudoers/visudo.c:1185 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1187 +msgid "" +"\n" +"Options:\n" +" -c check-only mode\n" +" -f sudoers specify sudoers file location\n" +" -h display help message and exit\n" +" -q less verbose (quiet) syntax error messages\n" +" -s strict syntax checking\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:64 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:71 +msgid "invalid authentication type" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:79 +msgid "unable to setup authentication" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:59 +#, c-format +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:64 +#, c-format +msgid "unable to connect to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:93 +#: plugins/sudoers/auth/fwtk.c:126 +#, c-format +msgid "lost connection to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:114 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:127 +#, c-format +msgid "%s: unable to unparse princ ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:144 +#, c-format +msgid "%s: unable to resolve ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:188 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:204 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to initialize ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to store cred in ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:284 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:299 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:99 +msgid "unable to initialize PAM" +msgstr "ezin da PAM hasieratu" + +#: plugins/sudoers/auth/pam.c:142 +msgid "account validation failure, is your account locked?" +msgstr "" + +#: plugins/sudoers/auth/pam.c:146 +msgid "Account or password is expired, reset your password and try again" +msgstr "" + +#: plugins/sudoers/auth/pam.c:153 +#, c-format +msgid "pam_chauthtok: %s" +msgstr "pam_chauthtok: %s" + +#: plugins/sudoers/auth/pam.c:157 +msgid "Password expired, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:161 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:176 +#, c-format +msgid "pam_authenticate: %s" +msgstr "pam_authenticate: %s" + +#: plugins/sudoers/auth/pam.c:296 +msgid "Password: " +msgstr "Pasahitza: " + +#: plugins/sudoers/auth/pam.c:297 +msgid "Password:" +msgstr "Pasahitza:" + +#: plugins/sudoers/auth/securid.c:82 plugins/sudoers/auth/securid5.c:106 +#, c-format +msgid "unable to contact the SecurID server" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:81 +#, c-format +msgid "failed to initialise the ACE API library" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:115 +#, c-format +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:119 plugins/sudoers/auth/securid5.c:169 +#, c-format +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:174 +#, c-format +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:127 +#, c-format +msgid "SecurID communication failed" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:131 plugins/sudoers/auth/securid5.c:213 +#, c-format +msgid "unknown SecurID error" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:164 +#, c-format +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:106 +msgid "unable to initialize SIA session" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:124 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may mix standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:243 +#, c-format +msgid "%d incorrect password attempt" +msgid_plural "%d incorrect password attempts" +msgstr[0] "pasahitz sartze saiakera oker %d" +msgstr[1] "%d pasahitz sartze saiakera oker" + +#: plugins/sudoers/auth/sudo_auth.c:335 +msgid "Authentication methods:" +msgstr "Autentikazio metodoak:" diff --git a/plugins/sudoers/po/fi.mo b/plugins/sudoers/po/fi.mo new file mode 100644 index 0000000..b9253c4 Binary files /dev/null and b/plugins/sudoers/po/fi.mo differ diff --git a/plugins/sudoers/po/fi.po b/plugins/sudoers/po/fi.po new file mode 100644 index 0000000..7de0c7e --- /dev/null +++ b/plugins/sudoers/po/fi.po @@ -0,0 +1,3254 @@ +# Finnish messages for sudoers. +# This file is put in the public domain. +# This file is distributed under the same license as the sudo package. +# Jorma Karvonen , 2011-2017. +# Lauri Nurmi , 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.2rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-06-24 05:35-0600\n" +"PO-Revision-Date: 2020-08-14 19:19+0300\n" +"Last-Translator: Lauri Nurmi \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.4.1\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "syntaksivirhe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p, salasana: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p-käyttäjän salasana: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Salasana: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** TURVALLISUUStietoa %h-koneelta ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Yritä uudelleen." + +#: gram.y:203 gram.y:251 gram.y:258 gram.y:265 gram.y:272 gram.y:279 +#: gram.y:295 gram.y:319 gram.y:326 gram.y:333 gram.y:340 gram.y:347 +#: gram.y:410 gram.y:419 gram.y:430 gram.y:463 gram.y:470 gram.y:477 +#: gram.y:484 gram.y:511 gram.y:583 gram.y:590 gram.y:599 gram.y:608 +#: gram.y:625 gram.y:737 gram.y:744 gram.y:752 gram.y:758 gram.y:858 +#: gram.y:865 gram.y:872 gram.y:879 gram.y:886 gram.y:912 gram.y:919 +#: gram.y:926 gram.y:1068 gram.y:1347 lib/iolog/iolog_fileio.c:1101 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:283 +#: lib/iolog/iolog_json.c:313 lib/iolog/iolog_json.c:435 +#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115 +#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133 +#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196 +#: logsrvd/eventlog.c:223 logsrvd/sendlog.c:443 plugins/sudoers/alias.c:125 +#: plugins/sudoers/alias.c:132 plugins/sudoers/alias.c:148 +#: plugins/sudoers/audit.c:108 plugins/sudoers/audit.c:212 +#: plugins/sudoers/auth/bsdauth.c:143 plugins/sudoers/auth/kerb5.c:118 +#: plugins/sudoers/auth/kerb5.c:144 plugins/sudoers/auth/pam.c:669 +#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59 +#: plugins/sudoers/cvtsudoers.c:120 plugins/sudoers/cvtsudoers.c:161 +#: plugins/sudoers/cvtsudoers.c:178 plugins/sudoers/cvtsudoers.c:189 +#: plugins/sudoers/cvtsudoers.c:301 plugins/sudoers/cvtsudoers.c:429 +#: plugins/sudoers/cvtsudoers.c:562 plugins/sudoers/cvtsudoers.c:579 +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/cvtsudoers.c:757 +#: plugins/sudoers/cvtsudoers.c:765 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151 +#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235 +#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:371 +#: plugins/sudoers/cvtsudoers_ldif.c:426 plugins/sudoers/cvtsudoers_ldif.c:434 +#: plugins/sudoers/cvtsudoers_ldif.c:451 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:607 plugins/sudoers/defaults.c:626 +#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052 +#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84 +#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483 +#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:382 +#: plugins/sudoers/iolog_client.c:559 plugins/sudoers/iolog_client.c:678 +#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176 +#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723 +#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183 +#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431 +#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440 +#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743 +#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279 +#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743 +#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959 +#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:598 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:586 plugins/sudoers/logging.c:723 +#: plugins/sudoers/logging.c:1083 plugins/sudoers/match_command.c:243 +#: plugins/sudoers/match_command.c:391 plugins/sudoers/match_command.c:438 +#: plugins/sudoers/match_command.c:509 plugins/sudoers/match_digest.c:80 +#: plugins/sudoers/parse.c:193 plugins/sudoers/parse.c:205 +#: plugins/sudoers/parse.c:220 plugins/sudoers/parse.c:232 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:491 +#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262 +#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514 +#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649 +#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865 +#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967 +#: plugins/sudoers/sssd.c:146 plugins/sudoers/sssd.c:409 +#: plugins/sudoers/sssd.c:472 plugins/sudoers/sssd.c:516 +#: plugins/sudoers/sssd.c:563 plugins/sudoers/sssd.c:755 +#: plugins/sudoers/stubs.c:96 plugins/sudoers/stubs.c:104 +#: plugins/sudoers/sudoers.c:316 plugins/sudoers/sudoers.c:327 +#: plugins/sudoers/sudoers.c:337 plugins/sudoers/sudoers.c:380 +#: plugins/sudoers/sudoers.c:720 plugins/sudoers/sudoers.c:849 +#: plugins/sudoers/sudoers.c:894 plugins/sudoers/sudoers.c:1198 +#: plugins/sudoers/sudoreplay.c:553 plugins/sudoers/sudoreplay.c:556 +#: plugins/sudoers/sudoreplay.c:1260 plugins/sudoers/sudoreplay.c:1470 +#: plugins/sudoers/sudoreplay.c:1474 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:581 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:146 +#: plugins/sudoers/visudo.c:322 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:438 plugins/sudoers/visudo.c:616 +#: plugins/sudoers/visudo.c:936 plugins/sudoers/visudo.c:1024 +#: plugins/sudoers/visudo.c:1121 toke.l:864 toke.l:981 toke.l:1039 +msgid "unable to allocate memory" +msgstr "muistin varaaminen epäonnistui" + +#: gram.y:505 +msgid "a digest requires a path name" +msgstr "tiiviste vaatii polkunimen" + +#: gram.y:638 +msgid "invalid notbefore value" +msgstr "virheellinen notbefore-arvo" + +#: gram.y:646 +msgid "invalid notafter value" +msgstr "virheellinen notafter-arvo" + +#: gram.y:655 plugins/sudoers/policy.c:306 +msgid "timeout value too large" +msgstr "aikakatkaisuarvo on liian suuri" + +#: gram.y:657 plugins/sudoers/policy.c:308 +msgid "invalid timeout value" +msgstr "virheellinen aikavalvonta-arvo" + +#: gram.y:1347 lib/iolog/iolog_fileio.c:1101 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:282 lib/iolog/iolog_json.c:313 +#: lib/iolog/iolog_json.c:435 lib/iolog/iolog_json.c:713 +#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115 +#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133 +#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196 +#: logsrvd/eventlog.c:223 logsrvd/logsrvd.c:1208 logsrvd/logsrvd.c:1221 +#: logsrvd/logsrvd.c:1266 logsrvd/sendlog.c:443 logsrvd/sendlog.c:1302 +#: logsrvd/sendlog.c:1309 logsrvd/sendlog.c:1727 plugins/sudoers/audit.c:108 +#: plugins/sudoers/audit.c:212 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:120 plugins/sudoers/cvtsudoers.c:160 +#: plugins/sudoers/cvtsudoers.c:177 plugins/sudoers/cvtsudoers.c:188 +#: plugins/sudoers/cvtsudoers.c:300 plugins/sudoers/cvtsudoers.c:428 +#: plugins/sudoers/cvtsudoers.c:561 plugins/sudoers/cvtsudoers.c:578 +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/cvtsudoers.c:757 +#: plugins/sudoers/cvtsudoers.c:764 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:425 plugins/sudoers/cvtsudoers_ldif.c:433 +#: plugins/sudoers/cvtsudoers_ldif.c:450 plugins/sudoers/cvtsudoers_ldif.c:459 +#: plugins/sudoers/cvtsudoers_ldif.c:606 plugins/sudoers/defaults.c:626 +#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052 +#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84 +#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:132 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483 +#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:215 +#: plugins/sudoers/iolog_client.c:236 plugins/sudoers/iolog_client.c:249 +#: plugins/sudoers/iolog_client.c:382 plugins/sudoers/iolog_client.c:678 +#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176 +#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723 +#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183 +#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431 +#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440 +#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743 +#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279 +#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743 +#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959 +#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:677 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:325 plugins/sudoers/ldap_util.c:332 +#: plugins/sudoers/ldap_util.c:598 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1083 +#: plugins/sudoers/match_command.c:242 plugins/sudoers/match_command.c:390 +#: plugins/sudoers/match_command.c:437 plugins/sudoers/match_command.c:509 +#: plugins/sudoers/match_digest.c:80 plugins/sudoers/parse.c:192 +#: plugins/sudoers/parse.c:204 plugins/sudoers/parse.c:219 +#: plugins/sudoers/parse.c:231 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:120 plugins/sudoers/policy.c:129 +#: plugins/sudoers/policy.c:138 plugins/sudoers/policy.c:164 +#: plugins/sudoers/policy.c:291 plugins/sudoers/policy.c:306 +#: plugins/sudoers/policy.c:308 plugins/sudoers/policy.c:337 +#: plugins/sudoers/policy.c:346 plugins/sudoers/policy.c:389 +#: plugins/sudoers/policy.c:399 plugins/sudoers/policy.c:408 +#: plugins/sudoers/policy.c:417 plugins/sudoers/policy.c:491 +#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262 +#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514 +#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649 +#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865 +#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:145 +#: plugins/sudoers/sssd.c:409 plugins/sudoers/sssd.c:472 +#: plugins/sudoers/sssd.c:516 plugins/sudoers/sssd.c:563 +#: plugins/sudoers/sssd.c:755 plugins/sudoers/stubs.c:96 +#: plugins/sudoers/stubs.c:104 plugins/sudoers/sudoers.c:316 +#: plugins/sudoers/sudoers.c:327 plugins/sudoers/sudoers.c:337 +#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:720 +#: plugins/sudoers/sudoers.c:849 plugins/sudoers/sudoers.c:894 +#: plugins/sudoers/sudoers.c:1198 plugins/sudoers/sudoreplay.c:553 +#: plugins/sudoers/sudoreplay.c:556 plugins/sudoers/sudoreplay.c:1260 +#: plugins/sudoers/sudoreplay.c:1470 plugins/sudoers/sudoreplay.c:1474 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:581 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:146 plugins/sudoers/visudo.c:322 +#: plugins/sudoers/visudo.c:328 plugins/sudoers/visudo.c:438 +#: plugins/sudoers/visudo.c:616 plugins/sudoers/visudo.c:936 +#: plugins/sudoers/visudo.c:1024 plugins/sudoers/visudo.c:1121 toke.l:864 +#: toke.l:981 toke.l:1039 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/iolog/iolog_fileio.c:157 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s on olemassa, mutta ei ole hakemisto (0%o)" + +#: lib/iolog/iolog_fileio.c:187 lib/iolog/iolog_fileio.c:233 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "käskyn mkdir %s suorittaminen epäonnistui" + +#: lib/iolog/iolog_fileio.c:237 plugins/sudoers/visudo.c:733 +#: plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "tilan %s vaihtaminen arvoon 0%o epäonnistui" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "odotettiin JSON_STRINGiä, saatiin %d" + +#: lib/iolog/iolog_json.c:305 +msgid "missing double quote in name" +msgstr "" + +#: lib/iolog/iolog_json.c:392 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "odotettiin JSON_OBJECTia, saatiin %d" + +#: lib/iolog/iolog_json.c:441 lib/iolog/iolog_json.c:444 +#: lib/iolog/iolog_json.c:446 lib/iolog/iolog_json.c:538 +#: logsrvd/eventlog.c:228 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:563 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:435 plugins/sudoers/iolog.c:561 +#: plugins/sudoers/iolog.c:577 plugins/sudoers/ldap.c:516 +#: plugins/sudoers/ldap.c:747 plugins/sudoers/ldap.c:1080 +#: plugins/sudoers/ldap_conf.c:222 plugins/sudoers/ldap_conf.c:312 +#: plugins/sudoers/linux_audit.c:89 plugins/sudoers/logging.c:1088 +#: plugins/sudoers/policy.c:521 plugins/sudoers/policy.c:668 +#: plugins/sudoers/policy.c:678 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:916 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "sisäinen virhe, %s-ylivuoto" + +#: lib/iolog/iolog_json.c:607 lib/iolog/iolog_json.c:731 +msgid "unmatched close brace" +msgstr "" + +#: lib/iolog/iolog_json.c:616 +msgid "unexpected array" +msgstr "odottamaton taulukko" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:733 +msgid "unmatched close bracket" +msgstr "" + +#: lib/iolog/iolog_json.c:637 +msgid "unexpected string" +msgstr "odottamaton merkkijono" + +#: lib/iolog/iolog_json.c:647 +msgid "missing colon after name" +msgstr "puuttuva kaksoispiste nimen jälkeen" + +#: lib/iolog/iolog_json.c:658 lib/iolog/iolog_json.c:673 +#: lib/iolog/iolog_json.c:688 +msgid "unexpected boolean" +msgstr "odottamaton totuusarvo" + +#: lib/iolog/iolog_json.c:704 +msgid "unexpected number" +msgstr "odottamaton lukuarvo" + +# Ensimmäinen parametri on auth name +#: lib/iolog/iolog_json.c:741 +#, fuzzy, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s: todentamisnimen ’%s’ jäsentäminen epäonnistui: %s" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: virheellinen lokitiedosto" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: aikaleimakenttä puuttuu" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: aikaleima %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: käyttäjäkenttä puuttuu" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: suorita käyttäjänä-kenttä puuttuu" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: suorita ryhmänä-kenttä puuttuu" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "virhe luettaessa ajoitustiedostoa: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "virheellinen ajoitustiedostorivi: %s" + +#: logsrvd/eventlog.c:430 plugins/sudoers/logging.c:112 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: logsrvd/eventlog.c:459 plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s: (komento jatkui) %s" + +#: logsrvd/iolog_writer.c:936 +msgid "log is already complete, cannot be restarted" +msgstr "loki on jo valmis, ei voi aloittaa uudelleen" + +#: logsrvd/iolog_writer.c:967 +msgid "unable to restart log" +msgstr "lokia ei voi aloittaa uudelleen" + +# Avaamisen kohde voi olla timestamp file, sudoers file tai pathbuf +#: logsrvd/logsrv_util.c:98 logsrvd/logsrv_util.c:105 +#: plugins/sudoers/sudoreplay.c:353 plugins/sudoers/sudoreplay.c:359 +#, c-format +msgid "unable to open %s/%s" +msgstr "ei voi avata tiedostoa %s/%s" + +#: logsrvd/logsrv_util.c:132 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "puuttuva siirräntälokitiedosto %s/%s" + +# Ensimmäinen parametri on auth name +#: logsrvd/logsrv_util.c:139 +#, fuzzy, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s: todentamisnimen ’%s’ jäsentäminen epäonnistui: %s" + +# parametrina on path +#: logsrvd/logsrv_util.c:149 +#, fuzzy, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "symbolin ”%s” löytäminen polusta %s epäonnistui" + +#: logsrvd/logsrvd.c:230 logsrvd/logsrvd.c:299 logsrvd/logsrvd.c:343 +#: logsrvd/logsrvd.c:398 logsrvd/logsrvd.c:445 logsrvd/logsrvd.c:496 +#: logsrvd/logsrvd.c:528 logsrvd/logsrvd.c:560 +msgid "state machine error" +msgstr "tilakoneen virhe" + +#: logsrvd/logsrvd.c:239 +msgid "invalid AcceptMessage" +msgstr "virheellinen AcceptMessage" + +#: logsrvd/logsrvd.c:250 +msgid "error parsing AcceptMessage" +msgstr "virhe jäsennettäessä AcceptMessagea" + +#: logsrvd/logsrvd.c:257 +msgid "error creating I/O log" +msgstr "virhe luotaessa siirräntälokia" + +#: logsrvd/logsrvd.c:265 +msgid "error logging accept event" +msgstr "virhe hyväksymistapahtuman lokiin kirjaamisessa" + +#: logsrvd/logsrvd.c:308 +msgid "invalid RejectMessage" +msgstr "virheellinen RejectMessage" + +#: logsrvd/logsrvd.c:319 +msgid "error parsing RejectMessage" +msgstr "virhe jäsennettäessä RejectMessagea" + +#: logsrvd/logsrvd.c:325 +msgid "error logging reject event" +msgstr "virhe hylkäystapahtuman lokiin kirjaamisessa" + +#: logsrvd/logsrvd.c:430 +msgid "error logging alert event" +msgstr "virhe hälytystapahtuman lokiin kirjaamisessa" + +#: logsrvd/logsrvd.c:451 logsrvd/logsrvd.c:502 logsrvd/logsrvd.c:534 +msgid "protocol error" +msgstr "protokollavirhe" + +#: logsrvd/logsrvd.c:461 +msgid "error writing IoBuffer" +msgstr "virhe kirjoitettaessa IoBufferia" + +#: logsrvd/logsrvd.c:513 +msgid "error writing ChangeWindowSize" +msgstr "virhe kirjoitettaessa ChangeWindowSizeä" + +#: logsrvd/logsrvd.c:545 +msgid "error writing CommandSuspend" +msgstr "virhe kirjoitettaessa CommandSuspendia" + +#: logsrvd/logsrvd.c:630 +msgid "unrecognized ClientMessage type" +msgstr "tunnistamaton ClientMessage-tyyppi" + +#: logsrvd/logsrvd.c:895 +msgid "client message too large" +msgstr "asiakassanoma on liian suuri" + +#: logsrvd/logsrvd.c:1125 logsrvd/logsrvd.c:1133 +#, fuzzy, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "komennon %s suorittaminen epäonnistui: %s" + +#: logsrvd/logsrvd.c:1153 logsrvd/logsrvd.c:1161 +#, fuzzy, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "komennon %s suorittaminen epäonnistui: %s" + +#: logsrvd/logsrvd.c:1197 +#, fuzzy, c-format +msgid "unable to get TLS server method: %s" +msgstr "tietokoneen %s ratkaiseminen epäonnistui" + +#: logsrvd/logsrvd.c:1202 +#, fuzzy, c-format +msgid "unable to create TLS context: %s" +msgstr "Ssl-kontekstia ei voi alustaa: %s" + +#: logsrvd/logsrvd.c:1209 plugins/sudoers/iolog_client.c:237 +#, fuzzy, c-format +msgid "unable to load certificate %s" +msgstr "kohteen %s lataaminen epäonnistui: %s" + +#: logsrvd/logsrvd.c:1222 plugins/sudoers/iolog_client.c:217 +#, fuzzy, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "Varmennetta ei voi ladata ssl-kontekstiin: %s" + +#: logsrvd/logsrvd.c:1267 plugins/sudoers/iolog_client.c:250 +#, c-format +msgid "unable to load private key %s" +msgstr "yksityistä avainta %s ei voi ladata" + +#: logsrvd/logsrvd.c:1284 logsrvd/logsrvd.c:1293 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "diffie-hellman-parametreja ei voi asettaa: %s" + +#: logsrvd/logsrvd.c:1306 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "protokollaversion vähimmäisversiota ei voi asettaa TLS 1.2:ksi: %s" + +#: logsrvd/logsrvd.c:1491 +#, fuzzy +msgid "unable to get remote IP addr" +msgstr "vaihtaminen root gid -tunnisteeksi epäonnistui" + +#: logsrvd/logsrvd.c:1519 plugins/sudoers/iolog_client.c:264 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Käyttäjätietoja ei voi liittää ssl-objektiin: %s" + +#: logsrvd/logsrvd.c:1527 logsrvd/logsrvd.c:1649 logsrvd/logsrvd.c:1749 +#: logsrvd/sendlog.c:1106 logsrvd/sendlog.c:1462 logsrvd/sendlog.c:1477 +#: logsrvd/sendlog.c:1535 plugins/sudoers/iolog.c:921 +#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1152 +#: plugins/sudoers/iolog_client.c:109 plugins/sudoers/iolog_client.c:325 +#: plugins/sudoers/iolog_client.c:341 plugins/sudoers/iolog_client.c:387 +#: plugins/sudoers/iolog_client.c:567 plugins/sudoers/iolog_client.c:574 +#: plugins/sudoers/iolog_client.c:1150 plugins/sudoers/iolog_client.c:1186 +#: plugins/sudoers/iolog_client.c:1194 plugins/sudoers/iolog_client.c:1254 +#: plugins/sudoers/iolog_client.c:1361 plugins/sudoers/iolog_client.c:1477 +#: plugins/sudoers/iolog_client.c:1759 plugins/sudoers/iolog_client.c:1767 +#: plugins/sudoers/sudoreplay.c:513 plugins/sudoers/sudoreplay.c:560 +#: plugins/sudoers/sudoreplay.c:792 plugins/sudoers/sudoreplay.c:904 +#: plugins/sudoers/sudoreplay.c:994 plugins/sudoers/sudoreplay.c:1009 +#: plugins/sudoers/sudoreplay.c:1016 plugins/sudoers/sudoreplay.c:1023 +#: plugins/sudoers/sudoreplay.c:1030 plugins/sudoers/sudoreplay.c:1037 +#: plugins/sudoers/sudoreplay.c:1164 +msgid "unable to add event to queue" +msgstr "tapahtuman lisääminen jonoon epäonnistui" + +#: logsrvd/logsrvd.c:1703 logsrvd/logsrvd.c:1937 +#, fuzzy +msgid "unable setup listen socket" +msgstr "asetustodentaminen epäonnistui" + +#: logsrvd/logsrvd.c:1843 logsrvd/sendlog.c:123 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - lähetä sudon siirräntäloki etäpalvelimelle\n" +"\n" + +#: logsrvd/logsrvd.c:1846 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Valitsimet:\n" +" -f, --file asetustiedoston polku\n" +" -h, --help näytä opaste ja poistu\n" +" -n, --no-fork älä haarauta, vaan suorita edustalla\n" +" -R, --random-drop yhteyden katkeamisen todennäköisyys-%\n" +" -V, --version näytä versiotiedot ja poistu\n" + +#: logsrvd/logsrvd.c:1898 logsrvd/sendlog.c:1700 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Protobuf-C:n versio 1.3 tai uudempi vaaditaan" + +#: logsrvd/logsrvd.c:1916 +#, c-format +msgid "invalid random drop value: %s" +msgstr "virheellinen satunnaispudotusarvo: %s" + +#: logsrvd/logsrvd.c:1920 logsrvd/sendlog.c:1750 +#: plugins/sudoers/cvtsudoers.c:229 plugins/sudoers/sudoreplay.c:300 +#: plugins/sudoers/visudo.c:178 +#, c-format +msgid "%s version %s\n" +msgstr "%s versio %s\n" + +#: logsrvd/logsrvd_conf.c:393 +msgid "TLS not supported" +msgstr "TLS ei ole tuettu" + +#: logsrvd/logsrvd_conf.c:405 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:471 logsrvd/logsrvd_conf.c:715 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: ei ole täydellinen polku" + +# Ensimmäinen parametri on auth name +#: logsrvd/logsrvd_conf.c:829 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d täsmäämätön ”[”: %s" + +#: logsrvd/logsrvd_conf.c:840 +#, fuzzy, c-format +msgid "%s:%d invalid config section: %s" +msgstr "virheellinen suodatinvalitsin: %s" + +#: logsrvd/logsrvd_conf.c:848 +#, fuzzy, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "virheellinen ajoitustiedostorivi: %s" + +#: logsrvd/logsrvd_conf.c:854 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:868 +#, c-format +msgid "invalid value for %s: %s" +msgstr "virheellinen %s-arvo: %s" + +#: logsrvd/logsrvd_conf.c:876 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d tuntematon avain: %s" + +#: logsrvd/logsrvd_conf.c:1032 +#, fuzzy, c-format +msgid "unknown syslog facility %s" +msgstr "tuntematon kirjautumisluokka: %s" + +#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1040 +#: logsrvd/logsrvd_conf.c:1044 +#, c-format +msgid "unknown syslog priority %s" +msgstr "tuntematon syslog-prioriteetti %s" + +#: logsrvd/sendlog.c:126 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" + +#: logsrvd/sendlog.c:163 plugins/sudoers/iolog_client.c:433 +#, fuzzy, c-format +msgid "unable to look up %s:%s: %s" +msgstr "kohteen %s lataaminen epäonnistui: %s" + +#: logsrvd/sendlog.c:186 +#, fuzzy +msgid "unable to get server IP addr" +msgstr "vaihtaminen root gid -tunnisteeksi epäonnistui" + +#: logsrvd/sendlog.c:240 plugins/sudoers/sudoreplay.c:852 +#, fuzzy, c-format +msgid "unable to read %s/%s: %s" +msgstr "kohteen %s lataaminen epäonnistui: %s" + +#: logsrvd/sendlog.c:261 plugins/sudoers/iolog_client.c:684 +#, c-format +msgid "client message too large: %zu" +msgstr "asiakassanoma on liian suuri: %zu" + +#: logsrvd/sendlog.c:791 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: kirjoituspuskuri on jo käytössä" + +#: logsrvd/sendlog.c:843 plugins/sudoers/iolog.c:845 +#: plugins/sudoers/iolog.c:914 +#, c-format +msgid "unexpected I/O event %d" +msgstr "odottamaton siirräntätapahtuma %d" + +#: logsrvd/sendlog.c:889 logsrvd/sendlog.c:906 logsrvd/sendlog.c:940 +#: plugins/sudoers/iolog_client.c:1155 plugins/sudoers/iolog_client.c:1225 +#: plugins/sudoers/iolog_client.c:1273 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: odottamaton tila %d" + +#: logsrvd/sendlog.c:912 plugins/sudoers/iolog_client.c:1231 +msgid "invalid ServerHello" +msgstr "virheellinen ServerHello" + +#: logsrvd/sendlog.c:976 plugins/sudoers/iolog_client.c:1317 +#, c-format +msgid "error message received from server: %s" +msgstr "virhesanoma vastaanotettu palvelimelta: %s" + +#: logsrvd/sendlog.c:989 plugins/sudoers/iolog_client.c:1330 +#, c-format +msgid "abort message received from server: %s" +msgstr "keskeytyssanoma vastaanotettu palvelimelta: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/iolog_client.c:1349 +#, fuzzy +msgid "unable to unpack ServerMessage" +msgstr "audit-viestin lähettäminen epäonnistui" + +#: logsrvd/sendlog.c:1048 plugins/sudoers/iolog_client.c:1382 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: odottamaton type_case-arvo %d" + +#: logsrvd/sendlog.c:1077 +msgid "timeout reading from server" +msgstr "aikakatkaisu luettaessa palvelimelta" + +#: logsrvd/sendlog.c:1155 +msgid "premature EOF" +msgstr "ennenaikainen tiedoston loppu" + +#: logsrvd/sendlog.c:1168 plugins/sudoers/iolog_client.c:1536 +#, c-format +msgid "server message too large: %u" +msgstr "palvelinsanoma on liian suuri: %u" + +#: logsrvd/sendlog.c:1219 +msgid "timeout writing to server" +msgstr "aikakatkaisu kirjoitettaessa palvelimelle" + +#: logsrvd/sendlog.c:1438 plugins/sudoers/iolog_client.c:297 +msgid "TLS handshake timeout occurred" +msgstr "TLS-kättelyn aikakatkaisu tapahtui" + +#: logsrvd/sendlog.c:1457 logsrvd/sendlog.c:1472 +#: plugins/sudoers/iolog_client.c:319 plugins/sudoers/iolog_client.c:335 +msgid "unable to set event" +msgstr "tapahtuman asettaminen ei onnistu" + +#: logsrvd/sendlog.c:1482 logsrvd/sendlog.c:1486 +#, c-format +msgid "TLS connection failed: %s" +msgstr "TLS-yhteys epäonnistui: %s" + +#: logsrvd/sendlog.c:1519 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Ssl-kontekstia ei voi alustaa: %s" + +#: logsrvd/sendlog.c:1524 plugins/sudoers/iolog_client.c:259 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Ssl-objektia ei voi varata: %s" + +#: logsrvd/sendlog.c:1529 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Sokettia ei voi liittää SSL-objektiin: %s" + +#: logsrvd/sendlog.c:1773 +msgid "both restart point and iolog ID must be specified" +msgstr "sekä aloituspiste että iolog-tunnus on annettava" + +#: logsrvd/sendlog.c:1777 +msgid "a restart point may not be set when no I/O is sent" +msgstr "uudelleenkäynnistyspistettä ei ehkä aseteta, kun I/O:ta ei lähetetä" + +#: logsrvd/sendlog.c:1852 +#, c-format +msgid "exited prematurely with state %d" +msgstr "poistui ennenaikaisesti tilalla %d" + +#: logsrvd/sendlog.c:1853 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "kulunut aika lähetetty palvelimelle [%lld, %ld]" + +#: logsrvd/sendlog.c:1855 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "toimituspiste vastaanotettu palvelimelta [%lld, %ld]" + +#: plugins/sudoers/alias.c:144 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias ”%s” on jo määritelty" + +#: plugins/sudoers/auth/aix_auth.c:198 plugins/sudoers/logging.c:784 +msgid "unable to fork" +msgstr "haarauttaminen epäonnistui" + +#: plugins/sudoers/auth/aix_auth.c:278 +#, c-format +msgid "unable to change password for %s" +msgstr "%s-käyttäjän salasanan vaihtaminen epäonnistui" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kirjautumisluokan saaminen käyttäjälle %s epäonnistui" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "bsd-todentamisen aloittaminen epäonnistui" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "virheellinen todennustyyppi" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "BSD-todennuksen alustaminen epäonnistui" + +#: plugins/sudoers/auth/bsdauth.c:180 +msgid "your account has expired" +msgstr "tilisi on vanhentunut" + +#: plugins/sudoers/auth/bsdauth.c:182 +msgid "approval failed" +msgstr "hyväksyntä epäonnistui" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "fwtk config -asetuksen lukeminen epäonnistui" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "todentamispalvelimelle yhdistäminen epäonnistui" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "kadotettiin yhteys todentamispalvelimelle" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"todentamispalvelinvirhe:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: valtuutetun (’%s’) muuntaminen merkkijonoksi epäonnistui: %s" + +# Ensimmäinen parametri on auth name +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: todentamisnimen ’%s’ jäsentäminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: valtuustietovälimuistin ratkaiseminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: muistin varaaminen valitsimille epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: valtuustietojen hakeminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: valtuustietovälimuistin alustaminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: valtuustietojen tallentaminen valtuustietovälimuistiin epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: tietokoneen valtuutetun hakeminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT-lipun todentaminen epäonnistui! Mahdollinen hyökkäys!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "PAMin alustaminen epäonnistui: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM-todentamisvirhe: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "tilikelpuutushäiriö, onko tilisi lukittu?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Tili tai salasana on vanhentunut, nollaa salasanasi tai yritä uudelleen" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "vanhentuneen salasanan vaihtaminen epäonnistui: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Salasana vanhentunut, ota yhteyttä järjestelmän ylläpitäjään" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Tili vanhentunut tai PAM-asetuksista puuttuu ”account”-lohko sudo-komennolle, ota yhteyttä järjestelmän ylläpitäjään" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, fuzzy, c-format +msgid "PAM account management error: %s" +msgstr "PAM-todentamisvirhe: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:242 +#, c-format +msgid "you do not exist in the %s database" +msgstr "ei ole olemassa %s-tietokannassa" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "ACE API -kirjaston alustaminen epäonnistui" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "yhteyden ottaminen SecurID-palvelimeen epäonnistui" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "Käyttäjätunniste lukittu SecurID-todennukselle" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "virheellinen käyttäjänimipituus kohteelle SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "virheellinen todentamiskäsittelijä kohteelle SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "SecurID-viestintä epäonnistui" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:212 +msgid "unknown SecurID error" +msgstr "tuntematon SecurID-virhe" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "virheellinen salasanakoodipituus kohteelle SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:124 +msgid "unable to initialize SIA session" +msgstr "SIA-istunnon alustaminen epäonnistui" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "virheelliset todennusmetodit" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Virheellisiä todennusmenetelmiä käännetty sudo-ohjelmaan! Yksittäisiä ja ei-yksittäisiä todennuksia ei voi sekoittaa keskenään." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "ei todennusmenetelmiä" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Sudo-ohjelmaan ei ole käännetty todentamismenelmiä! Jos haluat kääntää pois todentamisen, käytä asetusvalitsinta --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Todentamismenetelmien alustaminen epäonnistui." + +#: plugins/sudoers/auth/sudo_auth.c:473 +msgid "Authentication methods:" +msgstr "Todennusmenetelmät:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Audit-ehdon määrittely epäonnistui" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "commit-toiminnon suorittaminen audit-tietueelle epäonnistui" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Luotamme, että olet saanut tavanomaisen saarnan paikalliselta järjestelmän\n" +"ylläpitäjältä. Yleensä se tiivistyy kolmeen asiaan:\n" +"\n" +" #1) Kunnioita muiden yksityisyyttä.\n" +" #2) Ajattele ennen kuin kirjoitat.\n" +" #3) Suuren voiman mukana tulee suuri vastuu.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:763 plugins/sudoers/sudoers.c:811 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "tuntematon uid-käyttäjätunniste: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/iolog.c:117 +#: plugins/sudoers/policy.c:1037 plugins/sudoers/sudoers.c:387 +#: plugins/sudoers/sudoers.c:388 plugins/sudoers/sudoers.c:1240 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:392 +#, c-format +msgid "unknown user: %s" +msgstr "tuntematon käyttäjä: %s" + +#: plugins/sudoers/cvtsudoers.c:195 +#, c-format +msgid "order increment: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:211 +#, c-format +msgid "starting order: %s: %s" +msgstr "aloitusjärjestys: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:221 +#, c-format +msgid "order padding: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:231 plugins/sudoers/visudo.c:180 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s kielioppiversio %d\n" + +#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "syötemuotoa %s ei tueta" + +#: plugins/sudoers/cvtsudoers.c:263 +#, c-format +msgid "unsupported output format %s" +msgstr "tuotosmuotoa %s ei tueta" + +#: plugins/sudoers/cvtsudoers.c:315 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: syöte- ja tulostetiedostojen on oltava erilaiset" + +#: plugins/sudoers/cvtsudoers.c:331 plugins/sudoers/sudoers.c:181 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:248 +#: plugins/sudoers/visudo.c:604 plugins/sudoers/visudo.c:927 +msgid "unable to initialize sudoers default values" +msgstr "sudoers-oletusarvojen alustaminen epäonnistui" + +#: plugins/sudoers/cvtsudoers.c:417 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:476 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: tuntematon avainsana: %s" + +#: plugins/sudoers/cvtsudoers.c:522 +#, c-format +msgid "invalid defaults type: %s" +msgstr "virheellisten oletusarvojen tyyppi: %s" + +#: plugins/sudoers/cvtsudoers.c:545 +#, c-format +msgid "invalid suppression type: %s" +msgstr "virheellinen vaiennustyyppi: %s" + +#: plugins/sudoers/cvtsudoers.c:585 plugins/sudoers/cvtsudoers.c:599 +#, c-format +msgid "invalid filter: %s" +msgstr "virheellinen suodatin: %s" + +# Avaamisen kohde voi olla timestamp file, sudoers file tai pathbuf +#: plugins/sudoers/cvtsudoers.c:618 plugins/sudoers/cvtsudoers.c:635 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:861 +#: plugins/sudoers/cvtsudoers_ldif.c:680 plugins/sudoers/sudoers.c:986 +#: plugins/sudoers/sudoreplay.c:1436 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:923 +#, c-format +msgid "unable to open %s" +msgstr "kohteen %s avaaminen epäonnistui" + +#: plugins/sudoers/cvtsudoers.c:638 plugins/sudoers/visudo.c:932 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "tiedoston %s jäsentäminen epäonnistui, tuntematon virhe" + +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/visudo.c:949 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "jäsentämisvirhe tiedostossa %s lähellä riviä %d\n" + +#: plugins/sudoers/cvtsudoers.c:649 plugins/sudoers/visudo.c:952 +#, c-format +msgid "parse error in %s\n" +msgstr "jäsentämisvirhe tiedostossa %s\n" + +# Kirjoittamisen kohde voi olla timestamp file tai pathbuf +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/sudoreplay.c:1125 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "kohteeseen %s kirjoittaminen epäonnistui" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "%s - muunna sudoers-tiedostomuotojen välillä\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:702 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "tuntematon oletusrivi \"%s\"" + +#: plugins/sudoers/cvtsudoers_json.c:640 plugins/sudoers/cvtsudoers_json.c:653 +#: plugins/sudoers/cvtsudoers_ldif.c:345 plugins/sudoers/cvtsudoers_ldif.c:356 +#: plugins/sudoers/ldap.c:502 +msgid "unable to get GMT time" +msgstr "GMT-ajan noutaminen epäonnistui" + +#: plugins/sudoers/cvtsudoers_json.c:643 plugins/sudoers/cvtsudoers_json.c:656 +#: plugins/sudoers/cvtsudoers_ldif.c:348 plugins/sudoers/cvtsudoers_ldif.c:359 +#: plugins/sudoers/ldap.c:508 +msgid "unable to format timestamp" +msgstr "aikaleiman muotoileminen epäonnistui" + +#: plugins/sudoers/cvtsudoers_ldif.c:632 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "liian monta sudoers-merkintää, enimmäismäärä %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:675 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "SUDOERS_BASE-ympäristömuuttujaa ei ole määritelty eikä -b-valitsinta annettu." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-apuneuvo, jos syslog-lokia käytetään kirjautumista varten: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Käytettävä syslog-prioriteetti, kun käyttäjä todennetaan onnistuneesti: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Käytettävä syslog-prioriteetti, kun käyttäjän todennus epäonnistui: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Laita OPT-kehote omalle rivilleen" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ohita ’.’ $PATHissa" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Lähetä aina sähköpostia, kun sudo suoritetaan" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Lähetä sähköpostia, jos käyttäjän todennus epäonnistuu" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Lähetä sähköpostia, jos käyttäjä ei ole sudoers-määrittelyssä" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Lähetä sähköpostia, jos käyttäjä ei ole tällä tietokoneella sudoers-määrittelyssä" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Lähetä sähköpostia, jos käyttäjän ei sallita suorittaa komentoa" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Lähetä sähköpostia, jos käyttäjä yrittää suorittaa komennon" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Käytä erillistä aikaleimaa jokaiselle käyttäjä/tty -yhdistelmälle" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Saarnaa ensimmäistä kertaa sudo-ohjelmaa käyttävälle" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Sudo-saarnan sisältävä tiedosto: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Vaadi käyttäjien todennus oletuksena" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root voi suorittaa sudo-ohjelman" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Kirjaa tietokonenimi (ei-syslog)lokitiedostoon" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Kirjaa vuosi (ei-syslog)lokitiedostoon" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Jos sudo-ohjelmaa kutsutaan ilman argumentteja, käynnistä käyttöjärjestelmäkuori" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Aseta $HOME-muuttujaksi kohdekäyttäjä kun käyttöjärjestelmäkuori käynnistetään valitsimella -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Aseta $HOME-muuttujaksi aina kohdekäyttäjän kotihakemisto" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Salli jotain tietojenkeräystä hyödyllisten virheilmoitusten tarjoamiseksi" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Vaadi täysin rakennettu tietokonenimi suoders-tiedostossa" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Solvaa käyttäjiä, kun he kirjoittavat väärän salasanan" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Salli käyttäjien suorittaa sudo-ohjelma vain jos heillä on tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo noudattaa EDITOR-ympäristömuuttujaa" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Kysy root-käyttäjän salasana, ei käyttäjän" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Kysy runas_default-käyttäjän salasana, ei käyttäjän" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Kysy kohdekäyttäjän salasana, ei käyttäjän" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Käytä oletuksia kohdekäyttäjän kirjautumisluokassa, jos siinä on yhtään" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Aseta LOGNAME- ja USER-ympäristömuuttujat" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Aseta vain voimassa oleva uid-käyttäjätunniste kohdekäyttäjälle, ei oikeaa uid-tunnistetta" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Älä alusta ryhmävektoria kohdekäyttäjän vastaavaan arvoon" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Pituus, jossa pitkät lokitiedostorivit jaetaan seuraavalle riville (0 ei jaeta): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Todennusaikaleiman aikavalvonta: %.1f minuuttia" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Salasanakehotteen aikavalvonta: %.1f minuuttia" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Salasanayritysten lukumäärä: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Käytettävä umask-määrittely tai 0777 käytettäväksi käyttäjän umask-määrittelyksi: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Polku lokitiedostoon: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Sähköpostiohjelman polku: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Sähköpostiohjelman liput: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Sähköpostin vastaanottajan osoite: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Sähköpostin lähettäjän osoite: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Sähköpostiviestien aihe-rivi: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Virheellinen salasanaviesti: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Polku luentotilahakemistoon: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Polku todennusaikaleimahakemistoon: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Todennusaikaleimahakemiston omistaja: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Käyttäjät tässä ryhmässä on vapautettu salasana- ja PATH-vaatimuksista: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Oletussalasanakehote: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Jos asetettu, salasanakehote korvaa järjestelmäkehotteen kaikissa tapauksissa." + +# Tämä on tekemisessä runas_default -määrittelyn kanssa +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Oletuskäyttäjä suorittaa komennot käyttäjänä: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Arvo, jolla korvataan käyttäjän $PATH-asetus: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Visudo-editorin käyttämä polku: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kun vaaditaan salasana ’list’-näennäiskomennolle: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kun vaaditaan salasana ’verify’-näennäiskomennolle: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Esilataa vale-exec-funktiot, jotka sisältyvät sudo_noexec-kirjastoon" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Jos LDAP-hakemisto on ylhäällä, ohitammeko paikallisen sudoers-tiedoston" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Tiedostokuvaajat >= %d suljetaan ennen komennon suoritusta" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Jos asetettu, käyttäjä voi korvata ”closefrom”-arvon valitsimella -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Salli käyttäjien asettaa mielivaltaisia ympäristömuuttujia" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Nollaa ympäristö muuttujien oletusjoukoksi" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Ympäristömuuttujat, joille tehdään järkevyystarkistus:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Poistettavat ympäristömuuttujat:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Säilytettävät ympäristömuuttujat:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Uudessa turva-asiayhteydessä käytettävä SELinux-rooli: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Uudessa turva-asiayhteydessä käytettävä SELinux-tyyppi: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Polku sudo-kohtaiseen ympäristötiedostoon: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Polku rajoitettuun sudo-kohtaiseen ympäristötiedostoon: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Locale-asetus, jota käytetään sudoers-jäsentämisessä: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Salli sudo-ohjelman kysyä salasana vieläpä jos se olisi näkyvä" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Tarjoa visuaalista palautetta salasanakehotteelta silloin kun on käyttäjäsyöte" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Käyttää nopeampaa jokerimerkkien korvausta, joka on epätarkempi, mutta ei lue tiedostojärjestelmää" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Sudoers umask korvaa käyttäjän umask-määrittelyn, vieläpä jos se on sallivampi" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Kirjaa lokiin käyttäjän syöte suoritettavalle komennolle" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Kirjaa lokiin suoritettavan komennon tuloste" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Tiivistä siirräntälokit käyttäen zlib-ohjelmaa" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Suorita aina komennot näennäis-tty:ssä" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Lisäosa ei-Unix-ryhmätuelle: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Hakemisto, johon tallennetaan syöte-/tulostelokit: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Tiedosto, johon tallennetaan syöte-/tulosteloki: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Lisää rivi utmp-/utmpx-tiedostoon, kun varataan pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Aseta käyttäjäksi utmp-tiedostoon suorittava käyttäjä, ei kutsuva käyttäjä" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Sallittujen käyttöoikeuksien joukko: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Rajoitettujen käyttöoikeuksien joukko: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Suorita komentoja pty:llä taustalla" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Käytettävä PAM-palvelunimi: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Kirjautumiskomentotulkeille käytettävä PAM-palvelunimi: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Yritys perustaa PAM-valtuustiedot kohdekäyttäjälle" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Luo uusi PAM-istunto suoritettavalle komennolle" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "" + +#: plugins/sudoers/def_data.c:406 +#, fuzzy, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Suurin siirräntälokin sarjanumero: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Ota käyttöön sudoers-verkkoryhmätuki" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Tarkista yläpuolella olevan hakemistojen kirjoituskelpoisuus kun tiedostoja muokataan sudoedit-ohjelmalla" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Seuraa symbolisia linkejä kun tiedostoja muokataan sudoedit-ohjelmalla" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Kysy ryhmälisäosaa tuntemattomille järjestelmäryhmille" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Täsmäävät verkkoryhmät perustuen koko monikolle: käyttäjä, tietokone ja verkkotunnus" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Salli komentojen suorittaminen silloinkin kun sudo ei kykene kirjoittamaan valvontatarkastuslokiin" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Salli komentojen suorittaminen silloinkin kun sudo ei kykene kirjoittamaan siirtolokiin" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Salli komentojen suorittaminen silloinkin kun sudo ei kykene kirjoittamaan lokitiedostoon" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Ratkaise sudoers-ryhmät ja täsmäytä ryhmätunnisteeseen, ei nimeen" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Lokirivit, jotka ovat pitempiä kuin tämä arvo, jaetaan useisiin syslog-viesteihin: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Käyttäjä, joka omistaa siirräntälokitiedostot: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Ryhmä, joka omistaa siirräntälokitiedostot: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Tiedostotila käytettäväksi siirräntälokitiedostoissa: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Suorita komentoja tiedostokuvaan avulla eikä polun avulla: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ohita tuntemattomat Defaults-rivit sudoers-tiedostossa sen sijaan että tuottaisit varoituksia" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Sekuntimäärä, jossa komento päätetään: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Salli käyttäjän määritellä aikavalvonta komentorivillä" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Tyhjennä siirräntälokitiedot levylle välittömästi sen sijaan että puskuroisit ne" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Sisällytä prosessitunniste, kun kirjataan syslog-tiedostoon" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Todennusaikaleimatietueen tyyppi: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "todentamisen virheviesti: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Älä huomioi kirjainkokoa käyttäjänimien täsmäyksessä" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Älä huomioi kirjainkokoa ryhmänimien täsmäyksessä" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Kirjaa lokiin, kun sudoers sallii komennon" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Kirjaa lokiin, kun sudoers kieltää komennon" + +#: plugins/sudoers/def_data.c:510 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "" + +#: plugins/sudoers/def_data.c:514 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:518 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Ota SO_KEEPALIVE-valinta käyttöön lokipalvelimeen yhdistetylle soketille" + +#: plugins/sudoers/def_data.c:522 +#, fuzzy, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Polku sudo-kohtaiseen ympäristötiedostoon: %s" + +#: plugins/sudoers/def_data.c:526 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Sudoers-varmennetiedoston polku: %s" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Sudoersin yksityisen avaintiedoston polku: %s" + +#: plugins/sudoers/def_data.c:534 +#, fuzzy +msgid "Verify that the log server's certificate is valid" +msgstr "Sudoers-varmennetiedoston polku: %s" + +#: plugins/sudoers/def_data.c:538 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "" + +#: plugins/sudoers/def_data.c:542 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Salli komentojen suorittaminen vain käyttäjänä, jolla on kelvollinen kuori" + +#: plugins/sudoers/def_data.c:546 +msgid "Set the pam remote user to the user running sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:550 +msgid "Set the pam remote host to the local host name" +msgstr "" + +#: plugins/sudoers/defaults.c:183 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d tuntematon oletusrivi ”%s”" + +#: plugins/sudoers/defaults.c:186 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: tuntematon oletusrivi ”%s”" + +# parametrinä on variable +#: plugins/sudoers/defaults.c:229 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d arvoa ei ole määritelty muuttujalle ”%s”" + +# parametrinä on variable +#: plugins/sudoers/defaults.c:232 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: arvoa ei ole määritelty muuttujalle ”%s”" + +# Parametri on muuttuja +#: plugins/sudoers/defaults.c:252 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d muuttujan ”%s” arvojen on alettava merkillä ’/’" + +# Parametri on muuttuja +#: plugins/sudoers/defaults.c:255 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: muuttujan ”%s” arvojen on alettava merkillä ’/’" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d valitsin ”%s” ei ota arvoa" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: valitsin ”%s” ei ota arvoa" + +#: plugins/sudoers/defaults.c:305 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d virheellinen Defaults-tyyppi 0x%x valitsimelle ”%s”" + +#: plugins/sudoers/defaults.c:308 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: virheellinen Defaults-tyyppi 0x%x valitsimelle ”%s”" + +#: plugins/sudoers/defaults.c:318 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d arvo ”%s” on virheellinen valitsimelle ”%s”" + +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: arvo ”%s” on virheellinen valitsimelle ”%s”" + +#: plugins/sudoers/env.c:404 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: rikkoutunut envp, pituus ei täsmää" + +#: plugins/sudoers/env.c:1131 +msgid "unable to rebuild the environment" +msgstr "ympäristön rakentaminen uudelleen epäonnistui" + +#: plugins/sudoers/env.c:1205 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "seuraavia ympäristömuuttujia ei ole lupa asettaa: %s" + +#: plugins/sudoers/file.c:104 +#, c-format +msgid "parse error in %s near line %d" +msgstr "jäsentämisvirhe tiedostossa %s lähellä riviä %d" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s" +msgstr "jäsentämisvirhe tiedostossa %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tukematon tiivistetyyppi %d kohteelle %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: kirjoitusvirhe" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s-omistajan on oltava uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s on vain omistajan kirjoitettava" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:571 +#, c-format +msgid "unable to load %s: %s" +msgstr "kohteen %s lataaminen epäonnistui: %s" + +# parametrina on path +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "symbolin ”group_plugin” löytäminen polusta %s epäonnistui" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: yhteensopimaton ryhmälisäosan major-versio %d, odotettiin %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "verkko-osoitteen ”%s” jäsentäminen epäonnistui" + +# Parametri on sudoers file +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "verkkopeitteen ”%s” jäsentäminen epäonnistui" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Paikallinen verkko-osoite ja verkkopeiteparit:\n" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/sudoers.c:393 +#: plugins/sudoers/sudoers.c:394 plugins/sudoers/sudoers.c:1274 +#: plugins/sudoers/testsudoers.c:416 +#, c-format +msgid "unknown group: %s" +msgstr "tuntematon ryhmä: %s" + +#: plugins/sudoers/iolog.c:517 plugins/sudoers/iolog.c:807 +#: plugins/sudoers/iolog.c:959 plugins/sudoers/iolog.c:966 +#: plugins/sudoers/iolog.c:1087 plugins/sudoers/iolog.c:1094 +#: plugins/sudoers/iolog.c:1193 plugins/sudoers/iolog.c:1200 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "siirtolokitiedostoon: %s kirjoittaminen epäonnistui" + +#: plugins/sudoers/iolog.c:566 +msgid "unable to update sequence file" +msgstr "sekvenssitiedostoa ei voi päivittää" + +# Parametrina on pathbuf +#: plugins/sudoers/iolog.c:605 +#, fuzzy, c-format +msgid "unable to create %s/%s" +msgstr "hakemistopolun %s luominen epäonnistui" + +#: plugins/sudoers/iolog.c:631 +msgid "unable to connect to log server" +msgstr "yhteyden muodostaminen lokipalvelimeen ei onnistu" + +#: plugins/sudoers/iolog.c:851 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: sisäinen virhe, tapahtuman %d siirräntälokitiedosto ei ole avoin" + +#: plugins/sudoers/iolog.c:944 plugins/sudoers/iolog.c:1072 +#: plugins/sudoers/iolog.c:1177 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:492 +#: plugins/sudoers/visudo.c:498 +msgid "unable to read the clock" +msgstr "kellon lukeminen epäonnistui" + +#: plugins/sudoers/iolog.c:1169 plugins/sudoers/iolog_client.c:977 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: sisäinen virhe, virheellinen signaali %d" + +#: plugins/sudoers/iolog_client.c:113 plugins/sudoers/iolog_client.c:392 +#: plugins/sudoers/iolog_client.c:1200 plugins/sudoers/iolog_client.c:1775 +msgid "error in event loop" +msgstr "virhe tapahtumasilmukassa" + +#: plugins/sudoers/iolog_client.c:194 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Uuden SSL_CTX-objektin luominen epäonnistui: %s" + +#: plugins/sudoers/iolog_client.c:346 plugins/sudoers/iolog_client.c:351 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "" + +#: plugins/sudoers/iolog_client.c:496 +msgid "TLS initialization was unsuccessful" +msgstr "TLS-alustus epäonnistui" + +#: plugins/sudoers/iolog_client.c:505 +msgid "TLS handshake was unsuccessful" +msgstr "TLS-kättely epäonnistui" + +#: plugins/sudoers/iolog_client.c:767 plugins/sudoers/iolog_client.c:959 +msgid "unable to get time of day" +msgstr "kellonajan noutaminen epäonnistui" + +#: plugins/sudoers/iolog_client.c:986 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: sisäinen virhe, virheellinen lopetustila %d" + +#: plugins/sudoers/iolog_client.c:1523 +msgid "lost connection to log server" +msgstr "yhteys lokipalvelimeen katkesi" + +#: plugins/sudoers/iolog_client.c:1600 +msgid "missing write buffer" +msgstr "puuttuva kirjoituspuskuri" + +#: plugins/sudoers/ldap.c:176 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls ei ole tuettu ldaps-käytössä" + +#: plugins/sudoers/ldap.c:247 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "SSL-varmenne- ja avaintietokannan alustaminen epäonnistui: %s" + +#: plugins/sudoers/ldap.c:250 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "kohteessa %s TLS_CERT on asetettava käyttämään SSL:ää" + +#: plugins/sudoers/ldap.c:1658 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "kohteen LDAP alustaminen epäonnistui: %s" + +#: plugins/sudoers/ldap.c:1694 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls määritelty, mutta LDAP-kirjastot ei tue funktiota ldap_start_tls_s() tai funktiota ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1831 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "virheellinen sudoOrder-attribuutti: %s" + +#: plugins/sudoers/ldap_conf.c:200 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: portti on liian suuri" + +# URL on verkko-osoite, loogisesti URI on verkkoresurssi(osoite) +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tukematon LDAP-verkkoresurssin tunnustyyppi: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ldap:n ja ldap-verkkoresurssitunnuksien sekoittaminen epäonnistui" + +#: plugins/sudoers/ldap_util.c:548 plugins/sudoers/ldap_util.c:550 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "sudoOptionia ei voi muuntaa: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "audit-järjestelmän avaaminen epäonnistui" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "audit-viestin lähettäminen epäonnistui" + +#: plugins/sudoers/logging.c:167 +#, c-format +msgid "unable to open log file: %s" +msgstr "lokitiedoston avaaminen epäonnistui: %s" + +#: plugins/sudoers/logging.c:175 +#, c-format +msgid "unable to lock log file: %s" +msgstr "lokitiedoston lukitseminen epäonnistui: %s" + +#: plugins/sudoers/logging.c:208 +#, c-format +msgid "unable to write log file: %s" +msgstr "lokitiedostoon: %s kirjoittaminen epäonnistui" + +#: plugins/sudoers/logging.c:241 +msgid "user NOT in sudoers" +msgstr "käyttäjä EI ole sudoers-tiedostossa" + +#: plugins/sudoers/logging.c:243 +msgid "user NOT authorized on host" +msgstr "käyttäjä ei ole varmennettu tietokoneella" + +#: plugins/sudoers/logging.c:245 +msgid "command not allowed" +msgstr "komento ei ole sallittu" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s ei ole sudoers-tiedostossa. Tästä tehdään ilmoitus.\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s ei saa suorittaa sudoa %s-koneella. Tästä tehdään ilmoitus.\n" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Käyttäjä %s ei saa suorittaa sudoa %s-koneella.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Käyttäjä %s ei saa suorittaa komentoa ”%s%s%s” käyttäjänä %s%s%s koneella %s.\n" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:512 +#: plugins/sudoers/sudoers.c:514 plugins/sudoers/sudoers.c:516 +#: plugins/sudoers/sudoers.c:518 plugins/sudoers/sudoers.c:665 +#: plugins/sudoers/sudoers.c:667 +#, c-format +msgid "%s: command not found" +msgstr "%s: komentoa ei löytynyt" + +#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:508 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ohitetaan komento ”%s”, joka löytyi kohteesta ’.’\n" +"Käytä ”sudo ./%s”, jos tämä on ”%s”-komento, joka halutaan suorittaa." + +#: plugins/sudoers/logging.c:354 +msgid "authentication failure" +msgstr "todentamishäiriö" + +#: plugins/sudoers/logging.c:380 +msgid "a password is required" +msgstr "vaaditaan salasana" + +#: plugins/sudoers/logging.c:450 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u väärä salasanayritys" +msgstr[1] "%u väärää salasanayritystä" + +#: plugins/sudoers/logging.c:714 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "funktion dup kutsuminen vakiosyötteellä epäonnistui: %m" + +#: plugins/sudoers/logging.c:751 +#, c-format +msgid "unable to execute %s: %m" +msgstr "käskyn %s suorittaminen epäonnistui: %m" + +#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:848 +#, c-format +msgid "unable to fork: %m" +msgstr "fork-funktion kutsuminen epäonnistui: %m" + +#: plugins/sudoers/logging.c:838 +#, c-format +msgid "unable to open pipe: %m" +msgstr "putken avaaminen epäonnistui: %m" + +#: plugins/sudoers/match_digest.c:116 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "tiiviste kohteelle %s (%s) ei ole %s-muodossa" + +#: plugins/sudoers/parse.c:442 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-rooli: %s\n" + +#: plugins/sudoers/parse.c:445 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-rivi:\n" + +#: plugins/sudoers/parse.c:447 +#, c-format +msgid " RunAsUsers: " +msgstr " SuoritaKäyttäjänä: " + +#: plugins/sudoers/parse.c:462 +#, c-format +msgid " RunAsGroups: " +msgstr " SuoritaRyhmänä: " + +#: plugins/sudoers/parse.c:472 +#, c-format +msgid " Options: " +msgstr " Valitsimet: " + +#: plugins/sudoers/parse.c:522 +#, c-format +msgid " Commands:\n" +msgstr " Komennot:\n" + +#: plugins/sudoers/parse.c:713 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Täsmäävät Defaults-rivit kohteelle %s kohteella %s:\n" + +#: plugins/sudoers/parse.c:731 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas- ja Command-kohtaiset oletukset kohteelle %s:\n" + +#: plugins/sudoers/parse.c:749 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Käyttäjä %s voi suorittaa seuraavat komennot kohteella %s:\n" + +#: plugins/sudoers/parse.c:764 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Käyttäjä %s ei saa suorittaa komentoa sudo tietokoneella %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "jätetään huomiotta epätäydellinen sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "virheellinen LDIF-määrite: %s" + +#: plugins/sudoers/policy.c:77 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:281 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "verkko-osoiteluettelon jäsentäminen epäonnistui" + +#: plugins/sudoers/policy.c:426 +msgid "user name not set by sudo front-end" +msgstr "sudo-edustaohjelma ei määritellyt käyttäjänimeä" + +#: plugins/sudoers/policy.c:430 +msgid "user-ID not set by sudo front-end" +msgstr "sudo-edustaohjelma ei määritellyt käyttäjä-ID:tä" + +#: plugins/sudoers/policy.c:434 +msgid "group-ID not set by sudo front-end" +msgstr "sudo-edustaohjelma ei määritellyt ryhmä-ID:tä" + +#: plugins/sudoers/policy.c:438 +msgid "host name not set by sudo front-end" +msgstr "sudo-edustaohjelma ei määritellyt konenimeä" + +# Parametri on path, mutta saattaa sisältää suoritettavan ohjelman +#: plugins/sudoers/policy.c:896 plugins/sudoers/visudo.c:230 +#: plugins/sudoers/visudo.c:861 +#, c-format +msgid "unable to execute %s" +msgstr "kohteen %s suorittaminen epäonnistui" + +#: plugins/sudoers/policy.c:1060 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers-menettelytapalisäosaversio %s\n" + +#: plugins/sudoers/policy.c:1062 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers-tiedostokielioppiversio %d\n" + +#: plugins/sudoers/policy.c:1066 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-polku: %s\n" + +#: plugins/sudoers/policy.c:1069 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-polku: %s\n" + +#: plugins/sudoers/policy.c:1071 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-polku: %s\n" + +#: plugins/sudoers/policy.c:1072 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-polku: %s\n" + +#: plugins/sudoers/policy.c:1105 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "kytkentätyypin %d (version %d.%d) rekisteröiminen epäonnistui" + +#: plugins/sudoers/pwutil.c:214 plugins/sudoers/pwutil.c:232 +#, fuzzy, c-format +msgid "unable to cache uid %u" +msgstr "käyttäjän uid %u laittaminen välimuistiin epäonnistui, muistia ei riittävästi" + +#: plugins/sudoers/pwutil.c:226 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "käyttäjän uid %u laittaminen välimuistiin epäonnistui, käyttäjä on jo siellä" + +# Parametrina on pathbuf +#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:304 +#: plugins/sudoers/pwutil.c:367 plugins/sudoers/pwutil.c:412 +#, fuzzy, c-format +msgid "unable to cache user %s" +msgstr "hakemistopolun %s luominen epäonnistui" + +#: plugins/sudoers/pwutil.c:299 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "käyttäjän %s laittaminen välimuistiin epäonnistui, käyttäjä on jo siellä" + +#: plugins/sudoers/pwutil.c:531 plugins/sudoers/pwutil.c:549 +#, fuzzy, c-format +msgid "unable to cache gid %u" +msgstr "ryhmän gid %u laittaminen välimuistiin epäonnistui, muistia ei riittävästi" + +#: plugins/sudoers/pwutil.c:543 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "ryhmän gid %u laittaminen välimuistiin epäonnistui, ryhmä on jo siellä" + +# Parametri on sudoers file +#: plugins/sudoers/pwutil.c:596 plugins/sudoers/pwutil.c:614 +#: plugins/sudoers/pwutil.c:662 plugins/sudoers/pwutil.c:704 +#, fuzzy, c-format +msgid "unable to cache group %s" +msgstr "ryhmien jäsentäminen tiedostossa %s epäonnistui" + +#: plugins/sudoers/pwutil.c:609 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "ryhmän %s laittaminen välimuistiin epäonnistui, ryhmä on jo siellä" + +#: plugins/sudoers/pwutil.c:831 plugins/sudoers/pwutil.c:883 +#: plugins/sudoers/pwutil.c:933 plugins/sudoers/pwutil.c:986 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "ryhmäluettelon laittaminen välimuistiin tiedostossa %s epäonnistui, ryhmäluettelo on jo siellä" + +# Parametri on sudoers file +#: plugins/sudoers/pwutil.c:837 plugins/sudoers/pwutil.c:888 +#: plugins/sudoers/pwutil.c:939 plugins/sudoers/pwutil.c:991 +#, fuzzy, c-format +msgid "unable to cache group list for %s" +msgstr "ryhmien jäsentäminen tiedostossa %s epäonnistui" + +# Parametri on sudoers file +#: plugins/sudoers/pwutil.c:877 +#, c-format +msgid "unable to parse groups for %s" +msgstr "ryhmien jäsentäminen tiedostossa %s epäonnistui" + +# Parametri on sudoers file +#: plugins/sudoers/pwutil.c:980 +#, c-format +msgid "unable to parse gids for %s" +msgstr "ryhmätunnisteiden jäsentäminen tiedostolle %s epäonnistui" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "käyttöoikeuspinoylivuoto" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "käyttöoikeuspinovajaus" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "vaihtaminen root gid -tunnisteeksi epäonnistui" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "vaihtaminen runas gid -tunnisteeksi epäonnistui" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "runas-ryhmävektorin asettaminen epäonnistui" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "vaihtaminen runas uid -tunnisteeksi epäonnistui" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "vaihtaminen sudoers gid-tunnisteeksi epäonnistui" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "liian monta prosessia" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "nykyisen työhakemiston hakeminen epäonnistui" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "typistetty audit-polku user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "typistetty audit-polku argv[0]: %s" + +#: plugins/sudoers/sssd.c:573 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "lähteen SSS alustaminen epäonnistui. Onko SSSD asennettu tietokoneeseesi?" + +# parametrina on path +#: plugins/sudoers/sssd.c:581 plugins/sudoers/sssd.c:590 +#: plugins/sudoers/sssd.c:599 plugins/sudoers/sssd.c:608 +#: plugins/sudoers/sssd.c:617 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "symbolin ”%s” löytäminen polusta %s epäonnistui" + +#: plugins/sudoers/sudoers.c:217 plugins/sudoers/sudoers.c:943 +msgid "problem with defaults entries" +msgstr "oletusrivien pulma" + +#: plugins/sudoers/sudoers.c:221 +msgid "no valid sudoers sources found, quitting" +msgstr "ei löytynyt kelvollisia sudoers-lähteitä, poistutaan" + +#: plugins/sudoers/sudoers.c:297 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers määrittelee, että root ei saa suorittaa sudo-komentoa" + +#: plugins/sudoers/sudoers.c:357 +msgid "user not allowed to override closefrom limit" +msgstr "" + +#: plugins/sudoers/sudoers.c:358 +msgid "you are not permitted to use the -C option" +msgstr "ei käyttöoikeuksia valitsimelle -C" + +#: plugins/sudoers/sudoers.c:420 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "aikaleimaomistaja (%s): Tuntematon käyttäjä" + +#: plugins/sudoers/sudoers.c:435 +msgid "no tty" +msgstr "ei tty:tä" + +#: plugins/sudoers/sudoers.c:436 +msgid "sorry, you must have a tty to run sudo" +msgstr "sudo-komennon suorittamiseksi on oltava tty" + +#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "virheellinen kuori käyttäjälle %s: %s" + +#: plugins/sudoers/sudoers.c:507 +msgid "command in current directory" +msgstr "komento nykyisessä hakemistossa" + +#: plugins/sudoers/sudoers.c:525 +msgid "user not allowed to set a command timeout" +msgstr "käyttäjä ei saa asettaa komennon aikakatkaisua" + +#: plugins/sudoers/sudoers.c:526 +msgid "sorry, you are not allowed set a command timeout" +msgstr "komennon aikavalvonnan asettaminen ei ole sallittua" + +#: plugins/sudoers/sudoers.c:534 +msgid "user not allowed to preserve the environment" +msgstr "käyttäjä ei saa säilyttää ympäristöä" + +#: plugins/sudoers/sudoers.c:535 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "ympäristöä ei ole lupa säilyttää" + +#: plugins/sudoers/sudoers.c:878 +msgid "command too long" +msgstr "komento on liian pitkä" + +#: plugins/sudoers/sudoers.c:936 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoeditiä ei tarvitse ajaa sudon kautta" + +# Parametrinä on sudoers-tiedosto tai pathbuf +#: plugins/sudoers/sudoers.c:990 plugins/sudoers/sudoreplay.c:1548 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "kohteen %s lukeminen epäonnistui" + +#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/visudo.c:431 +#: plugins/sudoers/visudo.c:727 +#, c-format +msgid "unable to stat %s" +msgstr "funktion stat %s kutsuminen epäonnistui" + +#: plugins/sudoers/sudoers.c:1019 plugins/sudoers/visudo.c:1037 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ei ole tavallinen tiedosto" + +#: plugins/sudoers/sudoers.c:1023 plugins/sudoers/timestamp.c:252 toke.l:1060 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s on uid %u -käyttäjän omistama, pitäisi olla %u" + +#: plugins/sudoers/sudoers.c:1027 toke.l:1065 +#, c-format +msgid "%s is world writable" +msgstr "%s on yleiskirjoitettava" + +#: plugins/sudoers/sudoers.c:1031 toke.l:1068 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s on gid %u -ryhmän omistama, pitäisi olla %u" + +#: plugins/sudoers/sudoers.c:1064 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "vain root-käyttäjä voi käyttää valitsinta ”-c %s”" + +#: plugins/sudoers/sudoers.c:1083 +#, c-format +msgid "unknown login class: %s" +msgstr "tuntematon kirjautumisluokka: %s" + +#: plugins/sudoers/sudoers.c:1168 plugins/sudoers/sudoers.c:1183 +#, c-format +msgid "unable to resolve host %s" +msgstr "tietokoneen %s ratkaiseminen epäonnistui" + +#: plugins/sudoers/sudoreplay.c:258 +#, c-format +msgid "invalid filter option: %s" +msgstr "virheellinen suodatinvalitsin: %s" + +#: plugins/sudoers/sudoreplay.c:274 +#, c-format +msgid "invalid max wait: %s" +msgstr "virheellinen enimmäisodotusaika: %s" + +#: plugins/sudoers/sudoreplay.c:297 +#, c-format +msgid "invalid speed factor: %s" +msgstr "virheellinen nopeustekijä: %s" + +#: plugins/sudoers/sudoreplay.c:333 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:338 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/ajoitus: %s" + +#: plugins/sudoers/sudoreplay.c:342 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:366 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Toistetaan sudo-istunto: %s" + +#: plugins/sudoers/sudoreplay.c:628 +msgid "unable to set tty to raw mode" +msgstr "tty:n asettaminen raakatilaan epäonnistui" + +#: plugins/sudoers/sudoreplay.c:679 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Varoitus: pääteikkunasi on liian pieni tämän lokin toistamiseksi oikein.\n" + +#: plugins/sudoers/sudoreplay.c:680 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Lokigeometria on %d x %d, pääteikkunasi geometria on %d x %d." + +#: plugins/sudoers/sudoreplay.c:708 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Toistaminen päättyi, palaa pääteikkunaan painamalla mitä tahansa näppäintä." + +#: plugins/sudoers/sudoreplay.c:1198 plugins/sudoers/sudoreplay.c:1228 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "monimerkityksellinen lauseke ”%s”" + +#: plugins/sudoers/sudoreplay.c:1250 +msgid "unmatched ')' in expression" +msgstr "täsmäämätön ’)’ lausekkeessa" + +#: plugins/sudoers/sudoreplay.c:1254 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "tuntematon hakutermi ”%s”" + +#: plugins/sudoers/sudoreplay.c:1269 +#, c-format +msgid "%s requires an argument" +msgstr "%s vaatii argumentin" + +#: plugins/sudoers/sudoreplay.c:1272 plugins/sudoers/sudoreplay.c:1524 +#, c-format +msgid "invalid regular expression: %s" +msgstr "virheellinen säännöllinen lauseke: %s" + +#: plugins/sudoers/sudoreplay.c:1277 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "päivämäärän ”%s” jäsentäminen epäonnistui" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "unmatched '(' in expression" +msgstr "täsmäämätön ’(’ lausekkeessa" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"or\"" +msgstr "virheellinen jäljessä oleva ”or”" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "illegal trailing \"!\"" +msgstr "virheellinen jäljessä oleva ”!”" + +#: plugins/sudoers/sudoreplay.c:1348 +#, c-format +msgid "unknown search type %d" +msgstr "tuntematon hakutyyppi %d" + +#: plugins/sudoers/sudoreplay.c:1615 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "käyttö: %s [-hnRS] [-d hakemisto] [-m numero] [-s numero] tunniste\n" + +#: plugins/sudoers/sudoreplay.c:1618 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "käyttö: %s [-h] [-d hakemisto] -l [hakulauseke]\n" + +#: plugins/sudoers/sudoreplay.c:1627 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - toista sudo-istuntolokit\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1629 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Valitsimet:\n" +" -d, --directory=hak määrittele istuntolokien hakemisto\n" +" -f, --filter=suodatin määrittele, mitkä siirräntätyyppit näytetään\n" +" -h, --help näytä opaste ja poistu\n" +" -l, --list [lauseke] luettele käytettävissä oleva istuntotunnisteet;\n" +" valinnainen täsmäyslauseke voidaan antaa\n" +" -m, --max-wait=määrä tapahtumien välinen enimmäisodotusaika sekunteina\n" +" -n, --non-interactive ei kehotteita, istunto lähetetään vakiotulosteeseen\n" +" -R, --no-resize älä yritä muuttaa päätteen kokoa\n" +" -S, --suspend-wait odota, kun komento on on pysäytetty\n" +" -s, --speed=luku nopeuta tai hidasta tulostusta\n" +" -V, --version näytä versiotiedot ja poistu" + +#: plugins/sudoers/testsudoers.c:354 +msgid "\thost unmatched" +msgstr "\ttietokone täsmäämätön" + +#: plugins/sudoers/testsudoers.c:357 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Komento sallittu" + +#: plugins/sudoers/testsudoers.c:358 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Komento kielletty" + +#: plugins/sudoers/testsudoers.c:358 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Täsmäämätön komento" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s on ryhmäkirjoitettava" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "aikaleimatiedoston typistäminen %lld-tavun kokoiseksi epäonnistui" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "ohitetaan aikaleima tulevaisuudesta" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "aikaleima liian kaukana tulevaisuudessa: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "aikaleimatiedoston %s lukitseminen epäonnistui" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "luentotilapolku on liian pitkä: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoeditiä ei tule käynnistää polun kanssa" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "valitsin -x poistetaan jossakin tulevassa versiossa" + +#: plugins/sudoers/visudo.c:227 +msgid "please consider using the cvtsudoers utility instead" +msgstr "harkitse cvtsudoers-apuohjelman käyttöä" + +#: plugins/sudoers/visudo.c:278 plugins/sudoers/visudo.c:660 +#, c-format +msgid "press return to edit %s: " +msgstr "muokkaa %s painamalla enter-painiketta: " + +#: plugins/sudoers/visudo.c:339 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "määritelty editori (%s) ei ole olemassa" + +#: plugins/sudoers/visudo.c:341 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "editoria ei löytynyt (editoripolku = %s)" + +#: plugins/sudoers/visudo.c:451 plugins/sudoers/visudo.c:459 +msgid "write error" +msgstr "kirjoitusvirhe" + +#: plugins/sudoers/visudo.c:505 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "funktion stat kutsuminen tilapäiselle tiedostolle (%s) epäonnistui, %s ennallaan" + +#: plugins/sudoers/visudo.c:512 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "nollapituinen tilapäinen tiedosto (%s), %s ennallaan" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editori (%s) epäonnistui, %s ennallaan" + +#: plugins/sudoers/visudo.c:540 +#, c-format +msgid "%s unchanged" +msgstr "%s ennallaan" + +#: plugins/sudoers/visudo.c:599 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "tilapäisen tiedoston (%s) avaaminen uudelleen epäonnistui, %s ennallaan." + +#: plugins/sudoers/visudo.c:611 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "tilapäisen tiedoston (%s) jäsentäminen epäonnistui, tuntematon virhe" + +#: plugins/sudoers/visudo.c:649 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "sisäinen virhe, kohteen %s löytäminen luettelosta epäonnistui!" + +#: plugins/sudoers/visudo.c:729 plugins/sudoers/visudo.c:738 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "kohteen %s (uid, gid) asettaminen arvoihin (%u, %u) epäonnistui" + +#: plugins/sudoers/visudo.c:761 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s ja %s eivät ole samassa tiedostojärjestelmässä, käytetään komentoa mv uudelleennimeämiseen" + +#: plugins/sudoers/visudo.c:775 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "komento epäonnistui: ’%s %s %s’, %s ennallaan" + +#: plugins/sudoers/visudo.c:785 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "virhe nimettäessä %s uudelleen, %s ennallaan" + +#: plugins/sudoers/visudo.c:806 +msgid "What now? " +msgstr "Mitä nyt? " + +#: plugins/sudoers/visudo.c:820 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Valitsimia ovat:\n" +" (e) muokkaa sudoers-tiedostoa uudelleen\n" +" (x) poistu tallentamatta sudoers-tiedoston muutoksia\n" +" (Q) poistu ja tallenna muutokset sudoers-tiedostoon (VAARA!)\n" + +# Parametri on path, mutta saattaa sisältää suoritettavan ohjelman +#: plugins/sudoers/visudo.c:866 +#, c-format +msgid "unable to run %s" +msgstr "kohteen %s suorittaminen epäonnistui" + +#: plugins/sudoers/visudo.c:896 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: väärä omistaja (uid, gid), pitäisi olla (%u, %u)\n" + +#: plugins/sudoers/visudo.c:903 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: väärät käyttöoikeudet, pitäisi olla tila 0%o\n" + +#: plugins/sudoers/visudo.c:960 plugins/sudoers/visudo.c:967 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: jäsentäminen valmis\n" + +#: plugins/sudoers/visudo.c:986 +#, c-format +msgid "%s busy, try again later" +msgstr "%s varattu, yritä myöhemmin uudelleen" + +# Avaamisen kohde voi olla timestamp file, sudoers file tai pathbuf +#: plugins/sudoers/visudo.c:989 +#, c-format +msgid "unable to lock %s" +msgstr "kohteen %s lukitseminen epäonnistui" + +#: plugins/sudoers/visudo.c:990 +msgid "Edit anyway? [y/N]" +msgstr "Muokataanko silti? [y/N]" + +#: plugins/sudoers/visudo.c:1083 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Virhe: %s:%d jakso kohteessa %s \"%s\"" + +#: plugins/sudoers/visudo.c:1084 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Varoitus: %s:%d jakso kohteessa %s \"%s\"" + +#: plugins/sudoers/visudo.c:1088 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Virhe: %s:%d %s \"%s\" uudelleenviitattu, mutta ei määritelty" + +#: plugins/sudoers/visudo.c:1089 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Varoitus: %s:%d %s \"%s\" uudelleenviitattu, mutta ei määritelty" + +#: plugins/sudoers/visudo.c:1180 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Varoitus: %s:%d käyttämätön %s \"%s\"" + +#: plugins/sudoers/visudo.c:1295 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - muokkaa sudoers-tiedostoa turvallisesti\n" +"\n" + +#: plugins/sudoers/visudo.c:1297 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Valitsimet:\n" +" -c, --check vain tarkistus -tila\n" +" -f, --file=sudoers määrittele sudoers-tiedoston sijainti\n" +" -h, --help näytä opasteteksti ja poistu\n" +" -q, --quiet vähemmän laveat (hiljaiset) syntaksivirheviestit\n" +" -s, --strict tiukka syntaksitarkistus\n" +" -V, --version näytä versiotiedot ja poistu\n" + +#: toke.l:1032 +msgid "too many levels of includes" +msgstr "liian monta include-tasoa" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "SSL_connect epäonnistui: ssl_error=%d, pino=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "CA-pakettitiedostoa ei määritelty" + +#~ msgid "Client certificate was not specified" +#~ msgstr "Asiakassertifikaattia ei annettu" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "Ssl-objektia ei voi varata: %s\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "asiakassanoma on liian suuri: %zu\n" + +#~ msgid "server message too large: %u\n" +#~ msgstr "palvelinsanoma on liian suuri: %u\n" + +#, fuzzy +#~| msgid "Send mail if the user is not in sudoers" +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "Lähetä sähköpostia, jos käyttäjä ei ole sudoers-määrittelyssä" + +#~ msgid "Calling SSL_CTX_load_verify_locations() failed: %s" +#~ msgstr "SSL_CTX_load_verify_locations() epäonnistui: %s" + +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "Allekirjoitettua varmennetiedostoa ei ole määritelty sudoers-tiedostossa" + +#~ msgid "Unable to load private key into the ssl context: %s" +#~ msgstr "Yksityistä avainta ei voi ladata ssl-kontekstiin: %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_connect epäonnistui: ssl_error=%d, pino=%s" + +#~ msgid "SSL_read failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_read epäonnistui: ssl_error=%d, pino=%s" + +#~ msgid "SSL_write failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_write epäonnistui: ssl_error=%d, pino=%s" + +#~ msgid "unknown address family: %d" +#~ msgstr "tuntematon osoiteperhe: %d" + +#~ msgid "audit_failure message too long" +#~ msgstr "audit_failure-viesti on liian pitkä" + +#~ msgid "unabled to parse temporary file (%s), unknown error" +#~ msgstr "tilapäisen tiedoston (%s) jäsentäminen epäonnistui, tuntematon virhe" + +#~ msgid "No user or host" +#~ msgstr "Ei käyttäjä eikä tietokone" + +#~ msgid "validation failure" +#~ msgstr "kelpuutushäiriö" + +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/ajoitus: %s" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP-rooli: TUNTEMATON\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Järjestys: %s\n" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "käyttäjän %s laittaminen välimuistiin epäonnistui, muistia ei riittävästi" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "ryhmän %s laittaminen välimuistiin epäonnistui, muistia ei riittävästi" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "ryhmäluettelon laittaminen välimuistiin tiedostossa %s epäonnistui, muistia ei riittävästi" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-rooli: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-rooli: TUNTEMATON\n" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "aikaleimapolku on liian pitkä: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "funktion stat editor (%s) kutsuminen epäonnistui" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: hostbuf-puskuritila loppui" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: hostbuf-puskuritila loppui" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1-varaustäsmäämättömyys" + +#~ msgid "Password:" +#~ msgstr "Salasana:" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "sisäinen virhe: riittämättömästi tilaa lokiriville" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: puskuriylivuoto" + +#~ msgid "%s: unused %s_Alias %s" +#~ msgstr "%s: käyttämätön %s_Alias %s" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s on uid %u:n omistama, pitäisi olla uid %u:n omistama" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s on kirjoitettava ei-omistajalle (0%o), pitäisi olla tila 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s on olemassa, mutta ei ole tavallinen tiedosto (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s on kirjoitettava ei-omistajalle (0%o), pitäisi olla tila 0600" + +#~ msgid "unable to remove %s, will reset to the Unix epoch" +#~ msgstr "kohteen %s poistaminen epäonnistui, nollaa Unix-ajan" + +#~ msgid "unable to reset %s to the Unix epoch" +#~ msgstr "kohteen %s nollaaminen Unix-ajaksi epäonnistui" + +#~ msgid "value out of range" +#~ msgstr "arvo lukualueen ulkopuolella" + +#~ msgid "" +#~ "\n" +#~ "Options:\n" +#~ " -c, --check check-only mode\n" +#~ " -f, --file=file specify sudoers file location\n" +#~ " -h, --help display help message and exit\n" +#~ " -q, --quiet less verbose (quiet) syntax error messages\n" +#~ " -s, --strict strict syntax checking\n" +#~ " -V, --version display version information and exit -x, --export export sudoers in JSON format" +#~ msgstr "" +#~ "\n" +#~ "Valitsimet:\n" +#~ " -c, --check vain tarkistus -tila\n" +#~ " -f, --file=tiedosto määrittele sudoers-tiedoston sijainti\n" +#~ " -h, --help näytä opasteteksti ja poistu\n" +#~ " -q, --quiet vähemmän laveat (hiljaiset) syntaksivirheviestit\n" +#~ " -s, --strict tiukka syntaksitarkistus\n" +#~ " -V, --version näytä versiotiedot ja poistu -x, --export vie sudoers-tiedosto JSON-muodossa" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "ldap- ja starttl-kohteiden sekoittaminen epäonnistui" + +#~ msgid "writing to standard output" +#~ msgstr "kirjoitetaan vakiotulosteeseen" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "liian monta sulkumerkillistä lauseketta, enintään %d" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: epäonnistui" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: epäonnistui" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: epäonnistui" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: epäonnistui" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: epäonnistui" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: epäonnistui" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getauid failed" +#~ msgstr "getauid epäonnistui" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "Funktion dlopen %s kutsuminen epäonnistui: %s" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s lähellä riviä %d <<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "locale-asetuksen ”%s” asettaminen epäonnistui, käytetään ”C”" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Komennot:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "käyttäjän uid %u (%s) laittaminen välimuistiin epäonnistui, käyttäjä on jo siellä" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "ryhmän gid %u (%s) laittaminen välimuistiin epäonnistui, ryhmä on jo siellä" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "sisäinen virhe, expand_prompt()-ylivuoto" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "sisäinen virhe, sudo_setenv2()-ylivuoto" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "sisäinen virhe, sudo_setenv()-ylivuoto" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "sisäinen virhe, linux_audit_command()-ylivuoto" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "sisäinen virhe, runas_groups-ylivuoto" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "sisäinen virhe, init_vars()-ylivuoto" + +# Parametri on sudoers file +#~ msgid "fixed mode on %s" +#~ msgstr "korjattu tila tiedostossa %s" + +# Parametri on suoders file +#~ msgid "set group on %s" +#~ msgstr "aseta ryhmä tiedostossa %s" + +#~ msgid "unable to fix mode on %s" +#~ msgstr "tilan korjaaminen tiedostossa %s epäonnistui" + +#~ msgid "%s is mode 0%o, should be 0%o" +#~ msgstr "%s on tila 0%o, pitäisi olla 0%o" + +#~ msgid "File containing dummy exec functions: %s" +#~ msgstr "Tiedosto, joka sisältää vale-exec-funktioita: %s" + +#~ msgid "" +#~ "Available options in a sudoers ``Defaults'' line:\n" +#~ "\n" +#~ msgstr "" +#~ "Käytettävissä olevat valitsimet sudoers ’’Defaults’’ -rivillä:\n" +#~ "\n" + +#~ msgid "%s: %.*s\n" +#~ msgstr "%s: %.*s\n" + +#~ msgid "unable to get runas group vector" +#~ msgstr "runas-ryhmävektorin hakeminen epäonnistui" + +#~ msgid "%s: %s_Alias `%s' references self" +#~ msgstr "%s: %s_Alias ”%s” viittaa itseensä" diff --git a/plugins/sudoers/po/fr.mo b/plugins/sudoers/po/fr.mo new file mode 100644 index 0000000..859281f Binary files /dev/null and b/plugins/sudoers/po/fr.mo differ diff --git a/plugins/sudoers/po/fr.po b/plugins/sudoers/po/fr.po new file mode 100644 index 0000000..a6f7304 --- /dev/null +++ b/plugins/sudoers/po/fr.po @@ -0,0 +1,3286 @@ +# This file is put in the public domain. +# This file is distributed under the same license as the sudo package. +# +# Frédéric Hantrais , 2014, 2015, 2016. +# Frédéric Marchal , 2020 +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-24 07:29+0100\n" +"Last-Translator: Frédéric Marchal \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-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n >= 2);\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "erreur de syntaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Mot de passe de %p : " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] Mot de passe de %p : " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Mot de passe : " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informations de sécurité pour %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Désolé, essayez de nouveau." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "impossible d'allouer la mémoire" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "un résumé (digest) nécessite un chemin d'accès" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "les valeurs de « CWD » doivent commencer par « / », « ~ » ou « * »" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "les valeurs de « CHROOT » doivent commencer par « / », « ~ » ou « * »" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "erreur de syntaxe, le mot réservé %s est utilisé comme un nom de synonyme" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "valeur « notbefore » (pas avant) invalide" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "valeur « notafter » (pas après) invalide" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "valeur trop grande pour le délai d'expiration" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "valeur invalide pour le délai d'expiration" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s : %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "erreur interne, dépassement de %s" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "duplication (dup) de stdin impossible : %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "exécution de %s impossible : %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "création du processus fils impossible" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "création du processus fils impossible : %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "ouverture du tube impossible : %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (suite de la commande) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existe mais n'est pas un répertoire (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "création du répertoire (mkdir) %s impossible" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "impossible de changer le mode de %s pour lui affecter 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "JSON_STRING attendue, %d obtenu" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "guillemet manquante dans le nom" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "JSON_OBJECT attendu, %d obtenu" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "accolade fermante non appariée" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "tableau attendu" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "crochet fermant non apparié" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "chaîne inattendue" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "deux points manquants après le nom" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "booléen inattendu" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "nombre inattendu" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u analyse grammaticale (parse) de « %s » impossible" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: fichier de journalisation incorrect" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: il manque le champ d'horodatage" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: horodatage %s : %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: il manque le champ utilisateur" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: il manque le champ précisant l'utilisateur effectif (runas)" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: il manque le champ précisant le groupe effectif (runas)" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "erreur de lecture dans le fichier de timing : %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "ligne invalide dans le fichier de timing : %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "l'enregistrement du journal est déjà terminé, impossible de redémarrer" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "impossible de redémarrer l'enregistrement du journal" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "ouverture de %si/%s impossible" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "fichier du journal E/S %s/%s manquant" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s : impossible d'examiner vers l'avant de %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "impossible de trouver le point de redémarrage [%lld, %ld] dans %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "erreur de la machine à états" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "AcceptMessage invalide" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "erreur de l'analyse de AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "erreur lors de la création du journal des E/S" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "erreur en écrivant l'événement d'acceptation dans le journal" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "RejectMessage invalide" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "erreur de l'analyse de RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "erreur en écrivant l'événement de rejet dans le journal" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "AlertMessage invalide" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "erreur de l'analyse de AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "erreur lors de l'écriture de l'événement d'alerte dans le journal" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "erreur protocole" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "erreur d'écriture dans IoBuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "erreur de l'écriture de ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "erreur de l'écriture de CommandSuspend" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "type de ClientMessage non reconnu" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "message client trop grand" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "impossible de sélectionner la suite de chiffrement %s pour TLS 1.2 : %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "impossible de sélectionner la suite de chiffrement %s pour TLS 1.3 : %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "impossible d'obtenir la méthode TLS du serveur : %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "impossible de créer le contexte TLS : %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "impossible de charger le certificat %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "impossible de charger le paquet de l'autorité du certificat %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "impossible de charger la clé privée %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "impossible de définir les paramètres diffie-hellman : %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "impossible de définir TLS 1.2 comme étant la version minimale du protocole : %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "impossible d'obtenir l'adresse IP distante" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Impossible d'attacher les données utilisateur à l'objet ssl : %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "impossible d'ajouter l'événement à la queue" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "configuration du socket d'écoute impossible" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - envoyer le journal des E/S de sudo au serveur distant\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Options :\n" +" -f, --file chemin vers le fichier de configuration\n" +" -h, --help affiche l'aide puis termine l'exécution\n" +" -n, --no-fork ne pas démarrer une branche, exécuter au premier plan\n" +" -R, --random-drop pourcentage de chances que la connexion soit abandonnée\n" +" -V, --version affiche la version, puis termine l'exécution\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Version 1.3 ou supérieure de Protobuf-C requise" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "valeur d'abandon aléatoire invalide : %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s version %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS non supporté" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s  n'est pas un chemin totalement défini" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d « [ » sans correspondant : %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d section de configuration invalide : %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d ligne de configuration invalide : %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d nom de section attendu : %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "valeur invalide pour %s : %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d clé inconnue : %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "catégorie syslog %s inconnue" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "priorité syslog %s inconnue" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Options :\n" +" --help afficher le message d'aide puis terminer\n" +" -A, --accept n'envoyer qu'un événement d'acceptation (pas d'E/S)\n" +" -h, --host hôte à qui envoyer le journal\n" +" -i, --iolog_id ID distant du journal des E/S à redémarrer\n" +" -p, --port port à utiliser lors de la connexion à l'hôte\n" +" -r, --restart redémarrer le transfert du journal des E/S précédent\n" +" -R, --reject rejeter la commande avec la raison donnée\n" +" -b, --ca-bundle fichier du paquet de certificats avec lequel vérifier le certificat du serveur\n" +" -c, --cert fichier de certificat pour l'échange TLS\n" +" -k, --key fichier de la clé privée\n" +" -n, --no-verify ne pas vérifier le certificat du serveur\n" +" -t, --test tester le serveur d'audit en envoyant le journal des E/S sélectionné n fois en parallèle\n" +" -V, --version afficher les informations de version et terminer\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "impossible de rechercher %s:%s : %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "impossible d'obtenir l'adresse IP du serveur" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "impossible de lire %s/%s : %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "message client trop grand : %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: tampon d'écriture déjà en cours d'utilisation" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "événement d'E/S %d inattendu" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: état %d inattendu" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "ServerHello invalide" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "message d'erreur reçu du serveur : %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "message d'interruption reçu du serveur : %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "impossible de décompresser ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: valeur type_case %d inattendue" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "délai d'attente expiré durant la lecture depuis le serveur" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "fin de fichier prématurée" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "message serveur trop grand : %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "délai d'attente expiré durant l'écriture vers le serveur" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "le délai de la négociation TLS a expiré" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "impossible de définir l'événement" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "la communication TLS a échoué : %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Impossible d'initialiser le contexte ssl : %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Impossible d'allouer l'objet ssl : %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Impossible d'attacher le socket à l'objet ssl : %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "le point de redémarrage et le ID iolog doivent être spécifiés tous les deux" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "un point de redémarrage ne peut pas être placé quand aucune E/S est envoyée" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "terminé prématurément avec l'état %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "temps écoulé envoyé au serveur [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "point d'enregistrement reçu du serveur [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "L'alias « %s » est déjà défini" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "récupération de l'heure du jour impossible" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "changement du mot de passe impossible pour %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "récupération de la classe de connexion impossible pour l'utilisateur %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "démarrage de l'authentification bsd impossible" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "type d'authentification non valide" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "démarrage de l'authentification BSD impossible" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "votre compte est expiré" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "échec de l'approbation" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "lecture de la configuration fwtk (firewall) impossible" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "connexion au serveur d'authentification impossible" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "perte de la connexion au serveur d'authentification" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"erreur du serveur d'authentification :\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s : conversion de l'identité de l'hôte en chaîne de caractères impossible(« %s ») : %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s : analyse grammaticale (parse) de « %s » impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s : accès au cache des données d'identification impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s : allocation des options impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s : récupération des données d'identification impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s : initialisation du cache des données d'identification impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s : enregistrement des données d'identification dans le cache impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s : récupération de l'identité kerberos de l'hôte (« host principal ») impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s : vérification du ticket TGT impossible ! Il s'agit peut-être d'une attaque ! : %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "initialisation du module PAM impossible : %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Erreur du serveur d'authentification PAM : %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "la validation du compte a échoué, votre compte serait-il verrouillé ?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Le compte ou le mot de passe a expiré, réinitialisez votre mot de passe puis réessayez de vous connecter" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "changement du mot de passe expiré impossible : %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Le mot de passe a expiré, contactez votre administrateur système" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Le compte a expiré, ou la section « account » du module PAM n'est pas renseignée pour sudo, contactez votre administrateur système" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Erreur de gestion du compte PAM : %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "votre compte n'existe pas dans la base de données %s" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "échec de l'initialisation de la bibliothèque d'API ACE" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "le contact avec le serveur SecurID n'a pas pu être établi" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "l'identifiant de l'utilisateur est verrouillé pour l'authentification SecurID" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "la longueur du nom de l'utilisateur n'est pas conforme aux règles fixées pour SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "l'identifiant d'authentification (« Authentication Handle ») est invalide pour SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "la communication avec SecurID a échoué" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "erreur SecurID non identifiée" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "la longueur du mot de passe est invalide pour SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "initialisation de la session SIA impossible" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "méthodes d'authentification invalides" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Méthodes d'authentification non valides compilées dans sudo ! La combinaison d'authentifications autonomes et non-autonomes n'est pas permise." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "pas de méthodes d'authentification" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Aucune méthode d'authentification compilée dans sudo ! Si vous souhaitez désactiver l'authentification, utilisez l'option de configuration --disable-authentication" + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Initialisation des méthodes d'authentification impossible." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Méthodes d'authentification : " + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Identification de la condition d'audit impossible" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "impossible d'enregistrer l'enregistrement d'audit" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Nous espérons que vous avez reçu de votre administrateur système local\n" +"les consignes traditionnelles. Généralement, elles se concentrent sur ces trois éléments :\n" +"\n" +" #1) Respectez la vie privée des autres.\n" +" #2) Réfléchissez avant d'utiliser le clavier.\n" +" #3) De grands pouvoirs confèrent de grandes responsabilités.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "identifiant utilisateur inconnu : %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "utilisateur inconnu : %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "incrément d'ordre : %s : %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordre de départ : %s : %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "remplissage de l'ordre : %s : %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "Version de la grammaire de %s : %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "format d'entrée %s non supporté" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "format de sortie %s non supporté" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s : les fichiers d'entrée et de sortie doivent être différents" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "initialisation des valeurs par défaut de sudoers impossible" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s : %s : %s : %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: mot clé inconnu : %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "type par défaut invalide : %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "type de suppression invalide : %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "filtre invalide : %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "ouverture de %s impossible" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "échec lors de l'analyse grammaticale de %s, erreur inconnue" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "erreur lors de l'analyse grammaticale de %s au environs de la ligne %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "erreur lors de l'analyse grammaticale de %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "écriture impossible dans %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - convertir entre des formats de fichiers sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options:\n" +" -b, --base=dn le DN de base pour les requêtes LDAP de sudo\n" +" -c, --config=fich_conf le chemin vers le fichier de configuration\n" +" -d, --defaults=typesdef uniquement convertir les Defaults des types spécifiés\n" +" -e, --expand-aliases développer les alias lors de la conversion\n" +" -f, --output-format=format définir le format de sortie : JSON, LDIF ou sudoers\n" +" -i, --input-format=format définir le format d'entrée : LDIF ou sudoers\n" +" -I, --increment=num valeur pour incrémenter chaque sudoOrder\n" +" -h, --help afficher le message d'aide puis terminer\n" +" -m, --match=filtre ne convertir que les entrées correspondant au filtre\n" +" -M, --match-local le filtre de correspondance utilise les bases de données\n" +" des mots de passe et des groupes\n" +" -o, --output=fichier_sortie écrire les sudoers convertis dans fichier_sortie\n" +" -O, --order-start=num point de départ du premier sudoers\n" +" -p, --prune-matches éliminer les utilisateurs, groupes ou hôtes qui ne\n" +" correspondent pas\n" +" -P, --padding=num remplissage de base pour l'incrément de sudoOrder\n" +" -s, --suppress=sections supprimer la sortie de certaines sections\n" +" -V, --version afficher la version et terminer" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "entrée par défaut inconnue « %s »" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "récupération de l'heure GMT impossible" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "impossible de formater l'horodatage" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "trop d'entrées sudoers, maximum %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "la variable d'environnement SUDOERS_BASE n'est pas définie et l'option -b n'a pas été spécifiée." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Mécanisme syslog si syslog est utilisé pour la journalisation des événements : %s " + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Priorité syslog utilisée lorsque l'authentification de l'utilisateur est réussie : %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Priorité Syslog utilisée lorsque l'authentification de l'utilisateur a échoué : %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Présentation de l'invite OTP sur une ligne distincte" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ne pas tenir compte de « . » dans $PATH" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Toujours envoyer un courriel à chaque exécution de sudo" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Envoi d'un courriel lorsqu'une authentification échoue" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Envoi d'un courriel si l'utilisateur ne figure pas dans sudoers" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Envoi d'un courriel si l'utilisateur ne figure pas dans sudoers pour l'hôte sur lequel sudo est exécuté" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Envoi d'un courriel si l'utilisateur n'est pas autorisé à exécuter une commande" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Envoi d'un courriel si l'utilisateur tente d'exécuter une commande" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Utilisation d'un horodatage distinct pour chaque couple utilisateur/terminal (user/tty)" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Adresse les recommandations d'usage à l'utilisateur lors de la première exécution de sudo" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fichier contenant les recommandations sur l'usage de sudo : %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Exige l'authentification de l'utilisateur par défaut" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "L'utilisateur root peut exécuter sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Consignation du nom de l'hôte dans le fichier de journalisation (qui n'est pas syslog)" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Consignation de l'année dans le fichier de journalisation (qui n'est pas syslog)" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Démarrage d'un interpréteur de commande lorsque sudo est lancé sans argument" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Assigner le répertoire de l'utilisateur cible dans $HOME lorsque l'interpréteur de commandes est lancé avec l'option -s" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Assignation systématique du répertoire personnel de l'utilisateur cible dans $HOME" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Autorise la collecte de certaines informations dans le but d'afficher des messages d'erreurs pertinents" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Exige l'emploi du nom complet (fully qualified) de l'ordinateur dans le fichier sudoers" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Sermonne l'utilisateur lorsqu'un mot de passe incorrect est saisi" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Autorise l'utilisateur à exécuter sudo seulement à la condition qu'il dispose d'un terminal tty" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo se conformera au contenu de la variable d'environnement EDITOR" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Demande de la saisie du mot de passe de root et non de celui de l'utilisateur" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Demande de la saisie du mot de passe runas_default de l'utilisateur et non de son propre mot de passe" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Demande de la saisie du mot de passe de l'utilisateur cible et non de celui de l'utilisateur exécutant la commande" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Utilisation des paramètres par défaut de la classe de connexion de l'utilisateur cible (lorsqu'elle existe)" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Définir les variables d'environnement LOGNAME et USER" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Assigne uniquement l'identifiant utilisateur (UID) effectif à l'utilisateur cible, et non à l'identifiant réel." + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "N'initialise pas le vecteur de groupe avec les valeurs de l'utilisateur cible" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Longueur après laquelle intercaler un retour à la ligne dans le fichier journal (0 indique qu'il n'y a pas de retour à la ligne) : %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Délai d'expiration de l'horodatage de l'authentification : %.1f minutes" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Délai d'expiration de l'invite de saisie de mot de passe : %.1f minutes" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Nombre de tentatives de saisie du mot de passe : %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask à utiliser, ou 0777 pour hériter de celui de l'utilisateur : 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Emplacement du fichier de journalisation : %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Emplacement du programme d'envoi de courriel : %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Attributs à utiliser avec le programme d'envoi de courriel : %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adresse du destinataire des courriels : %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adresse de l'expéditeur des courriels : %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Champ objet des courriels envoyés : %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Message informant de la saisie d'un mot de passe incorrect : %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Répertoire contenant l'attestation que l'utilisateur a déjà reçu les recommandations : %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Répertoire contenant l'horodatage de l'authentification : %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Propriétaire du répertoire contenant l'horodatage de l'authentification : %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Les utilisateurs de ce groupe sont affranchis des contraintes relatives au mot de passe et à PATH : %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Invite de mot de passe par défaut : %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "S'il est défini, passprompt se substituera toujours à l'invite du système." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Utilisateur par défaut avec l'identité duquel exécuter les commandes : %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Nouvelle valeur prise par la variable $PATH de l'utilisateur : %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Emplacement de l'éditeur appelé par visudo : %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quand demander un mot de passe pour l'usage de la pseudo commande « list » : %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quand demander un mot de passe pour l'utilisation de la pseudo commande « verify » : %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Précharger la bibliothèque sudo_noexec qui remplace les fonctions exec" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Si un annuaire LDAP est actif, faut-il tenir compter du fichier sudoers local" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Les descripteurs de fichiers >= %d seront fermés avant l'exécution d'une commande" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Si elle est définie, les utilisateurs peuvent passer outre la valeur de « closeform » grâce à l'option -C" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Autorise les utilisateurs à définir des variables d'environnement arbitraires" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Réinitialise l'environnement à un jeu de variables par défaut" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Variables d'environnement à valider pour s'assurer de la sécurité :" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Variables d'environnement à supprimer :" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Variables d'environnement à conserver :" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Rôle SELinux à utiliser dans le nouveau contexte de sécurité : %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Type SELinux à utiliser dans le nouveau contexte de sécurité : %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Emplacement du fichier d'environnement propre à sudo : %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Emplacement du fichier d'environnement restreint propre à sudo : %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Environnement linguistique à utiliser lors de l'analyse syntaxique de sudoers : %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Autoriser sudo à demander la saisie d'un mot de passe même lorsque celui-ci sera affiché « en clair »" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Afficher un contrôle visuel lors de la saisie du mot de passe" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Utiliser le développement rapide des noms de fichiers, qui est moins fiable, mais ne nécessite pas d'accès au système de fichiers" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "L'umask indiqué dans sudoers se substituera à celui de l'utilisateur, même s'il est plus permissif" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Consignation des saisies des utilisateur dans le journal pour la commande en cours d'exécution" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Consignation du retour de la commande en cours d'exécution dans le journal" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Compression des informations renvoyées par les opérations d'E/S avec zlib" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Exécute toujours les commandes dans un pseudo-terminal (tty)" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Greffon pour la prise en charge des groupes non-Unix : %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Répertoire dans lequel les informations renvoyées par les opérations d'entrée/sortie seront stockées : %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fichier dans lequel les informations renvoyées par les opérations d'entrée/sortie seront stockées : %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Ajout d'une entrée au fichier utmp/utmpx lors de l'allocation d'un pseudo-terminal" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Conservation dans utmp du nom de l'utilisateur runas, et non de celui de l'utilisateur appelant sudo" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Ensemble des privilèges permis : %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Ensemble des privilèges limités : %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Exécution des commandes sur un pseudo-terminal en tâche de fond" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nom de service PAM à utiliser : %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nom de service PAM à utiliser pour les interpréteurs de commandes : %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tentative de création des données d'identification PAM pour l'utilisateur cible" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Création d'une nouvelle session PAM pour l'exécution de la commande" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Réaliser la gestion de la validation du compte PAM" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Numéro de séquence maximum dans le journal E/S : %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Activation de la prise en charge de netgroup par sudoers" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Vérification que les droits du répertoire parent autorisent la modification des fichiers avec sudoedit" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Suivre les liens symboliques lors de l'édition des fichiers avec sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Interroge le greffon de groupe pour les groupes système inconnus" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Faire correspondre les netgroups sur base du tuple entier: utilisateur, hôte et domaine" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Autoriser l'exécution des commandes même si sudo ne sait pas écrire dans le journal d'audit" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Autoriser l'exécution des commandes même si sudo ne sait pas écrire dans le journal des E/S" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Autoriser l'exécution des commandes même si sudo ne sait pas écrire dans le fichier journal" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Résoudre les groupes dans sudoers et établir la correspondance sur le ID de groupe au lieu du nom" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Les entrées du journal plus longues que cette valeur seront scindées en plusieurs messages dans syslog : %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Utilisateur qui possèdera les fichiers journaux des E/S : %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Groupe qui possèdera les fichiers journaux des E/S : %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Mode de permission à utiliser sur les fichiers de journaux des E/S : 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Exécuter les commandes par descripteur de fichier plutôt que par chemin : %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorer les entrées « Defaults » inconnues dans sudoers au lieu d'afficher un avertissement" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Temps en secondes après lequel la commande sera terminée : %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Autoriser l'utilisateur à spécifier un délai d'expiration sur la ligne de commande" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Forcer l'écriture des données du journal d'E/S sur disque immédiatement au lieu de les garde dans un tampon" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Inclure le ID du processus lors de la journalisation via syslog" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Type de l'enregistrement de l'horodatage de l'authentification : %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Message de l'échec de l'authentification : %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Ignorer la casse lors de la correspondance des noms d'utilisateurs" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Ignorer la casse lors de la correspondance des noms de groupes" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Écrire dans le journal lorsqu'une commande est autorisée par sudoers" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Écrire dans le journal lorsqu'une commande est interdite par sudoers" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Serveur(s) des journaux sudo auquel se connecter avec un port facultatif" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Délai d'expiration du serveur des journaux sudo en seconde : %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Activer l'option SO_KEEPALIVE du socket sur le socket connecté au serveur de journal" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Emplacement du fichier du paquet du CA d'audit du serveur : %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Emplacement du fichier de certificat de sudoers : %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Emplacement du fichier de clé privée de sudoers : %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Vérifier que le certificat du serveur contenant le journal est valide" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Autoriser l'utilisation d'ID d'utilisateurs ou de groupe inconnus dans runas" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Uniquement autoriser l'exécutions de commandes en tant qu'un utilisateur avec un interpréteur de commande valide" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Définir l'utilisateur distant de pam à l'utilisateur qui exécute sudo" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Définir l'hôte distant de pam au nom de l'hôte local" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Le répertoire de travail à utiliser avant d'exécuter la commande : %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Le répertoire racine à utiliser avant d'exécuter la commande : %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "Format des journaux à produire : %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: entrées par défaut inconnues « %s »" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: entrée par défaut inconnue « %s »" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: pas de valeur précisée pour « %s »" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: pas de valeur précisée pour « %s »" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: l'option « %s » ne prend pas de valeur" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: l'option « %s » ne prend pas de valeur" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: type Defaults 0x%x invalide pour l'option « %s »" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: type Defaults 0x%x invalide pour l'option «␣%s␣»" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: la valeur « %s » ne convient pas pour l'option « %s »" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: la valeur « %s » ne convient pas pour l'option « %s »" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: les valeurs de « %s » doivent commencer par « / », « ~ » ou « * »" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: les valeurs de « %s » doivent commencer par « / », « ~ » ou « * »" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: les valeurs de « %s » doivent commencer par « / »" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: les valeurs de « %s » doivent commencer par « / »" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv : envp est corrompu, longueur incorrecte" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "impossible de créer à nouveau l'environnement" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "désolé, vous n'êtes pas autorisé à définir ces variables d'environnement : %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "erreur d'analyse grammaticale dans %s aux environs de la ligne %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "erreur d'analyse grammaticale dans %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "le type résumé (digest type) %d pour n'est pas autorisé pour %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s : erreur en lecture" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s doit appartenir à l'utilisateur (uid) %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "seul le propriétaire doit avoir le droit en écriture sur %s" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "chargement de %s impossible : %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "le symbole « group_plugin » est introuvable dans %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s : la version majeure %d du greffon group est incompatible, la version attendue est %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "impossible de reconnaître le format de l'adresse IP « %s »" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "impossible de reconnaître le format du masque de sous-réseau « %s »" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Couples adresse IP locale/masque de sous-réseau :\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "groupe inconnu : %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "mise à jour du fichier de séquence impossible" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "impossible d'écrire dans le journal des E/S : %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "impossible de créer %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: erreur interne, le fichier journal des E/S pour l'événement %d n'est pas ouvert" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "lecture de l'horloge impossible" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: erreur interne, signal %d invalide" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls n'est pas pris en charge lors de l'utilisation de ldap" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "impossible d'initialiser le certificat SSL et la base de clés : %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "TLS_CERT doit être défini dans %s pour pouvoir utiliser SSL" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "initialisation de LDAP impossible : %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls est spécifié mais les bibliothèques LDAP ne gèrent pas ldap_start_tls_s() ou ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "attribut sudoOrder invalide : %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: port trop grand" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "type d'uri LDAP non pris en charge : %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "fusion des URIs ldap et ldaps impossible" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "impossible de convertir sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "ouverture du fichier d'audit du système impossible" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "envoi du message d'audit impossible" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "erreur dans la boucle des événements" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "La création du nouvel objet SSL_CTX a échoué : %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "la connexion TLS à %s:%s a échoué : %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "l'initialisation TLS n'a pas réussi" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "la négociation TLS n'a pas réussi" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: erreur interne, statut de sortie %d invalide" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "perte de la connexion au serveur de journalisation" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "tampon d'écriture manquant" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "impossible de se connecter au serveur de journal" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "l'utilisateur n'apparaît PAS dans sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "l'utilisateur n'est PAS autorisé sur cet hôte" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "commande non autorisée" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s n'apparaît pas dans le fichier sudoers. Cet incident sera signalé.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s n'est pas autorisé à exécuter sudo sur %s. Cet incident sera signalé.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Désolé, l'utilisateur %s ne peut pas utiliser sudo sur %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Désolé, l'utilisateur %s n'est pas autorisé à exécuter « %s%s%s » en tant que %s%s%s sur %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s : commande introuvable" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"« %s » trouvé dans « . » n'a pas été exécuté\n" +"Utilisez « sudo ./%s » si c'est bien la version de « %s » que vous souhaitez exécuter." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u saisie de mot de passe incorrecte" +msgstr[1] "%u saisies de mots de passe incorrectes" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "échec de l'authentification" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "il est nécessaire de saisir un mot de passe" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "ouverture du fichier de journalisation impossible : %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "impossible d'écrire le fichier journal : %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "le résume (digest) de %s (%s) n'est pas dans le forme %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Rôle LDAP : %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Entrée sudoers :\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAsUsers : " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAsGroups : " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Options : " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Commandes :\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Entrées Defaults correspondant pour %s sur %s :\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Paramètres par défaut de runas ou spécifiques aux commandes pour %s :\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'utilisateur %s peut utiliser les commandes suivantes sur %s :\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "L'utilisateur %s n'est pas autorisé à exécuter sudo sur %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "le sudoRole incomplet est ignoré : cn : %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "attribut LDIF invalide : %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s invalide défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "impossible d'analyser la liste des adresses réseau" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "nom d'utilisateur pas défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "ID utilisateur pas défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "ID de groupe pas défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "nom d'hôte pas défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "répertoire de travail invalide : %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "répertoire chroot invalide : %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "exécution de %s impossible" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "La version du greffon de politique de sudoers est %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "La version de la grammaire du fichier sudoers est %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Chemin d'accès à sudoers : %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "chemin d'accès à nsswitch : %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "chemin d'accès à ldap.conf : %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "chemin d'accès à ldap.secret : %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "activation d'un point d'ancrage de type %d (version %d.%d) impossible" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "enregistrement de l'uid %u dans le cache impossible" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "enregistrement de l'uid %u dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "impossible d'écrire l'utilisateur %s dans la cache" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "enregistrement des informations de l'utilisateur %s dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "enregistrement du gid %u dans le cache impossible" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "enregistrement du gid %u dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "impossible d'écrire le groupe %s dans la cache" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "enregistrement du groupe %s dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "enregistrement de la liste de groupe %s dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "impossible d'écrire la liste de groupes dans la cache pour %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "impossible d'analyser les groupes pour %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "impossible d'analyser les gids pour %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "débordement de la pile perm" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "débordement inférieur de la pile perm" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "changement de l'identificateur de groupe (gid) de root impossible" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "changement du groupe effectif (runas) impossible" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "définition du vecteur du groupe effectif (runas) impossible" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "changement de l'uid effectif (runas) impossible" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "changement du groupe (gid) de sudoers impossible" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "trop de processus" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "récupération du répertoire de travail impossible" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "le chemin d'accès à l'audit user_cmnd a été tronqué : %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "le chemin d'accès à l'audit argv[0] a été tronqué : %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "initialisation de la source SSS impossible. SSSD est-il installé sur cette machine ?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "Le symbole « %s » est introuvable dans %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "les entrées par défaut posent un problème" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "aucune source sudoers valide n'a été trouvée, fin d'exécution" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "l'utilisateur n'est pas autorisé à changer le répertoire racine en %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "vous n'êtes pas autorisé à utiliser l'option -R avec %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "l'utilisateur n'est pas autorisé à changer de répertoire vers %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "vous n'êtes pas autorisé à utiliser l'option -D avec %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "il est précisé dans sudoers que root n'est pas autorisé à utiliser sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "l'utilisateur n'est pas autorisé à outrepasser la limite closeform" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "vous n'êtes pas autorisé à utiliser l'option -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "propriétaire du fichier d'horodatage (%s) : utilisateur inconnu" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "pas de terminal tty" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "désolé, vous devez avoir un terminal tty pour exécuter sudo" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "interpréteur de commande invalide pour l'utilisateur %s : %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "commande dans le répertoire courant" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "l'utilisateur n'est pas autorisé à définir un délai d'expiration de la commande" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "désolé, vous n'êtes pas autorisé à définir un délai d'expiration de la commande" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "l'utilisateur n'est pas autorisé à conserver l'environnement" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "désolé, vous n'êtes pas autorisé à conserver l'environnement" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "commande trop longue" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit n'a pas besoin d'être exécuté via sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "lecture de %s impossible" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "impossible d'appliquer la fonction stat à %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s n'est pas un fichier ordinaire" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "Le fichier %s est la propriété de l'utilisateur (uid) %u, alors qu'il devrait appartenir à %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "Le fichier %s est ouvert en écriture pour tous" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "Le fichier %s a pour groupe (gid) %u, alors qu'il devrait appartenir au groupe %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "« -c %s » est réservé à l'utilisateur root" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "classe de connexion inconnue : %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "impossible de résoudre l'hôte %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "option du filtre invalide : %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "attente maximum invalide : %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "facteur de vitesse invalide : %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s : %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/timing : %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s : %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Rejeu de la session sudo : %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "impossible d'initialiser le terminal tty en mode direct" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Attention : la taille du terminal n'est pas suffisante pour pouvoir rejouer correctement la séquence.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "La taille du journal est %d × %d, la taille de votre terminal est %d × %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Rejeu terminé, appuyez sur n'importe quelle touche pour rétablir le terminal." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "expression ambiguë « %s »" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "« ) » sans parenthèse ouvrante dans l'expression" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "terme de recherche « %s » inconnu" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s requiert un argument" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expression rationnelle invalide : %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "analyse de la date « %s » impossible" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "« ( » sans parenthèse fermante dans l'expression" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "« or » n'est pas autorisé en fin d'expression" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "« ! » n'est pas autorisé en fin d'expression" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "type de recherche %d inconnu" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "utilisation : %s [-hnRS] [-d répertoire] [-m nombre] [-s nombre] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "utilisation : %s [-h] [-d répertoire] -l [expression recherchée]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - rejeu du journal de la session sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options :\n" +" -d, --directory=rép indique le répertoire pour les journaux de sessions\n" +" -f, --filter=filtre indique quel(s) type(s) E/S à afficher\n" +" -h, --help affiche le message d'aide puis termine l'exécution\n" +" -l, --list liste les identificateurs de sessions disponibles,\n" +" il est possible d'ajouter une expression en paramètre\n" +" -m, --max-wait=val nombre maximum de secondes de temporisation entre les événements\n" +" -n, --non-interactive aucune demande, la session est envoyée sur la sortie standard\n" +" -R, --no-resize ne pas tenter de redimensionner le terminal\n" +" -S, --suspend-wait attend pendant que la commande a été suspendue\n" +" -s, --speed=valeur accélère ou ralentit l'exécution\n" +" -V, --version affiche la version du programme, puis termine l'exécution" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\tl'hôte n'a pas de correspondance" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Commande autorisée" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Commande refusée" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Commande sans correspondance" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s est accessible en écriture pour les membres du groupe" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "impossible de tronquer le fichier d'horodatage à %lld octets" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "un horodatage dans le futur a été ignoré" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "l'horodatage est trop avancé dans le future : %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "verrouillage du fichier d'horodatage %s impossible" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "le chemin d'accès au fichier d'état de la recommandation est trop long : %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit ne devrait pas être spécifié avec un chemin" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "l'option -x sera supprimée dans une version ultérieure" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "envisagez plutôt l'utilisation de l'utilitaire cvtsudoers" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "appuyer sur entrée pour éditer %s : " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "l'éditeur indiqué (%s) n'existe pas" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "aucun éditeur trouvé (chemin d'accès à l'éditeur : %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "erreur en écriture" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "impossible d'appliquer la fonction stat au fichier temporaire (%s), %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "fichier temporaire vide (%s), %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "l'éditeur (%s) a échoué, %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "impossible de rouvrir le fichier temporaire (%s), %s n'a pas été modifié." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "impossible d'analyser le fichier temporaire (%s), erreur inconnue" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "erreur interne, impossible de trouver %s dans la liste !" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "impossible de définir (uid, gid) de %s à (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s et %s ne sont pas dans le même système de fichiers, tentative de renommage à l'aide de la commande mv" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "la commande a échoué : « %s %s %s », %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "erreur lors du renommage de %s, %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Et maintenant ?" + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Les options sont :\n" +" (e)dition du fichier sudoers (de nouveau)\n" +" e(x)it sans sauvegarde des modifications apportées au fichier sudoers\n" +" (Q)uitter et sauvegarder les modifications apportées au fichier sudoers (DANGER!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "exécution de %s impossible" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s : mauvais propriétaire (uid, gid), celui-ci devrait être (%u,%u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s : mauvais droits d'utilisation, le mode devrait être 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s : analyse réussie\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s n'est pas disponible, réessayez plus tard" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "impossible de verrouiller %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Éditer quand même ? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Erreur : %s:%d:%d: boucle dans %s « %s »" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Attention : %s:%d:%d: boucle dans %s « %s »" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Erreur : %s:%d:%d: il est fait mention de %s « %s » alors qu'il n'a pas été défini" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Attention : %s:%d:%d: il est fait mention de %s « %s » alors qu'il n'a pas été défini" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Attention : %s:%d:%d: %s « %s » n'est pas utilisé" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - édite le fichier sudoers en toute sécurité\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Options :\n" +" -c, --check mode de validation\n" +" -f, --file=fichier précise l'emplacement du fichier sudoers\n" +" -h, --help affiche l'aide puis termine l'exécution\n" +" -q, --quiet moins de messages d'erreur de syntaxe (mode silencieux)\n" +" -s, --strict validation stricte de la syntaxe\n" +" -V, --version affiche la version, puis termine l'exécution\n" + +#: toke.l:179 +msgid "empty string" +msgstr "chaîne vide" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "groupe vide" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "netgroup vide" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "la suite de la ligne est invalide" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "adresse IPv6 invalide" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "saut de ligne inattendu dans la chaîne" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "nombre de niveaux d'inclusions trop élevé" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "Préchargement des fonctions d'exécution « à blanc » contenues dans la bibliothèque sudo_noexec" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "verrouillage du fichier de journalisation impossible : %s" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports : valeur de port trop élevée" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "SSL_connect a échoué : ssl_error=%d, pile=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "le fichier du paquet CA n'a pas été spécifié" + +#~ msgid "Client certificate was not specified" +#~ msgstr "Le certificat du client n'a pas été spécifié" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "Impossible d'allouer l'objet ssl : %s\n" + +#~ msgid "Unable to attach socket to the ssl object: %s\n" +#~ msgstr "Impossible d'attacher le socket à l'objet ssl : %s\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "message client trop grand : %zu\n" + +#~ msgid "server message too large: %u\n" +#~ msgstr "message serveur trop long : %u\n" + +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "Le fichier de paquet du CA n'est pas défini dans sudoers" + +#~ msgid "Calling SSL_CTX_load_verify_locations() failed: %s" +#~ msgstr "L'appel de SSL_CTX_load_verify_locations() a échoué : %s" + +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "Le fichier de certificat signé n'est pas défini dans sudoers" + +#~ msgid "Unable to load private key into the ssl context: %s" +#~ msgstr "Impossible de charger la clé privée dans le contexte ssl : %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_connect a échoué : ssl_error=%d, pile=%s" + +#~ msgid "SSL_read failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_read a échoué : ssl_error=%d, pile=%s" + +#~ msgid "SSL_write failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_write a échoué : ssl_error=%d, pile=%s" + +#~ msgid "unknown address family: %d" +#~ msgstr "famille d'adresse inconnue : %d" + +#~ msgid "audit_failure message too long" +#~ msgstr "le message audit_failure est trop long" + +#~ msgid "No user or host" +#~ msgstr "Pas d'utilisateur ou d'hôte" + +#~ msgid "validation failure" +#~ msgstr "échec de la validation" + +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/timing : %s" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "la valeur d'attribut invalide est ignorée : %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "enregistrement des informations de l'utilisateur %s dans le cache impossible, mémoire insuffisante" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "enregistrement du groupe %s dans le cache impossible, mémoire insuffisante" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "enregistrement de la liste de groupe %s dans le cache impossible, mémoire insuffisante" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Rôle LDAP : INCONNU\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Ordre : %s\n" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "Chemin d'accès au fichier d'horodatage trop long : %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "impossible d'obtenir les stats de l'éditeur (%s)" + +#~ msgid "Password:" +#~ msgstr "Mot de passe :" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports : espace insuffisant pour étendre hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri :espace insuffisant pour créer hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 : erreur d'allocation" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "fusion ldaps et starttls impossible" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "erreur interne : espace insuffisant pour la ligne de journalisation" + +#~ msgid "value out of range" +#~ msgstr "valeur hors de limites " + +#~ msgid "writing to standard output" +#~ msgstr "écriture vers la sortie standard" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "le nombre d'expressions entre parenthèses est trop élevé, le maximum autorisé est %d" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s appartient à l'utilisateur identifié par %u, alors qu'il devrait appartenir à l'utilisateur identifié par %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s peut être modifié par d'autres utilisateur que son propriétaire (0%o), le mode des privilèges devrait être 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s existe mais n'est pas un fichier ordinaire (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s peut être modifié par d'autres utilisateurs que son propriétaire (0%o), le mode des privilèges devrait être 0600" + +#~ msgid "unable to remove %s, will reset to the epoch" +#~ msgstr "suppression de %s impossible, l'horodatage sera réinitialisé à la date courante" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args : débordement du tampon" + +#~ msgid "%s: unused %s_Alias %s" +#~ msgstr "%s : %s_Alias %s n'est pas utilisé" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s : %s aux environs de la ligne %d <<<" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok : %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate : %s" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit : échec" + +#~ msgid "getauid failed" +#~ msgstr "échec de getauid" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject : échec" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args : échec" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32 : échec" + +#~ msgid "getauid: failed" +#~ msgstr "getauid : échec" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text : échec" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "impossible d'initialiser la localisation à « %s », initialisation à « C »" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Commandes :\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr " : " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "impossible d'enregistrer l'uid %u (%s) dans le cache, l'entrée existe déjà" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "impossible d'enregistrer le gid %u (%s) dans le cache, l'entrée existe déjà" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "impossible d'appliquer dlopen à %s : %s" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep : tv_sec %ld, tv_nsec %ld" diff --git a/plugins/sudoers/po/fur.mo b/plugins/sudoers/po/fur.mo new file mode 100644 index 0000000..8fb36e6 Binary files /dev/null and b/plugins/sudoers/po/fur.mo differ diff --git a/plugins/sudoers/po/fur.po b/plugins/sudoers/po/fur.po new file mode 100644 index 0000000..4423803 --- /dev/null +++ b/plugins/sudoers/po/fur.po @@ -0,0 +1,2119 @@ +# Friulian translations for sudoers package +# This file is put in the public domain. +# Fabio Tomat , 2017 +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.22b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-12-18 10:37-0700\n" +"PO-Revision-Date: 2017-12-24 14:18+0100\n" +"Last-Translator: Fabio Tomat \n" +"Language-Team: Friulian \n" +"Language: fur\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.3\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "erôr di sintassi" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Password di %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] password par %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Password: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** informazions di SIGURECE par %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Torne prove." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:307 gram.y:314 gram.y:321 gram.y:328 gram.y:335 +#: gram.y:398 gram.y:406 gram.y:416 gram.y:449 gram.y:456 gram.y:463 +#: gram.y:470 gram.y:552 gram.y:559 gram.y:568 gram.y:577 gram.y:594 +#: gram.y:706 gram.y:713 gram.y:720 gram.y:728 gram.y:824 gram.y:831 +#: gram.y:838 gram.y:845 gram.y:852 gram.y:878 gram.y:885 gram.y:892 +#: gram.y:1015 gram.y:1195 gram.y:1202 plugins/sudoers/alias.c:124 +#: plugins/sudoers/alias.c:139 plugins/sudoers/auth/bsdauth.c:141 +#: plugins/sudoers/auth/kerb5.c:119 plugins/sudoers/auth/kerb5.c:145 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/defaults.c:651 +#: plugins/sudoers/defaults.c:906 plugins/sudoers/defaults.c:1077 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:93 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:120 plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:980 plugins/sudoers/ldap.c:1174 +#: plugins/sudoers/ldap.c:1185 plugins/sudoers/ldap.c:1201 +#: plugins/sudoers/ldap.c:1493 plugins/sudoers/ldap.c:1653 +#: plugins/sudoers/ldap.c:1735 plugins/sudoers/ldap.c:1883 +#: plugins/sudoers/ldap.c:1907 plugins/sudoers/ldap.c:1996 +#: plugins/sudoers/ldap.c:2011 plugins/sudoers/ldap.c:2107 +#: plugins/sudoers/ldap.c:2140 plugins/sudoers/ldap.c:2221 +#: plugins/sudoers/ldap.c:2303 plugins/sudoers/ldap.c:2400 +#: plugins/sudoers/ldap.c:3235 plugins/sudoers/ldap.c:3267 +#: plugins/sudoers/ldap.c:3579 plugins/sudoers/ldap.c:3607 +#: plugins/sudoers/ldap.c:3623 plugins/sudoers/ldap.c:3713 +#: plugins/sudoers/ldap.c:3729 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:190 plugins/sudoers/logging.c:501 +#: plugins/sudoers/logging.c:522 plugins/sudoers/logging.c:563 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:998 +#: plugins/sudoers/match.c:617 plugins/sudoers/match.c:664 +#: plugins/sudoers/match.c:714 plugins/sudoers/match.c:738 +#: plugins/sudoers/match.c:826 plugins/sudoers/match.c:915 +#: plugins/sudoers/parse.c:252 plugins/sudoers/parse.c:264 +#: plugins/sudoers/parse.c:279 plugins/sudoers/parse.c:291 +#: plugins/sudoers/policy.c:498 plugins/sudoers/policy.c:735 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:165 +#: plugins/sudoers/pwutil.c:236 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:486 plugins/sudoers/pwutil.c:551 +#: plugins/sudoers/pwutil.c:620 plugins/sudoers/pwutil.c:778 +#: plugins/sudoers/pwutil.c:835 plugins/sudoers/pwutil.c:880 +#: plugins/sudoers/pwutil.c:938 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:353 plugins/sudoers/sssd.c:392 +#: plugins/sudoers/sssd.c:1073 plugins/sudoers/sssd.c:1252 +#: plugins/sudoers/sssd.c:1266 plugins/sudoers/sssd.c:1282 +#: plugins/sudoers/sudoers.c:263 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:682 plugins/sudoers/sudoers.c:807 +#: plugins/sudoers/sudoers.c:851 plugins/sudoers/sudoers.c:1123 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:1254 +#: plugins/sudoers/sudoreplay.c:1366 plugins/sudoers/sudoreplay.c:1406 +#: plugins/sudoers/sudoreplay.c:1415 plugins/sudoers/sudoreplay.c:1425 +#: plugins/sudoers/sudoreplay.c:1433 plugins/sudoers/sudoreplay.c:1437 +#: plugins/sudoers/sudoreplay.c:1593 plugins/sudoers/sudoreplay.c:1597 +#: plugins/sudoers/testsudoers.c:131 plugins/sudoers/testsudoers.c:217 +#: plugins/sudoers/testsudoers.c:234 plugins/sudoers/timestamp.c:397 +#: plugins/sudoers/timestamp.c:441 plugins/sudoers/timestamp.c:868 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:153 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:985 plugins/sudoers/visudo.c:1051 +#: plugins/sudoers/visudo.c:1095 plugins/sudoers/visudo.c:1197 +#: plugins/sudoers/visudo_json.c:1025 toke.l:849 toke.l:949 toke.l:1106 +msgid "unable to allocate memory" +msgstr "impussibil assegnâ memorie" + +#: gram.y:481 +msgid "a digest requires a path name" +msgstr "un digest al domande un non di percors" + +#: gram.y:607 +msgid "invalid notbefore value" +msgstr "" + +#: gram.y:615 +msgid "invalid notafter value" +msgstr "" + +#: gram.y:624 plugins/sudoers/policy.c:314 +msgid "timeout value too large" +msgstr "valôr di timeout masse larc" + +#: gram.y:626 plugins/sudoers/policy.c:316 +msgid "invalid timeout value" +msgstr "valôr di timeout no valit" + +#: gram.y:1195 gram.y:1202 plugins/sudoers/auth/pam.c:320 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:651 plugins/sudoers/defaults.c:906 +#: plugins/sudoers/defaults.c:1077 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:93 +#: plugins/sudoers/env.c:233 plugins/sudoers/filedigest.c:120 +#: plugins/sudoers/filedigest_gcrypt.c:72 +#: plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:980 plugins/sudoers/ldap.c:1174 +#: plugins/sudoers/ldap.c:1185 plugins/sudoers/ldap.c:1201 +#: plugins/sudoers/ldap.c:1493 plugins/sudoers/ldap.c:1653 +#: plugins/sudoers/ldap.c:1735 plugins/sudoers/ldap.c:1883 +#: plugins/sudoers/ldap.c:1907 plugins/sudoers/ldap.c:1996 +#: plugins/sudoers/ldap.c:2011 plugins/sudoers/ldap.c:2107 +#: plugins/sudoers/ldap.c:2140 plugins/sudoers/ldap.c:2220 +#: plugins/sudoers/ldap.c:2303 plugins/sudoers/ldap.c:2400 +#: plugins/sudoers/ldap.c:3235 plugins/sudoers/ldap.c:3267 +#: plugins/sudoers/ldap.c:3579 plugins/sudoers/ldap.c:3606 +#: plugins/sudoers/ldap.c:3622 plugins/sudoers/ldap.c:3713 +#: plugins/sudoers/ldap.c:3729 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:190 plugins/sudoers/logging.c:501 +#: plugins/sudoers/logging.c:522 plugins/sudoers/logging.c:562 +#: plugins/sudoers/logging.c:998 plugins/sudoers/match.c:616 +#: plugins/sudoers/match.c:663 plugins/sudoers/match.c:714 +#: plugins/sudoers/match.c:738 plugins/sudoers/match.c:826 +#: plugins/sudoers/match.c:914 plugins/sudoers/parse.c:252 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:279 +#: plugins/sudoers/parse.c:291 plugins/sudoers/policy.c:128 +#: plugins/sudoers/policy.c:137 plugins/sudoers/policy.c:146 +#: plugins/sudoers/policy.c:172 plugins/sudoers/policy.c:299 +#: plugins/sudoers/policy.c:314 plugins/sudoers/policy.c:316 +#: plugins/sudoers/policy.c:342 plugins/sudoers/policy.c:352 +#: plugins/sudoers/policy.c:396 plugins/sudoers/policy.c:406 +#: plugins/sudoers/policy.c:415 plugins/sudoers/policy.c:424 +#: plugins/sudoers/policy.c:498 plugins/sudoers/policy.c:735 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:165 +#: plugins/sudoers/pwutil.c:236 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:486 plugins/sudoers/pwutil.c:551 +#: plugins/sudoers/pwutil.c:620 plugins/sudoers/pwutil.c:778 +#: plugins/sudoers/pwutil.c:835 plugins/sudoers/pwutil.c:880 +#: plugins/sudoers/pwutil.c:938 plugins/sudoers/set_perms.c:387 +#: plugins/sudoers/set_perms.c:766 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1476 plugins/sudoers/set_perms.c:1641 +#: plugins/sudoers/sssd.c:162 plugins/sudoers/sssd.c:194 +#: plugins/sudoers/sssd.c:237 plugins/sudoers/sssd.c:244 +#: plugins/sudoers/sssd.c:280 plugins/sudoers/sssd.c:352 +#: plugins/sudoers/sssd.c:392 plugins/sudoers/sssd.c:1073 +#: plugins/sudoers/sssd.c:1251 plugins/sudoers/sssd.c:1266 +#: plugins/sudoers/sssd.c:1282 plugins/sudoers/sudoers.c:263 +#: plugins/sudoers/sudoers.c:273 plugins/sudoers/sudoers.c:281 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:682 +#: plugins/sudoers/sudoers.c:807 plugins/sudoers/sudoers.c:851 +#: plugins/sudoers/sudoers.c:1123 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:1254 plugins/sudoers/sudoreplay.c:1366 +#: plugins/sudoers/sudoreplay.c:1406 plugins/sudoers/sudoreplay.c:1415 +#: plugins/sudoers/sudoreplay.c:1425 plugins/sudoers/sudoreplay.c:1433 +#: plugins/sudoers/sudoreplay.c:1437 plugins/sudoers/sudoreplay.c:1593 +#: plugins/sudoers/sudoreplay.c:1597 plugins/sudoers/testsudoers.c:131 +#: plugins/sudoers/testsudoers.c:217 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/timestamp.c:397 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/timestamp.c:868 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:146 +#: plugins/sudoers/visudo.c:153 plugins/sudoers/visudo.c:309 +#: plugins/sudoers/visudo.c:315 plugins/sudoers/visudo.c:446 +#: plugins/sudoers/visudo.c:624 plugins/sudoers/visudo.c:985 +#: plugins/sudoers/visudo.c:1051 plugins/sudoers/visudo.c:1095 +#: plugins/sudoers/visudo.c:1197 plugins/sudoers/visudo_json.c:1025 toke.l:849 +#: toke.l:949 toke.l:1106 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:135 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "impussibil otignî la classe di login pal utent %s" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "impussibil tacâ la autenticazion bsd" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "gjenar di autenticazion no valit" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "impussibil inizializâ la autenticazion BSD" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "impussibil conetisi al servidôr di autenticazion" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "conession pierdude al servidôr di autenticazion" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"erôr dal servidôr di autenticazion:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: impussibil analizâ '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: impussibil assegnâ opzions: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: impussibil otignî credenziâls: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: impussibil archiviâ la credenziâl te cache: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Impussibil verificâ TGT! Pussibil atac in vore!: %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "impussibil inizializâ PAM" + +#: plugins/sudoers/auth/pam.c:194 +msgid "account validation failure, is your account locked?" +msgstr "validazion account falide, isal blocât?" + +#: plugins/sudoers/auth/pam.c:198 +msgid "Account or password is expired, reset your password and try again" +msgstr "Acount o password scjadude, ristabilìs la password e torne prove" + +#: plugins/sudoers/auth/pam.c:206 +#, c-format +msgid "unable to change expired password: %s" +msgstr "impussibil cambiâ la password scjadude: %s" + +#: plugins/sudoers/auth/pam.c:211 +msgid "Password expired, contact your system administrator" +msgstr "Password scjadude, contatâ l'aministradôr di sisteme" + +#: plugins/sudoers/auth/pam.c:215 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:229 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Erôr di autenticazion PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "no tu esistis te base di dâts %s" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "no si è rivâts a inizializâ la librarie API ACE" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "impussibil contatâ il servidôr SecurID" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "ID utent blocât pe autenticazion SecurID" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "lungjece dal non utent no valide par SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "Comunicazion SecurID falide" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "erôr SecurID no cognossût" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "lungjece dal passcode no valide par SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:125 +msgid "unable to initialize SIA session" +msgstr "impussibil inizializâ la session SIA" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "metodis di autenticazion no valits" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "nissun metodi di autenticazion" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "Impussibil inizializâ i metodis di autenticazion." + +#: plugins/sudoers/auth/sudo_auth.c:441 +msgid "Authentication methods:" +msgstr "Metodis di autenticazion:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "" + +#: plugins/sudoers/check.c:259 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" + +#: plugins/sudoers/check.c:302 plugins/sudoers/check.c:312 +#: plugins/sudoers/sudoers.c:725 plugins/sudoers/sudoers.c:770 +#, c-format +msgid "unknown uid: %u" +msgstr "uid no cognossût: %u" + +#: plugins/sudoers/check.c:307 plugins/sudoers/iolog.c:260 +#: plugins/sudoers/policy.c:908 plugins/sudoers/sudoers.c:1162 +#: plugins/sudoers/testsudoers.c:208 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "utent no cognossût: %s" + +#: plugins/sudoers/def_data.c:41 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:45 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:49 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:53 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:57 +msgid "Ignore '.' in $PATH" +msgstr "Ignore '.' in $PATH" + +#: plugins/sudoers/def_data.c:61 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:65 +msgid "Send mail if user authentication fails" +msgstr "Invie une mail se la autenticazion dal utent e falìs" + +#: plugins/sudoers/def_data.c:69 +msgid "Send mail if the user is not in sudoers" +msgstr "Invie une mail se l'utent nol è tai sudoers" + +#: plugins/sudoers/def_data.c:73 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Invie une mail se l'utent nol è tai sudoers par chest host" + +#: plugins/sudoers/def_data.c:77 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Invie une mail se l'utent nol pues eseguî un comant" + +#: plugins/sudoers/def_data.c:81 +msgid "Send mail if the user tries to run a command" +msgstr "Invie une mail se l'utent al cîr di eseguî un comant" + +#: plugins/sudoers/def_data.c:85 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:89 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:93 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:97 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:101 +msgid "Root may run sudo" +msgstr "L'utent root al pues eseguî sudo" + +#: plugins/sudoers/def_data.c:105 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Regjistre il non host tal file di regjistri (no-syslog)" + +#: plugins/sudoers/def_data.c:109 +msgid "Log the year in the (non-syslog) log file" +msgstr "Regjistre l'an tal file di regjistri (no-syslog)" + +#: plugins/sudoers/def_data.c:113 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:117 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:121 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:125 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:129 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:133 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:137 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:141 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:145 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:149 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:153 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:157 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:161 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:165 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:169 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:173 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "" + +#: plugins/sudoers/def_data.c:177 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:181 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:185 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:189 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:193 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:197 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:201 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:205 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:209 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:213 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:217 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:221 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:225 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:229 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:233 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:237 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:241 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:245 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:249 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:253 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:257 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:261 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:265 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "" + +#: plugins/sudoers/def_data.c:269 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:273 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:277 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:281 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:285 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:289 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:293 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:297 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:301 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:305 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:309 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:313 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:317 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:321 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:325 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:329 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:333 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:337 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:341 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:345 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:349 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:353 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:357 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:361 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:365 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:369 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:373 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:377 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:381 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:385 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Non dal servizi PAM di doprâ: %s" + +#: plugins/sudoers/def_data.c:389 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Non dal servizi PAM di doprâ pes interfacis di acès: %s" + +#: plugins/sudoers/def_data.c:393 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tentatîf di stabilî lis credentziâls PAM pal utent designât" + +#: plugins/sudoers/def_data.c:397 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:401 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:405 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/def_data.c:409 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:413 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:417 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:421 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:425 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "" + +#: plugins/sudoers/def_data.c:429 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "" + +#: plugins/sudoers/def_data.c:433 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "" + +#: plugins/sudoers/def_data.c:437 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:441 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:445 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:449 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:453 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:457 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:461 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:465 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:469 +msgid "Allow the user to specify a timeout on the command line" +msgstr "" + +#: plugins/sudoers/def_data.c:473 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:477 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:481 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:485 +#, fuzzy, c-format +#| msgid "Authentication methods:" +msgid "Authentication failure message: %s" +msgstr "Metodis di autenticazion:" + +#: plugins/sudoers/defaults.c:221 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:224 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:267 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:270 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:290 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:293 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:318 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:343 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:346 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:359 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:543 plugins/sudoers/ldap.c:1270 +#: plugins/sudoers/ldap.c:1497 plugins/sudoers/ldap.c:1822 +#: plugins/sudoers/linux_audit.c:82 plugins/sudoers/logging.c:1003 +#: plugins/sudoers/policy.c:619 plugins/sudoers/policy.c:629 +#: plugins/sudoers/prompt.c:161 plugins/sudoers/sudoers.c:873 +#: plugins/sudoers/testsudoers.c:238 plugins/sudoers/toke_util.c:158 +#, c-format +msgid "internal error, %s overflow" +msgstr "erôr interni, %s overflow (stranfât)" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:104 plugins/sudoers/filedigest_gcrypt.c:66 +#: plugins/sudoers/filedigest_openssl.c:95 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:129 plugins/sudoers/filedigest_gcrypt.c:98 +#: plugins/sudoers/filedigest_openssl.c:120 +#, c-format +msgid "%s: read error" +msgstr "%s: erôr di leture" + +#: plugins/sudoers/group_plugin.c:86 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:98 plugins/sudoers/sssd.c:400 +#, c-format +msgid "unable to load %s: %s" +msgstr "impussibil cjariâ %s: %s" + +#: plugins/sudoers/group_plugin.c:104 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:109 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:121 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:146 plugins/sudoers/iolog.c:187 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:175 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:191 plugins/sudoers/visudo.c:740 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/iolog.c:299 plugins/sudoers/sudoers.c:1193 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/iolog.c:418 plugins/sudoers/sudoers.c:929 +#: plugins/sudoers/sudoreplay.c:349 plugins/sudoers/sudoreplay.c:1355 +#: plugins/sudoers/sudoreplay.c:1559 plugins/sudoers/timestamp.c:406 +#: plugins/sudoers/visudo.c:972 plugins/sudoers/visudo_json.c:1001 +#: plugins/sudoers/visudo_json.c:1014 +#, c-format +msgid "unable to open %s" +msgstr "impussibil vierzi %s" + +#: plugins/sudoers/iolog.c:469 plugins/sudoers/sudoers.c:933 +#: plugins/sudoers/sudoreplay.c:857 plugins/sudoers/sudoreplay.c:1670 +#, c-format +msgid "unable to read %s" +msgstr "impussibil lei %s" + +#: plugins/sudoers/iolog.c:505 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:295 plugins/sudoers/timestamp.c:298 +#, c-format +msgid "unable to write to %s" +msgstr "impussibil scrivi su %s" + +#: plugins/sudoers/iolog.c:584 plugins/sudoers/iolog.c:803 +#, c-format +msgid "unable to create %s" +msgstr "impussibil creâ %s" + +#: plugins/sudoers/iolog.c:1035 plugins/sudoers/iolog.c:1110 +#: plugins/sudoers/iolog.c:1191 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "impussibil scrivi sul file di regjistri I/O: %s" + +#: plugins/sudoers/iolog.c:1069 +#, c-format +msgid "%s: internal error, file index %d not open" +msgstr "" + +#: plugins/sudoers/ldap.c:431 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:491 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:518 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:522 plugins/sudoers/ldap.c:559 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:630 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:633 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1256 +msgid "unable to get GMT time" +msgstr "impussibil otignî la ore GMT" + +#: plugins/sudoers/ldap.c:1262 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1986 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2559 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2561 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2617 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2625 plugins/sudoers/parse.c:618 +#: plugins/sudoers/sssd.c:1647 +#, c-format +msgid " Commands:\n" +msgstr " Comants:\n" + +#: plugins/sudoers/ldap.c:3187 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "impussibil inizializâ LDAP: %s" + +#: plugins/sudoers/ldap.c:3223 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:3475 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "impussibil vierzi il sisteme di audit" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "impussibil inviâ il messaç di audit" + +#: plugins/sudoers/logging.c:108 +#, c-format +msgid "%8s : %s" +msgstr "" + +#: plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "" + +#: plugins/sudoers/logging.c:165 +#, c-format +msgid "unable to open log file: %s" +msgstr "impussibil vierzi il file di regjistri: %s" + +#: plugins/sudoers/logging.c:173 +#, c-format +msgid "unable to lock log file: %s" +msgstr "impussibil blocâ il file di regjistri: %s" + +#: plugins/sudoers/logging.c:206 +#, c-format +msgid "unable to write log file: %s" +msgstr "impussibil scrivi il file di regjistri: %s" + +#: plugins/sudoers/logging.c:235 +msgid "No user or host" +msgstr "Nissun utent o host" + +#: plugins/sudoers/logging.c:237 +msgid "validation failure" +msgstr "validazion falide" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "l'utent NOL è in sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "l'utent NOL è autorizât sul host" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "comant no permetût" + +#: plugins/sudoers/logging.c:283 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nol è tal file sudoers. Chest incident al vignarà segnalât.\n" + +#: plugins/sudoers/logging.c:286 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nol è permetût eseguî sudo su %s. Chest incident al vignarà segnalât.\n" + +#: plugins/sudoers/logging.c:290 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Mi displâs, l'utent %s nol pues eseguî sudo su %s.\n" + +#: plugins/sudoers/logging.c:293 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:330 plugins/sudoers/sudoers.c:473 +#: plugins/sudoers/sudoers.c:475 plugins/sudoers/sudoers.c:477 +#: plugins/sudoers/sudoers.c:479 plugins/sudoers/sudoers.c:1298 +#: plugins/sudoers/sudoers.c:1300 +#, c-format +msgid "%s: command not found" +msgstr "%s: comant no cjatât" + +#: plugins/sudoers/logging.c:332 plugins/sudoers/sudoers.c:469 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:349 +msgid "authentication failure" +msgstr "autenticazion falide" + +#: plugins/sudoers/logging.c:375 +msgid "a password is required" +msgstr "e covente une password" + +#: plugins/sudoers/logging.c:438 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/logging.c:654 +msgid "unable to fork" +msgstr "impussibil inglovâ (fâ il fork)" + +#: plugins/sudoers/logging.c:662 plugins/sudoers/logging.c:714 +#, c-format +msgid "unable to fork: %m" +msgstr "impussibil inglovâ (fâ il fork): %m" + +#: plugins/sudoers/logging.c:704 +#, c-format +msgid "unable to open pipe: %m" +msgstr "impussibil vierzi il condot (pipe): %m" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "impussibil fâ il \"dup\" di \"stdin\": %m" + +#: plugins/sudoers/logging.c:767 +#, c-format +msgid "unable to execute %s: %m" +msgstr "impussibil eseguî %s: %m" + +#: plugins/sudoers/match.c:771 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:944 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:544 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:545 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:559 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:568 +#, c-format +msgid " Options: " +msgstr " Opzions: " + +#: plugins/sudoers/policy.c:84 plugins/sudoers/policy.c:110 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:289 plugins/sudoers/testsudoers.c:261 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:433 +msgid "user name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:437 +msgid "user ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:441 +msgid "group ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:445 +msgid "host name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:793 plugins/sudoers/visudo.c:910 +#, c-format +msgid "unable to execute %s" +msgstr "impussibil eseguî %s" + +#: plugins/sudoers/policy.c:926 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:928 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:932 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Percors di sudoers: %s\n" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "percors di nsswitch: %s\n" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "percors di ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:938 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "percors di ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:971 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:188 plugins/sudoers/pwutil.c:206 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:200 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:260 plugins/sudoers/pwutil.c:277 +#: plugins/sudoers/pwutil.c:339 plugins/sudoers/pwutil.c:384 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:272 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:503 plugins/sudoers/pwutil.c:521 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:515 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:569 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:633 plugins/sudoers/pwutil.c:675 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:581 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:801 plugins/sudoers/pwutil.c:853 +#: plugins/sudoers/pwutil.c:904 plugins/sudoers/pwutil.c:957 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:807 plugins/sudoers/pwutil.c:858 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:962 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:847 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:951 +#, c-format +msgid "unable to parse gids for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "masse procès" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "impussibil otignî la cartele di vore atuâl" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "" + +#: plugins/sudoers/sssd.c:402 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:410 plugins/sudoers/sssd.c:419 +#: plugins/sudoers/sssd.c:428 plugins/sudoers/sssd.c:437 +#: plugins/sudoers/sssd.c:446 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sssd.c:1562 +#, c-format +msgid "" +"\n" +"SSSD Role: %s\n" +msgstr "" + +#: plugins/sudoers/sssd.c:1567 +#, c-format +msgid "" +"\n" +"SSSD Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:289 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:307 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:325 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'utent %s al pues eseguî su %s i comants chi daurman:\n" + +#: plugins/sudoers/sudo_nss.c:338 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "L'utent %s nol pues eseguî sudo su %s.\n" + +#: plugins/sudoers/sudoers.c:168 plugins/sudoers/testsudoers.c:247 +#: plugins/sudoers/visudo.c:233 plugins/sudoers/visudo.c:612 +#: plugins/sudoers/visudo.c:976 +msgid "unable to initialize sudoers default values" +msgstr "impussibil inizializâ i valôrs predefinîts di sudoers" + +#: plugins/sudoers/sudoers.c:198 plugins/sudoers/sudoers.c:891 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:244 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:301 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:390 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:405 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:406 +msgid "sorry, you must have a tty to run sudo" +msgstr "mi displâs, si scugne vê un tty par eseguî sudo" + +#: plugins/sudoers/sudoers.c:468 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:487 +msgid "sorry, you are not allowed set a command timeout" +msgstr "" + +#: plugins/sudoers/sudoers.c:495 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:836 +msgid "command too long" +msgstr "comant masse lunc" + +#: plugins/sudoers/sudoers.c:948 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nol è un file regolâr" + +#: plugins/sudoers/sudoers.c:952 plugins/sudoers/timestamp.c:222 toke.l:969 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:956 toke.l:974 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:960 toke.l:977 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:993 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "" + +#: plugins/sudoers/sudoers.c:1012 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/sudoers.c:1109 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:275 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:300 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:303 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:335 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:357 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:602 +#: plugins/sudoers/sudoreplay.c:805 plugins/sudoers/sudoreplay.c:895 +#: plugins/sudoers/sudoreplay.c:974 plugins/sudoers/sudoreplay.c:989 +#: plugins/sudoers/sudoreplay.c:996 plugins/sudoers/sudoreplay.c:1003 +#: plugins/sudoers/sudoreplay.c:1010 plugins/sudoers/sudoreplay.c:1017 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:670 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:721 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:722 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:750 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:783 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1222 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1244 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1248 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1263 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1266 plugins/sudoers/sudoreplay.c:1646 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1279 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1281 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1283 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1332 +#, c-format +msgid "unknown search type %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1370 +#, c-format +msgid "%s: invalid log file" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1388 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1395 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1402 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1411 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1420 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1826 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1829 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1838 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1840 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:329 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:230 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:306 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:772 plugins/sudoers/timestamp.c:839 +#: plugins/sudoers/visudo.c:500 plugins/sudoers/visudo.c:506 +msgid "unable to read the clock" +msgstr "" + +#: plugins/sudoers/timestamp.c:786 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:798 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:893 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:937 plugins/sudoers/timestamp.c:957 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:266 plugins/sudoers/visudo.c:667 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:349 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:459 plugins/sudoers/visudo.c:467 +msgid "write error" +msgstr "" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:520 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:548 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:607 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:619 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:656 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:736 plugins/sudoers/visudo.c:745 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:855 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:869 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:915 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:945 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:952 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:981 plugins/sudoers/visudo_json.c:1021 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1000 plugins/sudoers/visudo_json.c:1035 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1015 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1062 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:1159 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1160 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1164 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1165 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1318 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1433 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1435 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" + +#: plugins/sudoers/visudo_json.c:616 plugins/sudoers/visudo_json.c:651 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo_json.c:1007 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: toke.l:943 +msgid "too many levels of includes" +msgstr "" diff --git a/plugins/sudoers/po/hr.mo b/plugins/sudoers/po/hr.mo new file mode 100644 index 0000000..618c68e Binary files /dev/null and b/plugins/sudoers/po/hr.mo differ diff --git a/plugins/sudoers/po/hr.po b/plugins/sudoers/po/hr.po new file mode 100644 index 0000000..cfbd98d --- /dev/null +++ b/plugins/sudoers/po/hr.po @@ -0,0 +1,3326 @@ +# Translation of sudoers to Croatian. +# This file is put in the public domain. +# +# Božidar Putanec , 2016, 2017, 2018, 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-26 17:25-0800\n" +"Last-Translator: Božidar Putanec \n" +"Language-Team: Croatian \n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Lokalize 19.12.3\n" +"X-Poedit-Basepath: ../packages/sudo-1.8.23b2\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-SearchPath-0: .\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "pogreška u sintaksi" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Lozinka za %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] lozinka za %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Lozinka: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SIGURNOSNE informacije za %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Pokušajte ponovo." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "nije moguće dodijeliti memoriju" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "kontrolni zbroj zahtijeva ime staze" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "vrijednosti za „CWD“ moraju započeti s „/“, „~“, ili „*“" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "vrijednosti za „CHROOT“ moraju započeti s „/“, „~“, ili „*“" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "sintaktička greška -- rezervirana riječ %s korištena kao alias" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "nevaljana ‘notbefore’ vrijednost" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "nevaljana ‘notafter’ vrijednost" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "vrijednost za tajmaut je prevelika" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "nevaljana vrijednost za tajmaut" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "**interna greška**, %s prelijevanje" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "nije moguće duplicirati stdin: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "nije moguće izvršiti %s: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "nije moguće stvoriti novi proces (greška u fork())" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "nije moguće stvoriti novi proces (greška u fork()): %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "nije moguće otvoriti cijev: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (naredba se nastavlja) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s postoji ali nije direktorij (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "nije moguće napraviti direktorij %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nije moguće promijeniti mȏd od %s na 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "očekivan je JSON_STRING, dobiven je %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "imenu nedostaje navodnik (\")" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "očekivan je JSON_OBJECT, dobiven je %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "nesparena zatvorena vitičasta zagrada }" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "neočekivano polje" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "nesparena zatvorena uglata zagrada ]" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "neočekivani string" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "nedostaje dvotočka iza imena" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "neočekivana logička operacija (boolean)" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "neočekivani broj" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u nije moguće raščlaniti \"%s\"" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: nevaljana dnevnička datoteka" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: nedostaje polje za vremensku oznaku" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: vremenska oznaka %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: nedostaje polje za korisnika" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: nedostaje polje za runas-korisnika" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: nedostaje polje za runas-grupe" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "greška pri čitanju tajming datoteke: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "nevaljani redak u tajming datoteci: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "dnevnik je već kompletiran -- ne može se ponovno pokrenuti" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "nije moguće ponovno pokrenuti dnevničarenje (logging)" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "nije moguće otvoriti %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "nema dnevničke datoteke U/I %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: nije moguće skočiti naprijed na %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "nije moguće naći točku [%lld, %ld] u %s/%s od koje treba nastaviti" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "greška automata (state machine)" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "nevaljana AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "greška pri raščlanivanju AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "greška pri stvaranju U/I dnevnika" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "greška pri upisivanju u dnevnik ‘accept’ događaja" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "nevaljani RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "greška pri raščlanivanju RejectMessage-a" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "greška pri upisivanju u dnevnik ‘reject’ događaja" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "nevaljana AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "greška pri raščlanivanju AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "greška pri upisivanju u dnevnik ‘alert’ događaja" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "greška protokola" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "greška pri pisanju IoBuffer-a" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "greška pri pisanju ChangeWindowSize-a" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "greška pri pisanju CommandSuspend-a" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "neprepoznata vrsta ClientMessage-a" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "poruka klijenta je preduga" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "nije moguće postaviti ciphersuite na %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "nije moguće postaviti TLS 1.3 ciphersuite to %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "nije moguće dobiti od servera metodu: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "nije moguće stvoriti TLS kontekst: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "nije moguće učitati certifikate %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "nije moguće učitati datoteku s certifikatatima (CA bundle) %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "nije moguće učitati privatni ključ %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "nije moguće postaviti diffie-hellman parametre: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "nije mouguće uspostaviti minimalni protokol na TLS 1.2: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "nije moguće dobiti udaljenu IP adresu" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Nije moguće prikvačiti podatke korisnika na SSL objekt: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "nije moguće dodati događaj u red čekanja" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "ne moguće uspostaviti priključak za slušanje (listen socket)" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - šalje dnevnik U/I sudo-a na udaljeni server\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opcije:\n" +" -f, --file= staza do konfiguracijske datoteke\n" +" -h, --help pokaže ovu pomoć i iziđe\n" +" -n, --no-fork ne stvara novi proces, nego radi u prednjem planu\n" +" -R, --random-drop postotak šanse da izgubi vezu (drop connection)\n" +" -V, --version informira o inačici ovog programa i iziđe\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "potrebna je Protobuf-C inačica 1.3 ili novija" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "nevaljana ‘random drop’ vrijednost: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s inačica %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS nije podržan" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: to nije potpuno kvalificirana staza" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d ne podudara '[': %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d nevaljana sekcija u konfiguraciji: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d nevaljani redak u konfiguraciji: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d očekivano ime sekcije: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "nevaljana vrijednost za %s: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s: %d nepoznati ključ: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "nepoznati ustroj za syslog (Protokol dnevničarenja sustava): %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "nepoznati prioritet %s za protokol dnevnika sustava (syslog)" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Options:\n" +" --help pokaže ovu pomoć i iziđe\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host (računalo) kojemu se šalje dnevnik\n" +" -i, --iolog_id udaljeni ID od U/I dnevnika koji treba nastaviti\n" +" -p, --port port koji će se koristiti za spajanje na hosta\n" +" -r, --restart ponovi prethodni prijenos U/I dnevnika\n" +" -b, --ca-bundle datoteka s paketom certifikata (CA) za provjeru\n" +" certifikata servera\n" +" -c, --cert certificat datoteka za TLS rukovanje (handshake)\n" +" -k, --key datoteka s privatnim (tajnim) ključem (private key)\n" +" -t, --test testira revizijski server tako da paralelno\n" +" pošalje ‘n’ puta U/I dnevnik\n" +" -V, --version informira o inačici ovog programa i iziđe\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "nije moguće potražiti %s:%s: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "nije moguće dobiti IP adresu servera" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "nije moguće učitati %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "poruka klijenta je preduga: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: međuspremnik za pisanje je zauzet" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "neočekivani U/I događaj %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: neočekivano stanje %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "nevaljani ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "primljena je poruka o greškama od servera: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "primljena je poruka za prekid (abort) od servera: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "nije moguće raspakirati ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: neočekivana ‘type_case’ vrijednost za %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "isteklo je vrijeme za čitanje iz servera" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "preuranjeni EOF (kraj datoteke)" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "poruka servera je preduga: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "isteklo je vrijeme za pisanje na server" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "vrijeme za TLS rukovanje je isteklo" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "nije moguće uspostaviti događaj" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "TLS spajanje nije uspjelo: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Nije moguće inicijalizirati SSL kontekst: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Nije uspjelo dodijeliti memoriju za SSL objekt: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Nije uspjelo prikvačiti utičnicu na SSL objekt: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "i točka za ponovno pokretanje i iolog ID moraju biti specificirani" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "ako se ne pošalje U/I (I/O), ponovno uspostavljanje možda neće uspjeti" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "preuranjeni završetak (izlaz) sa stanjem %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "proteklo vrijeme poslano je na server [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "potvrđena točka primljena je od servera [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias „%s“ je već ranije definiran" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "nije moguće dobiti doba dana (trenutno vrijeme)" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "nije moguće promijeniti lozinku za %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "nije moguće dobiti razred klasu korisnika %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "nije moguće početi s BSD autentifikacijom" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "nevaljana vrsta autentifikacije" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "nije moguće inicijalizirati BSD autentifikaciju" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "vaš račun nije valjan, istekao je" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "odobrenje nije uspjelo" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "nije moguće pročitati konfiguraciju FWTK" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "nije moguće spojiti se na server za autentifikaciju" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "veza sa serverom za autentifikaciju je prekinuta (izgubljena)" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"greška na serveru za autentifikaciju:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: nije moguće pretvoriti principala u string (‘%s’): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: nije moguće raščlaniti ‘%s’: %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: nije moguće naći verifikacijsku predmemoriju: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: nije moguće dodijeliti opcije: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: nije moguće dobiti verifikaciju: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: nije moguće inicijalizirati verifikacijsku predmemoriju: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: nije moguće spremiti verifikaciju u predmemoriju: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: nije moguće dobiti principala: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Nije moguće provjeriti TGT! Mogući napad!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "nije moguće inicijalizirati PAM: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Greška PAM autentifikacije: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "provjera valjanosti računa nije uspjela, je li vaš račun zaključan?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Račun ili lozinka su istekli, postavite novu lozinku i pokušajte ponovo." + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "nije moguće promijeniti zastarjelu lozinku: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Lozinka je istekla, javite se vašem administratoru sustava." + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Račun je istekao ili PAM konfiguracija nema sekciju ‘account’ za sudo, javite se vašem administratoru sustava." + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Pogreška u upravljanju PAM računom: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "vas nema u %s bazi podataka" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "nije uspjelo inicijalizirati ACE API biblioteku" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "nije moguće uspostaviti vezu sa serverom za SecurID" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "Korisnikov ID je zaključan za SecurID provjeru autentičnosti." + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "nevaljana duljina imena korisnika za SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "nevaljani autentifikacijski token za SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "SecurID komunikacija nije uspjela" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "nepoznata SecurID greška" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "nevaljana duljina lozinke za SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "nije moguće inicijalizirati SIA sesiju" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "nevaljane metode autentifikacije" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Nevaljane metode autentifikacije su ugrađene u sudo! Ne smijete miješati samostalne i nesamostalne autentifikacije." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "nema metoda autentifikacije" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Metode autentifikacije nisu ugrađene u sudo! Ako želite isključiti autentifikaciju, koristite konfiguracijsku opciju --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Nije moguće inicijalizirati metode autentifikacije." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Metode autentifikacije:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Nije bilo moguće odrediti uvjete za reviziju." + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "revizijski izvještaj nije bilo moguće zapisati na disk" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Vjerujemo da vam je administrator lokalnog sustava održao uobičajeno\n" +"predavanje. To se obično svodi na sljedeće tri stvari:\n" +"\n" +" #1) Poštujte tuđu privatnost.\n" +" #2) Mislite prije tipkanja.\n" +" #3) S velikim moćima dolazi velika odgovornost.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "nepoznati UID: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "nepoznati korisnik: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "inkrement redoslijeda (order): %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "početni redoslijed (order): %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "ispuna redoslijeda (order): %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s inačica gramatike %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "nepodržani ulazni formata %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "nepodržani izlazni format %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: ulazna i izlazna datoteka moraju biti različite datoteke" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "nije moguće inicijalizirati zadane vrijednosti sudoers" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: nepoznata ključna riječ: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "nevaljane zadane vrste: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "nevaljana vrsta za izostavljanje: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "nevaljani filtar: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "nije moguće otvoriti %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "nije uspjelo raščlaniti %s datoteku, nepoznata greška" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "greška u raščlambi u %s blizu retka %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "greška u raščlambi u %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "nije moguće pisati u %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - pretvara formate sudoers datoteka\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opcije:\n" +" -b, --base=dn osnovni DN za sudo LDAP upite\n" +" -c, --config=conf_file staza do konfiguracijske datoteke\n" +" -d, --defaults=deftypes pretvori samo Defaults od specificiranih deftypes\n" +" -e, --expand-aliases proširuje aliase prilikom pretvaranja\n" +" -f, --output-format=format izlazni format je jedan od: JSON, LDIF ili sudoers\n" +" -i, --input-format=format ulazni format jedan od: LDIF ili sudoers\n" +" -I, --increment=num inkrement za num svaki sudoOrder\n" +" -h, --help pokaže ovu pomoć i završi\n" +" -m, --match=filter pretvori samo stavke koje podudaraju filter\n" +" -M, --match-local filter rabi passwd i group baze podataka\n" +" -o, --output=output_file pretvoreni sudoers zapiše u output_file\n" +" -O, --order-start=num prvi sudoOrder započinje od num\n" +" -p, --prune-matches izreže nepodudarne korisnike, grupe i računala\n" +" -P, --padding=num osnovna ispuna za sudoOrder inkrement\n" +" -s, --suppress=sections izostavi izlaz od sections sekcija\n" +" -V, --version informira o inačici ovog programa i završi" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "nepoznati unos defaults „%s“" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "nije moguće dobiti GMT vrijeme" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "nije moguće oblikovati vremensku oznaku" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "previše sudoers grešaka, maksimum je %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "varijabla okoline SUDOERS_BASE nije postavljena i -b opcija nije specificirana." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Ustroj syslog-a ako se syslog koristi za pisanje dnevnika: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Pri uspješnoj autentifikaciji korisnika rabi se syslog prioritet: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Pri neuspješnoj autentifikaciji korisnika rabi se syslog prioritet: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Postavite OTP (One-Time-Password) prompt u zasebni, vlastiti redak." + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ignorira se ‘.’ u $PATH." + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Poštu poslati kad god se pokrene sudo." + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Poštu poslati ako autentifikacija korisnika nije uspjela." + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Poštu poslati ako korisnik nije u sudoers." + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Poštu poslati ako korisnik nije u sudoers na ovom računalu." + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Poštu poslati ako korisnik nema dopuštenje za pokretanje naredbe." + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Poštu poslati ako korisnik pokušava unositi naredbe." + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Za svaku kombinaciju korisnik/terminal koristi se zasebna vremenska oznaka." + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Korisnika podučiti prilikom prvog pokretanja sudo." + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Datoteka koja sadrži sudo poduku: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Zadano (by default),zahtijeva se autentifikacija korisnika." + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Root smije pokrenuti sudo." + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Ime računala zapiše se u (ne-syslog) dnevničku datoteku." + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Godina se zapiše u (ne-syslog) dnevničku datoteku." + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Ako se sudo pozove bez argumenata, pokrene se ljuska." + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Postavlja $HOME na ciljanoga korisnika pri pokretanju ljuske s opcijom -s." + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Uvijek postavlja $HOME na osobni direktorij ciljanoga korisnika." + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Dopušteno je prikupljanje informacija za ispis korisnih poruka o greškama." + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Datoteka sudoers zahtjeva potpuno kvalificirana (fully-qualified) imena računala." + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Korisnika izgrditi ako upiše netočnu lozinku." + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Korisniku dopustiti pokretanje sudo samo ako ima tty." + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo poštuje varijablu okoline EDITOR." + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Zatražiti root lozinku umjesto lozinke korisnika." + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Zatražiti lozinku runas_default korisnika a ne lozinku trenutnog korisnika." + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Zatražiti lozinku ciljanoga korisnika a ne lozinku trenutnog korisnika." + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Ako postoje, primijeniti zadane vrijednosti iz login klase ciljanoga korisnika." + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Postavlja varijable okoline LOGNAME i USER." + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Postavlja samo efektivni UID na onaj ciljanoga korisnika umjesto stvarnog UID." + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ne inicijalizirati grupni vektor na onaj od ciljanoga korisnika." + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Pozicija na kojoj se prelamaju redci dnevničke datoteke (0, bez prelamanja): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Tajmaut vremenske oznake autentifikacije: %.1f minuta." + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Tajmaut za unos lozinke: %.1f minuta." + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Broj pokušaja unosa lozinke: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask za korištenje ili 0777 za korisničku: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Staza do dnevničke datoteke: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Staza do programa pošte: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Zastavice za program pošte: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adresa na koju se šalje pošta: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adresa s koje se šalje pošta: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Redak za upis predmeta (subject) poštanskih poruka: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Poruka za netočnu lozinku: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Staza do direktorija s lekcijom: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Staza do direktorija s vremenskim oznakama autentifikacije: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Vlasnik direktorija s vremenskim oznakama autentifikacije: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Korisnici u ovoj grupi su izuzeti od zahtjeva za unos lozinke i PATH: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Zadani zahtjev (prompt) za lozinku: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Ako je postavljen, passprompt će zamijeniti prompt sustava u svim slučajevima." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Zadani korisnik za pokretanje naredbi: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Vrijednost s kojom se zamijeni korisnikov $PATH: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Staza do uređivača koji će koristiti visudo: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kada zatražiti lozinku za pseudonaredbu „list“: %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kada zatražiti lozinku za pseudonaredbu „verify“: %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Unaprijed učitajte biblioteku sudo_noexec koja zamjenjuje exec funkcije" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Ako je dostupni LDAP direktorij, zanemaruje li se lokalna sudoers datoteka." + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Deskriptori datoteka >= %d biti će zatvoreni prije izvršavanja naredbe." + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Ako je postavljena, korisnici mogu s opcijom -C promijeniti vrijednost od „closefrom“." + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Korisnici mogu postaviti bilo koje varijable okoline." + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Okolinu vratiti u zadani skup varijabli okoline." + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Varijable okruženja čiju sigurnost treba provjeriti:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Varijable okoline koje treba ukloniti:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Varijable okoline koje treba zadržati:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux uloga za korištenje u novom sigurnosnom kontekstu: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux vrsta za korištenje u novom sigurnosnom kontekstu: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Staza do datoteke okoline specifične za sudo: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Staza do datoteke okoline s ograničenim pristupom specifične za sudo: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Locale za korištenje pri obradi sudoers: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Dopustiti da sudo zatraži lozinku čak i ako će biti vidljiva." + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Vizualno pokazati rezultat nakon unosa lozinke korisnikom." + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Rabi se brže i manje precizno podudaranje ali nema dostupa datotečnom sustavu." + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "U sudoers specificirani umask zamijeniti će korisnički čak i ako je tolerantniji." + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Urudžbirati korisnikom pokrenute naredbe." + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Urudžbirati izlaz pokrenute naredbe." + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "U/I urudžbirane dnevnike komprimirati s programom zlib." + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Naredbe uvijek pokrenuti u pseudo-TTY." + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plugin za podršku za ne-Unix grupe: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Direktorij u kojem se spremaju ulazno/izlazni dnevnici: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Datoteka u koju se sprema ulazno/izlazni dnevnik: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Dodati stavku u utmp/utmpx datoteku pri dodijeli pseudoterminala." + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Postaviti korisnika u utmp na runas-korisnika umjesto na pozivatelja." + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Skup dopuštenih privilegija: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Skup limitiranih privilegija: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Pokrenuti naredbe na pseudoterminalu u pozadini." + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Naziv PAM usluge za upotrebu: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Naziv PAM usluge za upotrebu za prijavnu ljusku: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Pokušaj da se uspostavi PAM verifikacija za ciljanoga korisnika." + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Kreira novu PAM sesiju za izvršavanje naredbe." + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Provjeri upravljanje s PAM računom." + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Najveći broj redoslijeda dnevnika U/I: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Omogućite podršku mrežnih grupa (netgroup) u sudoers." + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Provjerite mogućnost pisanja u naddirektorijima kad se koristi sudoedit za uređivanje." + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Slijedi simboličke veze kad se koristi sudoedit za uređivanje datoteka." + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Ispituje plugin grupe za nepoznate sustavske grupe." + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Podudaranje mrežnih grupa bazira se na kompletnoj n-torki: korisnik, računalo, domena." + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Naredbe je dopušteno izvršiti iako ih sudo ne može upisati u revizijski dnevnik." + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Naredbe je dopušteno izvršiti iako ih sudo ne može upisati u U/I dnevnik." + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Naredbe je dopušteno izvršiti iako ih sudo ne može upisati u dnevnik." + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Razriješi grupe u sudoers i podudari ih po ID grupe umjesto po imenu grupe." + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Dnevničke stavke veće od ove vrijednosti podijeliti će se u više syslog poruka: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Korisnik koji će biti vlasnik U/I dnevnika: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupa koja će biti vlasnik U/I dnevnika: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Prava pristupa za uporabu za U/I dnevnike: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Izvrši naredbe pomoću deskriptora datoteke umjesto staze: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Nepoznati zadani podaci za sudoers se ignoriraju umjesto ispisa upozorenja." + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Vrijeme u sekundama nakon kojeg se naredba prekida: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Dopustite korisniku da specificira tajmaut na komandnom retku." + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "U/I dnevnik ispisivati direktno na disk umjesto preko međuspremnika." + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "U syslog dnevnik upisivati i ID procesa." + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Vrsta zapisa autentifikacijskih vremenskih oznaka: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Greška u provjeri autentičnosti: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Ignorira se veličina slova kad se uspoređuju imena korisnika." + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Ignorira se veličinu slova kada se uspoređuju imena grupa." + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Dnevniči (upiše u dnevnik) onda kad sudoers dopusti naredbu." + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Dnevniči (upiše u dnevnik) onda kad sudoers ne dopusti naredbu." + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Server(i) sudo dnevnika za spajanje na opcionalni port." + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Tajmaut servera sudo dnevnika u sekundama: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Omogućite opciju utičnice SO_KEEPALIVE na utičnici spojenoj na server dnevnika." + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Staza do datoteke s paketom certifikata (CA) revizijskog servera: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Staza do datoteke sa sudoers certifikatima: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Staza do datoteke sa sudoers privatnim (tajnim) ključem: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Provjerite je li certifikat dnevničkog servera valjan." + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Dopustite nepoznate vrijednosti za korisničko ime i/ili ID grupe za ‘runas’." + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Dopustite izvršavanje naredbi samo korisniku s valjanom ljuskom." + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Postavite udaljenog korisnika PAM-a na korisnika koji izvršava sudo." + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Postavite PAM udaljenog hosta pam na ime lokalnog hosta (računala)." + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Radni direktorij u koji treba otići prije izvršavanja naredbe: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Root direktorij u koji treba otići prije izvršavanja naredbe: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "Format dnevnika: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: nepoznata zadana stavka „%s“" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: nepoznata stavka zadanih vrijednosti „%s“" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: nije navedena vrijednost za „%s“" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nije navedena vrijednost za „%s“" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: opcija „%s“ ne treba nikakvu vrijednost" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: opcija „%s“ ne prihvaća vrijednost" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: nevaljana vrsta Defaults 0x%x za opciju „%s“" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: nevaljana vrsta Defaults 0x%x za opciju „%s“" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: vrijednost „%s“ za opciju „%s“ nije valjana" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: vrijednost „%s“ nije ispravna za opciju „%s“" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: vrijednost za „%s“ mora započeti s „/“, „~“, ili „*“" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: vrijednost za „%s“ mora započeti s „/“, „~“, ili „*“" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: vrijednost za „%s“ mora započeti s „/“" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: vrijednost za „%s“ mora početi s „/“" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: oštećen envp, duljina ne odgovara" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "nije moguće obnoviti okolinu" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "nemate dopuštenje za postavljanje sljedećih varijabli okoline: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "greška u raščlambi u %s blizu retka %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "greška u raščlambi u %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nepodržana vrsta kontrolnog zbroja %d za %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: greška pri čitanju" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "vlasnik %s mora biti UID %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s mora biti dostupan za pisanje samo vlasniku" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "nije moguće učitati %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "nije moguće pronaći simbol „group_plugin“ u %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: nekompatibilna glavna inačica plugin grupe %d, očekivano je %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "„%s“ nije valjana IP adresa (nemoguće ju je raščlaniti)" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "„%s“ nije valjana mrežna maska (nemoguće ju je raščlaniti)" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Parovi lokalnih IP adresa i mrežnih maski:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "nepoznata grupa: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "nije moguće ažurirati datoteku redoslijeda (sequence file)" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "nije moguće pisati u U/I dnevnik: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "nije moguće stvoriti %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: interna greška, U/I dnevnička datoteka za događaj %d nije otvorena" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "nije moguće pročitati vrijeme (clock)" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: interna greška, nevaljani signal %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls nije podržan kad se koristi ldaps" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "nije moguće inicijalizirati SSL certifikat i bazu podataka ključeva: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "morate postaviti TLS_CERT u %s da koristite SSL" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "nije moguće inicijalizirati LDAP: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls je specificirani, ali LDAP biblioteke ne podržavaju ldap_start_tls_s() ili ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "nevaljani sudoOrder atribut: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: preveliki port" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nepodržana vrsta adrese LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ne možete zajedno koristiti ldap i ldaps adrese" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "nije moguće pretvoriti sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "nije moguće otvoriti revizijski sustav" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "nije moguće poslati revizijsku poruku" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "greška u petlji događaja" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Nije uspjelo stvoriti novi ‘SSL_CTX’ objekt: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "TLS veza sa %s:%s nije uspjela: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "TLS inicijalizacija nije bila uspješna" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "TLS rukovanje (handshake) nije bila uspješno" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: **interna greška** -- nevaljani izlazni status %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "veza sa serverom za autentifikaciju je prekinuta (izgubljena je)" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "nema međuspremnika za pisanje" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "nije moguće spojiti se na dnevnički server" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "korisnik NIJE u sudoers" + +# Authentication is about who somebody is. +# Authorisation is about what they're allowed to do. +# https://en.wikipedia.org/wiki/AAA_(computer_security)#Authorization +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "korisnik NEMA ovlasti na računalu (nije autoriziran)" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "naredba nije dopuštena" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nije u sudoers datoteci. Ovaj će incident biti prijavljen.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "" +"%s nema dopuštenja pokrenuti sudo na %s. Ovaj će incident biti prijavljen.\n" +"\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Nažalost, korisnik %s ne smije pokrenuti sudo na %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Nažalost, korisniku %s nije dopušteno izvršiti „%s%s%s“ kao %s%s%s na %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: naredba nije pronađena" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"zanemaruje se „%s“ pronađen u „.“\n" +"Koristite „sudo ./%s“ ako je to „%s“ koji želite pokrenuti." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u netočni pokušaj unosa lozinke" +msgstr[1] "%u netočna pokušaja unosa lozinke" +msgstr[2] "%u netočnih pokušaja unosa lozinke" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "neuspješna autentifikacija" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "nužna je lozinka" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "nije moguće otvoriti dnevničku datoteku: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "nije moguće pisati u dnevničku datoteku: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "kontrolni zbroj za %s (%s) nije u %s obliku" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP uloga: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers stavka:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Opcije: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Naredbe:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Odgovarajući Defaults unosi za %s na %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas i Command-specifične zadane vrijednosti za %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Korisnik %s može pokrenuti sljedeće naredbe na %s:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Korisniku %s nije dopušteno pokrenuti sudo na %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorira se nekompletni sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "nevaljani LDIF atribut: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "nevaljana opcija %.*s postavljena kroz sudo front-end" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "nije moguće pročitati popis mrežnih adresa (nemoguće ih je raščlaniti)" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "ime korisnika nije postavio front-end sudo-a" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "korisnički ID (user-ID) nije postavio front-end sudo-a" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "groupni ID (group-ID) nije postavio front-end sudo-a" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "ime računala (host name) nije postavio front-end sudo-a" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "nevaljani radni direktorij: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "nevaljani chroot direktorij: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "nije moguće izvršiti %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Inačica sudoers plugina s pravilima %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Inačica sudoers datotečne gramatike %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Staza do sudoers: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch staza: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf staza: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret staza: %s\n" + +# hook: A location in a routine or program in which the programmer can connect or insert other routines for the purpose of debugging or enhancing functionality. +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "nije moguće registrirati rutinu (hook) vrste %d (inačica %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "nije moguće zapamtiti (cache) UID %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "nije moguće predmemorirati UID %u jer već postoji" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "nije moguće zapamtiti (cache) korisnika %s" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "nije moguće predmemorirati korisnika %s jer već postoji" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "nije moguće zapamtiti (cache) GID %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "nije moguće predmemorirati GID %u jer već postoji" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "nije moguće zapamtiti (cache) grupu %s" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "nije moguće predmemorirati grupu %s jer već postoji" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "nije moguće predmemorirati popis grupa za %s jer već postoji" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "nije moguće zapamtiti (cache) popis grupa za %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "nije moguće pročitati grupe za %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "nije moguće razabrati GID-ove za %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "prelijevanje snopa s pravima pristupa" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "iscrpljenje snopa s pravima pristupa" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "nije moguće promijeniti na GID od root" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "nije moguće promijeniti na runas GID" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "nije moguće postaviti runas grupni vektor" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "nije moguće promijeniti na runas UID" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "nije moguće promijeniti na sudoers GID" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "previše procesa" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "nije moguće odrediti trenutni radni direktorij" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "skraćena (audit) staza revizije user_cmd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "skraćena (audit) staza revizije argv[0]: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "nije moguće inicijalizirati SSS izvor. Je li SSSD instaliran na vašem računalu?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nije moguće pronaći simbol „%s“ u %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "problem sa stavkama defaults" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "nisu pronađeni valjani sudoers izvori, kraj rada" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "korisniku nije dopušteno promijeniti radni direktorij na %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "vama nije dopušteno koristi opciju -R s/sa %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "korisniku nije dopušteno promijeniti direktorij na %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "vama nije dopušteno koristi opciju -D s/sa %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers specificira da root ne može koristiti sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "korisniku nije dopušteno promijeniti ograničenje od ‘closefrom’" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "vama nije dopušteno koristi opciju -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "vlasnik vremenske oznake (%s): Nema takvog korisnika" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "nema TTY" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "nažalost, da pokrenete sudo morate imati TTY" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "nevaljana ljuska za korisnika %s: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "naredba u trenutnom direktoriju" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "korisniku nije dopušteno postavljanje tajmaut naredbe" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "nažalost, vama nije dopušteno postavljanje tajmaut za naredbu" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "korisniku nije dopušteno sačuvati okolinu" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "vama nije dopušteno zadržati okolinu" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "naredba je preduga" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit se ne mora pokrenuti sa sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "nije moguće pročitati %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "nije moguće dobiti status od %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nije obična datoteka" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "vlasnik %s je UID %u, a treba biti %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s smije svatko mijenjati/pisati" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "vlasnik %s je GID %u, a treba biti %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "samo root može koristiti „-c %s“" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "nepoznata klasa prijave: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "nije moguće pronaći računalo %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "nevaljana opcija filtra: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "nevaljano maksimalno vrijeme čekanja: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "nevaljani faktor brzine: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/tajming: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Reproduciranje sudo sesije: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "nije moguće postaviti TTY u direktni mȏd (da ne interpretira posebne znakove)" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Upozorenje: vaš terminal je premaleni da pravilno reproducira dnevnik.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Veličina dnevnika je %d x %d, a veličina vašeg terminala %d x %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Reprodukcija je završena -- obnovite terminal pritiskom na bilo koju tipku." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "višeznačni izraz „%s“" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "nesparena „)“ u izrazu" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "nepoznati pojam za pretragu „%s“" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s zahtijeva argument" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "nevaljani regularni izraz: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "nije moguće raščlaniti datum „%s“" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "nesparena „(“ u izrazu" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "nedopušteni zaostali „or“" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "nedopušteni zaostali „!“" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "nepoznata vrsta za pretragu %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uporaba: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uporaba: %s [-h] [-d direktorij] -l [izraz za pretragu]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reproducira dnevnike sudo sesija\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options:\n" +" -d, --directory=dir navedite direktorij dir za dnevnike sesija\n" +" -f, --filter=filter navedite (filter) vrstu/vrste U/I koje treba prikazati\n" +" -h, --help pokaže ovu pomoć i iziđe\n" +" -l, --list popis dostupnih ID-ova sjednica koji se podudaraju\n" +" s neobveznim izrazom za pretragu\n" +" -m, --max-wait=num čekati ne više od num sekundi između događaja\n" +" -n, --non-interactive bez prompta - sesija se šalje na standardni izlaz\n" +" -R, --no-resize ne mijenjati veličinu terminala\n" +" -S, --suspend-wait čeka dok je naredba obustavljena\n" +" -s, --speed=num ubrza ili uspori reprodukciju\n" +" -V, --version informira o inačici ovog programa i iziđe" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\tračunalo se ne podudara" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Naredba je dopuštena." + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Naredba nije dopuštena." + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Naredba nije prepoznata." + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s članovi grupe mogu mijenjati/pisati" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "nije moguće skratiti datoteku s vremenskim podacima na %lld bajtova" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "ignorira se vremenska oznaka iz budućnosti" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "vremenska oznaka je predaleko u budućnosti: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "nije moguće zaključati datoteku s vremenskim oznakama %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "staza do lekcije je preduga: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit se ne smije specificirati sa stazom" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "opcija -x biti će uklonjena iz buduće inačice" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "molimo da umjesto toga pokušate rabiti cvtsudoers uslužni program" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "pritisnite return/enter za redigirati %s: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "navedeni uređivač (%s) ne postoji" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nijedan uređivač nije pronađen (editor path = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "greška pri pisanju" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "nije moguće dobiti status privremene datoteke (%s), %s nije promijenjena" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "privremena datoteka duljine nula (%s), %s nije promijenjena" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "greška uređivač (%s), %s nije promijenjena" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s nije promijenjeno" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "nije moguće ponovo otvoriti privremenu datoteku (%s), %s nije promijenjena." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "nije moguće razabrati privremenu datoteku (%s) -- nepoznata greška" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "**interna greška**, nije moguće pronaći %s na popisu!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "nije moguće postaviti (UID, GID) od %s na (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s i %s nisu na istom datotečnom sustavu, koristi se mv za preimenovanje" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "naredba nije uspjela: „%s %s %s“, %s nije promijenjena" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "greška u preimenovanju %s, %s nije promijenjena" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Što sada? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Mogućnosti su:\n" +" (e) datoteku sudoers ponovno redigirati\n" +" (x) završiti bez spremanja promjena u datoteku sudoers)\n" +" (Q) prekinuti i spremiti promjene u datoteku sudoers (OPASNO!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "nije moguće pokrenuti %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: krivi vlasnik (UID, GID) a treba biti (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: loša prava pristupa, trebala bi biti 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: raščlamba je uspjela\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s je zauzeti, pokušajte ponovo kasnije" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "nije moguće zaključati %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Ipak redigirati? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Greška: %s:%d:%d: ciklus u %s „%s“" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Upozorenje: %s:%d:%d: ciklus u %s „%s“" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Greška: %s:%d:%d %s „%s“ je referenciran ali nije definiran" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Upozorenje: %s:%d:%d %s „%s“ je referenciran ali nije definiran" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Upozorenje: %s:%d:%d nekorišteni %s „%s“" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sigurno redigira sudoers datoteku\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opcije:\n" +" -c, --check samo testira sudoers datoteku\n" +" -f, --file=sudoers navedite alternativnu lokaciju sudoers datoteke\n" +" -h, --help pokaže ovu pomoć i iziđe\n" +" -q, --quite manje opširne (tihe) poruke grešaka u sintaksi\n" +" -s, --strick striktna testira sintaksu sudoers datoteke\n" +" -V, --version informira o inačici ovog programa i iziđe\n" + +#: toke.l:179 +msgid "empty string" +msgstr "prazni string" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "prazna grupa" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "prazna mrežna grupa (netgroup)" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "nevaljani nastavak retka" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "nevaljana IPv6 adresa" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "neočekivani prelom retka" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "previše razina uključivanja" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "Prethodno učitati prividne izvršne funkcije sadržane u biblioteci sudo_noexec." + +#~ msgid "unable to lock log file: %s" +#~ msgstr "nije moguće zaključati dnevničku datoteku: %s" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "‘sudo_ldap_conf_add_ports’: port vrijednost je prevelika" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "SSL_connect failed: ssl_error=%d, stack=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "Datoteka s paketom certifikata (CA) nije bila specificirana" + +#~ msgid "Client certificate was not specified" +#~ msgstr "Certifikat klijenta nije bio specificiran" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "nije moguće dodijeliti SSL objekt: %s\n" + +#~ msgid "Unable to attach socket to the ssl object: %s\n" +#~ msgstr "Nije moguće prikvačiti utičnicu na SSL objekt: %s\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "poruka klijenta je preduga: %zu\n" + +#~ msgid "server message too large: %u\n" +#~ msgstr "poruka servera je preduga: %u\n" + +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "U sudoers nije zadana datoteka s paketom certifikata (CA)" + +#~ msgid "Calling SSL_CTX_load_verify_locations() failed: %s" +#~ msgstr "Nije uspjelo pozvati SSL_CTX_load_verify_locations(): %s" + +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "Potpisana datoteka certifikata nije postavljena u sudoers" + +#~ msgid "Unable to load private key into the ssl context: %s" +#~ msgstr "Učitavanje privatnog (tajnog) ključa u SSL kontekst nije uspjelo: %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s" +#~ msgstr "‘SSL_connect’ nije uspjela: ssl_error=%d, stack=%s" + +#~ msgid "SSL_read failed: ssl_error=%d, stack=%s" +#~ msgstr "‘SSL_read’ nije uspjela: ssl_error=%d, stack=%s" + +#~ msgid "SSL_write failed: ssl_error=%d, stack=%s" +#~ msgstr "‘SSL_write’ nije uspjela: ssl_error=%d, stack=%s" + +#~ msgid "unknown address family: %d" +#~ msgstr "nepoznata familija adresa: %d" + +#~ msgid "audit_failure message too long" +#~ msgstr "audit_failure poruka (revizije) je preduga" + +#~ msgid "No user or host" +#~ msgstr "Nema korisnika ili računala" + +#~ msgid "validation failure" +#~ msgstr "greška pri provjeri valjanosti" + +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/vrijeme: %s" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "ignorira se nevaljana vrijednost atributa: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "nije moguće predmemorirati korisnika %s jer nema dovoljno memorije" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "nije moguće predmemorirati grupu %s jer nema dovoljno memorije" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "nije moguće predmemorirati popis grupa za %s jer nema dovoljno memorije" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP uloga: NEPOZNATA\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Redoslijed: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD uloga: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD uloga: NEPOZNATA\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Upozorenje: ciklus u %s „%s“" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Upozorenje: %s „%s“ ima referenciju ali nije definiran" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Upozorenje: %s „%s“ nije upotrebljen" + +#~ msgid "Password:" +#~ msgstr "Lozinka:" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: nije uspio" + +#~ msgid "getauid failed" +#~ msgstr "getauid nije uspio" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: nije uspio" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: nije uspio" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: nije uspio" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: nije uspio" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: nije uspio" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: nema dovoljno prostora za proširenje međuspremnika računala" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "ne mogu miješati ldaps i starttls" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: nema dovoljno prostora za izgradnju međuspremnika računala" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "neodgovarajuća sudo_ldap_build_pass1 alokacija" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "interna greška: nema dovoljno prostora za redak dnevnika" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "Ne mogu izvršiti dlopen %s: %s" + +#~ msgid "writing to standard output" +#~ msgstr "ispisujem na standardni izlaz" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "previše izraza u zagradama, najviše %d" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "vlasnik %s je uid %u, treba biti uid %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "nevlasnici imaju dozvolu za pisanje u %s (0%o), treba biti mod 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s postoji, ali nije obična datoteka (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "nevlasnici imaju dozvolu za pisanje u %s (0%o), treba biti mod 0600" + +#~ msgid "unable to remove %s, will reset to the epoch" +#~ msgstr "ne mogu ukloniti %s, vratit ću na početnu epohu" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: preljev međuspremnika" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "ne mogu odrediti stanje uređivača (%s)" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s kod retka %d <<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "ne mogu postaviti lokal u „%s”, koristim „C”" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Naredbe:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "ne mogu staviti uid %u (%s) u spremnik, već postoji" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "ne mogu staviti gid %u (%s) u spremnik, već postoji" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "interna greška, expand_prompt() preljev" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "interna greška, sudo_setenv2() preljev" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "interna greška, sudo_setenv() preljev" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "interna greška, linux_audit_command() preljev" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "interna greška, runas_groups preljev" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "interna greška, init_vars() preljev" diff --git a/plugins/sudoers/po/hu.mo b/plugins/sudoers/po/hu.mo new file mode 100644 index 0000000..97ad917 Binary files /dev/null and b/plugins/sudoers/po/hu.mo differ diff --git a/plugins/sudoers/po/hu.po b/plugins/sudoers/po/hu.po new file mode 100644 index 0000000..2e9239e --- /dev/null +++ b/plugins/sudoers/po/hu.po @@ -0,0 +1,2152 @@ +# Hungarian translation for sudoers. +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# +# Todd C. Miller , 2011-2014. +# Gabor Kelemen , 2015. +# Balázs Úr , 2017, 2018. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.22b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-12-18 10:37-0700\n" +"PO-Revision-Date: 2018-01-20 14:06+0100\n" +"Last-Translator: Balázs Úr \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.2\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "szintaktikai hiba" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p jelszava: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p jelszava: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Jelszó: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** BIZTONSÁGI információk erről: %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Elnézést, próbálja újra." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:307 gram.y:314 gram.y:321 gram.y:328 gram.y:335 +#: gram.y:398 gram.y:406 gram.y:416 gram.y:449 gram.y:456 gram.y:463 +#: gram.y:470 gram.y:552 gram.y:559 gram.y:568 gram.y:577 gram.y:594 +#: gram.y:706 gram.y:713 gram.y:720 gram.y:728 gram.y:824 gram.y:831 +#: gram.y:838 gram.y:845 gram.y:852 gram.y:878 gram.y:885 gram.y:892 +#: gram.y:1015 gram.y:1195 gram.y:1202 plugins/sudoers/alias.c:124 +#: plugins/sudoers/alias.c:139 plugins/sudoers/auth/bsdauth.c:141 +#: plugins/sudoers/auth/kerb5.c:119 plugins/sudoers/auth/kerb5.c:145 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/defaults.c:651 +#: plugins/sudoers/defaults.c:906 plugins/sudoers/defaults.c:1077 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:93 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:120 plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:980 plugins/sudoers/ldap.c:1174 +#: plugins/sudoers/ldap.c:1185 plugins/sudoers/ldap.c:1201 +#: plugins/sudoers/ldap.c:1493 plugins/sudoers/ldap.c:1653 +#: plugins/sudoers/ldap.c:1735 plugins/sudoers/ldap.c:1883 +#: plugins/sudoers/ldap.c:1907 plugins/sudoers/ldap.c:1996 +#: plugins/sudoers/ldap.c:2011 plugins/sudoers/ldap.c:2107 +#: plugins/sudoers/ldap.c:2140 plugins/sudoers/ldap.c:2221 +#: plugins/sudoers/ldap.c:2303 plugins/sudoers/ldap.c:2400 +#: plugins/sudoers/ldap.c:3235 plugins/sudoers/ldap.c:3267 +#: plugins/sudoers/ldap.c:3579 plugins/sudoers/ldap.c:3607 +#: plugins/sudoers/ldap.c:3623 plugins/sudoers/ldap.c:3713 +#: plugins/sudoers/ldap.c:3729 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:190 plugins/sudoers/logging.c:501 +#: plugins/sudoers/logging.c:522 plugins/sudoers/logging.c:563 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:998 +#: plugins/sudoers/match.c:617 plugins/sudoers/match.c:664 +#: plugins/sudoers/match.c:714 plugins/sudoers/match.c:738 +#: plugins/sudoers/match.c:826 plugins/sudoers/match.c:915 +#: plugins/sudoers/parse.c:252 plugins/sudoers/parse.c:264 +#: plugins/sudoers/parse.c:279 plugins/sudoers/parse.c:291 +#: plugins/sudoers/policy.c:498 plugins/sudoers/policy.c:735 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:165 +#: plugins/sudoers/pwutil.c:236 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:486 plugins/sudoers/pwutil.c:551 +#: plugins/sudoers/pwutil.c:620 plugins/sudoers/pwutil.c:778 +#: plugins/sudoers/pwutil.c:835 plugins/sudoers/pwutil.c:880 +#: plugins/sudoers/pwutil.c:938 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:353 plugins/sudoers/sssd.c:392 +#: plugins/sudoers/sssd.c:1073 plugins/sudoers/sssd.c:1252 +#: plugins/sudoers/sssd.c:1266 plugins/sudoers/sssd.c:1282 +#: plugins/sudoers/sudoers.c:263 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:682 plugins/sudoers/sudoers.c:807 +#: plugins/sudoers/sudoers.c:851 plugins/sudoers/sudoers.c:1123 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:1254 +#: plugins/sudoers/sudoreplay.c:1366 plugins/sudoers/sudoreplay.c:1406 +#: plugins/sudoers/sudoreplay.c:1415 plugins/sudoers/sudoreplay.c:1425 +#: plugins/sudoers/sudoreplay.c:1433 plugins/sudoers/sudoreplay.c:1437 +#: plugins/sudoers/sudoreplay.c:1593 plugins/sudoers/sudoreplay.c:1597 +#: plugins/sudoers/testsudoers.c:131 plugins/sudoers/testsudoers.c:217 +#: plugins/sudoers/testsudoers.c:234 plugins/sudoers/timestamp.c:397 +#: plugins/sudoers/timestamp.c:441 plugins/sudoers/timestamp.c:868 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:153 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:985 plugins/sudoers/visudo.c:1051 +#: plugins/sudoers/visudo.c:1095 plugins/sudoers/visudo.c:1197 +#: plugins/sudoers/visudo_json.c:1025 toke.l:849 toke.l:949 toke.l:1106 +msgid "unable to allocate memory" +msgstr "nem foglalható memória" + +#: gram.y:481 +msgid "a digest requires a path name" +msgstr "egy kivonat egy útvonalnevet igényel" + +#: gram.y:607 +msgid "invalid notbefore value" +msgstr "érvénytelen „notbefore” érték" + +#: gram.y:615 +msgid "invalid notafter value" +msgstr "érvénytelen „notafter” érték" + +#: gram.y:624 plugins/sudoers/policy.c:314 +msgid "timeout value too large" +msgstr "az időkorlát értéke túl nagy" + +#: gram.y:626 plugins/sudoers/policy.c:316 +msgid "invalid timeout value" +msgstr "érvénytelen időkorlát érték" + +#: gram.y:1195 gram.y:1202 plugins/sudoers/auth/pam.c:320 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:651 plugins/sudoers/defaults.c:906 +#: plugins/sudoers/defaults.c:1077 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:93 +#: plugins/sudoers/env.c:233 plugins/sudoers/filedigest.c:120 +#: plugins/sudoers/filedigest_gcrypt.c:72 +#: plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:980 plugins/sudoers/ldap.c:1174 +#: plugins/sudoers/ldap.c:1185 plugins/sudoers/ldap.c:1201 +#: plugins/sudoers/ldap.c:1493 plugins/sudoers/ldap.c:1653 +#: plugins/sudoers/ldap.c:1735 plugins/sudoers/ldap.c:1883 +#: plugins/sudoers/ldap.c:1907 plugins/sudoers/ldap.c:1996 +#: plugins/sudoers/ldap.c:2011 plugins/sudoers/ldap.c:2107 +#: plugins/sudoers/ldap.c:2140 plugins/sudoers/ldap.c:2220 +#: plugins/sudoers/ldap.c:2303 plugins/sudoers/ldap.c:2400 +#: plugins/sudoers/ldap.c:3235 plugins/sudoers/ldap.c:3267 +#: plugins/sudoers/ldap.c:3579 plugins/sudoers/ldap.c:3606 +#: plugins/sudoers/ldap.c:3622 plugins/sudoers/ldap.c:3713 +#: plugins/sudoers/ldap.c:3729 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:190 plugins/sudoers/logging.c:501 +#: plugins/sudoers/logging.c:522 plugins/sudoers/logging.c:562 +#: plugins/sudoers/logging.c:998 plugins/sudoers/match.c:616 +#: plugins/sudoers/match.c:663 plugins/sudoers/match.c:714 +#: plugins/sudoers/match.c:738 plugins/sudoers/match.c:826 +#: plugins/sudoers/match.c:914 plugins/sudoers/parse.c:252 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:279 +#: plugins/sudoers/parse.c:291 plugins/sudoers/policy.c:128 +#: plugins/sudoers/policy.c:137 plugins/sudoers/policy.c:146 +#: plugins/sudoers/policy.c:172 plugins/sudoers/policy.c:299 +#: plugins/sudoers/policy.c:314 plugins/sudoers/policy.c:316 +#: plugins/sudoers/policy.c:342 plugins/sudoers/policy.c:352 +#: plugins/sudoers/policy.c:396 plugins/sudoers/policy.c:406 +#: plugins/sudoers/policy.c:415 plugins/sudoers/policy.c:424 +#: plugins/sudoers/policy.c:498 plugins/sudoers/policy.c:735 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:165 +#: plugins/sudoers/pwutil.c:236 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:486 plugins/sudoers/pwutil.c:551 +#: plugins/sudoers/pwutil.c:620 plugins/sudoers/pwutil.c:778 +#: plugins/sudoers/pwutil.c:835 plugins/sudoers/pwutil.c:880 +#: plugins/sudoers/pwutil.c:938 plugins/sudoers/set_perms.c:387 +#: plugins/sudoers/set_perms.c:766 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1476 plugins/sudoers/set_perms.c:1641 +#: plugins/sudoers/sssd.c:162 plugins/sudoers/sssd.c:194 +#: plugins/sudoers/sssd.c:237 plugins/sudoers/sssd.c:244 +#: plugins/sudoers/sssd.c:280 plugins/sudoers/sssd.c:352 +#: plugins/sudoers/sssd.c:392 plugins/sudoers/sssd.c:1073 +#: plugins/sudoers/sssd.c:1251 plugins/sudoers/sssd.c:1266 +#: plugins/sudoers/sssd.c:1282 plugins/sudoers/sudoers.c:263 +#: plugins/sudoers/sudoers.c:273 plugins/sudoers/sudoers.c:281 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:682 +#: plugins/sudoers/sudoers.c:807 plugins/sudoers/sudoers.c:851 +#: plugins/sudoers/sudoers.c:1123 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:1254 plugins/sudoers/sudoreplay.c:1366 +#: plugins/sudoers/sudoreplay.c:1406 plugins/sudoers/sudoreplay.c:1415 +#: plugins/sudoers/sudoreplay.c:1425 plugins/sudoers/sudoreplay.c:1433 +#: plugins/sudoers/sudoreplay.c:1437 plugins/sudoers/sudoreplay.c:1593 +#: plugins/sudoers/sudoreplay.c:1597 plugins/sudoers/testsudoers.c:131 +#: plugins/sudoers/testsudoers.c:217 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/timestamp.c:397 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/timestamp.c:868 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:146 +#: plugins/sudoers/visudo.c:153 plugins/sudoers/visudo.c:309 +#: plugins/sudoers/visudo.c:315 plugins/sudoers/visudo.c:446 +#: plugins/sudoers/visudo.c:624 plugins/sudoers/visudo.c:985 +#: plugins/sudoers/visudo.c:1051 plugins/sudoers/visudo.c:1095 +#: plugins/sudoers/visudo.c:1197 plugins/sudoers/visudo_json.c:1025 toke.l:849 +#: toke.l:949 toke.l:1106 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:135 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "A(z) „%s” álnév már meg van határozva" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "a bejelentkezési osztály lekérése sikertelen ennél a felhasználónál: %s" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "a BSD hitelesítés elkezdése sikertelen" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "érvénytelen hitelesítési típus" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "a BSD hitelesítés előkészítése sikertelen" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "az fwtk beállítás olvasása sikertelen" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "a hitelesítési kiszolgálóhoz való kapcsolódás sikertelen" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "a kapcsolat megszakadt a hitelesítési kiszolgálóval" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"hitelesítési kiszolgáló hiba:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: az elsődleges átalakítása karakterláncra („%s”) sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: „%s” feldolgozása sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: a hitelesítési adatok gyorsítótárának feloldása sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: a kapcsolók lefoglalása sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: a hitelesítési adatok lekérése sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: a hitelesítési adatok gyorsítótárának előkészítése sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: a hitelesítési adatok gyorsítótárban való tárolósa sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: az elsődleges gép lekérése sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: a TGT nem ellenőrizhető! Lehetséges támadás! %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "a PAM előkészítése sikertelen" + +#: plugins/sudoers/auth/pam.c:194 +msgid "account validation failure, is your account locked?" +msgstr "fiókellenőrzési hiba, a fiókja zárolva van?" + +#: plugins/sudoers/auth/pam.c:198 +msgid "Account or password is expired, reset your password and try again" +msgstr "A fiók vagy a jelszó lejárt, állítsa vissza a jelszavát, és próbálja újra" + +#: plugins/sudoers/auth/pam.c:206 +#, c-format +msgid "unable to change expired password: %s" +msgstr "a lejárt jelszó megváltoztatása sikertelen: %s" + +#: plugins/sudoers/auth/pam.c:211 +msgid "Password expired, contact your system administrator" +msgstr "A jelszó lejárt, vegye fel a kapcsolatot a rendszergazdával" + +#: plugins/sudoers/auth/pam.c:215 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "A fiók lejárt vagy a PAM beállításból hiányzik egy „account” szakasz a sudo számára, vegye fel a kapcsolatot a rendszergazdával" + +#: plugins/sudoers/auth/pam.c:229 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM hitelesítési hiba: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "Ön nem létezik a(z) %s adatbázisban" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "nem sikerült előkészíteni az ACE API programkönyvtárat" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "a SecurID kiszolgálóhoz való kapcsolódás sikertelen" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "A felhasználó-azonosító zárolva van a SecurID hitelesítéshez" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "érvénytelen felhasználónév hossz a SecurID-nál" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "érvénytelen hitelesítéskezelés a SecurID-nál" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "a SecurID kommunikáció meghiúsult" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "ismeretlen SecurID hiba" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "érvénytelen jelkód hossz a SecurID-nál" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:125 +msgid "unable to initialize SIA session" +msgstr "a SIA munkamenet előkészítése sikertelen" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "érvénytelen hitelesítési módszerek" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Érvénytelen hitelesítési módszerek lettek belefordítva a sudo programba! Nem keverheti az önálló és a nem önálló hitelesítéseket." + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "nincsenek hitelesítési módszerek" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Nincsenek hitelesítési módszerek belefordítva a sudo programba! Ha ki szeretné kapcsolni a hitelesítést, akkor használja a --disable-authentication konfigurációs kapcsolót." + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "A hitelesítési módszerek előkészítése sikertelen." + +#: plugins/sudoers/auth/sudo_auth.c:441 +msgid "Authentication methods:" +msgstr "Hitelesítési módszerek:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "Nem sikerült meghatározni a felülvizsgálati feltételt" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "a felülvizsgálati rekord véglegesítése sikertelen" + +#: plugins/sudoers/check.c:259 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Bízunk benne, hogy megkapta a szokásos tudnivalókat a helyi\n" +"rendszergazdától. Általában a következő három dolog lényeges:\n" +"\n" +" #1) Tartsa tiszteletben mások személyiségi jogait.\n" +" #2) Gondolkodjon gépelés előtt.\n" +" #3) A nagy erő nagy felelősséggel jár.\n" +"\n" + +#: plugins/sudoers/check.c:302 plugins/sudoers/check.c:312 +#: plugins/sudoers/sudoers.c:725 plugins/sudoers/sudoers.c:770 +#, c-format +msgid "unknown uid: %u" +msgstr "ismeretlen uid: %u" + +#: plugins/sudoers/check.c:307 plugins/sudoers/iolog.c:260 +#: plugins/sudoers/policy.c:908 plugins/sudoers/sudoers.c:1162 +#: plugins/sudoers/testsudoers.c:208 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "ismeretlen felhasználó: %s" + +#: plugins/sudoers/def_data.c:41 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog képesség, ha a syslog programot használják naplózáshoz: %s" + +#: plugins/sudoers/def_data.c:45 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "A használandó syslog prioritás, amikor a felhasználó sikeresen hitelesíti magát: %s" + +#: plugins/sudoers/def_data.c:49 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "A használandó syslog prioritás, amikor a felhasználó sikertelenül hitelesíti magát: %s" + +#: plugins/sudoers/def_data.c:53 +msgid "Put OTP prompt on its own line" +msgstr "Az OTP kérdés elhelyezés a saját sorába" + +#: plugins/sudoers/def_data.c:57 +msgid "Ignore '.' in $PATH" +msgstr "A „.” figyelmen kívül hagyása a $PATH változóban" + +#: plugins/sudoers/def_data.c:61 +msgid "Always send mail when sudo is run" +msgstr "Mindig küldjön levelet, amikor a sudo fut" + +#: plugins/sudoers/def_data.c:65 +msgid "Send mail if user authentication fails" +msgstr "Levél küldése, ha a felhasználó-hitelesítés sikertelen" + +#: plugins/sudoers/def_data.c:69 +msgid "Send mail if the user is not in sudoers" +msgstr "Levél küldése, ha a felhasználó nincs a sudoers fájlban" + +#: plugins/sudoers/def_data.c:73 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Levél küldése, ha a felhasználó nincs a sudoers fájlban ennél a gépnél" + +#: plugins/sudoers/def_data.c:77 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Levél küldése, ha a felhasználónak nem engedélyezett egy parancs futtatása" + +#: plugins/sudoers/def_data.c:81 +msgid "Send mail if the user tries to run a command" +msgstr "Levél küldése, ha a felhasználó megpróbál egy parancsot futtatni" + +#: plugins/sudoers/def_data.c:85 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Különálló időbélyeg használata minden felhasználó/tty párosnál" + +#: plugins/sudoers/def_data.c:89 +msgid "Lecture user the first time they run sudo" +msgstr "Felhasználó oktatása a sudo első alkalommal történő futtatásakor" + +#: plugins/sudoers/def_data.c:93 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "A sudo oktatóanyagot tartalmazó fájl: %s" + +#: plugins/sudoers/def_data.c:97 +msgid "Require users to authenticate by default" +msgstr "Felhasználók hitelesítésének megkövetelése alapértelmezetten" + +#: plugins/sudoers/def_data.c:101 +msgid "Root may run sudo" +msgstr "A rendszergazda futtathatja a sudo programot" + +#: plugins/sudoers/def_data.c:105 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "A gépnév naplózása a (nem syslog) naplófájlba" + +#: plugins/sudoers/def_data.c:109 +msgid "Log the year in the (non-syslog) log file" +msgstr "Az év naplózása a (nem syslog) naplófájlba" + +#: plugins/sudoers/def_data.c:113 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Ha a sudo programot argumentumok nélkül hívják meg, akkor indítson egy parancsértelmezőt" + +#: plugins/sudoers/def_data.c:117 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "A $HOME beállítása a célfelhasználóra, amikor a -s kapcsolóval indít egy parancsértelmezőt" + +#: plugins/sudoers/def_data.c:121 +msgid "Always set $HOME to the target user's home directory" +msgstr "Mindig állítsa be a $HOME értékét a célfelhasználó saját könyvtárára" + +#: plugins/sudoers/def_data.c:125 +msgid "Allow some information gathering to give useful error messages" +msgstr "Néhány információ begyűjtésének engedélyezése hasznos hibaüzenetek adásához" + +#: plugins/sudoers/def_data.c:129 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Teljes képzésű gépnevek megkövetelése a sudoers fájlban" + +#: plugins/sudoers/def_data.c:133 +msgid "Insult the user when they enter an incorrect password" +msgstr "A felhasználó piszkálása, amikor helytelen jelszót ad meg" + +#: plugins/sudoers/def_data.c:137 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Csak akkor engedélyezze a sudo futtatását a felhasználónak, ha rendelkezik tty-nal" + +#: plugins/sudoers/def_data.c:141 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "A visudo el fogja fogadni az EDITOR környezeti változót" + +#: plugins/sudoers/def_data.c:145 +msgid "Prompt for root's password, not the users's" +msgstr "A rendszergazda jelszavának bekérése, nem a felhasználóénak" + +#: plugins/sudoers/def_data.c:149 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "A runas_default felhasználó jelszavának bekérése, nem a felhasználóénak" + +#: plugins/sudoers/def_data.c:153 +msgid "Prompt for the target user's password, not the users's" +msgstr "A célfelhasználó jelszavának bekérése, nem a felhasználóénak" + +#: plugins/sudoers/def_data.c:157 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Alapértelmezések alkalmazása a célfelhasználó bejelentkezési osztályán, ha van ilyen" + +#: plugins/sudoers/def_data.c:161 +msgid "Set the LOGNAME and USER environment variables" +msgstr "A LOGNAME és a USER környezeti változók beállítása" + +#: plugins/sudoers/def_data.c:165 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Csak a tényleges uid beállítása a célfelhasználóra, nem a valódi uid értékének" + +#: plugins/sudoers/def_data.c:169 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ne készítse elő a csoportvektort a célfelhasználóéra" + +#: plugins/sudoers/def_data.c:173 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "A hossz, amelyre a naplófájl sorait tördelni kell (0 esetén nincs tördelés): %u" + +#: plugins/sudoers/def_data.c:177 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Hitelesítési időbélyeg időkorlát: %.1f perc" + +#: plugins/sudoers/def_data.c:181 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Jelszóbekérési időkorlát: %.1f perc" + +#: plugins/sudoers/def_data.c:185 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Egy jelszómegadás kísérleteinek száma: %u" + +#: plugins/sudoers/def_data.c:189 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "A használandó umask vagy 0777 a felhasználóé használatához: 0%o" + +#: plugins/sudoers/def_data.c:193 +#, c-format +msgid "Path to log file: %s" +msgstr "Útvonal a naplófájlhoz: %s" + +#: plugins/sudoers/def_data.c:197 +#, c-format +msgid "Path to mail program: %s" +msgstr "Útvonal a levelezőprogramhoz: %s" + +#: plugins/sudoers/def_data.c:201 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Jelzők a levelezőprogramhoz: %s" + +#: plugins/sudoers/def_data.c:205 +#, c-format +msgid "Address to send mail to: %s" +msgstr "A cím, amelyre a levelet küldeni kell: %s" + +#: plugins/sudoers/def_data.c:209 +#, c-format +msgid "Address to send mail from: %s" +msgstr "A cím, amelyről a levelet küldeni kell: %s" + +#: plugins/sudoers/def_data.c:213 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Tárgysor a levél üzeneteihez: %s" + +#: plugins/sudoers/def_data.c:217 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Helytelen jelszó üzenet: %s" + +#: plugins/sudoers/def_data.c:221 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Útvonal az oktatóanyag állapot könyvtárához: %s" + +#: plugins/sudoers/def_data.c:225 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Útvonal a hitelesítési időbélyeg könyvtárához: %s" + +#: plugins/sudoers/def_data.c:229 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "A hitelesítési időbélyeg könyvtárának tulajdonosa: %s" + +#: plugins/sudoers/def_data.c:233 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Az ebben a csoportban lévő felhasználók mentesülnek a jelszó és PATH követelmények alól: %s" + +#: plugins/sudoers/def_data.c:237 +#, c-format +msgid "Default password prompt: %s" +msgstr "Alapértelmezett jelszóbekérés: %s" + +#: plugins/sudoers/def_data.c:241 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Ha be van állítva, akkor a jelszóbekérés minden esetben felül fogja bírálni a rendszer bekéréseit." + +#: plugins/sudoers/def_data.c:245 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Alapértelmezett felhasználó a parancsok futtatásához másként: %s" + +#: plugins/sudoers/def_data.c:249 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Érték a felhasználó $PATH változójának felülbírálásához ezzel: %s" + +#: plugins/sudoers/def_data.c:253 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Útvonal a visudo által használt szerkesztőhöz: %s" + +#: plugins/sudoers/def_data.c:257 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Mikor szükséges jelszó a „list” álparancshoz: %s" + +#: plugins/sudoers/def_data.c:261 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Mikor szükséges jelszó a „verify” álparancshoz: %s" + +#: plugins/sudoers/def_data.c:265 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "A sudo_noexec programkönyvtárban található üres végrehajtási függvények előtöltése" + +#: plugins/sudoers/def_data.c:269 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Ha az LDAP könyvtár be van kapcsolva, akkor mellőzzük-e a helyi sodoers fájlt" + +#: plugins/sudoers/def_data.c:273 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "A fájlleírók >= %d le lesznek zárva a parancs végrehajtása előtt" + +#: plugins/sudoers/def_data.c:277 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Ha be van állítva, akkor a felhasználók felülbírálhatják a „closefrom” értékét a -C kapcsolóval" + +#: plugins/sudoers/def_data.c:281 +msgid "Allow users to set arbitrary environment variables" +msgstr "Lehetővé teszi a felhasználóknak tetszőleges környezeti változók beállítását" + +#: plugins/sudoers/def_data.c:285 +msgid "Reset the environment to a default set of variables" +msgstr "A környezet visszaállítása egy alapértelmezett változókészletre" + +#: plugins/sudoers/def_data.c:289 +msgid "Environment variables to check for sanity:" +msgstr "Környezeti változók az épség ellenőrzéséhez:" + +#: plugins/sudoers/def_data.c:293 +msgid "Environment variables to remove:" +msgstr "Eltávolítandó környezeti változók:" + +#: plugins/sudoers/def_data.c:297 +msgid "Environment variables to preserve:" +msgstr "Megőrzendő környezeti változók:" + +#: plugins/sudoers/def_data.c:301 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Az új biztonsági környezetben használandó SELinux szerep: %s" + +#: plugins/sudoers/def_data.c:305 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Az új biztonsági környezetben használandó SELinux típus: %s" + +#: plugins/sudoers/def_data.c:309 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Útvonal a sudo specifikus környezeti fájlhoz: %s" + +#: plugins/sudoers/def_data.c:313 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Útvonal a korlátozott sudo specifikus környezeti fájlhoz: %s" + +#: plugins/sudoers/def_data.c:317 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "A sudoers feldolgozásakor használandó területi beállítás: %s" + +#: plugins/sudoers/def_data.c:321 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Lehetővé tenni a sudo számára egy jelszó bekérését akkor is, ha látható lesz" + +#: plugins/sudoers/def_data.c:325 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Látható visszajelzés nyújtása a jelszóbekérésnél, amikor felhasználói bevitel van" + +#: plugins/sudoers/def_data.c:329 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Gyorsabb mintaillesztés használata, ami kevésbé pontos, de nem fér hozzá a fájlrendszerhez" + +#: plugins/sudoers/def_data.c:333 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "A sudoers fájlban megadott umask felül fogja bírálni a felhasználóét akkor is, ha az engedékenyebb" + +#: plugins/sudoers/def_data.c:337 +msgid "Log user's input for the command being run" +msgstr "A futtatott parancs felhasználói bevitelének naplózása" + +#: plugins/sudoers/def_data.c:341 +msgid "Log the output of the command being run" +msgstr "A futtatott parancs kimenetének naplózása" + +#: plugins/sudoers/def_data.c:345 +msgid "Compress I/O logs using zlib" +msgstr "I/O naplók tömörítése zlib használatával" + +#: plugins/sudoers/def_data.c:349 +msgid "Always run commands in a pseudo-tty" +msgstr "A parancsokat mindig egy ál-tty-ban futtassa" + +#: plugins/sudoers/def_data.c:353 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Bővítmény a nem Unix csoport támogatáshoz: %s" + +#: plugins/sudoers/def_data.c:357 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "A könyvtár, amelyben a bemeneti/kimeneti naplók tárolva lesznek: %s" + +#: plugins/sudoers/def_data.c:361 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "A fájl, amelyben a bemeneti/kimeneti napló tárolva lesz: %s" + +#: plugins/sudoers/def_data.c:365 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Bejegyzés hozzáadása az utmp/utmpx fájlhoz egy pty lefoglalásakor" + +#: plugins/sudoers/def_data.c:369 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Az utmp-ben lévő felhasználó beállítása a runas felhasználóra, nem a meghívó felhasználóra" + +#: plugins/sudoers/def_data.c:373 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Engedélyezett jogosultságok halmaza: %s" + +#: plugins/sudoers/def_data.c:377 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Korlátozott jogosultságok halmaza: %s" + +#: plugins/sudoers/def_data.c:381 +msgid "Run commands on a pty in the background" +msgstr "Parancsok futtatása egy pty-on a háttérben" + +#: plugins/sudoers/def_data.c:385 +#, c-format +msgid "PAM service name to use: %s" +msgstr "A használandó PAM szolgáltatás neve: %s" + +#: plugins/sudoers/def_data.c:389 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "A bejelentkezési parancsértelmezőkhöz használandó PAM szolgáltatás neve: %s" + +#: plugins/sudoers/def_data.c:393 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "PAM hitelesítési adatok kiépítésének kísérlete a célfelhasználónál" + +#: plugins/sudoers/def_data.c:397 +msgid "Create a new PAM session for the command to run in" +msgstr "Új PAM munkamenet létrehozása annál a parancsnál, amelyben fut" + +#: plugins/sudoers/def_data.c:401 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Legnagyobb I/O napló sorozatszáma: %u" + +#: plugins/sudoers/def_data.c:405 +msgid "Enable sudoers netgroup support" +msgstr "A sudoers netgroup támogatásának engedélyezése" + +#: plugins/sudoers/def_data.c:409 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "A szülőkönyvtárak írhatóságának ellenőrzése a sudoedit programmal történő fájlszerkesztéskor" + +#: plugins/sudoers/def_data.c:413 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Szimbolikus linkek követése a sudoedit programmal történő fájlszerkesztéskor" + +#: plugins/sudoers/def_data.c:417 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:421 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:425 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "" + +#: plugins/sudoers/def_data.c:429 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "" + +#: plugins/sudoers/def_data.c:433 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "" + +#: plugins/sudoers/def_data.c:437 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:441 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:445 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:449 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:453 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:457 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:461 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:465 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:469 +msgid "Allow the user to specify a timeout on the command line" +msgstr "" + +#: plugins/sudoers/def_data.c:473 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:477 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:481 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:485 +#, c-format +msgid "Authentication failure message: %s" +msgstr "" + +#: plugins/sudoers/defaults.c:221 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:224 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:267 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:270 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:290 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:293 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:318 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:343 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:346 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:359 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:543 plugins/sudoers/ldap.c:1270 +#: plugins/sudoers/ldap.c:1497 plugins/sudoers/ldap.c:1822 +#: plugins/sudoers/linux_audit.c:82 plugins/sudoers/logging.c:1003 +#: plugins/sudoers/policy.c:619 plugins/sudoers/policy.c:629 +#: plugins/sudoers/prompt.c:161 plugins/sudoers/sudoers.c:873 +#: plugins/sudoers/testsudoers.c:238 plugins/sudoers/toke_util.c:158 +#, c-format +msgid "internal error, %s overflow" +msgstr "" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:104 plugins/sudoers/filedigest_gcrypt.c:66 +#: plugins/sudoers/filedigest_openssl.c:95 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:129 plugins/sudoers/filedigest_gcrypt.c:98 +#: plugins/sudoers/filedigest_openssl.c:120 +#, c-format +msgid "%s: read error" +msgstr "%s: olvasási hiba" + +#: plugins/sudoers/group_plugin.c:86 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s a(z) %d uid tulajdona kell legyen" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s csak a tulajdonos által írható lehet" + +#: plugins/sudoers/group_plugin.c:98 plugins/sudoers/sssd.c:400 +#, c-format +msgid "unable to load %s: %s" +msgstr "a(z) %s nem tölthető be: %s" + +#: plugins/sudoers/group_plugin.c:104 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "nem található a „group_plugin” szimbólum ebben: %s" + +#: plugins/sudoers/group_plugin.c:109 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:121 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:146 plugins/sudoers/iolog.c:187 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:175 +#, c-format +msgid "unable to mkdir %s" +msgstr "%s könyvtár létrehozása sikertelen" + +#: plugins/sudoers/iolog.c:191 plugins/sudoers/visudo.c:740 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nem lehet a(z) %s módját megváltoztatni erre: 0%o" + +#: plugins/sudoers/iolog.c:299 plugins/sudoers/sudoers.c:1193 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "ismeretlen csoport: %s" + +#: plugins/sudoers/iolog.c:418 plugins/sudoers/sudoers.c:929 +#: plugins/sudoers/sudoreplay.c:349 plugins/sudoers/sudoreplay.c:1355 +#: plugins/sudoers/sudoreplay.c:1559 plugins/sudoers/timestamp.c:406 +#: plugins/sudoers/visudo.c:972 plugins/sudoers/visudo_json.c:1001 +#: plugins/sudoers/visudo_json.c:1014 +#, c-format +msgid "unable to open %s" +msgstr "%s nem nyitható meg" + +#: plugins/sudoers/iolog.c:469 plugins/sudoers/sudoers.c:933 +#: plugins/sudoers/sudoreplay.c:857 plugins/sudoers/sudoreplay.c:1670 +#, c-format +msgid "unable to read %s" +msgstr "%s nem olvasható" + +#: plugins/sudoers/iolog.c:505 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:295 plugins/sudoers/timestamp.c:298 +#, c-format +msgid "unable to write to %s" +msgstr "az írás sikertelen ebbe: %s" + +#: plugins/sudoers/iolog.c:584 plugins/sudoers/iolog.c:803 +#, c-format +msgid "unable to create %s" +msgstr "%s létrehozása sikertelen" + +#: plugins/sudoers/iolog.c:1035 plugins/sudoers/iolog.c:1110 +#: plugins/sudoers/iolog.c:1191 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "" + +#: plugins/sudoers/iolog.c:1069 +#, c-format +msgid "%s: internal error, file index %d not open" +msgstr "" + +#: plugins/sudoers/ldap.c:431 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:491 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:518 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:522 plugins/sudoers/ldap.c:559 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:630 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:633 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1256 +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:1262 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1986 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2559 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2561 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2617 +#, c-format +msgid " Order: %s\n" +msgstr " Sorrend: %s\n" + +#: plugins/sudoers/ldap.c:2625 plugins/sudoers/parse.c:618 +#: plugins/sudoers/sssd.c:1647 +#, c-format +msgid " Commands:\n" +msgstr " Parancsok:\n" + +#: plugins/sudoers/ldap.c:3187 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:3223 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:3475 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/logging.c:108 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (parancs folytatása) %s" + +#: plugins/sudoers/logging.c:165 +#, c-format +msgid "unable to open log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:173 +#, c-format +msgid "unable to lock log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:206 +#, c-format +msgid "unable to write log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:235 +msgid "No user or host" +msgstr "Nem felhasználó vagy gép" + +#: plugins/sudoers/logging.c:237 +msgid "validation failure" +msgstr "érvényesítési hiba" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "a felhasználó NINCS a sudoers-ben" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "a felhasználó NINCS felhatalmazva a gépen" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "a parancs nem engedélyezett" + +#: plugins/sudoers/logging.c:283 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nincs a sudoers fájlban. Ez az eset jelentésre kerül.\n" + +#: plugins/sudoers/logging.c:286 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nem futtathatja a sudo-t ezen: %s. Ez az eset jelentésre kerül.\n" + +#: plugins/sudoers/logging.c:290 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Elnézést, %s felhasználó nem futtathatja a sudo-t ezen: %s.\n" + +#: plugins/sudoers/logging.c:293 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:330 plugins/sudoers/sudoers.c:473 +#: plugins/sudoers/sudoers.c:475 plugins/sudoers/sudoers.c:477 +#: plugins/sudoers/sudoers.c:479 plugins/sudoers/sudoers.c:1298 +#: plugins/sudoers/sudoers.c:1300 +#, c-format +msgid "%s: command not found" +msgstr "%s: parancs nem található" + +#: plugins/sudoers/logging.c:332 plugins/sudoers/sudoers.c:469 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:349 +msgid "authentication failure" +msgstr "hitelesítési hiba" + +#: plugins/sudoers/logging.c:375 +msgid "a password is required" +msgstr "jelszó szükséges" + +#: plugins/sudoers/logging.c:438 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u helytelen jelszópróbálkozás" +msgstr[1] "%u helytelen jelszópróbálkozás" + +#: plugins/sudoers/logging.c:654 +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:662 plugins/sudoers/logging.c:714 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:704 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:767 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/match.c:771 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:944 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to stat %s" +msgstr "%s nem érhető el" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:544 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:545 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:559 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:568 +#, c-format +msgid " Options: " +msgstr "" + +#: plugins/sudoers/policy.c:84 plugins/sudoers/policy.c:110 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:289 plugins/sudoers/testsudoers.c:261 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:433 +msgid "user name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:437 +msgid "user ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:441 +msgid "group ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:445 +msgid "host name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:793 plugins/sudoers/visudo.c:910 +#, c-format +msgid "unable to execute %s" +msgstr "%s nem hajtható végre" + +#: plugins/sudoers/policy.c:926 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:928 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:932 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:938 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:971 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:188 plugins/sudoers/pwutil.c:206 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:200 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:260 plugins/sudoers/pwutil.c:277 +#: plugins/sudoers/pwutil.c:339 plugins/sudoers/pwutil.c:384 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:272 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:503 plugins/sudoers/pwutil.c:521 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:515 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:569 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:633 plugins/sudoers/pwutil.c:675 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:581 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:801 plugins/sudoers/pwutil.c:853 +#: plugins/sudoers/pwutil.c:904 plugins/sudoers/pwutil.c:957 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:807 plugins/sudoers/pwutil.c:858 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:962 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:847 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:951 +#, c-format +msgid "unable to parse gids for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "túl sok folyamat" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "az aktuális munkakönyvtár lekérése meghiúsult" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "" + +#: plugins/sudoers/sssd.c:402 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:410 plugins/sudoers/sssd.c:419 +#: plugins/sudoers/sssd.c:428 plugins/sudoers/sssd.c:437 +#: plugins/sudoers/sssd.c:446 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sssd.c:1562 +#, c-format +msgid "" +"\n" +"SSSD Role: %s\n" +msgstr "" + +#: plugins/sudoers/sssd.c:1567 +#, c-format +msgid "" +"\n" +"SSSD Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:289 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:307 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:325 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:338 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:168 plugins/sudoers/testsudoers.c:247 +#: plugins/sudoers/visudo.c:233 plugins/sudoers/visudo.c:612 +#: plugins/sudoers/visudo.c:976 +msgid "unable to initialize sudoers default values" +msgstr "" + +#: plugins/sudoers/sudoers.c:198 plugins/sudoers/sudoers.c:891 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:244 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:301 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:390 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:405 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:406 +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:468 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:487 +msgid "sorry, you are not allowed set a command timeout" +msgstr "" + +#: plugins/sudoers/sudoers.c:495 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:836 +msgid "command too long" +msgstr "a parancs túl hosszú" + +#: plugins/sudoers/sudoers.c:948 +#, c-format +msgid "%s is not a regular file" +msgstr "a(z) %s nem egy szabályos fájl" + +#: plugins/sudoers/sudoers.c:952 plugins/sudoers/timestamp.c:222 toke.l:969 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s a(z) %u uid tulajdona, ennek kellene lennie: %u" + +#: plugins/sudoers/sudoers.c:956 toke.l:974 +#, c-format +msgid "%s is world writable" +msgstr "%s bárki számára írható" + +#: plugins/sudoers/sudoers.c:960 toke.l:977 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s a(z) %u gid tulajdona, ennek kellene lennie: %u" + +#: plugins/sudoers/sudoers.c:993 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "" + +#: plugins/sudoers/sudoers.c:1012 +#, c-format +msgid "unknown login class: %s" +msgstr "ismeretlen bejelentkezési osztály: %s" + +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/sudoers.c:1109 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:275 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:300 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:303 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s version %s\n" +msgstr "%s: %s verzió\n" + +#: plugins/sudoers/sudoreplay.c:335 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:357 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:602 +#: plugins/sudoers/sudoreplay.c:805 plugins/sudoers/sudoreplay.c:895 +#: plugins/sudoers/sudoreplay.c:974 plugins/sudoers/sudoreplay.c:989 +#: plugins/sudoers/sudoreplay.c:996 plugins/sudoers/sudoreplay.c:1003 +#: plugins/sudoers/sudoreplay.c:1010 plugins/sudoers/sudoreplay.c:1017 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "az esemény hozzáadása a sorhoz sikertelen" + +#: plugins/sudoers/sudoreplay.c:670 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:721 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:722 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:750 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:783 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1222 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1244 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1248 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1263 +#, c-format +msgid "%s requires an argument" +msgstr "%s egy argumentumot igényel" + +#: plugins/sudoers/sudoreplay.c:1266 plugins/sudoers/sudoreplay.c:1646 +#, c-format +msgid "invalid regular expression: %s" +msgstr "érvénytelen reguláris kifejezés: %s" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1279 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1281 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1283 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1332 +#, c-format +msgid "unknown search type %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1370 +#, c-format +msgid "%s: invalid log file" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1388 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1395 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1402 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1411 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1420 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1826 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "használat: %s [-hnR] [-d kvt] [-m szám] [-s szám] ID\n" + +#: plugins/sudoers/sudoreplay.c:1829 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "használat: %s [-h] [-d kvt] -l [keresőkifejezés]\n" + +#: plugins/sudoers/sudoreplay.c:1838 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - sudo munkamenetek naplójának újrajátszása\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1840 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Beállítások:\n" +" -d, --directory=kvt munkamenet-naplók könyvtárának megadása\n" +" -f, --filter=szűrő megjelenítendő I/O típusok megadása\n" +" -h, --help súgóüzenet megjelenítése és kilépés\n" +" -l, --list elérhető munkamenet-azonosítók listája, elhagyható\n" +" kifejezéssel\n" +" -m, --max-wait=szám események közti várakozás legfeljebb ennyi másodpercig\n" +" -s, --speed=szám kimenet felgyorsítása vagy lelassítása\n" +" -V, --version verzióinformációk kiírása és kilépés" + +#: plugins/sudoers/testsudoers.c:329 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:230 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:306 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:772 plugins/sudoers/timestamp.c:839 +#: plugins/sudoers/visudo.c:500 plugins/sudoers/visudo.c:506 +msgid "unable to read the clock" +msgstr "" + +#: plugins/sudoers/timestamp.c:786 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:798 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:893 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:937 plugins/sudoers/timestamp.c:957 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:266 plugins/sudoers/visudo.c:667 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:349 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:459 plugins/sudoers/visudo.c:467 +msgid "write error" +msgstr "íráshiba" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:520 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:548 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:607 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:619 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:656 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:736 plugins/sudoers/visudo.c:745 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:855 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:869 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:915 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:945 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:952 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:981 plugins/sudoers/visudo_json.c:1021 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1000 plugins/sudoers/visudo_json.c:1035 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1015 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1062 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:1159 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1160 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1164 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1165 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1318 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1433 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - a sudoers fájl biztonságos szerkesztése\n" +"\n" + +#: plugins/sudoers/visudo.c:1435 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" +"\n" +"Kapcsolók:\n" +" -c, --check csak ellenőrzés mód\n" +" -f, --file=sudoers a sudoers fájl helyének megadása\n" +" -h, --help súgóüzenet megjelenítése és kilépés\n" +" -q, --quiet kevésbé részletes (csendes) szintaktikai hiba\n" +" üzenetek\n" +" -s, --strict szigorú szintaxis-ellenőrzés\n" +" -V, --version verzióinformációk kiírása és kilépés\n" +" -x, --export=KIMENETIFÁJL a sudoers kiírása JSON formátumban a\n" +" KIMENETIFÁJLBA" + +#: plugins/sudoers/visudo_json.c:616 plugins/sudoers/visudo_json.c:651 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo_json.c:1007 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: toke.l:943 +msgid "too many levels of includes" +msgstr "" diff --git a/plugins/sudoers/po/it.mo b/plugins/sudoers/po/it.mo new file mode 100644 index 0000000..1270b0f Binary files /dev/null and b/plugins/sudoers/po/it.mo differ diff --git a/plugins/sudoers/po/it.po b/plugins/sudoers/po/it.po new file mode 100644 index 0000000..e3a1cae --- /dev/null +++ b/plugins/sudoers/po/it.po @@ -0,0 +1,3087 @@ +# Italian translations for sudoers package +# This file is put in the public domain. +# Milo Casagrande , 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-12-03 09:48+0100\n" +"Last-Translator: Milo Casagrande \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.1\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "errore di sintassi" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "password di %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] password di %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Password: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informazioni di SICUREZZA per %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Riprovare." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "impossibile allocare memoria" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "un digest richiede il nome di percorso" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "i valori per \"CWD\" devono iniziare con un carattere \"/\", \"~\" o \"*\"" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "i valori per \"CHROOT\" devono iniziare con un carattere \"/\", \"~\" o \"*\"" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "errore di sintassi, parola riservata %s utilizzata come alias" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "valore notbefore non valido" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "valore notafter non valido" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "valore timeout troppo grande" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "valore timeout non valido" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "errore interno, overflow di %s" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "impossibile eseguire dup sullo stdin: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "impossibile eseguire %s: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "impossibile eseguire fork" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "impossibile eseguire fork: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "impossibile aprire una pipe: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (comando continuato) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s esiste, ma non è una directory (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "impossibile creare la directory %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "impossibile modificare la modalità di %s a 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "atteso JSON_STRING, ottenuto %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "virgolette doppie mancanti nel nome" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "atteso JSON_OBJECT, ottenuto %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "parentesi graffa di chiusura senza corrispondenza" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "array non atteso" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "parentesi quadra di chiusura senza corrispondenza" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "stringa non attesa" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "due punti mancanti dopo il nome" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "booleano non atteso" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "numero non atteso" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u impossibile analizzare \"%s\"" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: file di registro non valido" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: manca il campo della marcatura temporale" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: marcatura temporale %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: manca il campo utente" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: manca il campo utente di runas" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: manca il campo gruppo di runas" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "errore nel leggere il file di timing: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "riga di timing del file non valida: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "il registro è già completo, non può essere riavviato" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "impossibile riavviare il registro" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "impossibile aprire %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "file di registro I/O mancante %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: impossibile spostarsi avanti %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "impossibile trovare il punto di ripristino [%lld, %ld] in %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "errore della macchina di stato" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "AcceptMessage non valido" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "errore nell'analizzare AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "errore nel creare il registro I/O" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "errore nel registrare l'evento accept" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "RejectMessage non valido" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "errore nell'analizzare RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "errore nel registrare l'evento reject" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "AlertMessage non valido" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "errore nell'analizzare AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "errore nel registrare l'evento alert" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "errore di protocollo" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "errore nello scrivere IoBuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "errore nello scrivere ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "errore nello scrivere CommandSuspend" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "tipo di ClientMessage non riconosciuto" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "messaggio client troppo grande" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "impossibile impostare il cifrario per TLS 1.2 a %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "impossibile impostare il cifrario per TLS 1.3 a %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "impossibile ottenere il metodo TLS del server: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "impossibile creare il contesyo TLS: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "impossibile caricare il certificato %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "impossibile caricare il bundle CA %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "impossibile caricare la chiave privata %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "impossibile impostare i parametri diffie-hellman: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "impossibile impostare la versione minima del protocollo a TLS 1.2: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "impossibile ottenere indirizzo IP remoto" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Impossibile allegare dati utenti all'oggetto ssl: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "impossibile aggiungere l'evento alla coda" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "impossibile impostare il socket di ascolto" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - Invia registro I/O di sudo a un server remoto\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opzioni:\n" +" -f, --file Percorso al file di configurazione\n" +" -h, --help Visualizza il messaggio di aiuto ed esce\n" +" -n, --no-fork Non esegue una fork, resta in primo piano\n" +" -R, --random-drop Percentuale di connessioni chiuse\n" +" -V, --version Visualizza la versione ed esce\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "È richiesto Protobuf-C 1.3 o successivo" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "valore drop casuale non valido: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s versione %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS non supportato" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: non è un percorso completo" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d \"[\" non corrispondente: %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d sezione configurazione non valida: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d riga di configurazione non valida: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d atteso nome di sezione: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "valore non valido per \"%s\": %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d chiave sconosciuta: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "strumento syslog %s sconosciuto" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "priorità syslog %s sconosciuta" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opzioni:\n" +" --help Visualizza questo messaggio ed esce\n" +" -A, --accept Invia solo eventi accept (no I/O)\n" +" -h, --host Host a cui inviare i registri\n" +" -i, --iolog_id ID remoto del registro I/O da ripristinare\n" +" -p, --port Prta da usare nella connessione a un host\n" +" -r, --restart Riavvia il trasferimento precedente\n" +" -R, --reject Rifiuta il comando con il motivo indicato\n" +" -b, --ca-bundle File bundle del certificato per verificare il server\n" +" -c, --cert File certificato per handshake TLS\n" +" -k, --key File chiave privata\n" +" -n, --no-verify Non verifica il certificato del server\n" +" -t, --test Prova del server di audit inviando il registro I/O\n" +" selezionato N volte in parallelo\n" +" -V, --version Visualizza la versione ed esce\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "impossibile cercare %s:%s: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "impossibile ottenere indirizzo IP del server" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "impossibile leggere %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "messaggio client troppo grande: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: buffer di scrittura già in uso" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "evento I/O %d non atteso" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: stato %d non atteso" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "ServerHello non valido" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "messaggio di errore ricevuto dal server: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "messaggio di abort ricevuto dal server: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "impossibile aprire ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: valore type_case %d non atteso" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "timeout nel leggere dal server" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "EOF prematuro" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "messaggio server troppo grande: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "timeout nello scrivere sul server" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "timeout handshake TLS" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "impossibile impostare evento" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "Connessione TLS non riuscita: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Impossibile inizializzare il conteso ssl: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Impossibile allocare l'oggetto ssl: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Impossibile collegare il socket all'oggetto ssl: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "devono essere specificati sia il punto di inizio che l'ID di iolog" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "un punto di partenza non può essere impostato quando non è inviato alcun I/O" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "uscito inaspettatamente con stato %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "tempo trascorso inviato al server [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "punto di commit ricevuto dal server [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias \"%s\" già definito" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "impossibile ottenere l'ora" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "impossibile modificare la password per %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "impossibile ottenere la classe di login per l'utente %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "impossibile iniziare l'autenticazione bsd" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "tipo di autenticazione non valida" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "impossibile iniziare l'autenticazione BSD" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "il proprio account è scaduto" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "approvazione non riuscita" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "impossibile leggere la configurazione fwtk" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "impossibile connettersi al server di autenticazione" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "connessione al server di autenticazione persa" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"errore del server di autenticazione:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: impossibile convertire il principal in stringa (\"%s\"): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: impossibile analizzare \"%s\": %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: impossibile risolvere la cache delle credenziali: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: impossibile allocare le opzioni: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: impossibile ottenere le credenziali: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: impossibile inizializzare la cache delle credenziali: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: impossibile memorizzare le credenziali nella cache: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: impossibile ottenere il principal dell'host: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: impossibile verificare TGT. Possibile attacco in corso: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "impossibile inizializzare PAM: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Errore autenticazione PAM: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "validazione dell'account non riuscita: forse è bloccato?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Account o password scaduto: reimpostare la password e provare nuovamente" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "impossibile modificare la password scaduta: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Password scaduta, contattare l'amministratore di sistema" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Account scaduto o alla configurazione PAM manca una sezione \"account\" per sudo: contattare l'amministratore di sistema" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Errore gestione account PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "l'utente attuale non esiste nel database %s" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "inizializzazione della libreria API ACE non riuscita" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "impossibile contattare il server SecurID" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "ID utente bloccato per l'autenticazione SecurID" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "lunghezza del nome utente per SecurID non valida" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "gestore di autenticazione per SecurID non valido" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "Comunicazione SecurID non riuscita" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "errore sconosciuto di SecurID" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "lunghezza del passcode per SecurID errata" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "impossibile inizializzare la sessione SIA" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "metodi di autenticazione non validi" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Metodi di autenticazione non validi compilati all'interno di sudo. Non è possibile usare assieme autenticazione standalone e non-standalone." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "nessun metodo di autenticazione" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Non ci sono metodi di autenticazione compilati all'interno di sudo. Per disabilitare l'autenticazione, usare l'opzione di configurazione --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Impossibile inizializzare i metodi di autenticazione." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Metodi di autenticazione:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Impossibile determinare la condizione di audit" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "impossibile inviare il record di audit" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Questa lezione dovrebbe essere stata impartita dall'amministratore\n" +"di sistema locale. Solitamente equivale a:\n" +"\n" +" #1) Rispettare la privacy degli altri\n" +" #2) Pensare prima di digitare\n" +" #3) Da grandi poteri derivano grandi responsabilità\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "uid sconosciuto: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "utente sconosciuto: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "ordine di incremento: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordine di partenza: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "ordine di riempimento: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s versione grammaticale %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "formato di input %s non supportato" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "formato di output %s non supportato" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: i file di input e output devono essere diversi" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "impossibile inizializzare i valori predefiniti di sudoers" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: chiave sconosciuta: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "tipo di defaults non valido: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "tipo di occultamento non valido: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "filtro non valido: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "impossibile aprire %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "analisi del file %s non riuscita, errore sconosciuto" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "errore di analisi in %s vicino alla riga %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "errore di analisi in %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "impossibile scrivere su %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - Converte tra formati del file sudoers\n" +"\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opzioni:\n" +" -b, --base=dn Il DN base per le ricerche LDAP\n" +" -c, --config=FILE_CONF Il percorso al file di configurazione\n" +" -d, --defaults=TIPIDEF Converte Defaults solo dei tipi indicati\n" +" -e, --expand-aliases Espande gli alias nella conversione\n" +" -f, --output-format=FORMATO Imposta il formato di output: JSON, LDIF o sudoers\n" +" -i, --input-format=FORMATO Imposta il formato di input: LDIF o sudoers\n" +" -I, --increment=num Di quanto incrementare il valore sudoOrder\n" +" -h, --help Mostra il messaggio di aiuto ed esce\n" +" -m, --match=FILTRO Converte le voci che corrispondo al filtro\n" +" -M, --match-local Il filtro usa i dati da passwd e group\n" +" -o, --output=file_output Scrive il file convertito su file_output\n" +" -O, --order-start=num Punto di partenza del primo sudoOrder\n" +" -p, --prune-matches Elimina utenti, gruppi e host che non corrispondono\n" +" -P, --padding=num Riempimento base per incrementi di sudoOrder\n" +" -s, --suppress=SEZIONI Disabilita l'output per alcune sezioni\n" +" -V, --version Visualizza la versione ed esce" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "voce Defaults \"%s\" sconosciuta" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "impossibile ottenere l'ora GMT" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "impossibile formattare la marcatura temporale" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "troppe voci sudoers, massimo %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "la variabile d'ambiente SUDOERS_BASE non è impostata e non è stata specificata l'opzione -b." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Infrastruttura syslog se syslog viene utilizzato per le registrazioni: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Priorità di syslog se l'utente si identifica con successo: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Priorità di syslog se l'utente non si identifica con successo: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Mette il prompt OTP su una riga a parte" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ignora \".\" in $PATH" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Invia sempre una email quando viene eseguito sudo" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Invia una email se l'autenticazione utente non riesce" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Invia una email se l'utente non è tra i sudoers" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Invia una email se l'utente non è tra i sudoers per questo host" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Invia una email se l'utente non è abilitato a eseguire un comando" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Invia una email se l'utente tenta di eseguire un comando" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Usa una marcatura temporale diversa per ogni combinazione utente/tty" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Aiuta gli utenti alla prima esecuzione di sudo" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "File contenente la lezione su sudo: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Richiede in modo predefinito l'autenticazione degli utenti" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Root può eseguire sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Registra il nome host nel file di registro (non-syslog)" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Registra l'anno nel file di registro (non-syslog)" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Se sudo viene lanciato senza alcun argomento, avvia una shell" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Imposta $HOME all'utente definito quando viene avviata una shell con -s" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Imposta sempre $HOME alla directory home dell'utente definito" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Consente la raccolta di alcune informazioni per dare messaggi di errore utili" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Richiede nomi host completi nel file sudoers" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Apostrofa l'utente quando inserisce una password errata" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Consente all'utente di seguire sudo solo se dispone di un tty" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "visudo utilizzerà il valore definito nella variabile EDITOR" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Chiede la password di root, non quella dell'utente" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Chiede la password dell'utente runas_default, non quella dell'utente" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Chiede la password dell'utente definito, non quella dell'invocante" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Applica i Defaults nella classe di login dell'utente definito, se presente" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Imposta le variabili d'ambiente LOGNAME e USER" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Imposta lo uid effettivo all'utente definito, non lo uid reale" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Non inizializza il vettore di gruppo con quello dell'utente definito" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Lunghezza a cui andare a capo nei file di registro (0 per non andare a capo): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Timeout marcatura temporale di autenticazione: %.1f minuti" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Timeout per inserimento password: %.1f minuti" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Numero di tentativi per l'inserimento della password: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "umask da utilizzare o 0777 per utilizzare quella dell'utente: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Percorso al file di registro: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Percorso al programma email: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Flag per il programma email: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Indirizzo a cui mandare l'email: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Indirizzo da cui mandare l'email: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Oggetto dell'email: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Messaggio password errata: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Percorso directory di stato della lezione: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Percorso directory con la marcatura temporale di autenticazione: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Proprietario directory con la marcatura temporale di autenticazione: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Agli utenti di questo gruppo non sono richiesti password e PATH: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Prompt predefinito per la password: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Se impostato, passprompt scavalcherà sempre il prompt di sistema." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Utente predefinito con cui eseguire i comandi: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valore con cui sovrascrivere la variabile $PATH dell'utente: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Percorso all'editor per visudo: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quando richiedere una password per il pseudo-comando \"list\": %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quando richiedere una password per il pseudo-comando \"verify\": %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Carica la libreria sudo_noexec che sostituisce le funzioni exec" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Se LDAP è funzionante, viene ignorato il file sudoers locale" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "I descrittori di file >= %d verranno chiusi prima dell'esecuzione di un comando" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Se impostata, gli utenti possono sovrascrivere il valore di \"closefrom\" con l'opzione -C" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Consente agli utenti di impostare variabili d'ambiente" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Reimposta l'ambiente con le variabili predefinite" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Variabile d'ambienti da verificare per la sicurezza:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Variabili d'ambiente da rimuovere:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Variabili d'ambiente da preservare:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Ruolo SELinux da usare nel nuovo contesto di sicurezza: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Tipologia di SELinux da usare nel nuovo contesto di sicurezza: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Percorso al file d'ambiente specifico di sudo: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Percorso al file d'ambiente riservato specifico di sudo: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Localizzazione da usare durante l'analisi del file sudoers: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Abilita sudo a chiedere una password anche se sarebbe visibile" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Fornisce riscontro visibile al prompt della password nel caso di input utente" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Usa glob più veloce e meno preciso, ma non accede al file system" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "La umask definita in sudoers scavalca quella dell'utente, anche se è più permissiva" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Registra l'input dell'utente per il comando in esecuzione" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Registra l'output del comando in esecuzione" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Comprime i registri utilizzando zlib" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Esegue sempre i comandi in uno pseudo-tty" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plugin per supporto ai gruppi non-Unix: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Directory in cui salvare i registri di I/O: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "File in cui salvare il registro I/O: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Aggiunge una voce al file utmp/utmpx quando viene allocato un pty" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Imposta l'utente in utmp all'utente runas, non l'utente invocante" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Insieme di privilegi concessi: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Insieme di privilegi non concessi: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Esegue i comandi in un pty in background" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nome del servizio PAM da usare: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nome del servizio PAM da usare per le shell di login: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tentativo di stabilire le credenziali PAM per l'utente finale" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Crea una nuova sessione PAM in cui eseguire il comando" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Esegue la gestione della convalida dell'account PAM" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Numero massimo di sequenze I/O di registro: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Abilita support netgroup in sudoers" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Controlla le directory superiori per accesso in scrittura durante le modifiche con sudoedit" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Segue i collegamenti simbolici durante le modifiche con sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Interroga il plugin dei gruppi per gruppi di sistema sconosciuti" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Corrispondenza gruppi di rete con tutti i valori: utente, host e dominio" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Consente di eseguire i comandi anche se sudo non può scrivere sul registro di controllo" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Consente di eseguire i comandi anche se sudo non può scrivere sul registro di I/O" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Consente di eseguire i comandi anche se sudo non può scrivere sul file di registro" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Gestisce i gruppi attraverso sudoers ed esegue la corrispondenza sull'ID del gruppo, non sul nome" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Voci di registro più grandi di questo valore vengono divise su più messaggi: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Utente proprietario dei file di registro di I/O: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Gruppo proprietario dei file di registro di I/O: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Modalità dei file di registro di I/O: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Esegue comandi in base al descrittore del file e non sul percorso: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignora le voci Defaults sconosciute nel file sudoers invece di inviare un avviso" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tempo in secondi dopo il quale il comando viene terminato: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Consente all'utente di specificare un timeout attraverso la riga di comando" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Scrive immediatamente i dati I/O del registro sul disco invece di tenerli in memoria" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Include l'ID del processo quando viene usato syslog" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipo di marcatura temporale di autenticazione: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Messaggio di autenticazione non riuscita: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Ignora maiuscole/minuscole nella corrispondenza coi nomi utente" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Ignora maiuscole/minuscole nella corrispondenza coi gruppi" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Registra quando un comando è consentito da sudoers" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Registra quando un comando viene negato da sudoers" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Server di registro per sudo a cui connettersi, con la porta opzionale" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Timeout server di registro per sudo, in secondi: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Abilita l'opzione SO_KEEPALIVE sul socket connesso al server di registro" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Percorso al file bundle CA del server di audit: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Percorso al file certificato di sudoers: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Percorso al file chiave privata di sudoers: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Verifica che il certificato del server di registro è valido" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Consente l'uso di ID utente o gruppo sconosciuto per runas" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Consente di eseguire i comandi a un utente con una shell valida" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Imposta l'utente remoto pam all'utente che esegue sudo" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Imposta l'host remoto pam al nome host locale" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Directory di lavoro a cui passare prima dell'esecuzione del comando: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Directory root a cui passare prima dell'esecuzione del comando: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "Il formato dei registri da creare: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: voce Defaults \"%s\" sconosciuta" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: voce Defaults \"%s\" sconosciuta" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: nessun valore specificato per \"%s\"" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nessun valore specificato per \"%s\"" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: l'opzione \"%s\" non accetta un valore" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: l'opzione \"%s\" non accetta un valore" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: tipo Defaults 0x%x non valido per l'opzione \"%s\"" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: tipo Defaults 0x%x non valido per l'opzione \"%s\"" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: il valore \"%s\" non è valido per l'opzione \"%s\"" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: il valore \"%s\" non è valido per l'opzione \"%s\"" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: i valori per \"%s\" devono iniziare con un carattere \"/\", \"~\" o \"*\"" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: i valori per \"%s\" devono iniziare con un carattere \"/\", \"~\" o \"*\"" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: i valori per \"%s\" devono iniziare con un carattere \"/\"" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: i valori per \"%s\" devono iniziare con un carattere \"/\"" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp danneggiato, discordanza nella lunghezza" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "impossibile ricostruire l’ambiente" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "permessi non sufficienti per impostare le seguenti variabili d'ambiente: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "errore di analisi in %s vicino alla riga %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "errore di analisi in %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tipo di digest %d non supportato per %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: errore di lettura" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s deve essere di proprietà dello uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s deve essere scrivibile solo dal proprietario" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "impossibile caricare %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "impossibile trovare il simbolo \"group_plugin\" in %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: version major %d del plugin per il gruppo non compatibile, atteso %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "impossibile analizzare l'indirizzo IP \"%s\"" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "impossibile analizzare la maschera di rete \"%s\"" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Coppia indirizzo IP locale e maschera di rete:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "gruppo sconosciuto: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "impossibile aggiornare il file sequenza" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "impossibile scrivere sul file di registro di I/O: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "impossibile creare %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: errore interno, file registro IO per l'evento %d non aperto" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "impossibile leggere l'orologio" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: errore interno, segnale %d non valido" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls non supportato quando viene utilizzato ldaps" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "impossibile inizializzare il certificato SSL e il database delle chiavi: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "è necessario impostare TLS_CERT in %s per usare SSL" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "impossibile inizializzare LDAP: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "specificato start_tls ma le librerie LDAP non supportano ldap_start_tls_s() o ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "attributo sudoOrder non valido: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: porta troppo grande" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tipologia di uri LDAP non supportata: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "impossibile utilizzare URI ldap e ldaps assieme" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "impossibile convertire sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "impossibile aprire il sistema di audit" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "impossibile inviare il messaggio di audit" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "errore nel ciclo dell'evento" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Creazione di un nuovo oggetto SSL_CTX non riuscita: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "Connessione TLS a %s:%s non riuscita: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "inizializzazione TLS non riuscita" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "handshake TLS non riuscito" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: errore interno, stato di uscita %d non valido" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "connessione al server del registro persa" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "manca il buffer in scrittura" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "impossibile connettersi al server del registro" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "utente non tra i sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "utente non autorizzato sull'host" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "comando non consentito" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s non è nel file sudoers. Questo evento verrà segnalato.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "A %s non è consentito eseguire sudo su %s. Questo evento verrà segnalato.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "L'utente %s non può eseguire sudo su %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "All'utente %s non è consentito eseguire \"%s%s%s\" come %s%s%s su %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: comando non trovato" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"viene ignorato \"%s\" trovato in \".\"\n" +"Usare \"sudo ./%s\" per eseguire \"%s\"." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u tentativo di immissione password non corretto" +msgstr[1] "%u tentativi di immissione password non corretti" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "autenticazione non riuscita" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "è necessaria una password" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "impossibile aprire il file di registro: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "impossibile scrivere sul file di registro: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "il digest per %s (%s) non è nella forma %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Ruolo LDAP: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Voce sudoers:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Opzioni: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Comandi:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Corrispondenza voci Defaults per %s su %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Valori predefiniti per Runas e Command per %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'utente %s può eseguire i seguenti comandi su %s:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "L'utente %s non è abilitato all'esecuzione di sudo su %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorato sudoRole non completo: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "attributo LDIF non valido: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s non valido impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "impossibile analizzare l'elenco degli indirizzi di rete" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "nome utente non impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "ID utente non impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "ID gruppo non impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "nome dell'host non impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "directory di lavoro non valida: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "directory chroot non valida: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "impossibile eseguire %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Versione %s del plugin della politica sudoers\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versione %d della grammatica del file sudoers\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Percorso sudoers: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "percorso nsswitch: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "percorso ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "percorso ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "impossibile registrare un hook di tipo %d (versione %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "impossibile memorizzare in cache lo uid %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "impossibile memorizzare in cache lo uid %u, esiste già" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "impossibile memorizzare in cache l'utente %s" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "impossibile memorizzare in cache l'utente %s, esiste già" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "impossibile memorizzare in cache il gid %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "impossibile memorizzare in cache il gid %u, esiste già" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "impossibile memorizzare in cache il gruppo %s" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "impossibile memorizzare in cache il gruppo %s, esiste già" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "impossibile memorizzare in cache l'elenco di gruppo %s, esiste già" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "impossibile memorizzare in cache l'elenco di gruppo %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "impossibile analizzare i gruppi per %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "impossibile analizzare i gid per %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "overflow dello stack perm" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "underflow dello stack perm" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "impossibile passare al gid root" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "impossibile passare al gid runas" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "impossibile impostare il vettore di gruppo per runas" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "impossibile passare allo uid runas" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "impossibile passare al gid sudoers" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "troppi processi" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "impossibile ottenere la directory di lavoro corrente" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "percorso audit user_cmnd troncato: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "percorso audit argv[0] troncato: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "impossibile inizializzare la sorgente SSS. È stato installato SSSD?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "impossibile trovare il simbolo \"%s\" in %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "problema con le voci Defaults" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "nessuna sorgente valida di sudoers trovata, uscita" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "l'utente non è autorizzato a cambiare la directory root a %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "non è consentito l'uso dell'opzione -R con %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "l'utente non è autorizzato a cambiare directory a %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "non è consentito l'uso dell'opzione -D con %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers indica che a root non è consentito usare sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "l'utente non è autorizzato a scavalcare il limite closefrom" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "utente non abilitato all'uso dell'opzione -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "proprietario marcatura temporale (%s): utente inesistente" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "nessun tty" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "è necessario disporre di un tty per eseguire sudo" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "shell utente %s non valida: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "comando nella directory corrente" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "l'utente non è autorizzato a impostare un timeout per i comandi" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "non è consentito impostare un timeout per i comandi" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "l'utente non è autorizzato a preservare l'ambiente" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "non è consentito preservare l'ambiente" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "comando troppo lungo" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "non è necessario eseguire sudoedit via sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "impossibile leggere %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "impossibile eseguire stat su %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s non è un file regolare" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s è di proprietà dello uid %u, dovrebbe essere %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s è scrivibile da tutti" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s è di proprietà del gid %u, dovrebbe essere %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "solo root può usare \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "classe di login sconosciuta: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "impossibile risolvere l'host %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "opzione di filtro non valida: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "attesa massima non valida: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "fattore di velocità non valido: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Riproduzione della sessione sudo: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "impossibile impostare il terminale in modalità raw" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Attenzione: il terminale è troppo piccolo per riprodurre correttamente il registro.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "La geometria del registro è %dx%d, quella del terminale è %dx%d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Riproduzione terminata. Premere un tasto per ripristinare il terminale." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "espressione \"%s\" ambigua" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "carattere \")\" nell'espressione non corrisposto" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "termine di ricerca \"%s\" sconosciuto" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s richiede un argomento" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "espressione regolare non valida: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "impossibile analizzare la data \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "carattere \"(\" nell'espressione non corrisposto" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "\"or\" finale non consentito" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "carattere \"!\" finale non consentito" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "tipo di ricerca %d sconosciuto" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uso: %s [-hnRS] [-d DIR] [-m NUM] [-s NUM] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uso: %s [-h] [-d DIR] -l [ESPRESSIONE DI RICERCA]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - Riproduce i registri di sessione di sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opzioni:\n" +" -d, --directory=DIR Specifica la directory per i registri di sessione\n" +" -f, --filter=FILTRO Specifica il tipo di I/O da mostrare\n" +" -h, --help Visualizza il messaggio di aiuto ed esce\n" +" -l, --list Elenca gli ID di sessione disponibili corrispondenti\n" +" -m, --max-wait=NUM Secondi da attendere tra gli eventi\n" +" -n, --non-interactive Non interattivo, la sessione è inviato all'output standard\n" +" -R, --no-resize Non ridimensiona il terminale\n" +" -S, --suspend-wait Attende mentre il comando è sospeso\n" +" -s, --speed=NUME Velocizza o rallenta l'output\n" +" -V, --version Visualizza la versione ed esce" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\thost non corrispondente" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Comando consentito" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Comando negato" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Comando non corrispondente" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s è scrivibile da tutti" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "impossibile troncare il file della marcatura temporale a %lld byte" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "marcatura temporale dal futuro ignorata" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "marcatura temporale troppo avanti nel tempo: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "impossibile bloccare il file della marcatura temporale %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "percorso marcatura temporale troppo lungo: %s %s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit non dovrebbe essere specificato con un percorso" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "l'opzione -x verrà rimossa in una prossima versione" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "utilizzare lo strumento cvtsudoers al suo posto" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "premere Invio per modificare %s: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "l'editor specificato (%s) non esiste" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nessun editor trovato (percorso dell'editor = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "errore di scrittura" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "impossibile eseguire stat sul file temporaneo (%s), %s non modificato" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "file temporaneo di lunghezza pari a zero (%s), %s non modificato" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editor (%s) non riuscito, %s non modificato" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s non modificato" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "impossibile riaprire il file temporaneo (%s), %s non modificato." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "impossibile analizzare il file temporaneo (%s), errore sconosciuto" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "errore interno, impossibile trovare %s nell'elenco." + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "impossibile impostare (uid, gid) di %s a (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s e %s non sono sullo stesso file system, viene usato \"mv\" per rinominare" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "comando non riuscito: \"%s %s %s\", %s non modificato" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "errore nel rinominare %s, %s non è stato modificato" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Che fare ora? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Le opzioni sono:\n" +" (e) Modifica nuovamente il file sudoers\n" +" (x) Esce senza salvare le modifiche al file sudoers\n" +" (Q) Esce e salva le modifiche al file sudoers (pericoloso)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "impossibile avviare %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: proprietario errato (uid, gid), dovrebbe essere (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: permessi errati, dovrebbe avere modalità 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: analisi effettuata correttamente\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s occupato, riprovare" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "impossibile bloccare %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Modificare comunque? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Errore: %s:%d:%d: ciclo in %s \"%s\"" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Attenzione: %s:%d:%d: ciclo in %s \"%s\"" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Errore: %1$s:%2$d:%3$d: riferimento a \"%5$s\" %4$s, ma non definito" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Attenzione: %1$s:%2$d:%3$d: riferimento a \"%5$s\" %4$s, ma non definito" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Attenzione: %s:%d:%d: inutilizzato %s \"%s\"" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "%s - Modifica in sicurezza il file sudoers\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opzioni:\n" +" -c, --check Modalità solo verifica\n" +" -f, --file=sudoers Specifica la posizione del file sudoers\n" +" -h, --help Visualizza il messaggio di aiuto ed esce\n" +" -q, --quiet Messaggi di errore meno prolissi\n" +" -s, --strict Verifica precisa della sintassi\n" +" -V, --version Visualizza la versione ed esce\n" + +#: toke.l:179 +msgid "empty string" +msgstr "stringa vuota" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "gruppo vuoto" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "netgroup vuoto" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "continuazione riga non valida" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "indirizzo IPv6 non valido" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "interruzione riga non attesa nella stringa" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "troppi livelli di inclusioni" diff --git a/plugins/sudoers/po/ja.mo b/plugins/sudoers/po/ja.mo new file mode 100644 index 0000000..64beca7 Binary files /dev/null and b/plugins/sudoers/po/ja.mo differ diff --git a/plugins/sudoers/po/ja.po b/plugins/sudoers/po/ja.po new file mode 100644 index 0000000..401b553 --- /dev/null +++ b/plugins/sudoers/po/ja.po @@ -0,0 +1,3306 @@ +# Japanese messages for sudoers +# This file is put in the public domain. +# Yasuaki Taniguchi , 2011. +# Takeshi Hamasaki , 2012, 2015, 2016, 2017, 2018, 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-26 22:10+0900\n" +"Last-Translator: Takeshi Hamasaki \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-Basepath: sudo-1.9.3b1\n" +"X-Generator: Poedit 2.2.1\n" +"X-Poedit-SearchPath-0: .\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "構文エラー" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p のパスワード:" + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p のパスワード:" + +#: confstr.sh:4 +msgid "Password: " +msgstr "パスワード: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h のセキュリティ情報 ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "残念、また試してください。" + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "メモリ割り当てを行えませんでした" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "認証方式にはパスが必要です" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "\"CWD\" の値は '/', '~', または '*' で開始しなければいけません" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "\"CHROOT\" の値は '/', '~', または '*' で開始しなければいけません" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "構文エラー、予約語 %s がエイリアス名に使われています" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "notbefore の値が無効です" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "notafter の値が無効です" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "制限時間の値が大き過ぎます" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "時間制限値が無効です" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "内部エラー、%s がオーバーフローしました" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "標準入力を複製できません: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "%s を実行できません: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "fork できません" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "fork できません: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "パイプを開けません: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (コマンド継続中) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s が存在しますがディレクトリではありません (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "ディレクトリ %s を作成できません" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "%s のアクセス権限のモードを 0%o に変更できません" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "JSON_STRING を予期していたら、 %d でした" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "名前に二重引用符がありません" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "JSON_OBJECT を予期していたら、 %d でした" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "余分な閉じ中括弧があります" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "予期せぬところに配列" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "余分な閉じ角括弧があります" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "予期せぬところに文字列" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "名前の後にコロンがありません" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "予期せぬところに真偽値" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "予期せぬところに数値" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u \"%s\" を構文解析できません" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: 無効なログファイルのパス" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: タイムスタンプのフィールドがありません" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: タイムスタンプ %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: ユーザー名フィールドがありません" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: runasユーザー名フィールドがありません" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: runasグループ名フィールドがありません" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "タイミングファイルの読み込みエラー: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "無効なタイミングファイルの行です: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "ログは完了しているので、再開できません" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "ログを再開できません" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "%s/%s を開けません" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "I/O ログファイル %s/%s がありません。" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: 前方検索できません %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "復元ポイントが見つかりません [%lld, %ld] in %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "状態マシンエラー" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "無効な AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "AcceptMessage の解析中にエラー" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "I/O ログの作成でエラー" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "accept イベントのログ記録でエラー" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "無効な RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "RejectMessage の解析でエラー" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "reject イベントのログ記録でエラー" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "無効な AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "AlertMessage の解析中にエラー" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "alert イベントのログ記録でエラー" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "プロトコルエラーです" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "IoBuffer の書き込みでエラー" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "ChangeWindowSize の書き込みでエラー" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "CommandSuspend の書き込みでエラー" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "認識できないクライアントメッセージのタイプです" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "クライアントメッセージが大き過ぎます" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "TLS 1.2 暗号化スイートを %s に設定できません: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "TLS 1.3 暗号化スイートを %s に設定できません: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "TLS サーバーメソッドを取得できません: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "TLS コンテキストを作成できません: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "証明書 %s をロードできません" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "認証局の証明書バンドル %s をロードできません" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "プライベート鍵を読み込めません: %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "ディフィー・ヘルマン パラメーターを設定できません: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "プロトコルの最小バージョンを TLS 1.2 に設定できません: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "リモートIPアドレスを取得できません" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "ユーザーデータをSSLオブジェクトに添付することができません: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "イベントをキューに追加できません" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "接続待ちソケットを準備できません" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - sudo I/O ログをリモートサーバーに送ります\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"オプション:\n" +" -f, --file=sudoers sudoers ファイルの位置を指定する\n" +" -h, --help ヘルプメッセージを表示して終了する\n" +" -n, --no-fork フォークせずに、フォアグラウンドで実行する\n" +" -R, --random-drop 接続がドロップする確率(%)\n" +" -V, --version バージョン情報を表示して終了する\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Protobuf-C バージョン 1.3 以上が必要です" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "無効な乱数ドロップ値です: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s バージョン %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS がサポートされていません" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: 完全修飾パスではありません" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d 対応しない '[': %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d 無効な config セクション: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d 無効な設定の行: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d セクション名が必要です: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "%s には無効な値: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d 未知の鍵: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "未知の syslog ファシリティ %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "未知の syslog プライオリティ %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"オプション:\n" +" --help ヘルプメッセージを表示して終了する\n" +" -A, --accept 受け取りイベントのみを送る (I/O なし)\n" +" -h, --host ログの送り先とするホスト\n" +" -i, --iolog_id 復元するI/O ログのリモート ID \n" +" -p, --port ホストに接続するのに使用するポート\n" +" -r, --restart 以前の I/O ログ転送を再開する\n" +" -R, --reject 与えられた理由によりコマンドを拒否する\n" +" -b, --ca-bundle サーバーの証明書を検証するために突き合わせる証明書バンドルファイル\n" +" -c, --cert TLSハンドシェイクのための証明書ファイル\n" +" -k, --key 秘密鍵ファイル\n" +" -n, --no-verify サーバーの証明書を検証しない\n" +" -t, --test 選んだ I/O ログを n 重に並列送信することで監査サーバーを試験する\n" +" -V, --version バージョン情報を表示して終了する\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "警告: %s:%s を参照できません: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "サーバーのIPアドレスを取得できません" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "%s/%s から読み込むことができません: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "クライアントメッセージが大き過ぎます: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: 書き込みバッファは使用中です" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "予期しない I/O イベント %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: 予期しない状態 %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "無効な ServerHello です" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "サーバからエラーメッセージを受け取りました: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "サーバから中断メッセージを受け取りました: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "ServerMessage を展開できません" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: 予期しない type_case の値 %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "サーバーからの読み込みがタイムアウト" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "早すぎるファイル終端 (EOF)" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "サーバーメッセージが大き過ぎます: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "サーバーへの書き込みがタイムアウト" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "TLS ハンドシェイクでタイムアウトが発生" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "イベントを設定できません" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "TLS接続に失敗しました: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "SSL コンテキストを初期化できません: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "SSLオブジェクトを割り当てることができません: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "ソケットをSSLオブジェクトに取り付けることができません: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "再開するポイントとIOログIDを指定する必要があります" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "I/Oが送られない場合は再開するポイントを設定できません" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "ステータス %d で予期せぬ終了をしました" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "サーバーに送られた経過時間 [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "サーバーから受け取ったコミットポイント [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "別名 \"%s\" はすでに定義されています" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "時刻を取得できません" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "%s のパスワードを変更できません" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "ユーザー%s のログインクラスを得ることができません" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "BSD 認証を開始できません" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "無効な認証タイプです" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "BSD 認証を開始できません" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "あなたのアカウントの有効期限が切れています" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "認証に失敗しました" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "fwtk 設定を読み込めません" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "認証サーバーに接続できません" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "認証サーバーへの接続が失われました" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"認証サーバーエラーです:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: プリンシパルを文字列('%s')に変換できません: %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: '%s' を構文解析できません: %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: 資格情報キャッシュ を解決できません: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: オプションを設定できません: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: 資格情報を取得できません: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: 資格情報キャッシュ を初期化できません: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: 資格情報をキャッシュできません: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: ホストプリンシパルを取得できません: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT を検証できません! おそらく攻撃です!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "PAM を初期化できません: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM 認証エラーです: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "アカウントの有効性検証に失敗しました。あなたのアカウントはロックされていませんか?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "アカウントまたはパスワードが期限切れです。パスワードをリセットして再試行してください" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "期限の切れたパスワードを変更できません: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "パスワードが期限切れです。システム管理者に連絡してください" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "アカウントの期限切れ、または sudo 用の PAM 設定に \"account\" セクションがありません。システム管理者に連絡してください" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM アカウント管理エラーです: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "あなたは %s データベース内に存在しません" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "ACE API ライブラリの初期化に失敗しました" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "SecurID サーバーに接続できません" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "SecurID 認証のユーザーIDがロックされています" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "SecurID 用のユーザー名の長さが無効です" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "SecurID 用の認証ハンドルが無効です" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "SecurID 通信に失敗しました" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "不明な SecurID エラーです" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "SecurID 用のパスコード長が無効です" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "SIA セッションを初期化できません" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "無効な認証方法" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "無効な認証方法が sudo のコンパイル時に組み込まれています! スタンドアローンと非スタンドアローン認証を混在させてはいけません。" + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "認証方法がありません" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "認証方法が sudo のコンパイル時に組み込まれていません! 認証を無効にする場合には、configure オプションで --disable-authentication を指定してください。" + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "認証方法を初期化できません。" + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "認証方法:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "監査条件を決定できませんでした" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "監査レコードをコミットできません" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"あなたはシステム管理者から通常の講習を受けたはずです。\n" +"これは通常、以下の3点に要約されます:\n" +"\n" +" #1) 他人のプライバシーを尊重すること。\n" +" #2) タイプする前に考えること。\n" +" #3) 大いなる力には大いなる責任が伴うこと。\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "不明なユーザーID (uid) です: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "不明なユーザーです: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "order の増分: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "開始の order: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "order の増分: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s 文法バージョン %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "サポートされてない入力形式です %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "サポートされてない出力形式です %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: 入力ファイルと出力ファイルは別である必要があります" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "sudoers のデフォルト値を初期化できません" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: 不明なキーワードです: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "無効なデフォルトの指定です: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "無効な抑制の指定です: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "無効なフィルターです: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "%s を開けません" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "%s ファイルの構文解析に失敗しました。不明なエラーです" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "%s 内 %d 行付近で構文解析エラーが発生しました\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "%s 内で構文解析エラーが発生しました\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "%s へ書き込むことができません" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - sudoers ファイル形式間での変換を行う\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"オプション:\n" +" -b, --base=dn sudo の LDAP クエリ のベース DN\n" +" -c, --config=conf_file 設定ファイルへのパス\n" +" -d, --defaults=deftypes 指定した形式の Defaults のみを変換する\n" +" -e, --expand-aliases 変換する時にエイリアスを展開する\n" +" -f, --output-format=format 出力の書式: JSON, LDIF または sudoers\n" +" -i, --input-format=format 入力の書式: LDIF または sudoers\n" +" -I, --increment=num それぞれの sudoOrder の増分\n" +" -h, --help ヘルプメッセージを表示して終了する\n" +" -m, --match=filter filter にマッチするエントリのみを変換する\n" +" -M, --match-local フィルタは passwd および group データベースを使用する\n" +" -o, --output=output_file 変換された sudoers を output_file に出力する\n" +" -O, --order-start=num 最初の sudoOrder の開始点\n" +" -p, --prune-matches マッチしないユーザー、グループ、ホストを取り除く\n" +" -P, --padding=num base padding for sudoOrder の増分\n" +" -s, --suppress=sections いくつかのセクションの出力を抑制する\n" +" -V, --version バージョン情報を表示して終了する" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "不明なデフォルト項目 \"%s\" です" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "GMT 時刻を取得できません" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "タイムスタンプを書式整形できません" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "sudoers の項目が多すぎます、最大は %u です。" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "SUDOERS_BASE 環境変数が設定されておらず -b オプションも指定されていません。" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "ログ記録時に syslog を使用する場合の syslog ファシリティ: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "ログ記録時に syslog を使用する場合の syslog プライオリティ: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "ユーザー認証に失敗したと時に使用される syslog プライオリティ: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "ワンタイムパスワード入力要求をそれのみの行に表示します" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "$PATH 内にある '.' を無視します" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "sudo を実行した時に、常にメールを送信します" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "ユーザー認証に失敗した場合にメールを送信します" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "ユーザー他 sudoers 内に存在しない場合にメールを送信します" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "ユーザーがこのホスト用の sudoers 内に存在しない場合にメールを送信します" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "ユーザーが許可されていないコマンドを実行しようとした場合にメールを送信します" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "ユーザーがマンドを実行しようとした場合にメールを送信します" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "ユーザー/tty の組み合わせごとに分離したタイムスタンプを使用します" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "ユーザーが最初に sudo を実行した時に講義を行う" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "sudo の講義が含まれているファイル: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "デフォルトでユーザーが認証されていることを必要とします" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "root が sudo を実行するかもしれません" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr " ログファイル (syslog 以外) に記録する時にホスト名を含めます" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "ログファイル (syslog 以外) に記録する時に年情報を含めます" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "sudo を引数無しで起動した場合、シェルを開始します" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "シェルを -s で開始した時に $HOME を変更後のユーザーのホームディレクトリに設定します" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "$HOME を常に変更後のユーザーのホームディレクトリに設定します" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "役に立つエラーメッセージを表示するためにいくつかの情報を収集することを許可します" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "sudoers ファイルに完全修飾ホスト名 (FQDN) を要求します" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "間違ったパスワードを入力した時にユーザーを侮辱します" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "tty がある場合のみ sudo の実行を許可します" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "visudo が EDITOR 環境変数を尊重して使用します" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "ユーザーのパスワードではなく、root のパスワードの入力を要求します" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "ユーザーのパスワードではなく、 runas_default ユーザーのパスワードの入力を要求します" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "現在のユーザーのパスワードではなく、変更先ユーザーのパスワードの入力を要求します" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "変更先ユーザーのログインクラスのデフォルトが存在する場合は、デフォルトを適用します" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "LOGNAME および USER 環境変数を設定します" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "実効ユーザーIDのみ変更先ユーザーの UID に設定し、実ユーザーIDは変更しない" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "グループベクトルを変更先ユーザーの値で初期化しない" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "ログファイルの行頭から改行までの長さ (0 の場合は改行しない): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "認証タイムスタンプのタイムアウト値: %.1f 分" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "パスワード入力要求のタイムアウト値: %.1f 分" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "パスワード入力の試行回数: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "使用する umask 値 (0777 の場合はユーザーの設定値を使用します): 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "ログファイルのパス: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "メールプログラムのパス: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "メールプログラムの引数フラグ: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "メールの送信先アドレス: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "メールの送信元アドレス: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "メールの件名 (Subject) 行: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "パスワードを間違った時のメッセージ: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "受講状況ディレクトリのパス: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "認証タイムスタンプディレクトリのパス: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "認証タイムスタンプディレクトリの所有者: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "パスワード入力と PATH の要求が免除されるグループに属するユーザー: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "パスワード入力要求時に表示される文字列: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "設定した場合、すべての場合において passprompt がシステムの入力要求表示を上書きします" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "コマンドを実行するデフォルトの変更先ユーザー: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "ユーザーの $PATH を上書きする時の値: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "visudo で使用されるエディターのパス: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "'list' 疑似コマンド使用するためにパスワードを要求される時: %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "'verify' 疑似コマンドを使用するためにパスワードを要求される時: %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "exec 関数群を置き換える sudo_noexec ライブラリ事前ロードします" + +# do はたぶん強調の do +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "LDAP ディレクトリが実行中の場合、ローカルの sudoers ファイルを無視します" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "%d 以上の値をもつファイル記述子をコマンド実行前に閉じます" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "設定しても、ユーザーが \"closefrom\" の値を -C オプションで上書きするかもしれません" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "ユーザーが任意の環境変数を設定することを許可します" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "環境変数の集合をデフォルトに設定します" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "安全性の確認を行う環境変数:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "削除する環境変数:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "保護する環境変数:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "新しいセキュリティコンテキスト内で使用する SELinux の役割: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "新しいセキュリティコンテキスト内で使用する SELinux のタイプ: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "sudo 固有の環境ファイルのパス: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "制限付きsudo 固有の環境ファイルのパス: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "sudoers を構文解析する時に使用するロケール: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "パスワードが表示されてしまう状態であっても sudo がパスワード入力を要求することを許可します" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "パスワード入力要求でユーザーの入力があった時に、視覚的なフィードバックを提供します" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "ファイルシステムにアクセスしないがより正確では無い、素早い一致確認処理を行います" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "sudoers で指定した umask 値でユーザーの umask 値を上書きします (ユーザーの umask 値より緩い場合でも)" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "コマンドを実行した時のユーザー入力をログに記録します" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "コマンドを実行した時の出力をログに記録します" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "I/O ログを zlib を使用して圧縮します" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "常に疑似 tty 内でコマンドを実行します" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "UNIX 以外のグループをサポートするためのプラグインです:%s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "入出力 (I/O) ログを保存するディレクトリです:%s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "入出力 (I/O) ログを保存するファイルです:%s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "pty を割り当てた時に utmp/utmpx ファイルに記録を加えます" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "utmp に記録するユーザーを、実行したユーザーではなく、変更後のユーザーにします" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "許容される権限の集合: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "制限される権限の集合: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "コマンドを pty でバックグラウンドで実行する" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "利用する PAM サービス名: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "ログインシェルで利用する PAM サービス名: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "ターゲットユーザーの PAM 資格情報による認証を試みる" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "実行するコマンドのために新しい PAM セッションを生成する" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "PAM アカウント検証管理を実行しています" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "I/O ログシーケンス番号の最大値: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "sudoers のネットグループサポートを有効にする" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "ファイルを sudoedit で編集するときに親ディレクトリが書き込み可能か確かめる" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "ファイルを sudoedit で編集するときにシンボリックリンクを追う" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "不明なシステムグループについて、グループプラグインに問い合わせる" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "ネットグループについて、すべてのタプル(ユーザー、ホスト、ドメイン)を基に判定する" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "監査ログファイルへの書き込みができなくても、コマンドの実行を許可する" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "I/O ログファイルへの書き込みができなくても、コマンドの実行を許可する" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "ログファイルへの書き込みができなくても、コマンドの実行を許可する" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "グループの照合を sudoers の中で行い、グループ名でなくグループIDを用いる" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "ログエントリーがこの値より長くなると、複数の syslog メッセージに分割されます: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "I/O ログの所有者となるユーザー: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "I/O ログの所有者となるグループ: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "I/O ログのファイルモード: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "コマンドの実行時にパスでなくファイル記述子を使う: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "sudoers の中の未知の Defaults エントリーを無視し、警告を出さない" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "コマンドが中断されるまでの経過時間を秒で指定する: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "ユーザーがコマンド実行の制限時間をコマンドラインで指定できるようにする" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "I/O ログのデータをバッファせずに、即ディスクにフラッシュする" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "syslog へのログ記録時にプロセスIDを含める" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "認証タイムスタンプのタイプ: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "認証失敗メッセージ: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "ユーザー名の検索で大文字小文字を同一視する" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "グループ名の検索で大文字小文字を同一視する" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "コマンドが sudoers で許可された場合にログに記録します" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "コマンドが sudoers で拒否された場合にログに記録します" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "オプショナルなポートで接続する Sudo ログサーバー" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Sudo ログサーバーのタイムアウト、単位は秒: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "ログサーバーに接続したソケットで SO_KEEPALIVE ソケットオプションを有効にする" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "認証サーバーの CA バンドルファイルのパス: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "sudoers の証明書ファイルのパス: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "sudoers のプライベート鍵ファイルのパス: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "ログサーバーの証明書が有効か検証する" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "未知の runas ユーザーおよび/またはグループ ID を使うことを許可する" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "有効なシェルを持つユーザーのみにコマンド実行を許可する" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "PAMのリモートユーザーを sudo を実行しているユーザーに設定" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "PAMのリモートホストをローカルホスト名に設定" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "コマンド実行前に変更する作業ディレクトリ: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "コマンド実行前に変更するルートディレクトリ: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "生成するログの書式: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: 未知のデフォルト項目 \"%s\" です" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: 未知のデフォルト項目 \"%s\" です" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: \"%s\" に値が指定されていません" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: \"%s\" に値が指定されていません" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: オプション \"%s\" は値をとりません" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: オプション \"%s\" は値をとりません" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: 0x%x はオプション \"%s\" のデフォルトタイプとして無効です" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: 0x%x はオプション \"%s\" のデフォルトタイプとして無効です" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: \"%s\" はオプション \"%s\" の値としては無効です" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: \"%s\" はオプション \"%s\" の値としては無効です" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: \"%s\" の値は '/', '~', または '*' で開始しなければいけません" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: \"%s\" の値は '/', '~', または '*' で開始しなければいけません" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: \"%s\" の値は '/' で開始しなければいけません" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: \"%s\" の値は '/' で開始しなければいけません" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp が破損しています。長さが合いません" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "環境を再構築できません" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "残念ですが、あなたは次の環境変数を設定することを許可されていません: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "%s 内 %d 行付近で構文解析エラーが発生しました" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "%s 内で構文解析エラーが発生しました" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "サポートされてない 認証方式 %d です: %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: 読み込みエラー" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s の所有者は uid %d でなければいけません" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s は所有者のみ書き込み可能でなければいけません" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "%s をロードできません: %su" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "%s 内にシンボル \"group_plugin\" がありません" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: 互換性のないグループプラグインメジャーバージョン %d です。予期されるのは %d です" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "IPアドレス \"%s\" を解析できません" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "ネットマスク \"%s\" を解析できません" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "ローカル IP アドレスとネットマスクの組:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "不明なグループです: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "シーケンスファイルを更新できません" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "%s へ I/O ログを書き込むことができません" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "%s/%s を作成できません" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: 内部エラー、I/O イベント %d のログファイルを開けません" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "時刻を読み込むことができません" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: 内部エラー、無効なシグナル %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls は ldaps を使用時にはサポートされていません" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "SSL 証明書と鍵データベースを初期化できません: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "SSL を使用するためには %s の中の TLS_CERT を設定する必要があります" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "LDAP を初期化できません: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls が指定されていますが、LDAP ライブラリが ldap_start_tls_s() または ldap_start_tls_s_np() をサポートしていません" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "無効な sudoOrder 属性です: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: ポートが大き過ぎます" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "サポートされてない LDAP URI タイプです: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ldap と ldaps の URI を混ぜて使用できません" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "sudoOption を変換できません: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "監査システムを開くことができません" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "監査メッセージを送ることができません" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "イベントループでエラーが発生しました" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "新しい SSL_CTX オブジェクトの作成に失敗しました: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "%s:%s へのTLS接続に失敗しました: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "TLS 初期化が成功しませんでした" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "TLS ハンドシェイクが成功しませんでした" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: 内部エラー、無効な終了コード %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "ログサーバーへの接続が失われました" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "書き込みバッファが失われました" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "ログサーバーに接続できません" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "ユーザーが sudoers 内にありません" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "ホスト上でユーザーが認証されていません" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "コマンドが許可されていません" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s は sudoers ファイル内にありません。この事象は記録・報告されます。\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s は %s 上で sudo を実行することを許可されていません。この事象は記録・報告されます。\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "残念ですが、ユーザー %s は %s 上で sudo を実行できません。\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "残念ですが、ユーザー %s は'%s%s%s' を %s%s%s として %s 上で実行することは許可されていません。\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: コマンドが見つかりません" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"'.' 内で見つかった \"%1$s\" を無視します\n" +"この \"%3$s\" を実行したい場合は \"sudo ./%2$s\" を使用してください。" + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u 回パスワード試行を間違えました" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "認証失敗" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "パスワードが必要です" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "ログファイルを開けません: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "%s へログを書き込むことができません" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "%s (%s) の認証方式は %s 形式ではありません" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP 役割: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"sudoers 項目:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " オプション: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " コマンド:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "既定値のエントリと照合中 (ユーザー名 %s) (ホスト名 %s):\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "ユーザー %s 用の Runas およびコマンド特有のデフォルト:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "ユーザー %s は %s 上で コマンドを実行できます\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "ユーザー %s は %s 上で sudo を実行することを許可されていません。\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "不完全な sudoRole: cn: %s を無視します" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "無効な LDIF 属性です: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "無効な %.*s が sudo のフロントエンドで設定されています" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "ネットワークのアドレスリストを解析できません" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "ユーザー名が sudo のフロントエンドで設定されていません" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "ユーザーIDが sudo のフロントエンドで設定されていません" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "グループIDが sudo のフロントエンドで設定されていません" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "ホスト名が sudo のフロントエンドで設定されていません" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "無効な作業ディレクトリ: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "無効な chroot ディレクトリ: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "%s を実行できません" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "sudoers ポリシープラグイン バージョン %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "sudoers ファイル文法バージョン %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"sudoers のパス: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch のパス: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf のパス: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret のパス: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "タイプ %d のフックを登録できません (バージョン %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "ユーザーID %u をキャッシュできません" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "ユーザーID %u をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "ユーザー %s をキャッシュできません" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "ユーザー %s をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "グループID %u をキャッシュできません" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "グループID %u をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "グループ %s をキャッシュできません" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "グループ %s をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "グループリスト %s をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "グループリスト %s をキャッシュできません" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "%s のグループを解析できません" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "%s のグループIDを解析できません" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "perm スタックがオーバーフローしました" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "perm スタックがアンダーフローしました" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "root のグループIDへ変更できません" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "実行するためのグループIDに変更できません" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "グループベクトルを実行するためのものに変更できません" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "実行するためのユーザーIDに変更できません" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "sudoers のグループIDへ変更できません" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "プロセスが多すぎます" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "カレントディレクトリを取得できません" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "検証の対象とする長さを切り詰めました user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "検証の対象とする長さを切り詰めました argv[0]: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "SSS のソースを初期化できません。SSSD はあなたのマシンにインストールされていますか?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "シンボル \"%s\" が %s 内にありません" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "デフォルト項目で問題が発生しました" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "有効な sudoers のソースが見つかりません。終了します" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "ユーザーはルートディレクトリを %s に変更できません" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "-R オプションを %s と共に使用することは許可されていません" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "ユーザーはディレクトリを %s に変更できません" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "-D オプションを %s と共に使用することは許可されていません" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers の指定により root が sudo を使用することは禁止されています" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "ユーザーが closefrom 制限をオーバーライドすることは許されていません" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "-C オプションを使用することは許可されていません" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "タイムスタンプの所有者 (%s): そのようなユーザーはありません" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "tty がありません" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "残念ですが、sudo を実行するには tty が必要です" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "ユーザー %s には無効な シェル: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "コマンドがカレントディレクトリにあります" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "ユーザーはコマンド実行の制限時間を設定することを許可されていません" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "残念ですが、あなたはコマンド実行の制限時間を設定することを許可されていません" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "ユーザーは環境変数を保存することを許可されていません" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "残念ですが、あなたは環境変数を保存することを許可されていません" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "コマンド名が長すぎます" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit の実行に sudo を使用する必要はありません" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "%s を読み込めません" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "%s の状態取得 (stat) ができません" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s は通常ファイルではありません" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s はユーザーID %u によって所有されています。これは %u であるべきです" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s は誰でも書き込み可能です" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s のグループIDは %u になっています。これは %u であるべきです" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "root のみ \"-c %s\" を使用できます" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "不明なログインクラスです: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "ホスト %s の名前解決ができません" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "無効なフィルターオプションです: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "無効な最大待機時間です: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "無効な speed_factor の値です: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/タイミング: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "再生する sudo セッション: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "tty を raw モードに設定できません" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "警告: ログをきちんとリプレイするには端末が小さすぎます。\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "ログの大きさは %d x %d で、端末の大きさは %d x %d です。" + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "再生が終了しました、何かキーを押すと端末を回復します。" + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "曖昧な式 \"%s です\"" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "式内で ')' が不一致です" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "不明な検索語 \"%s\" です" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s は引数が必要です" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "無効な正規表現です: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "日付 \"%s\" を構文解析できませんでした" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "式内で '(' が不一致です" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "末尾に \"or\" を配置できません" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "末尾に \"!\" を配置できません" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "未知の検索タイプ %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "使用法: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "使用法: %s [-h] [-d dir] -l [search expression]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - sudo セッションログをリプレイします\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"オプション:\n" +" -d, --directory=dir セッションログのディレクトリを指定する\n" +" -f, --filter=filter 表示する I/O タイプを指定する\n" +" -h, --help ヘルプメッセージを表示して終了する\n" +" -l, --list[=expr] 使用可能なセッションIDを一覧表示する、オプションで条件 expr を指定可能\n" +" -m, --max-wait=num イベント間の待ち時間の最大秒数を指定する\n" +" -n, --non-interactive プロンプトなしで、セッションは標準出力に送られます\n" +" -R, --no-resize 端末の大きさを変更しようとしない\n" +" -S, --suspend-wait コマンドがサスペンドされている間、待機する\n" +" -s, --speed=num 出力速度を速くする、または遅くする\n" +" -V, --version バージョン情報を表示して終了する" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\tホストが一致しません" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"コマンドが許可されました" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"コマンドが拒否されました" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"コマンドが一致しませんでした" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s はグループのメンバーによる書き込みが可能です" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "タイムスタンプファイルを %lld バイトに切り詰めることができません" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "未来の時刻のタイムスタンプを無視します" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "タイムスタンプが遠すぎる将来になっています: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "タイムスタンプファイル %s をロックすることができません" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "受講状況格納パスが長すぎます: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit はパスなしで設定するべきです" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "-x オプションは将来のリリースでは削除されます" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "cvtsudoers ユーティリティーを代わりに使用することを検討してください" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "%s を編集するためにリターンを押してください: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "指定したエディター (%s) が存在しません" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "エディターが見つかりません (エディターのパス = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "書き込みエラーです" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "一時ファイル (%s) の状態取得 (stat) ができません。%s は変更されません" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "一時ファイル (%s) の大きさが 0 です。%s は変更されません" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "エディター (%s) が異常終了しました。%s は変更されません" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s は変更されません" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "一時ファイル (%s) を再度開くことができません。%s は変更されません。" + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "一時ファイル (%s) の構文解析ができません。不明なエラーです" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "内部エラー、リスト内に %s が見つかりません!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "%s の (ユーザーID, グループID) を (%u, %u) に設定できません" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s と %s は同じファイルシステム上にありません。名前を変更するために mv を使用しています" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "コマンドの失敗です: '%s %s %s'。%s は変更されません" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "%s の名前変更に失敗しました。%s は変更されません" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "次は何でしょうか? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"オプション:\n" +" e -- sudoers ファイルを再度編集します\n" +" x -- sudoers ファイルへの変更を保存せずに終了します\n" +" Q -- sudoers ファイルへの変更を保存して終了します (*危険です!*)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "%s を実行できません" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: 所有権に誤りがあります。(ユーザーID, グループID) は (%u, %u) であるべきです\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: アクセス権限に誤りがあります。モードは 0%o であるべきです\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: 正しく構文解析されました\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s がビジー状態です。後で再試行してください" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "%s をロックできません" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "それでも編集しますか? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "エラー: %s:%d:%d: %s \"%s\" でエイリアス定義が循環しています" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "警告: %s:%d:%d: %s \"%s\" でエイリアス定義が循環しています" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "エラー: %s:%d:%d: %s \"%s\" は参照されているのに定義されていません" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "警告: %s:%d:%d: %s \"%s\" は参照されているのに定義されていません" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "警告: %s:%d:%d: エイリアス %s \"%s\" は使用されていません" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sudoers ファイルを安全に編集する\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"オプション:\n" +" -c, --check 検査のみを行う\n" +" -f, --file=sudoers sudoers ファイルの位置を指定する\n" +" -h, --help ヘルプメッセージを表示して終了する\n" +" -q, --quiet 文法エラーメッセージをより少なく (静かに) する\n" +" -s, --strict 厳密な文法検査を行う\n" +" -V, --version バージョン情報を表示して終了する\n" + +#: toke.l:179 +msgid "empty string" +msgstr "空の文字列" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "空のグループ" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "空のネットグループ" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "無効な行の継続" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "無効な IPv6 アドレス" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "文字列の予期せぬところに改行" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "インクルードの階層が大きすぎます" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "sudo_noexec ライブラリに含まれるダミーの exec 関数群を事前ロードします" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "ログファイルをロックできません: %s" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports: ポートが大きすぎます" + +#~ msgid "No user or host" +#~ msgstr "ユーザーまたはホストがありません" + +#~ msgid "validation failure" +#~ msgstr "検証に失敗しました" + +#~ msgid "audit_failure message too long" +#~ msgstr "audit_failure のメッセージが長すぎます" + +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/タイミング: %s" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "無効な属性値を無視します: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "ユーザー %s をキャッシュできません。メモリ不足です。" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "グループ %s をキャッシュできません。メモリ不足です。" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "グループリスト %s をキャッシュできません。メモリ不足です。" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP 役割: 不明\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Order: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 役割: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 役割: 不明\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "警告: 循環を発見 %s `%s'" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "警告: %s `%s' は参照されていますが定義されていません" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "警告: 使われていません %s `%s'" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "タイムスタンプのパスが長過ぎます: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "エディター (%s) の状態取得 (stat) ができません" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s (%d行付近) <<<" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "Password:" +#~ msgstr "パスワード:" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: 失敗しました" + +#~ msgid "getauid failed" +#~ msgstr "getauid に失敗しました" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: 失敗しました" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: 失敗しました" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: 失敗しました" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: 失敗しました" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: 失敗しました" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s はユーザーID (uid) %u によって所有されています。これはユーザーID %u であるべきです" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s は所有者以外でも書き込み可能 (0%o) です。アクセス権限のモードは 0700 であるべきです" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s が存在しますが通常ファイル (0%o) ではありません" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s は所有者以外でも書き込み可能 (0%o) です。アクセス権限のモードは 0600 であるべきです" + +#~ msgid "unable to remove %s (%s), will reset to the epoch" +#~ msgstr "%s (%s) を削除できません。エポックにリセットします" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "ロケールを \"%s\" に設定できません。 \"C\" を使用します" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: hostbuf を拡張中にメモリ空間が不足しました" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "ldaps と starttls を混ぜて使用できません" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: hostbuf を構築中にメモリ空間が不足しました" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 配置が一致しません" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "内部エラー: ログの行に十分な空間がありません" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " コマンド:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "ユーザーID %u (%s) をキャッシュできません。すでに存在します" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "グループID %u (%s) をキャッシュできません。すでに存在します" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "dlopen %s を行うことができません: %s" + +#~ msgid "writing to standard output" +#~ msgstr "標準出力に書き込んでいます" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "式内の小括弧のくくりが多すぎます。最大は %d です。" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: バッファオーバーフローが発生しました" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "内部エラー、expand_prompt() がオーバーフローしました" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "内部エラー、 sudo_setenv2() がオーバーフローしました" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "内部エラー、 sudo_setenv() がオーバーフローしました" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "内部エラー、linux_audit_command() がオーバーフローしました" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "内部エラー、runas_groups がオーバーフローしました" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "内部エラー、init_vars() がオーバーフローしました" + +#~ msgid "fixed mode on %s" +#~ msgstr "%s のアクセス権限のモードを修正しました" + +#~ msgid "unable to fix mode on %s" +#~ msgstr "%s のアクセス権限のモードを修正できません" + +#~ msgid "%s is mode 0%o, should be 0%o" +#~ msgstr "%s のアクセス権限のモードは 0%o です。これは 0%o であるべきです" + +#~ msgid "File containing dummy exec functions: %s" +#~ msgstr "偽の exec 関数が含まれるファイル: %s" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "SSLオブジェクトを割り当てることができません: %s\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "クライアントメッセージが大き過ぎます: %zu\n" + +#, fuzzy +#~| msgid "Send mail if the user is not in sudoers" +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "ユーザー他 sudoers 内に存在しない場合にメールを送信します" + +#, fuzzy +#~| msgid "Send mail if the user is not in sudoers" +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "ユーザー他 sudoers 内に存在しない場合にメールを送信します" + +#~ msgid "unknown address family: %d" +#~ msgstr "未知のアドレスファミリー: %d" diff --git a/plugins/sudoers/po/ko.mo b/plugins/sudoers/po/ko.mo new file mode 100644 index 0000000..3a1b32c Binary files /dev/null and b/plugins/sudoers/po/ko.mo differ diff --git a/plugins/sudoers/po/ko.po b/plugins/sudoers/po/ko.po new file mode 100644 index 0000000..04af0c5 --- /dev/null +++ b/plugins/sudoers/po/ko.po @@ -0,0 +1,3146 @@ +# Korean translation for the sudoers plugin +# This file is distributed under the same license as the sudo package. +# Todd C. Miller , 2011-2015 +# Seong-ho Cho , 2016-2020. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-12-11 01:02+0900\n" +"Last-Translator: Seong-ho Cho \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.3.1\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "문법 오류" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p의 암호: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p의 암호: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "암호: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h 보안 알림 ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "죄송합니다만, 다시 시도하십시오." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "메모리를 할당할 수 없습니다" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "다이제스트에 경로 이름이 필요합니다" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "%s: \"CWD\" 값은 '/'; '~'; '*' 문자로 시작해야합니다" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "%s: \"CHROOT\" 값은 '/'; '~'; '*' 문자로 시작해야합니다" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "문법 오류. %s 예약어를 별칭으로 썼습니다" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "잘못된 notbefore 값" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "잘못된 notafter 값" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "제한 시간 값이 너무 큽니다" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "잘못된 제한 시간 값" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "내부 오류. %s 오버플로우" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "표준 입력을 복제할 수 없습니다: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "%s을(를) 실행할 수 없습니다: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "포킹할 수 없습니다" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "포킹할 수 없습니다: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "파이프를 열 수 없습니다: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (명령 계속 실행) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s이(가) 있지만 디렉터리가 아닙니다(0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "mkdir %s 명령을 실행할 수 없습니다" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "%s 모드를 0%o 값으로 바꿀 수 없습니다" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "JSON_STRING 값을 기대했지만, %d 결과가 나왔습니다" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "이름에 이중 따옴표가 빠졌습니다" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "JSON_OBJECT 값을 기대했지만, %d 결과가 나왔습니다" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "일치하지 않는 중괄호 닫기 표시" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "예기치 않은 배열 발견" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "일치하지 않는 각괄호 닫기 표시" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "예기치 않은 문자열 값 발견" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "이름 뒤에 콜론이 빠졌습니다" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "예기치 않은 부울린 값 발견" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "예기치 않은 숫자 값 발견" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u \"%s\"을(를) 해석할 수 없습니다" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: 잘못된 로그 파일" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: 타임스탬프 필드가 빠졌습니다" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: %s 타임스탬프: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: 사용자 필드가 빠졌습니다" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: 실행 사용자 필드가 빠졌습니다" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: 실행 그룹 필드가 빠졌습니다" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "타이밍 파일 읽기 오류: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "잘못된 타이밍 파일 행: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "로그를 이미 끝냈으며, 다시 시작할 수 없습니다" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "로그를 다시 시작할 수 없습니다" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "%s/%s을(를) 열 수 없습니다" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "입출력 로그 파일 %s/%s 빠짐" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: %zu회 이전 탐색을 진행할 수 없습니다" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "%3$s/%4$s에서 재개 지점[%1$lld, %2$ld]을 찾을 수 없습니다" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "상태 머신 오류" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "잘못된 AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "AcceptMessage 해석 오류" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "입출력 로그 만드는 중 오류" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "수락 이벤트 로깅 중 오류" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "잘못된 RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "RejectMessage 해석 오류" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "거절 이벤트 로깅 중 오류" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "잘못된 AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "AlertMessage 해석 오류" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "경고 이벤트 로깅 중 오류" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "프로토콜 오류" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "입출력 버퍼 기록 중 오류" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "ChangeWindowSize 기록 중 오류" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "CommandSuspend 기록 중 오류" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "인식할 수 없는 ClientMessage 형식" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "클라이언트 메시지가 너무 깁니다" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "%s에 TLS 1.2 암호 모음을 설정할 수 없습니다: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "%s에 TLS 1.3 암호 모음을 설정할 수 없습니다: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "TLS 서버 처리 정보를 가져올 수 없습니다: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "TLS 컨텍스트를 만들 수 없습니다: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "%s 인증서를 불러올 수 없습니다" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "%s 인증서 인증 번들을 불러올 수 없습니다" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "%s 개인 키를 불러올 수 없습니다" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "디피-헬먼 매개변수를 설정할 수 없습니다: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "TLS 프로토콜 최소 버전을 1.2로 설정할 수 없습니다: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "원격 IP 주소를 가져올 수 없습니다" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "ssl 객체에 사용자 데이터를 붙일 수 없습니다: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "큐에 이벤트를 추가할 수 없습니다" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "감청 소켓을 설정할 수 없습니다" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - 원격 서버에 sudo 입출력 로그를 보냅니다\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Options:\n" +" -f, --file 설정 파일 경고\n" +" -h --help 도움말 메시지를 나타낸 후 나갑니다\n" +" -n, --no-fork 별도의 스레드를 만들지 않고, 전면에서 실행합니다\n" +" -R, --random-drop 연결을 쳐낼 백분율\n" +" -V, --version 버전 정보를 나타낸 후 나갑니다\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Protobuf-C 1.3 이상의 버전이 필요합니다" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "잘못된 임의 드롭 값: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s 버전 %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS를 지원하지 않습니다" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: 완전하지 않은 경로" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d 일치하지 않는 '[': %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d 잘못된 설정 섹션: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d 잘못된 설정 행: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d(에)서 섹션 이름이 나와야 합니다: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "잘못된 %s 값: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d 알 수 없는 키: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "알 수 없는 syslog 수단 %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "알 수 없는 syslog 우선 순위 %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"옵션:\n" +" --help 도움말 메시지를 나타낸 후 나갑니다\n" +" -A, --accept 수락 이벤트만 전송 (입출력 안 함)\n" +" -h, --host 로그 전송 대상 호스트\n" +" -i, --iolog_id 입출력 로그를 재개할 원격 ID\n" +" -p, --port 호스트 연결시 사용할 포트 번호\n" +" -r, --restart 이전 입출력 로그 전송 다시 시작\n" +" -R, --reject 주어진 조건에 대해 명령 거절\n" +" -b, --ca-bundle 서버 인증서 검증용 인증 번들 파일\n" +" -c, --cert TLS 핸드셰이크용 인증서 파일\n" +" -k, --key 개인 키 파일\n" +" -n, --no-verify 서버 인증서를 검증하지 않음\n" +" -t, --test 선택한 입출력 로그를 병렬로 n회 전송하여 감사 서버 테스트\n" +" -V, --version 버전 정보를 나타 후 나갑니다\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "%s:%s을(를) 찾을 수 없습니다: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "서버 IP 주소를 가져올 수 없습니다" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "%s/%s을(를) 읽을 수 없습니다: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "클라이언드 메시지가 너무 깁니다: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: 쓰기 버퍼를 이미 사용중입니다" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "예기치 않은 입출력 이벤트 %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: 예기치 않은 상태 번호 %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "잘못된 ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "서버로부터 오류 메시지를 받았습니다: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "서버로부터 중단 메시지를 받았습니다: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "ServerMessage를 언팩할 수 없습니다" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: 예기지 않은 type_case 값 %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "서버 데이터 읽기 시간 초과" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "갑작스러운 EOF" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "서버 메시지가 너무 깁니다: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "서버 기록 시간 초과" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "TLS 핸드셰이크 시간을 초과했습니다" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "이벤트를 설정할 수 없습니다" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "TLS 연결 실패: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "SSL 컨텍스트를 초기화할 수 없습니다: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "SSL 객체를 할당할 수 없습니다: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "SSL 객체에 소켓을 붙일 수 없습니다: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "다시 시작 지점과 입출력 로그 ID를 반드시 지정해야합니다" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "입출력을 보내지 않을 때 다시 시작 지점을 지정하지 않습니다" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "%d 상태로 갑자기 빠져나왔습니다" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "경과 시간을 서버로 보냈습니다 [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "제출 지점 정보를 서버로부터 받았습니다 [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "\"%s\" 별칭을 이미 정의했습니다" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "일시 정보를 가져올 수 없습니다" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "%s의 암호를 바꿀 수 없습니다" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "%s 사용자의 로그인 클래스를 가져올 수 없습니다" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "BSD 인증을 시작할 수 없습니다" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "잘못된 인증 형식입니다" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "BSD 인증을 초기화할 수 없습니다" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "계정 유효 기간이 지났습니다" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "승인 실패" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "fwtk 설정을 읽을 수 없습니다" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "인증 서버에 연결할 수 없습니다" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "인증 서버의 연결이 끊어졌습니다" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"인증 서버 오류:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: 본인 정보를 문자열('%s')로 변환할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: '%s'을(를) 해석할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: 자격 정보 캐시를 해석할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: 옵션을 할당할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: 자격 정보를 가져올 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: 자격 정보 캐시를 초기화할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: 캐시에 자격 정보를 저장할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: 호스트 정보를 가져올 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT를 검증할 수 없습니다! 공격 가능성이 있습니다!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "PAM을 초기화할 수 없습니다: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM 인증 오류: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "계정 검증 실패, 계정이 잠겼습니까?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "계정 또는 암호 기한이 지났습니다. 암호를 다시 설정한 후 시도하십시오" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "기한이 지난 암호를 바꿀 수 없습니다: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "암호 기한이 지났습니다. 시스템 관리자에게 문의하십시오" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "계정 기한이 지났거나 PAM 설정에 sudo에서 확인할 \"account\" 섹션이 빠졌습니다. 시스템 관리자에게 문의하십시오." + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM 계정 관리 오류: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "%s 데이터베이스에 없습니다" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "ACE API 라이브러리 초기화에 실패했습니다" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "SecurID 서버에 연결할 수 없습니다" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "SecurID 인증 과정에 사용자 ID가 잠겼습니다" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "SecurID용 사용자 이름 길이가 잘못되었습니다" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "SecurID용 인증 핸들이 잘못되었습니다" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "SecurID 통신에 실패했습니다" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "알 수 없는 SecurID 오류" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "SecurID용 암호 길이가 잘못되었습니다" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "SIA 세션을 초기화할 수 없습니다" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "잘못된 인증 방식" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "sudo에 컴파일한 인증 방식이 잘못됐습니다! 독립-비독립 인증 방식을 혼합하여 활용하면 안됩니다." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "인증 방식 없음" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "sudo에 컴파일한 인증 방식이 없습니다! 인증 기능을 끄려면 --disable-authentication 설정 옵션을 사용하십시오." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "인증 방식을 초기화할 수 없습니다." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "인증 방식:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "감사 상태를 결정할 수 없습니다" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "감사 레코드를 제출할 수 없습니다" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"로컬 시스템 관리자에게 일반적인 지침을 받았으리라 믿습니다.\n" +"보통 세가지로 요약합니다:\n" +"\n" +" #1) 타인의 사생활을 존중하십시오.\n" +" #2) 입력하기 전에 한 번 더 생각하십시오.\n" +" #3) 막강한 힘에는 상당한 책임이 뒤따릅니다.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "알 수 없는 uid: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "알 수 없는 사용자: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "순서 증가: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "순서 시작: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "순서 패딩: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s 문법 버전 %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "지원하지 않는 %s 입력 형식" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "지원하지 않는 %s 출력 형식" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: 입출력 파일은 달라야합니다" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "sudoers 기본 값을 초기화할 수 없습니다" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: 알 수 없는 키워드: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "잘못된 기본 형식: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "잘못된 생략 형식: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "잘못된 필터: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "%s을(를) 열 수 없습니다" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "%s 파일 해석에 실패했습니다. 알 수 없는 오류." + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "%s %d번째 줄 인근 해석 오류\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "%s 해석 오류\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "%s에 기록할 수 없습니다" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - sudoers 파일 형식을 변환합니다\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"옵션:\n" +" -b, --base=dn sudo LDAP 요청문에 사용할 기본 DN값\n" +" -c, --config=<설정파일> 설정 파일 경로를 지정합니다\n" +" -d, --defaults=<기본형식> 지정 <기본형식>만 변환합니다\n" +" -e, --expand-aliases 변환시 별칭을 확장합니다.\n" +" -f, --output-format=<형식> 출력 <형식> 지정: JSON, LDIF, sudoers\n" +" -i, --input-format=<형식> 입력 <형식> 지정: LDIF, sudoers\n" +" -I, --increment=<숫자> 각 sudoOrder 증가량\n" +" -h, --help 도움말 메시지를 표시하고 빠져나갑니다\n" +" -m, --match=<필터> <필터>에 일치하는 항목만 변환합니다\n" +" -M, --match-local 일치 필터에서 passwd와 group 데이터베이스를 사용\n" +" -o, --output=<출력파일> 변환한 sudoers 정보를 <출력파일>에 기록\n" +" -O, --order-start=<숫자> sudoOrder 시작 번호\n" +" -p, --prune-matches 일치하지 않는 사용자, 그룹, 호스트는 제외합니다\n" +" -P, --padding=<숫자> sudoOrder 숫자를 증가할 기본 패딩값\n" +" -s, --suppress=<섹션> 지정 <섹션> 출력은 제외합니다\n" +" -V, --version 버전 정보를 표시하고 빠져나갑니다" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "알 수 없는 \"%s\" 기본 항목" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "GMT 시간을 가져올 수 없습니다" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "타임스탬프를 형식에 맞출 수 없습니다" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "sudoers 항목이 너무 많습니다. 최대 갯수는 %u개 입니다" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "SUDOERS_BASE 환경 변수를 설정하지 않았으며 -b 옵션을 지정하지 않았습니다." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "syslog를 기록 목적으로 활용할 때의 syslog 기능: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "사용자 인증에 성공했을 때 사용할 syslog 우선 순위: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "사용자 인증에 실패했을 때 사용할 syslog 우선 순위: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "일회용 암호 입력 프롬프트를 자체 줄에 표시" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "$PATH의 '.'은 무시합니다" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "sudo를 실행할 때 항상 메일을 보냄" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "사용자가 인증에 실패했을 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "사용자가 sudoer가 아닐 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "사용자가 이 호스트의 sudoer가 아닐 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "사용자가 명령을 실행하도록 허용하지 않았을 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "사용자가 명령 실행을 시도했을 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "각 사용자/tty에 타임스탬프를 따로 사용" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "sudo를 처음 실행할 때 사용자에게 지침 안내" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "sudo 지침 안내가 들어있는 파일: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "기본적으로 사용자 인증 필요" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "루트 사용자의 sudo 실행" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "로그(비 syslog) 파일에 호스트 이름 기록" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "로그(비 syslog) 파일에 연도 기록" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "sudo에 인자를 넣어 실행하지 않으면 셸 시작" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "-s 옵션으로 셸을 시작할 때 $HOME을 대상 사용자로 설정" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "항상 $HOME을 대상 사용자의 내 폴더로 설정" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "쓸만한 오류 메시지를 제공할 목적으로 일부 정보 수집 허용" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "sudoers 파일에 완전한 형태를 갖춘 호스트 이름 필요" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "올바르지 않은 암호를 입력했을 때 사용자 놀리기" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "tty를 보유한 사용자만 sudo 실행 허용" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "EDITOR 환경 변수 대신 visudo 사용" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "사용자 암호가 아닌 루트 암호 요구" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "사용자 암호가 아닌 runas_default 사용자 암호 요구" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "사용자 암호가 아닌 대상 사용자 암호 요구" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "대상 사용자 로그인 클래스가 있다면 기본값 적용" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "LOGNAME 및 USER 환경 변수 설정" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "실제 uid가 아닌 대상 사용자에게 유효한 uid 설정" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "대상 사용자의 그룹 벡터 초기화 안함" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "로그 파일 줄을 바꿀 줄의 한계 길이(0 값은 줄 바꿈 안함): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "인증 타임스탬프 제한 시간: %.1f분" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "암호 요구 제한시간: %.1f분" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "암호 입력 시도 횟수: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "사용자가 활용할 umask 또는 0777: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "로그 파일 경로: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "메일 프로그램 경로: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "메일 프로그램 플래그: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "메일을 보낼 주소: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "메일을 보내려는 주소: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "메일 메시지 제목 줄: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "올바르지 않은 암호 메시지: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "지침 상태 디렉터리 경로: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "인증 타임스탬프 디렉터리 경로: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "인증 타임스탬프 디렉터리 소유자: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "암호와 PATH 변수 요구를 하지 않을 이 그룹의 사용자: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "기본 암호 프롬프트: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "설정하면 모든 경우의 시스템 프롬프트 대신 이 암호 프롬프트를 사용합니다." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "명령을 실행할 기본 사용자: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "사용자의 $PATH를 대신할 값: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "visudo에서 사용할 편집기 경로: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "'list' 유사 명령 실행시 암호가 필요할 때: %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "'verify' 유사 명령 실행시 암호가 필요할 때: %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "exec 함수를 대체하는 sudo_noexec 라이브러리를 미리 불러옵니다" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "LDAP 디렉터리가 동작 중이라면 로컬 sudoers 파일을 무시합니다" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "%d보다 큰 파일 서술자는 명령을 실행하기 전에 닫습니다" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "이 값을 설정하면 -C 옵션으로 \"closefrom\" 값을 대신 사용합니다" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "사용자가 환경 변수 값을 임의대로 설정할 수 있게 합니다" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "변수 기본 설정 값으로 환경 초기화" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "안전 검사 대상 환경 변수:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "제거할 환경 변수:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "유지할 환경 변수:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "새 보안 컨텍스트에 사용할 SELinux 역할: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "새 보안 컨텍스트에 사용할 SELinux 형식: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "sudo용 환경 파일 경로: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "sudo 전용 환경 파일 경로: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "sudoers 파일을 해석할 때 사용할 로캘: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "암호가 나타나더라도 sudo에서 암호 입력 요구 허용" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "사용자 입력이 있을 때 암호 프롬프트에서 시각 반응 처리" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "덜 정확하지만 파일 시스템에 접근하지 않는 빠른 비교 검사 사용" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "sudoers에 지정한 umask 값이 관대한 권한이라 하더라도 사용자의 umask 값으로 적용" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "실행 명령에 대한 사용자 입력 기록" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "실행 명령에 대한 출력 기록" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "zlib로 입출력 로그 압축" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "항상 명령을 유사 tty에서 실행" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "비 유닉스 그룹을 지원하는 플러그인: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "입출력 로그를 저장할 디렉터리: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "입출력 로그를 저장할 파일: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "pty를 할당할 때 utmp/utmpx 파일에 항목 추가" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "utmp의 사용자를 실제 실행 사용자가 아닌 대리 실행 사용자로 설정" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "권한 허용 설정: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "권한 제한 설정: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "백그라운드의 pty에서 명령을 실행합니다" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "사용할 PAM 서비스 이름: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "로그인 셸에서 사용할 PAM 서비스 이름: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "대상 사용자의 PAM 인증 처리 시도합니다" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "실행할 명령에 새 PAM 세션을 만듭니다" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "PAM 계정 검증 관리를 수행합니다" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "최대 입출력 로그 순차 번호: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "sudoers에 네트워크 그룹 지원 활성화" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "sudoedit로 파일을 편집할 때 상위 디렉터리 기록 가능 여부 확인" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "sudoedit로 파일을 편집할 때 심볼릭 링크 따라감" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "알 수 없는 시스템 그룹에 그룹 플러그인 요청" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "user, host, domain 전체 튜플을 기반으로 네트워크 그룹 비교" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "sudo에서 감시 로그를 기록할 수 없을 경우에도 명령 실행 허용" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "sudo에서 입출력 로그를 기록할 수 없을 경우에도 명령 실행 허용" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "sudo에서 로그 파일에 기록할 수 없을 경우에도 명령 실행 허용" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "sudoers의 그룹을 해석하고 그룹 이름이 아닌 ID와 비교" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "이 값보다 큰 로그 항목은 다수의 syslog 메시지로 나눕니다: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "입출력 로그 파일을 소유할 사용자: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "입출력 로그 파일을 소유할 그룹: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "입출력 로그 파일에 사용할 파일 모드: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "경로가 아닌 파일 서술자로 명령어 실행: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "경고를 출력하는 대신 sudoers에서 알 수 없는 기본 항목을 무시" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "명령 처리가 끝난 후의 초 단위 시간: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "사용자가 명령행에서 제한 시간을 지정하도록 허용" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "입출력 로그 데이터를 버퍼링하는 대신 즉시 디스크로 플러싱" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "syslog로 로깅할 때 프로세스 ID 포함" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "인증 타임스탬프 레코드 형식: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "인증 실패 메시지: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "사용자 이름 비교시 대소문자 무시" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "그룹 이름 비교시 대소문자 무시" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "sudoers에서 명령을 허용할 때 기록" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "sudoers에서 명령을 거절할 때 기록" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "개별 포트 정보를 추가하여 연결할 sudo 로그 서버" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "초 단위 sudo 로그 서버 제한 시간: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "연결한 로그 서버 소켓에 SO_KEEPALIVE 소켓 옵션 활성화" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "감사 서버의 CA 번들 파일 경로: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "sudoers 인증 파일 경로: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "sudoers 개인 키 파일 경로: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "로그 서버 인증서 유효성 검증" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "사용자/그룹 ID로의 알 수 없는 실행 허용" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "유효한 셸에서 사용자가 명령을 실행할 경우만 허용" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "sudo를 실행하는 사용자를 PAM 원격 사용자로 설정" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "로컬 호스트 이름에 PAM 원격 사용자 설정" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "명령 실행 전 바꿀 작업 디렉터리: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "명령 실행 전 바꿀 루트 디렉터리: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "로그 기록 형식: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: 알 수 없는 \"%s\" 기본 항목" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: 알 수 없는 \"%s\" 기본 항목" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d \"%s\"에 지정한 값이 없습니다" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: \"%s\"에 지정한 값이 없습니다" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: \"%s\" 옵션에 값이 없습니다" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: \"%s\" 옵션에 값이 없습니다" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:%2$d:%3$d \"%5$s\" 옵션의 잘못된 기본 형식 0x%4$x" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s: \"%3$s\" 옵션의 잘못된 기본 형식 0x%2$x" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: \"%s\" 값은 \"%s\" 옵션에 맞지 않습니다" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: \"%s\" 값은 \"%s\" 옵션에 맞지 않습니다" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: \"%s\" 값은 '/'; '~'; '*' 문자로 시작해야합니다" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: \"%s\" 값은 '/'; '~'; '*' 문자로 시작해야합니다" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: \"%s\" 값은 '/' 문자로 시작해야합니다" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: \"%s\" 값은 '/' 문자로 시작해야합니다" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp가 깨졌습니다. 길이가 일치하지 않습니다" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "환경 구성을 다시 갖출 수 없습니다" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "죄송하지만 다음 환경 변수를 설정하도록 허가받지 않았습니다: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "%s %d번째 줄에서 해석 오류" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "%s 해석 오류" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "%2$s에서 지원하지 않는 다이제스트 형식 %1$d" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: 읽기 오류" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s은(는) %d uid가 소유해야 합니다" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s은(는) 소유자만 쓸 수 있습니다" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "%s을(를) 불러올 수 없습니다: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "%s에서 \"group_plugin\" 심볼을 찾을 수 없습니다" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: 호환되지 않는 그룹 플러그인 주 버전 %d입니다. %d이(가) 필요합니다." + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "\"%s\" IP 주소를 해석할 수 없습니다" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "\"%s\" 네트워크 마스크 주소를 해석할 수 없습니다" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "로컬 IP 주소 및 넷마스크 쌍:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "잘못된 그룹: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "시퀀스 파일을 업데이트할 수 없습니다" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "입출력 로그에 기록할 수 없습니다: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "%s/%s을(를) 만들 수 없습니다" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: 내부 오류. 이벤트 %d 번의 입출력 로그 파일을 열지 않았습니다" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "클록을 읽을 수 없습니다" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: 내부 오류. 잘못된 시그널 %d번" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "ldaps를 사용할 때 starttls를 지원하지 않습니다" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "SSL 인증서 및 키 DB를 초기화할 수 없습니다: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "SSL을 사용하려면 %s에서 TLS_CERT를 설정해야 합니다" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "LDAP를 초기화할 수 없습니다: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls를 지정했지만 LDAP 라이브러리에서 ldap_start_tls_s() 또는 ldap_start_tls_s_np() 함수를 지원하지 않습니다" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "잘못된 sudoOrder 속성: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: 포트 번호가 너무 큽니다" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "지원하지 않는 LDAP URI 형식: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ldap 및 ldaps URI를 함께 사용할 수 없습니다" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "sudoOption을 변환할 수 없습니다: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "감시 시스템을 열 수 없습니다" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "감시 메시지를 보낼 수 없습니다" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "이벤트 루프 오류" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "SSL_CTX 객체 만들기 실패: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "%s:%s로의 TLS 연결 실패: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "TLS 초기화에 실패했습니다" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "TLS 핸드셰이킹에 실패했습니다" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: 내부 오류. 잘못된 시그널 %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "로그 서버의 연결이 끊어졌습니다" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "기록 버퍼 빠짐" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "로그 서버에 연결할 수 없습니다" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "사용자가 sudoers에 없습니다" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "사용자가 호스트에서 인증하지 않았습니다" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "명령을 허용하지 않았습니다" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s은(는) sudoers 설정 파일에 없습니다. 이 시도를 보고합니다.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s은(는) %s에서 sudo를 실행하도록 허가받지 않았습니다. 이 시도를 보고합니다.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "죄송하지만, %s 사용자는 %s에서 sudo를 실행하면 안됩니다.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "죄송하지만 %1$s 사용자는 '%2$s%3$s%4$s'을(를) %8$s의 %5$s%6$s%7$s(으)로 실행하도록 허가받지 않았습니다.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: 명령이 없습니다" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"'.'에 무시 중인 \"%1$s\" 요소가 있습니다.\n" +"\"%3$s\" 명령을 실행하려면, \"sudo ./%2$s\" 명령을 사용하십시오." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "잘못된 암호 입력 시도 %u번" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "인증 실패" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "암호가 필요합니다" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "로그 파일을 열 수 없습니다: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "로그 파일에 기록할 수 없습니다: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "%s 다이제스트(%s)는 %s 형식이 아닙니다" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP 역할: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers 항목:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " 실행 사용자: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " 실행 그룹: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " 옵션: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " 명령:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "%2$s에서 %1$s에 일치하는 기본 항목:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "%s의 실행 권한 및 명령별 기본 값:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "%s 사용자는 %s에서 다음 명령을 실행해야 합니다:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "%s 사용자는 %s에서 sudo를 실행하도록 허가받지 않았습니다.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "미완결 sudoRole 무시: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "잘못된 LDIF 속성: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "sudo 프론트엔드의 %.*s 설정이 잘못되었습니다" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "네트워크 주소 목록을 해석할 수 없습니다" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "sudo 프론트엔드에서 사용자 이름을 설정하지 않았습니다" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "sudo 프론트엔드에서 사용자 ID를 설정하지 않았습니다" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "sudo 프론트엔드에서 그룹 ID를 지정하지 않았습니다" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "sudo 프론트엔드에서 호스트 이름을 설정하지 않았습니다" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "잘못된 작업 디렉터리: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "잘못된 루트 변경 디렉터리: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "%s을(를) 실행할 수 없습니다" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers 정책 플러그인 버전 %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers 파일 문법 버전 %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers 경로: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch 경로: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf 경로: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret 경로: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "%d 형식의 후크를 등록할 수 없습니다(버전 %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "%u uid를 캐시에 적재할 수 없습니다" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "%u uid를 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "%s 사용자를 캐시에 적재할 수 없습니다" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "%s 사용자를 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "%u GID를 캐시에 적재할 수 없습니다" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "%u gid를 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "%s 그룹을 캐시에 적재할 수 없습니다" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "%s 그룹을 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "%s 그룹 목록을 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "%s 그룹 목록을 캐시에 적재할 수 없습니다" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "%s 그룹을 해석할 수 없습니다" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "%s 그룹 ID를 해석할 수 없습니다" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "perm 스택 오버플로우" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "parm 스택 언더플로우" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "루트 gid로 바꿀 수 없습니다" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "실행 gid로 바꿀 수 없습니다" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "실행 그룹 벡터를 설정할 수 없습니다" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "실행 uid로 바꿀 수 없습니다" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "sudoers gid로 바꿀 수 없습니다" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "동작 중인 프로세스가 너무 많습니다" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "현재 작업 디렉터리를 가져올 수 없습니다" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "user_cmnd 감사 경로가 잘렸습니다: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "argv[0] 감사 경로가 잘렸습니다: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "SSS 소스를 초기화할 수 없습니다. 머신에 SSSD를 설치했습니까?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "%2$s에서 \"%1$s\" 심볼을 찾을 수 없습니다" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "기본 항목에 문제 발생" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "올바른 sudoers 설정 원본이 없습니다. 나갑니다." + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "%s 를 루트 디렉터리로 변환하도록 허용하지 않습니다" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "-R 옵션과 %s 옵션의 병행 사용을 허가받지 않았습니다" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "%s 디렉터리로의 변경을 허용하지 않습니다" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "-D 옵션과 %s 옵션의 병행 사용을 허가받지 않았습니다" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers에서 root가 sudo를 실행하지 못하게 지정했습니다" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "사용자가 closefrom 제한 값을 따로 적용하도록 허용하지 않았습니다" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "-C 옵션 사용을 허가받지 않았습니다" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "타임스탬프 소유자(%s): 사용자 없음" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "tty 없음" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "죄송하지만 sudo를 실행하려면 tty를 확보해야합니다" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "%s 사용자에게 잘못된 셸 제공: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "현재 디렉터리의 명령" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "사용자가 명령 처리 제한 시간을 설정하도록 허용하지 않았습니다" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "죄송하지만, 명령 처리 제한 시간을 설정할 수 없습니다" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "사용자가 환경 설정 값을 유지하도록 허용하지 않았습니다" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "죄송하지만 이 환경 상태를 유지하도록 허가받지 않았습니다" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "명령이 너무 깁니다" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit는 sudo로 실행할 필요가 없습니다" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "%s을(를) 읽을 수 없습니다" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "%s의 상태를 가져올 수 없습니다" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s은(는) 일반 파일이 아닙니다" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s은(는) %u uid가 소유했지만, %u uid가 소유해야합니다" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s에 모두가 기록할 수 있습니다" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s은(는) %u gid가 소유했지만, %u gid가 소유해야합니다" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "루트만 \"-c %s\" 옵션을 사용할 수 있습니다" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "알 수 없는 로그인 클래스: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "%s 호스트를 해석할 수 없습니다" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "잘못된 필터 옵션: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "잘못된 최대 대기 시간 값: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "잘못된 속도 인수: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "sudo 세션 재현 중: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "RAW 모드로 tty를 설정할 수 없습니다" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "경고: 터미널 화면이 로그를 올바르게 나타내기에 너무 작습니다.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "로그 화면 크기는 %d x %d 이지만, 터미널 화면 크기는 %d x %d 입니다." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "재현에 끝났습니다. 터미널을 복원하려면 아무 키나 누르십시오." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "모호한 식 \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "수식에 일치하지 않는 ')'" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "알 수 없는 검색어 \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s에 인자가 필요합니다" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "잘못된 정규 표현식: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "\"%s\" 날짜를 해석할 수 없습니다" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "수식에 일치하지 않는 '('" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "잘못된 후위 연산자 \"or\"" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "잘못된 후위 문자 \"!\"" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "알 수 없는 검색 형식 %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "사용법: %s [-hnRS] [-d <디렉터리>] [-m <숫자>] [-s <숫자>] \n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "사용법: %s [-h] [-d <디렉터리>] -l [<검색식>]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - sudo 세션 로그를 보여줍니다\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"옵션:\n" +" -d, --directory=<디렉터리> 세션 로그 디렉터리를 지정합니다\n" +" -f, --filter=<필터> 화면에 나타낼 입출력 형식을 지정합니다\n" +" -h, --help 도움말 메시지를 나타낸 후 빠져나갑니다\n" +" -l, --list 유효한 세션 ID 및 추가 표현식을 목록으로 보여줍니다\n" +" -m, --max-wait=<숫자> 이벤트 처리간 초 단위 최대 대기 시간\n" +" -n, --non-interactive 프롬프트를 표시하지 않고 세션을 표준출력으로 보냅니다\n" +" -R, --no-resize 터미널 크기 조정 시도를 하지 않습니다\n" +" -S, -suspend-wait 명령 실행을 멈추는 동안 대기합니다\n" +" -s, --speed=<숫자> 출력 속도를 올리거나 내립니다\n" +" -V, --version 버전 정보를 나타낸 후 빠져나갑니다" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\t호스트가 일치하지 않습니다" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"명령 허용함" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"명령 거부함" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"명령이 일치하지 않음" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s은(는) 그룹이 기록할 수 있습니다" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "타임스탬프 파일을 %lld 바이트로 자를 수 없습니다" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "미래 타임스탬프 값 무시" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "타임스탬프 값이 미래 값으로 너무 밀려있습니다: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "%s 타임스탬프 파일을 잠글 수 없습니다" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "지침 상태 경로가 너무 깁니다: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit에 경로를 지정하면 안됩니다" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "-x 옵션은 추후 릴리스에서 제거 예정입니다" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "cvtsudoers 유틸리티를 대신 사용해보십시오" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "%s을(를) 편집하려면 return 키를 누르십시오:" + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "지정 편집기(%s)가 없습니다" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "편집기가 없습니다(편집기 경로 = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "쓰기 오류" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "임시 파일 상태를 가져올 수 없습니다(%s). %s을(를) 바꾸지 않았습니다" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "임시 파일 길이가 0입니다(%s). %s을(를) 바꾸지 않았습니다" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "편집기(%s) 실패. %s을(를) 바꾸지 않았습니다" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s 바꾸지 않음" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "임시 파일(%s)을 다시 열 수 없습니다. %s을(를) 바꾸지 않았습니다." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "임시 파일(%s)을 해석할 수 없습니다. 알 수 없는 오류" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "내부 오류. %s을(를) 목록에서 찾을 수 없습니다!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "%s의 uid/gid를 %u/%u 값으로 설정할 수 없습니다" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s 및 %s은(는) 동일한 파일 시스템에 없습니다. mv 명령으로 이름을 바꿉니다" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "명령 실행 실패: '%s %s %s', %s을(를) 바꾸지 않았습니다" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "%s 이름 바꾸기 오류. %s을(를) 바꾸지 않았습니다" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "어떻게 하시겠습니까? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"사용할 수 있는 옵션:\n" +" sudoers 파일을 다시 편집합니다(E)\n" +" sudoers 파일을 바꾼 상태에서 저장하지 않고 나갑니다(X)\n" +" sudoers 파일을 바꾼 상태에서 저장하고 끝냅니다(Q)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "%s을(를) 실행할 수 없음" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: 잘못된 소유자 uid/gid를 %u/%u 값으로 설정해야 합니다\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: 잘못된 권한입니다. 0%o 모드 값을 설정해야 합니다\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: 해석 성공\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s을(를) 사용중입니다. 나중에 다시 시도하십시오" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "%s을(를) 잠글 수 없습니다" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "그래도 편집하시겠습니까? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "오류: %4$s \"%5$s\"의 %1$s:%2$d:%3$d: 사이클" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "경고: %4$s \"%5$s\"의 %1$s:%2$d:%3$d: 사이클" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "오류: %s:%d:%d: %s \"%s\"을(를) 참조했지만 정의하지 않았습니다" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "경고: %s:%d:%d: %s \"%s\"을(를) 참조했지만 정의하지 않았습니다" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "경고: %s:%d:%d 사용하지 않는 %s \"%s\"이(가) 있습니다" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sudoers 파일을 안전하게 편집합니다\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"옵션:\n" +" -c, --check 확인 전용 모드\n" +" -f, --file=sudoers sudoers 파일 위치 지정\n" +" -h, --help 도움말 메시지를 나타낸 후 빠져나갑니다\n" +" -q, --quiet 자세한 문법 오류 메시지를 줄입니다(없앰)\n" +" -s, --strict 엄격한 문법 검사 시행\n" +" -V, --version 버전 정보를 나타낸 후 빠져나갑니다\n" + +#: toke.l:179 +msgid "empty string" +msgstr "빈 문자열" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "빈 그룹" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "빈 네트워크 그룹" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "잘못된 행 연속 문자" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "잘못된 IPv6 주소" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "예기치 않은 개행 문자 발견" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "포함 레벨이 너무 많습니다" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "sudo_noexec 라이브러리에 있는 모조 exec 함수 미리 불러오기" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports: 포트 값이 너무 큽니다" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "로그 파일을 잠글 수 없습니다: %s" + +#~ msgid "No user or host" +#~ msgstr "사용자 또는 호스트 없음" + +#~ msgid "validation failure" +#~ msgstr "검증 실패" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "잘못된 속성 값 무시: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "%s 사용자를 캐시에 적재할 수 없습니다. 메모리가 부족합니다." + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "%s 그룹을 캐시에 적재할 수 없습니다. 메모리가 부족합니다." + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "%s 그룹 목록을 캐시에 적재할 수 없습니다. 메모리가 부족합니다." + +#~ msgid "audit_failure message too long" +#~ msgstr "audit_failure 메시지가 너무 깁니다" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP 역할: 알 수 없음\n" + +#~ msgid " Order: %s\n" +#~ msgstr " 순서: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 역할: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 역할: 알 수 없음\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "경고: %s의 사이클 `%s'" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "경고: %s `%s'을(를) 참조했지만 정의하지 않았습니다" diff --git a/plugins/sudoers/po/lt.mo b/plugins/sudoers/po/lt.mo new file mode 100644 index 0000000..1d2e70d Binary files /dev/null and b/plugins/sudoers/po/lt.mo differ diff --git a/plugins/sudoers/po/lt.po b/plugins/sudoers/po/lt.po new file mode 100644 index 0000000..8db0e29 --- /dev/null +++ b/plugins/sudoers/po/lt.po @@ -0,0 +1,1682 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# Algimantas Margevičius , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.4rc1\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2012-02-06 15:48-0500\n" +"PO-Revision-Date: 2012-02-25 11:56+0200\n" +"Last-Translator: Algimantas Margevičius \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: plugins/sudoers/alias.c:125 +#, c-format +msgid "Alias `%s' already defined" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:61 plugins/sudoers/bsm_audit.c:64 +#: plugins/sudoers/bsm_audit.c:113 plugins/sudoers/bsm_audit.c:117 +#: plugins/sudoers/bsm_audit.c:169 plugins/sudoers/bsm_audit.c:173 +msgid "getaudit: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:91 plugins/sudoers/bsm_audit.c:154 +msgid "Could not determine audit condition" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:102 +msgid "getauid failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:104 plugins/sudoers/bsm_audit.c:163 +msgid "au_open: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:119 plugins/sudoers/bsm_audit.c:175 +msgid "au_to_subject: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:179 +msgid "au_to_exec_args: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:127 plugins/sudoers/bsm_audit.c:188 +msgid "au_to_return32: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:130 plugins/sudoers/bsm_audit.c:191 +msgid "unable to commit audit record" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:161 +msgid "getauid: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:184 +msgid "au_to_text: failed" +msgstr "" + +#: plugins/sudoers/check.c:158 +#, c-format +msgid "sorry, a password is required to run %s" +msgstr "" + +#: plugins/sudoers/check.c:249 plugins/sudoers/iolog.c:172 +#: plugins/sudoers/sudoers.c:992 plugins/sudoers/sudoreplay.c:348 +#: plugins/sudoers/sudoreplay.c:357 plugins/sudoers/sudoreplay.c:703 +#: plugins/sudoers/sudoreplay.c:797 plugins/sudoers/visudo.c:790 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: plugins/sudoers/check.c:253 plugins/sudoers/iolog.c:202 +#, c-format +msgid "unable to write to %s" +msgstr "" + +#: plugins/sudoers/check.c:261 plugins/sudoers/check.c:506 +#: plugins/sudoers/check.c:556 plugins/sudoers/iolog.c:123 +#: plugins/sudoers/iolog.c:156 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/check.c:396 +#, c-format +msgid "internal error, expand_prompt() overflow" +msgstr "" + +#: plugins/sudoers/check.c:456 +#, c-format +msgid "timestamp path too long: %s" +msgstr "" + +#: plugins/sudoers/check.c:485 plugins/sudoers/check.c:529 +#: plugins/sudoers/iolog.c:158 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/check.c:488 plugins/sudoers/check.c:532 +#: plugins/sudoers/check.c:577 +#, c-format +msgid "%s owned by uid %u, should be uid %u" +msgstr "" + +#: plugins/sudoers/check.c:493 plugins/sudoers/check.c:537 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0700" +msgstr "" + +#: plugins/sudoers/check.c:501 plugins/sudoers/check.c:545 +#: plugins/sudoers/check.c:613 plugins/sudoers/sudoers.c:978 +#: plugins/sudoers/visudo.c:320 plugins/sudoers/visudo.c:582 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/check.c:571 +#, c-format +msgid "%s exists but is not a regular file (0%o)" +msgstr "" + +#: plugins/sudoers/check.c:583 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0600" +msgstr "" + +#: plugins/sudoers/check.c:637 +#, c-format +msgid "timestamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/check.c:684 +#, c-format +msgid "unable to remove %s (%s), will reset to the epoch" +msgstr "" + +#: plugins/sudoers/check.c:692 +#, c-format +msgid "unable to reset %s to the epoch" +msgstr "" + +#: plugins/sudoers/check.c:752 plugins/sudoers/check.c:758 +#: plugins/sudoers/sudoers.c:829 plugins/sudoers/sudoers.c:833 +#, c-format +msgid "unknown uid: %u" +msgstr "" + +#: plugins/sudoers/check.c:755 plugins/sudoers/sudoers.c:770 +#: plugins/sudoers/sudoers.c:1108 plugins/sudoers/testsudoers.c:218 +#: plugins/sudoers/testsudoers.c:362 +#, c-format +msgid "unknown user: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %d" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %d" +msgstr "" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +msgid "Preload the dummy exec functions contained in \"_PATH_SUDO_NOEXEC" +msgstr "" + +#: plugins/sudoers/def_data.c:247 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:251 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:323 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:327 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/defaults.c:208 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:216 plugins/sudoers/defaults.c:226 +#: plugins/sudoers/defaults.c:246 plugins/sudoers/defaults.c:259 +#: plugins/sudoers/defaults.c:272 plugins/sudoers/defaults.c:285 +#: plugins/sudoers/defaults.c:298 plugins/sudoers/defaults.c:318 +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:219 plugins/sudoers/defaults.c:229 +#: plugins/sudoers/defaults.c:237 plugins/sudoers/defaults.c:254 +#: plugins/sudoers/defaults.c:267 plugins/sudoers/defaults.c:280 +#: plugins/sudoers/defaults.c:293 plugins/sudoers/defaults.c:313 +#: plugins/sudoers/defaults.c:324 +#, c-format +msgid "no value specified for `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:242 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:304 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:258 +#, c-format +msgid "internal error, sudo_setenv() overflow" +msgstr "" + +#: plugins/sudoers/env.c:291 +#, c-format +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:710 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/find_path.c:69 plugins/sudoers/find_path.c:108 +#: plugins/sudoers/find_path.c:123 plugins/sudoers/iolog.c:125 +#: plugins/sudoers/sudoers.c:923 toke.l:668 toke.l:823 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: gram.y:110 +#, c-format +msgid ">>> %s: %s near line %d <<<" +msgstr "" + +#: plugins/sudoers/group_plugin.c:91 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: plugins/sudoers/group_plugin.c:103 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s turi priklausyti uid %d" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s turi būti įrašomas tik savininkui" + +#: plugins/sudoers/group_plugin.c:114 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:119 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:124 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:112 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:179 plugins/sudoers/sudoers.c:999 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/iolog.c:182 +#, c-format +msgid "invalid sequence number %s" +msgstr "" + +#: plugins/sudoers/iolog.c:231 plugins/sudoers/iolog.c:234 +#: plugins/sudoers/iolog.c:499 plugins/sudoers/iolog.c:504 +#: plugins/sudoers/iolog.c:510 plugins/sudoers/iolog.c:518 +#: plugins/sudoers/iolog.c:526 plugins/sudoers/iolog.c:534 +#: plugins/sudoers/iolog.c:542 +#, c-format +msgid "unable to create %s" +msgstr "" + +#: plugins/sudoers/iolog_path.c:256 plugins/sudoers/sudoers.c:362 +#, c-format +msgid "unable to set locale to \"%s\", using \"C\"" +msgstr "" + +#: plugins/sudoers/ldap.c:374 +#, c-format +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:397 +#, c-format +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:427 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:456 +#, c-format +msgid "invalid uri: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:462 +#, c-format +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:466 +#, c-format +msgid "unable to mix ldaps and starttls" +msgstr "" + +#: plugins/sudoers/ldap.c:485 +#, c-format +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:550 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:958 +#, c-format +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:964 +#, c-format +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:972 +#, c-format +msgid "unable to build time filter" +msgstr "" + +#: plugins/sudoers/ldap.c:1185 +#, c-format +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "" + +#: plugins/sudoers/ldap.c:1705 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1707 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1754 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1762 +#, c-format +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2161 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2192 +#, c-format +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:2428 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:57 +#, c-format +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:82 +#, c-format +msgid "internal error, linux_audit_command() overflow" +msgstr "" + +#: plugins/sudoers/linux_audit.c:91 +#, c-format +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/logging.c:198 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:201 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT in sudoers" +msgstr "" + +#: plugins/sudoers/logging.c:258 +msgid "user NOT authorized on host" +msgstr "" + +#: plugins/sudoers/logging.c:260 +msgid "command not allowed" +msgstr "" + +#: plugins/sudoers/logging.c:270 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nėra „sudoers“ faile. Apie šį įvykį bus pranešta.\n" + +#: plugins/sudoers/logging.c:273 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s neleidžiama vykdyti „sudo“ kompiuteryje %s. Apie šį įvykį bus pranešta.\n" + +#: plugins/sudoers/logging.c:277 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Deja, naudotojas %s negali vykdyti „sudo“ kompiuteryje %s.\n" + +#: plugins/sudoers/logging.c:280 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Deja, naudotojui %s neleidžiama vykdyti „%s%s%s“ kaip %s%s%s kompiuteryje %s.\n" + +#: plugins/sudoers/logging.c:420 +#, c-format +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:427 plugins/sudoers/logging.c:489 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:479 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:504 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:540 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/logging.c:755 +#, c-format +msgid "internal error: insufficient space for log line" +msgstr "" + +#: plugins/sudoers/parse.c:123 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:126 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:389 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:391 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:406 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:415 +#, c-format +msgid "" +" Commands:\n" +"\t" +msgstr "" + +#: plugins/sudoers/plugin_error.c:100 plugins/sudoers/plugin_error.c:105 +msgid ": " +msgstr ": " + +#: plugins/sudoers/pwutil.c:260 +#, c-format +msgid "unable to cache uid %u (%s), already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:268 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:305 plugins/sudoers/pwutil.c:314 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:655 +#, c-format +msgid "unable to cache gid %u (%s), already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:663 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:693 plugins/sudoers/pwutil.c:702 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:365 +#: plugins/sudoers/set_perms.c:601 plugins/sudoers/set_perms.c:837 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:373 +#: plugins/sudoers/set_perms.c:609 plugins/sudoers/set_perms.c:845 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:228 plugins/sudoers/set_perms.c:466 +#: plugins/sudoers/set_perms.c:706 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:236 plugins/sudoers/set_perms.c:473 +#: plugins/sudoers/set_perms.c:713 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:250 plugins/sudoers/set_perms.c:486 +#: plugins/sudoers/set_perms.c:726 +#, c-format +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:291 plugins/sudoers/set_perms.c:524 +#: plugins/sudoers/set_perms.c:764 plugins/sudoers/set_perms.c:906 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/set_perms.c:970 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:243 +#, c-format +msgid "Matching Defaults entries for %s on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:256 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:269 +#, c-format +msgid "User %s may run the following commands on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:279 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Naudotojui %s neleidžiama vykdyti „sudo“ kompiuteryje %s.\n" + +#: plugins/sudoers/sudoers.c:201 plugins/sudoers/sudoers.c:232 +#: plugins/sudoers/sudoers.c:931 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +#, c-format +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:257 +#, c-format +msgid "unable to execute %s: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:311 +#, c-format +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:318 +#, c-format +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:408 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:424 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:425 +#, c-format +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:464 +msgid "No user or host" +msgstr "" + +#: plugins/sudoers/sudoers.c:478 plugins/sudoers/sudoers.c:499 +#: plugins/sudoers/sudoers.c:500 plugins/sudoers/sudoers.c:1509 +#: plugins/sudoers/sudoers.c:1510 +#, c-format +msgid "%s: command not found" +msgstr "" + +#: plugins/sudoers/sudoers.c:480 plugins/sudoers/sudoers.c:496 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/sudoers.c:485 +msgid "validation failure" +msgstr "" + +#: plugins/sudoers/sudoers.c:495 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:507 +#, c-format +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:657 plugins/sudoers/sudoers.c:664 +#, c-format +msgid "internal error, runas_groups overflow" +msgstr "" + +#: plugins/sudoers/sudoers.c:914 +#, c-format +msgid "internal error, set_cmnd() overflow" +msgstr "" + +#: plugins/sudoers/sudoers.c:957 +#, c-format +msgid "fixed mode on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:961 +#, c-format +msgid "set group on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:964 +#, c-format +msgid "unable to set group on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:967 +#, c-format +msgid "unable to fix mode on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:980 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:982 +#, c-format +msgid "%s is mode 0%o, should be 0%o" +msgstr "" + +#: plugins/sudoers/sudoers.c:986 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s priklauso uid %u, nors turėtų %u" + +#: plugins/sudoers/sudoers.c:989 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s priklauso gid %u, nors turėtų %u" + +#: plugins/sudoers/sudoers.c:1038 +#, c-format +msgid "only root can use `-c %s'" +msgstr "„-c %s“ gali naudoti tik „root“ naudotojas" + +#: plugins/sudoers/sudoers.c:1049 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1077 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1129 plugins/sudoers/testsudoers.c:380 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1178 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1180 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1184 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1187 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1189 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1190 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:299 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:305 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:308 plugins/sudoers/visudo.c:187 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:333 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:339 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:364 +#, c-format +msgid "invalid log file %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:366 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:392 +#, c-format +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:406 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:448 +#, c-format +msgid "writing to standard output" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:480 +#, c-format +msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:529 plugins/sudoers/sudoreplay.c:554 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:571 +#, c-format +msgid "too many parenthesized expressions, max %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:582 +#, c-format +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:588 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:602 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:606 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:612 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:625 +#, c-format +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:627 +#, c-format +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:629 +#, c-format +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "invalid regex: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:976 +#, c-format +msgid "usage: %s [-h] [-d directory] [-m max_wait] [-s speed_factor] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:979 +#, c-format +msgid "usage: %s [-h] [-d directory] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:988 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:990 +msgid "" +"\n" +"Options:\n" +" -d directory specify directory for session logs\n" +" -f filter specify which I/O type to display\n" +" -h display help message and exit\n" +" -l [expression] list available session IDs that match expression\n" +" -m max_wait max number of seconds to wait between events\n" +" -s speed_factor speed up or slow down output\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:246 +#, c-format +msgid "internal error, init_vars() overflow" +msgstr "" + +#: plugins/sudoers/testsudoers.c:331 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:334 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:335 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:335 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: toke.l:672 toke.l:802 toke.l:827 toke.l:923 plugins/sudoers/toke_util.c:113 +#: plugins/sudoers/toke_util.c:167 plugins/sudoers/toke_util.c:207 +msgid "unable to allocate memory" +msgstr "" + +#: toke.l:795 +msgid "too many levels of includes" +msgstr "" + +#: plugins/sudoers/toke_util.c:218 +msgid "fill_args: buffer overflow" +msgstr "" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:221 plugins/sudoers/auth/rfc1938.c:104 +#, c-format +msgid "you do not exist in the %s database" +msgstr "" + +#: plugins/sudoers/visudo.c:253 plugins/sudoers/visudo.c:539 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:336 plugins/sudoers/visudo.c:342 +#, c-format +msgid "write error" +msgstr "" + +#: plugins/sudoers/visudo.c:424 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:429 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:435 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:458 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:484 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:494 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:532 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:584 plugins/sudoers/visudo.c:593 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:588 plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:615 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:629 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:639 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:702 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:716 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:757 +#, c-format +msgid "unable to execute %s" +msgstr "" + +#: plugins/sudoers/visudo.c:764 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:796 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:808 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:811 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:814 plugins/sudoers/visudo.c:816 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:826 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:833 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:880 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:924 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:947 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:1089 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1090 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1093 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1094 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1229 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "" + +#: plugins/sudoers/visudo.c:1286 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1288 +msgid "" +"\n" +"Options:\n" +" -c check-only mode\n" +" -f sudoers specify sudoers file location\n" +" -h display help message and exit\n" +" -q less verbose (quiet) syntax error messages\n" +" -s strict syntax checking\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:78 +#, c-format +msgid "unable to get login class for user %s" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:84 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "invalid authentication type" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:101 +msgid "unable to setup authentication" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:60 +#, c-format +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:65 +#, c-format +msgid "unable to connect to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:71 plugins/sudoers/auth/fwtk.c:95 +#: plugins/sudoers/auth/fwtk.c:128 +#, c-format +msgid "lost connection to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:75 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:117 +#, c-format +msgid "%s: unable to unparse princ ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:218 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:234 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to initialize ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:251 +#, c-format +msgid "%s: unable to store cred in ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:331 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:100 +msgid "unable to initialize PAM" +msgstr "" + +#: plugins/sudoers/auth/pam.c:144 +msgid "account validation failure, is your account locked?" +msgstr "" + +#: plugins/sudoers/auth/pam.c:148 +msgid "Account or password is expired, reset your password and try again" +msgstr "" + +#: plugins/sudoers/auth/pam.c:155 +#, c-format +msgid "pam_chauthtok: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:159 +msgid "Password expired, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:163 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:178 +#, c-format +msgid "pam_authenticate: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:306 +msgid "Password: " +msgstr "Slaptažodis: " + +#: plugins/sudoers/auth/pam.c:307 +msgid "Password:" +msgstr "Slaptažodis:" + +#: plugins/sudoers/auth/securid5.c:81 +#, c-format +msgid "failed to initialise the ACE API library" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:107 +#, c-format +msgid "unable to contact the SecurID server" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:116 +#, c-format +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:171 +#, c-format +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:176 +#, c-format +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:128 +#, c-format +msgid "SecurID communication failed" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:132 plugins/sudoers/auth/securid5.c:215 +#, c-format +msgid "unknown SecurID error" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:166 +#, c-format +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:109 +msgid "unable to initialize SIA session" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:117 +msgid "Invalid authentication methods compiled into sudo! You may mix standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:199 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:271 +#, c-format +msgid "%d incorrect password attempt" +msgid_plural "%d incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/auth/sudo_auth.c:374 +msgid "Authentication methods:" +msgstr "" diff --git a/plugins/sudoers/po/nb.mo b/plugins/sudoers/po/nb.mo new file mode 100644 index 0000000..b0d914c Binary files /dev/null and b/plugins/sudoers/po/nb.mo differ diff --git a/plugins/sudoers/po/nb.po b/plugins/sudoers/po/nb.po new file mode 100644 index 0000000..5f323cd --- /dev/null +++ b/plugins/sudoers/po/nb.po @@ -0,0 +1,2444 @@ +# Norwegian bokmål translation of sudoers. +# This file is distributed under the same license as the sudo package. +# Copyright (C) 2017 Free Software Foundation, Inc. +# Todd C. Miller , 2011-2013. +# Åka Sikrom , 2014-2020. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2020-02-02 21:12+0100\n" +"Last-Translator: Åka Sikrom \n" +"Language-Team: Norwegian Bokmaal \n" +"Language: nb\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.6\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "syntaksfeil" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "passord for %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] passord for %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Passord:" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SIKKERHETSinformasjon om %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Feil. Prøv igjen." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "klarte ikke å tildele minne" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "kontrollsummering krever at du velger et stinavn" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "ugyldig «notbefore»-verdi" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "ugyldig «notafter»-verdi" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "for langt tidsavbrudd" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "ugyldig tidsavbrudd" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias «%s» er allerede definert" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "klarte ikke å kopiere prosess" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "klarte ikke å endre passord for %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "klarte ikke å hente innloggingsklasse for brukeren %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "klarte ikke å starte bsd-autentisering" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "ugyldig autentiseringstype" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "klarte ikke å starte opp BSD-autentisering" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "kontoen din er utgått" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "godkjenning mislyktes" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "klarte ikke å lese fwtk-innstillinger" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "klarte ikke å koble til autentiseringstjener" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "tilkobling til autentiseringstjener ble brutt" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"det oppstod en feil med autentiseringstjener:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: klarte ikke å konvertere fullmaktsgiver til streng («%s»). %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: klarte ikke å tolke «%s». %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: klarte ikke å slå opp i akkreditiv-hurtiglager. %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: klarte ikke å tildele innstillinger. %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: klarte ikke å hente akkreditiver. %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: klarte ikke å starte opp akkreditiv-hurtiglager. %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: klarte ikke å lagre akkreditiv i hurtiglager. %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: klarte ikke å hente vertens fullmaktsgiver. %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Klarte ikke å bekrefte TGT! Dette kan være et tegn på at du er under angrep! %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "klarte ikke å starte opp PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Feil ved PAM-autentisering. %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "det oppstod en feil ved validering av brukerkonto. Er kontoen din sperret?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Kontoen eller passordet er utgått. Tilbakestill passordet ditt og prøv igjen" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "klarte ikke å endre et utgått passord. %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Passordet er utgått. Kontakt systemadministratoren" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Kontoen er utgått, eller PAM-innstillingene mangler en «account»-del for sudo. Kontakt systemadministratoren" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Feil med PAM-kontohåndtering: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "du finnes ikke i %s-databasen" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "klarte ikke å starte opp ACE API-biblioteket" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "klarte ikke å kontakte SecurID-tjener" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "Bruker-ID-en er sperret fra SecurID-autentisering" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "lengden på brukernavnet er ugyldig for SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "ugyldig autentiseringshåndtak for SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "Det oppstod en feil under kommunikasjon med SecurID" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "ukjent SecurID-feil" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "kodelengden er ugyldig for SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "kalrte ikke å starte opp SIA-økt" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "ugyldige autentiseringsmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Din installasjon av sudo har ugyldige autentiseringsmetoder! Du kan ikke blande selvgående og tjeneravhengige autentiseringsmetoder." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "fant ingen autentiseringsmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Din installasjon av sudo har ingen autentiseringsmetoder tilgjengelig! Bruk valget «--disable-authentication» hvis du vil skru av autentisering." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Klarte ikke å starte opp autentiseringsmetoder." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Autentiseringsmetoder:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Klarte ikke å finne revisjonsstatus" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "klarte ikke å kjøre revisjonsoppføring" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Vi går ut i fra at systemadministrator har gitt deg en\n" +"typisk moralpreken om det du gjør. Det koker som regel ned til tre ting:\n" +"\n" +" #1) Ha respekt for andres privatliv og personvern.\n" +" #2) Tenk før du skriver.\n" +" #3) Makt medfører plikt og ansvar.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "uid-en «%u» er ukjent" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "brukeren %s er ukjent" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "økning: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "begynnende rekkefølge: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "sorteringsutfylling: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s versjon %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s gramatikkversjon %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "inndata-format %s støttes ikke" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "utdata-format %s støttes ikke" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: inndata- og utdatafiler må være ulike" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "klarte ikke å laste inn standardverdier for sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: nøkkelord %s er ukjent" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "%s er en ukjent forvalgtype" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "%s er en ukjent utelatelsestype" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "%s er et ugyldig filter" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "klarte ikke å åpne %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "klarte ikke å tolke %s. Ukjent feil" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "tolkefeil i %s ved linje %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "tolkefeil i %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "klarte ikke å skrive til %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konverter mellom «sudoers»-filformater\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Valg:\n" +" -b, --base=dn base-domenenavn for sudo LDAP-forespørsler\n" +" -c, --config=fil sti til oppsettsfil\n" +" -d, --defaults=deftypes bare konverter standardverdier av valgte typer\n" +" -e, --expand-aliases utvid aliaser ved konvertering\n" +" -f, --output-format=format velg utdata-format («JSON», «LDIF» eller «sudoers»)\n" +" -i, --input-format=format velg inndata-format («LDIF» eller «sudoers»)\n" +" -I, --increment=tall mengde som hver sudoOrder skal økes med\n" +" -h, --help vis hjelpetekst og avslutt\n" +" -m, --match=filter bare konverter oppføringer som samsvarer med valgt filter\n" +" -M, --match-local filtrer på passwd- og group-databaser\n" +" -o, --output=utdatafile lagre konvertert sudoers i valgt utdatafil\n" +" -O, --order-start=num startpunkt for første sudoOrder\n" +" -p, --prune-matches fjern brukere, grupper og vertsnavn som ikke samsvarer\n" +" -P, --padding=num grunnutfylling for sudoOrder-økning\n" +" -s, --suppress=områder fjern utdata for valgte områder\n" +" -V, --version vis versjonsinfo og avslutt" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "forvalg «%s» er ukjent" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "klarte ikke å hente GMT-tid" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "klarte ikke å formatere tidsstempel" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "intern feil: %s er full" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "sudoers inneholder for mange linjer. Maksgrense er %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "miljøvariabel «SUDOERS_BASE» er tom, og «-b» er ikke valgt." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-plassering, hvis syslog brukes til loggføring: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioritet når brukeren har autentisert seg: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioritet når brukeren ikke har klart å autentisere seg: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Legg OTP-ledetekst på egen linje" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignorer «.» i $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Send alltid e-post når noen kjører sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Send e-post hvis en bruker mislykkes i å autentisere seg" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Send e-post hvis bruker ikke finnes i sudoers-fil" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Send e-post hvis brukeren ikke finnes i sudoers-fil for denne verten" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Send e-post hvis brukeren ikke har lov til å kjøre en kommando" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Send e-post hvis brukeren prøver å kjøre en kommando" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Bruk separat tidsstempel for hver kombinasjon av bruker og tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Gi brukere en moralpreken første gang de kjører sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fil som inneholder sudo-moralpreken: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Krev at brukere skal autentisere seg som standard" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Rotbruker kan kjøre sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Ta med vertsnavn i loggfil (ikke syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Ta med år i loggfil (ikke syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Start et skall hvis sudo kjøres uten argumenter" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Velg målbrukers $HOME når et skall startes med «-s»" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Bruk alltid målbrukers hjemmemappe som $HOME" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Tillat informasjonsinnhenting for å gjøre feilmeldingene nyttige" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Krev fullstendige vertsnavn i sudoers-fil" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Send brukere en fornærmelsestekst når de oppgir feil passord" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Bare tillat brukere å kjøre sudo hvis de bruker en tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo tar hensyn til miljøvariabelen EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Spør etter rotbrukers passord, i stedet for eget passord" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Spør etter passord for «runas_default» i stedet for eget passord" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Spør etter målbrukers passord, i stedet for eget passord" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Bruk standardverdier i målbrukers innloggingsklasse, hvis den finnes" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Gi verdier til miljøvariablene «LOGNAME» og «USER»" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Velg målbrukers uid som effektiv uid, i stedet for faktisk uid" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ikke last inn målbrukers gruppevektor" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Hvilken lengde linjer i loggfiler skal pakkes ned til (bruk 0 for å deaktivere pakking): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Tidsavbrudd for autentiseringstidsstempel: %.1f minutter" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Tidsavbrudd for passordetterspørsel: %.1f minutter" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Antall forsøk på å skrive inn passord: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "U-maske som skal brukes, eller 0777 for å bruke egen maske: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Sti til loggfil: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Sti til e-postprogram: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Valg for e-postprogram: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Hvilken adresse det skal sendes e-post til: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Hvilken adresse e-posten skal sendes fra: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Emnelinje i e-postmeldinger: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Melding om feil passord: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Sti til mappe for moralpreken-status: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Sti til mappe for autentiseringstidsstempel: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Eieren av mappa for autentiseringstidsstempel: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Brukerne i denne gruppa fritas fra passord- og PATH-krav: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standard passord-ledetekst: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Hvis dette er valgt, blir system-ledetekst alltid overstyrt av passord-ledetekst." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standardbruker for kjøring av kommandoer: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Verdi som overstyrer brukerspesifikk $PATH: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Filsti til tekstbehandler som visudo skal bruke: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Når pseudokommandoen «list» skal kreve passord: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Når pseudokommandoen «verify» skal kreve passord: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Last inn prøvekjøringsfunksjonene som ligger i biblioteket «sudo_noexec»" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Om lokal sudoers-fil skal ignoreres når en LDAP er aktiv" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Fildeskriptorne >= %d lukkes før en kommando blir kjørt" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Hvis dette er valgt, har brukerne mulighet til å overstyre «closefrom»-verdien med valget «-C»" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Tillat brukere å velge arbitrære miljøvariabler" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Tilbakestill brukermiljøet til et sett med standardvariabler" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Miljøvariabler som skal kontrolleres:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Miljøvariabler som skal fjernes:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Miljøvariabler som skal beholdes:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux-rolle som skal brukes i ny sikkerhetskontekst: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux-type som skal brukes i ny sikkerhetskontekst: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Sti til sudo-spesifikk miljøfil: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Sti til sudo-spesifikk miljøfil: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Regioninnstilling som skal brukes når «sudoers» tolkes: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Tillat sudo å spørre etter et passord som - hvis skrevet inn - blir synlig på skjermen" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Gi visuell respons når brukere skriver inn passord" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Bruk raskere joker-søking som er mindre presis (og som ikke søker i filsystemet)" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "U-masker som er valgt i sudoers overstyrer brukermasker, selv hvis sudoers åpner for mer tilgang enn brukermaska" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Loggfør bruker-inndata i kommandoen som kjøres" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Loggfør utskrift fra kommandoen som kjøres" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Komprimer inn- og utdatalogger ved bruk av «zlib»" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Kjør alltid kommandoer i en pseudo-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Støttetillegg for grupper som ikke er Unix-grupper: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Mappe hvor inn- og utdatalogger skal lagres: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fil hvor inn- og utdatalogger skal lagres: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Legg til en oppføring i utmp-/utmpx-fil ved tildeling av pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Kjør kommandoer som utmp-bruker, i stedet for brukeren som skriver inn kommando" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Tillatte privilegier: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Begrensningsprivilegier: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Kjør kommandoer på en pty i bakgrunnen" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "PAM-tjenestenavn som skal brukes: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-tjenestenavn som skal brukes til innloggingsskall: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Prøv å sette opp PAM-akkreditiver for målbruker" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Lag en ny PAM-økt som kommandoen kjøres i" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Håndter validering av PAM-kontoer" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Høyeste tillatte sekvensnummer i inn-/utdatalogg: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Slå på støtte for sudoers-nettgruppe" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontroller skrivetillatelse til foreldermapper ved redigering av filer med sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Følg symbolske lenker ved redigering av filer med sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Spør gruppetillegget om ukjente systemgrupper" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Kontroller nettgrupper basert på både bruker, vert og domene" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Tillat kjøring av kommandoer selv om sudo ikke klarer å skrive til revisjonslogg" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Tillat kjøring av kommandoer selv om sudo ikke klarer å skrive til I/O-logg" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Tillat kjøring av kommandoer selv om sudo ikke klarer å skrive til loggfil" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Slå opp grupper i sudoers på gruppe-ID i stedet for gruppenavn" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Loggoppføringer som er større enn dette blir delt opp i flere syslog-meldinger: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Bruker som skal eie I/O-loggfiler: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Gruppe som skal eie I/O-loggfiler: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Filmodus for I/O-loggfiler: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Kjør kommandoer med fildeskriptor i stedet for sti: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorer ukjente standardverdier i sudoers i stedet for å vise advarsel" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "TIdsavbrudd for kommando: %u sekunder" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "La bruker velge tidsavbrudd via kommandolinje" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Tøm inn- og utdata direkte til disk i stedet for å mellomlagre" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Ta med prosess-ID ved bruk av syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Type autentiseringstidsstempel: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Feilmelding ved autentisering: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignorer små/store bokstaver i brukernavn" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignorer små/store bokstaver i gruppenavn" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Loggfør kommandoer som er tillatt av sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Loggfør kommandoer som er avvist av sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s: %d «%s» er en ukjent standardoppføring" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: «%s» er en ukjent standardoppføring" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s: %d «%s» har ingen verdi" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: «%s» har ingen verdi" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d verdier av «%s» må begynne med «/»" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: verdier av «%s» må begynne med «/»" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d «%s» kan ikke ha en verdi" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: «%s» kan ikke ha en verdi" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d Defaults-type 0x%x for valget «%s» er ugyldig" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: Defaults-type 0x%x for valget «%s» er ugyldig" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d «%s» er en ugyldig verdi for valget «%s»" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: verdien «%s» er ugyldig valget «%s»" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp er korrupt (lengde samsvarer ikke)" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "klarte ikke å bygge opp miljøet på nytt" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "du har ikke tillatelse til å bestemme følgende miljøvariabler: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "tolkningsfeil i %s ved linje %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "tolkningsfeil i %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "behandlingstype %d for %s støttes ikke" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: lesefeil" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s må eies av uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s kan ikke gi skrivetillatelse til andre enn eieren" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "klarte ikke å laste inn %s. %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "fant ikke symbolet «group_plugin» i %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: versjon %d av gruppetillegget passer ikke (forventet versjon %d)" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "klarte ikke å tolke IP-adresse «%s»" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "klarte ikke å tolke nettverksmaske «%s»" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Lokale par av IP-adresser og nettverksmasker:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s finnes, men er ikke en mappe (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "klarte ikke å utføre mkdir %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "klarte ikke å endre %s modus til 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "%s er en ukjent gruppe" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "klarte ikke å lese %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "klarte ikke å opprette %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "klarte ikke å skrive til I/O-loggfil: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: intern feil. Inn-/ut-loggfil for hendelse %d er ikke åpen" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: intern feil. Signal %d er ugyldig" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ugyldig loggfil" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: tidsstempel-felt mangler" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: tidsstempel %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: brukerfelt mangler" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: «kjør som bruker»-felt mangler" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: «kjør som gruppe»-felt mangler" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls støttes ikke når du bruker ldaps" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "klarte ikke å starte opp database for SSL-sertifikater og -nøkler. %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "du må velge TLS_CERT i %s for å bruke SSL" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "klarte ikke å starte opp LDAP. %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls er valgt, men LDAP-bibliotekene støtter hverken «ldap_start_tls_s()» eller «ldap_start_tls_s_np()»" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "«%s» er en ugyldig sudoOrder-attributt" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: portnummeret er for stort" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "LDAP-ens adressetype %s støttes ikke" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "du kan ikke blande ldap- og ldaps-nettadresser" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "klarte ikke å konvertere sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "klarte ikke å åpne revisjonssystemet" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "klarte ikke å sende revisjonsmelding" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (kommando fortsetter) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "klarte ikke å åpne loggfil: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "klarte ikke å låse loggfil: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "klarte ikke å skrive loggfil: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "Ingen bruker eller vert" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "feil ved gyldighetssjekk" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "brukeren er IKKE i sudoers" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "brukeren er IKKE autorisert på verten" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "denne kommandoen tillates ikke" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s finnes ikke i sudoers-fil. Denne hendelsen blir rapportert.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s has ikke tillatelse til å kjøre sudo på %s. Denne hendelsen blir rapportert.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Brukeren %s kan ikke kjøre sudo på %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Brukeren %s har ikke tillatelse til å kjøre «%s%s%s» som %s%s%s på %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: fant ikke kommando" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignorerer «%s» i «.».\n" +"Bruk «sudo ./%s» hvis dette er «%s»-programmet du prøver å kjøre." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "feil ved autentisering" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "du må oppgi et passord" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u mislykket passordforsøk" +msgstr[1] "%u mislykkede passordforsøk" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "klarte ikke å duplisere standard innkanal. %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "klarte ikke å kjøre %s. %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "klarte ikke å kopiere prosess. %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "klarte ikke å åpne datarør. %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "behandlingen for %s (%s) er ikke i %s-skjemaet" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "klarte ikke å lage statistikk av %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-rolle: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Oppføring i sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " Kjør som-brukere: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " Kjør som-grupper: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Valg: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Kommandoer:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Standardoppføringer som gjelder for %s på %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Kjør-som- og kommandospesifikke standardoppføringer for %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Brukeren %s kan kjøre følgende kommandoer på %s:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Brukeren %s har ikke tillatelse til å kjøre sudo på %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorerer ufullstendig sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "«%s» er en ugyldig LDIF-attributt" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "ugyldig %.*s fra sudo-grenseflate" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "klarte ikke å tolke nettverksadresse-liste" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "sudo-grenseflate har ikke angitt brukernavn" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "sudo-grenseflate har ikke angitt bruker-ID" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "sudo-grenseflate har ikke valgt gruppe-ID" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "sudo-grenseflate har ikke angitt vertsnavn" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "klarte ikke å kjøre %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers regeltillegg versjon %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers-grammatikkversjon %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sti til «sudoers»-fil: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "Sti til «nsswitch»: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "Sti til «ldap.conf»: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "Stil til «ldap.secret»: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "klarte ikke å tildele krok av typen %d (versjon %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "klarte ikke å hurtiglagre uid %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "klarte ikke å hurtiglagre uid %u. Uid-en eksisterer allerede" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "klarte ikke å hurtiglagre bruker %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "klarte ikke å hurtiglagre brukeren %s. Brukeren eksisterer allerede" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "klarte ikke å hurtiglagre gid %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "klarte ikke å hurtiglagre gid %u. Gid-en eksisterer allerede" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "klarte ikke å hurtiglagre gruppe %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "klarte ikke å hurtiglagre gruppa %s. Gruppa eksisterer allerede" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "klarte ikke å hurtiglagre liste over %s. Lista eksisterer allerede" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "klarte ikke å hurtiglagre gruppeliste for %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "klarte ikke å tolke grupper for %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "klarte ikke å tolke gid-er for %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "perm-stabelen er full" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "perm-stabelen er tom" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "klarte ikke å endre gid til rotbruker" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "klarte ikke å endre til kjør som-gid" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "klarte ikke å velge «kjør som»-gruppevektor" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "klarte ikke å endre uid til «kjør som»-bruker" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "klarte ikke å endre gid til sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "for mange prosesser" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "klarte ikke å hente gjeldende arbeidsmappe" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "forkortet revisjonssti «user_cmnd»: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "forkortet revisjonssti «argv[0]»: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "audit_failure-meldinga er for lang" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "klarte ikke å starte opp SSS-kilde. Har du installert SSSD på maskinen?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "fant ikke symbolet «%s» i %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "det har oppstått et problem med én eller flere standardoppføringer" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "fant ingen gyldig sudoers-kilde. Avslutter." + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers-fil tillater ikke rotbruker å kjøre sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "du har ikke tillatelse til å bruke valget «-C»" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "eier («%s») av tidsstempel finnes ikke" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "ingen tty" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "du må ha en tty for å kunne kjøre sudo" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "kommando i gjeldende mappe" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "du har ikke tillatelse til å velge tidsavbrudd for kommandoer" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "du har ikke tillatelse til å beholde brukermiljøet" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "kommandoen er for lang" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s er ikke en vanlig fil" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s eies av uid %u, som skulle vært %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s kan overskrives av alle" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s eies av gid %u, som skulle vært %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "du må være rotbruker for å velge «-c %s»" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "innloggingsklasse %s er ukjent" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "klarte ikke å slå opp vertsnavn %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "%s er et ugyldig filtervalg" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "%s er ugyldig maksimal ventetid" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "%s er en ugyldig hastighetsfaktor" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/tidsberegning: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/tidsberegning: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/tidsberegning: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Spiller av sudo-økt i reprise: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "klarte ikke å legge hendelse i kø" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "klarte ikke å velge råmodus for tty" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Advarsel: terminalen din er for liten for å spille av loggen skikkelig.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Loggens størrelse er %d x %d, mens terminalstørrelsen din er %d x %d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Sudo-reprise ferdig. Trykk på en knapp for å gå tilbake til terminal." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "linja for tidsberegningsfil er ugyldig: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "uttrykket «%s» er flertydig" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "fant ingenting som samsvarer med deluttrykket «)»" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "«%s» er et ukjent søkevalg" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s krever at du bruker et argument" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "%s er et ugyldig regulært uttrykk" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "klarte ikke å tolke datoen «%s»" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "uttrykkets «(» samsvarer ikke" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "du kan ikke avslutte med «or»" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "du kan ikke avslutte med «!»" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "«%d» er en ukjent søketype" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "bruk: %s [-hnRS] [-d mappe] [-m tall] [-s tall] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "bruk: %s [-h] [-d dir] -l [søkeuttrykk]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - spill av sudo-øktlogg\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Valg:\n" +" -d, --directory=dir velg loggfil-mappe\n" +" -f, --filter=filter velg hvilke(n) inn- og utdatatype(r) som skal vises\n" +" -h, --help vis hjelpetekst og avslutt\n" +" -l, --list vis tilgjengelige ID-er, med valgfritt uttrykk\n" +" -m, --max-wait=num maskimal ventetid mellom hendelser (i sekunder)\n" +" -n, --non-interactive ingen ledetekst (send alt til standardutdata)\n" +" -R, --no-resize ikke prøv å endre terminalstørrelse\n" +" -S, --suspend-wait vent mens kommando er på pause\n" +" -s, --speed=num øk eller senk utskriftshastigheten\n" +" -V, --version vis versjon og avslutt" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tvert samsvarer ikke" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Kommando tillatt" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Kommandoen tillates ikke" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Kommandoen samsvarer ikke" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s kan overskrives av gruppa den tilhører" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "klarte ikke å korte ned tidsstempel-fil til %lld byte" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "klarte ikke å lese klokka" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "tidsstempel for fremtidig tidspunkt blir ignorert" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tidsstempelet er for langt inn i fremtiden: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "klarte ikke å låse tidsstempel-fil %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "filsti for moralpreken-status («%s/%s») er for lang" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "valget «-x» blir fjernet i en fremtidig versjon" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "bruk verktøyet cvtsudoers i stedet" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "trykk linjeskift for å redigere %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "finner ikke valgt redigeringsprogram (%s)" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "fant ingen redigeringsprogram («editor»-sti = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "skrivefeil" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "klarte ikke å undersøke midlertidig fil (%s). %s er ikke endret" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "midlertidig fil (%s) er tom. %s er ikke endret" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "noe gikk galt med behandleren (%s). %s er ikke endret" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s er ikke endret" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "klarte ikke å åpne midlertidig fil (%s) på nytt. %s er ikke endret" + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "klarte ikke å tolke midlertidig fil (%s). Ukjent feil" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "intern feil: fant ikke %s i lista!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "klarte ikke å endre uid og gid for %s til (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s og %s er ikke på samme filsystem. Bruker «mv» til å gi nye navn" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "kommando mislyktes. «%s %s %s». %s er ikke endret" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "klarte ikke å gi %s nytt navn. %s er ikke endret" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Hva nå? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Du har følgende valgmuligheter:\n" +" (e) rediger sudoers-fil på nytt\n" +" (x) avslutt uten å lagre endringer i sudoers-fil\n" +" (Q) avslutt og lagre endringene i sudoers-fil (FARLIG!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "klarte ikke å kjøre %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: feil eier. uid og gid skulle vært «%u, %u»\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: feil tillatelsesmodus. Skulle vært modus 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: lest og tolket OK\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s er opptatt. Prøv igjen senere" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "klarte ikke å låse %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Vil du redigere likevel [j/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Feil: %s:%d sløyfe i %s «%s»" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Advarsel: %s:%d sløyfe i %s «%s»" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Feil: %s:%d referanse til %s «%s», som ikke er definert" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Advarsel: %s:%d referanse til %s «%s», som ikke er definert" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Advarsel: %s:%d %s «%s» står ubrukt" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - rediger sudoers-fil på en trygg måte\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Valg:\n" +" -c, --check undersøkelsesmodus\n" +" -f, --file=sudoers oppgi hvor sudoers-fila ligger\n" +" -h, --help vis denne hjelpeteksten og avslutt\n" +" -q, --quiet mindre detaljerte meldinger om syntaksfeil\n" +" -s, --strict streng syntakskontroll\n" +" -V, --version vis versjon og avslutt\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "du har for mange nivåer av inkluderte filer" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "ignorerer ugyldig attributtverdi: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "klarte ikke å hurtiglagre brukeren %s. Minnet er fullt" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "klarte ikke å hurtiglagre gruppa %s. Minnet er fullt" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "klarte ikke å hurtiglagre liste over %s. Minnet er fullt" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP-role: UKJENT\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Sorter: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-rolle: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-rolle: UKJENT\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Advarsel: sløyfe i %s «%s»" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Advarsel: det refereres til %s «%s», som ikke er definert" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Advarsel: %s «%s» er ubrukt" + +#~ msgid "unable allocate memory" +#~ msgstr "klarte ikke å tildele minne" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "filstien «%s/%s» for tidsstempel er for lang" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "klarte ikke å undersøke redigeringsprogrammet (%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: ikke nok lagringsplass for å utvide vertens hurtiglager" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: ikke nok lagringsplass til å bygge opp vertens hurtiglager" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 samsvar ikke ved tildeling" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "intern feil: logglinje mangler plass" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: hurtiglageret er fullt" diff --git a/plugins/sudoers/po/nl.mo b/plugins/sudoers/po/nl.mo new file mode 100644 index 0000000..c07b4d6 Binary files /dev/null and b/plugins/sudoers/po/nl.mo differ diff --git a/plugins/sudoers/po/nl.po b/plugins/sudoers/po/nl.po new file mode 100644 index 0000000..3ea66a0 --- /dev/null +++ b/plugins/sudoers/po/nl.po @@ -0,0 +1,2282 @@ +# Dutch translation for sudoers. +# This file is distributed under the same license as the sudo package. +# P. Hamming , 2013. +# Benno Schulenberg , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.22b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-12-01 15:42-0700\n" +"PO-Revision-Date: 2017-12-05 21:44+0100\n" +"Last-Translator: Benno Schulenberg \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.0.4\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "invoerfout" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p's wachtwoord: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] wachtwoord voor %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Wachtwoord: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** VEILIGHEIDSinformatie voor %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Sorry, probeer het opnieuw." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:307 gram.y:314 gram.y:321 gram.y:328 gram.y:335 +#: gram.y:398 gram.y:406 gram.y:416 gram.y:449 gram.y:456 gram.y:463 +#: gram.y:470 gram.y:552 gram.y:559 gram.y:568 gram.y:577 gram.y:594 +#: gram.y:706 gram.y:713 gram.y:720 gram.y:728 gram.y:824 gram.y:831 +#: gram.y:838 gram.y:845 gram.y:852 gram.y:878 gram.y:885 gram.y:892 +#: gram.y:1015 gram.y:1195 gram.y:1202 plugins/sudoers/alias.c:124 +#: plugins/sudoers/alias.c:139 plugins/sudoers/auth/bsdauth.c:141 +#: plugins/sudoers/auth/kerb5.c:119 plugins/sudoers/auth/kerb5.c:145 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/defaults.c:650 +#: plugins/sudoers/defaults.c:905 plugins/sudoers/defaults.c:1076 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:93 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:120 plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:974 plugins/sudoers/ldap.c:1168 +#: plugins/sudoers/ldap.c:1179 plugins/sudoers/ldap.c:1195 +#: plugins/sudoers/ldap.c:1487 plugins/sudoers/ldap.c:1647 +#: plugins/sudoers/ldap.c:1729 plugins/sudoers/ldap.c:1877 +#: plugins/sudoers/ldap.c:1901 plugins/sudoers/ldap.c:1990 +#: plugins/sudoers/ldap.c:2005 plugins/sudoers/ldap.c:2101 +#: plugins/sudoers/ldap.c:2134 plugins/sudoers/ldap.c:2215 +#: plugins/sudoers/ldap.c:2297 plugins/sudoers/ldap.c:2394 +#: plugins/sudoers/ldap.c:3228 plugins/sudoers/ldap.c:3260 +#: plugins/sudoers/ldap.c:3572 plugins/sudoers/ldap.c:3600 +#: plugins/sudoers/ldap.c:3616 plugins/sudoers/ldap.c:3706 +#: plugins/sudoers/ldap.c:3722 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:189 plugins/sudoers/logging.c:451 +#: plugins/sudoers/logging.c:472 plugins/sudoers/logging.c:684 +#: plugins/sudoers/logging.c:942 plugins/sudoers/match.c:617 +#: plugins/sudoers/match.c:664 plugins/sudoers/match.c:714 +#: plugins/sudoers/match.c:738 plugins/sudoers/match.c:826 +#: plugins/sudoers/match.c:915 plugins/sudoers/parse.c:252 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:279 +#: plugins/sudoers/parse.c:291 plugins/sudoers/policy.c:441 +#: plugins/sudoers/policy.c:678 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:165 plugins/sudoers/pwutil.c:236 +#: plugins/sudoers/pwutil.c:312 plugins/sudoers/pwutil.c:486 +#: plugins/sudoers/pwutil.c:551 plugins/sudoers/pwutil.c:620 +#: plugins/sudoers/pwutil.c:778 plugins/sudoers/pwutil.c:835 +#: plugins/sudoers/pwutil.c:880 plugins/sudoers/pwutil.c:938 +#: plugins/sudoers/sssd.c:162 plugins/sudoers/sssd.c:194 +#: plugins/sudoers/sssd.c:237 plugins/sudoers/sssd.c:244 +#: plugins/sudoers/sssd.c:280 plugins/sudoers/sssd.c:353 +#: plugins/sudoers/sssd.c:392 plugins/sudoers/sssd.c:1067 +#: plugins/sudoers/sssd.c:1246 plugins/sudoers/sssd.c:1260 +#: plugins/sudoers/sssd.c:1276 plugins/sudoers/sudoers.c:263 +#: plugins/sudoers/sudoers.c:273 plugins/sudoers/sudoers.c:281 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:682 +#: plugins/sudoers/sudoers.c:807 plugins/sudoers/sudoers.c:851 +#: plugins/sudoers/sudoers.c:1123 plugins/sudoers/sudoers_debug.c:107 +#: plugins/sudoers/sudoreplay.c:1253 plugins/sudoers/sudoreplay.c:1365 +#: plugins/sudoers/sudoreplay.c:1405 plugins/sudoers/sudoreplay.c:1414 +#: plugins/sudoers/sudoreplay.c:1424 plugins/sudoers/sudoreplay.c:1432 +#: plugins/sudoers/sudoreplay.c:1436 plugins/sudoers/sudoreplay.c:1592 +#: plugins/sudoers/sudoreplay.c:1596 plugins/sudoers/testsudoers.c:131 +#: plugins/sudoers/testsudoers.c:217 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/timestamp.c:389 plugins/sudoers/timestamp.c:433 +#: plugins/sudoers/timestamp.c:852 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:146 +#: plugins/sudoers/visudo.c:153 plugins/sudoers/visudo.c:309 +#: plugins/sudoers/visudo.c:315 plugins/sudoers/visudo.c:446 +#: plugins/sudoers/visudo.c:624 plugins/sudoers/visudo.c:985 +#: plugins/sudoers/visudo.c:1051 plugins/sudoers/visudo.c:1095 +#: plugins/sudoers/visudo.c:1197 plugins/sudoers/visudo_json.c:1025 toke.l:849 +#: toke.l:949 toke.l:1106 +msgid "unable to allocate memory" +msgstr "kan geen geheugen reserveren" + +#: gram.y:481 +msgid "a digest requires a path name" +msgstr "een digest vereist een padnaam" + +#: gram.y:607 +msgid "invalid notbefore value" +msgstr "ongeldige 'notbefore'-waarde" + +#: gram.y:615 +msgid "invalid notafter value" +msgstr "ongeldige 'notafter'-waarde" + +#: gram.y:624 plugins/sudoers/policy.c:267 +msgid "timeout value too large" +msgstr "" + +#: gram.y:626 plugins/sudoers/policy.c:269 +msgid "invalid timeout value" +msgstr "" + +#: gram.y:1195 gram.y:1202 plugins/sudoers/auth/pam.c:320 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:650 plugins/sudoers/defaults.c:905 +#: plugins/sudoers/defaults.c:1076 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:93 +#: plugins/sudoers/env.c:233 plugins/sudoers/filedigest.c:120 +#: plugins/sudoers/filedigest_gcrypt.c:72 +#: plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:974 plugins/sudoers/ldap.c:1168 +#: plugins/sudoers/ldap.c:1179 plugins/sudoers/ldap.c:1195 +#: plugins/sudoers/ldap.c:1487 plugins/sudoers/ldap.c:1647 +#: plugins/sudoers/ldap.c:1729 plugins/sudoers/ldap.c:1877 +#: plugins/sudoers/ldap.c:1901 plugins/sudoers/ldap.c:1990 +#: plugins/sudoers/ldap.c:2005 plugins/sudoers/ldap.c:2101 +#: plugins/sudoers/ldap.c:2134 plugins/sudoers/ldap.c:2214 +#: plugins/sudoers/ldap.c:2297 plugins/sudoers/ldap.c:2394 +#: plugins/sudoers/ldap.c:3228 plugins/sudoers/ldap.c:3260 +#: plugins/sudoers/ldap.c:3572 plugins/sudoers/ldap.c:3599 +#: plugins/sudoers/ldap.c:3615 plugins/sudoers/ldap.c:3706 +#: plugins/sudoers/ldap.c:3722 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:189 plugins/sudoers/logging.c:451 +#: plugins/sudoers/logging.c:472 plugins/sudoers/logging.c:942 +#: plugins/sudoers/match.c:616 plugins/sudoers/match.c:663 +#: plugins/sudoers/match.c:714 plugins/sudoers/match.c:738 +#: plugins/sudoers/match.c:826 plugins/sudoers/match.c:914 +#: plugins/sudoers/parse.c:252 plugins/sudoers/parse.c:264 +#: plugins/sudoers/parse.c:279 plugins/sudoers/parse.c:291 +#: plugins/sudoers/policy.c:100 plugins/sudoers/policy.c:109 +#: plugins/sudoers/policy.c:118 plugins/sudoers/policy.c:142 +#: plugins/sudoers/policy.c:253 plugins/sudoers/policy.c:267 +#: plugins/sudoers/policy.c:269 plugins/sudoers/policy.c:293 +#: plugins/sudoers/policy.c:303 plugins/sudoers/policy.c:343 +#: plugins/sudoers/policy.c:353 plugins/sudoers/policy.c:362 +#: plugins/sudoers/policy.c:371 plugins/sudoers/policy.c:441 +#: plugins/sudoers/policy.c:678 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:165 plugins/sudoers/pwutil.c:236 +#: plugins/sudoers/pwutil.c:312 plugins/sudoers/pwutil.c:486 +#: plugins/sudoers/pwutil.c:551 plugins/sudoers/pwutil.c:620 +#: plugins/sudoers/pwutil.c:778 plugins/sudoers/pwutil.c:835 +#: plugins/sudoers/pwutil.c:880 plugins/sudoers/pwutil.c:938 +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:352 plugins/sudoers/sssd.c:392 +#: plugins/sudoers/sssd.c:1067 plugins/sudoers/sssd.c:1245 +#: plugins/sudoers/sssd.c:1260 plugins/sudoers/sssd.c:1276 +#: plugins/sudoers/sudoers.c:263 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:682 plugins/sudoers/sudoers.c:807 +#: plugins/sudoers/sudoers.c:851 plugins/sudoers/sudoers.c:1123 +#: plugins/sudoers/sudoers_debug.c:106 plugins/sudoers/sudoreplay.c:1253 +#: plugins/sudoers/sudoreplay.c:1365 plugins/sudoers/sudoreplay.c:1405 +#: plugins/sudoers/sudoreplay.c:1414 plugins/sudoers/sudoreplay.c:1424 +#: plugins/sudoers/sudoreplay.c:1432 plugins/sudoers/sudoreplay.c:1436 +#: plugins/sudoers/sudoreplay.c:1592 plugins/sudoers/sudoreplay.c:1596 +#: plugins/sudoers/testsudoers.c:131 plugins/sudoers/testsudoers.c:217 +#: plugins/sudoers/testsudoers.c:234 plugins/sudoers/timestamp.c:389 +#: plugins/sudoers/timestamp.c:433 plugins/sudoers/timestamp.c:852 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:153 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:985 plugins/sudoers/visudo.c:1051 +#: plugins/sudoers/visudo.c:1095 plugins/sudoers/visudo.c:1197 +#: plugins/sudoers/visudo_json.c:1025 toke.l:849 toke.l:949 toke.l:1106 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:135 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias \"%s\" is al gedefinieerd" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kan de loginklasse voor gebruiker %s niet verkrijgen" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "kan de bsd-aanmelding niet starten" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "ongeldig type verificatie" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "kan de bsd-aanmelding niet initialiseren" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "kan fwtk-configuratie niet lezen" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "kan niet verbinden met aanmeldingsserver" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "verbinding met aanmeldingsserver verloren" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"aanmeldingsserverfout:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, fuzzy, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: kan opdrachtgever niet converteren naar een string ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: kan '%s' niet ontleden: %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: kan cache voor aanmeldingsgegevens niet vinden: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: kan opties niet reserveren: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: kan aanmeldingsgegevens niet verkrijgen: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: kan cache voor aanmeldingsgegevens niet initialiseren: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: kan aanmeldingsgegeven niet opslaan in cache: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: kan belangrijkste server niet vinden: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Kan TGT niet verifieren! U bent mogelijk aangevallen!: %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "kan PAM niet initialiseren" + +#: plugins/sudoers/auth/pam.c:194 +msgid "account validation failure, is your account locked?" +msgstr "fout bij valideren van account, is uw account geblokkeerd?" + +#: plugins/sudoers/auth/pam.c:198 +msgid "Account or password is expired, reset your password and try again" +msgstr "Account of wachtwoord is verlopen, stel uw wachtwoord opnieuw in en probeer het opnieuw" + +#: plugins/sudoers/auth/pam.c:206 +#, c-format +msgid "unable to change expired password: %s" +msgstr "kan verlopen wachtwoord niet wijzigen: %s" + +#: plugins/sudoers/auth/pam.c:211 +msgid "Password expired, contact your system administrator" +msgstr "Wachtwoord is verlopen, neem contact op met uw systeembeheerder" + +#: plugins/sudoers/auth/pam.c:215 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Account is verlopen of PAM-configuratie heeft geen \"account\"-gedeelte voor sudo, neem contact op met uw systeembeheerder" + +#: plugins/sudoers/auth/pam.c:229 +#, c-format +msgid "PAM authentication error: %s" +msgstr "fout in PAM-aanmelding: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "u bestaat niet in de %s-database" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "initialiseren van de ACE API-bibliotheek is mislukt" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "kan geen contact krijgen met de SecurID-server" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "Gebruikers-ID is geblokkeerd voor SecurID-verificatie" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "ongeldige gebruikersnaamlengte voor SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "kan verificatie voor SecurID op deze manier niet afhandelen" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "SecurID-communicatie is mislukt" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "onbekende SecurID-fout" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "ongeldige lengte van passcode voor SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:125 +msgid "unable to initialize SIA session" +msgstr "kan SIA-sessie niet initialiseren" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "ongeldige verificatiemethoden" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Er zijn ongeldige verificatiemethoden in sudo gecompileerd! U kunt geen zelfstandige en niet-zelfstandige verificatiemethoden door elkaar gebruiken." + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "geen verificatiemethoden" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Er zijn geen verificatie-methoden in sudo gecompileerd! Als u verificatie wilt uitschakelen, dient u de --disable-authentication configuratie-optie te gebruiken." + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "Kon verificatiemethoden niet starten." + +#: plugins/sudoers/auth/sudo_auth.c:441 +msgid "Authentication methods:" +msgstr "Verificatie-methoden:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "Kan voorwaarden voor controle niet bepalen" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "kan controlestructuur niet opbouwen" + +#: plugins/sudoers/check.c:259 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Als het goed is hebt u de gebruikelijke informatie ontvangen van uw\n" +"systeembeheerder. Gewoonlijk komt het neer op de volgende drie punten:\n" +"\n" +" 1. Respecteer de privacy van anderen.\n" +" 2. Denk na voordat u iets doet.\n" +" 3. Veel mogelijkheden betekent veel verantwoordelijkheid.\n" +"\n" + +#: plugins/sudoers/check.c:302 plugins/sudoers/check.c:312 +#: plugins/sudoers/sudoers.c:725 plugins/sudoers/sudoers.c:770 +#, c-format +msgid "unknown uid: %u" +msgstr "onbekend gebruikersnummer: %u" + +#: plugins/sudoers/check.c:307 plugins/sudoers/iolog.c:260 +#: plugins/sudoers/policy.c:851 plugins/sudoers/sudoers.c:1162 +#: plugins/sudoers/testsudoers.c:208 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "onbekende gebruiker: %s" + +#: plugins/sudoers/def_data.c:41 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-voorziening als syslog wordt gebruikt voor loggen: %s" + +#: plugins/sudoers/def_data.c:45 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioriteit wanneer aanmelden van gebruiker gelukt is: %s" + +#: plugins/sudoers/def_data.c:49 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioriteit wanneer aanmelden van gebruiker niet gelukt is: %s" + +#: plugins/sudoers/def_data.c:53 +msgid "Put OTP prompt on its own line" +msgstr "Geef OTP-prompt een eigen regel" + +#: plugins/sudoers/def_data.c:57 +msgid "Ignore '.' in $PATH" +msgstr "Negeer '.' in $PATH" + +#: plugins/sudoers/def_data.c:61 +msgid "Always send mail when sudo is run" +msgstr "Stuur altijd een mail wanneer sudo is gebruikt" + +#: plugins/sudoers/def_data.c:65 +msgid "Send mail if user authentication fails" +msgstr "Stuur een mail wanneer aanmelden van gebruiker mislukt" + +#: plugins/sudoers/def_data.c:69 +msgid "Send mail if the user is not in sudoers" +msgstr "Stuur een mail als de gebruiker niet in sudoers staat" + +#: plugins/sudoers/def_data.c:73 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Stuur een mail als de gebruiker niet voor deze computer in sudoers staat" + +#: plugins/sudoers/def_data.c:77 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Stuur een mail als de gebruiker een opdracht niet mag gebruiken" + +#: plugins/sudoers/def_data.c:81 +msgid "Send mail if the user tries to run a command" +msgstr "Stuur een mail als de gebruiker een opdracht probeert te gebruiken" + +#: plugins/sudoers/def_data.c:85 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Gebruik een verschillende tijd voor elke gebruiker/terminal-combinatie" + +#: plugins/sudoers/def_data.c:89 +msgid "Lecture user the first time they run sudo" +msgstr "Instrueer gebruikers de eerste keer dat ze sudo gebruiken" + +#: plugins/sudoers/def_data.c:93 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Bestand met de sudo-instructies: %s" + +#: plugins/sudoers/def_data.c:97 +msgid "Require users to authenticate by default" +msgstr "Standaard is verificatie van gebruikers vereist" + +#: plugins/sudoers/def_data.c:101 +msgid "Root may run sudo" +msgstr "Root mag sudo gebruiken" + +#: plugins/sudoers/def_data.c:105 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Log de computernaam in het (niet-syslog) logbestand" + +#: plugins/sudoers/def_data.c:109 +msgid "Log the year in the (non-syslog) log file" +msgstr "Log het jaar in het (niet-syslog) logbestand" + +#: plugins/sudoers/def_data.c:113 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Start een shell als sudo wordt aangeroepen zonder argumenten" + +#: plugins/sudoers/def_data.c:117 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Stel $HOME in op de doelgebruiker wanneer een shell wordt gestart met -s" + +#: plugins/sudoers/def_data.c:121 +msgid "Always set $HOME to the target user's home directory" +msgstr "$HOME altijd instellen op de persoonlijke map van de doelgebruiker" + +#: plugins/sudoers/def_data.c:125 +msgid "Allow some information gathering to give useful error messages" +msgstr "Sta verzamelen van informatie toe om bruikbare foutberichten te geven" + +#: plugins/sudoers/def_data.c:129 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Vereis volledig-gekwalificeerde computernamen (fqdn) in het sudoers-bestand" + +#: plugins/sudoers/def_data.c:133 +msgid "Insult the user when they enter an incorrect password" +msgstr "Beledig de gebruiker wanneer ze een verkeerd wachtwoord invoeren" + +#: plugins/sudoers/def_data.c:137 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Gebruiker alleen toestaan sudo te gebruiken wanneer deze een terminal heeft" + +#: plugins/sudoers/def_data.c:141 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo zal de EDITOR omgevingsvariabele in acht nemen" + +#: plugins/sudoers/def_data.c:145 +msgid "Prompt for root's password, not the users's" +msgstr "Vraag naar wachtwoord van root, niet van de gebruiker" + +#: plugins/sudoers/def_data.c:149 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Vraag naar wachtwoord van runas_default gebruiker, niet van huidige gebruiker" + +#: plugins/sudoers/def_data.c:153 +msgid "Prompt for the target user's password, not the users's" +msgstr "Vraag naar wachtwoord van doelgebruiker, niet van huidige gebruiker" + +#: plugins/sudoers/def_data.c:157 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Pas de standaardinstellingen van de doelgebruikers inlogklasse toe wanneer deze bestaat" + +#: plugins/sudoers/def_data.c:161 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Stel de LOGNAME en USER omgevingsvariabelen in" + +#: plugins/sudoers/def_data.c:165 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Stel het effectieve gebruikersnummer van de doelgebuiker in, niet het werkelijke gebruikersnummer" + +#: plugins/sudoers/def_data.c:169 +msgid "Don't initialize the group vector to that of the target user" +msgstr "De groepsvector niet initialiseren naar die van de doelgebruiker" + +#: plugins/sudoers/def_data.c:173 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Breek regels in logbestanden af op (0 voor niet afbreken): %u" + +#: plugins/sudoers/def_data.c:177 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Aanmeldtijd timeout: %.1f minuten" + +#: plugins/sudoers/def_data.c:181 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Wachtwoordprompt timeout: %.1f minuten" + +#: plugins/sudoers/def_data.c:185 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Aantal pogingen om een wachtwoord in te voeren: %u" + +#: plugins/sudoers/def_data.c:189 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Te gebruiken umask of 0777 om die van gebruiker te gebruiken: 0%o" + +#: plugins/sudoers/def_data.c:193 +#, c-format +msgid "Path to log file: %s" +msgstr "Pad naar logbestand: %s" + +#: plugins/sudoers/def_data.c:197 +#, c-format +msgid "Path to mail program: %s" +msgstr "Pad naar mailprogramma: %s" + +#: plugins/sudoers/def_data.c:201 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Opties voor mailprogramma: %s" + +#: plugins/sudoers/def_data.c:205 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adres waarnaar mail wordt verzonden: %s" + +#: plugins/sudoers/def_data.c:209 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Afzenderadres: %s" + +#: plugins/sudoers/def_data.c:213 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Onderwerp voor mails: %s" + +#: plugins/sudoers/def_data.c:217 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Boodschap voor verkeerd wachtwoord: %s" + +#: plugins/sudoers/def_data.c:221 +#, fuzzy, c-format +msgid "Path to lecture status dir: %s" +msgstr "Pad naar aanmeld-tijdmap: %s" + +#: plugins/sudoers/def_data.c:225 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Pad naar aanmeld-tijdmap: %s" + +#: plugins/sudoers/def_data.c:229 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Eigenaar van aanmeld-tijdmap: %s" + +#: plugins/sudoers/def_data.c:233 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Gebruikers in deze groep zijn uitgezonderd van de wachtwoord- en PATH-vereisten: %s" + +#: plugins/sudoers/def_data.c:237 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standaard wachtwoordprompt: %s" + +#: plugins/sudoers/def_data.c:241 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Indien ingesteld, zal de wachtwoordprompt altijd de systeemprompt vervangen." + +#: plugins/sudoers/def_data.c:245 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standaardgebruiker om opdrachten uit te voeren: %s" + +#: plugins/sudoers/def_data.c:249 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Waarde waarmee $PATH van gebruiker wordt vervangen: %s" + +#: plugins/sudoers/def_data.c:253 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Pad naar de editor bij gebruik van visudo: %s" + +#: plugins/sudoers/def_data.c:257 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Wanneer een wachtwoord noodzakelijk is voor 'list'-pseudopdracht: %s" + +#: plugins/sudoers/def_data.c:261 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Wanneer een wachtwoord noodzakelijk is voor 'verify'-pseudopdracht: %s" + +#: plugins/sudoers/def_data.c:265 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Laadt vooraf de dummy uitvoerfuncties uit de sudo_noexec-bibliotheek" + +#: plugins/sudoers/def_data.c:269 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Als de LDAP-map beschikbaar is, wordt het lokale sudoersbestand genegeerd?" + +#: plugins/sudoers/def_data.c:273 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Bestandsdescriptors >= %d zullen worden gesloten vóór het uitvoeren van een opdracht" + +#: plugins/sudoers/def_data.c:277 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Indien ingesteld, mogen gebruikers de waarde van 'closefrom' vervangen met de optie -C" + +#: plugins/sudoers/def_data.c:281 +msgid "Allow users to set arbitrary environment variables" +msgstr "Gebruikers toestaan willekeurige omgevingsvariabelen in te stellen" + +#: plugins/sudoers/def_data.c:285 +msgid "Reset the environment to a default set of variables" +msgstr "Stel de omgevingsvariablen in op een standaard set" + +#: plugins/sudoers/def_data.c:289 +msgid "Environment variables to check for sanity:" +msgstr "Op \"gezondheid\" te controleren omgevingsvariabelen:" + +#: plugins/sudoers/def_data.c:293 +msgid "Environment variables to remove:" +msgstr "Te verwijderen omgevingsvariabelen:" + +#: plugins/sudoers/def_data.c:297 +msgid "Environment variables to preserve:" +msgstr "Te behouden omgevingsvariabelen:" + +#: plugins/sudoers/def_data.c:301 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux role om in de nieuwe beveiligingscontext te gebruiken: %s" + +#: plugins/sudoers/def_data.c:305 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux type om in de nieuwe beveiligingscontext te gebruiken: %s" + +#: plugins/sudoers/def_data.c:309 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Pad naar het omgevingsbestand voor sudo: %s" + +#: plugins/sudoers/def_data.c:313 +#, fuzzy, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Pad naar het omgevingsbestand voor sudo: %s" + +#: plugins/sudoers/def_data.c:317 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Te gebruiken taalregio bij ontleden van sudoers: %s" + +#: plugins/sudoers/def_data.c:321 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Sta sudo toe ook te vragen naar een wachtwoord wanneer dit zichtbaar zou worden" + +#: plugins/sudoers/def_data.c:325 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Zorg voor zichtbare terugkoppeling op de wachtwoordprompt wanneer er gebruikersinvoer is" + +#: plugins/sudoers/def_data.c:329 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Gebruik snellere expansie van jokertekens. Dit is minder nauwkeurig, maar maakt geen gebruik van het bestandsysteem" + +#: plugins/sudoers/def_data.c:333 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "De umask die is opgegeven in het sudoersbestand zal die van de gebruiker vervangen, ook wanneer deze meer toestaat" + +#: plugins/sudoers/def_data.c:337 +msgid "Log user's input for the command being run" +msgstr "Log gebruikersinvoer voor de uitgevoerde opdracht" + +#: plugins/sudoers/def_data.c:341 +msgid "Log the output of the command being run" +msgstr "Log uitvoer voor de uitgevoerde opdracht" + +#: plugins/sudoers/def_data.c:345 +msgid "Compress I/O logs using zlib" +msgstr "Comprimeer in-/uitvoerlogs met zlib" + +#: plugins/sudoers/def_data.c:349 +msgid "Always run commands in a pseudo-tty" +msgstr "Voer opdrachten altijd uit in een pseudo-terminal" + +#: plugins/sudoers/def_data.c:353 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plugin voor ondersteuning van niet-Unixgroepen: %s" + +#: plugins/sudoers/def_data.c:357 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Map waarin in-/uitvoerlogs moeten worden opgeslagen: %s" + +#: plugins/sudoers/def_data.c:361 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Bestand waarin in-/uitvoerlogs moeten worden opgeslagen: %s" + +#: plugins/sudoers/def_data.c:365 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Voeg een item toe aan het utmp/utmpx-bestand wanneer een virtuele terminal wordt gereserveerd" + +#: plugins/sudoers/def_data.c:369 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Stel in utmp de gebruiker in op de runas-gebruiker, niet op de aanroepende gebruiker" + +#: plugins/sudoers/def_data.c:373 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Set van toegestane privileges: %s" + +#: plugins/sudoers/def_data.c:377 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Set van beperkende privileges: %s" + +#: plugins/sudoers/def_data.c:381 +msgid "Run commands on a pty in the background" +msgstr "Draai opdrachten op een virtuele terminal op de achtergrond." + +#: plugins/sudoers/def_data.c:385 +#, c-format +msgid "PAM service name to use: %s" +msgstr "te gebruiken naam van PAM-service: %s" + +#: plugins/sudoers/def_data.c:389 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "te gebruiken naam van PAM-service voor inlog-shells: %s" + +#: plugins/sudoers/def_data.c:393 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Probeer PAM-aanmeldgegevens voor doelgebruiker te verkrijgen" + +#: plugins/sudoers/def_data.c:397 +msgid "Create a new PAM session for the command to run in" +msgstr "Maak een nieuwe PAM-sessie om de opdracht in uit te voeren" + +#: plugins/sudoers/def_data.c:401 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Maximaal in-/uitvoerlog volgnummer: %u" + +#: plugins/sudoers/def_data.c:405 +msgid "Enable sudoers netgroup support" +msgstr "Ondersteuning voor sudoers-netgroup inschakelen" + +#: plugins/sudoers/def_data.c:409 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:413 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:417 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:421 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:425 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "" + +#: plugins/sudoers/def_data.c:429 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "" + +#: plugins/sudoers/def_data.c:433 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "" + +#: plugins/sudoers/def_data.c:437 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:441 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:445 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:449 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:453 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:457 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:461 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:465 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:469 +msgid "Allow the user to specify a timeout on the command line" +msgstr "" + +#: plugins/sudoers/def_data.c:473 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:477 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:481 +#, fuzzy, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Eigenaar van aanmeld-tijdmap: %s" + +#: plugins/sudoers/defaults.c:220 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d onbekend standaarditem \"%s\"" + +#: plugins/sudoers/defaults.c:223 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: onbekend standaarditem \"%s\"" + +#: plugins/sudoers/defaults.c:266 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d geen waarde opgegeven voor \"%s\"" + +#: plugins/sudoers/defaults.c:269 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: geen waarde opgegeven voor \"%s\"" + +#: plugins/sudoers/defaults.c:289 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d waarden voor \"%s\" moeten beginnen met een '/'" + +#: plugins/sudoers/defaults.c:292 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: waarden voor \"%s\" moeten beginnen met een '/'" + +#: plugins/sudoers/defaults.c:317 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d optie '%s' accepteert geen waarde" + +#: plugins/sudoers/defaults.c:320 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: optie '%s' accepteert geen waarde" + +#: plugins/sudoers/defaults.c:342 +#, fuzzy, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "ongeldige filteroptie: %s" + +#: plugins/sudoers/defaults.c:345 +#, fuzzy, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "ongeldige filteroptie: %s" + +#: plugins/sudoers/defaults.c:355 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d waarde \"%s\" is ongeldig voor optie '%s'" + +#: plugins/sudoers/defaults.c:358 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: waarde \"%s\" is ongeldig voor optie '%s'" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:543 plugins/sudoers/ldap.c:1264 +#: plugins/sudoers/ldap.c:1491 plugins/sudoers/ldap.c:1816 +#: plugins/sudoers/linux_audit.c:82 plugins/sudoers/logging.c:947 +#: plugins/sudoers/policy.c:562 plugins/sudoers/policy.c:572 +#: plugins/sudoers/prompt.c:161 plugins/sudoers/sudoers.c:873 +#: plugins/sudoers/testsudoers.c:238 plugins/sudoers/toke_util.c:158 +#, c-format +msgid "internal error, %s overflow" +msgstr "interne fout, %s overflow" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp bevat fouten, verkeerde lengte" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "kan omgeving niet opnieuw opbouwen" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "sorry, u mag de volgende omgevingsvariabelen niet instellen: %s" + +#: plugins/sudoers/filedigest.c:104 plugins/sudoers/filedigest_gcrypt.c:66 +#: plugins/sudoers/filedigest_openssl.c:95 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "niet-ondersteund type controlegetal %d voor %s" + +#: plugins/sudoers/filedigest.c:129 plugins/sudoers/filedigest_gcrypt.c:98 +#: plugins/sudoers/filedigest_openssl.c:120 +#, c-format +msgid "%s: read error" +msgstr "%s: leesfout" + +#: plugins/sudoers/group_plugin.c:86 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s moet eigendom zijn van gebruikersnummer %d" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s mag enkel schrijfbaar zijn voor eigenaar" + +#: plugins/sudoers/group_plugin.c:98 plugins/sudoers/sssd.c:400 +#, c-format +msgid "unable to load %s: %s" +msgstr "kan %s niet laden: %s" + +#: plugins/sudoers/group_plugin.c:104 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "kan symbool \"group_plugin\" niet vinden in %s" + +#: plugins/sudoers/group_plugin.c:109 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: incompatibele groepplugin hoofdversie %d, verwacht wordt %d" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "kan IP-adres \"%s\" niet ontleden" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "kan netmasker \"%s\" niet ontleden" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "Combinaties van lokale IP-adressen en netwerkmaskers:\n" + +#: plugins/sudoers/iolog.c:121 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s bestaat al, maar is geen map (0%o)" + +#: plugins/sudoers/iolog.c:146 plugins/sudoers/iolog.c:187 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:170 +#, c-format +msgid "unable to mkdir %s" +msgstr "mkdir %s: aanmaken mislukt" + +#: plugins/sudoers/iolog.c:191 plugins/sudoers/visudo.c:740 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "kan modus van %s niet wijzigen naar 0%o" + +#: plugins/sudoers/iolog.c:299 plugins/sudoers/sudoers.c:1193 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "onbekende groep: %s" + +#: plugins/sudoers/iolog.c:418 plugins/sudoers/sudoers.c:929 +#: plugins/sudoers/sudoreplay.c:349 plugins/sudoers/sudoreplay.c:1354 +#: plugins/sudoers/sudoreplay.c:1558 plugins/sudoers/timestamp.c:398 +#: plugins/sudoers/visudo.c:972 plugins/sudoers/visudo_json.c:1001 +#: plugins/sudoers/visudo_json.c:1014 +#, c-format +msgid "unable to open %s" +msgstr "kan %s niet openen" + +#: plugins/sudoers/iolog.c:469 plugins/sudoers/sudoers.c:933 +#: plugins/sudoers/sudoreplay.c:856 plugins/sudoers/sudoreplay.c:1669 +#, c-format +msgid "unable to read %s" +msgstr "kan %s niet lezen" + +#: plugins/sudoers/iolog.c:505 plugins/sudoers/sudoreplay.c:1123 +#: plugins/sudoers/timestamp.c:290 plugins/sudoers/timestamp.c:293 +#, c-format +msgid "unable to write to %s" +msgstr "kan %s niet schrijven" + +#: plugins/sudoers/iolog.c:584 plugins/sudoers/iolog.c:803 +#, c-format +msgid "unable to create %s" +msgstr "kan %s niet aanmaken" + +#: plugins/sudoers/iolog.c:1035 plugins/sudoers/iolog.c:1110 +#: plugins/sudoers/iolog.c:1191 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "kan niet schrijven naar in-/uitvoerlogbestand: %s" + +#: plugins/sudoers/iolog.c:1069 +#, fuzzy, c-format +msgid "%s: internal error, file index %d not open" +msgstr "interne fout, kan %s niet in de lijst vinden!" + +#: plugins/sudoers/ldap.c:431 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: poort te groot" + +#: plugins/sudoers/ldap.c:491 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "niet-ondersteund LDAP uri type: %s" + +#: plugins/sudoers/ldap.c:518 +msgid "unable to mix ldap and ldaps URIs" +msgstr "kan ldap en ldaps URIs niet door elkaar gebruiken" + +#: plugins/sudoers/ldap.c:522 plugins/sudoers/ldap.c:559 +msgid "starttls not supported when using ldaps" +msgstr "starttls wordt niet ondersteund in combinatie met ldaps" + +#: plugins/sudoers/ldap.c:630 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "kan SSL cert en key db niet initialiseren: %s" + +#: plugins/sudoers/ldap.c:633 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "u moet TLS_CERT in %s instellen om SSL te gebruiken" + +#: plugins/sudoers/ldap.c:1250 +msgid "unable to get GMT time" +msgstr "kan GMT-tijd niet verkrijgen" + +#: plugins/sudoers/ldap.c:1256 +msgid "unable to format timestamp" +msgstr "kan tijd niet juist opmaken" + +#: plugins/sudoers/ldap.c:1980 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/ldap.c:2552 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP Role: %s\n" + +#: plugins/sudoers/ldap.c:2554 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"LDAP Role: UNKNOWN\n" + +#: plugins/sudoers/ldap.c:2610 +#, c-format +msgid " Order: %s\n" +msgstr " Volgorde: %s\n" + +#: plugins/sudoers/ldap.c:2618 plugins/sudoers/parse.c:618 +#: plugins/sudoers/sssd.c:1641 +#, c-format +msgid " Commands:\n" +msgstr " Opdrachten:\n" + +#: plugins/sudoers/ldap.c:3180 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "kan LDAP niet initialiseren: %s" + +#: plugins/sudoers/ldap.c:3216 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls opgegeven maar LDAP bibliotheken ondersteunen geen ldap_start_tls_s() of ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:3468 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "ongeldig sudoOrder kenmerk: %s" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "kan controlesysteem niet openen" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "kan controleboodschap niet verzenden" + +#: plugins/sudoers/logging.c:107 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:135 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (opdracht voortgezet) %s" + +#: plugins/sudoers/logging.c:164 +#, c-format +msgid "unable to open log file: %s" +msgstr "kan logbestand niet openen: %s" + +#: plugins/sudoers/logging.c:172 +#, c-format +msgid "unable to lock log file: %s" +msgstr "kan logbestand niet vergrendelen: %s" + +#: plugins/sudoers/logging.c:205 +#, c-format +msgid "unable to write log file: %s" +msgstr "kan logbestand niet schrijven: %s" + +#: plugins/sudoers/logging.c:234 +msgid "No user or host" +msgstr "Geen gebruiker of computer" + +#: plugins/sudoers/logging.c:236 +msgid "validation failure" +msgstr "geldigheidsfout" + +#: plugins/sudoers/logging.c:243 +msgid "user NOT in sudoers" +msgstr "gebruiker NIET in sudoers" + +#: plugins/sudoers/logging.c:245 +msgid "user NOT authorized on host" +msgstr "gebruiker NIET aangemeld op computer" + +#: plugins/sudoers/logging.c:247 +msgid "command not allowed" +msgstr "opdracht is niet toegestaan" + +#: plugins/sudoers/logging.c:282 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s zit niet in het sudoersbestand. Dit incident zal worden gerapporteerd.\n" + +#: plugins/sudoers/logging.c:285 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s heeft niet het recht om sudo te gebruiken op %s. Dit incident zal worden gerapporteerd.\n" + +#: plugins/sudoers/logging.c:289 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Sorry, gebruiker %s mag sudo niet gebruiken op %s.\n" + +#: plugins/sudoers/logging.c:292 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Sorry, gebruiker %s mag '%s%s%s' niet uitvoeren als %s%s%s op %s.\n" + +#: plugins/sudoers/logging.c:329 plugins/sudoers/sudoers.c:473 +#: plugins/sudoers/sudoers.c:475 plugins/sudoers/sudoers.c:477 +#: plugins/sudoers/sudoers.c:479 plugins/sudoers/sudoers.c:1298 +#: plugins/sudoers/sudoers.c:1300 +#, c-format +msgid "%s: command not found" +msgstr "%s: opdracht niet gevonden" + +#: plugins/sudoers/logging.c:331 plugins/sudoers/sudoers.c:469 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"\"%s\" gevonden in '.' wordt genegeerd.\n" +"Gebruik 'sudo ./%s' als dit de '%s' die u wilt uitvoeren." + +#: plugins/sudoers/logging.c:348 +msgid "authentication failure" +msgstr "aanmeldingsfout" + +#: plugins/sudoers/logging.c:374 +msgid "a password is required" +msgstr "een wachtwoord is verplicht" + +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:511 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u verkeerde wachtwoordpoging" +msgstr[1] "%u verkeerde wachtwoordpogingen" + +#: plugins/sudoers/logging.c:598 +msgid "unable to fork" +msgstr "kan niet afsplitsen" + +#: plugins/sudoers/logging.c:606 plugins/sudoers/logging.c:658 +#, c-format +msgid "unable to fork: %m" +msgstr "kan niet afsplitsen: %m" + +#: plugins/sudoers/logging.c:648 +#, c-format +msgid "unable to open pipe: %m" +msgstr "kan pipe niet openen: %m" + +#: plugins/sudoers/logging.c:673 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "kan stdin niet klonen: %m" + +#: plugins/sudoers/logging.c:711 +#, c-format +msgid "unable to execute %s: %m" +msgstr "kan %s niet uitvoeren: %m" + +#: plugins/sudoers/match.c:771 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "controlegetal voor %s (%s) is niet in de %s-vorm" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:944 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to stat %s" +msgstr "kan stat op %s niet uitvoeren" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "ontleedfout in %s bij regel %d" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "ontleedfout in %s" + +#: plugins/sudoers/parse.c:544 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-item:\n" + +#: plugins/sudoers/parse.c:545 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:559 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:568 +#, c-format +msgid " Options: " +msgstr " Opties: " + +#: plugins/sudoers/policy.c:243 plugins/sudoers/testsudoers.c:261 +msgid "unable to parse network address list" +msgstr "kan netwerkadressenlijst niet ontleden" + +#: plugins/sudoers/policy.c:380 +msgid "user name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:384 +msgid "user ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:388 +msgid "group ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:392 +msgid "host name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:736 plugins/sudoers/visudo.c:910 +#, c-format +msgid "unable to execute %s" +msgstr "kan %s niet uitvoeren" + +#: plugins/sudoers/policy.c:869 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers-beleidsplugin versie %s\n" + +#: plugins/sudoers/policy.c:871 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versie van sudoers-bestandsgrammatica %d\n" + +#: plugins/sudoers/policy.c:875 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-pad: %s\n" + +#: plugins/sudoers/policy.c:878 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-pad: %s\n" + +#: plugins/sudoers/policy.c:880 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-pad: %s\n" + +#: plugins/sudoers/policy.c:881 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-pad: %s\n" + +#: plugins/sudoers/policy.c:914 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:188 plugins/sudoers/pwutil.c:206 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "kan gebruikersnummer %u niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:200 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "kan gebruikersnummer %u niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:260 plugins/sudoers/pwutil.c:277 +#: plugins/sudoers/pwutil.c:339 plugins/sudoers/pwutil.c:384 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "kan gebruiker %s niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:272 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "kan gebruiker %s niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:503 plugins/sudoers/pwutil.c:521 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "kan groepsnummer %u niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:515 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "kan groepsnummer %u niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:569 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:633 plugins/sudoers/pwutil.c:675 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "kan groep %s niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:581 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "kan groep %s niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:801 plugins/sudoers/pwutil.c:853 +#: plugins/sudoers/pwutil.c:904 plugins/sudoers/pwutil.c:957 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "kan groepslijst voor %s niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:807 plugins/sudoers/pwutil.c:858 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:962 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "kan groepslijst voor %s niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:847 +#, c-format +msgid "unable to parse groups for %s" +msgstr "kan groepen voor %s niet ontleden" + +#: plugins/sudoers/pwutil.c:951 +#, c-format +msgid "unable to parse gids for %s" +msgstr "kan groepsnummers voor %s niet ontleden" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "overloop van rechtenstapel" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "onderloop van rechtenstapel" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "kan niet wijzigen naar rootgroepsnummer" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "kan niet wijzigen naar runas-groepsnummer" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "kan runas-groepsvector niet instellen" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "kan niet wijzigen naar runas-gebruikersnummer" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "kan niet wijzigen naar sudoers-groepsnummer" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "te veel processen" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "kan huidige werkmap niet achterhalen" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "boodschap voor audit_failure is te lang" + +#: plugins/sudoers/sssd.c:402 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "Kan SSS-bron niet initialiseren. Is SSSD op uw machine geinstalleerd?" + +#: plugins/sudoers/sssd.c:410 plugins/sudoers/sssd.c:419 +#: plugins/sudoers/sssd.c:428 plugins/sudoers/sssd.c:437 +#: plugins/sudoers/sssd.c:446 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "kan symbool \"%s\" niet vinden in %s" + +#: plugins/sudoers/sssd.c:1556 +#, c-format +msgid "" +"\n" +"SSSD Role: %s\n" +msgstr "" +"\n" +"SSSD Role: %s\n" + +#: plugins/sudoers/sssd.c:1561 +#, c-format +msgid "" +"\n" +"SSSD Role: UNKNOWN\n" +msgstr "" +"\n" +"SSSD Role: UNKNOWN\n" + +#: plugins/sudoers/sudo_nss.c:289 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Overeenkomende standaarditems voor %s op %s:\n" + +#: plugins/sudoers/sudo_nss.c:307 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas en opdrachtspecifieke standaarden voor %s:\n" + +#: plugins/sudoers/sudo_nss.c:325 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Gebruiker %s mag de volgende opdrachten uitvoeren op %s:\n" + +#: plugins/sudoers/sudo_nss.c:338 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Gebruiker %s mag geen sudo gebruiken op %s.\n" + +#: plugins/sudoers/sudoers.c:168 plugins/sudoers/testsudoers.c:247 +#: plugins/sudoers/visudo.c:233 plugins/sudoers/visudo.c:612 +#: plugins/sudoers/visudo.c:976 +msgid "unable to initialize sudoers default values" +msgstr "kan sudoers-standaardwaarden niet initialiseren" + +#: plugins/sudoers/sudoers.c:198 plugins/sudoers/sudoers.c:891 +msgid "problem with defaults entries" +msgstr "probleem met standaarditems" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "geen geldige sudoers-bronnen gevonden, afsluiten" + +#: plugins/sudoers/sudoers.c:244 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers geeft aan dat root geen sudo mag gebruiken" + +#: plugins/sudoers/sudoers.c:301 +msgid "you are not permitted to use the -C option" +msgstr "u heeft niet de rechten om de optie -C te gebruiken" + +#: plugins/sudoers/sudoers.c:390 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "tijd-eigenaar (%s): Gebruiker bestaat niet" + +#: plugins/sudoers/sudoers.c:405 +msgid "no tty" +msgstr "geen terminal" + +#: plugins/sudoers/sudoers.c:406 +msgid "sorry, you must have a tty to run sudo" +msgstr "sorry, u moet een terminal hebben om sudo te gebruiken" + +#: plugins/sudoers/sudoers.c:468 +msgid "command in current directory" +msgstr "opdracht in huidige map" + +#: plugins/sudoers/sudoers.c:487 +#, fuzzy +msgid "sorry, you are not allowed set a command timeout" +msgstr "sorry, u mag de omgeving niet behouden" + +#: plugins/sudoers/sudoers.c:495 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "sorry, u mag de omgeving niet behouden" + +#: plugins/sudoers/sudoers.c:836 +msgid "command too long" +msgstr "opdracht is te lang" + +#: plugins/sudoers/sudoers.c:948 +#, c-format +msgid "%s is not a regular file" +msgstr "%s in geen regulier bestand" + +#: plugins/sudoers/sudoers.c:952 plugins/sudoers/timestamp.c:217 toke.l:969 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s is eigendom van gebruikersnummer %u, zou %u moeten zijn" + +#: plugins/sudoers/sudoers.c:956 toke.l:974 +#, c-format +msgid "%s is world writable" +msgstr "%s kan door iedereen worden geschreven" + +#: plugins/sudoers/sudoers.c:960 toke.l:977 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s is eigendom van groepsnummer %u, zou %u moeten zijn" + +#: plugins/sudoers/sudoers.c:993 +#, fuzzy, c-format +msgid "only root can use \"-c %s\"" +msgstr "alleen root kan '-c %s' gebruiken" + +#: plugins/sudoers/sudoers.c:1012 +#, c-format +msgid "unknown login class: %s" +msgstr "onbekende loginklasse: %s" + +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/sudoers.c:1109 +#, c-format +msgid "unable to resolve host %s" +msgstr "kan computernaam %s niet herleiden" + +#: plugins/sudoers/sudoreplay.c:275 +#, c-format +msgid "invalid filter option: %s" +msgstr "ongeldige filteroptie: %s" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "invalid max wait: %s" +msgstr "ongeldige maximale wachttijd: %s" + +#: plugins/sudoers/sudoreplay.c:300 +#, c-format +msgid "invalid speed factor: %s" +msgstr "ongeldige snelheidsfactor: %s" + +#: plugins/sudoers/sudoreplay.c:303 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s version %s\n" +msgstr "%s versie %s\n" + +#: plugins/sudoers/sudoreplay.c:335 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:357 +#, fuzzy, c-format +msgid "Replaying sudo session: %s" +msgstr "Bekijken van sudo sessie: %s\n" + +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:602 +#: plugins/sudoers/sudoreplay.c:804 plugins/sudoers/sudoreplay.c:894 +#: plugins/sudoers/sudoreplay.c:973 plugins/sudoers/sudoreplay.c:988 +#: plugins/sudoers/sudoreplay.c:995 plugins/sudoers/sudoreplay.c:1002 +#: plugins/sudoers/sudoreplay.c:1009 plugins/sudoers/sudoreplay.c:1016 +#: plugins/sudoers/sudoreplay.c:1162 +msgid "unable to add event to queue" +msgstr "kan gebeurtenis niet aan wachtrij toevoegen" + +#: plugins/sudoers/sudoreplay.c:670 +msgid "unable to set tty to raw mode" +msgstr "kan terminal niet instellen op rauwe modus" + +#: plugins/sudoers/sudoreplay.c:721 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Waarschuwing: uw terminal is te klein om de log goed op te bekijken.\n" + +#: plugins/sudoers/sudoreplay.c:722 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Logverhouding is %d x %d, de verhouding van uw terminal is %d x %d." + +#: plugins/sudoers/sudoreplay.c:749 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:782 +#, c-format +msgid "invalid timing file line: %s" +msgstr "ongeldige timingsbestandregel: %s" + +#: plugins/sudoers/sudoreplay.c:1196 plugins/sudoers/sudoreplay.c:1221 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "dubbelzinnige expressie \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1243 +msgid "unmatched ')' in expression" +msgstr "ongepaarde ')' in expressie" + +#: plugins/sudoers/sudoreplay.c:1247 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "onbekende zoekterm \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1262 +#, c-format +msgid "%s requires an argument" +msgstr "%s vereist een argument" + +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1645 +#, c-format +msgid "invalid regular expression: %s" +msgstr "ongeldige reguliere expressie: %s" + +#: plugins/sudoers/sudoreplay.c:1269 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "kan datum niet ontleden \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1278 +msgid "unmatched '(' in expression" +msgstr "ongepaarde '(' in expressie" + +#: plugins/sudoers/sudoreplay.c:1280 +msgid "illegal trailing \"or\"" +msgstr "ongeldige afsluitende \"or\"" + +#: plugins/sudoers/sudoreplay.c:1282 +msgid "illegal trailing \"!\"" +msgstr "ongeldige afsluitende \"!\"" + +#: plugins/sudoers/sudoreplay.c:1331 +#, c-format +msgid "unknown search type %d" +msgstr "onbekend zoektype %d" + +#: plugins/sudoers/sudoreplay.c:1369 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ongeldig logbestand" + +#: plugins/sudoers/sudoreplay.c:1387 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: tijdveld ontbreekt" + +#: plugins/sudoers/sudoreplay.c:1394 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: tijdstempel %s: %s" + +#: plugins/sudoers/sudoreplay.c:1401 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: gebruikersveld ontbreekt" + +#: plugins/sudoers/sudoreplay.c:1410 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: runas-gebuikersveld ontbreekt" + +#: plugins/sudoers/sudoreplay.c:1419 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: runas-groepveld ontbreekt" + +#: plugins/sudoers/sudoreplay.c:1825 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "Gebruik: %s [-hnR] [-d map] [-m wachttijd] [-s snelheidsfactor] ID\n" + +#: plugins/sudoers/sudoreplay.c:1828 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "Gebruik: %s [-h] [-d map] -l [zoek-expressie]\n" + +#: plugins/sudoers/sudoreplay.c:1837 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - sudo sessielogs bekijken\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1839 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opties:\n" +" -d, --directory=map map voor sessielogs opgeven\n" +" -f, --filter=filter opgeven welk type in-/uitvoer moet worden weergegeven\n" +" -h, --help geef help weer (dit bericht) en sluit af\n" +" -l, --list [expressie] som beschikbare sessienummers\n" +" die overeenkomen met de expressie op\n" +" -m, --max-wait=num wacht tussen gebeurtenissen maximaal m seconden\n" +" -s, --speed=num snelheid van uitvoer verhogen of verlagen\n" +" -V, --version geef versieinformatie weer en sluit af" + +#: plugins/sudoers/testsudoers.c:329 +msgid "\thost unmatched" +msgstr "\tcomputer komt niet overeen" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Opdracht toegestaan" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Opdracht niet toegestaan" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Opdracht komt niet overeen" + +#: plugins/sudoers/timestamp.c:225 +#, c-format +msgid "%s is group writable" +msgstr "%s kan door groep worden gewijzigd" + +#: plugins/sudoers/timestamp.c:301 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "kan tijdstempelbestand niet inkorten naar %lld bytes" + +#: plugins/sudoers/timestamp.c:756 plugins/sudoers/timestamp.c:823 +#: plugins/sudoers/visudo.c:500 plugins/sudoers/visudo.c:506 +msgid "unable to read the clock" +msgstr "kan de klok niet lezen" + +#: plugins/sudoers/timestamp.c:770 +msgid "ignoring time stamp from the future" +msgstr "tijdstempel uit de toekomst wordt genegeerd" + +#: plugins/sudoers/timestamp.c:782 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tijd is te ver in de toekomst: %20.20s" + +#: plugins/sudoers/timestamp.c:877 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "kan tijdstempelbestand %s niet vergrendelen" + +#: plugins/sudoers/timestamp.c:921 plugins/sudoers/timestamp.c:941 +#, fuzzy, c-format +msgid "lecture status path too long: %s/%s" +msgstr "tijd voor pad te lang: %s" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s grammaticaversie %d\n" + +#: plugins/sudoers/visudo.c:266 plugins/sudoers/visudo.c:667 +#, c-format +msgid "press return to edit %s: " +msgstr "Druk op Enter om %s te bewerken: " + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "opgegeven editor (%s) bestaat niet" + +#: plugins/sudoers/visudo.c:349 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "geen editor gevonden (editorpad = %s)" + +#: plugins/sudoers/visudo.c:459 plugins/sudoers/visudo.c:467 +msgid "write error" +msgstr "schrijffout" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "kan status van tijdelijk bestand (%s) niet vaststellen, %s ongewijzigd" + +#: plugins/sudoers/visudo.c:520 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "tijdelijk bestand (%s) leeg, %s ongewijzigd" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editor (%s) is mislukt, %s ongewijzigd" + +#: plugins/sudoers/visudo.c:548 +#, c-format +msgid "%s unchanged" +msgstr "%s ongewijzigd" + +#: plugins/sudoers/visudo.c:607 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "kan tijdelijk bestand (%s) niet openen, %s ongewijzigd." + +#: plugins/sudoers/visudo.c:619 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "kan tijdelijke bestand (%s) niet ontleden, onbekende fout" + +#: plugins/sudoers/visudo.c:656 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "interne fout, kan %s niet in de lijst vinden!" + +#: plugins/sudoers/visudo.c:736 plugins/sudoers/visudo.c:745 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "kan %s niet wijzigen (gebruikers- of groepsnummer) naar (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s en %s niet op hetzelfde bestandssyteem, gebuikt mv om te hernoemen" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "opdracht mislukt: '%s %s %s', %s ongewijzigd" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "fout bij hernoemen %s, %s ongewijzigd" + +#: plugins/sudoers/visudo.c:855 +msgid "What now? " +msgstr "Wat nu? " + +#: plugins/sudoers/visudo.c:869 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Opties zijn:\n" +" (e)dit sudoers bestand opnieuw\n" +" e(x)it zonder de wijzigingen op te slaan\n" +" (Q)uit en sla wijziging op in het sudoers bestand (GEVAAR!)\n" + +#: plugins/sudoers/visudo.c:915 +#, c-format +msgid "unable to run %s" +msgstr "kan %s niet uitvoeren" + +#: plugins/sudoers/visudo.c:945 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: verkeerde eigenaar (gebruikers-, groepsnummer) zou moeten zijn (%u, %u)\n" + +#: plugins/sudoers/visudo.c:952 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: verkeerde toegangsrechten, zou modus 0%o moeten zijn\n" + +#: plugins/sudoers/visudo.c:981 plugins/sudoers/visudo_json.c:1021 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "kan %s-bestand niet ontleden, onbekende fout" + +#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "fout bij ontleden van %s bij regel %d\n" + +#: plugins/sudoers/visudo.c:1000 plugins/sudoers/visudo_json.c:1035 +#, c-format +msgid "parse error in %s\n" +msgstr "fout bij ontleden van %s\n" + +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1015 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: ontleden is geslaagd\n" + +#: plugins/sudoers/visudo.c:1062 +#, c-format +msgid "%s busy, try again later" +msgstr "%s bezig, probeer het later opnieuw" + +#: plugins/sudoers/visudo.c:1159 +#, fuzzy, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Fout: cyclus in %s '%s'" + +#: plugins/sudoers/visudo.c:1160 +#, fuzzy, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Waarschuwing: cyclus in %s '%s'" + +#: plugins/sudoers/visudo.c:1164 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Fout: %s:%d %s \"%s\" wordt naar verwezen, maar is niet gedefinieerd" + +#: plugins/sudoers/visudo.c:1165 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Waarschuwing: %s:%d %s \"%s\" wordt naar verwezen, maar is niet gedefinieerd" + +#: plugins/sudoers/visudo.c:1318 +#, fuzzy, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Waarschuwing: %s '%s' wordt niet gebruikt" + +#: plugins/sudoers/visudo.c:1433 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - bewerk het sudoersbestand voorzichtig\n" +"\n" + +#: plugins/sudoers/visudo.c:1435 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" +"\n" +"Opties:\n" +" -c, --check alleen lezen modus\n" +" -f, --file=bestand geef lokatie van sudoersbestand op\n" +" -h, --help geef help weer (dit bericht) en sluit af\n" +" -q, --quiet minder uitgebreide syntactische fout berichten\n" +" -s, --strict stricte controle van syntaxis\n" +" -V, --verion geef versieinformatie weer en sluit af" + +#: plugins/sudoers/visudo_json.c:616 plugins/sudoers/visudo_json.c:651 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "onbekend standaarditem '%s'" + +#: plugins/sudoers/visudo_json.c:1007 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: in- en uitvoerbestanden moeten verschillen" + +#: toke.l:943 +msgid "too many levels of includes" +msgstr "te veel niveaus van insluitingen" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: ruimte ontoereikend bij uitbreiden hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: ruimte ontoereikend bij bouwen van hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 reserveren mislukt" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "tijd voor pad te lang: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "kan status van editor (%s) niet verkrijgen" + +#~ msgid "Password:" +#~ msgstr "Wachtwoord:" + +#~ msgid "unable to setup authentication" +#~ msgstr "kan verificatie niet instellen" + +#~ msgid "invalid uri: %s" +#~ msgstr "ongeldige uri: %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "kan ldaps en starttls niet door elkaar gebruiken" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "interne fout: onvoldoende ruimte voor logregel" + +#~ msgid "value out of range" +#~ msgstr "waarde buiten bereik" + +#~ msgid "writing to standard output" +#~ msgstr "naar standaarduitvoer schrijven" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "te veel geneste expressies, maximum %d" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s is van gebruikersnummer %u, zou gebruikersnummer %u moeten zijn" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s kan geschreven worden door niet-eigenaar (0%o), zou ingesteld moeten zijn op 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s bestaat maar is geen normaal bestand (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s kan geschreven worden bij niet-eigenaar (0%o), zou ingesteld moeten zijn op 0600" + +#~ msgid "unable to remove %s, will reset to the epoch" +#~ msgstr "kan %s niet verwijderen, wordt geherinitialiseerd op de epoch" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: stapeloverloop" + +#~ msgid "%s: unused %s_Alias %s" +#~ msgstr "%s: ongebruikte %s_Alias %s" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s bij regel %d <<<" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: mislukt" + +#~ msgid "getauid failed" +#~ msgstr "getauid mislukt" + +#~ msgid "au_open: failed" +#~ msgstr "au_open: mislukt" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: mislukt" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: mislukt" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: mislukt" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: failed" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: failed" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "kan taaldefinitie niet instellen op \"%s\", gebruikt wordt \"C\"" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Opdrachten:\n" +#~ "\t" + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "kan gebruikersnummer %u niet bufferen (%s), bestaat reeds" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "kan groepsnummer %u niet bufferen (%s), bestaat reeds" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "Kan niet dlopen %s: %s" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "kan %s niet uitvoeren: %s" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "invalid regex: %s" +#~ msgstr "ongeldige reguliere expressie: %s" diff --git a/plugins/sudoers/po/pl.mo b/plugins/sudoers/po/pl.mo new file mode 100644 index 0000000..4fd000a Binary files /dev/null and b/plugins/sudoers/po/pl.mo differ diff --git a/plugins/sudoers/po/pl.po b/plugins/sudoers/po/pl.po new file mode 100644 index 0000000..6c489fe --- /dev/null +++ b/plugins/sudoers/po/pl.po @@ -0,0 +1,3087 @@ +# Polish translation for sudo/sudoers. +# This file is put in the public domain. +# Jakub Bogusz , 2011-2020. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-17 20:30+0100\n" +"Last-Translator: Jakub Bogusz \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "błąd składni" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Hasło użytkownika %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] hasło użytkownika %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Hasło: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** informacje dotyczące BEZPIECZEŃSTWA dla %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Niestety, proszę spróbować ponownie." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "nie udało się przydzielić pamięci" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "skrót wymaga nazwy pliku" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "wartości \"CWD\" muszą zaczynać się od '/', '~' lub '*'" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "wartości \"CHROOT\" muszą zaczynać się od '/', '~' lub '*'" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "błąd składni, słowo zastrzeżone %s użyte jako nazwa aliasu" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "błędna wartość notbefore" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "błędna wartość notafter" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "wartość limitu czasu zbyt duża" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "błędna wartość limitu czasu" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "błąd wewnętrzny, przepełnienie %s" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "nie udało się wykonać dup na stdin: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "nie udało się wywołać %s: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "nie udało się wykonać fork" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "nie udało się wykonać fork: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "nie udało się otworzyć potoku: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (kontynuacja polecenia) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s istnieje, ale nie jest katalogiem (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "nie udało się wykonać mkdir %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nie udało się zmienić uprawnień %s na 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "nieoczekiwany JSON_STRING, otrzymano %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "brak podwójnego cudzysłowu w nazwie" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "oczekiwany JSON_OBJECT, otrzymano %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "brak klamry zamykającej" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "nieoczekiwana tablica" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "brak nawiasu zamykającego" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "nieoczekiwany łańcuch" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "brak dwukropka po nazwie" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "nieoczekiwana wartość logiczna" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "nieoczekiwana liczba" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u nie udało się przeanalizować \"%s\"" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: błędny plik logu" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: brak pola znacznika czasu" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: znacznik czasu %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: brak pola z użytkownikiem" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: brak pola z użytkownikiem runas" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: brak pola z grupą runas" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "błąd podczas czytania pliku czasu: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "błędna linia pliku czasu: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "log jest już kompletny, nie może być wznowiony" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "nie udało się wznownić logu" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "nie udało się otworzyć %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "brak pliku logu we/wy %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: nie udało przesunąć %zu w przód" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "nie udało się odnaleźć punktu wznowienia [%lld, %ld] w %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "błąd maszyny stanów" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "błędny AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "błąd analizy AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "błąd tworzenia logu we/wy" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "błąd logowania zdarzenia akceptacji" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "błędny RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "błąd analizy RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "błąd logowania zdarzenia odrzucenia" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "błędny AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "błąd analizy AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "błąd logowania zdarzenia alarmu" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "błąd protokołu" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "błąd zapisu IoBuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "błąd zapisu ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "błąd zapisu CommandSuspend" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "nie rozpoznany typ ClientMessage" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "komunikat klienta zbyt duży" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "nie udało się ustawić szyfrowania TLS 1.2 na %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "nie udało się ustawić szyfrowania TLS 1.3 na %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "nie udało się uzyskać metody serwera TLS: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "nie udało się utworzyć kontekstu TLS: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "nie udało się załadować certyfikatu %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "nie udało się załadować paczki certyfikatów CA %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "nie udało się załadować klucza prywatnego %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "nie udało się ustawić parametrów Diffie-Hellmana: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "nie udało się ustawić minimalnej wersji protokołu na TLS 1.2: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "nie udało się uzyskać zdalnego adresu IP" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Nie udało się dołączyć danych użytkownika do obiektu SSL: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "nie udało się dodać zdarzenia do kolejki" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "nie udało się ustanowić gniazda nasłuchującego" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - wysłanie logu we/wy sudo na zdalny serwer\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opcje:\n" +" -f, --file ścieżka do pliku konfiguracyjnego\n" +" -h, --help wyświetlenie opisu i zakończenie\n" +" -n, --no-fork bez wykonywania fork, działanie pierwszoplanowe\n" +" -R, --random-drop procentowe prawdopodobieństwo gubienia połączeń\n" +" -V, --version wyświetlenie informacji o wersji i zakończenie\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Wymagany Protobuf-C w wersji 1.3 lub wyższej" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "błędna wartość losowego gubienia: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s wersja %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS nie jest obsługiwany" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: nie jest pełną ścieżką" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d niedopasowany '[': %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s: %d błędna sekcja konfiguracji: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d błędna linia konfiguracji: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d oczekiwano nazwy sekcji: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "błędna wartość %s: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d nieznany klucz: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "nieznana wartość facility sysloga %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "nieznany priorytet sysloga %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opcje:\n" +" --help wyświetlenie opisu i zakończenie\n" +" -A, --accept samo wysłanie zdarzenia akceptującego (bez we/wy)\n" +" -h, --host host do wysyłania logów\n" +" -i, --iolog_id zdalny ID logu we/wy do wznowienia\n" +" -p, --port port do użycia przy łączeniu z hostem\n" +" -r, --restart wznowienie poprzedniego transferu logu we/wy\n" +" -R, --reject odrzucenie polecenia z podanego powodu\n" +" -b, --ca-bundle paczka certyfikatów do zweryfikowania certyfikatu serwera\n" +" -c, --cert plik certyfikatu do powitania TLS\n" +" -k, --key plik klucza prywatnego\n" +" -n, --no-verify bez weryfikowania certyfikatu serwera\n" +" -t, --test test serwera audytu przez wysłanie wybranego logu we/wy N razy równolegle\n" +" -V, --version wyświetlenie informacji o wersji i zakończenie\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "nie udało się wyszukać %s:%s: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "nie udało się uzyskać adresu IP serwera" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "nie udało się odczytać %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "komunikat klienta zbyt duży %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: bufor zapisu jest już w użyciu" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "nieoczekiwane zdarzenie we/wy %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: nieoczekiwany stan %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "błędne ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "odebrano od serwera komunikat błędu: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "odebrano od serwera komunikat zerwania: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "nie udało się rozpakować ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: nieoczekiwana wartość type_case %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "przekroczony limit czasu przy czytaniu z serwera" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "przedwczesny EOF" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "komunikat sewera zbyt duży: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "przekroczony limit czasu przy pisaniu do serwera" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "przekroczony limit czasu powitania TLS" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "nie udało się ustawić zdarzenia" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "Połączenie TLS nie powiodło się: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Nie udało się zainicjować kontekstu SSL: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Nie udało się przydzielić obiektu SSL: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Nie udało się dołączyć gniazda do obiektu SSL: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "muszą być podane jednocześnie punkt wznowienia i ID iolog" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "nie można ustawić punktu restartu, jeśli żadne we/wy nie jest wysyłane" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "zakończono przedwcześnie ze stanem %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "miniony czas wysłany do serwera [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "odebrano od serwera punkt zatwierdzenia [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias \"%s\" jest już zdefiniowany" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "nie udało się pobrać aktualnego czasu" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "nie udało się zmienić hasła dla %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "nie udało się uzyskać klasy logowania dla użytkownika %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "nie udało się rozpocząć uwierzytelnienia BSD" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "błędny rodzaj uwierzytelnienia" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "nie udało się zainicjować uwierzytelnienia BSD" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "konto wygasło" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "zezwolenie nie powiodło się" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "nie udało się odczytać konfiguracji fwtk" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "nie udało się połączyć z serwerem uwierzytelniającym" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "utracono połączenie z serwerem uwierzytelniającym" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"błąd serwera uwierzytelniającego:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: nie udało się przekształcić nazwy principal do łańcucha ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: nie udało się przeanalizować '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: nie udało się rozwiązać pamięci podręcznej danych uwierzytelniających: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: nie udało się przydzielić opcji: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: nie udało się pobrać danych uwierzytelniających: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: nie udało się zainicjować pamięci podręcznej danych uwierzytelniających: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: nie udało się zapisać danych uwierzytelniających w pamięci podręcznej: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: nie udało się pobrać nazwy principal dla hosta: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Nie można zweryfikować TGT! Możliwy atak!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "nie udało się zainicjować PAM: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Błąd uwierzytelniania PAM: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "błąd kontroli poprawności konta - konto zablokowane?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Konto lub hasło wygasło, należy ustawić ponownie hasło i spróbować jeszcze raz" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "nie udało się zmienić przedawnionego hasła: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Hasło wygasło, proszę skontaktować się z administratorem systemu" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Konto wygasło lub w konfiguracji PAM brak sekcji \"account\" dla sudo, proszę skontaktować się z administratorem systemu" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Błąd zarządzania kontem PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "nie istniejesz w bazie danych %s" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "nie udało się zainicjować biblioteki ACE API" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "nie udało się połączyć z serwerem SecurID" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "ID użytkownika zablokowany dla uwierzytelnienia SecurID" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "błędna długość nazwy użytkownika dla SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "błędny uchwyt uwierzytelnienia dla SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "błąd komunikacji SecurID" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "nieznany błąd SecurID" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "błędna długość hasła dla SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "nie udało się zainicjować sesji SIA" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "błędne metody uwierzytelniania" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "W sudo wkompilowano błędne metody uwierzytelniania! Nie można mieszać samodzielnych i niesamodzielnych sposobów uwierzytelniania." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "brak metod uwierzytelniania" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "W sudo nie wkompilowano żadnych metod uwierzytelniania! Aby wyłączyć uwierzytelnianie, proszę użyć opcji konfiguracyjnej --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Nie udało się zainicjować metod uwierzytelniania." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Metody uwierzytelniania:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Nie udało się określić warunku audytowego" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "nie udało się zatwierdzić rekordu audytowego" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Ufamy, że lokalny administrator udzielił odpowiedniego szkolenia.\n" +"Zwykle sprowadza się ono do tych trzech rzeczy:\n" +"\n" +" 1) należy respektować prywatność innych,\n" +" 2) należy myśleć przed pisaniem,\n" +" 3) z dużą władzą wiąże się duża odpowiedzialność.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "nieznany uid: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "nieznany użytkownik: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "zwiększenie rangi: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "początkowa ranga: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "wyrównanie rangi: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s, wersja gramatyki %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "nieobsługiwany format wejścia %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "nieobsługiwany format wyjścia %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: pliki wejściowy i wyjściowy muszą być różne" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "nie udało się zainicjować wartości domyślnych sudoers" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: nieznane słowo kluczowe: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "błędny typ wartości domyślnej: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "błędny typ ograniczenia: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "błędny filtr: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "nie udało się otworzyć %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "nie udało się przeanalizować pliku %s, nieznany błąd" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "błąd składni w %s w okolicy linii %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "błąd składni w %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "nie udało się zapisać do %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konwersja między formatami pliku sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opcje:\n" +" -b. --base=dn podstawowe DN do zapytań LDAP z sudo\n" +" -c, --config=plik_konf ścieżka do pliku konfiguracyjnego\n" +" -d, --defaults=typy konwersja Defaults tylko określonych typów\n" +" -e, --expand-aliases rozwinięcie aliasów w trakcie konwersji\n" +" -f, --output-format=format format wyjścia: JSON, LDIF lub sudoers\n" +" -i, --input-format=format format wejścia: LDIF lub sudoers\n" +" -I, --increment=liczba liczba, o jaką ma być zwiększane każde sudoOrder\n" +" -h, --help wyświetlenie pomocy i zakończenie\n" +" -m, --match=filtr konwersja tylko wpisów pasujących do filtra\n" +" -M, --match-local filtr dopasowania używający baz passwd i group\n" +" -o, --output=plik zapis skonwertowanego sudoers do pliku wyjciowego\n" +" -O, --order-start=liczba początkowa wartość pierwszego sudoOrder\n" +" -p, --prune-matches czyszczenie nie pasujących użytkowników, grup,\n" +" hostów\n" +" -P, --padding=num bazowe wyrównanie dla kroku sudoOrder\n" +" -s, --suppress=sekcje pominięcie wyjścia z podanych sekcji\n" +" -V, --version wyświetlenie informacji o wersji i zakończenie" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "nieznany wpis domyślny \"%s\"" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "nie udało się pobrać czasu GMT" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "nie udało się sformatować znacznika czasu" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "zbyt dużo wpisów sudoers, maksimum to %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "zmienna środowiskowa SUDOERS_BASE nie jest ustawiona i nie podano opcji -b." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Rodzaj komunikatu sysloga, jeśli syslog jest używany: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Priorytet komunikatu sysloga w przypadku udanego uwierzytelnienia: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Priorytet komunikatu sysloga w przypadku nieudanego uwierzytelnienia: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Umieszczenie zachęty OTP we własnej linii" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ignorowanie '.' w $PATH" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Wysyłanie listu zawsze przy uruchomieniu sudo" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Wysyłanie listu przy błędnym uwierzytelnieniu" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Wysyłanie listu jeśli użytkownik nie jest w sudoers" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Wysyłanie listu jeśli użytkownik nie jest w sudoers dla tego hosta" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Wysyłanie listu jeśli użytkownik nie ma prawa do uruchomienia polecenia" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Wysyłanie listu jeśli użytkownik próbuje uruchomić polecenie" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Użycie osobnego znacznika czasu dla każdej pary użytkownik/tty" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Poinstruowanie użytkownika przy pierwszym uruchomieniu sudo" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Plik zawierający instrukcję do sudo: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Domyślne wymaganie uwierzytelnienia przez użytkowników" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Możliwość uruchamiania sudo przez roota" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Logowanie nazwy hosta w pliku logu (niesyslogowym)" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Logowanie roku w pliku logu (niesyslogowym)" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Uruchomienie powłoki przy wywołaniu sudo bez argumentów" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Ustawianie $HOME na katalog użytkownika docelowego przy uruchamianiu powłoki z -s" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Ustawianie $HOME zawsze na katalog domowy użytkownika docelowego" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Zezwolenie na zbieranie niektórych informacji do przydatnych komunikatów błędów" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Wymaganie pełnych nazw hostów w pliku sudoers" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Lżenie użytkownika po podaniu błędnego hasła" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Możliwość uruchamiania sudo tylko z poziomu terminala" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Honorowanie zmiennej środowiskowej EDITOR przez visudo" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Pytanie o hasło roota zamiast hasła użytkownika" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pytanie o hasło użytkownika runas_default zamiast uruchamiającego" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pytanie o hasło użytkownika docelowego zamiast uruchamiającego" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Użycie ustawień domyślnych z klasy logowania użytkownika docelowego (jeśli są)" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Ustawianie zmiennych środowiskowych LOGNAME i USER" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Ustawianie na użytkownika docelowego tylko efektywnego uid-a, nie rzeczywistego uid-a" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Pomijanie inicjalizacji wektora grup na grupy użytkownika docelowego" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Długość, na której zawijać linie logu (0 bez zawijania): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Limit czasu znacznika uwierzytelniania (w minutach): %.1f" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Limit czasu pytania o hasło (w minutach): %.1f" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Liczba prób wpisania hasła: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Wartość umask lub 0777, aby użyć wartości użytkownika: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Ścieżka do pliku logu: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Ścieżka do programu mail: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Flagi dla programu mail: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adres, na który mają być wysyłane listy: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adres, z którego mają być wysyłane listy: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Temat wysyłanych listów: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Komunikat o błędnym haśle: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Ścieżka katalogu stanu instrukcji: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Ścieżka katalogu znaczników czasu uwierzytelniania: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Właściciel katalogu znaczników czasu uwierzytelniania: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Grupa, której użytkownicy są zwolnieni z wymagań dot. haseł i PATH: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Domyślne pytanie o hasło: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Czy passprompt ma być używane zamiast systemowego zapytania we wszystkich przypadkach" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Domyślny użytkownik do uruchamiania poleceń: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Wartość do podstawienia za $PATH użytkownika: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Ścieżka do edytora, który ma być używany przez visudo: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kiedy ma być wymagane hasło dla pseudopolecenia 'list': %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kiedy ma być wymagane hasło dla pseudopolecenia 'verify': %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Wczesne załadowanie biblioteki sudo_noexec, zastępującej funkcje exec" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Jeśli istnieje katalog LDAP, czy ignorować lokalny plik sudoers" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Deskryptory plików >= %d będą zamykane przed uruchomieniem polecenia" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Czy użytkownicy mogą zmieniać wartość \"closefrom\" opcją -C" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Zezwolenie użytkownikom na ustawianie dowolnych zmiennych środowiskowych" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Wyczyszczenie środowiska do domyślnego zbioru zmiennych" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Zmienne środowiskowe do sprawdzania bezpieczeństwa:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Zmienne środowiskowe do usunięcia:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Zmienne środowiskowe do zachowania:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Rola SELinuksa do używania w nowym kontekście bezpieczeństwa: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Typ SELinuksa do używania w nowym kontekście bezpieczeństwa: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Ścieżka do pliku środowiska specyficznego dla sudo: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Ścieżka do pliku ograniczonego środowiska specyficznego dla sudo: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Lokalizacja, jak ma być używana przy analizie pliku sudoers: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Zezwolenie sudo na pytanie o hasło nawet gdyby miało być widoczne" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Uwidocznienie wprowadzania hasła przez użytkownika w miarę wpisywania" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Użycie szybszych masek (glob) - mniej dokładnych, ale nie odwołujących się do systemu plików" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Wartość umask podana w sudoers ma zastąpić wartość użytkownika, nawet jeśli pozwala na więcej" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Logowanie wejścia użytkownika dla uruchamianych poleceń" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Logowanie wyjścia z uruchamianych poleceń" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Kompresja logów we/wy przy użyciu zliba" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Uruchamianie poleceń zawsze na pseudoterminalu" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Wtyczka do obsługi grup nieuniksowych: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Katalog do zapisu logów wejścia/wyjścia: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Plik do zapisu logu wejścia/wyjścia: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Dodawanie wpisu do pliku utmp/utmpx przy przydzielaniu pty" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Ustawianie użytkownika w utmp jako docelowego, nie wywołującego" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Zbiór dozwolonych uprawnień: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Zbiór ograniczonych uprawnień: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Uruchomienie poleceń na pseudoterminalu w tle" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nazwa usługi PAM do użycia: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nazwa usługi PAM do użycia dla powłok logowania: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Próba ustanowienia danych uwierzytelniających PAM dla użytkownika docelowego" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Utworzenie nowej sesji PAM dla uruchamianego polecenia" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Wykonanie zarządzania poprawnością konta PAM" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Maksymalny numer sekwencji logu we/wy: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Włączenie obsługi grup sieciowych w sudoers" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Sprawdzanie katalogów nadrzędnych pod kątem możliwości zapisu przy edycji plików programem sudoedit" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Podążanie za dowiązaniami symbolicznymi przy edycji programem sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Odpytanie wtyczki group pod kątem nieznanych grup systemowych" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Dopasowanie grup sieciowych w oparciu o całą krotkę: użytkownik, host i domena" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Zezwolenie na uruchamianie poleceń nawet jeśli sudo nie może pisać do logu audytowego" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Zezwolenie na uruchamianie poleceń nawet jeśli sudo nie może pisać do logu we/wy" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Zezwolenie na uruchamianie poleceń nawet jeśli sudo nie może pisać do pliku logu" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Rozwiązanie grup z sudoers i dopasowywanie po ID grupy zamiast nazwy" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Wpisy logu większe niż ta wartość będą dzielone na wiele wiadomości sysloga: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Użytkownik, który będzie właścicielem plików logu we/wy: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupa, która będzie właścicielem plików logu we/wy: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Uprawnienia dla plików logu we/wy: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Uruchomienie poleceń poprzez deskryptor pliku zamiast ścieżki: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorowanie nieznanych wpisów Defaults w sudoers zamiast ostrzeżenia" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Czas w sekundach, po którym polecenie będzie kończone: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Zezwolenie użytkownikowi na określenie limitu czasu z linii poleceń" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Natychmiastowy zrzut danych logu we/wy na dysk zamiast buforowania" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Dołączanie identyfikatora procesu przy logowaniu przez syslog" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Rodzaj rekordu znacznika czasu uwierzytelniania: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Komunikat błędu uwierzytelnienia: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Ignorowanie wielkości liter przy dopasowywaniu nazw użytkownika" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Ignorowanie wielkości liter przy dopasowywaniu nazw grup" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Logowanie kiedy polecenie jest dozwolone przez sudoers" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Logowanie kiedy polecenie jest zabronione przez sudoers" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Serwer(y) logów sudo do połączenia, z opcjonalnym portem" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Limit czasu serwera logów sudo w sekundach: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Włączenie opcji gniazda SO_KEEPALIVE na gnieździe połączonym z serwerem logów" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Ścieżka do pliku paczki CA serwera audytu: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Ścieżka do pliku certyfikatu sudoers: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Ścieżka do pliku klucza prywatnego sudoers: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Sprawdzenie poprawności certyfikatu serwera logów" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Zezwolenie na użycie nieznanego ID użytkownika i/lub grupy runas" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Zezwolenie na uruchamianie poleceń tylko jako użytkownik z prawidłową powłoką" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Ustawienie użytkownika zdalnego PAM na użytkownika uruchamiającego sudo" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Ustawienie hosta zdalnego PAM nazwę hosta lokalnego" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Katalog roboczy do zmiany przed uruchomieniem polecenia: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Katalog główny do zmiany przed uruchomieniem polecenia: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "Format logów do tworzenia: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: nieznany wpis domyślny \"%s\"" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: nieznany wpis domyślny \"%s\"" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: nie podano wartości dla \"%s\"" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nie podano wartości dla \"%s\"" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: opcja \"%s\" nie przyjmuje wartości" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: opcja \"%s\" nie przyjmuje wartości" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: błędny typ Defaults 0x%x dla opcji \"%s\"" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: błędny typ Defaults 0x%x dla opcji \"%s\"" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: błędna wartość \"%s\" dla opcji \"%s\"" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: błędna wartość \"%s\" dla opcji \"%s\"" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: wartości \"%s\" muszą zaczynać się od '/', '~' lub '*'" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: wartości \"%s\" muszą zaczynać się od '/', '~' lub '*'" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: wartości \"%s\" muszą zaczynać się od '/'" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: wartości \"%s\" muszą zaczynać się od '/'" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: uszkodzone envp, niezgodność długości" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "nie udało się przebudować środowiska" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "niestety nie jest dozwolone ustawianie następujących zmiennych środowiskowych: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "błąd składni w %s w okolicy linii %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "błąd składni w %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nieobsługiwany typ skrótu %d dla %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: błąd odczytu" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "właścicielem %s musi być uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "prawo zapisu do %s może mieć tylko właściciel" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "nie udało się załadować %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "nie udało się odnaleźć symbolu \"group_plugin\" w %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: niezgodna główna wersja wtyczki grup %d, oczekiwano %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "nie udało się przeanalizować adresu IP \"%s\"" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "nie udało się przeanalizować maski sieciowej \"%s\"" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Pary lokalnych adresów IP i masek:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "nieznana grupa: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "nie udało się uaktualnić pliku sekwencji" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "nie udało się zapisać do pliku logu we/wy: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "nie udało się utworzyć %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: błąd wewnętrzny, plik logu we/wy dla zdarzenia %d nie jest otwarty" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "nie udało się odczytać zegara" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: błąd wewnętrzny, błędny sygnał %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "brak obsługi starttls w przypadku użycia ldaps" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "nie udało się zainicjować bazy certyfikatów i kluczy SSL: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "aby używać SSL, trzeba ustawić TLS_CERT w %s" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "nie udało się zainicjować LDAP: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "wybrano start_tls, ale biblioteki LDAP nie obsługują ldap_start_tls_s() ani ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "błędny atrybut sudoOrder: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: za duży numer portu" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nieobsługiwany rodzaj URI LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "nie można mieszać URI ldap i ldaps" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "nie można skonwertować sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "nie udało się otworzyć systemu audytowego" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "nie udało się wysłać komunikatu audytowego" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "błąd w pętli zdarzeń" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Utworzenie nowego obiektu SSL_CTX nie powiodło się: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "Połączenie TLS do %s:%s nie powiodło się: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "Inicjowanie TLS nie powiodło się" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "Powitanie TLS nie powiodło się" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: błąd wewnętrzny, błędny kod wyjścia %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "utracono połączenie z serwerem logów" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "brak bufora zapisu" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "nie udało się połączyć z serwerem logów" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "użytkownik NIE występuje w sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "użytkownik NIE jest autoryzowany na hoście" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "polecenie niedozwolone" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nie występuje w pliku sudoers. Ten incydent zostanie zgłoszony.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nie ma uprawnień do uruchamiania sudo na %s. Ten incydent zostanie zgłoszony.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Niestety użytkownik %s nie może uruchamiać sudo na %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Niestety użytkownik %s nie ma uprawnień do uruchamiania '%s%s%s' jako %s%s%s na %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: nie znaleziono polecenia" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"zignorowano plik \"%s\" znaleziony w '.'\n" +"Proszę użyć \"sudo ./%s\", jeśli to \"%s\" ma być uruchomiony." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u błędna próba wprowadzenia hasła" +msgstr[1] "%u błędne próby wprowadzenia hasła" +msgstr[2] "%u błędnych prób wprowadzenia hasła" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "błąd uwierzytelniania" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "wymagane jest hasło" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "nie udało się otworzyć pliku logu: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "nie udało się zapisać pliku logu: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "skrót dla %s (%s) nie jest w postaci %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Rola LDAP: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Wpis sudoers:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " Jako użytkownicy: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " Jako grupy: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Opcje: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Polecenia:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Pasujące wpisy Defaults dla %s na %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Wartości specyficzne dla Runas i Command dla %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Użytkownik %s może uruchamiać na %s następujące polecenia:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Użytkownik %s nie ma uprawnień do uruchamiania sudo na %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "zignorowano niekompletne sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "błędny atrybut LDIF: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "błędna wartość %.*s ustawiona przez frontend sudo" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "nie udało się przeanalizować listy adresów sieciowych" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "nazwa użytkownika nie ustawiona przez frontend sudo" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "ID użytkownika nie ustawiony przez frontend sudo" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "ID grupy nie ustawiony przez frontend sudo" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "nazwa hosta nie ustawiona przez frontend sudo" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "błędny katalog roboczy: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "błędny katalog chroot: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "nie udało się wywołać %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Wersja wtyczki polityki sudoers %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Wersja gramatyki pliku sudoers %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Ścieżka do sudoers: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "ścieżka do nsswitch: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ścieżka do ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ścieżka do ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "nie udało się zarejestrować uchwytu typu %d (wersja %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "nie udało się zapamiętać uid-a %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "nie udało się zapamiętać uid-a %u, już istnieje" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "nie udało się zapamiętać użytkownika %s" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "nie udało się zapamiętać użytkownika %s, już istnieje" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "nie udało się zapamiętać gid-a %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "nie udało się zapamiętać gid-a %u, już istnieje" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "nie udało się zapamiętać grupy %s" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "nie udało się zapamiętać grupy %s, już istnieje" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "nie udało się zapamiętać listy grup dla %s, już istnieje" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "nie udało się zapamiętać listy grup dla %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "nie udało się przeanalizować grup dla %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "nie udało się przeanalizować gidów dla %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "przepełnienie stosu uprawnień" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "niedopełnienie stosu uprawnień" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "nie udało się zmienić na gid roota" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "nie udało się zmienić na docelowy gid" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "nie udało się ustawić wektora grup docelowych" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "nie udało się zmienić na docelowy uid" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "nie udało się zmienić na gid sudoers" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "zbyt dużo procesów" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "nie udało się pobrać bieżącego katalogu roboczego" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "ucięta ścieżka audytu user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "ucięta ścieżka audytu argv[0]: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "nie udało się zainicjować źródła SSS. Czy SSSD jest zainstalowany na tej maszynie?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nie udało się odnaleźć symbolu \"%s\" w %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "problem z wpisami domyślnymi" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "nie znaleziono poprawnych źródeł sudoers, zakończenie" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "użytkownik nie ma uprawnień do zmiany katalogu głównego na %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "brak uprawnień do używania opcji -R z %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "użytkownik nie ma uprawnień do zmiany katalogu na %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "brak uprawnień do używania opcji -D z %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "wg sudoers root nie ma prawa używać sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "użytkownik nie ma pozwolenia na zmianę limitu closefrom" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "brak uprawnień do używania opcji -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "właściciel znacznika czasu (%s): nie ma takiego użytkownika" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "brak tty" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "niestety do uruchomienia sudo konieczny jest tty" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "błędna powłoka użytkownika %s: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "polecenie w bieżącym katalogu" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "użytkownik nie ma uprawnień do ustawienia limitu czasu polecenia" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "niestety brak uprawnień do ustawienia limitu czasu polecenia" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "użytkownik nie ma uprawnień do zachowania środowiska" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "niestety brak uprawnień do zachowania środowiska" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "polecenie zbyt długie" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit nie musi być uruchamiany przez sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "nie udało się odczytać %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "nie udało się wykonać stat na %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nie jest zwykłym plikiem" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "właścicielem %s jest uid %u, powinien być %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s jest zapisywalny dla świata" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "właścicielem %s jest gid %u, powinien być %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "tylko root może używać \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "nieznana klasa logowania: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "nie udało się rozwiązać nazwy hosta %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "błędna opcja filtra: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "błędny maksymalny czas oczekiwania: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "błędny współczynnik szybkości: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/czas: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Odtwarzanie sesji sudo: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "nie udało się przestawić tty w tryb surowy" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Uwaga: ten terminal jest za mały, aby właściwie odtworzyć log.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Geometria logu to %d x %d, geometria terminala to %d x %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Odtwarzanie zakończone, proszę nacisnąć dowolny klawisz, aby odzyskać terminal." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "niejednoznaczne wyrażenie \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "niesparowany ')' w wyrażeniu" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "nieznany warunek wyszukiwania \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s wymaga argumentu" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "błędne wyrażenie regularne: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "nie udało się przeanalizować daty \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "niesparowany '(' w wyrażeniu" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "niedozwolone kończące \"or\"" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "niedozwolony kończący \"!\"" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "nieznany typ wyszukiwania %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "Składnia: %s [-hnRS] [-d katalog] [-m liczba] [-s wsp_szybkości] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "Składnia: %s [-h] [-d katalog] -l [wyrażenie wyszukiwania]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - odtwarzanie logów sesji sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opcje:\n" +" -d, --directory=kat podanie katalogu na logi sesji\n" +" -f, --filter=filtr określenie rodzaju we/wy do wyświetlania\n" +" -h, --help wyświetlenie opisu i zakończenie\n" +" -l, --list lista dostępnych ID sesji pasujących do wyrażenia\n" +" -m, --max-wait=ile maksymalna liczba sekund oczekiwania między zdarzeniami\n" +" -n, --non-interactive bez zapytań, wysłanie sesji na standardowe wyjście\n" +" -R, --no-resize bez próby zmiany rozmiaru terminala\n" +" -S, --suspend-wait oczekiwanie w czasie zawieszenia polecenia\n" +" -s, --speed=ile przyspieszenie lub spowolnienie wyjścia\n" +" -V, --version wyświetlenie informacji o wersji i zakończenie" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\thost nie znaleziony" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Polecenie dozwolone" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Polecenie niedozwolone" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Polecenie nie znalezione" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s jest zapisywalny dla groupy" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "nie udało się uciąć pliku znacznika czasu do długości %lld" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "znacznik czasu zbyt daleko w przyszłości" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "znacznik czasu zbyt daleko w przyszłości: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "nie udało się zablokować pliku znacznika czasu %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "ścieżka stanu instrukcji zbyt długa: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit nie powinien być podawany ze ścieżką" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "opcja -x będzie usunięta w kolejnej wersji" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "należy rozważyć użycie zamiast niej narzędzia cvtsudoers" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "wciśnięcie return przejdzie do edycji %s: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "podany edytor (%s) nie istnieje" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nie znaleziono edytora (ścieżka = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "błąd zapisu" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "nie udało się wykonać stat na pliku tymczasowym (%s), %s nie zmieniony" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "plik tymczasowy (%s) zerowej długości, %s nie zmieniony" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "błąd edytora (%s), %s nie zmieniony" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s nie zmieniony" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "nie udało się ponownie otworzyć pliku tymczasowego (%s), %s nie zmieniony." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "nie udało się przeanalizować pliku tymczasowego (%s), nieznany błąd" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "błąd wewnętrzny, nie znaleziono %s na liście!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "nie udało się ustawić (uid, gid) %s na (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s i %s nie są na tym samym systemie plików, użycie mv do zmiany nazwy" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "polecenie nie powiodło się: '%s %s %s', %s nie zmieniony" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "błąd podczas zmiany nazwy %s, %s nie zmieniony" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Co teraz? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Możliwe opcje:\n" +" (e) ponowna edycja pliku sudoers\n" +" (x) wyjście bez zapisu zmian do pliku sudoers\n" +" (Q) wyjście i zapisanie zmian w pliku sudoers (NIEBEZPIECZNE!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "nie udało się uruchomić %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: błędny właściciel, (uid, gid) powinny wynosić (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: błędne uprawnienia, powinny być 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: składnia poprawna\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s zajęty, proszę spróbować później" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "nie udało się zablokować %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Modyfikować mimo to? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Błąd: %s:%d:%d: cykl w %s \"%s\"" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Uwaga: %s:%d:%d: cykl w %s \"%s\"" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Błąd: %s:%d:%d: %s \"%s\" użyty, ale nie zdefiniowany" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Uwaga: %s:%d:%d: %s \"%s\" użyty, ale nie zdefiniowany" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Uwaga: %s:%d:%d: nie użyty %s \"%s\"" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - bezpieczna edycja pliku sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opcje:\n" +" -c, --check tryb wyłącznie sprawdzający\n" +" -f, --file=sudoers określenie położenia pliku sudoers\n" +" -h, --help wyświetlenie opisu i zakończenie\n" +" -q, --quiet mniej obszerne komunikaty o błędach składni\n" +" -s, --strict ścisłe sprawdzanie składni\n" +" -V, --version wyświetlenie informacji o wersji i zakończenie\n" + +#: toke.l:179 +msgid "empty string" +msgstr "pusty łańcuch" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "pusta grupa" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "pusta grupa sieciowa" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "błędna kontynuacja linii" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "błędny adres IPv6" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "nieoczekiwany koniec linii w łańcuchu" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "za dużo poziomów include" diff --git a/plugins/sudoers/po/pt.mo b/plugins/sudoers/po/pt.mo new file mode 100644 index 0000000..e6c36f5 Binary files /dev/null and b/plugins/sudoers/po/pt.mo differ diff --git a/plugins/sudoers/po/pt.po b/plugins/sudoers/po/pt.po new file mode 100644 index 0000000..694df6a --- /dev/null +++ b/plugins/sudoers/po/pt.po @@ -0,0 +1,3166 @@ +# Portuguese (Portugal) translation for the sudoers package. +# Copyright (C) 2018 Free Software Foundation, Inc. +# This file is distributed under the same license as the sudo package. +# Todd C. Miller , 2011-2018 +# Pedro Albuquerque , 2018, 2019, 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-18 07:00+0000\n" +"Last-Translator: Pedro Albuquerque \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Geany / PoHelper 1.37\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "erro de sintaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "senha de %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] senha para %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Senha: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informação de SEGURANÇA para %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Enganou-se, tente de novo." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "impossível alocar memória" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "um resumo requer um nome de caminho" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "valores para \"CWD\" têm de começar por '/', '~' ou '*'" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "valores para \"CHROOT\" têm de começar com \"/\", \"~\" ou \"*\"" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "erro de sintaxe, palavra reservada %s utilizada como nome aliás" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "valor notbefore inválido" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "valor notafter inválido" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "valor de inacção muito grande" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "valor de inacção inválido" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "erro interno, transporte %s" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "impossível duplicar stdin: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "impossível executar %s: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "impossível bifurcar" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "impossível bifurcar: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "impossível abrir túnel: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (comando continuado) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existe mas não é uma pasta (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "impossível criar pasta %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "impossível alterar o modo de %s para 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "esperado JSON_STRING, obtido %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "aspas dupla em falta no nome" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "esperado JSON_OBJECT, obtido %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "chaveta esquerda sem par" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "matriz inesperada" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "parêntese recto sem par" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "cadeia inesperada" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "dois pontos em falta após o nome" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "booleano inesperado" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "número inesperado" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u impossível analisar \"%s\"" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ficheiro de diário inválido" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: campo de datação em falta" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: datação %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: campo de utilizador em falta" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: campo de utilizador runas em falta" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: campo de grupo runas em falta" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "erro ao ler ficheiro de temporização: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "linha de ficheiro de temporização inválida : %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "diário já concluído, impossível reiniciar" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "impossível reiniciar o diário" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "impossível abrir %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "ficheiro de diário E/S %s/%s em falta" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: impossível procurar adiante %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "impossível localizar ponto de continuação [%lld, %ld] em %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "erro da máquina de estado" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "AcceptMessage inválida" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "erro ao analisar AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "erro ao criar diário de E/S" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "erro ao registar evento de aceitação" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "RejectMessage inválida" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "erro ao analisar RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "erro ao registar evento de rejeição" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "AlertMessage inválida" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "erro ao analisar AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "erro ao registar evento de alerta" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "erro de protocolo" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "erro ao escrever IObuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "erro ao escrever ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "erro ao escrever CommandSuspend" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "tipo de ClientMessage não reconhecido" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "mensagem do cliente muito grande" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "impossível definir TLS 1.2 ciphersuite como %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "impossível definir TLS 1.3 ciphersuite como %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "impossível obter método TLS do servidor: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "impossível criar contexto TLS: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "impossível carregar certificado %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "Impossível carregar pacote da autoridade do certificado %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "impossível carregar chave privada %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "impossível definir parâmetros diffie-hellman: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "impossível definir versão mínima do protocolo como TLS 1.2: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "impossível obter endereço IP remoto" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "impossível anexar dados do utilizador ao objecto ssl: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "impossível adicionar evento à fila" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "impossível definir o socket de escuta" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - enviar diário sudo E/S para o servidor remoto\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opções:\n" +" -f, --file caminho para o ficheiro de configuração\n" +" -h --help mostrar a mensagem de ajuda e sair\n" +" -n, --no-fork não bifurcar, executar em 2º plano\n" +" -R, --random-drop percentagem de hipóteses das ligações caírem\n" +" -V, --version mostrar informação da versão e sair\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Requerida a versão Protobuf-C 1.3 ou superior" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "valor de queda aleatório inválido: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s versão %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS não suportado" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: não é um caminho completamente qualificado" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d \"[\" sem par: %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d secção de configuração inválida: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d linha de configuração inválida: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d esperado um nome de secção: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "valor inválido para %s: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d chave desconhecida: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "facilidade syslog desconhecida %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "prioridade syslog desconhecida %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opções:\n" +" --help mostrar a mensagem de ajuda e sair\n" +" -A, --accept enviar só um evento de aceitação (sem E/S)\n" +" -h, --host anfitrião a quem enviar os diários\n" +" -i, --iolog_id ID remota do diário de E/S a resumir\n" +" -p, --port porta a usar ao ligar ao anfitrião\n" +" -r, --restart reiniciar a transferência de diário de E/S prévia\n" +" -R, --reject rejeitar o comando com o motivo dado\n" +" -b, --ca-bundle ficheiro de pacote de certificados para comparar com o do servidor\n" +" -c, --cert ficheiro de certificado para o handshake TLS\n" +" -k, --key ficheiro de chave privada\n" +" -n, --no-verify não verificar o certificado do servidor\n" +" -t, --test testar servidor de auditoria enviando o diário de E/S seleccionado n vezes em paralelo\n" +" -V, --version mostrar informação da versão e sair\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "impossível procurar %s:%s: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "impossível obter endereço IP do servidor" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "impossível ler %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "mensagem do cliente muito grande: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: buffer de escrita já em uso" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "evento de E/S %d inesperado" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: estado %d inesperado" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "ServerHello inválido" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "recebida mensagem de erro do servidos: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "recebida mensagem de aborto do servidos: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "impossível desempacotar ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: valor type_case %d inesperado" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "leitura do servidor expirou" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "EOF prematuro" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "mensagem do servidor muito grande: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "escrita no servidor expirou" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "handshake TLS expirou" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "impossível definir o evento" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "falha na ligação TLS: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "impossível inicializar contexto ssl: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Impossível alocar objecto ssl: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Impossível anexar socket ao objecto ssl: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "tem de especificar o ponto de reinício e a ID iolog" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "impossível definir um ponto de reinício sem E/S enviada" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "saída prematura com o estado %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "tempo decorrido de envio para o servidor [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "ponto de submissão recebido do servidor [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Aliás \"%s\" já definido" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "impossível obter hora do dia" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "impossível alterar a senha para %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "impossível obter classe de sessão para o utilizador %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "impossível iniciar autenticação bsd" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "tipo de autenticação inválido" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "impossível inicializar autenticação BSD" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "a sua conta expirou" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "aprovação falhou" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "impossível ler fwtk config" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "impossível ligar ao servidor de autenticação" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "ligação ao servidor de autenticação perdida" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"erro no servidor de autenticação:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: impossível converter principal para cadeia (\"%s\"): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: impossível analisar \"%s\": %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: impossível resolver cache de credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: impossível alocar opções: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: impossível obter credentiais: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: impossível inicializar a cache de credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: impossível armazenar a credencial em cache: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: impossível obter o principal do anfitrião: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Impossível verificar TGT! Possível ataque!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "impossível inicializar PAM: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "erro de autenticação PAM: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "falha na validação de conta, tem a conta trancada?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Conta ou senha expiradas, reponha a sua senha e tente novamente" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "impossível alterar senha expirada: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Senha expirada, contacte o administrador do sistema" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Conta expirada ou configuração PAM sem secção \"account\" para sudo, contacte o administrador do sistema" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Erro de gestão de conta PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "utilizador não existente na base de dados %s" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "falha ao inicializar a biblioteca ACE API" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "impossível contactar o servidor SecurID" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "ID de utilizador bloqueada para autenticação SecurID" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "tamanho de nome de utilizador inválido para SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "gestão de autenticação inválida para SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "falha na comunicação SecurID" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "erro SecurID desconhecido" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "tamanho de senha inválido para SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "impossível inicializar sessão SIA" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "métodos de autenticação inválidos" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Métodos de autenticação inválidos compilados com sudo! Não pode misturar autenticação independente com outra." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "sem métodos de autenticação" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Não há métodos de autenticação compilados com sudo! Se pretende desligar a autenticação. use a opção de configuração --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Impossível inicializar métodos de autenticaçao." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Métodos de autenticação:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Impossível determinar condição de auditoria" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "impossível submeter registo de auditoria" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Acreditamos que recebeu a lição de moral do administrador de\n" +"sistema local. Normalmente resume-se a estes três pontos:\n" +"\n" +" 1) respeite a privacidade dos outros;\n" +" 2) pense antes de escrever;\n" +" 3) lembre-se que com grande poder vem grande responsabilidade.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "uid desconhecida: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "utilizador desconhecido: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "incremento de ordem: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordem inicial: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "espaço de ordem: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s versão gramatical %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "formato de entrada %s não suportado" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "formato de saída %s não suportado" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: os ficheiros de entrada e saída têm de ser diferentes" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "impossível inicializar valores predefinidos de sudoers" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: palavra-chave desconhecida: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "tipo de predefinições inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "tipo de supressão inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "filtro inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "impossível abrir %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "falha ao analisar o ficheiro %s, erro desconhecido" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "erro de análise em %s, perto da linha %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "erro de análise em %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "impossível escrever em %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - converte entre formatos de ficheiros sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opções:\n" +" -b, --base=dn o DN base para consultas sudo LDAP\n" +" -c, --config=fich_conf o caminho para o ficheiro de configuração\n" +" -d, --defaults=tipopred só converte predefinições do tipo especificado\n" +" -e, --expand-alias expande aliás ao converter\n" +" -f, --output-format=formato define o formato de saída: JSON, LDIF ou sudoers\n" +" -i, --input-format=formato define o formato de entrada: LDIF ou sudoers\n" +" -I, --increment=número valor a incrementar cada sudoOrder\n" +" -h, --help mostra a ajuda e sai\n" +" -m, --match=filtro só converte entradas que cumpram o filtro\n" +" -M, --match-local filtro de comparação usa bases de dados de senha e grupo\n" +" -o, --output=fich_saída escreve sudoers convertidos em fich_saída\n" +" -O, --order-start=número ponto inicial para o primeiro sudoOrder\n" +" -p, --prune-matches poda utilizadores, grupos e anfitriões não-correspondentes\n" +" -P, --padding=num espaço base para incremento sudoOrder\n" +" -s, --suppress=secções suprime saída de certas secções\n" +" -V, --version mostra informação da versão e sai" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "entrada de predefinições \"%s\" desconhecida" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "impossível obter hora GMT" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "impossível formatar datação" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "demasiadas entradas sudoers, máximo %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "a variável de ambiente SUDOERS_BASE não está definida e a opção -b não foi especificada." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Facilidade syslog se syslog estiver a ser usado para início de sessão: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Prioridade syslog a usar quando o utilizador se autentica com sucesso: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Prioridade syslog a usar quando o utilizador não se autentica com sucesso: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Põe o prompt OPT na sua própria linha" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ignora \".\" em $PATH" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Envia sempre correio quando executa sudo" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Envia correio se a autenticação do utilizador falhar" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Envia correio se o utilizador não estiver em sudoers" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Envia correio se o utilizador não estiver em sudoers neste anfitrião" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Envia correio se o utilizador não puder executar um comando" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Envia correio se o utilizador tentar executar um comando" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Usa uma datação separada para cada par utilizador/tty" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Avisar o utilizador a primeira vez que executa sudo" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Ficheiro com a lição de moral sudo: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Requer autenticação dos utilizadores por predefinição" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Root pode executar sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Regista o nome de anfitrião no diário (não-syslog)" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Regista o ano no diário (não-syslog)" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Se sudo for chamado sem argumentos, iniciar uma shel" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Definir $HOME para o utilizador alvo ao iniciar uma shell com -s" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Definir $HOME sempre como a pasta home do utilizador alvo" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permite a recolha de alguma informação para dar mensagens de erro úteis" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Requer nomes de anfitrião completamente qualificados no ficheiro sudoers" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulta o utilizador quando se engana na senha" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Permitir ao utilizador a execução de sudo só se tiver tty" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo honra a variável de ambiente EDITOR" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Pedir senha root, não a do utilizador" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pedir a senha de utilizador runas_default, não a do utilizador" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pedir a senha do utilizador alvo, não a do utilizador" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Aplica predefinições à classe de sessão do utilizador alvo, se existir" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Define as variáveis de ambiente LOGNAME e USER" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Definir a uid efectiva só para o utilizador alvo, não a uid real" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Não inicializar o vector de grupo para o do utilizador alvo" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Tamanho máximo de linhas longas do diário (0 para não quebrar): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Expiração da datação de autenticação: %.1f minutos" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Expiração do pedido de senha: %.1f minutos" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Número de tentativas de inserção de senha: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask a usar ou 0777 para usar a do utilizador: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Caminho para o ficheiro de diário: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Caminho para o programa de correio: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Bandeiras para o programa de correio: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Endereço para onde enviar o correio: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Endereço de onde enviar o correio: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Linha de assunto para as mensagens: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Mensagem de senha incorrecta: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Caminho para a pasta de estado da lição de moral: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Caminho para a pasta de datação de autenticação: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Dono da pasta de datação de autenticação: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Utilizadores deste grupo estão dispensados de usar senhas e necessidades de PATH: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Pedido de senha predefinido: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Se definido, o pedido de senha sobrepõe-se ao prompt do sistema em qualquer caso." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Utilizador predefinido para executar comandos: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valor a sobrepor a $PATH: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Caminho para o editor a usar com visudo: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quando pedir uma senha para o pseudo-comando \"list\": %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quando pedir uma senha para o pseudo-comando \"verify\": %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Pré-carregar a biblioteca sudo_noexec, que substitui as funções executáveis" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Se a pasta LDAP está em cima, ignoramos o ficheiro sudoers" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Descritores de ficheiro >= %d será fechado antes de executar um comando" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Se definido, os utilizadores podem sobrepor o valor de \"closefrom\" com a opção -C" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permite aos utilizadores definir variáveis de ambiente arbitrárias" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Repor o ambiente num conjunto predefinido de variáveis" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Variáveis de ambiente para verificar a segurança:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Variáveis de ambiente para remover:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Variáveis de ambiente para preservar:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Papel SELinux a usar no novo contexto de segurança: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Tipo SELinux a usar no novo contexto de segurança: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Caminho para o ficheiro de ambiente específico do sudo: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Caminho para o ficheiro restrito de ambiente específico do sudo: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Idioma a usar ao analisar sudoers: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permite ao sudo pedir uma senha mesmo que fique visível" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Fornece resposta visual no pedido de senha quando há entrada do utilizador" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Usa globbing mais rápido e menos preciso, mas não acede ao sistema de ficheiros" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "A umask especificada no sudoers sobrepõe-se à do utilizador, mesmo que seja mais permissiva" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Regista as entradas do utilizador para o comando em execução" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Regista a saída do comando em execução" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Comprime diários de E/S com zlib" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Executa sempre os comandos num pseudo-tty" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Extensão para suporte de grupo não-Unix: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Pasta onde armazenar os diários de entrada/saída: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Ficheiro onde armazenar o diário de entrada/saída: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Adiciona uma entrada ao ficheiro utmp/utmpx ao alocar um pty" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Define o utilizador em utmp como utilizador runas mestre, não como utilizador chamador" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Conjunto de privilégios permitidos: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Conjunto de privilégios limite: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Executa comandos num pty em 2º plano" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nome de serviço PAM a usar: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nome de serviço PAM a usar para shells de sessão: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tenta estabelecer credenciais PAM para o utilizador alvo" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Cria uma nova sessão PAM onde o comando será executado" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Realizar gestão de validação de conta PAM" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Número de sequência máximo do diário de E/S: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Activa o suporte a sudoers netgroup" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Verifica se as pastas-mãe se podem escrever ao editar ficheiros com sudoedit" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Segue ligações simbólicas ao editar ficheiros com sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Consulta a extensão de grupo para grupos de sistema desconhecidos" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Compara netgroups baseado em todo o conjunto: utilizador, anfitrião e domínio" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permite executar comandos mesmo que o sudo não possa escrever no diário de auditoria" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permite executar comandos mesmo que o sudo não possa escrever no diário de E/S" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permite executar comandos mesmo que o sudo não possa escrever no diário" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Resolve grupos no sudoers e compara a ID de grupo, não o nome" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Entradas de diário maiores que este valor serão divididas em múltiplas mensagens de syslog: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Utilizador que será dono dos ficheiros de E/S: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupo que será dono dos ficheiros de E/S: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Modo de ficheiro a usar para os ficheiros de E/S: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Executa comandos por descritor de ficheiro em vez de por caminho: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignora entradas Defaults desconhecidas no sudoers, em vez de produzir um aviso" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tempo em segundos após o qual cada comando será terminado: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permite ao utilizador especificar um tempo de inacção na linha de comandos" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Despejar dados de E/S para o disco imediatamente, em vez de usar um buffer" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Incluir a ID de processo ao registar via syslog" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipo de registo de datação de autenticação: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Mensagem de falha na autenticação: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Ignorar maiúsculas ao comparar nomes de utilizadores" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Ignorar maiúsculas ao comparar nomes de grupos" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Registar um comando permitido por sudoers" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Registar um comando negado por sudoers" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Servidor(es) de diários sudo aos quais ligar com a porta opcional" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Expiração do servidor de diários sudo em segundos: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Activar a opção de socket SO_KEEPALIVE no socket ligado ao servidor de diários" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Caminho para o ficheiro de pacote de CA do servidor de auditoria: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Caminho para o ficheiro de certificado de sudoers: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Caminho para o ficheiro de chave privada de sudoers: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Verifique se o certificado do servidor de registos é válido" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Permitir o uso de runas desconhecidas e/ou ID de grupo" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Permitir só executar comandos como utilizador com shell válida" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Definir o utilizador remoto pam como o utilizador a executar sudo" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Definir o anfitrião remoto pam como o nome do anfitrião local" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "pasta de trabalho a alterar antes de executar o comando: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "pasta raiz a alterar antes de executar o comando: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "O formato de diários a produzir: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: entrada pré-definida desconhecida \"%s\"" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s entrada defaults desconhecida \"%s\"" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: sem valor especificado para \"%s\"" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s sem valor especificado para \"%s\"" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: opção \"%s\" não recebe valores" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s opção \"%s\" não recebe valores" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: tipo Defaults 0x%x inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s tipo Defaults 0x%x inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: valor \"%s\" é inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s valor \"%s\" é inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: valores para \"%s\" têm de começar com \"/\", \"~\" ou \"*\"" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: valores para \"%s\" têm de começar com \"/\", \"~\" ou \"*\"" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: valores para \"%s\" têm de começar com \"/\"" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s valores para \"%s\" têm de começar com \"/\"" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp corrompido, tamanho trocado" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "impossível reconstruir o ambiente" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "desculpe, não tem permissão para definir as seguintes variáveis de ambiente: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "erro de análise em %s perto da linha %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "erro de análise em %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tipo de resumo %d não suportado para %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: erro de leitura" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s tem de ser propriedade de uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s só pode ter permissão de escrita para o dono" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "impossível carregar %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "impossível encontrar o símbolo \"group_plugin\" em %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: versão principal de extensão de grupo %d incompatível, esperada %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "impossível analisar endereço IP \"%s\"" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "impossível analisar netmask \"%s\"" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Pares endereço IP local e netmask:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "grupo desconhecido: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "impossível actualizar o ficheiro de sequência" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "impossível escrever no ficheiro de E/S: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "impossível criar %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: erro interno, ficheiro de diário E/S do evento %d não aberto" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "impossível ler o relógio" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: erro interno, sinal inválido %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls não suportado quando usa ldaps" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "impossível inicializar certificado SSL e db de chave: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "tem de definir TLS_CERT em %s para usar SSL" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "impossível inicializar LDAP: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls especificado mas LDAP libs não suporta ldap_start_tls_s() ou ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "atributo sudoOrder inválido: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: porta muito grande" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tipo de uri LDAP não suportado: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "impossível misturar URIs ldap e ldaps" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "impossível converter sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "impossível abrir o sistema de auditoria" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "impossível enviar mensagem de auditoria" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "erro no ciclo do evento" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Falha ao criar o novo objecto SSL_CTX: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "Ligação TLS a %s:%s falhou: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "Inicialização TLS sem sucesso" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "handshake TLS sem sucesso" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: erro interno, sinal de saída %d inválido" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "ligação ao servidor de diários perdida" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "buffer de escrita em falta" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "impossível ligar ao servidor de diários" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "utilizador NÃO está no sudores" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "utilizador NÃO autorizado no anfitrião" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "comando não permitido" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s não está no ficheiro sudoers. O incidente será reportado.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s não tem permissão para executar sudo em %s. O incidente será reportado.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Desculpe, %s não pode executar sudo em %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Desculpe, %s não tem permissão para executar \"%s%s%s\" como %s%s%s em %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: comando não encontrado" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"a ignorar \"%s\" encontrado em \".\"\n" +"Use \"sudo ./%s\" se este é o \"%s\" que deseja executar." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u tentativa incorrecta" +msgstr[1] "%u tentativas incorrectas" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "falha de autenticação" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "é necessária uma senha" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "impossível abrir o diário: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "impossível escrever o diário: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "resumo para %s (%s) não está na forma %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Papel LDAP: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Entrada sudoers:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Opções: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Comandos:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Entradas Defaults correspondentes para %s em %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Predefinições Runas específicas de comandos para %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "O utilizador %s pode executar os seguintes comandos em %s:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "O utilizador %s não tem permissão para executar sudo em %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "a ignorar sudoRole incompleto: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "atributo LDIF inválido: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s inválido definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "impossível analisar a lista de endereços da rede" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "nome de utilizador não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "ID de utilizador não definida pelo front-end do sudo" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "ID de grupo não definida pelo front-end do sudo" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "Nome de anfitrião não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "pasta de trabalho inválida: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "pasta chroot inválida: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "impossível executar %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Extensão de política sudoers versão %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Gramática do ficheiro sudoers versão %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Caminho do sudoers: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "caminho nsswitch: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "caminho do ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "caminho do ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "impossível registar hook do tipo %d (versão %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "impossível guardar uid %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "impossível guardar uid %u, já existe" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "impossível guardar utilizador %s" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "impossível guardar utilizador %s, já existe" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "impossível guardar gid %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "impossível guardar gid %u, já existe" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "impossível guardar grupo %s" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "impossível guardar grupo %s, já existe" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "impossível guardar lista de grupo para %s, já existe" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "impossível guardar lista de grupos para %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "impossível analisar grupos para %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "impossível analisar gids para %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "transporte de pilha perm" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "importe de pilha perm" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "impossível mudar para gid root" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "impossível mudar para gid runas" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "impossível definir vector de grupo runas" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "impossível mudar para uid runas" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "impossível mudar para gid sudoers" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "demasiados processos" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "impossível obter a pasta de trabalho actual" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "caminho de auditoria truncado user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "caminho de auditoria truncado argv[0]: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "impossível inicializar fonte SSS. Tem o SSSD instalado?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "impossível encontrar símbolo \"%s\" em %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "problema com entradas defaults" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "sme fontes sudoers válidas, a sair" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "utilizador sem permissão para alterar pasta chroot para %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "não tem permissão para usar a opção -R com %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "utilizador sem permissão para alterar pasta para %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "não tem permissão para usar a opção -D com %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers especifica que root não tem permissão para sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "utilizador não autorizado a sobrepor o limite closefrom" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "não tem permissão para usar a opção -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "dono da datação (%s): utilizador inexistente" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "sem tty" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "desculpe, tem de ter um tty para executar sudo" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "shell inválida para o utilizador %s: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "comando na pasta actual" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "utilizador sem permissão para definir um tempo de expiração" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "desculpe, não tem permissão para definir um tempo de inacção" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "utilizador sem permissão para definir preservar o ambiente" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "desculpe, não tem permissão para preservar o ambiente" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "comando muito longo" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit não precisa de ser executado via sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "impossível ler %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "impossível obter informações de %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s não é um ficheiro normal" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s é propriedade de uid %u, deveria ser %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s é escrito universalmente" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s é propriedade de gid %u, deveria ser %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "só root pode usar \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "classe de sessão desconhecida: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "impossível resolver o anfitrião %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "opção de filtro inválida: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "espera máxima inválida: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "factor de velocidade inválido: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/temporização: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "A reproduzir sessão sudo: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "impossível definir tty para modo raw" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Aviso: o seu terminal é muito pequeno para reproduzir correctamente o diário.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "A geometria do diário é %d x %d, o seu terminal é %d x %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Reprodução terminada, prima qualquer tecla para restaurar o terminal." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "expressão ambígua \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "\")\" sem par em expressão" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "termo de procura \"%s\" desconhecido" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s requer um argumento" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expressão regular inválida: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "impossível analisar a data \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "\"(\" sem par em expressão" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "\"or\" final ilegal" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "\"!\" final ilegal" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "tipo de procura %d desconhecido" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uso: %s [-hnRS] [-d pasta] [-m núm] [-s núm] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uso: %s [-h] [-d pasta] -l [expressão de procura]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reproduz os diários de sessão sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opções:\n" +" -d, --directory=pasta especifica a pasta para diários de sessão\n" +" -f, --filter=filtro especifica os tipos de E/S a mostrar\n" +" -h, --help mostra a ajuda e sai\n" +" -l, --list lista as IDs de sessão disponíveis, com expressão opcional\n" +" -m, --max-wait=número número máximo de segundos a aguardar entre eventos\n" +" -n, --non-interactive sem prompts, a sessão é enviada para a saída padrão\n" +" -R, --no-resize não tenta redimensionar o terminal\n" +" -S, --suspend-wait espera enquanto o comando foi suspenso\n" +" -s, --speed=número acelera ou trava a saída\n" +" -V, --version mostra informação da versão e sai" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\thost sem correspondência" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Comando permitido" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Comando negado" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Comando sem correspondência" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s é escrito pelo grupo" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "impossível truncar o ficheiro de datação para %lld bytes" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "a ignorar datação do futuro" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "datação demasiado no futuro: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "impossível bloquear ficheiro de datação %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "caminho do estado da lição de moral muito longo: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit não deve ser especificado com um caminho" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "a opção -x será removida numa futura versão" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "por favor, considere usar antes o utilitário cvtsudoers" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "prima Enter para editar %s: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "o editor especificado (%s) não existe" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "sem editor (caminho do editor = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "erro de escrita" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "impossível obter informação do ficheiro temporário (%s), %s inalterado" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "ficheiro temporário de tamanho zero (%s), %s inalterado" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "falha no editor (%s), %s inalterado" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s inalterado" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "impossível reabrir o ficheiro temporário (%s), %s inalterado." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "impossível analisar o ficheiro temporário (%s), erro desconhecido" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "erro interno, impossível encontrar %s na lista!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "impossível definir (uid, gid) de %s para (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s e %s em sistemas de ficheiros diferentes, a usar mv para renomear" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "falha no comando: \"%s %s %s\", %s inalterado" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "erro ao renomear %s, %s inalterado" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "E agora?" + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"As opções são:\n" +" (e) editar o ficheiro sudoers de novo\n" +" (x) sair sem gravar as alterações ao ficheiro sudoers\n" +" (Q) sair e gravar as alterações ao ficheiro sudoers (PERIGO!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "impossível executar %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: dono errrado (uid, gid), deveria ser (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: permissões erradas, devia ser modo 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: análise com sucesso\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s ocupado, tente mais tarde" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "impossível bloquear %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Editar mesmo assim ? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Erro: %s:%d:%d: ciclo em %s \"%s\"" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Aviso: %s:%d:%d: ciclo em %s \"%s\"" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Erro: %s:%d:%d: %s \"%s\" referenciado mas não definido" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Aviso: %s:%d:%d: %s \"%s\" referenciado mas não definido" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Aviso: %s:%d:%d: não usado %s \"%s\"" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - editar com segurança o ficheiro sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opções:\n" +" -c, --check modo só de verificação\n" +" -f, --file=sudoers especifica a localização do ficheiro sudoers\n" +" -h, --help mostra a ajuda e sai\n" +" -q, --quiet mensagens de erro de sintaxe menos verbosas (silêncio)\n" +" -s, --strict verificação de sintaxe estrita\n" +" -V, --version mostra informação da versão e sai\n" + +#: toke.l:179 +msgid "empty string" +msgstr "cadeia vazia" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "grupo vazio" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "grupo de rede vazio" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "continuação de linha inválida" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "endereço IPv6 inválido" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "quebra de linha inesperada em cadeia" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "demasiados níveis de includes" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "Pré-carregar as funções dummy exec contidas na biblioteca sudo_noexec" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "impossível bloquear o diário: %s" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports: porta muito grande" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "SSL_connect falhou: ssl_error=%d, stack=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "ficheiro de pacote CA não especificado" + +#~ msgid "Client certificate was not specified" +#~ msgstr "Certificado do cliente não especificado" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "Impossível alocar objecto ssl: %s\n" + +#~ msgid "Unable to attach socket to the ssl object: %s\n" +#~ msgstr "Impossível anexar socket ao objecto ssl: %s\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "mensagem do cliente muito grande: %zu\n" + +#~ msgid "server message too large: %u\n" +#~ msgstr "mensagem do servidor muito grande: %u\n" + +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "Ficheiro de pacote CA não definido em sudoers" + +#~ msgid "Calling SSL_CTX_load_verify_locations() failed: %s" +#~ msgstr "Falha ao chamar SSL_CTX_load_verify_locations(): %s" + +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "Ficheiro de certificado assinado não definido em sudoers" + +#~ msgid "Unable to load private key into the ssl context: %s" +#~ msgstr "Impossível carregar chave privada no contexto ssl: %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_connect falhoud: ssl_error=%d, stack=%s" + +#~ msgid "SSL_read failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_read falhou: ssl_error=%d, stack=%s" + +#~ msgid "SSL_write failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_write falhou: ssl_error=%d, stack=%s" + +#~ msgid "unknown address family: %d" +#~ msgstr "família de endereços desconhecida: %d" + +#~ msgid "audit_failure message too long" +#~ msgstr "mensagem audit_failure muito longa" + +#~ msgid "No user or host" +#~ msgstr "Sem utilizador ou anfitrião" + +#~ msgid "validation failure" +#~ msgstr "falha de validação" + +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/temporização: %s" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "a ignorar valor de atributo inválido: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "impossível guardar utilizador %s, sem memória" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "impossível guardar grupo %s, sem memória" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "impossível guardar lista de grupo para %s, sem memória" diff --git a/plugins/sudoers/po/pt_BR.mo b/plugins/sudoers/po/pt_BR.mo new file mode 100644 index 0000000..9babef6 Binary files /dev/null and b/plugins/sudoers/po/pt_BR.mo differ diff --git a/plugins/sudoers/po/pt_BR.po b/plugins/sudoers/po/pt_BR.po new file mode 100644 index 0000000..81064cf --- /dev/null +++ b/plugins/sudoers/po/pt_BR.po @@ -0,0 +1,3289 @@ +# Brazilian Portuguese translation for sudoers plugin. +# Traduções em português brasileiro para o pacote sudoers. +# Copyright (C) 2020 Free Software Foundation, Inc. +# This file is distributed under the same license as the sudo package. +# Rafael Fontenelle , 2013-2020. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-23 08:55-0300\n" +"Last-Translator: Rafael Fontenelle \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"X-Generator: Gtranslator 3.38.0\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "erro de sintaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "senha do %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] senha para %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Senha: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informação de SEGURANÇA para %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Sinto muito, tente novamente." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "não foi possível alocar memória" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "um digest requer um nome de caminho" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "valores para \"CWD\" devem iniciar com um \"/\", \"~\" ou \"*\"" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "valores para \"CHROOT\" devem iniciar com um \"/\", \"~\" ou \"*\"" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "erro de sintaxe, palavra reservada %s usada como um nome de alias" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "valor de notbefore inválido" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "falha de notafter inválido" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "valor de timeout grande demais" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "valor de timeout inválido" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "erro interno, estouro de pilha de %s" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "não foi possível fazer dup da entrada padrão: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "não foi possível executar %s: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "não foi possível fazer fork" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "não foi possível fazer fork: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "não foi possível abrir um encadeamento (pipe): %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (comando continuado) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existe, mas não é um diretório (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "não foi possível fazer mkdir %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "não foi possível alterar modo de %s para 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "esperava JSON_STRING, obteve %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "faltando aspas duplas no nome" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "esperava JSON_OBJECT, obteve %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "chave de fechamento sem correspondente" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "array inesperado" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "colchete de fechamento sem correspondente" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "string inesperada" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "faltando caractere de dois pontos após o nome" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "booleano inesperado" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "número inesperado" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u não foi possível analisar \"%s\"" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: arquivo de log inválido" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: campo de marca de tempo está faltando" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: marca de tempo %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: campo de usuário está faltando" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: campo de usuário, a ser executado como, está faltando" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: campo de grupo, a ser executado como, está faltando" + +# timing é o nome do arquivo gerado pelo sudo; não traduzir. +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "erro ao ler o arquivo timing: %s" + +# timing é o nome do arquivo gerado pelo sudo; não traduzir. +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "linha inválida no arquivo timing: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "o log já está completo, não é possível ser reiniciado" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "não foi possível reiniciar o log" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "não foi possível abrir %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "faltando arquivo de log de E/S %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: não foi possível buscar para frente %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "não foi possível localizar o ponto de resumo [%lld, %ld] em %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "erro na máquina de estado" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "AcceptMessage inválido" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "erro ao analisar AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "erro ao criar o log de E/S" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "erro a registrar log de evento de aceite" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "RejectMessage inválido" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "erro ao analisar RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "erro a registrar log de evento de rejeição" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "AlertMessage inválido" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "erro ao analisar AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "erro a registrar log de evento de alerta" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "erro de protocolo" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "erro ao escrever IoBuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "erro ao escrever ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "erro ao escrever CommandSuspend" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "tipo não reconhecido de ClientMessage" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "mensagem do cliente grande demais" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "não foi possível definir conjunto de cifras TLS 1.2 para %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "não foi possível definir conjunto de cifras TLS 1.3 para %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "não foi possível obter o método do servidor TLS: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "não foi possível criar o contexto de TLS: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "não foi possível carregar o certificado %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "não foi possível carregar o novo pacote de autoridade certificadora %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "não foi possível carregar a chave privada %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "não foi possível definir os parâmetros de diffie-hellman: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "não foi possível definir a versão mínima do protocolo para TLS 1.2: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "não foi possível obter o endereço IP remoto" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Não foi possível anexar dados do usuário ao objeto ssl: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "não foi possível adicionar evento para a fila" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "não foi possível configurar soquete de escuta" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - envia log de E/S do sudo para servidor remoto\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opções:\n" +" -f, --file caminho para o arquivo de configuração\n" +" -h, --help exibe uma mensagem de ajuda e sai\n" +" -n, --no-fork não faz fork, executa em primeiro plano\n" +" -R, --random-drop chance em porcentagem das conexões caírem\n" +" -V, --version exibe a informação da versão e sai\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Protobuf-C versão 1.3 ou superior é necessário" + +# "random-drop" foi uma escolha por fazer referência à opção de linha de comando -- Rafael +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "valor de \"random-drop\" inválido: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s versão %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "sem suporte a TLS" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: não um caminho totalmente qualificado" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d \"[\" sem correspondente: %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d seção inválida de configuração: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d linha inválida de configuração: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d esperava um nome de seção: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "valor inválido para %s: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d chave desconhecida: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "facilidade de syslog desconhecida %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "prioridade de syslog desconhecida %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opções:\n" +" --help exibe mensagem de ajuda e sai\n" +" -A, --accept só envia um evento de aceite (sem E/S)\n" +" -h, --host máquina a ser enviado logs\n" +" -i, --iolog_id ID remoto do log de E/S para ser resumido\n" +" -p, --port porta para usar ao conectar à máquina\n" +" -r, --restart reinicia transferência anterior de log de E/S\n" +" -R, --reject rejeita a comando com o motivo dado\n" +" -b, --ca-bundle arquivo de pacote de certificados para verificar\n" +" o certificado do servidor\n" +" -c, --cert arquivo de certificado para negociação TLS\n" +" -k, --key arquivo de chave privada\n" +" -n, --no-verify não verifica o certificado do servidor\n" +" -t, --test teste o servidor de auditoria enviando o log de\n" +" E/S selecionado n vezes em paralelo\n" +" -V, --version exibe informações de versão e sai\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "não foi possível procurar %s:%s: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "não foi possível obter o endereço IP" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "não foi possível ler %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "mensagem do cliente grande demais: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: buffer de escrita já em uso" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "E/S com evento inesperado %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: estado inesperado %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "ServerHello inválido" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "mensagem de erro recebida do servidor: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "mensagem de abortar recebida do servidor: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "não foi possível desempacotar ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: type_case com valor inesperado %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "esgotado o tempo limite de leitura do servidor" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "EOF prematuro" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "mensagem do servidor grande demais: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "esgotado o tempo limite de escrita para servidor" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "esgotado o tempo limite da negociação TLS" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "não foi possível definir evento" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "falha de conexão de TLS: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Não foi possível inicializar o contexto de ssl: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Não foi possível alocar objeto ssl: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Não foi possível anexar soquete ao objeto ssl: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "ambos ponto de ponto de reinício e ID do iolog devem ser especificados" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "um ponto de reinício pode não estar definido quando nenhuma E/S é enviada" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "sai prematuramente com estado %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "tempo decorrido enviado ao servidor [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "ponto de confirmação recebido do servidor [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias \"%s\" já definido" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "não foi possível obter o horário do dia" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "não foi possível alterar a senha para %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "não foi possível obter classe de login para o usuário %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "não foi possível iniciar autenticação BSD" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "tipo de autenticação inválida" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "não foi possível inicializar autenticação BSD" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "sua conta expirou" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "aprovação falhou" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "não foi possível ler configuração de fwtk" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "não foi possível conectar ao servidor de autenticação" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "conexão perdida com o servidor de autenticação" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"erro no servidor de autenticação:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: não foi possível converter principal para string (\"%s\"): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: não foi possível analisar \"%s\": %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: não foi possível resolver cache de credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: não foi possível alocar opções: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: não foi possível obter credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: não foi possível inicializar cache de credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: não foi possível armazenar credenciais no cache: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: não foi possível obter principal da máquina: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Não foi possível verificar TGT! Possivelmente um ataque!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "não foi possível inicializar PAM: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Erro de autenticação PAM: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "falha de verificação da conta; sua conta está travada?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Conta ou senha expirou; redefina sua senha e tente novamente" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "não foi possível alterar a senha expirada: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Senha expirou; entre em contato com o administrador do seu sistema" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Conta expirou ou a configuração do PAM não possui uma seção \"account\" para sudo; contate o administrador do seu sistema" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "erro de gerenciamento de conta PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "você não existe no banco de dados de %s" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "falha ao inicializar a biblioteca API ACE" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "não foi possível contatar o servidor de SecurID" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "ID de usuário travado pela autenticação SecurID" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "comprimento de nome de usuário inválido para SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "manipulação inválida de autenticação para SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "falha de comunicação de SecurID" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "erro de SecurID desconhecido" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "comprimento de senha inválida para SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "não foi possível inicializar a sessão SIA" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "métodos de autenticação inválidos" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Métodos de autenticação inválidos compilado no sudo! Você não pode misturar autenticação autônoma com não-autônoma." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "nenhum método de autenticação" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Não há métodos de autenticação compilados no sudo! Se você quiser desligar a autenticação, use a opção de configuração --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Não foi possível inicializar métodos de autenticação." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Métodos de autenticação:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Não foi possível determinar a condição de auditoria" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "não foi possível enviar o registro de auditoria" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Presumimos que você recebeu as instruções de sempre do administrador\n" +"de sistema local. Basicamente, resume-se a estas três coisas:\n" +"\n" +" #1) Respeite a privacidade dos outros.\n" +" #2) Pense antes de digitar.\n" +" #3) Com grandes poderes vêm grandes responsabilidades.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "uid desconhecido: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "usuário desconhecido: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "incremento de ordem: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordem inicial: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "preenchimento de ordem: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "gramática de %s versão %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "formato de entrada sem suporte %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "formato de saída sem suporte %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: arquivos de entrada e saída devem ser diferentes" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "não foi possível inicializar valores padrões do sudoers" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: palavra-chave desconhecida: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "tipo de defaults inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "tipo de supressão inválida: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "filtro inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "não foi possível abrir %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "falha em analisar o arquivo %s, erro desconhecido" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "erro de análise em %s perto da linha %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "erro de análise em \"%s\"\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "não foi possível gravar em %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - converte entre formatos de arquivo sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opções:\n" +" -b, --base=dn o DN base para consultas LDAP do sudo\n" +" -c, --config=arquivo_conf o caminho para o arquivo de configuração\n" +" -d, --defaults=tiposdeft só converte Defaults dos tipos especificados\n" +" -e, --expand-aliases expande aliases ao converter\n" +" -f, --output-format=formato define formato de saída: JSON, LDIF ou sudoers\n" +" -i, --input-format=formato define formato de entrada: LDIF ou sudoers\n" +" -I, --increment=núm quantidade para incrementar cada sudoOrder por\n" +" -h, --help exibe a mensagem de ajuda e sai\n" +" -m, --match=filtro só converte entradas que corresponde ao filtro\n" +" -M, --match-local filtro de correspondência usa bancos de dados\n" +" passwd e group\n" +" -o, --output=arquivo_saída escreve sudoers convertido para arquivo_saída\n" +" -O, --order-start=núm ponto inicial para o primeiro sudoOrder\n" +" -p, --prune-matches suprime usuário/grupo/máquina não correspondente\n" +" -P, --padding=núm preenchimento base para incremento de sudoOrder\n" +" -s, --suppress=seções suprime a saída de certas seções\n" +" -V, --version exibe informações de versão e sai" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "entrada de Defaults \"%s\" desconhecida" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "não foi possível obter o horário GMT" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "não é possível formatar marca de tempo" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "entradas de sudoers demais, máximo %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "a variável de ambiente SUDOERS_BASE não está definida e a opção -b não foi especificada." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Facilidade do syslog, se syslog estiver sendo usado para registrar logs: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Prioridade do syslog para usar quando um usuário autenticar com sucesso: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Prioridade do syslog para usar quando um usuário não usuário autenticar com sucesso: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Colocar prompt OTP na sua própria linha" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ignorar \".\" no $PATH" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Sempre envia correio quando sudo for executado" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Envia correio se a autenticação de um usuário falhar" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Envia correio se o usuário não estiver no sudoers" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Envia correio se o usuário não estiver no sudoers desta máquina" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Envia correio se o usuário não tiver permissão para executar um comando" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Envia correio se o usuário tentar executar um comando" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Usa uma marca de tempo separada para cada combo usuário/tty" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Instrui o usuário na primeira vez que ele executar sudo" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Arquivo contendo as instruções do sudo: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Exige que os usuários se autentiquem, por padrão" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Root pode executar sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Registra o nome da máquina no arquivo de log (não-syslog)" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Registra o ano no arquivo de log (não-syslog)" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Se sudo for chamado sem argumentos, inicia um shell" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Define $HOME com o usuário alvo ao iniciar um shell com -s" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Sempre define $HOME para a pasta pessoal do usuário alvo" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permite juntar algumas informações para fornecer mensagens de erro úteis" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Exige nomes de máquina completos (FQDN) no arquivo sudoers" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulta o usuário quando ele digitar uma senha incorreta" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Permite que o usuário execute sudo apenas se ele tiver um tty" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo vai honrar a variável de ambiente EDITOR" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Pede a senha do root, e não a do usuário" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pede a senha do usuário runas_default, e não a do usuário" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pede a senha do usuário alvo, e não a do usuário" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Aplica o padrão na classe de login do usuário alvo, se houver alguma" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Define as variáveis de ambiente LOGNAME e USER" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Define o uid efetivo apenas para o usuário alvo, e não o uid real" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Não inicializa o vetor de grupos para aquele usuário alvo" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Comprimento da quebra de linha do arquivo de log (0 para sem quebra): %u" + +# "Limite de tempo da marca de tempo de autenticação" ficaria estranho, então utilizei "... expira em" +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Marca de tempo de autenticação expira em: %.1f minutos" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Pedido de senha expira em: %.1f minutos" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Número de tentativas para digitar senha: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask a ser usada ou 0777 para usar do usuário: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Caminho para o arquivo de log: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Caminho para o programa de correio: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Opções para o programa de correio: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Endereço para onde enviar correio: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Endereço de onde enviar correio: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Linha do assunto para as mensagens de correio: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Mensagem de senha incorreta: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Caminho para o diretório de status de instruções: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Caminho para diretório de marca de tempo de autenticação: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Dono do diretório de marca de tempo de autenticação: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Usuários neste grupo estão eximidos da exigência de senha e PATH: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Pedido de senha padrão: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Se definido, o pedido de senha vai sobrescrever o do sistema em todos os casos." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Usuário padrão para se executar comandos: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valor para sobrescrever o $PATH do usuário: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Caminho do editor a ser usado pelo visudo: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quando exigir uma senha para o pseudo-comando \"list\": %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quando exigir uma senha para o pseudo-comando \"verify\": %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Pré-carrega a biblioteca sudo_noexec que substitui as funções do exec" + +# ideia da frase original: se acontecer algo, se deve ou não ignorar. Traduzi reorganizando a frase com a finalidade de manter a ideia original. -- Rafael +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Estando o diretório LDAP disponível, se devemos ignorar o arquivo sudoers local" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Descritores, de arquivos, >= %d serão fechados antes de executar um comando" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Se definido, usuários podem sobrescrever o valor de \"closefrom\" com a opção -C" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permite que usuários definam variáveis de ambiente arbitrárias" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Redefine o ambiente para um conjunto padrão de variáveis" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Variáveis de ambiente para verificar por segurança:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Variáveis de ambiente para remover:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Variáveis de ambiente para preservar:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Papel SELinux para usar no novo contexto de segurança: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Tipo SELinux para usar no novo contexto de segurança: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Caminho do arquivo de ambiente específico do sudo: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Caminho do arquivo restrito de ambiente específico do sudo: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Localização para usar ao analisar o sudoers: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permite ao sudo solicitar uma senha mesmo se ele estiver visível" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Fornece feedback visual na solicitação de senha quando houver entrada do usuário" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Usa um englobamento mais rápido que é menos preciso, mas não acessa o sistema de arquivos" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "O umask especificado no sudoers vai sobrescrever o do usuário, mesmo se ele foi mais permissivo" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Registra no log a entrada do usuário para o comando sendo executado" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Registra no log a saída do comando sendo executado" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Comprime logs I/O usando zlib" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Sempre executa comandos em um pseudo-tty" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plug-in para suporte a grupo não-Unix: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Diretório no qual devem ser armazenados os logs de entrada/saída: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Arquivo no qual deve ser armazenado o log de entrada/saída: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Adiciona uma entrada ao arquivo utmp/utmpx ao alocar um pty" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Define o usuário em utmp como usuário a ser executado como, e não o usuário a ser chamado" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Conjunto de privilégios permitidos: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Conjunto de privilégios limitados: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Executa comandos em um pty em plano de fundo" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nome do serviço PAM para usar: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nome do serviço PAM para usar para shells de login: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tenta estabelecer as credenciais PAM para o usuário alvo" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Cria uma nova sessão PAM para o comando ser executado nela" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Realiza de gerenciamento de validação de conta PAM" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Número máximo de sequência de log de E/S: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Habilita suporte a netgroup no sudoers" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Verifica diretórios pai para capacidade de gravação ao editar arquivos com sudoedit" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Segue links simbólicos ao editar arquivos com sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Consulta o plug-in de grupo por grupos de sistema desconhecidos" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Compara netgroups baseada em toda tupla: usuário, máquina e domínio" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permite comandos serem executados mesmo se sudo não puder escrever em logs de auditoria" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permite comandos serem executados mesmo se sudo não puder escrever em logs de E/S" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permite comandos serem executados mesmo se sudo não puder escrever no arquivo de log" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Resolve grupos no sudoers e corresponde ao ID de grupo, e não o nome" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Entradas de log maiores que este valor serão divididos em múltiplas mensagens de syslog: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Usuário que será dono dos arquivos de log de E/S: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupo que será dono dos arquivos de log de E/S: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Modo de arquivo usado para os arquivos de log de E/S: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Executa comandos pelo descritor de arquivo em vez de pelo caminho: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignora entradas desconhecidas de Defaults no sudoers em vez de produzir um aviso" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tempo em segundos após o qual o comando será terminado: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permite o usuário especificar um tempo limite na linha de comando" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Descarrega os dados de log de E/S para o disco imediatamente em vez de armazenar no buffer" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Inclui o ID de processo ao registrar log via syslog" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipo de registro de marca de tempo de autenticação: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Mensagem de falha de autenticação: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Ignora maiúsculo/minúsculo ao corresponder nomes de usuário" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Ignora maiúsculo/minúsculo ao corresponder nomes de grupo" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Registra quando um comando é permitido por sudoers" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Registra quando um comando é negado por sudoers" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Servidor(es) de log do sudo para conectar com porta opcional" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Tempo limite do servidor de log do sudo em segundos: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Habilita a opção de soquete SO_KEEPALIVE no soquete conectado ao servidor de log" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Caminho do arquivo de pacote de AC do servidor de auditoria: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Caminho do arquivo de certificado do sudoers: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Caminho do arquivo de chave privada do sudoers: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Verifica se o certificado do servidor de log é válido" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Permite o uso de ID desconhecido do usuário e/ou grupo a ser executado como" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Permite apenas a execução de comandos como um usuário com um shell válido" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Define o usuário remoto pam como o usuário executando o sudo" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Define a máquina remota pam com o nome da máquina local" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Diretório de trabalho para o qual alterar antes de executar o comando: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Diretório raiz para o qual alterar antes de executar o comando: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "O formato dos logs para produzir: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: entrada padrão \"%s\" desconhecida" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: entrada padrão \"%s\" desconhecida" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: nenhum valor especificado para \"%s\"" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nenhum valor especificado para \"%s\"" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: a opção \"%s\" não aceita um valor" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: a opção \"%s\" não leva um valor" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: tipo de Defaults 0x%x inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: Tipo de Defaults 0x%x inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: valor \"%s\" é inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: o valor \"%s\" é inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: valores para \"%s\" devem iniciar com um \"/\", \"~\" ou \"*\"" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: valores para \"%s\" devem iniciar com um \"/\", '~', ou '*'" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: valores para \"%s\" devem iniciar com um \"/\"" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: valores para \"%s\" devem iniciar com um \"/\"" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp corrompido, cumprimento não confere" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "não foi possível recompilar o ambiente" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "sinto muito, você não tem permissão para definir as seguintes variáveis de ambiente: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "erro de análise em %s próximo à linha %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "erro de análise em %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tipo de digest %d sem suporte para %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: erro de leitura" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s deve ter como dono o uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s deve ser gravável apenas pelo dono" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "não foi possível carregar %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "não foi possível localizar um símbolo \"group_plugin\" %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: versão maior do plug-in de grupo %d incompatível, esperava %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "não foi possível analisar o endereço IP \"%s\"" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "não foi possível analisar a máscara de rede \"%s\"" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Par de endereço IP e máscara de rede locais:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "grupo desconhecido %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "não foi possível atualizar o arquivo de sequência" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "não foi possível gravar no arquivo de log de E/S: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "não foi possível criar %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: erro interno, o arquivo de log de E/S para evento %d não está aberto" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "não foi possível ler do relógio" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: erro interno, sinal inválido %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "sem suporte a starttls ao usar ldaps" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "não foi possível inicializar bando de dados de chaves e certificados SSL: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "você deve definir TLS_CERT em %s para usar SSL" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "não foi possível inicializar LDAP: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls especificado, mas bibliotecas LDAP não possuem suporte a ldap_start_tls_s() ou ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "atributo sudoOrder inválido: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: porta grande demais" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tipo de uri LDAP sem suporte: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "não foi possível misturar ldap e ldaps URIs" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "não foi possível converter sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "não foi possível abrir o sistema de auditoria" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "não foi possível enviar mensagem de auditoria" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "erro no evento de loop" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Criação do novo objeto SSL_CTX falhou: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "falha de conexão de TLS com %s:%s: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "A inicialização do TLS não teve êxito" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "A negociação TLS não teve êxito" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: erro interno, status de saída inválido %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "conexão perdida com o servidor de log" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "faltando buffer de escrita" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "não foi possível conectar ao servidor de log" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "usuário NÃO ESTÁ no sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "usuário NÃO ESTÁ autorizado na máquina" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "comando não permitido" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s não está no arquivo sudoers. Este incidente será relatado.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s não tem permissão para executar sudo em %s. Este incidente será relatado.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Sinto muito, usuário %s não pode executar sudo em %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Sinto muito, usuário %s não tem permissão para executar \"%s%s%s\" como %s%s%s em %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: comando não encontrado" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignorando \"%s\" encontrado em \".\"\n" +"Use \"sudo ./%s\" se isto é o \"%s\" que você deseja executar." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u tentativa de senha incorreta" +msgstr[1] "%u tentativas de senha incorreta" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "falha de autenticação" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "uma senha é necessária" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "não foi possível abrir o arquivo de log: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "não foi possível gravar no arquivo de log: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "digest de %s (%s) não está na forma %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Papel LDAP: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Entradas no sudoers:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " UsuáriosRunAs: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " GruposRunAs: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Opções: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Comandos:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Entradas de Defaults correspondentes a %s em %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Padrão específico de comandos e \"runas\" de %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Usuário %s pode executar os seguintes comandos em %s:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Usuário %s não tem permissão para executar sudo em %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorando sudoRole incompleto: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "atributo LDIF inválido: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s inválido definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "não foi possível analisar a lista de endereços de rede" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "nome de usuário não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "ID de usuário não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "ID de grupo não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "nome da máquina não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "diretório de trabalho inválido: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "diretório de chroot inválido: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "não foi possível executar %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Versão de plug-in de política do sudoers %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versão de gramática de arquivo do sudoers %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Caminho do sudoers: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "caminho do nsswitch: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "caminho do ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "caminho do ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "não foi possível registrar hook do tipo %d (versão %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "não foi possível fazer cache de uid %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "não foi possível fazer cache de uid %u, já existe" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "não foi possível fazer cache de usuário %s" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "não foi possível fazer cache de usuário %s, já existe" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "não foi possível fazer cache de gid %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "não foi possível fazer cache de gid %u, já existe" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "não foi possível fazer cache de grupo %s" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "não foi possível fazer cache de grupo %s, já existe" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "não foi possível fazer cache da lista de grupos de %s, já existe" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "não foi fazer cache de lista de grupos para %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "não foi possível analisar grupos de %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "não foi possível analisar os gids de %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "estouro da pilha de permissões" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "esvaziamento da pilha de permissões" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "não foi possível alterar gid de root" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "não foi possível alterar para gid de \"runas\"" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "não foi possível definir vetor de grupo de \"runas\"" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "não foi possível alterar para uid de \"runas\"" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "não foi possível alterar para gid de sudoers" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "processos demais" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "não foi possível definir diretório de trabalho atual" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "caminho de auditoria truncado user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "caminho de auditoria truncado argv[0]: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "não foi possível inicializar a fonte SSS. SSSD está instalado em sua máquina?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "não foi possível localizar símbolo \"%s\" em %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "problema com o entradas padrão" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "nenhuma fonte de sudoers válida encontrada; saindo" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "usuário sem permissão para alterar o diretório raiz para %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "você não tem permissão para usar a opção -R com %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "usuário sem permissão para alterar o diretório para %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "você não tem permissão para usar a opção -D com %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers especifica que o root não tem permissão para usar sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "usuário sem permissão para substituir o limite closefrom" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "você não tem permissão para usar a opção -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "dono da marca de tempo (%s): Usuário inexistente" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "nenhum tty" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "sinto muito, você deve ter um tty para executar sudo" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "shell inválido para o usuário %s: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "comando no diretório atual" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "usuário sem permissão para definir um tempo limite de comando" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "sinto muito, você não tem permissão para definir um tempo limite de comando" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "usuário sem permissão para preservar o ambiente" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "sinto muito, você não tem permissão para preservar o ambiente" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "comando muito grande" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit não precisa ser executado via sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "não foi possível ler %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "não foi possível obter o estado de %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s não é um arquivo comum" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s tem como dono o uid %u, deveria ser %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s é gravável globalmente" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s tem como dono o gid %u, deveria ser %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "apenas o root pode usar \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "classe de login desconhecida: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "não foi possível resolver máquina %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "opção de filtro inválida: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "espera máxima inválida: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "fator de velocidade inválido: %s" + +# timing é o nome do arquivo gerado pelo sudo; não traduzir. +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +# timing é o nome do arquivo gerado pelo sudo; não traduzir. +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Reproduzindo sessão de sudo: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "não foi possível definir o tty para modo raw" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Aviso: seu terminal é muito pequeno para reproduzir adequadamente o log.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Geometria do log é %d x %d; geometria do seu terminal é %d x %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Reprodução finalizada, pressione qualquer tecla para restaurar o terminal." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "expressão ambígua \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "\")\" não coincidente na expressão" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "termo de pesquisa desconhecido \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s requer um argumento" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expressão regular inválida: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "não foi possível analisar a data \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "\"(\" sem correspondente na expressão" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "fim de linha ilegal com \"or\"" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "fim de linha ilegal com \"!\"" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "tipo de pesquisa desconhecido %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uso: %s [-hnRS] [-d diretório] [-m número] [-s número] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uso: %s [-h] [-d diretório] -l [expressão de pesquisa]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reproduz logs de sessão do sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opções:\n" +" -d, --directory=dir especifica o diretório dos logs de sessão\n" +" -f, --filter=filtro especifica qual o tipo de E/S para exibir\n" +" -h, --help exibe mensagem de ajuda e sai\n" +" -l, --list lista IDs de sessão disponíveis, podendo ser filtrado\n" +" com uso opcional de expressão regular\n" +" -m, --max-wait=núm número máximo, em segundos, de espera entre eventos\n" +" -n, --non-interactive sem interação, a sessão é enviada para a saída padrão\n" +" -R, --no-resize não tenta redimensionar o terminal\n" +" -S, --suspend-wait aguarda enquanto o comando estava suspenso\n" +" -s, --speed=núm aumenta ou diminui a velocidade da saída\n" +" -V, --version exibe a informação da versão e sai" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\tmáquina sem correspondente" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Comando permitido" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Comando negado" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Comando sem correspondente" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s é gravável pelo grupo" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "não foi possível truncar o arquivo de marca de tempo para %lld bytes" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "ignorado marca de tempo no futuro" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "marca de tempo muito a frente no futuro: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "não foi possível travar o arquivo de marca de tempo %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "caminho de status de instruções muito longo: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit não deve ser especificado com um caminho" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "a opção -x será removida em um lançamento futuro" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "por favor, em vez disso, considere usar o utilitário cvtsudoers" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "pressione enter para editar %s: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "editor especificado (%s) não existe" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nenhum editor encontrado (caminho do editor = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "erro de escrita" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "não foi possível obter estado de arquivo temporário (%s), %s sem alteração" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "arquivo de temporário (%s) com comprimento zero, %s sem alteração" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editor (%s) falhou, %s sem alteração" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s sem alteração" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "não foi possível reabrir arquivo temporário (%s), %s sem alteração." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "não foi possível analisar arquivo temporário (%s), erro desconhecido" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "erro interno, não foi possível localizar %s na lista!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "não foi possível definir (uid, gid) de %s para (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s e %s não estão no mesmo sistema de arquivos, usando mv para renomear" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "comando \"%s %s %s\" falhou, %s sem alteração" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "erro ao renomear %s, %s sem alteração" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Agora o que? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Opções são:\n" +" (e)dit - editar arquivos sudoers novamente\n" +" e(x)it - sair sem salvar alterações no arquivo sudoers\n" +" (Q)uit - sair e salvar alterações no arquivo sudoers (PERIGO!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "não foi possível executar %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: dono (uid, gid) incorreto; deveria ser (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: permissões incorretas; deveria estar no modo 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: análise OK\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s ocupado, tente novamente" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "não foi possível travar %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Editar mesmo assim? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Erro: %s:%d:%d: ciclo em %s \"%s\"" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Aviso: %s:%d:%d: ciclo em %s \"%s\"" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Erro: %s:%d:%d: %s \"%s\" referenciado, mas não definido" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Aviso: %s:%d:%d: %s \"%s\" referenciado, mas não definido" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Aviso: %s:%d:%d: %s não usado \"%s\"" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - edita o arquivo sudoers com segurança\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opções:\n" +" -c, --check modo de verificação, apenas\n" +" -f, --file=sudoers especifica localização do arquivo sudoers\n" +" -h, --help exibe uma mensagem de ajuda e sai\n" +" -q, --quiet mensagens de erro de sintaxe menos detalhada\n" +" -s, --strict verificação rigorosa de sintaxe\n" +" -V, --version exibe a informação da versão e sai\n" + +#: toke.l:179 +msgid "empty string" +msgstr "string vazia" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "grupo vazio" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "netgroup vazio" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "continuação de linha inválida" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "endereço IPv6 inválido" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "quebra de linha inesperada na string" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "níveis de inclusões demais" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "Pré-carrega as funções de exec de teste contidas na biblioteca sudo_noexec" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "não foi possível travar o arquivo de log: %s" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports: porta muito grande" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "SSL_connect falhou: ssl_error=%d, stack=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "O arquivo de pacote de AC não foi especificado" + +#~ msgid "Client certificate was not specified" +#~ msgstr "O certificado do cliente não foi especificado" + +#~| msgid "%s: unable to allocate options: %s" +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "Não foi possível alocar objeto ssl: %s" + +#, fuzzy +#~| msgid "timeout value too large" +#~ msgid "client message too large: %zu\n" +#~ msgstr "valor de timeout grande demais" + +#, fuzzy +#~| msgid "Send mail if the user is not in sudoers" +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "Envia correio se o usuário não estiver no sudoers" + +#, fuzzy +#~| msgid "Send mail if the user is not in sudoers" +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "Envia correio se o usuário não estiver no sudoers" + +#, fuzzy +#~| msgid "unknown search type %d" +#~ msgid "unknown address family: %d" +#~ msgstr "tipo de pesquisa desconhecido %d" + +#~ msgid "audit_failure message too long" +#~ msgstr "mensagem de audit_failure muito grande" + +#~ msgid "No user or host" +#~ msgstr "nenhum usuário ou máquina" + +#~ msgid "validation failure" +#~ msgstr "falha de validação" + +# timing é o nome do arquivo gerado pelo sudo; não traduzir. +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/timing: %s" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "ignorando valor de atributo inválido: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "não foi possível fazer cache de usuário %s, memória insuficiente" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "não foi possível fazer cache de grupo %s, memória insuficiente" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "não foi possível fazer cache da lista de grupos de %s, memória insuficiente" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Papel LDAP: DESCONHECIDO\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Ordem: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "Papel SSSD: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Papel SSSD: DESCONHECIDO\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Aviso: ciclo em %s \"%s\"" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Aviso: %s \"%s\" referenciado, mas não definido" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Aviso: %s não usado \"%s\"" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "caminho de marca de tempo muito longo: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "não foi possível obter estado do editor (%s)" + +# Mantive, pois hostbuf é uma variável do plugins/sudoers/ldap.c +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: sem espaço para expansão de hostbuf" + +# Mantive, pois hostbuf é uma variável do plugins/sudoers/ldap.c +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: sem espaço na construção de hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "alocação de sudo_ldap_build_pass1 não confere" + +#~ msgid "Password:" +#~ msgstr "Senha:" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "erro interno: espaço insuficiente para linha de log" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: estouro de buffer" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s tem como dono o uid %u, deveria ser uid %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s gravável por não-dono (0%o); deveria estar no modo 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s existe, mas não é um arquivo comum (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s gravável por não-dono (0%o); deveria estar no modo 0600" + +#~ msgid "unable to remove %s, will reset to the Unix epoch" +#~ msgstr "não foi possível remover %s, redefinindo para como estava no Unix" + +#~ msgid "unable to reset %s to the Unix epoch" +#~ msgstr "não foi possível redefinir %s para como estava no Unix" + +#~ msgid "value out of range" +#~ msgstr "valor fora da faixa" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "não foi possível misturar ldaps e starttls" + +#~ msgid "writing to standard output" +#~ msgstr "escrevendo para saída padrão" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "parênteses de expressões demais, máximo %d" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: falhou" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: falhou" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: falhou" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: falhou" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: falhou" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: falhou" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getauid failed" +#~ msgstr "getauid falhou" + +#, fuzzy +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "não foi possível fazer dlopen %s: %s" diff --git a/plugins/sudoers/po/ro.mo b/plugins/sudoers/po/ro.mo new file mode 100644 index 0000000..bc951b4 Binary files /dev/null and b/plugins/sudoers/po/ro.mo differ diff --git a/plugins/sudoers/po/ro.po b/plugins/sudoers/po/ro.po new file mode 100644 index 0000000..c620f5b --- /dev/null +++ b/plugins/sudoers/po/ro.po @@ -0,0 +1,3029 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# Todd C. Miller , 2011-2018 +# Florentina Mușat , 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.2rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-06-24 05:35-0600\n" +"PO-Revision-Date: 2020-07-16 17:56+0200\n" +"Last-Translator: Florentina Mușat \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"X-Generator: Poedit 2.3.1\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n%100<=19) ? 1 : 2);\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "eroare de sintaxă" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "parola lui %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] parolă pentru %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Parolă: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informații de SECURITATE pentru %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Încercați din nou." + +#: gram.y:203 gram.y:251 gram.y:258 gram.y:265 gram.y:272 gram.y:279 +#: gram.y:295 gram.y:319 gram.y:326 gram.y:333 gram.y:340 gram.y:347 +#: gram.y:410 gram.y:419 gram.y:430 gram.y:463 gram.y:470 gram.y:477 +#: gram.y:484 gram.y:511 gram.y:583 gram.y:590 gram.y:599 gram.y:608 +#: gram.y:625 gram.y:737 gram.y:744 gram.y:752 gram.y:758 gram.y:858 +#: gram.y:865 gram.y:872 gram.y:879 gram.y:886 gram.y:912 gram.y:919 +#: gram.y:926 gram.y:1068 gram.y:1347 lib/iolog/iolog_fileio.c:1101 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:283 +#: lib/iolog/iolog_json.c:313 lib/iolog/iolog_json.c:435 +#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115 +#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133 +#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196 +#: logsrvd/eventlog.c:223 logsrvd/sendlog.c:443 plugins/sudoers/alias.c:125 +#: plugins/sudoers/alias.c:132 plugins/sudoers/alias.c:148 +#: plugins/sudoers/audit.c:108 plugins/sudoers/audit.c:212 +#: plugins/sudoers/auth/bsdauth.c:143 plugins/sudoers/auth/kerb5.c:118 +#: plugins/sudoers/auth/kerb5.c:144 plugins/sudoers/auth/pam.c:669 +#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59 +#: plugins/sudoers/cvtsudoers.c:120 plugins/sudoers/cvtsudoers.c:161 +#: plugins/sudoers/cvtsudoers.c:178 plugins/sudoers/cvtsudoers.c:189 +#: plugins/sudoers/cvtsudoers.c:301 plugins/sudoers/cvtsudoers.c:429 +#: plugins/sudoers/cvtsudoers.c:562 plugins/sudoers/cvtsudoers.c:579 +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/cvtsudoers.c:757 +#: plugins/sudoers/cvtsudoers.c:765 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151 +#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235 +#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:371 +#: plugins/sudoers/cvtsudoers_ldif.c:426 plugins/sudoers/cvtsudoers_ldif.c:434 +#: plugins/sudoers/cvtsudoers_ldif.c:451 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:607 plugins/sudoers/defaults.c:626 +#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052 +#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84 +#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483 +#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:382 +#: plugins/sudoers/iolog_client.c:559 plugins/sudoers/iolog_client.c:678 +#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176 +#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723 +#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183 +#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431 +#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440 +#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743 +#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279 +#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743 +#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959 +#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:598 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:586 plugins/sudoers/logging.c:723 +#: plugins/sudoers/logging.c:1083 plugins/sudoers/match_command.c:243 +#: plugins/sudoers/match_command.c:391 plugins/sudoers/match_command.c:438 +#: plugins/sudoers/match_command.c:509 plugins/sudoers/match_digest.c:80 +#: plugins/sudoers/parse.c:193 plugins/sudoers/parse.c:205 +#: plugins/sudoers/parse.c:220 plugins/sudoers/parse.c:232 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:491 +#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262 +#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514 +#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649 +#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865 +#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967 +#: plugins/sudoers/sssd.c:146 plugins/sudoers/sssd.c:409 +#: plugins/sudoers/sssd.c:472 plugins/sudoers/sssd.c:516 +#: plugins/sudoers/sssd.c:563 plugins/sudoers/sssd.c:755 +#: plugins/sudoers/stubs.c:96 plugins/sudoers/stubs.c:104 +#: plugins/sudoers/sudoers.c:316 plugins/sudoers/sudoers.c:327 +#: plugins/sudoers/sudoers.c:337 plugins/sudoers/sudoers.c:380 +#: plugins/sudoers/sudoers.c:720 plugins/sudoers/sudoers.c:849 +#: plugins/sudoers/sudoers.c:894 plugins/sudoers/sudoers.c:1198 +#: plugins/sudoers/sudoreplay.c:553 plugins/sudoers/sudoreplay.c:556 +#: plugins/sudoers/sudoreplay.c:1260 plugins/sudoers/sudoreplay.c:1470 +#: plugins/sudoers/sudoreplay.c:1474 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:581 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:146 +#: plugins/sudoers/visudo.c:322 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:438 plugins/sudoers/visudo.c:616 +#: plugins/sudoers/visudo.c:936 plugins/sudoers/visudo.c:1024 +#: plugins/sudoers/visudo.c:1121 toke.l:864 toke.l:981 toke.l:1039 +msgid "unable to allocate memory" +msgstr "nu se poate aloca memoria" + +#: gram.y:505 +msgid "a digest requires a path name" +msgstr "o publicație informativă necesită un nume de cale" + +#: gram.y:638 +msgid "invalid notbefore value" +msgstr "valoare nu-înainte nevalidă" + +#: gram.y:646 +msgid "invalid notafter value" +msgstr "valoare nu-după nevalidă" + +#: gram.y:655 plugins/sudoers/policy.c:306 +msgid "timeout value too large" +msgstr "limită de timp prea mare" + +#: gram.y:657 plugins/sudoers/policy.c:308 +msgid "invalid timeout value" +msgstr "valoare de limită de timp nevalidă" + +#: gram.y:1347 lib/iolog/iolog_fileio.c:1101 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:282 lib/iolog/iolog_json.c:313 +#: lib/iolog/iolog_json.c:435 lib/iolog/iolog_json.c:713 +#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115 +#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133 +#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196 +#: logsrvd/eventlog.c:223 logsrvd/logsrvd.c:1208 logsrvd/logsrvd.c:1221 +#: logsrvd/logsrvd.c:1266 logsrvd/sendlog.c:443 logsrvd/sendlog.c:1302 +#: logsrvd/sendlog.c:1309 logsrvd/sendlog.c:1727 plugins/sudoers/audit.c:108 +#: plugins/sudoers/audit.c:212 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:120 plugins/sudoers/cvtsudoers.c:160 +#: plugins/sudoers/cvtsudoers.c:177 plugins/sudoers/cvtsudoers.c:188 +#: plugins/sudoers/cvtsudoers.c:300 plugins/sudoers/cvtsudoers.c:428 +#: plugins/sudoers/cvtsudoers.c:561 plugins/sudoers/cvtsudoers.c:578 +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/cvtsudoers.c:757 +#: plugins/sudoers/cvtsudoers.c:764 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:425 plugins/sudoers/cvtsudoers_ldif.c:433 +#: plugins/sudoers/cvtsudoers_ldif.c:450 plugins/sudoers/cvtsudoers_ldif.c:459 +#: plugins/sudoers/cvtsudoers_ldif.c:606 plugins/sudoers/defaults.c:626 +#: plugins/sudoers/defaults.c:919 plugins/sudoers/defaults.c:1052 +#: plugins/sudoers/editor.c:66 plugins/sudoers/editor.c:84 +#: plugins/sudoers/editor.c:95 plugins/sudoers/env.c:261 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:132 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:483 +#: plugins/sudoers/iolog_client.c:105 plugins/sudoers/iolog_client.c:215 +#: plugins/sudoers/iolog_client.c:236 plugins/sudoers/iolog_client.c:249 +#: plugins/sudoers/iolog_client.c:382 plugins/sudoers/iolog_client.c:678 +#: plugins/sudoers/iolog_client.c:696 plugins/sudoers/iolog_client.c:1176 +#: plugins/sudoers/iolog_client.c:1405 plugins/sudoers/iolog_client.c:1723 +#: plugins/sudoers/iolog_client.c:1751 plugins/sudoers/ldap.c:183 +#: plugins/sudoers/ldap.c:421 plugins/sudoers/ldap.c:431 +#: plugins/sudoers/ldap.c:436 plugins/sudoers/ldap.c:440 +#: plugins/sudoers/ldap.c:452 plugins/sudoers/ldap.c:743 +#: plugins/sudoers/ldap.c:907 plugins/sudoers/ldap.c:1279 +#: plugins/sudoers/ldap.c:1706 plugins/sudoers/ldap.c:1743 +#: plugins/sudoers/ldap.c:1824 plugins/sudoers/ldap.c:1959 +#: plugins/sudoers/ldap.c:2060 plugins/sudoers/ldap.c:2076 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:677 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:325 plugins/sudoers/ldap_util.c:332 +#: plugins/sudoers/ldap_util.c:598 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:103 plugins/sudoers/logging.c:192 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1083 +#: plugins/sudoers/match_command.c:242 plugins/sudoers/match_command.c:390 +#: plugins/sudoers/match_command.c:437 plugins/sudoers/match_command.c:509 +#: plugins/sudoers/match_digest.c:80 plugins/sudoers/parse.c:192 +#: plugins/sudoers/parse.c:204 plugins/sudoers/parse.c:219 +#: plugins/sudoers/parse.c:231 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:120 plugins/sudoers/policy.c:129 +#: plugins/sudoers/policy.c:138 plugins/sudoers/policy.c:164 +#: plugins/sudoers/policy.c:291 plugins/sudoers/policy.c:306 +#: plugins/sudoers/policy.c:308 plugins/sudoers/policy.c:337 +#: plugins/sudoers/policy.c:346 plugins/sudoers/policy.c:389 +#: plugins/sudoers/policy.c:399 plugins/sudoers/policy.c:408 +#: plugins/sudoers/policy.c:417 plugins/sudoers/policy.c:491 +#: plugins/sudoers/policy.c:823 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:262 +#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514 +#: plugins/sudoers/pwutil.c:578 plugins/sudoers/pwutil.c:649 +#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865 +#: plugins/sudoers/pwutil.c:909 plugins/sudoers/pwutil.c:967 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:145 +#: plugins/sudoers/sssd.c:409 plugins/sudoers/sssd.c:472 +#: plugins/sudoers/sssd.c:516 plugins/sudoers/sssd.c:563 +#: plugins/sudoers/sssd.c:755 plugins/sudoers/stubs.c:96 +#: plugins/sudoers/stubs.c:104 plugins/sudoers/sudoers.c:316 +#: plugins/sudoers/sudoers.c:327 plugins/sudoers/sudoers.c:337 +#: plugins/sudoers/sudoers.c:380 plugins/sudoers/sudoers.c:720 +#: plugins/sudoers/sudoers.c:849 plugins/sudoers/sudoers.c:894 +#: plugins/sudoers/sudoers.c:1198 plugins/sudoers/sudoreplay.c:553 +#: plugins/sudoers/sudoreplay.c:556 plugins/sudoers/sudoreplay.c:1260 +#: plugins/sudoers/sudoreplay.c:1470 plugins/sudoers/sudoreplay.c:1474 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:581 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:146 plugins/sudoers/visudo.c:322 +#: plugins/sudoers/visudo.c:328 plugins/sudoers/visudo.c:438 +#: plugins/sudoers/visudo.c:616 plugins/sudoers/visudo.c:936 +#: plugins/sudoers/visudo.c:1024 plugins/sudoers/visudo.c:1121 toke.l:864 +#: toke.l:981 toke.l:1039 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/iolog/iolog_fileio.c:157 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s există dar nu este un director (0%o)" + +#: lib/iolog/iolog_fileio.c:187 lib/iolog/iolog_fileio.c:233 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "nu se poate mkdir %s" + +#: lib/iolog/iolog_fileio.c:237 plugins/sudoers/visudo.c:733 +#: plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nu se poate modifica modul de %s la 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "s-a așteptat JSON_STRING, s-a obținut %d" + +#: lib/iolog/iolog_json.c:305 +msgid "missing double quote in name" +msgstr "lipsește un citat dublu în nume" + +#: lib/iolog/iolog_json.c:392 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "s-a așteptat JSON_OBJECT, s-a obținut %d" + +#: lib/iolog/iolog_json.c:441 lib/iolog/iolog_json.c:444 +#: lib/iolog/iolog_json.c:446 lib/iolog/iolog_json.c:538 +#: logsrvd/eventlog.c:228 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:563 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:435 plugins/sudoers/iolog.c:561 +#: plugins/sudoers/iolog.c:577 plugins/sudoers/ldap.c:516 +#: plugins/sudoers/ldap.c:747 plugins/sudoers/ldap.c:1080 +#: plugins/sudoers/ldap_conf.c:222 plugins/sudoers/ldap_conf.c:312 +#: plugins/sudoers/linux_audit.c:89 plugins/sudoers/logging.c:1088 +#: plugins/sudoers/policy.c:521 plugins/sudoers/policy.c:668 +#: plugins/sudoers/policy.c:678 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:916 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "eroare internă, supraplin %s" + +#: lib/iolog/iolog_json.c:607 lib/iolog/iolog_json.c:731 +msgid "unmatched close brace" +msgstr "paranteză de închidere desperecheată" + +#: lib/iolog/iolog_json.c:616 +msgid "unexpected array" +msgstr "vector neașteptat" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:733 +msgid "unmatched close bracket" +msgstr "paranteză pătrată închisă desperecheată" + +#: lib/iolog/iolog_json.c:637 +msgid "unexpected string" +msgstr "șir neașteptat" + +#: lib/iolog/iolog_json.c:647 +msgid "missing colon after name" +msgstr "lipsește două puncte după nume" + +#: lib/iolog/iolog_json.c:658 lib/iolog/iolog_json.c:673 +#: lib/iolog/iolog_json.c:688 +msgid "unexpected boolean" +msgstr "logic neașteptat" + +#: lib/iolog/iolog_json.c:704 +msgid "unexpected number" +msgstr "număr neașteptat" + +#: lib/iolog/iolog_json.c:741 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u nu se poate parsa „%s”" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: fișier de istoric nevalid" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: câmpul marcaj de timp lipsește" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: marcajul de timp %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: câmpul utilizator lipsește" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: câmpul de utilizator rulează-ca lipsește" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: câmpul de grup rulează-ca lipsește" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "eroare la citirea fișierului de sincronizare: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "linie de fișier de sincronizare nevalidă: %s" + +#: logsrvd/eventlog.c:430 plugins/sudoers/logging.c:112 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: logsrvd/eventlog.c:459 plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (comandă continuată) %s" + +#: logsrvd/iolog_writer.c:936 +msgid "log is already complete, cannot be restarted" +msgstr "istoricul este deja complet, nu poate fi repornit" + +#: logsrvd/iolog_writer.c:967 +msgid "unable to restart log" +msgstr "nu se poate reporni istoricul" + +#: logsrvd/logsrv_util.c:98 logsrvd/logsrv_util.c:105 +#: plugins/sudoers/sudoreplay.c:353 plugins/sudoers/sudoreplay.c:359 +#, c-format +msgid "unable to open %s/%s" +msgstr "nu se poate porni %s/%s" + +#: logsrvd/logsrv_util.c:132 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "lipsește fișierul istoric I/O %s/%s" + +#: logsrvd/logsrv_util.c:139 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: nu se poate căuta înainte %zu" + +#: logsrvd/logsrv_util.c:149 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "nu se poate găsi punctul de rezumare [%lld, %ld] în %s/%s" + +#: logsrvd/logsrvd.c:230 logsrvd/logsrvd.c:299 logsrvd/logsrvd.c:343 +#: logsrvd/logsrvd.c:398 logsrvd/logsrvd.c:445 logsrvd/logsrvd.c:496 +#: logsrvd/logsrvd.c:528 logsrvd/logsrvd.c:560 +msgid "state machine error" +msgstr "eroare de mașină de stare" + +#: logsrvd/logsrvd.c:239 +msgid "invalid AcceptMessage" +msgstr "MesajAcceptare nevalid" + +#: logsrvd/logsrvd.c:250 +msgid "error parsing AcceptMessage" +msgstr "eroare la parsarea MesajAccept" + +#: logsrvd/logsrvd.c:257 +msgid "error creating I/O log" +msgstr "eroare la crearea istoricului I/O" + +#: logsrvd/logsrvd.c:265 +msgid "error logging accept event" +msgstr "eroare la înregistrarea evenimentului de acceptare" + +#: logsrvd/logsrvd.c:308 +msgid "invalid RejectMessage" +msgstr "MesajRespingere nevalid" + +#: logsrvd/logsrvd.c:319 +msgid "error parsing RejectMessage" +msgstr "eroare la parsarea MesajRespingere" + +#: logsrvd/logsrvd.c:325 +msgid "error logging reject event" +msgstr "eroare la înregistrarea evenimentului de respingere" + +#: logsrvd/logsrvd.c:430 +msgid "error logging alert event" +msgstr "eroare la înregistrarea evenimentului de alertă" + +#: logsrvd/logsrvd.c:451 logsrvd/logsrvd.c:502 logsrvd/logsrvd.c:534 +msgid "protocol error" +msgstr "eroare de protocol" + +#: logsrvd/logsrvd.c:461 +msgid "error writing IoBuffer" +msgstr "eroare la scrierea IoBuffer" + +#: logsrvd/logsrvd.c:513 +msgid "error writing ChangeWindowSize" +msgstr "eroare la scrierea ModificăDimensiuneaFerestrei" + +#: logsrvd/logsrvd.c:545 +msgid "error writing CommandSuspend" +msgstr "eroare la scrierea SuspendăComanda" + +#: logsrvd/logsrvd.c:630 +msgid "unrecognized ClientMessage type" +msgstr "tip de MesajClient necunoscut" + +#: logsrvd/logsrvd.c:895 +msgid "client message too large" +msgstr "mesajul de client este prea mare" + +#: logsrvd/logsrvd.c:1125 logsrvd/logsrvd.c:1133 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "nu se poate stabili suita de cifrare TLS 1.2 LA %s: %s" + +#: logsrvd/logsrvd.c:1153 logsrvd/logsrvd.c:1161 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "nu se poate stabili suita de cifrare TLS 1.3 la %s: %s" + +#: logsrvd/logsrvd.c:1197 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "nu se poate obține metoda de server TLS: %s" + +#: logsrvd/logsrvd.c:1202 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "nu se poate crea contextul TLS: %s" + +#: logsrvd/logsrvd.c:1209 plugins/sudoers/iolog_client.c:237 +#, c-format +msgid "unable to load certificate %s" +msgstr "nu se poate încărca certificatul %s" + +#: logsrvd/logsrvd.c:1222 plugins/sudoers/iolog_client.c:217 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "nu se poate încărca pachetul de autoritate al certificatului %s" + +#: logsrvd/logsrvd.c:1267 plugins/sudoers/iolog_client.c:250 +#, c-format +msgid "unable to load private key %s" +msgstr "nu se poate încărca cheia privată %s" + +#: logsrvd/logsrvd.c:1284 logsrvd/logsrvd.c:1293 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "nu se pot stabili parametrii diffie-hellman: %s" + +#: logsrvd/logsrvd.c:1306 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "nu se poate stabili versiunea de protocol minimă la TLS 1.2: %s" + +#: logsrvd/logsrvd.c:1491 +msgid "unable to get remote IP addr" +msgstr "nu se poate obține adresa IP de la distanță" + +#: logsrvd/logsrvd.c:1519 plugins/sudoers/iolog_client.c:264 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Nu se pot atașa datele utilizatorului la obiectul ssl: %s" + +#: logsrvd/logsrvd.c:1527 logsrvd/logsrvd.c:1649 logsrvd/logsrvd.c:1749 +#: logsrvd/sendlog.c:1106 logsrvd/sendlog.c:1462 logsrvd/sendlog.c:1477 +#: logsrvd/sendlog.c:1535 plugins/sudoers/iolog.c:921 +#: plugins/sudoers/iolog.c:1054 plugins/sudoers/iolog.c:1152 +#: plugins/sudoers/iolog_client.c:109 plugins/sudoers/iolog_client.c:325 +#: plugins/sudoers/iolog_client.c:341 plugins/sudoers/iolog_client.c:387 +#: plugins/sudoers/iolog_client.c:567 plugins/sudoers/iolog_client.c:574 +#: plugins/sudoers/iolog_client.c:1150 plugins/sudoers/iolog_client.c:1186 +#: plugins/sudoers/iolog_client.c:1194 plugins/sudoers/iolog_client.c:1254 +#: plugins/sudoers/iolog_client.c:1361 plugins/sudoers/iolog_client.c:1477 +#: plugins/sudoers/iolog_client.c:1759 plugins/sudoers/iolog_client.c:1767 +#: plugins/sudoers/sudoreplay.c:513 plugins/sudoers/sudoreplay.c:560 +#: plugins/sudoers/sudoreplay.c:792 plugins/sudoers/sudoreplay.c:904 +#: plugins/sudoers/sudoreplay.c:994 plugins/sudoers/sudoreplay.c:1009 +#: plugins/sudoers/sudoreplay.c:1016 plugins/sudoers/sudoreplay.c:1023 +#: plugins/sudoers/sudoreplay.c:1030 plugins/sudoers/sudoreplay.c:1037 +#: plugins/sudoers/sudoreplay.c:1164 +msgid "unable to add event to queue" +msgstr "nu se poate adăuga evenimentul la coadă" + +#: logsrvd/logsrvd.c:1703 logsrvd/logsrvd.c:1937 +msgid "unable setup listen socket" +msgstr "nu se poate pregăti soclul de ascultare" + +#: logsrvd/logsrvd.c:1843 logsrvd/sendlog.c:123 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - trimite istoricul I/O sudo la serverul de la distanță\n" +"\n" + +#: logsrvd/logsrvd.c:1846 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opțini:\n" +" -f, --file calea către fișierul de configurare\n" +" -h --help afișează mesajul de ajutor și ieși\n" +" -n, --no-fork nu da fork, rulează în prim plan\n" +" -R, --random-drop șansa în procente pentru căderea conexiunii\n" +" -V, --version afișează informațiile de versiune și ieși\n" + +#: logsrvd/logsrvd.c:1898 logsrvd/sendlog.c:1700 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Protobuf-C versiunea 1.3 sau mai mare necesară" + +#: logsrvd/logsrvd.c:1916 +#, c-format +msgid "invalid random drop value: %s" +msgstr "valoare de cădere întâmplătoare nevalidă: %s" + +#: logsrvd/logsrvd.c:1920 logsrvd/sendlog.c:1750 +#: plugins/sudoers/cvtsudoers.c:229 plugins/sudoers/sudoreplay.c:300 +#: plugins/sudoers/visudo.c:178 +#, c-format +msgid "%s version %s\n" +msgstr "%s versiunea %s\n" + +#: logsrvd/logsrvd_conf.c:393 +msgid "TLS not supported" +msgstr "TLS nu este suportat" + +#: logsrvd/logsrvd_conf.c:405 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:471 logsrvd/logsrvd_conf.c:715 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: nu este o cale calificată complet" + +#: logsrvd/logsrvd_conf.c:829 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d „[” desperecheată: %s" + +#: logsrvd/logsrvd_conf.c:840 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d secțiune de configurare nevalidă: %s" + +#: logsrvd/logsrvd_conf.c:848 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d linie de configurare nevalidă: %s" + +#: logsrvd/logsrvd_conf.c:854 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d nume de secție așteptată: %s" + +#: logsrvd/logsrvd_conf.c:868 +#, c-format +msgid "invalid value for %s: %s" +msgstr "valoare nevalidă pentru %s: %s" + +#: logsrvd/logsrvd_conf.c:876 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d cheie necunoscută: %s" + +#: logsrvd/logsrvd_conf.c:1032 +#, c-format +msgid "unknown syslog facility %s" +msgstr "facilitate de syslog necunoscută %s" + +#: logsrvd/logsrvd_conf.c:1036 logsrvd/logsrvd_conf.c:1040 +#: logsrvd/logsrvd_conf.c:1044 +#, c-format +msgid "unknown syslog priority %s" +msgstr "prioritate de syslog necunoscută %s" + +#: logsrvd/sendlog.c:126 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opțiuni:\n" +" --help afișează mesajul de ajutor și ieși\n" +" -A, --accept trimite doar un eveniment de acceptare (fără I/O)\n" +" -h, --host gazda la care să se trimită înregistrări\n" +" -i, --iolog_id ID-ul de la distanță al istoricului I/O de rezumat \n" +" -p, --port portul de utilizat când se conectează la gazdă\n" +" -r, --restart repornește transferul de istoric I/O anterior\n" +" -R, --reject respinge comanda cu motivul dat\n" +" -b, --ca-bundle fișier de pachet de certificat împotriva căruia se verifică certificarea serverului\n" +" -c, --cert fișierul certificat pentru conexiunea TLS\n" +" -k, --key fișier cheie privată\n" +" -n, --no-verify nu verifica certificatul serverului\n" +" -V, --version afișează informațiile de versiune și ieși\n" + +#: logsrvd/sendlog.c:163 plugins/sudoers/iolog_client.c:433 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "nu se poate căuta %s:%s: %s" + +#: logsrvd/sendlog.c:186 +msgid "unable to get server IP addr" +msgstr "nu se poate obține adresa IP a serverului" + +#: logsrvd/sendlog.c:240 plugins/sudoers/sudoreplay.c:852 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "nu se poate citi %s/%s: %s" + +#: logsrvd/sendlog.c:261 plugins/sudoers/iolog_client.c:684 +#, c-format +msgid "client message too large: %zu" +msgstr "mesajul clientului este prea mare: %zu" + +#: logsrvd/sendlog.c:791 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: preîncărcare de scriere deja în uz" + +#: logsrvd/sendlog.c:843 plugins/sudoers/iolog.c:845 +#: plugins/sudoers/iolog.c:914 +#, c-format +msgid "unexpected I/O event %d" +msgstr "eveniment I/O neașteptat %d" + +#: logsrvd/sendlog.c:889 logsrvd/sendlog.c:906 logsrvd/sendlog.c:940 +#: plugins/sudoers/iolog_client.c:1155 plugins/sudoers/iolog_client.c:1225 +#: plugins/sudoers/iolog_client.c:1273 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: stare neașteptată %d" + +#: logsrvd/sendlog.c:912 plugins/sudoers/iolog_client.c:1231 +msgid "invalid ServerHello" +msgstr "SalutServer nevalid" + +#: logsrvd/sendlog.c:976 plugins/sudoers/iolog_client.c:1317 +#, c-format +msgid "error message received from server: %s" +msgstr "mesaj de eroare primit de la server: %s" + +#: logsrvd/sendlog.c:989 plugins/sudoers/iolog_client.c:1330 +#, c-format +msgid "abort message received from server: %s" +msgstr "mesaj de renunțare primit de la server: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/iolog_client.c:1349 +msgid "unable to unpack ServerMessage" +msgstr "nu se poate despacheta MesajServer" + +#: logsrvd/sendlog.c:1048 plugins/sudoers/iolog_client.c:1382 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: valoare type_case neașteptată %d" + +#: logsrvd/sendlog.c:1077 +msgid "timeout reading from server" +msgstr "limită de timp de citire de la server" + +#: logsrvd/sendlog.c:1155 +msgid "premature EOF" +msgstr "EOF prematur" + +#: logsrvd/sendlog.c:1168 plugins/sudoers/iolog_client.c:1536 +#, c-format +msgid "server message too large: %u" +msgstr "mesajul de server este prea mare: %u" + +#: logsrvd/sendlog.c:1219 +msgid "timeout writing to server" +msgstr "limită de timp de scriere la server" + +#: logsrvd/sendlog.c:1438 plugins/sudoers/iolog_client.c:297 +msgid "TLS handshake timeout occurred" +msgstr "A apărut o limită de timp a conexiunii TLS" + +#: logsrvd/sendlog.c:1457 logsrvd/sendlog.c:1472 +#: plugins/sudoers/iolog_client.c:319 plugins/sudoers/iolog_client.c:335 +msgid "unable to set event" +msgstr "nu se poate stabili evenimentul" + +#: logsrvd/sendlog.c:1482 logsrvd/sendlog.c:1486 +#, c-format +msgid "TLS connection failed: %s" +msgstr "Conexiunea TLS a eșuat: %s" + +#: logsrvd/sendlog.c:1519 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Nu se poate inițializa contextul ssl: %s" + +#: logsrvd/sendlog.c:1524 plugins/sudoers/iolog_client.c:259 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Nu se poate aloca obiectul ssl: %s" + +#: logsrvd/sendlog.c:1529 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Nu se poate atașa soclul la obiectul ssl: %s" + +#: logsrvd/sendlog.c:1773 +msgid "both restart point and iolog ID must be specified" +msgstr "trebuie specificate ambele ID-ul iolog și punctul de repornire" + +#: logsrvd/sendlog.c:1777 +msgid "a restart point may not be set when no I/O is sent" +msgstr "un punct de repornire poate să nu fie stabilit când niciun I/O nu este stabilit" + +#: logsrvd/sendlog.c:1852 +#, c-format +msgid "exited prematurely with state %d" +msgstr "a ieșit prematur cu starea %d" + +#: logsrvd/sendlog.c:1853 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "timpul scurs trimis la server [%lld, %ld]" + +#: logsrvd/sendlog.c:1855 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "punctul de comit primit de la server [%lld, %ld]" + +#: plugins/sudoers/alias.c:144 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Aliasul „%s” este deja definit" + +#: plugins/sudoers/auth/aix_auth.c:198 plugins/sudoers/logging.c:784 +msgid "unable to fork" +msgstr "nu se poate da fork" + +#: plugins/sudoers/auth/aix_auth.c:278 +#, c-format +msgid "unable to change password for %s" +msgstr "nu se poate schimba parola pentru %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "nu se poate obține clasa de autentificare pentru utilizatorul %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "nu se poate începe autentificarea bsd" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "tip de autentificare nevalid" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "nu se poate inițializa autentificarea BSD" + +#: plugins/sudoers/auth/bsdauth.c:180 +msgid "your account has expired" +msgstr "contul a expirat" + +#: plugins/sudoers/auth/bsdauth.c:182 +msgid "approval failed" +msgstr "aprobarea a eșuat" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "nu se poate citi configurarea fwtk" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "nu se poate conecta la serverul de autentificare" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "s-a pierdut conexiunea la serverul de autentificare" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"eroare server de autentificare:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: nu se poate converti principalul la șir („%s”): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: nu se poate parsa „%s”: %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: nu se poate rezolva cache-ul de certificare: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: nu se pot aloca opțiunile: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: nu se pot obține certificările: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: nu se poate inițializa cache-ul de certificare: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: nu se poate stoca certificarea în cache: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: nu se poate obține principalul gazdei: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Nu se poate verifica TGT! Posibil atac!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "nu se poate inițializa PAM: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Eroare de autentificare PAM: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "eșec la validarea contului, este contul blocat?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Contul sau parola au expirat, restabiliți parola și încercați din nou" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "nu se poate schimba parola expirată: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Parolă expirată, contactați administratorul de sistem" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Contul este expirat sau configurării PAM îi lipsește o secțiune „cont” pentru sudo, contactați administratorul de sistem" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Eroare de gestionare a contului PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:242 +#, c-format +msgid "you do not exist in the %s database" +msgstr "nu existați în baza de date %s" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "nu s-a putut inițializa biblioteca API ACE" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "nu se poate contacta serverul SecurID" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "ID-ul utilizatorului blocat pentru autentificarea SecurID" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "lungime de nume de utilizator nevalidă pentru SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "mâner de autentificare nevalid pentru SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "Comunicarea SecurID a eșuat" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:212 +msgid "unknown SecurID error" +msgstr "eroare de SecurID necunoscută" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "lungime de cod de parolă nevalidă pentru SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:124 +msgid "unable to initialize SIA session" +msgstr "nu se poate inițializa sesiunea SIA" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "metode de autentificare nevalide" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Metode de autentificare nevalide compilate în sudo! Nu se pot amesteca autentificările autonome și neautonome." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "nu există metode de autentificare" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Nu există metode de autentificare compilate în sudo! Dacă doriți să opriți autentificarea, utilizați opțiunea de configurare --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Nu se pot inițializa metodele de autentificare." + +#: plugins/sudoers/auth/sudo_auth.c:473 +msgid "Authentication methods:" +msgstr "Metode de autentificare:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Nu s-a putut determina condiția de audit" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "nu se poate comite înregistrarea de audit" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Avem încredere că ați primit lectura obișnuită de la administratorul de\n" +"sistem local. De obicei se reduce la aceste trei lucruri:\n" +"\n" +" #1) Respectă intimitatea celorlalți.\n" +" #2) Gândește înainte de a tasta.\n" +" #3) Cu putere mare vine o mare responsabilitate.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:763 plugins/sudoers/sudoers.c:811 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "uid necunoscut: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/iolog.c:117 +#: plugins/sudoers/policy.c:1037 plugins/sudoers/sudoers.c:387 +#: plugins/sudoers/sudoers.c:388 plugins/sudoers/sudoers.c:1240 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:392 +#, c-format +msgid "unknown user: %s" +msgstr "utilizator necunoscut: %s" + +#: plugins/sudoers/cvtsudoers.c:195 +#, c-format +msgid "order increment: %s: %s" +msgstr "incrementarea ordinii: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:211 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordinea de început: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:221 +#, c-format +msgid "order padding: %s: %s" +msgstr "umplutură de ordin: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:231 plugins/sudoers/visudo.c:180 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s versiune de gramatică %d\n" + +#: plugins/sudoers/cvtsudoers.c:248 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "format de intrare nesuportat %s" + +#: plugins/sudoers/cvtsudoers.c:263 +#, c-format +msgid "unsupported output format %s" +msgstr "format de ieșire nesuportat %s" + +#: plugins/sudoers/cvtsudoers.c:315 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: fișierele de intrare și ieșire trebuie să fie diferite" + +#: plugins/sudoers/cvtsudoers.c:331 plugins/sudoers/sudoers.c:181 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:248 +#: plugins/sudoers/visudo.c:604 plugins/sudoers/visudo.c:927 +msgid "unable to initialize sudoers default values" +msgstr "nu se poate inițializa valorile implicite a sudoers" + +#: plugins/sudoers/cvtsudoers.c:417 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:476 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: cuvânt cheie necunoscut: %s" + +#: plugins/sudoers/cvtsudoers.c:522 +#, c-format +msgid "invalid defaults type: %s" +msgstr "tip de implicite nevalid: %s" + +#: plugins/sudoers/cvtsudoers.c:545 +#, c-format +msgid "invalid suppression type: %s" +msgstr "tip de suprimare nevalid: %s" + +#: plugins/sudoers/cvtsudoers.c:585 plugins/sudoers/cvtsudoers.c:599 +#, c-format +msgid "invalid filter: %s" +msgstr "filtru nevalid: %s" + +#: plugins/sudoers/cvtsudoers.c:618 plugins/sudoers/cvtsudoers.c:635 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:861 +#: plugins/sudoers/cvtsudoers_ldif.c:680 plugins/sudoers/sudoers.c:986 +#: plugins/sudoers/sudoreplay.c:1436 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:923 +#, c-format +msgid "unable to open %s" +msgstr "nu se poate deschide %s" + +#: plugins/sudoers/cvtsudoers.c:638 plugins/sudoers/visudo.c:932 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "nu s-a putut parsa fișierul %s, eroare necunoscută" + +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/visudo.c:949 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "eroare de parsare în %s aproape de linia %d\n" + +#: plugins/sudoers/cvtsudoers.c:649 plugins/sudoers/visudo.c:952 +#, c-format +msgid "parse error in %s\n" +msgstr "eroare de parsare în %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/sudoreplay.c:1125 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "nu se poate scrie la %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - convertește între formatele de fișier sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options:\n" +" -b, --base=dn baza DN pentru interogări LDAP sudo\n" +" -c, --config=conf_file calea către fișierul de configurare\n" +" -d, --defaults=deftypes convertește implicite doar pentru tipurile specificate\n" +" -e, --expand-aliases extinde aliasurile când se convertește\n" +" -f, --output-format=format de ieșire stabilit de format: JSON, LDIF sau sudoers\n" +" -i, --input-format=format format de intrare stabilit: LDIF sau sudoers\n" +" -I, --increment=num cantitate cu care se mărește fiecare sudoOrder\n" +" -h, --help afișează mesajul de ajutor și ieși\n" +" -m, --match=filter conertește doar intrările care se potrivesc cu filtrul\n" +" -M, --match-local filtrul potrivit utilizează passwd și baze de date ale grupului\n" +" -o, --output=output_file scrie sudoers convertit la fișierul_ieșire\n" +" -O, --order-start=num punct de început pentru primul sudoOrder\n" +" -p, --prune-matches reduce utilizatori, grupuri și gazde care nu se potrivesc\n" +" -P, --padding=num umplutură de bază pentru incrementarea sudoOrder\n" +" -s, --suppress=sections suprimă ieșirea a anumitor acțiuni\n" +" -V, --version afișează informația versiunii și ieși" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:702 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "intrare de implicite necunoscută „%s”" + +#: plugins/sudoers/cvtsudoers_json.c:640 plugins/sudoers/cvtsudoers_json.c:653 +#: plugins/sudoers/cvtsudoers_ldif.c:345 plugins/sudoers/cvtsudoers_ldif.c:356 +#: plugins/sudoers/ldap.c:502 +msgid "unable to get GMT time" +msgstr "nu se poate obține ora GMT" + +#: plugins/sudoers/cvtsudoers_json.c:643 plugins/sudoers/cvtsudoers_json.c:656 +#: plugins/sudoers/cvtsudoers_ldif.c:348 plugins/sudoers/cvtsudoers_ldif.c:359 +#: plugins/sudoers/ldap.c:508 +msgid "unable to format timestamp" +msgstr "nu se poate formata marcajul de timp" + +#: plugins/sudoers/cvtsudoers_ldif.c:632 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "prea multe intrări sudoers, maximum %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:675 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "variabila de mediu SUDOERS_BASE nu este stabilită și opțiunea -b nu a fost specificată." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Facilitatea syslog dacă syslog este utilizat pentru înregistrare: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Prioritatea syslog de utilizat când utilizatorul se autentifică cu succes: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Prioritatea syslog de utilizat când utilizatorul nu se autentifică cu succes: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Plasează prompterul OTP pe propria linie" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignoră „.” în $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Trimite întotdeauna mail când sudo este rulat" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Trimite mail dacă autentificarea eșuează" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Trimite mail dacă utilizatorul nu este în sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Trimite mail dacă utilizatorul nu este în sudoers pentru această gazdă" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Trimite mail dacă utilizatorul nu are voie să ruleze o comandă" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Trimite mail dacă utilizatorul încearcă să ruleze o comandă" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Utilizează un marcaj de timp separat pentru fiecare combinare utilizator/tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Ține o prelegere utilizatorului când rulează pentru prima dată sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fișierul care conține lectura sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Cere utilizatorilor să se autentifice ca implicit" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root poate rula sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Înregistrează numele gazdei în fișierul de înregistrare (ne-syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Înregistrează anul fișierului de înregistrare (ne-syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Dacă sudo este invocat fără argumente, pornește un shell" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Stabilește $HOME la ținta utilizatorului când se pornește un shell cu -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Totdeauna stabilește $HOME la directorul personal al utilizatorului țintă" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permite colectarea de informații pentru a da eroare de mesaje utile" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Necesită nume de gazdă calificate complet în fișierul sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insultă utilizatorul când introduce o parolă incorectă" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Permite utilizatorului să ruleze sudo doar dacă are un tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo va onora variabila de mediu EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Solicită parola pentru root, nu a utilizatorului" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Solicită pentru parola utilizatorului runas_default, nu a utilizatorului" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Solicită pentru parola utilizatorului țintă, nu a utilizatorului" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Aplică implicitele în clasa de autentificare a utilizatorului țintă dacă aceasta există" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Stabilește variabilele de mediu NUMEISTORIC și UTILIZATOR" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Stabilește doar uid-ul efectiv la utilizatorul țintă, nu uid-ul real" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Nu inițializa vectorul de grup la cel al utilizatorului țintă" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Lungimea la care să se încadreze liniile fișierului istoric (0 pentru fără încadrare): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Limită de timp a datării de autentificare: %.1f minute" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Limită de timp a solicitării parolei: %.1f minute" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Numărul de încercări pentru a introduce o parolă: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Demascarea de utilizat sau 0777 de utilizat pentru utilizator: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Calea la fișierul de înregistrare: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Calea la programul de mail: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Fanioane pentru programul de mail: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adresa la care să se trimită mailul: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adresa de la care să se trimită mailul: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Linia de subiect pentru mesajele mail: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Mesaj de parolă incorect: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Cale către directorul de stare de lectură: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Cale către directorul de datare de autentificare: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Deținător al directorului de datare de autentificare: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Utilizatorii din acest grup sunt scutiți de la cerințele parolei și PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Prompter de parolă implicită: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Dacă este stabilit, prompterul de parolă va suprascrie prompterul de sistem în toate cazurile." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Utilizatorul implicit cu care să se ruleze comenzile: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valoarea cu care să se suprascrie $PATH a utilizatorului: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Calea către editorul de utilizat de visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Când să se ceară o parolă pentru pseudocomanda „listează”: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Când să se ceară o parolă pentru pseudocomanda „verifică”: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Preîncarcă funcțiile de execuție dummy conținute în biblioteca sudo_nonexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Dacă directorul LDAP este jos, se ignoră fișierul sudoers local" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Descriptorii de fișier >= %d vor fi închise înainte de executarea unei comenzi" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Dacă este stabilit, utilizatorii pot să suprascrie valoarea a „closeform” cu opțiunea -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permite utilizatorilor să stabilească variabile de mediu arbitrare" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Restabilește mediul la un set de variabile implicite" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Variabile de mediu pentru a verifica starea de sănătate:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Variabile de mediu de eliminat:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Variabile de mediu de păstrat:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Rolul SELinux de utilizat în contextul de securitate nou: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Tipul SELinux de utilizat în contextul de securitate nou: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Calea către fișierul de mediu specific sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Calea către fișierul de mediu specific sudo restricționat: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Localizare de utilizat în timpul parsării sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permite sudo să solicite o parolă chiar dacă ar fi vizibilă" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Furnizează feedback vizual la solicitarea parolei când există intrare de utilizator" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Utilizează expandare mai rapidă care este mai puțin exactă dar nu accesează sistemul de fișiere" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Demascarea specificată în sudoers o va suprascrie pe cea a utilizatorului, chiar dacă este mai permisivă" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Înregistrează intrarea utilizatorului pentru comanda care se rulează" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Înregistrează ieșire comenzii care se rulează" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Comprimă înregistrările I/O utilizând zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Totdeauna rulează comenzile într-un pseudo-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Modul pentru suport de grup non-Unix: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Director în care să se stocheze înregistrările intrare/ieșire: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fișier în care să se stocheze înregistrarea intrare/ieșire: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Adaugă o intrare la fișierul utmp/utmpx când se alocă un pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Stabilește utilizatorul în utmp la utilizatorul runas, nu la utilizatorul care invocă" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Setul de privilegii permise: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Setul de privilegii limită: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Rulează comenzile pe un pty în fundal" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nume de serviciu PAM de utilizat: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nume de serviciu PAM de utilizat pentru shell-urile de autentificare: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Încearcă să stabilești certificări PAM pentru utilizatorul țintă" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Creează o sesiune PAM pentru a rula comanda în ea" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Execută gestionare de validare de cont PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Număr de secvență de istoric I/O maxim: %s" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Activează suportul de grup de rețea sudoers" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Verifică directoarele părinte pentru capacitatea de scriere când se editează fișiere cu sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Urmărește legăturile simbolice când se editează fișierele cu sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Interoghează modulul grupului pentru grupuri de sistem necunoscute" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Potrivește grupurile de rețea pe baza întregului tuplu: utilizator, gazdă și domeniu" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permite comenzile să fie rulate chiar dacă sudo nu poate scrie la istoricul audit" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permite comenzile să fie rulate chiar dacă sudo nu poate scrie la istoricul I/O" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permite comenzile să fie rulate chiar dacă sudo nu poate scrie la fișierul istoric" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Rezolvă grupurile în sudoers și potrivește pe ID-ul grupului, nu pe nume" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Intrările în istoric mai mari decât această valoare vor fi împărțite în mesaje syslog multiple: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Utilizator care va deține fișierele istoricului I/O: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupul care va deține fișierele istoric I/O: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Modul de fișier de utilizat pentru fișierele istoric I/O: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Execută comenzile prin descriptorul fișierului în loc de cale: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignoră intrările Implicite necunoscute în sudoers în locul producerii unui avertisment" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Timpul în secunde după care comanda va fi terminată: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permite utilizatorul să specifice o limită de timp pe linia de comandă" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Curătați datele de istoric I/O pe disc imediat în loc să le preîncărcați" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Include ID-ul procesului când se înregistrează via syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipul de înregistrare de limită de timp de autentificare: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Mesaj de eșuare de autentificare: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignoră majusculele când se potrivesc numele de utilizator" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignoră majusculele când se potrivesc numele de grupuri" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Înregistrează când o comandă este permisă de sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Înregistrează când o comandă este respinsă de sudoers" + +#: plugins/sudoers/def_data.c:510 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Server(e) de înregistrare sudo de conectat cu portul opțional" + +#: plugins/sudoers/def_data.c:514 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Limită de timp de server de înregistrare sudo în secunde: %u" + +#: plugins/sudoers/def_data.c:518 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Activează opțiunea de soclu SO_KEEPALIVE pe soclul conectat la serverul de înregistrare" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Calea către fișierul pachet CA al serverului audit: %s" + +#: plugins/sudoers/def_data.c:526 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Calea către fișierul certificat sudoers: %s" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Calea către fișierul cheie privată sudoers: %s" + +#: plugins/sudoers/def_data.c:534 +msgid "Verify that the log server's certificate is valid" +msgstr "Verifică dacă certificatul serverului istoricului este valid" + +#: plugins/sudoers/def_data.c:538 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Permite utilizarea de ID-ul de grup și/sau utilizator runas necunoscut" + +#: plugins/sudoers/def_data.c:542 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Permite doar rularea de comenzi ca un utilizator cu un shell valid" + +#: plugins/sudoers/def_data.c:546 +msgid "Set the pam remote user to the user running sudo" +msgstr "Stabilește utilizatorul de la distanță pam la utilizatorul care rulează sudo" + +#: plugins/sudoers/def_data.c:550 +msgid "Set the pam remote host to the local host name" +msgstr "Stabilește gazda de la distanță pam la numele de gazdă local" + +#: plugins/sudoers/defaults.c:183 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d intrare implicite necunoscută „%s”" + +#: plugins/sudoers/defaults.c:186 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: intrare implicite necunoscută „%s”" + +#: plugins/sudoers/defaults.c:229 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d nicio valoare specificată pentru „%s”" + +#: plugins/sudoers/defaults.c:232 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nicio valoare specificată pentru „%s”" + +#: plugins/sudoers/defaults.c:252 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d valorile pentru „%s” trebuie să înceapă cu un „/”" + +#: plugins/sudoers/defaults.c:255 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: valorile pentru „%s” trebuie să înceapă cu un „/”" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d opțiunea „%s” nu ia o valoare" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: opțiunea „%s” nu ia o valoare" + +#: plugins/sudoers/defaults.c:305 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d tip de implicite nevalid 0x%x pentru opțiunea „%s”" + +#: plugins/sudoers/defaults.c:308 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: tip de implicite nevalid 0x%x pentru opțiunea „%s”" + +#: plugins/sudoers/defaults.c:318 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d valoarea „%s” nu este validă pentru opțiunea „%s”" + +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: valoarea „%s” nu este validă pentru opțiunea „%s”" + +#: plugins/sudoers/env.c:404 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp corupt, nepotrivire a lungimii" + +#: plugins/sudoers/env.c:1131 +msgid "unable to rebuild the environment" +msgstr "nu se poate regenera mediul" + +#: plugins/sudoers/env.c:1205 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "nu aveți permisiunea de a stabili următoarele variabile de mediu: %s" + +#: plugins/sudoers/file.c:104 +#, c-format +msgid "parse error in %s near line %d" +msgstr "eroare de parsare în %s lângă linia %d" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s" +msgstr "eroare de parsare în %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tip de digest nesuportat %d pentru %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: eroare de citire" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s trebuie să fie deținut de uid-ul %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s nu trebuie să fie inscriptibilă de către deținător" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:571 +#, c-format +msgid "unable to load %s: %s" +msgstr "nu se poate încărca %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "nu se poate găsi simbolul „group_plugin” în %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: versiune majoră de modul de grup incompatibilă %d, s-a așteptat %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "nu se poate parsa adresa IP „%s”" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "nu se poate parsa masca de rețea „%s”" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Perechile adresă de IP locală și mască de rețea:\n" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/sudoers.c:393 +#: plugins/sudoers/sudoers.c:394 plugins/sudoers/sudoers.c:1274 +#: plugins/sudoers/testsudoers.c:416 +#, c-format +msgid "unknown group: %s" +msgstr "grup necunoscut: %s" + +#: plugins/sudoers/iolog.c:517 plugins/sudoers/iolog.c:807 +#: plugins/sudoers/iolog.c:959 plugins/sudoers/iolog.c:966 +#: plugins/sudoers/iolog.c:1087 plugins/sudoers/iolog.c:1094 +#: plugins/sudoers/iolog.c:1193 plugins/sudoers/iolog.c:1200 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "nu se poate scrie la fișierul istoric I/O: %s" + +#: plugins/sudoers/iolog.c:566 +msgid "unable to update sequence file" +msgstr "nu se poate actualiza fișierul de secvență" + +#: plugins/sudoers/iolog.c:605 +#, c-format +msgid "unable to create %s/%s" +msgstr "nu se poate crea %s/%s" + +#: plugins/sudoers/iolog.c:631 +msgid "unable to connect to log server" +msgstr "nu se poate conecta la serverul de înregistrare" + +#: plugins/sudoers/iolog.c:851 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: eroare internă, fișierul istoric I/O pentru evenimentul %d nu este deschis" + +#: plugins/sudoers/iolog.c:944 plugins/sudoers/iolog.c:1072 +#: plugins/sudoers/iolog.c:1177 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:492 +#: plugins/sudoers/visudo.c:498 +msgid "unable to read the clock" +msgstr "nu se poate citi ceasul" + +#: plugins/sudoers/iolog.c:1169 plugins/sudoers/iolog_client.c:977 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: eroare internă, semnal nevalid %d" + +#: plugins/sudoers/iolog_client.c:113 plugins/sudoers/iolog_client.c:392 +#: plugins/sudoers/iolog_client.c:1200 plugins/sudoers/iolog_client.c:1775 +msgid "error in event loop" +msgstr "eroare în bucla de eveniment" + +#: plugins/sudoers/iolog_client.c:194 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Crearea obiectului SSL_CTX nou a eșuat: %s" + +#: plugins/sudoers/iolog_client.c:346 plugins/sudoers/iolog_client.c:351 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "Conexiunea TLS la %s:%s a eșuat: %s" + +#: plugins/sudoers/iolog_client.c:496 +msgid "TLS initialization was unsuccessful" +msgstr "Inițializarea TLS nu a fost cu succes" + +#: plugins/sudoers/iolog_client.c:505 +msgid "TLS handshake was unsuccessful" +msgstr "Conectarea TLS nu a fost cu succes" + +#: plugins/sudoers/iolog_client.c:767 plugins/sudoers/iolog_client.c:959 +msgid "unable to get time of day" +msgstr "nu se poate obține timpul zilei" + +#: plugins/sudoers/iolog_client.c:986 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: eroare internă, stare de ieșire nevalidă %d" + +#: plugins/sudoers/iolog_client.c:1523 +msgid "lost connection to log server" +msgstr "a fost pierdută conexiunea la serverul de înregistrare" + +#: plugins/sudoers/iolog_client.c:1600 +msgid "missing write buffer" +msgstr "lipsește preîncărcarea de scriere" + +#: plugins/sudoers/ldap.c:176 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls nu este suportată când se utilizează ldaps" + +#: plugins/sudoers/ldap.c:247 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "nu se poate inițializa certificatul SSL și db a cheii: %s" + +#: plugins/sudoers/ldap.c:250 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "trebuie să stabiliți TLS_CERT în %s pentru a utiliza SSL" + +#: plugins/sudoers/ldap.c:1658 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "nu se poate inițializa LDAP: %s" + +#: plugins/sudoers/ldap.c:1694 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls specificat dar libs LDAP nu suportă ldap_start_tls_s() sau ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1831 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "atribut sudoOrder nevalid: %s" + +#: plugins/sudoers/ldap_conf.c:200 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: portul prea mare" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tip uri LDAP nesuportat: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "nu se pot fuziona URI-uri ldap și ldaps" + +#: plugins/sudoers/ldap_util.c:548 plugins/sudoers/ldap_util.c:550 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "nu se poate converti sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "nu se poate deschide sistemul audit" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "nu se poate trimite mesajul de audit" + +#: plugins/sudoers/logging.c:167 +#, c-format +msgid "unable to open log file: %s" +msgstr "nu se poate deschide fișierul de istoric: %s" + +#: plugins/sudoers/logging.c:175 +#, c-format +msgid "unable to lock log file: %s" +msgstr "nu se poate bloca fișierul de istoric: %s" + +#: plugins/sudoers/logging.c:208 +#, c-format +msgid "unable to write log file: %s" +msgstr "nu se poate scrie fișierul de istoric: %s" + +#: plugins/sudoers/logging.c:241 +msgid "user NOT in sudoers" +msgstr "utilizatorul NU este în sudoers" + +#: plugins/sudoers/logging.c:243 +msgid "user NOT authorized on host" +msgstr "utilizatorul NU este autorizat pe gazdă" + +#: plugins/sudoers/logging.c:245 +msgid "command not allowed" +msgstr "comanda nu este permisă" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nu este în fișierul sudoers. Acest incident va fi raportat.\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nu are permisiunea de a rula sudo pe %s. Acest incident va fi raportat.\n" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Utilizatorul %s poate să nu ruleze sudo pe %s.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Utilizatorului %s nu îi este permis să execute „%s%s%s” ca %s%s%s pe %s.\n" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:512 +#: plugins/sudoers/sudoers.c:514 plugins/sudoers/sudoers.c:516 +#: plugins/sudoers/sudoers.c:518 plugins/sudoers/sudoers.c:665 +#: plugins/sudoers/sudoers.c:667 +#, c-format +msgid "%s: command not found" +msgstr "%s: comanda nu a fost găsită" + +#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:508 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"se ignoră „%s” găsit în „.”\n" +"Utilizați „sudo ./%s” dacă acesta este „%s” pe care doriți să îl rulați." + +#: plugins/sudoers/logging.c:354 +msgid "authentication failure" +msgstr "eșec de autentificare" + +#: plugins/sudoers/logging.c:380 +msgid "a password is required" +msgstr "o parolă este necesară" + +#: plugins/sudoers/logging.c:450 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u încercare de parolă incorectă" +msgstr[1] "%u încercări de parolă incorecte" +msgstr[2] "%u de încercări de parole incorecte" + +#: plugins/sudoers/logging.c:714 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "nu se poate duplica stdin: %m" + +#: plugins/sudoers/logging.c:751 +#, c-format +msgid "unable to execute %s: %m" +msgstr "nu se poate executa %s: %m" + +#: plugins/sudoers/logging.c:792 plugins/sudoers/logging.c:848 +#, c-format +msgid "unable to fork: %m" +msgstr "nu se poate da fork: %m" + +#: plugins/sudoers/logging.c:838 +#, c-format +msgid "unable to open pipe: %m" +msgstr "nu se poate opri conexiunea: %m" + +#: plugins/sudoers/match_digest.c:116 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "digest pentru %s (%s) nu este în forma %s" + +#: plugins/sudoers/parse.c:442 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Rolul LDAP: %s\n" + +#: plugins/sudoers/parse.c:445 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Intrare sudoers:\n" + +#: plugins/sudoers/parse.c:447 +#, c-format +msgid " RunAsUsers: " +msgstr " RuleazăCaUtilizatori: " + +#: plugins/sudoers/parse.c:462 +#, c-format +msgid " RunAsGroups: " +msgstr " RuleazăCaGrupuri: " + +#: plugins/sudoers/parse.c:472 +#, c-format +msgid " Options: " +msgstr " Opțiuni: " + +#: plugins/sudoers/parse.c:522 +#, c-format +msgid " Commands:\n" +msgstr " Comenzi:\n" + +#: plugins/sudoers/parse.c:713 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Se potrivesc intrările implicite pentru %s pe %s:\n" + +#: plugins/sudoers/parse.c:731 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Implicite specifice comenzii și runas pentru %s:\n" + +#: plugins/sudoers/parse.c:749 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Utilizatorul %s poate să ruleze următoarele comenzi pe %s:\n" + +#: plugins/sudoers/parse.c:764 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Utilizatorului %s nu îi este permisă să ruleze sudo pe %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "se ignoră sudoRole incomplet cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "atribut LDIF nevalid: %s" + +#: plugins/sudoers/policy.c:77 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s nevalid stabilit de interfața sudo" + +#: plugins/sudoers/policy.c:281 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "nu se poate parsa lista de adrese de rețea" + +#: plugins/sudoers/policy.c:426 +msgid "user name not set by sudo front-end" +msgstr "numele de utilizator nu este stabilit de interfața sudo" + +#: plugins/sudoers/policy.c:430 +msgid "user-ID not set by sudo front-end" +msgstr "ID-ul utilizatorului nu este stabilită de interfața sudo" + +#: plugins/sudoers/policy.c:434 +msgid "group-ID not set by sudo front-end" +msgstr "ID-ul grupului nu este stabilit de interfața sudo" + +#: plugins/sudoers/policy.c:438 +msgid "host name not set by sudo front-end" +msgstr "numele gazdei nu este stabilit de interfața sudo" + +#: plugins/sudoers/policy.c:896 plugins/sudoers/visudo.c:230 +#: plugins/sudoers/visudo.c:861 +#, c-format +msgid "unable to execute %s" +msgstr "nu se poate executa %s" + +#: plugins/sudoers/policy.c:1060 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Versiune de modul de politică sudoers %s\n" + +#: plugins/sudoers/policy.c:1062 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versiune de gramatică de fișier sudoers %d\n" + +#: plugins/sudoers/policy.c:1066 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Cale sudoers: %s\n" + +#: plugins/sudoers/policy.c:1069 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "cale nsswitch: %s\n" + +#: plugins/sudoers/policy.c:1071 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "cale ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:1072 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "cale ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:1105 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "nu se poate înregistra hook-ul de tipul %d (versiunea %d.%d)" + +#: plugins/sudoers/pwutil.c:214 plugins/sudoers/pwutil.c:232 +#, c-format +msgid "unable to cache uid %u" +msgstr "nu se poate plasa în cache uid-ul %u" + +#: plugins/sudoers/pwutil.c:226 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "nu se poate plasa în cache uid-ul %u, există deja" + +#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:304 +#: plugins/sudoers/pwutil.c:367 plugins/sudoers/pwutil.c:412 +#, c-format +msgid "unable to cache user %s" +msgstr "nu se poate plasa în cache utilizatorul %s" + +#: plugins/sudoers/pwutil.c:299 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "nu se poate plasa în cache utilizatorul %s, există deja" + +#: plugins/sudoers/pwutil.c:531 plugins/sudoers/pwutil.c:549 +#, c-format +msgid "unable to cache gid %u" +msgstr "nu se poate plasa în cache gid-ul %u" + +#: plugins/sudoers/pwutil.c:543 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "nu se poate plasa în cache gid-ul %u, există deja" + +#: plugins/sudoers/pwutil.c:596 plugins/sudoers/pwutil.c:614 +#: plugins/sudoers/pwutil.c:662 plugins/sudoers/pwutil.c:704 +#, c-format +msgid "unable to cache group %s" +msgstr "nu se poate plasa în cache grupul %s" + +#: plugins/sudoers/pwutil.c:609 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "nu se poate plasa în cache %s, există deja" + +#: plugins/sudoers/pwutil.c:831 plugins/sudoers/pwutil.c:883 +#: plugins/sudoers/pwutil.c:933 plugins/sudoers/pwutil.c:986 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "nu se poate plasa în cache lista grupului pentru %s, există deja" + +#: plugins/sudoers/pwutil.c:837 plugins/sudoers/pwutil.c:888 +#: plugins/sudoers/pwutil.c:939 plugins/sudoers/pwutil.c:991 +#, c-format +msgid "unable to cache group list for %s" +msgstr "nu se poate plasa în cache lista grupului pentru %s" + +#: plugins/sudoers/pwutil.c:877 +#, c-format +msgid "unable to parse groups for %s" +msgstr "nu se pot parsa grupurile pentru %s" + +#: plugins/sudoers/pwutil.c:980 +#, c-format +msgid "unable to parse gids for %s" +msgstr "nu se pot parsa gid-urile pentru %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "supraplin de stivă permanent" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "subplin de stivă permanent" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "nu se poate schimba la gid-ul root" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "nu se poate schimba la gid-ul runas" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "nu se poate stabili vectorul de grup runas" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "nu se poate schimba uid-ul runas" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "nu se poate schimba gid-ul sudoers" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "prea multe procese" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "nu se poate obține directorul de lucru" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "cale de audit trunchiată user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "cale de audit trunchiată argv[0]: %s" + +#: plugins/sudoers/sssd.c:573 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "nu se poate inițializa sursa SSS. Este SSSD instalat pe mașină?" + +#: plugins/sudoers/sssd.c:581 plugins/sudoers/sssd.c:590 +#: plugins/sudoers/sssd.c:599 plugins/sudoers/sssd.c:608 +#: plugins/sudoers/sssd.c:617 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nu se poate găsi simbolul „%s” în %s" + +#: plugins/sudoers/sudoers.c:217 plugins/sudoers/sudoers.c:943 +msgid "problem with defaults entries" +msgstr "problemă cu intrările implicite" + +#: plugins/sudoers/sudoers.c:221 +msgid "no valid sudoers sources found, quitting" +msgstr "nicio sursă sudoers validă, se iese" + +#: plugins/sudoers/sudoers.c:297 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers specifică că root nu are permisiunea să sudo" + +#: plugins/sudoers/sudoers.c:357 +msgid "user not allowed to override closefrom limit" +msgstr "utilizatorului nu îi este permis să suprascrie limita de formă închisă" + +#: plugins/sudoers/sudoers.c:358 +msgid "you are not permitted to use the -C option" +msgstr "nu aveți permisiunea de a utiliza opțiunea -C" + +#: plugins/sudoers/sudoers.c:420 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "deținător datare (%s): Nu există un astfel de utilizator" + +#: plugins/sudoers/sudoers.c:435 +msgid "no tty" +msgstr "fără tty" + +#: plugins/sudoers/sudoers.c:436 +msgid "sorry, you must have a tty to run sudo" +msgstr "trebuie să aveți un tty pentru a rula sudo" + +#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "shell nevalid pentru utilizatorul %s: %s" + +#: plugins/sudoers/sudoers.c:507 +msgid "command in current directory" +msgstr "comandă în directorul curent" + +#: plugins/sudoers/sudoers.c:525 +msgid "user not allowed to set a command timeout" +msgstr "utilizatorului nu îi este permis să stabilească o limită de timp a comenzii" + +#: plugins/sudoers/sudoers.c:526 +msgid "sorry, you are not allowed set a command timeout" +msgstr "nu aveți permisiunea de a stabili o limită de timp a comenzii" + +#: plugins/sudoers/sudoers.c:534 +msgid "user not allowed to preserve the environment" +msgstr "utilizatorului nu îi este permis să păstreze mediul" + +#: plugins/sudoers/sudoers.c:535 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "nu aveți permisiunea să păstrați mediul" + +#: plugins/sudoers/sudoers.c:878 +msgid "command too long" +msgstr "comandă prea lungă" + +#: plugins/sudoers/sudoers.c:936 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit nu are nevoie să fie rulat via sudo" + +#: plugins/sudoers/sudoers.c:990 plugins/sudoers/sudoreplay.c:1548 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "nu se poate citi %s" + +#: plugins/sudoers/sudoers.c:1015 plugins/sudoers/visudo.c:431 +#: plugins/sudoers/visudo.c:727 +#, c-format +msgid "unable to stat %s" +msgstr "nu se poate stat %s" + +#: plugins/sudoers/sudoers.c:1019 plugins/sudoers/visudo.c:1037 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nu este un fișier regular" + +#: plugins/sudoers/sudoers.c:1023 plugins/sudoers/timestamp.c:252 toke.l:1060 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s este deținut de uid-ul %u, ar trebui să fie %u" + +#: plugins/sudoers/sudoers.c:1027 toke.l:1065 +#, c-format +msgid "%s is world writable" +msgstr "%s este inscriptibil global" + +#: plugins/sudoers/sudoers.c:1031 toke.l:1068 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s este deținut de gid-ul %u, ar trebui să fie %u" + +#: plugins/sudoers/sudoers.c:1064 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "doar root poate utiliza „-c %s”" + +#: plugins/sudoers/sudoers.c:1083 +#, c-format +msgid "unknown login class: %s" +msgstr "clasă de autentificare necunoscută: %s" + +#: plugins/sudoers/sudoers.c:1168 plugins/sudoers/sudoers.c:1183 +#, c-format +msgid "unable to resolve host %s" +msgstr "nu se poate rezolva gazda %s" + +#: plugins/sudoers/sudoreplay.c:258 +#, c-format +msgid "invalid filter option: %s" +msgstr "opțiune de filtru nevalidă: %s" + +#: plugins/sudoers/sudoreplay.c:274 +#, c-format +msgid "invalid max wait: %s" +msgstr "așteptare maximă nevalidă: %s" + +#: plugins/sudoers/sudoreplay.c:297 +#, c-format +msgid "invalid speed factor: %s" +msgstr "factor de viteză nevalid: %s" + +#: plugins/sudoers/sudoreplay.c:333 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:338 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/sincronizare: %s" + +#: plugins/sudoers/sudoreplay.c:342 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:366 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Se redă sesiunea sudo: %s" + +#: plugins/sudoers/sudoreplay.c:628 +msgid "unable to set tty to raw mode" +msgstr "nu se poate stabili tty la modul raw" + +#: plugins/sudoers/sudoreplay.c:679 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Avertisment: terminalul este prea mic pentru a putea reda bine istoricul.\n" + +#: plugins/sudoers/sudoreplay.c:680 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Geometria istoricului este %d x %d, geometria terminalului este %d x %d." + +#: plugins/sudoers/sudoreplay.c:708 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Redarea terminată, apăsați orice cheie pentru a restaura terminalul." + +#: plugins/sudoers/sudoreplay.c:1198 plugins/sudoers/sudoreplay.c:1228 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "expresie ambiguă „%s”" + +#: plugins/sudoers/sudoreplay.c:1250 +msgid "unmatched ')' in expression" +msgstr "„)” fără pereche în expresie" + +#: plugins/sudoers/sudoreplay.c:1254 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "termen de căutare necunoscut „%s”" + +#: plugins/sudoers/sudoreplay.c:1269 +#, c-format +msgid "%s requires an argument" +msgstr "%s necesită un argument" + +#: plugins/sudoers/sudoreplay.c:1272 plugins/sudoers/sudoreplay.c:1524 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expresie regulată nevalidă: %s" + +#: plugins/sudoers/sudoreplay.c:1277 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "nu s-a putut parsa data „%s”" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "unmatched '(' in expression" +msgstr "„(” fără pereche în expresie" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"or\"" +msgstr "urmă „sau” ilegală" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "illegal trailing \"!\"" +msgstr "urmă „!” ilegală" + +#: plugins/sudoers/sudoreplay.c:1348 +#, c-format +msgid "unknown search type %d" +msgstr "tip de căutare necunoscută %d" + +#: plugins/sudoers/sudoreplay.c:1615 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "utilizare: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1618 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "utilizare: %s [-h] [-d dir] -l [expresie de căutare]\n" + +#: plugins/sudoers/sudoreplay.c:1627 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - redă înregistrările de sesiune sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1629 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options:\n" +" -d, --directory=dir specifică directorul pentru înregistrările sesiunii\n" +" -f, --filter=filter specifică care tip(uri) I/O să se afișeze\n" +" -h, --help afișează informațiile ajutorului și ieși\n" +" -l, --list listează ID-urile sesiunii disponibile, cu expresii opționale\n" +" -m, --max-wait=num numărul maxim de secunde de așteptat între evenimente\n" +" -n, --non-interactive fără promptere, sesiunea este trimisă la ieșirea standard\n" +" -R, --no-resize nu încercați să redimensionați terminalul\n" +" -S, --suspend-wait așteaptă până când comanda a fost suspendată\n" +" -s, --speed=num accelerează sau încetinește ieșirea\n" +" -V, --version afișează informațiile de versiune și ieși" + +#: plugins/sudoers/testsudoers.c:354 +msgid "\thost unmatched" +msgstr "\tgazdă nepotrivită" + +#: plugins/sudoers/testsudoers.c:357 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Comandă permisă" + +#: plugins/sudoers/testsudoers.c:358 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Comandă negată" + +#: plugins/sudoers/testsudoers.c:358 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Comandă nepotrivită" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s este inscriptibil pe grup" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "nu se poate trunchia fișierul datare în %lld octeți" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "se ignoră datarea pe viitor" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "datarea este prea departe în viitor: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "nu se poate bloca fișierul datării %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "calea stării lecturii este prea lungă: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit nu ar trebui să fie specificat cu o cale" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "opțiunea -x va fi eliminată într-o lansare viitoare" + +#: plugins/sudoers/visudo.c:227 +msgid "please consider using the cvtsudoers utility instead" +msgstr "considerați utilizarea în loc a utilității cvtsudoers" + +#: plugins/sudoers/visudo.c:278 plugins/sudoers/visudo.c:660 +#, c-format +msgid "press return to edit %s: " +msgstr "apăsați enter pentru a edita %s: " + +#: plugins/sudoers/visudo.c:339 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "editorul specificat (%s) nu există" + +#: plugins/sudoers/visudo.c:341 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nu s-a găsit niciun editor (cale editor = %s)" + +#: plugins/sudoers/visudo.c:451 plugins/sudoers/visudo.c:459 +msgid "write error" +msgstr "eroare de scriere" + +#: plugins/sudoers/visudo.c:505 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "nu se poate da stat la fișierul temporar (%s), %s neschimbat" + +#: plugins/sudoers/visudo.c:512 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "fișier temporar de lungime zero (%s), %s neschimbat" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editorul (%s) a eșuat, %s neschimbat" + +#: plugins/sudoers/visudo.c:540 +#, c-format +msgid "%s unchanged" +msgstr "%s neschimbat" + +#: plugins/sudoers/visudo.c:599 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "nu se poate redeschide fișierul temporar (%s), %s neschimbat." + +#: plugins/sudoers/visudo.c:611 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "nu se poate parsa temporar fișierul (%s), eroare necunoscută" + +#: plugins/sudoers/visudo.c:649 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "eroare internă, nu se poate găsi %s în listă!" + +#: plugins/sudoers/visudo.c:729 plugins/sudoers/visudo.c:738 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "nu se poate stabili (uid, gid) a %s la (%u, %u)" + +#: plugins/sudoers/visudo.c:761 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s și %s nu sunt pe același sistem de fișiere, se utilizează mv pentru a redenumi" + +#: plugins/sudoers/visudo.c:775 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "comanda a eșuat: „%s %s %s”, %s neschimbat" + +#: plugins/sudoers/visudo.c:785 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "eroare la redenumirea %s, %s neschimbat" + +#: plugins/sudoers/visudo.c:806 +msgid "What now? " +msgstr "Acum ce? " + +#: plugins/sudoers/visudo.c:820 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Opțiunile sunt:\n" +" (e)ditează fișierul sudoers din nou\n" +" (x)ieși fără a salva modificările la fișierul sudoers\n" +" (Q)ieși și salvează modificările la fișierul sudo (PERICOL!)\n" + +#: plugins/sudoers/visudo.c:866 +#, c-format +msgid "unable to run %s" +msgstr "nu se poate rula %s" + +#: plugins/sudoers/visudo.c:896 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: deținător greșit (uid, gid) ar trebui să fie (%u, %u)\n" + +#: plugins/sudoers/visudo.c:903 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: permisiuni rele, ar trebui să fie modul 0%o\n" + +#: plugins/sudoers/visudo.c:960 plugins/sudoers/visudo.c:967 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: parsat OK\n" + +#: plugins/sudoers/visudo.c:986 +#, c-format +msgid "%s busy, try again later" +msgstr "%s ocupat, încercați din nou mai târziu" + +#: plugins/sudoers/visudo.c:989 +#, c-format +msgid "unable to lock %s" +msgstr "nu se poate bloca %s" + +#: plugins/sudoers/visudo.c:990 +msgid "Edit anyway? [y/N]" +msgstr "Editați oricum? [y/N]" + +#: plugins/sudoers/visudo.c:1083 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Eroare: %s:%d ciclu în %s „%s”" + +#: plugins/sudoers/visudo.c:1084 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Avertisment: %s:%d ciclu în %s \"%s\"" + +#: plugins/sudoers/visudo.c:1088 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Eroare: %s:%d %s „%s” menționat dar nu definit" + +#: plugins/sudoers/visudo.c:1089 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Avertisment: %s:%d %s \"%s\" menționat dar nu definit" + +#: plugins/sudoers/visudo.c:1180 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Avertisment: %s:%d neutilizat %s „%s”" + +#: plugins/sudoers/visudo.c:1295 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - editează în siguranță fișierul sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1297 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opțiuni:\n" +" -c, --check modul doar verifică\n" +" -f, --file=sudoers specifică locația fișierului sudo\n" +" -h, --help afișează mesajul de ajutor și ieși\n" +" -q, --quiet mesaje de eroare de sintaxă mai puțin detaliate (liniștite)\n" +" -s, --strict verificare de sintaxă strictă\n" +" -V, --version afișează informațiile de versiune și ieși\n" + +#: toke.l:1032 +msgid "too many levels of includes" +msgstr "prea multe niveluri de include-uri" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "SSL_connect a eșuat: ssl_error=%d, stiva=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "Fișierul de pachet CA nu a fost specificat" + +#~ msgid "Client certificate was not specified" +#~ msgstr "Certificatul clientului nu a fost specificat" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "Nu se poate aloca obiectul ssl: %s\n" + +#~ msgid "Unable to attach socket to the ssl object: %s\n" +#~ msgstr "Nu se poate atașa soclul la obiectul ssl: %s\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "mesajul de client este prea mare: %zu\n" + +#~ msgid "server message too large: %u\n" +#~ msgstr "mesaj de server prea mare: %u\n" + +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "Fișierul pachet CA nu este stabilit în sudoers" + +#~ msgid "Calling SSL_CTX_load_verify_locations() failed: %s" +#~ msgstr "Apelarea a SSL_CTX_load_verify_locations() a eșuat: %s" + +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "Fișierul de certificat semnat nu este stabilit în sudoers" + +#~ msgid "Unable to load private key into the ssl context: %s" +#~ msgstr "Nu se poate încărca cheia privată în contextul ssl: %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_connect a eșuat: ssl_error=%d, stivă=%s" + +#~ msgid "SSL_read failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_read a eșuat: ssl_error=%d, stivă=%s" + +#~ msgid "SSL_write failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_write a eșuat: ssl_error=%d, stivă=%s" + +#~ msgid "unknown address family: %d" +#~ msgstr "familie de adrese necunoscută: %d" + +#~ msgid "audit_failure message too long" +#~ msgstr "mesaj audit_failure prea mare" diff --git a/plugins/sudoers/po/ru.mo b/plugins/sudoers/po/ru.mo new file mode 100644 index 0000000..a8f1f16 Binary files /dev/null and b/plugins/sudoers/po/ru.mo differ diff --git a/plugins/sudoers/po/ru.po b/plugins/sudoers/po/ru.po new file mode 100644 index 0000000..64a42d2 --- /dev/null +++ b/plugins/sudoers/po/ru.po @@ -0,0 +1,1868 @@ +# Transation of sudoers messages to Russian. +# This file is put in the public domain. +# This file is distributed under the same license as the sudo package. +# +# Artem Vorotnikov , 2015. +# Pavel Maryanov , 2015. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.14b2\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2015-07-03 07:09-0600\n" +"PO-Revision-Date: 2015-09-10 19:15+0300\n" +"Last-Translator: Pavel Maryanov \n" +"Language-Team: Russian \n" +"Language: ru\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.8.4\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "ошибка синтаксиса" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "пароль %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] пароль для %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Пароль: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Данные БЕЗОПАСНОСТИ для %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Попробуйте ещё раз." + +#: gram.y:181 gram.y:199 gram.y:205 gram.y:211 gram.y:217 gram.y:223 +#: gram.y:239 gram.y:246 gram.y:253 gram.y:260 gram.y:267 gram.y:283 +#: gram.y:306 gram.y:313 gram.y:320 gram.y:327 gram.y:334 gram.y:387 +#: gram.y:395 gram.y:405 gram.y:435 gram.y:442 gram.y:449 gram.y:456 +#: gram.y:568 gram.y:575 gram.y:584 gram.y:593 gram.y:610 gram.y:661 +#: gram.y:668 gram.y:675 gram.y:683 gram.y:775 gram.y:782 gram.y:789 +#: gram.y:796 gram.y:803 gram.y:829 gram.y:836 gram.y:843 gram.y:1110 +#: gram.y:1117 plugins/sudoers/alias.c:123 plugins/sudoers/alias.c:136 +#: plugins/sudoers/auth/bsdauth.c:141 plugins/sudoers/auth/kerb5.c:119 +#: plugins/sudoers/auth/kerb5.c:145 plugins/sudoers/auth/pam.c:371 +#: plugins/sudoers/auth/rfc1938.c:109 plugins/sudoers/auth/sia.c:110 +#: plugins/sudoers/defaults.c:516 plugins/sudoers/defaults.c:720 +#: plugins/sudoers/defaults.c:880 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:92 +#: plugins/sudoers/env.c:233 plugins/sudoers/group_plugin.c:131 +#: plugins/sudoers/iolog.c:582 plugins/sudoers/iolog.c:614 +#: plugins/sudoers/iolog_path.c:167 plugins/sudoers/ldap.c:446 +#: plugins/sudoers/ldap.c:477 plugins/sudoers/ldap.c:529 +#: plugins/sudoers/ldap.c:562 plugins/sudoers/ldap.c:914 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap.c:1339 +#: plugins/sudoers/ldap.c:1512 plugins/sudoers/ldap.c:1588 +#: plugins/sudoers/ldap.c:1724 plugins/sudoers/ldap.c:1748 +#: plugins/sudoers/ldap.c:1778 plugins/sudoers/ldap.c:1831 +#: plugins/sudoers/ldap.c:1846 plugins/sudoers/ldap.c:1942 +#: plugins/sudoers/ldap.c:1975 plugins/sudoers/ldap.c:2128 +#: plugins/sudoers/ldap.c:2225 plugins/sudoers/ldap.c:3028 +#: plugins/sudoers/ldap.c:3061 plugins/sudoers/ldap.c:3375 +#: plugins/sudoers/ldap.c:3403 plugins/sudoers/ldap.c:3414 +#: plugins/sudoers/ldap.c:3504 plugins/sudoers/ldap.c:3520 +#: plugins/sudoers/linux_audit.c:76 plugins/sudoers/logging.c:188 +#: plugins/sudoers/logging.c:662 plugins/sudoers/logging.c:916 +#: plugins/sudoers/match.c:501 plugins/sudoers/match.c:537 +#: plugins/sudoers/match.c:695 plugins/sudoers/match.c:752 +#: plugins/sudoers/parse.c:235 plugins/sudoers/parse.c:247 +#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:274 +#: plugins/sudoers/policy.c:384 plugins/sudoers/policy.c:575 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/sssd.c:160 +#: plugins/sudoers/sssd.c:192 plugins/sudoers/sssd.c:198 +#: plugins/sudoers/sssd.c:236 plugins/sudoers/sssd.c:243 +#: plugins/sudoers/sssd.c:279 plugins/sudoers/sssd.c:324 +#: plugins/sudoers/sssd.c:916 plugins/sudoers/sssd.c:1049 +#: plugins/sudoers/sudoers.c:159 plugins/sudoers/sudoers.c:294 +#: plugins/sudoers/sudoers.c:304 plugins/sudoers/sudoers.c:312 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:663 +#: plugins/sudoers/sudoers.c:749 plugins/sudoers/sudoers.c:793 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:471 +#: plugins/sudoers/sudoreplay.c:667 plugins/sudoers/sudoreplay.c:779 +#: plugins/sudoers/sudoreplay.c:819 plugins/sudoers/sudoreplay.c:828 +#: plugins/sudoers/sudoreplay.c:838 plugins/sudoers/sudoreplay.c:846 +#: plugins/sudoers/sudoreplay.c:850 plugins/sudoers/sudoreplay.c:1006 +#: plugins/sudoers/sudoreplay.c:1010 plugins/sudoers/testsudoers.c:130 +#: plugins/sudoers/testsudoers.c:187 plugins/sudoers/testsudoers.c:214 +#: plugins/sudoers/testsudoers.c:231 plugins/sudoers/visudo.c:155 +#: plugins/sudoers/visudo.c:215 plugins/sudoers/visudo.c:299 +#: plugins/sudoers/visudo.c:305 plugins/sudoers/visudo.c:435 +#: plugins/sudoers/visudo.c:971 plugins/sudoers/visudo.c:1015 +#: plugins/sudoers/visudo.c:1111 +msgid "unable to allocate memory" +msgstr "не удаётся выделить память" + +#: gram.y:467 +msgid "a digest requires a path name" +msgstr "для дайджеста нужно указать полный путь" + +#: gram.y:1110 gram.y:1117 plugins/sudoers/auth/pam.c:371 +#: plugins/sudoers/auth/rfc1938.c:109 plugins/sudoers/defaults.c:516 +#: plugins/sudoers/defaults.c:720 plugins/sudoers/defaults.c:880 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:92 plugins/sudoers/env.c:233 +#: plugins/sudoers/group_plugin.c:131 plugins/sudoers/iolog.c:582 +#: plugins/sudoers/iolog.c:614 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:446 plugins/sudoers/ldap.c:477 +#: plugins/sudoers/ldap.c:529 plugins/sudoers/ldap.c:562 +#: plugins/sudoers/ldap.c:914 plugins/sudoers/ldap.c:1060 +#: plugins/sudoers/ldap.c:1339 plugins/sudoers/ldap.c:1512 +#: plugins/sudoers/ldap.c:1588 plugins/sudoers/ldap.c:1724 +#: plugins/sudoers/ldap.c:1748 plugins/sudoers/ldap.c:1778 +#: plugins/sudoers/ldap.c:1831 plugins/sudoers/ldap.c:1846 +#: plugins/sudoers/ldap.c:1942 plugins/sudoers/ldap.c:1975 +#: plugins/sudoers/ldap.c:2128 plugins/sudoers/ldap.c:2225 +#: plugins/sudoers/ldap.c:3028 plugins/sudoers/ldap.c:3061 +#: plugins/sudoers/ldap.c:3375 plugins/sudoers/ldap.c:3403 +#: plugins/sudoers/ldap.c:3414 plugins/sudoers/ldap.c:3504 +#: plugins/sudoers/ldap.c:3520 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:916 +#: plugins/sudoers/match.c:501 plugins/sudoers/match.c:537 +#: plugins/sudoers/match.c:695 plugins/sudoers/match.c:752 +#: plugins/sudoers/parse.c:235 plugins/sudoers/parse.c:247 +#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:274 +#: plugins/sudoers/policy.c:97 plugins/sudoers/policy.c:106 +#: plugins/sudoers/policy.c:115 plugins/sudoers/policy.c:139 +#: plugins/sudoers/policy.c:250 plugins/sudoers/policy.c:271 +#: plugins/sudoers/policy.c:280 plugins/sudoers/policy.c:319 +#: plugins/sudoers/policy.c:329 plugins/sudoers/policy.c:338 +#: plugins/sudoers/policy.c:384 plugins/sudoers/policy.c:575 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/set_perms.c:356 +#: plugins/sudoers/set_perms.c:695 plugins/sudoers/set_perms.c:1054 +#: plugins/sudoers/set_perms.c:1350 plugins/sudoers/set_perms.c:1514 +#: plugins/sudoers/sssd.c:160 plugins/sudoers/sssd.c:192 +#: plugins/sudoers/sssd.c:198 plugins/sudoers/sssd.c:236 +#: plugins/sudoers/sssd.c:243 plugins/sudoers/sssd.c:279 +#: plugins/sudoers/sssd.c:324 plugins/sudoers/sssd.c:916 +#: plugins/sudoers/sssd.c:1049 plugins/sudoers/sudoers.c:159 +#: plugins/sudoers/sudoers.c:294 plugins/sudoers/sudoers.c:304 +#: plugins/sudoers/sudoers.c:312 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:663 plugins/sudoers/sudoers.c:749 +#: plugins/sudoers/sudoers.c:793 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:471 plugins/sudoers/sudoreplay.c:667 +#: plugins/sudoers/sudoreplay.c:779 plugins/sudoers/sudoreplay.c:819 +#: plugins/sudoers/sudoreplay.c:828 plugins/sudoers/sudoreplay.c:838 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:850 +#: plugins/sudoers/sudoreplay.c:1006 plugins/sudoers/sudoreplay.c:1010 +#: plugins/sudoers/testsudoers.c:130 plugins/sudoers/testsudoers.c:187 +#: plugins/sudoers/testsudoers.c:214 plugins/sudoers/testsudoers.c:231 +#: plugins/sudoers/visudo.c:155 plugins/sudoers/visudo.c:215 +#: plugins/sudoers/visudo.c:299 plugins/sudoers/visudo.c:305 +#: plugins/sudoers/visudo.c:435 plugins/sudoers/visudo.c:971 +#: plugins/sudoers/visudo.c:1015 plugins/sudoers/visudo.c:1111 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:132 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Псевдоним «%s» уже определён" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "не удаётся получить класс логина для пользователя %s" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "не удаётся начать BSD-аутентификацию" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "некорректный тип аутентификации" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "не удаётся запустить BSD-аутентификацию" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "не удаётся прочитать конфигурацию ftwk" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "не удаётся связаться с сервером аутентификации" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:120 +msgid "lost connection to authentication server" +msgstr "потеряно соединение с сервером аутентификации" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"ошибка сервера аутентификации:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: не удаётся преобразовать принципал в строку ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: не удаётся прочитать '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: не удаётся разрешить кэш учётных данных: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: не удаётся выделить параметры: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: не удаётся получить учётные данные: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: не удаётся инициализировать кэш учётных данных: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: не удаётся сохранить учётные данные в кэше: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: не удаётся получить принципал хоста: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Не удаётся проверить TGT. Нас атакуют?!: %s" + +#: plugins/sudoers/auth/pam.c:90 +msgid "unable to initialize PAM" +msgstr "не удаётся инициализировать PAM" + +#: plugins/sudoers/auth/pam.c:146 +msgid "account validation failure, is your account locked?" +msgstr "ошибка проверки учётной записи. Она заблокирована?" + +#: plugins/sudoers/auth/pam.c:150 +msgid "Account or password is expired, reset your password and try again" +msgstr "Учётные данные устарели. Сбросьте пароль и попробуйте ещё раз" + +#: plugins/sudoers/auth/pam.c:158 +#, c-format +msgid "unable to change expired password: %s" +msgstr "не удаётся сменить устаревший пароль: %s" + +#: plugins/sudoers/auth/pam.c:163 +msgid "Password expired, contact your system administrator" +msgstr "Пароль устарел. Обратитесь к системному администратору" + +#: plugins/sudoers/auth/pam.c:167 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Срок действия учётной записи истёк или в настройках PAM нет раздела «account» для sudo. Обратитесь к системному администратору" + +#: plugins/sudoers/auth/pam.c:179 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Ошибка PAM-аутентификации: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:220 +#, c-format +msgid "you do not exist in the %s database" +msgstr "Вы не существуете в базе данных %s" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "не удалось инициализировать библиотеку API для ACE" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "не удалось связаться с сервером SecurID" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "ID пользователя заблокирован для аутентификации SecurID" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "недопустимая длина имени пользователя для SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "недопустимый обработчик аутентификации для SecurID" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "ошибка связи с SecurID" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:207 +msgid "unknown SecurID error" +msgstr "неизвестная ошибка SecurID" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "недопустимая длина пароля для SecurID" + +#: plugins/sudoers/auth/sia.c:120 +msgid "unable to initialize SIA session" +msgstr "не удаётся инициализировать сеанс SIA" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "недопустимые методы аутентификации" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "sudo скомпилирован с неверными методами аутентификации! Нельзя смешивать зависимую и независимую аутентификацию." + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:273 +msgid "no authentication methods" +msgstr "методы аутентификации отсутствуют" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "sudo скомпилирован без методов аутентификации! Если нужно отключить аутентификацию, используйте параметр --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:275 +msgid "Unable to initialize authentication methods." +msgstr "Не удаётся инициализировать методы аутентификации." + +#: plugins/sudoers/auth/sudo_auth.c:433 +msgid "Authentication methods:" +msgstr "Методы аутентификации:" + +#: plugins/sudoers/bsm_audit.c:111 plugins/sudoers/bsm_audit.c:200 +msgid "Could not determine audit condition" +msgstr "Не удалось определить состояние аудита" + +#: plugins/sudoers/bsm_audit.c:172 plugins/sudoers/bsm_audit.c:260 +msgid "unable to commit audit record" +msgstr "не удаётся отправить запись аудита" + +#: plugins/sudoers/check.c:200 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Мы полагаем, что ваш системный администратор изложил вам основы\n" +"безопасности. Как правило, всё сводится к трём следующим правилам:\n" +"\n" +" №1) Уважайте частную жизнь других.\n" +" №2) Думайте, прежде что-то вводить.\n" +" №3) С большой властью приходит большая ответственность.\n" +"\n" + +#: plugins/sudoers/check.c:243 plugins/sudoers/check.c:253 +#: plugins/sudoers/sudoers.c:699 plugins/sudoers/sudoers.c:728 +#, c-format +msgid "unknown uid: %u" +msgstr "неизвестный uid: %u" + +#: plugins/sudoers/check.c:248 plugins/sudoers/policy.c:747 +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/testsudoers.c:205 +#: plugins/sudoers/testsudoers.c:360 +#, c-format +msgid "unknown user: %s" +msgstr "неизвестный пользователь: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "Игнорировать '.' в переменной $PATH" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "Отправлять письмо при каждом запуске sudo" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "Отправлять письмо при ошибке аутентификации" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "Отправлять письмо, если пользователя нет в группе sudoers" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Отправлять письмо, если пользователя нет в группе sudoers для данного компьютера" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Отправлять письмо, если пользователю не разрешено выполнять команду" + +#: plugins/sudoers/def_data.c:67 +msgid "Send mail if the user tries to run a command" +msgstr "Отправлять письмо, если пользователь пытается выполнить команду" + +#: plugins/sudoers/def_data.c:71 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:75 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:79 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:83 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:87 +msgid "Root may run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:99 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:103 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:107 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:111 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:115 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:119 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:123 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:127 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:143 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:147 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:247 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:251 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:323 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:327 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:347 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:351 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:355 +msgid "Set of permitted privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:359 +msgid "Set of limit privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:363 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:367 +msgid "PAM service name to use" +msgstr "" + +#: plugins/sudoers/def_data.c:371 +msgid "PAM service name to use for login shells" +msgstr "" + +#: plugins/sudoers/def_data.c:375 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:379 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:383 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:387 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/defaults.c:199 plugins/sudoers/defaults.c:608 +#: plugins/sudoers/visudo_json.c:633 plugins/sudoers/visudo_json.c:668 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:207 plugins/sudoers/defaults.c:217 +#: plugins/sudoers/defaults.c:241 plugins/sudoers/defaults.c:256 +#: plugins/sudoers/defaults.c:269 plugins/sudoers/defaults.c:282 +#: plugins/sudoers/defaults.c:295 plugins/sudoers/defaults.c:315 +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:210 plugins/sudoers/defaults.c:220 +#: plugins/sudoers/defaults.c:228 plugins/sudoers/defaults.c:251 +#: plugins/sudoers/defaults.c:264 plugins/sudoers/defaults.c:277 +#: plugins/sudoers/defaults.c:290 plugins/sudoers/defaults.c:310 +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "no value specified for `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:233 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:301 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:404 plugins/sudoers/ldap.c:450 +#: plugins/sudoers/ldap.c:540 plugins/sudoers/ldap.c:1143 +#: plugins/sudoers/ldap.c:1345 plugins/sudoers/ldap.c:1517 +#: plugins/sudoers/ldap.c:1673 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/logging.c:921 plugins/sudoers/policy.c:494 +#: plugins/sudoers/policy.c:503 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:815 plugins/sudoers/testsudoers.c:235 +#: plugins/sudoers/toke_util.c:160 +#, c-format +msgid "internal error, %s overflow" +msgstr "" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1047 +msgid "unable to rebuild the environment" +msgstr "не удаётся перестроить среду" + +#: plugins/sudoers/env.c:1121 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:85 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:89 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:331 +#, c-format +msgid "unable to load %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:101 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:110 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:92 plugins/sudoers/iolog.c:110 +#: plugins/sudoers/timestamp.c:218 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:103 plugins/sudoers/iolog.c:124 +#: plugins/sudoers/iolog.c:131 plugins/sudoers/timestamp.c:212 +#: plugins/sudoers/timestamp.c:233 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:200 plugins/sudoers/sudoers.c:871 +#: plugins/sudoers/sudoreplay.c:302 plugins/sudoers/sudoreplay.c:768 +#: plugins/sudoers/sudoreplay.c:972 plugins/sudoers/timestamp.c:370 +#: plugins/sudoers/visudo.c:895 plugins/sudoers/visudo_json.c:1026 +#: plugins/sudoers/visudo_json.c:1039 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: plugins/sudoers/iolog.c:241 plugins/sudoers/sudoers.c:875 +#: plugins/sudoers/sudoreplay.c:1083 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/iolog.c:273 plugins/sudoers/sudoreplay.c:549 +#: plugins/sudoers/timestamp.c:171 plugins/sudoers/timestamp.c:174 +#, c-format +msgid "unable to write to %s" +msgstr "" + +#: plugins/sudoers/iolog.c:338 plugins/sudoers/iolog.c:536 +#, c-format +msgid "unable to create %s" +msgstr "" + +#: plugins/sudoers/ldap.c:428 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:488 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:515 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:519 plugins/sudoers/ldap.c:555 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:626 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:629 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1129 +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:1135 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1821 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2360 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Роль LDAP: %s\n" + +#: plugins/sudoers/ldap.c:2362 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"Роль LDAP: НЕИЗВЕСТНО\n" + +#: plugins/sudoers/ldap.c:2409 +#, c-format +msgid " Order: %s\n" +msgstr " Порядок: %s\n" + +#: plugins/sudoers/ldap.c:2417 plugins/sudoers/parse.c:573 +#: plugins/sudoers/sssd.c:1408 +#, c-format +msgid " Commands:\n" +msgstr " Команды:\n" + +#: plugins/sudoers/ldap.c:2980 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "не удаётся инициализировать LDAP: %s" + +#: plugins/sudoers/ldap.c:3016 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "указано start_tls, но библиотеки LDAP не поддерживают ldap_start_tls_s() или ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:3273 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "недопустимый атрибут sudoOrder: %s" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "не удаётся открыть систему аудита" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "не удаётся отправить сообщение аудита" + +#: plugins/sudoers/logging.c:106 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:134 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (выполнение команды продолжено) %s" + +#: plugins/sudoers/logging.c:159 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "не удаётся открыть файл журнала: %s: %s" + +#: plugins/sudoers/logging.c:162 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "не удаётся заблокировать файл журнала: %s: %s" + +#: plugins/sudoers/logging.c:211 +msgid "No user or host" +msgstr "" + +#: plugins/sudoers/logging.c:213 +msgid "validation failure" +msgstr "" + +#: plugins/sudoers/logging.c:220 +msgid "user NOT in sudoers" +msgstr "" + +#: plugins/sudoers/logging.c:222 +msgid "user NOT authorized on host" +msgstr "" + +#: plugins/sudoers/logging.c:224 +msgid "command not allowed" +msgstr "" + +#: plugins/sudoers/logging.c:259 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:262 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:266 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:306 plugins/sudoers/sudoers.c:471 +#: plugins/sudoers/sudoers.c:473 plugins/sudoers/sudoers.c:475 +#: plugins/sudoers/sudoers.c:477 plugins/sudoers/sudoers.c:1220 +#: plugins/sudoers/sudoers.c:1222 +#, c-format +msgid "%s: command not found" +msgstr "" + +#: plugins/sudoers/logging.c:308 plugins/sudoers/sudoers.c:467 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:325 +msgid "authentication failure" +msgstr "" + +#: plugins/sudoers/logging.c:351 +msgid "a password is required" +msgstr "" + +#: plugins/sudoers/logging.c:422 plugins/sudoers/logging.c:484 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/sudoers/logging.c:572 +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:580 plugins/sudoers/logging.c:636 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:626 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:651 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:689 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/match.c:606 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/match.c:635 +#, c-format +msgid "%s: read error" +msgstr "" + +#: plugins/sudoers/match.c:649 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/parse.c:114 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:117 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:520 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:521 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:535 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:544 +#, c-format +msgid " Options: " +msgstr "" + +#: plugins/sudoers/policy.c:240 plugins/sudoers/testsudoers.c:252 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:632 plugins/sudoers/visudo.c:836 +#, c-format +msgid "unable to execute %s" +msgstr "" + +#: plugins/sudoers/policy.c:765 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:767 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:771 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:774 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:776 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:777 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:810 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:136 plugins/sudoers/pwutil.c:153 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:147 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:207 +#: plugins/sudoers/pwutil.c:250 plugins/sudoers/pwutil.c:294 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:202 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:427 plugins/sudoers/pwutil.c:444 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:438 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:476 plugins/sudoers/pwutil.c:492 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:565 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:487 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:676 plugins/sudoers/pwutil.c:710 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:682 plugins/sudoers/pwutil.c:715 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:705 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:438 +#: plugins/sudoers/set_perms.c:841 plugins/sudoers/set_perms.c:1138 +#: plugins/sudoers/set_perms.c:1430 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:369 +#: plugins/sudoers/set_perms.c:446 plugins/sudoers/set_perms.c:708 +#: plugins/sudoers/set_perms.c:849 plugins/sudoers/set_perms.c:1067 +#: plugins/sudoers/set_perms.c:1146 plugins/sudoers/set_perms.c:1363 +#: plugins/sudoers/set_perms.c:1438 plugins/sudoers/set_perms.c:1527 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:493 +#: plugins/sudoers/set_perms.c:1197 plugins/sudoers/set_perms.c:1470 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:590 +#: plugins/sudoers/set_perms.c:978 plugins/sudoers/set_perms.c:1274 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:595 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1279 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:606 +#: plugins/sudoers/set_perms.c:992 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:624 +#: plugins/sudoers/set_perms.c:1008 plugins/sudoers/set_perms.c:1304 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:356 plugins/sudoers/set_perms.c:695 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1350 +#: plugins/sudoers/set_perms.c:1514 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "" + +#: plugins/sudoers/sssd.c:332 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:340 plugins/sudoers/sssd.c:349 +#: plugins/sudoers/sssd.c:358 plugins/sudoers/sssd.c:367 +#: plugins/sudoers/sssd.c:376 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:290 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:308 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:326 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:339 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:172 plugins/sudoers/testsudoers.c:244 +#: plugins/sudoers/visudo.c:225 plugins/sudoers/visudo.c:562 +msgid "unable to initialize sudoers default values" +msgstr "не удаётся инициализировать значения по умолчанию для sudoers" + +#: plugins/sudoers/sudoers.c:197 plugins/sudoers/sudoers.c:239 +#: plugins/sudoers/sudoers.c:833 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:275 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:332 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:396 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:410 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:411 +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:466 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:486 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:778 +msgid "command too long" +msgstr "" + +#: plugins/sudoers/sudoers.c:886 plugins/sudoers/visudo.c:428 +#: plugins/sudoers/visudo.c:662 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:890 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:894 plugins/sudoers/timestamp.c:274 toke.l:933 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:898 toke.l:940 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:902 toke.l:945 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:933 +#, c-format +msgid "only root can use `-c %s'" +msgstr "" + +#: plugins/sudoers/sudoers.c:952 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1031 plugins/sudoers/sudoers.c:1059 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1126 plugins/sudoers/testsudoers.c:384 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:234 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:247 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:253 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:256 plugins/sudoers/visudo.c:182 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:294 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:310 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:316 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:317 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:369 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:400 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:610 plugins/sudoers/sudoreplay.c:635 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:657 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:661 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:676 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:679 plugins/sudoers/sudoreplay.c:1059 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:683 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:692 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:694 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:696 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:745 +#, c-format +msgid "unknown search type %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:783 +#, c-format +msgid "%s: invalid log file" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:801 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:808 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:815 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:824 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:833 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1196 +#, c-format +msgid "usage: %s [-h] [-d dir] [-m num] [-s num] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1199 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1208 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1210 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:323 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:326 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:327 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:327 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:182 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:282 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:303 +#, c-format +msgid "timestamp path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/timestamp.c:362 plugins/sudoers/timestamp.c:446 +#: plugins/sudoers/visudo.c:483 plugins/sudoers/visudo.c:489 +msgid "unable to read the clock" +msgstr "не удаётся прочитать часы" + +#: plugins/sudoers/timestamp.c:516 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:528 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:638 plugins/sudoers/timestamp.c:658 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:256 plugins/sudoers/visudo.c:614 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:321 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:337 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:445 plugins/sudoers/visudo.c:451 +msgid "write error" +msgstr "" + +#: plugins/sudoers/visudo.c:496 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:503 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:509 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:531 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:557 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:568 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:664 plugins/sudoers/visudo.c:673 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:668 plugins/sudoers/visudo.c:678 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:695 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:709 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:719 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:781 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:795 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:843 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:869 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:876 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:901 plugins/sudoers/visudo_json.c:1046 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:917 plugins/sudoers/visudo_json.c:1055 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:920 plugins/sudoers/visudo_json.c:1058 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:928 plugins/sudoers/visudo.c:935 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:982 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:1078 +#, c-format +msgid "Error: cycle in %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1079 +#, c-format +msgid "Warning: cycle in %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1083 +#, c-format +msgid "Error: %s `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1084 +#, c-format +msgid "Warning: %s `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1227 +#, c-format +msgid "Warning: unused %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1340 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1342 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" + +#: plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: toke.l:904 +msgid "too many levels of includes" +msgstr "слишком много уровней включения" diff --git a/plugins/sudoers/po/sk.mo b/plugins/sudoers/po/sk.mo new file mode 100644 index 0000000..ec67774 Binary files /dev/null and b/plugins/sudoers/po/sk.mo differ diff --git a/plugins/sudoers/po/sk.po b/plugins/sudoers/po/sk.po new file mode 100644 index 0000000..396072f --- /dev/null +++ b/plugins/sudoers/po/sk.po @@ -0,0 +1,1892 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# Todd C. Miller , 2011-2015 +# Dušan Kazik , 2015 +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.15b1\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2015-09-10 14:28-0600\n" +"PO-Revision-Date: 2015-10-05 13:26+0200\n" +"Last-Translator: Dušan Kazik \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Poedit 1.8.5\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: .\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "chyba syntaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Heslo používateľa %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] heslo pre používateľa %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Heslo: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** BEZPEČNOSTNÉ informácie pre %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Prepáčte, skúste to znovu." + +#: gram.y:183 gram.y:201 gram.y:207 gram.y:213 gram.y:219 gram.y:225 +#: gram.y:241 gram.y:248 gram.y:255 gram.y:262 gram.y:269 gram.y:285 +#: gram.y:308 gram.y:315 gram.y:322 gram.y:329 gram.y:336 gram.y:391 +#: gram.y:399 gram.y:409 gram.y:439 gram.y:446 gram.y:453 gram.y:460 +#: gram.y:572 gram.y:579 gram.y:588 gram.y:597 gram.y:614 gram.y:670 +#: gram.y:677 gram.y:684 gram.y:692 gram.y:784 gram.y:791 gram.y:798 +#: gram.y:805 gram.y:812 gram.y:838 gram.y:845 gram.y:852 gram.y:1136 +#: gram.y:1143 plugins/sudoers/alias.c:123 plugins/sudoers/alias.c:136 +#: plugins/sudoers/auth/bsdauth.c:141 plugins/sudoers/auth/kerb5.c:119 +#: plugins/sudoers/auth/kerb5.c:145 plugins/sudoers/auth/pam.c:397 +#: plugins/sudoers/auth/pam.c:445 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:110 plugins/sudoers/defaults.c:516 +#: plugins/sudoers/defaults.c:720 plugins/sudoers/defaults.c:880 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:92 plugins/sudoers/env.c:233 +#: plugins/sudoers/group_plugin.c:133 plugins/sudoers/iolog.c:586 +#: plugins/sudoers/iolog.c:618 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:446 plugins/sudoers/ldap.c:477 +#: plugins/sudoers/ldap.c:529 plugins/sudoers/ldap.c:562 +#: plugins/sudoers/ldap.c:914 plugins/sudoers/ldap.c:1061 +#: plugins/sudoers/ldap.c:1348 plugins/sudoers/ldap.c:1521 +#: plugins/sudoers/ldap.c:1597 plugins/sudoers/ldap.c:1733 +#: plugins/sudoers/ldap.c:1757 plugins/sudoers/ldap.c:1787 +#: plugins/sudoers/ldap.c:1840 plugins/sudoers/ldap.c:1855 +#: plugins/sudoers/ldap.c:1951 plugins/sudoers/ldap.c:1984 +#: plugins/sudoers/ldap.c:2137 plugins/sudoers/ldap.c:2234 +#: plugins/sudoers/ldap.c:3041 plugins/sudoers/ldap.c:3074 +#: plugins/sudoers/ldap.c:3388 plugins/sudoers/ldap.c:3416 +#: plugins/sudoers/ldap.c:3427 plugins/sudoers/ldap.c:3517 +#: plugins/sudoers/ldap.c:3533 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:662 +#: plugins/sudoers/logging.c:916 plugins/sudoers/match.c:501 +#: plugins/sudoers/match.c:537 plugins/sudoers/match.c:699 +#: plugins/sudoers/match.c:756 plugins/sudoers/parse.c:235 +#: plugins/sudoers/parse.c:247 plugins/sudoers/parse.c:262 +#: plugins/sudoers/parse.c:274 plugins/sudoers/policy.c:384 +#: plugins/sudoers/policy.c:579 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/sssd.c:160 plugins/sudoers/sssd.c:192 +#: plugins/sudoers/sssd.c:235 plugins/sudoers/sssd.c:242 +#: plugins/sudoers/sssd.c:278 plugins/sudoers/sssd.c:323 +#: plugins/sudoers/sssd.c:917 plugins/sudoers/sssd.c:1050 +#: plugins/sudoers/sudoers.c:159 plugins/sudoers/sudoers.c:294 +#: plugins/sudoers/sudoers.c:304 plugins/sudoers/sudoers.c:312 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:663 +#: plugins/sudoers/sudoers.c:749 plugins/sudoers/sudoers.c:793 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:472 +#: plugins/sudoers/sudoreplay.c:668 plugins/sudoers/sudoreplay.c:780 +#: plugins/sudoers/sudoreplay.c:820 plugins/sudoers/sudoreplay.c:829 +#: plugins/sudoers/sudoreplay.c:839 plugins/sudoers/sudoreplay.c:847 +#: plugins/sudoers/sudoreplay.c:851 plugins/sudoers/sudoreplay.c:1007 +#: plugins/sudoers/sudoreplay.c:1011 plugins/sudoers/testsudoers.c:130 +#: plugins/sudoers/testsudoers.c:188 plugins/sudoers/testsudoers.c:215 +#: plugins/sudoers/testsudoers.c:232 plugins/sudoers/timestamp.c:390 +#: plugins/sudoers/timestamp.c:426 plugins/sudoers/timestamp.c:838 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:147 plugins/sudoers/visudo.c:152 +#: plugins/sudoers/visudo.c:213 plugins/sudoers/visudo.c:297 +#: plugins/sudoers/visudo.c:303 plugins/sudoers/visudo.c:433 +#: plugins/sudoers/visudo.c:974 plugins/sudoers/visudo.c:1018 +#: plugins/sudoers/visudo.c:1114 toke.l:785 toke.l:806 toke.l:816 toke.l:924 +#: toke.l:1082 +msgid "unable to allocate memory" +msgstr "nie je možné alokovať pamäť" + +#: gram.y:471 +msgid "a digest requires a path name" +msgstr "" + +#: gram.y:1136 gram.y:1143 plugins/sudoers/auth/pam.c:397 +#: plugins/sudoers/auth/pam.c:445 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:516 plugins/sudoers/defaults.c:720 +#: plugins/sudoers/defaults.c:880 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:92 +#: plugins/sudoers/env.c:233 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/iolog.c:586 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/iolog_path.c:167 plugins/sudoers/ldap.c:446 +#: plugins/sudoers/ldap.c:477 plugins/sudoers/ldap.c:529 +#: plugins/sudoers/ldap.c:562 plugins/sudoers/ldap.c:914 +#: plugins/sudoers/ldap.c:1061 plugins/sudoers/ldap.c:1348 +#: plugins/sudoers/ldap.c:1521 plugins/sudoers/ldap.c:1597 +#: plugins/sudoers/ldap.c:1733 plugins/sudoers/ldap.c:1757 +#: plugins/sudoers/ldap.c:1787 plugins/sudoers/ldap.c:1840 +#: plugins/sudoers/ldap.c:1855 plugins/sudoers/ldap.c:1951 +#: plugins/sudoers/ldap.c:1984 plugins/sudoers/ldap.c:2137 +#: plugins/sudoers/ldap.c:2234 plugins/sudoers/ldap.c:3041 +#: plugins/sudoers/ldap.c:3074 plugins/sudoers/ldap.c:3388 +#: plugins/sudoers/ldap.c:3416 plugins/sudoers/ldap.c:3427 +#: plugins/sudoers/ldap.c:3517 plugins/sudoers/ldap.c:3533 +#: plugins/sudoers/linux_audit.c:76 plugins/sudoers/logging.c:188 +#: plugins/sudoers/logging.c:916 plugins/sudoers/match.c:501 +#: plugins/sudoers/match.c:537 plugins/sudoers/match.c:699 +#: plugins/sudoers/match.c:756 plugins/sudoers/parse.c:235 +#: plugins/sudoers/parse.c:247 plugins/sudoers/parse.c:262 +#: plugins/sudoers/parse.c:274 plugins/sudoers/policy.c:97 +#: plugins/sudoers/policy.c:106 plugins/sudoers/policy.c:115 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:250 +#: plugins/sudoers/policy.c:271 plugins/sudoers/policy.c:280 +#: plugins/sudoers/policy.c:319 plugins/sudoers/policy.c:329 +#: plugins/sudoers/policy.c:338 plugins/sudoers/policy.c:384 +#: plugins/sudoers/policy.c:579 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/set_perms.c:356 plugins/sudoers/set_perms.c:695 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1350 +#: plugins/sudoers/set_perms.c:1514 plugins/sudoers/sssd.c:160 +#: plugins/sudoers/sssd.c:192 plugins/sudoers/sssd.c:235 +#: plugins/sudoers/sssd.c:242 plugins/sudoers/sssd.c:278 +#: plugins/sudoers/sssd.c:323 plugins/sudoers/sssd.c:917 +#: plugins/sudoers/sssd.c:1050 plugins/sudoers/sudoers.c:159 +#: plugins/sudoers/sudoers.c:294 plugins/sudoers/sudoers.c:304 +#: plugins/sudoers/sudoers.c:312 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:663 plugins/sudoers/sudoers.c:749 +#: plugins/sudoers/sudoers.c:793 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:472 plugins/sudoers/sudoreplay.c:668 +#: plugins/sudoers/sudoreplay.c:780 plugins/sudoers/sudoreplay.c:820 +#: plugins/sudoers/sudoreplay.c:829 plugins/sudoers/sudoreplay.c:839 +#: plugins/sudoers/sudoreplay.c:847 plugins/sudoers/sudoreplay.c:851 +#: plugins/sudoers/sudoreplay.c:1007 plugins/sudoers/sudoreplay.c:1011 +#: plugins/sudoers/testsudoers.c:130 plugins/sudoers/testsudoers.c:188 +#: plugins/sudoers/testsudoers.c:215 plugins/sudoers/testsudoers.c:232 +#: plugins/sudoers/timestamp.c:390 plugins/sudoers/timestamp.c:426 +#: plugins/sudoers/timestamp.c:838 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:147 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:213 +#: plugins/sudoers/visudo.c:297 plugins/sudoers/visudo.c:303 +#: plugins/sudoers/visudo.c:433 plugins/sudoers/visudo.c:974 +#: plugins/sudoers/visudo.c:1018 plugins/sudoers/visudo.c:1114 toke.l:785 +#: toke.l:806 toke.l:816 toke.l:924 toke.l:1082 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:132 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Alias „%s“ už je definovaný" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:120 +msgid "lost connection to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:92 +msgid "unable to initialize PAM" +msgstr "" + +#: plugins/sudoers/auth/pam.c:164 +msgid "account validation failure, is your account locked?" +msgstr "" + +#: plugins/sudoers/auth/pam.c:168 +msgid "Account or password is expired, reset your password and try again" +msgstr "" + +#: plugins/sudoers/auth/pam.c:176 +#, c-format +msgid "unable to change expired password: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:181 +msgid "Password expired, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:185 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:199 +#, c-format +msgid "PAM authentication error: %s" +msgstr "" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:218 +#, c-format +msgid "you do not exist in the %s database" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:207 +msgid "unknown SecurID error" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:120 +msgid "unable to initialize SIA session" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:225 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:227 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "Nie je možné inicializovať spôsoby overenia totožnosti." + +#: plugins/sudoers/auth/sudo_auth.c:435 +msgid "Authentication methods:" +msgstr "Spôsoby overenia totožnosti:" + +#: plugins/sudoers/bsm_audit.c:111 plugins/sudoers/bsm_audit.c:200 +msgid "Could not determine audit condition" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:172 plugins/sudoers/bsm_audit.c:260 +msgid "unable to commit audit record" +msgstr "" + +#: plugins/sudoers/check.c:250 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Veríme, že ste boli poučený miestnym správcom systému.\n" +"Dodržiavajte tieto tri zásady:\n" +"\n" +" 1.) Rešpektujte súkromie iných.\n" +" 2.) Premýšľajte pred tým, než niečo napíšete.\n" +" 3.) S veľkou mocou prichádza veľká zodpovednosť.\n" +"\n" + +#: plugins/sudoers/check.c:293 plugins/sudoers/check.c:303 +#: plugins/sudoers/sudoers.c:699 plugins/sudoers/sudoers.c:728 +#, c-format +msgid "unknown uid: %u" +msgstr "" + +#: plugins/sudoers/check.c:298 plugins/sudoers/policy.c:751 +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/testsudoers.c:206 +#: plugins/sudoers/testsudoers.c:361 +#, c-format +msgid "unknown user: %s" +msgstr "neznámy používateľ: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:67 +msgid "Send mail if the user tries to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:71 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:75 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:79 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:83 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:87 +msgid "Root may run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:99 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:103 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:107 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:111 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:115 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:119 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:123 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:127 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:143 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:147 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:247 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:251 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:323 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:327 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:347 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:351 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:355 +msgid "Set of permitted privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:359 +msgid "Set of limit privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:363 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:367 +msgid "PAM service name to use" +msgstr "" + +#: plugins/sudoers/def_data.c:371 +msgid "PAM service name to use for login shells" +msgstr "" + +#: plugins/sudoers/def_data.c:375 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:379 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:383 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:387 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/def_data.c:391 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/defaults.c:199 plugins/sudoers/defaults.c:608 +#: plugins/sudoers/visudo_json.c:633 plugins/sudoers/visudo_json.c:668 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:207 plugins/sudoers/defaults.c:217 +#: plugins/sudoers/defaults.c:241 plugins/sudoers/defaults.c:256 +#: plugins/sudoers/defaults.c:269 plugins/sudoers/defaults.c:282 +#: plugins/sudoers/defaults.c:295 plugins/sudoers/defaults.c:315 +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:210 plugins/sudoers/defaults.c:220 +#: plugins/sudoers/defaults.c:228 plugins/sudoers/defaults.c:251 +#: plugins/sudoers/defaults.c:264 plugins/sudoers/defaults.c:277 +#: plugins/sudoers/defaults.c:290 plugins/sudoers/defaults.c:310 +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "no value specified for `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:233 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:301 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:450 +#: plugins/sudoers/ldap.c:540 plugins/sudoers/ldap.c:1152 +#: plugins/sudoers/ldap.c:1354 plugins/sudoers/ldap.c:1526 +#: plugins/sudoers/ldap.c:1682 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/logging.c:921 plugins/sudoers/policy.c:498 +#: plugins/sudoers/policy.c:507 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:815 plugins/sudoers/testsudoers.c:236 +#: plugins/sudoers/toke_util.c:160 +#, c-format +msgid "internal error, %s overflow" +msgstr "vnútorná chyba, %s pretečenie" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1052 +msgid "unable to rebuild the environment" +msgstr "" + +#: plugins/sudoers/env.c:1126 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:85 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s musí byť vlastnený identifikátorom uid %d" + +#: plugins/sudoers/group_plugin.c:89 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:97 plugins/sudoers/sssd.c:331 +#, c-format +msgid "unable to load %s: %s" +msgstr "nie je možné načítať %s:%s" + +#: plugins/sudoers/group_plugin.c:103 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:117 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:92 plugins/sudoers/iolog.c:110 +#: plugins/sudoers/timestamp.c:169 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:103 plugins/sudoers/iolog.c:124 +#: plugins/sudoers/iolog.c:131 plugins/sudoers/timestamp.c:163 +#: plugins/sudoers/timestamp.c:184 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:200 plugins/sudoers/sudoers.c:871 +#: plugins/sudoers/sudoreplay.c:300 plugins/sudoers/sudoreplay.c:769 +#: plugins/sudoers/sudoreplay.c:973 plugins/sudoers/timestamp.c:399 +#: plugins/sudoers/visudo.c:898 plugins/sudoers/visudo_json.c:1012 +#: plugins/sudoers/visudo_json.c:1025 +#, c-format +msgid "unable to open %s" +msgstr "nie je možné otvoriť %s" + +#: plugins/sudoers/iolog.c:241 plugins/sudoers/sudoers.c:875 +#: plugins/sudoers/sudoreplay.c:1084 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/iolog.c:277 plugins/sudoers/sudoreplay.c:550 +#: plugins/sudoers/timestamp.c:298 plugins/sudoers/timestamp.c:301 +#, c-format +msgid "unable to write to %s" +msgstr "nie je možné zapísať do %s" + +#: plugins/sudoers/iolog.c:342 plugins/sudoers/iolog.c:540 +#, c-format +msgid "unable to create %s" +msgstr "" + +#: plugins/sudoers/ldap.c:428 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:488 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:515 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:519 plugins/sudoers/ldap.c:555 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:626 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:629 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1138 +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:1144 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1830 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2372 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2374 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2421 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2429 plugins/sudoers/parse.c:555 +#: plugins/sudoers/sssd.c:1417 +#, c-format +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2993 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:3029 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:3286 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "nie je možné otvoriť systém auditu" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "nie je možné odoslať správu auditu" + +#: plugins/sudoers/logging.c:106 +#, c-format +msgid "%8s : %s" +msgstr "" + +#: plugins/sudoers/logging.c:134 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "" + +#: plugins/sudoers/logging.c:159 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:162 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:211 +msgid "No user or host" +msgstr "" + +#: plugins/sudoers/logging.c:213 +msgid "validation failure" +msgstr "" + +#: plugins/sudoers/logging.c:220 +msgid "user NOT in sudoers" +msgstr "" + +#: plugins/sudoers/logging.c:222 +msgid "user NOT authorized on host" +msgstr "" + +#: plugins/sudoers/logging.c:224 +msgid "command not allowed" +msgstr "" + +#: plugins/sudoers/logging.c:259 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:262 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:266 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:306 plugins/sudoers/sudoers.c:471 +#: plugins/sudoers/sudoers.c:473 plugins/sudoers/sudoers.c:475 +#: plugins/sudoers/sudoers.c:477 plugins/sudoers/sudoers.c:1222 +#: plugins/sudoers/sudoers.c:1224 +#, c-format +msgid "%s: command not found" +msgstr "" + +#: plugins/sudoers/logging.c:308 plugins/sudoers/sudoers.c:467 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:325 +msgid "authentication failure" +msgstr "" + +#: plugins/sudoers/logging.c:351 +msgid "a password is required" +msgstr "" + +#: plugins/sudoers/logging.c:422 plugins/sudoers/logging.c:484 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/sudoers/logging.c:572 +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:580 plugins/sudoers/logging.c:636 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:626 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:651 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:689 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/match.c:606 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/match.c:639 +#, c-format +msgid "%s: read error" +msgstr "" + +#: plugins/sudoers/match.c:653 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/parse.c:114 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:117 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:502 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:503 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:517 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:526 +#, c-format +msgid " Options: " +msgstr "" + +#: plugins/sudoers/policy.c:240 plugins/sudoers/testsudoers.c:253 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:636 plugins/sudoers/visudo.c:839 +#, c-format +msgid "unable to execute %s" +msgstr "nie je možné vykonať %s" + +#: plugins/sudoers/policy.c:769 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:771 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:775 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:778 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:780 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:781 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:814 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:136 plugins/sudoers/pwutil.c:153 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:147 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:207 +#: plugins/sudoers/pwutil.c:250 plugins/sudoers/pwutil.c:294 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:202 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:427 plugins/sudoers/pwutil.c:444 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:438 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:476 plugins/sudoers/pwutil.c:492 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:565 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:487 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:676 plugins/sudoers/pwutil.c:710 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:682 plugins/sudoers/pwutil.c:715 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:705 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:438 +#: plugins/sudoers/set_perms.c:841 plugins/sudoers/set_perms.c:1138 +#: plugins/sudoers/set_perms.c:1430 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:369 +#: plugins/sudoers/set_perms.c:446 plugins/sudoers/set_perms.c:708 +#: plugins/sudoers/set_perms.c:849 plugins/sudoers/set_perms.c:1067 +#: plugins/sudoers/set_perms.c:1146 plugins/sudoers/set_perms.c:1363 +#: plugins/sudoers/set_perms.c:1438 plugins/sudoers/set_perms.c:1527 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:493 +#: plugins/sudoers/set_perms.c:1197 plugins/sudoers/set_perms.c:1470 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:590 +#: plugins/sudoers/set_perms.c:978 plugins/sudoers/set_perms.c:1274 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:595 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1279 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:606 +#: plugins/sudoers/set_perms.c:992 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:624 +#: plugins/sudoers/set_perms.c:1008 plugins/sudoers/set_perms.c:1304 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:356 plugins/sudoers/set_perms.c:695 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1350 +#: plugins/sudoers/set_perms.c:1514 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "" + +#: plugins/sudoers/sssd.c:333 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:341 plugins/sudoers/sssd.c:350 +#: plugins/sudoers/sssd.c:359 plugins/sudoers/sssd.c:368 +#: plugins/sudoers/sssd.c:377 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:290 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:308 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:326 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:339 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:172 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/visudo.c:223 plugins/sudoers/visudo.c:565 +msgid "unable to initialize sudoers default values" +msgstr "" + +#: plugins/sudoers/sudoers.c:197 plugins/sudoers/sudoers.c:239 +#: plugins/sudoers/sudoers.c:833 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:275 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:332 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:396 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:410 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:411 +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:466 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:486 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:778 +msgid "command too long" +msgstr "" + +#: plugins/sudoers/sudoers.c:886 plugins/sudoers/visudo.c:426 +#: plugins/sudoers/visudo.c:665 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:890 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nie je regulárny súbor" + +#: plugins/sudoers/sudoers.c:894 plugins/sudoers/timestamp.c:225 toke.l:947 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s je vlastnený identifikátorom uid %u a mal by byť vlastnený %u" + +#: plugins/sudoers/sudoers.c:898 toke.l:954 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:902 toke.l:959 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:933 +#, c-format +msgid "only root can use `-c %s'" +msgstr "" + +#: plugins/sudoers/sudoers.c:952 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1031 plugins/sudoers/sudoers.c:1059 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1126 plugins/sudoers/testsudoers.c:385 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:232 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:245 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:251 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:254 plugins/sudoers/visudo.c:180 +#, c-format +msgid "%s version %s\n" +msgstr "%s verzia %s\n" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:292 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:308 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:314 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:315 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:368 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:401 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:611 plugins/sudoers/sudoreplay.c:636 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:658 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:662 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:677 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:680 plugins/sudoers/sudoreplay.c:1060 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:684 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:693 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:695 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:697 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:746 +#, c-format +msgid "unknown search type %d" +msgstr "neznámy typ vyhľadávania %d" + +#: plugins/sudoers/sudoreplay.c:784 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: neplatný súbor záznamu" + +#: plugins/sudoers/sudoreplay.c:802 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: chýba pole časovej značky" + +#: plugins/sudoers/sudoreplay.c:809 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: časová značka %s: %s" + +#: plugins/sudoers/sudoreplay.c:816 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:825 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:834 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1197 +#, c-format +msgid "usage: %s [-h] [-d dir] [-m num] [-s num] ID\n" +msgstr "použitie: %s [-h] [-d adresár] [-m číslo] [-s číslo] ID\n" + +#: plugins/sudoers/sudoreplay.c:1200 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "použitie: %s [-h] [-d adresár] -l [hľadaný výraz]\n" + +#: plugins/sudoers/sudoreplay.c:1209 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1211 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Voľby:\n" +" -d, --directory=adresárr určí adresár pre záznamy relácie\n" +" -f, --filter=filter určuje, ktoré vstupno-výstupné typy sa majú zorbaziť\n" +" -h, --help zorbazí správu pomocníka a skončí\n" +" -l, --list vypíše identifikátory dostupných relácií, s voliteľným výrazom\n" +" -m, --max-wait=číslo maximálny počet sekúnd čakania medzi udalosťami\n" +" -s, --speed=číslo zrýchli alebo spomalí výstup\n" +" -V, --version zobrazí informácie o verzii a skončí" + +#: plugins/sudoers/testsudoers.c:324 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:327 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Príkaz povolený" + +#: plugins/sudoers/testsudoers.c:328 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Príkaz odmietnutý" + +#: plugins/sudoers/testsudoers.c:328 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Príkaz nevyhovujúci" + +#: plugins/sudoers/timestamp.c:233 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:309 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:742 plugins/sudoers/timestamp.c:809 +#: plugins/sudoers/visudo.c:486 plugins/sudoers/visudo.c:492 +msgid "unable to read the clock" +msgstr "nie je možné čítať hodiny" + +#: plugins/sudoers/timestamp.c:756 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:768 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:906 plugins/sudoers/timestamp.c:926 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:182 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:254 plugins/sudoers/visudo.c:617 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:319 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:337 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:454 +msgid "write error" +msgstr "chyba zápisu" + +#: plugins/sudoers/visudo.c:499 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:512 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:534 +#, c-format +msgid "%s unchanged" +msgstr "%s nezmenený" + +#: plugins/sudoers/visudo.c:560 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:571 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:608 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:667 plugins/sudoers/visudo.c:676 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:671 plugins/sudoers/visudo.c:681 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:698 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:712 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:722 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:784 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:798 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:846 +#, c-format +msgid "unable to run %s" +msgstr "nie je možné spustiť %s" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:879 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:904 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:920 plugins/sudoers/visudo_json.c:1041 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:923 plugins/sudoers/visudo_json.c:1044 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:931 plugins/sudoers/visudo.c:938 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:985 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Error: cycle in %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1082 +#, c-format +msgid "Warning: cycle in %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Error: %s `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1087 +#, c-format +msgid "Warning: %s `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1230 +#, c-format +msgid "Warning: unused %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1343 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - bezpečne upraví súbor sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1345 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" + +#: plugins/sudoers/visudo_json.c:1018 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: toke.l:918 +msgid "too many levels of includes" +msgstr "" diff --git a/plugins/sudoers/po/sl.mo b/plugins/sudoers/po/sl.mo new file mode 100644 index 0000000..832663f Binary files /dev/null and b/plugins/sudoers/po/sl.mo differ diff --git a/plugins/sudoers/po/sl.po b/plugins/sudoers/po/sl.po new file mode 100644 index 0000000..55d6733 --- /dev/null +++ b/plugins/sudoers/po/sl.po @@ -0,0 +1,1758 @@ +# Slovenian translation of sudo. +# This file is put in the public domain. +# This file is distributed under the same license as the sudo package. +# +# Damir Jerovšek , 2012. +# Klemen Košir , 2012 - 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.7b1\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2013-04-02 10:40-0400\n" +"PO-Revision-Date: 2013-04-06 09:44+0100\n" +"Last-Translator: Klemen Košir \n" +"Language-Team: Slovenian \n" +"Language: sl\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" +"X-Generator: Poedit 1.5.5\n" + +#: confstr.sh:2 plugins/sudoers/auth/pam.c:340 +msgid "Password:" +msgstr "Geslo:" + +#: confstr.sh:3 +msgid "*** SECURITY information for %h ***" +msgstr "*** Varnostni podatki za %h ***" + +#: confstr.sh:4 +msgid "Sorry, try again." +msgstr "Prosimo, poskusite znova." + +#: plugins/sudoers/alias.c:124 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Vzdevek `%s' je že določen" + +#: plugins/sudoers/auth/bsdauth.c:77 +#, c-format +msgid "unable to get login class for user %s" +msgstr "prijavnega razreda uporabnika %s ni mogoče pridobiti" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "unable to begin bsd authentication" +msgstr "ni mogoče začeti overitve bsd" + +#: plugins/sudoers/auth/bsdauth.c:91 +msgid "invalid authentication type" +msgstr "neveljavna vrsta overitve" + +#: plugins/sudoers/auth/bsdauth.c:100 +msgid "unable to setup authentication" +msgstr "ni mogoče nastaviti overitve" + +#: plugins/sudoers/auth/fwtk.c:59 +#, c-format +msgid "unable to read fwtk config" +msgstr "ni mogoče brati nastavitev fwtk" + +#: plugins/sudoers/auth/fwtk.c:64 +#, c-format +msgid "unable to connect to authentication server" +msgstr "ni se mogoče povezati s strežnikom overitve" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:127 +#, c-format +msgid "lost connection to authentication server" +msgstr "povezava s strežnikom overitve je bila izgubljena" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"napaka strežnika overitve:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:116 +#, c-format +msgid "%s: unable to unparse princ ('%s'): %s" +msgstr "%s: ni mogoče odrazčleniti princ ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:159 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: ni mogoče razčleniti '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve ccache: %s" +msgstr "%s: ni mogoče razrešiti ccache: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: ni mogoče dodeliti možnosti: %s" + +#: plugins/sudoers/auth/kerb5.c:233 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: ni mogoče dobiti poverila: %s" + +#: plugins/sudoers/auth/kerb5.c:246 +#, c-format +msgid "%s: unable to initialize ccache: %s" +msgstr "%s: ni mogoče začeti ccache: %s" + +#: plugins/sudoers/auth/kerb5.c:250 +#, c-format +msgid "%s: unable to store cred in ccache: %s" +msgstr "%s: ni mogoče shraniti cred v ccache: %s" + +#: plugins/sudoers/auth/kerb5.c:315 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: ni mogoče pridobiti predstojnika gostitve: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: ni mogoče preveriti TGT! Možen napad!: %s" + +#: plugins/sudoers/auth/pam.c:100 +msgid "unable to initialize PAM" +msgstr "ni mogoče začeti PAM" + +#: plugins/sudoers/auth/pam.c:145 +msgid "account validation failure, is your account locked?" +msgstr "potrditev veljavnosti računa je spodletela, je vaš račun zaklenjen?" + +#: plugins/sudoers/auth/pam.c:149 +msgid "Account or password is expired, reset your password and try again" +msgstr "Geslo ali račun je potekel, ponastavite svoje geslo in poskusite znova" + +#: plugins/sudoers/auth/pam.c:156 +#, c-format +msgid "pam_chauthtok: %s" +msgstr "pam_chauthtok: %s" + +#: plugins/sudoers/auth/pam.c:160 +msgid "Password expired, contact your system administrator" +msgstr "Veljavnost gesla je potekla. Stopite v stik s svojim sistemskim skrbnikom" + +#: plugins/sudoers/auth/pam.c:164 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Račun je potekel ali pa nastavitvam PAM primanjkuje odsek \"account\" za sudo, obrnite se na sistemskega skrbnika" + +#: plugins/sudoers/auth/pam.c:181 +#, c-format +msgid "pam_authenticate: %s" +msgstr "pam_authenticate: %s" + +#: plugins/sudoers/auth/pam.c:339 +msgid "Password: " +msgstr "Geslo: " + +#: plugins/sudoers/auth/rfc1938.c:103 plugins/sudoers/visudo.c:212 +#, c-format +msgid "you do not exist in the %s database" +msgstr "ne obstajate v podatkovni zbirki %s" + +#: plugins/sudoers/auth/securid5.c:80 +#, c-format +msgid "failed to initialise the ACE API library" +msgstr "začenjanje knjižnice ACE API je spodletelo" + +#: plugins/sudoers/auth/securid5.c:106 +#, c-format +msgid "unable to contact the SecurID server" +msgstr "ni mogoče navezati stika s strežnikom SecurID" + +#: plugins/sudoers/auth/securid5.c:115 +#, c-format +msgid "User ID locked for SecurID Authentication" +msgstr "ID uporabnika je zaklenjen zaradi overitve SecurID" + +#: plugins/sudoers/auth/securid5.c:119 plugins/sudoers/auth/securid5.c:170 +#, c-format +msgid "invalid username length for SecurID" +msgstr "neveljavna dolžina imena uporabnika za SecurID" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:175 +#, c-format +msgid "invalid Authentication Handle for SecurID" +msgstr "neveljavna ročica overitve za SecurID" + +#: plugins/sudoers/auth/securid5.c:127 +#, c-format +msgid "SecurID communication failed" +msgstr "sporazumevanje SecurID je spodletelo" + +#: plugins/sudoers/auth/securid5.c:131 plugins/sudoers/auth/securid5.c:214 +#, c-format +msgid "unknown SecurID error" +msgstr "neznana napaka SecurID" + +#: plugins/sudoers/auth/securid5.c:165 +#, c-format +msgid "invalid passcode length for SecurID" +msgstr "neveljavna dolžina gesla za SecurID" + +#: plugins/sudoers/auth/sia.c:108 +msgid "unable to initialize SIA session" +msgstr "ni mogoče začeti seje SIA" + +#: plugins/sudoers/auth/sudo_auth.c:119 +msgid "invalid authentication methods" +msgstr "neveljavni načini overitve" + +#: plugins/sudoers/auth/sudo_auth.c:120 +msgid "Invalid authentication methods compiled into sudo! You may mix standalone and non-standalone authentication." +msgstr "Neveljavni načini overitve so kodno prevedeni v sudo! Mešate lahko samostojno in nesamostojno overjanje." + +#: plugins/sudoers/auth/sudo_auth.c:203 +msgid "no authentication methods" +msgstr "ni načinov overjanja" + +#: plugins/sudoers/auth/sudo_auth.c:205 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Ni načinov overitve, kodno prevedenih v sudo! Če želite izklopiti overjanje, uporabite nastavitveno možnost --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:389 +msgid "Authentication methods:" +msgstr "Načini overjanja:" + +#: plugins/sudoers/bsm_audit.c:60 plugins/sudoers/bsm_audit.c:63 +#: plugins/sudoers/bsm_audit.c:112 plugins/sudoers/bsm_audit.c:116 +#: plugins/sudoers/bsm_audit.c:168 plugins/sudoers/bsm_audit.c:172 +#, c-format +msgid "getaudit: failed" +msgstr "getaudit: spodletelo" + +#: plugins/sudoers/bsm_audit.c:90 plugins/sudoers/bsm_audit.c:153 +#, c-format +msgid "Could not determine audit condition" +msgstr "Pogoja presoje varnosti ni bilo mogoče določiti" + +#: plugins/sudoers/bsm_audit.c:101 +#, c-format +msgid "getauid failed" +msgstr "getauid je spodletel" + +#: plugins/sudoers/bsm_audit.c:103 plugins/sudoers/bsm_audit.c:162 +#, c-format +msgid "au_open: failed" +msgstr "au_open: spodletelo" + +#: plugins/sudoers/bsm_audit.c:118 plugins/sudoers/bsm_audit.c:174 +#, c-format +msgid "au_to_subject: failed" +msgstr "au_to_subject: spodletelo" + +#: plugins/sudoers/bsm_audit.c:122 plugins/sudoers/bsm_audit.c:178 +#, c-format +msgid "au_to_exec_args: failed" +msgstr "au_to_exec_args: spodletelo" + +#: plugins/sudoers/bsm_audit.c:126 plugins/sudoers/bsm_audit.c:187 +#, c-format +msgid "au_to_return32: failed" +msgstr "au_to_return32: spodletelo" + +#: plugins/sudoers/bsm_audit.c:129 plugins/sudoers/bsm_audit.c:190 +#, c-format +msgid "unable to commit audit record" +msgstr "ni bilo mogoče uveljaviti zapisa presoje varnosti" + +#: plugins/sudoers/bsm_audit.c:160 +#, c-format +msgid "getauid: failed" +msgstr "getauid: spodletelo" + +#: plugins/sudoers/bsm_audit.c:183 +#, c-format +msgid "au_to_text: failed" +msgstr "au_to_text: spodletelo" + +#: plugins/sudoers/check.c:174 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Verjetno vam je skrbnik sistemov že pridigal o varnosti,\n" +"vendar si vseeno zapomnite naslednja pravila:\n" +"\n" +" #1) Spoštujte zasebnost drugih.\n" +" #2) Premislite, preden izvedete ukaze.\n" +" #3) Velika moč prinaša veliko odgovornost.\n" +"\n" + +#: plugins/sudoers/check.c:212 plugins/sudoers/check.c:218 +#: plugins/sudoers/sudoers.c:562 plugins/sudoers/sudoers.c:566 +#, c-format +msgid "unknown uid: %u" +msgstr "neznan ID uporabnika: %u" + +#: plugins/sudoers/check.c:215 plugins/sudoers/policy.c:635 +#: plugins/sudoers/sudoers.c:845 plugins/sudoers/testsudoers.c:215 +#: plugins/sudoers/testsudoers.c:359 +#, c-format +msgid "unknown user: %s" +msgstr "neznan uporabnik: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Pripomoček syslog, če se syslog uporablja za beleženje: %s" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Prednost syslog, ko se uporabnik uspešno overi: %s" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Prednost syslog, ko se uporabnik ne overi uspešno: %s" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "postavi poziv OTP v svojo vrstico" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "Prezri '.' v $PATH" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "Vedno pošlji pošto, kadar se zažene sudo" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "Pošlji pošto, če overitev uporabnika spodleti" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "Pošlji pošto, če uporabnik ni v sudoers" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Pošlji pošto, če uporabnik ni v sudoers za tega gostitelja" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Pošlji pošto, če uporabniku ni dovoljeno zagnati ukaza" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Uporabi ločen časovni žig za vsako kombinacijo uporabnik/tty" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "Poduči uporabnika, ko prvič zažene sudo" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Datoteka, ki vsebuje poduk sudo: %s" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "Privzeto zahtevaj od uporabnikov, da se overijo" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "Skrbnik lahko zažene sudo" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Beleži ime gostitelja v datoteko dnevnika (ne v sistemski dnevnik)" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "Beleži leto v (ne-syslog) dnevniško datoteko" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Če je sudo poklican brez argumentov, začni lupino" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Postavi $HOME ciljnemu uporabniku, kadar se začne lupina s -s" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "Vedno postavi $HOME domači mapi ciljnega uporabnika" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "Dovoli zbrati nekaj podrobnosti za uporabna sporočila napak" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Zahtevaj povsem uvrščena imena gostiteljev v datoteki sudoers" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "Užali uporabnika, ko vnese nepravilno geslo" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Dovoli uporabniku zagnati sudo samo v primeru, če imajo tty" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo bo spoštoval spremenljivko okolja UREJEVALNIKA" + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "Pozovi za geslo skrbnika, ne uporabnika" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pozovi za geslo uporabnika runas_default namesto uporabnikovega gesla" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pozovi za geslo ciljnega uporabnika namesto uporabnikovega" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Uveljavi privzete vrednosti v ciljnem uporabniškem razredu prijave, če le ta obstaja" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Nastavi spremenljivke okolja LOGNAME in USER" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Nastavi samo dejanski ID uporabnika ciljnemu uporabniku, ne resničnega ID-ja" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ne začenjaj vektorja skupine ciljnega uporabnika" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %d" +msgstr "Dolžina, pri kateri se naj prelomijo vrstice datotek beleženja (0 za brez lomljenja):% d" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Časovni potek overitve časovnega žiga: %.1f minut" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Zakasnitev poziva gesla: %.1f minut" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %d" +msgstr "Število poskusov vnosa gesla: %d" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Uporabniška maska, ki bo uporabljena ali 0777 za uporabo uporabnikove: 0%o" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "Pot do datoteke beleženja: %s" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "Pot do programa pošte: %s" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Zastavice za program pošte: %s" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Naslov prejemnika pošte: %s" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Naslov pošiljatelja pošte: %s" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Vrstica zadeve za poštna sporočila: %s" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Nepravilno sporočilo gesla: %s" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Pot do mape časovnega žiga overitve: %s" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Lastnik mape časovnega žiga overitve: %s" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Uporabnikov v tej skupini zahteve gesla in PATH ne omejujejo: %s" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Default password prompt: %s" +msgstr "Privzeti poziv gesla: %s" + +#: plugins/sudoers/def_data.c:219 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Če je poziv gesla nastavljen, bo prepisal sistemski poziv v vseh primerih." + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Privzet uporabnik za izvajanje ukazov kot: %s" + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Vrednost, s katerim se bo prepisal $PATH uporabnika: %s" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Pot do urejevalnika za uporabo z visudo: %s" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kdaj naj bo zahtevano geslo za psevdoukaz 'list': %s" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kdaj naj bo zahtevano geslo za psevdoukaz 'verify': %s" + +#: plugins/sudoers/def_data.c:243 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Prednaloži preizkusne funkcije, shranjene v knjižnici sudo_noexec" + +#: plugins/sudoers/def_data.c:247 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Če je mapa LDAP na voljo, bodo krajevne datoteke sudoers prezrte" + +#: plugins/sudoers/def_data.c:251 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Opisniki datotek >= %d bodo končani pred izvedbo ukaza" + +#: plugins/sudoers/def_data.c:255 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Če je nastavljeno, lahko uporabniki prepišejo vrednost `closefrom' z možnostjo -C" + +#: plugins/sudoers/def_data.c:259 +msgid "Allow users to set arbitrary environment variables" +msgstr "Dovoli uporabnikom nastavljanje poljubnih spremenljivk okolja" + +#: plugins/sudoers/def_data.c:263 +msgid "Reset the environment to a default set of variables" +msgstr "Ponastavi okolje na privzet nabor spremenljivk" + +#: plugins/sudoers/def_data.c:267 +msgid "Environment variables to check for sanity:" +msgstr "Spremenljivke okolja, ki bodo preverjene za smiselnost:" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to remove:" +msgstr "Spremenljivke okolja za odstranitev:" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to preserve:" +msgstr "Spremenljivke okolja za ohranitev:" + +#: plugins/sudoers/def_data.c:279 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Vloga SELinux za uporabo v novi vsebini varnosti: %s" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Vrsta SELinux za uporabo v novi vsebini varnosti: %s" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Pot do določene sudo datoteke okolja: %s" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Jezikovna oznaka za uporabo pri razčlenjevanju sudoers: %s" + +#: plugins/sudoers/def_data.c:295 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Dovoli programu sudo, da vpraša za geslo, čeprav bi bilo le-to vidno" + +#: plugins/sudoers/def_data.c:299 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Zagotovi viden odziv ob vnosu gesla ob vnosu uporabnika" + +#: plugins/sudoers/def_data.c:303 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Uporabi hitrejše razširjanje imen poti, ki je manj natančno, vendar ne dostopa do datotečnega sistema" + +#: plugins/sudoers/def_data.c:307 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Uporabniška maska v sudoers bo prepisala uporabnikovo tudi, če je bolj premisivna" + +#: plugins/sudoers/def_data.c:311 +msgid "Log user's input for the command being run" +msgstr "Beleži vnos uporabnika za ukaz, ki se izvaja" + +#: plugins/sudoers/def_data.c:315 +msgid "Log the output of the command being run" +msgstr "Beleži izpis ukaza, ki se izvaja" + +#: plugins/sudoers/def_data.c:319 +msgid "Compress I/O logs using zlib" +msgstr "Stisni dnevnike I/O s pomočjo zlib" + +#: plugins/sudoers/def_data.c:323 +msgid "Always run commands in a pseudo-tty" +msgstr "Vedno zaženi ukaze v psevdo-tty" + +#: plugins/sudoers/def_data.c:327 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Vstavek za podporo skupinam, ki niso del Unixa: %s" + +#: plugins/sudoers/def_data.c:331 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Mapa, v kateri bodo shranjeni dnevniki vnosov/izpisov: %s" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Datoteka, v kateri bo shranjen dnevnik vnosov/izpisov: %s" + +#: plugins/sudoers/def_data.c:339 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Dodaj vstop datoteki utmp/utmpx, kadar se dodeljuje pty" + +#: plugins/sudoers/def_data.c:343 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Nastavi uporabnika v utmp uporabniku runas, ne poklicanemu uporabniku" + +#: plugins/sudoers/def_data.c:347 +msgid "Set of permitted privileges" +msgstr "Niz omogočenih dovoljenj" + +#: plugins/sudoers/def_data.c:351 +msgid "Set of limit privileges" +msgstr "Niz omejenih dovoljenj" + +#: plugins/sudoers/def_data.c:355 +msgid "Run commands on a pty in the background" +msgstr "Zaženi ukaze v terminalu v ozadju" + +#: plugins/sudoers/def_data.c:359 +msgid "Create a new PAM session for the command to run in" +msgstr "Ustvari sejo PAM, v kateri se bodo ukazi izvajali" + +#: plugins/sudoers/def_data.c:363 +msgid "Maximum I/O log sequence number" +msgstr "Največja zaporedna številka dnevnika I/O" + +#: plugins/sudoers/defaults.c:207 plugins/sudoers/defaults.c:587 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "neznan privzet vnos `%s'" + +#: plugins/sudoers/defaults.c:215 plugins/sudoers/defaults.c:225 +#: plugins/sudoers/defaults.c:245 plugins/sudoers/defaults.c:258 +#: plugins/sudoers/defaults.c:271 plugins/sudoers/defaults.c:284 +#: plugins/sudoers/defaults.c:297 plugins/sudoers/defaults.c:317 +#: plugins/sudoers/defaults.c:327 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "vrednost `%s' je neveljavna za možnost `%s'" + +#: plugins/sudoers/defaults.c:218 plugins/sudoers/defaults.c:228 +#: plugins/sudoers/defaults.c:236 plugins/sudoers/defaults.c:253 +#: plugins/sudoers/defaults.c:266 plugins/sudoers/defaults.c:279 +#: plugins/sudoers/defaults.c:292 plugins/sudoers/defaults.c:312 +#: plugins/sudoers/defaults.c:323 +#, c-format +msgid "no value specified for `%s'" +msgstr "za `%s' ni določena nobena vrednost" + +#: plugins/sudoers/defaults.c:241 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "vrednosti za `%s' se morajo začeti s '/'" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "option `%s' does not take a value" +msgstr "možnost `%s' ne sprejme vrednosti" + +#: plugins/sudoers/env.c:288 plugins/sudoers/env.c:293 +#: plugins/sudoers/env.c:395 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/policy.c:420 plugins/sudoers/policy.c:427 +#: plugins/sudoers/prompt.c:171 plugins/sudoers/sudoers.c:654 +#: plugins/sudoers/testsudoers.c:243 +#, c-format +msgid "internal error, %s overflow" +msgstr "notranja napaka, prekoračitev funkcije %s" + +#: plugins/sudoers/env.c:367 +#, c-format +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: pokvarjen envp, neujemanje dolžine" + +#: plugins/sudoers/env.c:1012 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "nimate dovoljenj nastavljati naslednjih spremenljivk okolja: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s mora biti v lasti ID-ja uporabnika %d" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s mora biti zapisljiv samo za lastnika" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "ni mogoče uporabiti dlopen %s: %s" + +#: plugins/sudoers/group_plugin.c:118 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "ni mogoče najti simbola \"group_plugin\" v %s" + +#: plugins/sudoers/group_plugin.c:123 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: nezdružljiva večja različica vstavka skupin %d, pričakovana %d" + +#: plugins/sudoers/interfaces.c:119 +msgid "Local IP address and netmask pairs:\n" +msgstr "Pari krajevnih naslovov IP in omrežnih mask:\n" + +#: plugins/sudoers/iolog.c:131 plugins/sudoers/iolog.c:144 +#: plugins/sudoers/timestamp.c:199 plugins/sudoers/timestamp.c:243 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s že obstaja, toda ni mapa (0%o)" + +#: plugins/sudoers/iolog.c:141 plugins/sudoers/iolog.c:155 +#: plugins/sudoers/iolog.c:159 plugins/sudoers/timestamp.c:164 +#: plugins/sudoers/timestamp.c:220 plugins/sudoers/timestamp.c:270 +#, c-format +msgid "unable to mkdir %s" +msgstr "ustvarjenje mape %s z mkdir ni mogoče" + +#: plugins/sudoers/iolog.c:217 plugins/sudoers/sudoers.c:708 +#: plugins/sudoers/sudoreplay.c:354 plugins/sudoers/sudoreplay.c:815 +#: plugins/sudoers/sudoreplay.c:978 plugins/sudoers/timestamp.c:154 +#: plugins/sudoers/visudo.c:809 +#, c-format +msgid "unable to open %s" +msgstr "ni mogoče odpreti %s" + +#: plugins/sudoers/iolog.c:250 plugins/sudoers/sudoers.c:711 +#, c-format +msgid "unable to read %s" +msgstr "ni mogoče brati %s" + +#: plugins/sudoers/iolog.c:274 plugins/sudoers/timestamp.c:158 +#, c-format +msgid "unable to write to %s" +msgstr "ni mogoče pisati v %s" + +#: plugins/sudoers/iolog.c:334 +#, c-format +msgid "unable to create %s" +msgstr "ni mogoče ustvariti %s" + +#: plugins/sudoers/ldap.c:385 +#, c-format +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: vrednost vrat je prevelika" + +#: plugins/sudoers/ldap.c:408 +#, c-format +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "sudo_ldap_conf_add_ports: med razširjanjem hostbuf je zmanjkalo prostora" + +#: plugins/sudoers/ldap.c:438 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nepodprta vrsta uri-ja LDAP: %s" + +#: plugins/sudoers/ldap.c:467 +#, c-format +msgid "invalid uri: %s" +msgstr "neveljaven uri: %s" + +#: plugins/sudoers/ldap.c:473 +#, c-format +msgid "unable to mix ldap and ldaps URIs" +msgstr "ni mogoče mešati URI-jev ldap in ldaps" + +#: plugins/sudoers/ldap.c:477 +#, c-format +msgid "unable to mix ldaps and starttls" +msgstr "ni mogoče mešati ldaps in starttls" + +#: plugins/sudoers/ldap.c:496 +#, c-format +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "sudo_ldap_parse_uri: med izgradnjo hostbuf je zmanjkalo prostora" + +#: plugins/sudoers/ldap.c:570 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "ni mogoče začenjati potrdila SSL in ključa db: %s" + +#: plugins/sudoers/ldap.c:573 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "za uporabo SSL-ja morate nastaviti TSL_CERT v datoteki %s" + +#: plugins/sudoers/ldap.c:996 +#, c-format +msgid "unable to get GMT time" +msgstr "ni mogoče dobiti časa GMT" + +#: plugins/sudoers/ldap.c:1002 +#, c-format +msgid "unable to format timestamp" +msgstr "ni mogoče oblikovati časovnega žiga" + +#: plugins/sudoers/ldap.c:1010 +#, c-format +msgid "unable to build time filter" +msgstr "ni mogoče izgraditi časovnega filtra" + +#: plugins/sudoers/ldap.c:1229 +#, c-format +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "sudo_ldap_build_pass1 neujemanje dodelitve" + +#: plugins/sudoers/ldap.c:1776 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Vloga LDAP: %s\n" + +#: plugins/sudoers/ldap.c:1778 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"Vloga LDAP: NEZNANA\n" + +#: plugins/sudoers/ldap.c:1825 +#, c-format +msgid " Order: %s\n" +msgstr " Vrstni red: %s\n" + +#: plugins/sudoers/ldap.c:1833 plugins/sudoers/parse.c:515 +#: plugins/sudoers/sssd.c:1173 +#, c-format +msgid " Commands:\n" +msgstr " Ukazi:\n" + +#: plugins/sudoers/ldap.c:2255 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "ni mogoče začeti LDAP: %s" + +#: plugins/sudoers/ldap.c:2289 +#, c-format +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls je določen, toda knjižnice LDAP ne podpirajo ldap_start_tls_s() ali ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:2525 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "neveljaven atribut sudoOrder: %s" + +#: plugins/sudoers/linux_audit.c:57 +#, c-format +msgid "unable to open audit system" +msgstr "ni mogoče odpreti nadzornega sistema" + +#: plugins/sudoers/linux_audit.c:93 +#, c-format +msgid "unable to send audit message" +msgstr "ni mogoče poslati nadzornega sporočila" + +#: plugins/sudoers/logging.c:140 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:168 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (ukaz) %s" + +#: plugins/sudoers/logging.c:194 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "ni mogoče odpreti datoteke dnevnika: %s: %s" + +#: plugins/sudoers/logging.c:197 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "ni mogoče zakleniti datoteke dnevnika: %s: %s" + +#: plugins/sudoers/logging.c:245 +msgid "No user or host" +msgstr "Brez uporabnika ali gostitelja" + +#: plugins/sudoers/logging.c:247 +msgid "validation failure" +msgstr "potrjevanje veljavnosti ni uspelo" + +#: plugins/sudoers/logging.c:254 +msgid "user NOT in sudoers" +msgstr "uporabnika NI v sudoers" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT authorized on host" +msgstr "uporabnik NI pooblaščen na gostitelju" + +#: plugins/sudoers/logging.c:258 +msgid "command not allowed" +msgstr "ukaz ni dovoljen" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s ni v datoteki sudoers. Ta dogodek bo zabeležen.\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nima dovoljenj za izvajanje sudo na %s. Ta dogodek bo zabeležen.\n" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Uporabnik %s ne sme izvajati sudo na %s.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Uporabnik %s ne sme zagnati '%s%s%s' kot %s%s%s na %s.\n" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:383 +#: plugins/sudoers/sudoers.c:384 plugins/sudoers/sudoers.c:386 +#: plugins/sudoers/sudoers.c:387 plugins/sudoers/sudoers.c:1001 +#: plugins/sudoers/sudoers.c:1002 +#, c-format +msgid "%s: command not found" +msgstr "%s: ukaza ni bilo mogoče najti" + +#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:379 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" +"prezrtje `%s', najdenega v '.'\n" +"Uporabite `sudo ./%s', če je to `%s', ki ga želite zagnati." + +#: plugins/sudoers/logging.c:353 +msgid "authentication failure" +msgstr "napaka overitve" + +#: plugins/sudoers/logging.c:379 +msgid "a password is required" +msgstr "zahtevano je geslo" + +#: plugins/sudoers/logging.c:443 plugins/sudoers/logging.c:487 +#, c-format +msgid "%d incorrect password attempt" +msgid_plural "%d incorrect password attempts" +msgstr[0] "%d nepravilnih poskusov vnosa gesla" +msgstr[1] "%d nepravilen poskus vnosa gesla" +msgstr[2] "%d nepravilna poskusa vnosa gesla" +msgstr[3] "%d nepravilni poskusi vnosa gesla" + +#: plugins/sudoers/logging.c:566 +#, c-format +msgid "unable to fork" +msgstr "ni mogoče razvejiti" + +#: plugins/sudoers/logging.c:573 plugins/sudoers/logging.c:629 +#, c-format +msgid "unable to fork: %m" +msgstr "ni mogoče razvejiti: %m" + +#: plugins/sudoers/logging.c:619 +#, c-format +msgid "unable to open pipe: %m" +msgstr "ni mogoče odpreti cevi: %m" + +#: plugins/sudoers/logging.c:644 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "ni mogoče podvojiti stdin: %m" + +#: plugins/sudoers/logging.c:680 +#, c-format +msgid "unable to execute %s: %m" +msgstr "ni mogoče izvesti %s: %m" + +#: plugins/sudoers/logging.c:899 +#, c-format +msgid "internal error: insufficient space for log line" +msgstr "notranja napaka: premalo prostora za vrstico dnevnika" + +#: plugins/sudoers/parse.c:124 +#, c-format +msgid "parse error in %s near line %d" +msgstr "napaka razčlenjevanja v %s blizu vrstice %d" + +#: plugins/sudoers/parse.c:127 +#, c-format +msgid "parse error in %s" +msgstr "napaka med razčlenjevanjem datoteke %s" + +#: plugins/sudoers/parse.c:462 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Vnos sudoers:\n" + +#: plugins/sudoers/parse.c:463 +#, c-format +msgid " RunAsUsers: " +msgstr " ZaženiKotUporabniki: " + +#: plugins/sudoers/parse.c:477 +#, c-format +msgid " RunAsGroups: " +msgstr " ZaženiKotSkupine: " + +#: plugins/sudoers/parse.c:486 +#, c-format +msgid " Options: " +msgstr " Možnosti: " + +#: plugins/sudoers/policy.c:517 plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to execute %s" +msgstr "ni mogoče izvršiti %s" + +#: plugins/sudoers/policy.c:659 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Vstavek pravilnika sudoers različica %s\n" + +#: plugins/sudoers/policy.c:661 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Datoteka slovnice sudoers različica %d\n" + +#: plugins/sudoers/policy.c:665 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Pot sudoers: %s\n" + +#: plugins/sudoers/policy.c:668 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "pot nsswitch: %s\n" + +#: plugins/sudoers/policy.c:670 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "pot ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:671 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "pot ldap.secret: %s\n" + +#: plugins/sudoers/pwutil.c:148 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "ni mogoče predpomniti ID-ja uporabnika %u, že obstaja" + +#: plugins/sudoers/pwutil.c:190 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "ni mogoče predpomniti uporabnika %s, že obstaja" + +#: plugins/sudoers/pwutil.c:374 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "ni mogoče predpomniti ID-ja skupine %u, že obstaja" + +#: plugins/sudoers/pwutil.c:410 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "ni mogoče predpomniti skupine %s, že obstaja" + +#: plugins/sudoers/pwutil.c:564 plugins/sudoers/pwutil.c:586 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "seznama skupina za %s ni mogoče predpomniti, saj že obstaja" + +#: plugins/sudoers/pwutil.c:584 +#, c-format +msgid "unable to parse groups for %s" +msgstr "skupin za %s ni mogoče razčleniti" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:445 +#: plugins/sudoers/set_perms.c:846 plugins/sudoers/set_perms.c:1141 +#: plugins/sudoers/set_perms.c:1431 +msgid "perm stack overflow" +msgstr "prekoračitev trajnega sklada" + +#: plugins/sudoers/set_perms.c:130 plugins/sudoers/set_perms.c:453 +#: plugins/sudoers/set_perms.c:854 plugins/sudoers/set_perms.c:1149 +#: plugins/sudoers/set_perms.c:1439 +msgid "perm stack underflow" +msgstr "prekoračitev spodnje meje trajnega sklada" + +#: plugins/sudoers/set_perms.c:189 plugins/sudoers/set_perms.c:500 +#: plugins/sudoers/set_perms.c:1200 plugins/sudoers/set_perms.c:1471 +msgid "unable to change to root gid" +msgstr "številke skupine skrbnika ni mogoče spremeniti" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1277 +msgid "unable to change to runas gid" +msgstr "ni mogoče spremeniti v ID-ja skupine runas" + +#: plugins/sudoers/set_perms.c:290 plugins/sudoers/set_perms.c:609 +#: plugins/sudoers/set_perms.c:993 plugins/sudoers/set_perms.c:1287 +msgid "unable to change to runas uid" +msgstr "ni mogoče spremeniti v ID-ja uporabnika runas" + +#: plugins/sudoers/set_perms.c:308 plugins/sudoers/set_perms.c:627 +#: plugins/sudoers/set_perms.c:1009 plugins/sudoers/set_perms.c:1303 +msgid "unable to change to sudoers gid" +msgstr "ni mogoče spremeniti ID-ja skupine sudoers" + +#: plugins/sudoers/set_perms.c:361 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1055 plugins/sudoers/set_perms.c:1349 +#: plugins/sudoers/set_perms.c:1515 +msgid "too many processes" +msgstr "preveč opravil" + +#: plugins/sudoers/set_perms.c:1583 +msgid "unable to set runas group vector" +msgstr "ni mogoče nastaviti vektorja skupine runas" + +#: plugins/sudoers/sssd.c:256 +#, c-format +msgid "Unable to dlopen %s: %s" +msgstr "ni mogoče uporabiti dlopen %s: %s" + +#: plugins/sudoers/sssd.c:257 +#, c-format +msgid "Unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "Vira SSS ni mogoče zagnati. Ali je SSSD pravilno nameščen?" + +#: plugins/sudoers/sssd.c:263 plugins/sudoers/sssd.c:271 +#: plugins/sudoers/sssd.c:278 plugins/sudoers/sssd.c:285 +#: plugins/sudoers/sssd.c:292 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "simbola \"%s\" ni mogoče najti v %s" + +#: plugins/sudoers/sudo_nss.c:283 +#, c-format +msgid "Matching Defaults entries for %s on this host:\n" +msgstr "Ujemajoči vpisi privzetih vrednosti za %s na tem gostitelju:\n" + +#: plugins/sudoers/sudo_nss.c:296 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas in ukazno določene privzete vrednosti za %s:\n" + +#: plugins/sudoers/sudo_nss.c:309 +#, c-format +msgid "User %s may run the following commands on this host:\n" +msgstr "Na tem gostitelju lahko uporabnik %s zažene naslednje ukaze:\n" + +#: plugins/sudoers/sudo_nss.c:318 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Uporabniku %s ni dovoljeno zagnati sudo na %s.\n" + +#: plugins/sudoers/sudoers.c:159 plugins/sudoers/sudoers.c:193 +#: plugins/sudoers/sudoers.c:673 +msgid "problem with defaults entries" +msgstr "težave z vnosi privzetih vrednosti" + +#: plugins/sudoers/sudoers.c:165 +#, c-format +msgid "no valid sudoers sources found, quitting" +msgstr "najdenih niso bili nobeni veljavni viri sudoers, končanje" + +#: plugins/sudoers/sudoers.c:227 +#, c-format +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers določa, da skrbniku ni dovoljeno uporabiti sudo" + +#: plugins/sudoers/sudoers.c:234 +#, c-format +msgid "you are not permitted to use the -C option" +msgstr "ni vam dovoljeno uporabiti možnosti -C" + +#: plugins/sudoers/sudoers.c:315 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "lastnik časovnega žiga (%s): ni takšnega uporabnika" + +#: plugins/sudoers/sudoers.c:329 +msgid "no tty" +msgstr "brez tty" + +#: plugins/sudoers/sudoers.c:330 +#, c-format +msgid "sorry, you must have a tty to run sudo" +msgstr "za izvajanje sudo morate imeti tty" + +#: plugins/sudoers/sudoers.c:378 +msgid "command in current directory" +msgstr "ukaz v trenutni mapi" + +#: plugins/sudoers/sudoers.c:395 +#, c-format +msgid "sorry, you are not allowed to preserve the environment" +msgstr "nimate dovoljenj za ohranjanje okolja" + +#: plugins/sudoers/sudoers.c:723 plugins/sudoers/timestamp.c:215 +#: plugins/sudoers/timestamp.c:259 plugins/sudoers/timestamp.c:327 +#: plugins/sudoers/visudo.c:310 plugins/sudoers/visudo.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "stanja %s ni mogoče dobiti" + +#: plugins/sudoers/sudoers.c:726 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ni običajna datoteka" + +#: plugins/sudoers/sudoers.c:729 toke.l:842 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s je v lasti ID-ja uporabnika %u, moral bi biti %u" + +#: plugins/sudoers/sudoers.c:733 toke.l:849 +#, c-format +msgid "%s is world writable" +msgstr "v datoteko %s lahko zapisujejo vsi uporabniki" + +#: plugins/sudoers/sudoers.c:736 toke.l:854 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s je v lasti ID-ja skupine %u, moral bi biti %u" + +#: plugins/sudoers/sudoers.c:763 +#, c-format +msgid "only root can use `-c %s'" +msgstr "samo skrbnik lahko uporabi `-c %s'" + +#: plugins/sudoers/sudoers.c:780 plugins/sudoers/sudoers.c:782 +#, c-format +msgid "unknown login class: %s" +msgstr "neznan razred prijave: %s" + +#: plugins/sudoers/sudoers.c:814 +#, c-format +msgid "unable to resolve host %s" +msgstr "ni mogoče razrešiti gostitelja %s" + +#: plugins/sudoers/sudoers.c:866 plugins/sudoers/testsudoers.c:377 +#, c-format +msgid "unknown group: %s" +msgstr "neznana skupina: %s" + +#: plugins/sudoers/sudoreplay.c:292 +#, c-format +msgid "invalid filter option: %s" +msgstr "neveljavna možnost filtra: %s" + +#: plugins/sudoers/sudoreplay.c:305 +#, c-format +msgid "invalid max wait: %s" +msgstr "neveljavna zgornja meja čakanja: %s" + +#: plugins/sudoers/sudoreplay.c:311 +#, c-format +msgid "invalid speed factor: %s" +msgstr "neveljaven dejavnik hitrosti: %s" + +#: plugins/sudoers/sudoreplay.c:314 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s version %s\n" +msgstr "%s različica %s\n" + +#: plugins/sudoers/sudoreplay.c:339 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/časovna uskladitev: %s" + +#: plugins/sudoers/sudoreplay.c:345 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/časovna uskladitev: %s" + +#: plugins/sudoers/sudoreplay.c:363 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "Izpisovanje dnevnika seje sudo: %s\n" + +#: plugins/sudoers/sudoreplay.c:369 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Opozorilo: terminal je premajhen za pravilno izpisovanje dnevnika.\n" + +#: plugins/sudoers/sudoreplay.c:370 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Geometrija dnevnika je %d x %d, medtem ko je geometrija terminala %d x %d." + +#: plugins/sudoers/sudoreplay.c:400 +#, c-format +msgid "unable to set tty to raw mode" +msgstr "ni mogoče nastaviti tty na surov način" + +#: plugins/sudoers/sudoreplay.c:416 +#, c-format +msgid "invalid timing file line: %s" +msgstr "neveljavna vrstica datoteke časovne uskladitve: %s" + +#: plugins/sudoers/sudoreplay.c:499 +#, c-format +msgid "writing to standard output" +msgstr "pisanje na standardni izhod" + +#: plugins/sudoers/sudoreplay.c:528 +#, c-format +msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#: plugins/sudoers/sudoreplay.c:641 plugins/sudoers/sudoreplay.c:666 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "dvoumen izraz \"%s\"" + +#: plugins/sudoers/sudoreplay.c:683 +#, c-format +msgid "too many parenthesized expressions, max %d" +msgstr "preveč izrazov z oklepaji, največje število %d" + +#: plugins/sudoers/sudoreplay.c:694 +#, c-format +msgid "unmatched ')' in expression" +msgstr "v izrazu je neujemajoč ')'" + +#: plugins/sudoers/sudoreplay.c:700 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "naznan iskalni izraz \"%s\"" + +#: plugins/sudoers/sudoreplay.c:714 +#, c-format +msgid "%s requires an argument" +msgstr "%s zahteva argument" + +#: plugins/sudoers/sudoreplay.c:718 +#, c-format +msgid "invalid regular expression: %s" +msgstr "neveljaven logični izraz: %s" + +#: plugins/sudoers/sudoreplay.c:724 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "ni mogoče razčleniti datuma \"%s\"" + +#: plugins/sudoers/sudoreplay.c:737 +#, c-format +msgid "unmatched '(' in expression" +msgstr "v izrazu je neujemajoč '('" + +#: plugins/sudoers/sudoreplay.c:739 +#, c-format +msgid "illegal trailing \"or\"" +msgstr "neveljaven zaključni \"or\"" + +#: plugins/sudoers/sudoreplay.c:741 +#, c-format +msgid "illegal trailing \"!\"" +msgstr "neveljaven zaključni \"!\"" + +#: plugins/sudoers/sudoreplay.c:1058 +#, c-format +msgid "invalid regex: %s" +msgstr "neveljavni logični izraz: %s" + +#: plugins/sudoers/sudoreplay.c:1182 +#, c-format +msgid "usage: %s [-h] [-d directory] [-m max_wait] [-s speed_factor] ID\n" +msgstr "uporaba: %s [-h] [-d mapa] [-m zg_meja_čakanja] [-s faktor_hitrosti] ID\n" + +#: plugins/sudoers/sudoreplay.c:1185 +#, c-format +msgid "usage: %s [-h] [-d directory] -l [search expression]\n" +msgstr "uporaba: %s [-h] [-d mapa] -l [iskalni izraz]\n" + +#: plugins/sudoers/sudoreplay.c:1194 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - ponovno predvajaj dnevnike sej sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1196 +msgid "" +"\n" +"Options:\n" +" -d directory specify directory for session logs\n" +" -f filter specify which I/O type to display\n" +" -h display help message and exit\n" +" -l [expression] list available session IDs that match expression\n" +" -m max_wait max number of seconds to wait between events\n" +" -s speed_factor speed up or slow down output\n" +" -V display version information and exit" +msgstr "" +"\n" +"Možnosti:\n" +" -d mapa določi mapo za dnevnike sej\n" +" -f filter navedi, katera vrsta I/O se naj prikaže \n" +" -h prikaži sporočilo pomoči in končaj\n" +" -l [izraz] navedi razpoložljive ID-je sej, ki se ujemajo z izrazom\n" +" -m zg_meja_čakanja največje število sekund za čakanje med dogodki\n" +" -s faktor_hitrosti pospeši ali upočasni izhod\n" +" -V prikaži podrobnosti o različici in končaj" + +#: plugins/sudoers/testsudoers.c:328 +msgid "\thost unmatched" +msgstr "\tgostitelj se ne ujema" + +#: plugins/sudoers/testsudoers.c:331 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Ukaz je dovoljen" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Ukaz je bil zavrnjen" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Ukaz se ne ujema" + +#: plugins/sudoers/timestamp.c:128 +#, c-format +msgid "timestamp path too long: %s" +msgstr "pot časovnega žiga je predolga : %s" + +#: plugins/sudoers/timestamp.c:202 plugins/sudoers/timestamp.c:246 +#: plugins/sudoers/timestamp.c:291 +#, c-format +msgid "%s owned by uid %u, should be uid %u" +msgstr "%s je v lasti ID-ja uporabnika %u, moral bi biti ID uporabnika %u" + +#: plugins/sudoers/timestamp.c:207 plugins/sudoers/timestamp.c:251 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0700" +msgstr "%s je zapisljiv za ne-lastnika (0%o), moral bi biti način 0700" + +#: plugins/sudoers/timestamp.c:285 +#, c-format +msgid "%s exists but is not a regular file (0%o)" +msgstr "%s obstaja, toda ni običajna datoteka (0%o)" + +#: plugins/sudoers/timestamp.c:297 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0600" +msgstr "%s je zapisljiv za ne-lastnika (0%o), moral bi biti način 0600" + +#: plugins/sudoers/timestamp.c:352 +#, c-format +msgid "timestamp too far in the future: %20.20s" +msgstr "časovni žig je predaleč v prihodnosti: %20.20s" + +#: plugins/sudoers/timestamp.c:406 +#, c-format +msgid "unable to remove %s, will reset to the epoch" +msgstr "%s ni mogoče odstraniti" + +#: plugins/sudoers/timestamp.c:413 +#, c-format +msgid "unable to reset %s to the epoch" +msgstr "%s ni mogoče ponastaviti na epoho" + +#: plugins/sudoers/toke_util.c:221 +#, c-format +msgid "fill_args: buffer overflow" +msgstr "fill_args: prekoračitev medpomnilnika" + +#: plugins/sudoers/visudo.c:180 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s različica slovnice %d\n" + +#: plugins/sudoers/visudo.c:243 plugins/sudoers/visudo.c:533 +#, c-format +msgid "press return to edit %s: " +msgstr "za urejanje %s pritisnite return: " + +#: plugins/sudoers/visudo.c:326 plugins/sudoers/visudo.c:332 +#, c-format +msgid "write error" +msgstr "napaka med pisanjem" + +#: plugins/sudoers/visudo.c:414 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "ni mogoče začeti začasne datoteke (%s), %s nepsremenjeno" + +#: plugins/sudoers/visudo.c:419 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "začasna datoteka brez dolžine (%s), %s nespremenjena" + +#: plugins/sudoers/visudo.c:425 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "urejevalnik (%s) je spodletel, %s nespremenjen" + +#: plugins/sudoers/visudo.c:448 +#, c-format +msgid "%s unchanged" +msgstr "%s nespremenjeno" + +#: plugins/sudoers/visudo.c:477 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "ni mogoče ponovno odpreti začasne datoteke (%s), %s je nespremenjen." + +#: plugins/sudoers/visudo.c:487 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "ni mogoče razčleniti začasne datoteke (%s), neznana napaka" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "notranja napaka, na seznamu ni mogoče najti %s!" + +#: plugins/sudoers/visudo.c:578 plugins/sudoers/visudo.c:587 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "ni mogoče nastaviti (ID uporabnika, ID skupine) od %s do (%u, %u)" + +#: plugins/sudoers/visudo.c:582 plugins/sudoers/visudo.c:592 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "ni mogoče spremeniti načina iz %s na 0%o" + +#: plugins/sudoers/visudo.c:609 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s in %s nista na enakem datotečnem sistemu, uporaba mv za preimenovanje" + +#: plugins/sudoers/visudo.c:623 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "ukaz je spodletel: '%s %s %s', %s nespremenjen" + +#: plugins/sudoers/visudo.c:633 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "napaka med preimenovanjem %s, %s nespremenjen" + +#: plugins/sudoers/visudo.c:695 +msgid "What now? " +msgstr "Kaj pa zdaj? " + +#: plugins/sudoers/visudo.c:709 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Možnosti so:\n" +" (e)ponovno uredi datoteko sudoers\n" +" (x)končaj brez shranjevanja sprememb v datoteko sudoers\n" +" (Q)končaj in shrani spremembe v datoteko sudoers (NEVARNOST!)\n" + +#: plugins/sudoers/visudo.c:757 +#, c-format +msgid "unable to run %s" +msgstr "ni mogoče zagnati %s" + +#: plugins/sudoers/visudo.c:783 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: napačen lastnik (ID uporabnika, ID skupine) moralo bi biti (%u, %u)\n" + +#: plugins/sudoers/visudo.c:790 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: slaba dovoljenja, moral bi biti način 0%o\n" + +#: plugins/sudoers/visudo.c:815 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "razčlenjevanje datoteke %s je spodletelo, neznana napaka" + +#: plugins/sudoers/visudo.c:831 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "napaka razčlenjevanja v %s blizu vrstice %d\n" + +#: plugins/sudoers/visudo.c:834 +#, c-format +msgid "parse error in %s\n" +msgstr "napaka razčlenjevanja v %s\n" + +#: plugins/sudoers/visudo.c:841 plugins/sudoers/visudo.c:846 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: uspešno razčlenjeno\n" + +#: plugins/sudoers/visudo.c:893 +#, c-format +msgid "%s busy, try again later" +msgstr "%s zaseden, poskusite ponovno pozneje" + +#: plugins/sudoers/visudo.c:937 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "določen urejevalnik (%s) se ne konča" + +#: plugins/sudoers/visudo.c:960 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "ni mogoče začeti urejevalnika (%s)" + +#: plugins/sudoers/visudo.c:1008 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "najdenega ni nobenega urejevalnika (pot urejevalnika = %s)" + +#: plugins/sudoers/visudo.c:1100 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "Napaka: kroženje v %s_Alias `%s'" + +#: plugins/sudoers/visudo.c:1101 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "Opozorilo: kroženje v %s_Alias `%s'" + +#: plugins/sudoers/visudo.c:1104 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "Napaka: %s_Alias `%s' sklicevan, toda ne določen" + +#: plugins/sudoers/visudo.c:1105 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "Warning: %s_Alias `%s' sklicevan, toda ne določen" + +#: plugins/sudoers/visudo.c:1240 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "%s: neuporabljen %s_Alias %s" + +#: plugins/sudoers/visudo.c:1302 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - varno uredi datoteko sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1304 +msgid "" +"\n" +"Options:\n" +" -c check-only mode\n" +" -f sudoers specify sudoers file location\n" +" -h display help message and exit\n" +" -q less verbose (quiet) syntax error messages\n" +" -s strict syntax checking\n" +" -V display version information and exit" +msgstr "" +"\n" +"Možnosti:\n" +" -c način samo preverjanja\n" +" -f sudoers določi mesto datoteke sudoers\n" +" -h prikaži sporočilo pomoči in končaj\n" +" -q manj podroben izpis (tih) sporočil skladenjskih napak\n" +" -s strogo preverjanje skladnje\n" +" -V prikaži podrobnosti različice in končaj" + +#: toke.l:815 +msgid "too many levels of includes" +msgstr "preveč stopenj vključitev" diff --git a/plugins/sudoers/po/sr.mo b/plugins/sudoers/po/sr.mo new file mode 100644 index 0000000..a9252ed Binary files /dev/null and b/plugins/sudoers/po/sr.mo differ diff --git a/plugins/sudoers/po/sr.po b/plugins/sudoers/po/sr.po new file mode 100644 index 0000000..5701644 --- /dev/null +++ b/plugins/sudoers/po/sr.po @@ -0,0 +1,3211 @@ +# Serbian translation for sudoers. +# This file is put in the public domain. +# Мирослав Николић , 2014—2020. +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-12-11 08:03+0200\n" +"Last-Translator: Мирослав Николић \n" +"Language-Team: Serbian <(nothing)>\n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "грешка синтаксе" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Лозинка корисника %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[судо] лозинка за корисника %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Лозинка: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** информације БЕЗБЕДНОСТИ за %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Извините, покушајте поново." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "не могу да доделим меморију" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "зборник захтева назив путање" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "вредност за „CWD“ мора почети са /, ~, или *" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "вредност за „CHROOT“ мора почети са /, ~, или *" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "грешка синтаксе, резервисана реч „%s“ је коришћена као назив алијаса" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "неисправна вредност не-пре" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "неисправна вредност не-после" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "вредност временског истека је превелика" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "неисправна вредност временског ограничења" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "унутрашња грешка, прекорачење „%s“" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "не могу да удвостручим стандардни улаз: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "не могу да извршим „%s“: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "не могу да исцепим" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "не могу да исцепим: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "не могу да отворим спојку: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (наредба је настављена) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s постоји али није директоријум (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "не могу да направим директоријум „%s“" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "не могу да променим режим „%s“ на 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "очекивах „JSON_STRING“, добих „%d“" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "недостају наводници у називу" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "очекивах „JSON_OBJECT“, добих „%d“" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "непоклопљена затворена велика заграда" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "неочекиван низ" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "непоклопљена затворена средња заграда" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "неочекивана ниска" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "недостају две тачке након имена" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "неочекивана логичка вредност" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "неочекивани број" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "„%s:%u“ не могу да обрадим „%s“" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: неисправна датотека дневника" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: недостаје поље временске ознаке" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: временска ознака %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: недостаје поље корисника" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: недостаје поље „покрени-као корисник“" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: недостаје поље „покрени-као група“" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "грешка читања датотеке временисања: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "неисправан ред датотеке временисања: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "дневик је већ довршен, не може бити поново покренут" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "не могу поново да покренем дневник" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "не могу да отворим „%s/%s“" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "недостаје У/И датотека дневника „%s/%s“" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: не могу да премотам унапред „%zu“" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "не могу да нађем тачку наставка [%lld, %ld] у „%s/%s“" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "грешка машине стања" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "неисправна „Порука прихвата“" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "грешка обраде „Поруке прихвата“" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "грешка стварања У/И дневника" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "грешка прибележавања догађаја прихвата" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "неисправна „Порука одбијања“" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "грешка обраде „Поруке одбијања“" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "грешка прибележавања догађаја одбијања" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "неисправна „Порука узбуне“" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "грешка обраде „Поруке узбуне“" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "грешка прибележавања догађаја упозорења" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "грешка протокола" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "Грешка писања „Уи_Међумеморије“" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "грешка писања „Промени_величину_прозора“" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "грешка писања „Обуставе_наредбе“" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "непозната врста „Поруке_клијента“" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "порука клијента је превелика" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "не могу да подесим шифрарник ТЛС-а 1.2 на „%s“: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "не могу да подесим шифрарник ТЛС-а 1.3 на „%s“: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "не могу да добавим метод ТЛС сервера: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "Не могу да створим ТЛС контекст: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "не могу да учитам уверење „%s“" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "не могу да учитам комплет ауторитета уверења „%s“" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "не могу да учитам лични кључ „%s“" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "не могу да подесим „diffie-hellman“ параметре: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "не могу да подесим најмање издање протокола на „TLS 1.2“: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "не могу да добавим удаљену ИП адресу" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Не могу да прикачим податке корисника ссл објекту: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "не могу да додам догађај у ред" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "не могу да подесим прикључницу ослушкивања" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s – шаље У/И дневник судоа удаљеном серверу\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Опције:\n" +" -f, --file путања до датотеке подешавања\n" +" -h --help приказује поруку помоћи и излази\n" +" -n, --no-fork не исцепљује, ради у првом плану\n" +" -R, --random-drop процентуалне шансе везе ће одбацити\n" +" -V, --version приказује податке о издању и излази\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Потребно је „Protobuf-C“ издање 1.3 или новије" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "неисправна вредност одбацивања насумичности: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s издање %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "ТЛС није подржано" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: није потпуно квалификована путања" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "„%s:%d“ непоклопљена [: %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "„%s:%d“ неисправан одељак подешавања: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "„%s:%d“ неисправан ред подешавања: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "„%s:%d“ очекиван је назив одељка: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "неисправна вредност за „%s“: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "„%s:%d“ непознат кључ: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "непознато постројење системског дневика „%s“" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "непознат приоритет системског дневика „%s“" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Опције:\n" +" --help приказује поруку помоћи и излази\n" +" -A, --accept шаље само догађај прихвата (не У/И)\n" +" -h, --host домаћин коме се шаљу дневници\n" +" -i, --iolog_id удаљени ИБ У/И дневника који ће се наставити\n" +" -p, --port прикључник за коришћење приликом повезивања са домаћином\n" +" -r, --restart поново покреће претходни пренос У/И дневника\n" +" -R, --reject одбацује наредбу са датим разлогом\n" +" -b, --ca-bundle датотека групе уверења за проверу уверења сервера\n" +" -c, --cert датотека уверења за ТЛС руковање\n" +" -k, --key датотека личног кључа\n" +" -n, --no-verify не потврђује уверење сервера\n" +" -t, --test проверава сервер испитивања шаљући изабрани У/И дневник n пута у паралели\n" +" -V, --version приказује податке о издању и излази\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "не могу да потражим „%s:%s“: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "не могу да добавим ИП адресу сервера" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "не могу да прочитам „%s/%s“: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "порука клијента је превелика: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: међумеморија писања је већ у употреби" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "неочекивани У/И догађај „%d“" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: неочекивано стање „%d“" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "неисправан „Поздрав_сервера“" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "порука грешке је примљена са сервера: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "порука прекида је примљена са сервера: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "не могу да отпакујем „Поруку_сервера“" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: неочекивана вредност врсте_слова „%d“" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "истекло је време читања са сервера" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "прерани крај датотеке" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "порука сервера је превелика: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "истекло је време писања на сервер" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "дошло је до временског истека ТЛС руковања" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "не могу да подесим догађај" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "ТЛС веза није успела: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Не могу да покренем ссл контекст: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Не могу да доделим ссл објекат: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Не могу да прикачим прикључницу ссл објекту: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "мора бити наведена и тачка поновног покретања и ИБ уи_дневника" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "тачка поновног покретања се не може подесити када није послат У/И" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "изађох прерано са стањем „%d“" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "протекло време послато серверу [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "тачка слања примљена са сервера [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Псеудоним „%s“ је већ одређен" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "не могу да добавим време дана" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "не могу да изменим лозинку за „%s“" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "не могу да добавим разред пријаве за корисника „%s“" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "не могу да почнем бсд потврђивање идентитета" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "неисправна врста потврђивање идентитета" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "не могу да покренем БСД потврђивање идентитета" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "ваш налог је истекао" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "доказивање није успело" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "не могу да читам „fwtk“ подешавања" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "не могу да се повежем на сервер потврђивања идентитета" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "изгубио сам везу са сервером потврђивања идентитета" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"грешка сервера потврђивања идентитета:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: не могу да претворим главника у ниску („%s“): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: не могу да обрадим „%s“: %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: не могу да решим оставу пуномоћства: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: не могу да доделим опције: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: не могу да добавим пуномоћства: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: не могу да покренем оставу пуномоћства: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: не могу да сместим пуномоћства у оставу: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: не могу да добавим главника домаћина: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Не могу потврдити ТГТ! Могући напад!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "не могу да покренем ПАМ: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Грешка ПАМ потврђивања идентитета: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "неуспех провере налога, да ли је ваш налог закључан?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Налог или лозинка је истекла, поново поставите лозинку и покушајте поново" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "не могу да изменим истеклу лозинку: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Лозинка је истекла, обратите се администратору система" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Налог је истекао или ПАМ подешавањима недостаје одељак „налог“ за судо, обратите се администратору система" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "грешка управљања ПАМ налогом: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "ви не постојите у бази подтака „%s“" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "нисам успео да покренем АЦЕ АПИ библиотеку" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "не могу да ступим у везу са сервером безбеднног ИБ-а" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "ИБ корисника је закључан за потврђивање идентитета безбедног ИБ-а" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "неисправна дужина корисничког имена за безбедни ИБ" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "неисправна ручка потврђивања идентитета за безбедни ИБ" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "Није успело комуницирање безбедног ИБ-а" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "непозната грешка безбедног ИБ-а" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "неисправна дужина пропусне шифре за безбедни ИБ" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "не могу да покренем СИА сесију" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "неисправни начини потврђивања идентитета" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Неисправни начини потврђивања идентитета су преведени у судоу! Не можете мешати самостално и несамостално потврђивање идентитета." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "нема начина потврђивања идентитета" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Нема начина потврђивања идентитета преведених у судоу! Ако желите да искључите потврђивање идентитета, користите „--disable-authentication“." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Не могу да покренем методе потврђивања идентитета." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Начини потврђивања идентитета:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Не могу да утврдим услов прегледа" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "не могу да предам снимак прегледа" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Верујемо да вам је администратор система објаснио неке ствари.\n" +"Обично се своде на следеће три:\n" +"\n" +" #1) Поштујте приватност других.\n" +" #2) Размислите пре куцања.\n" +" #3) Са великом моћи долази и велика одговорност.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "непознат јиб: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "непознат корисник: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "повећање поретка: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "поредак почетка: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "попуњавање поретка: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s граматика издање %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "неподржан запис улаза „%s“" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "неподржан запис излаза „%s“" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: улазна датотека треба да се разликује од излазне" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "не могу да покренем основне вредности судоерса" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: непозната реч кључа: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "неисправна врста основности: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "неисправна врста потискивања: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "неисправан филтер: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "не могу да отворим „%s“" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "нисам успео да обрадим %s датотеку, непозната грешка" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "грешка обраде у %s близу реда %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "грешка обраде у %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "не могу да пишем у „%s“" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s – претвара међусобно записе датотеке судоерса\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Опције:\n" +" -b, --base=нд основни НД за „sudo LDAP“ пропитивања\n" +" -c, --config=дат_под путања до датотеке подешавања\n" +" -d, --defaults=врсте_осн претвара само основности наведених врста\n" +" -e, --expand-aliases шири алијасе приликом претварања\n" +" -f, --output-format=запис поставља запис излаза: „JSON“, „LDIF“ или „sudoers“\n" +" -i, --input-format=запис поставља запис улаза: „LDIF“ или „sudoers“\n" +" -I, --increment=бр. износ за повећање сваког „sudoOrder“-а\n" +" -h, --help приказује поруку помоћи и излази\n" +" -m, --match=филтер претвара само уносе који одговарају филтеру\n" +" -M, --match-local упоређује филтерско коришћење базе података лозинке и групе\n" +" -o, --output=дат_изл пише претворене судоерсе у датотеку_излаза\n" +" -O, --order-start=бр. почетна тачка за првог „sudoOrder“-а\n" +" -p, --prune-matches избацује неодговарајуће кориснике, групе и домаћине\n" +" -P, --padding=бр. попуњавање осниове за „sudoOrder“ повећање\n" +" -s, --suppress=одељци потискује излаз неких одељака\n" +" -V, --version приказује податке о издању и излази" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "непознат унос основности „%s“" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "не могу да добавим ГМТ време" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "не могу да обликујем временску ознаку" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "превише уноса судоерса, највише %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "променљива „SUDOERS_BASE“ окружења није постављена и „-b“ опција није наведена." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Помоћник сисдневника ако је сисдневник коришћен за пријављивање: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Приоритет системског дневника за коришћење када корисник успешно потврди идентитет: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Приоритет системског дневника за коришћење када корисник неуспешно потврди идентитет: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Поставља ОТП упит на свом реду" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Занемарује . у $ПУТАЊИ" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Увек шаље пошту када је судо покренут" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Пошаљи поруку ако потврђивање идентитета корисника не успе" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Пошаљи поруку ако корисник није у судоерсу" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Пошаљи поруку ако корисник није у судоерсу за овог домаћина" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Пошаљи поруку ако кориснику није дозвољено да покрене наредбу" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Пошаљи поруку ако корисник покуша да покрене наредбу" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Користи одвојене временске ознаке за сваку комбинацију корисник/конзола" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Подучава корисника када први пут покрену судо" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Датотека садржи судо обучавања: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Захтева да корисници потврде идентитет по основи" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Администратор може да покрене судо" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Бележи назив домаћина у (не-сисдневник) датотеци дневника" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Бележи годину у (не-сисдневник) датотеци дневника" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Ако је судо призван без аргумената, покреће шкољку" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Подешава $HOME на крајњег корисника када покреће шкољку са „-s“" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Увек подешава $HOME на циљни лични директоријум корисника" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Дозвољава прикупљање неких података да би дао корисне поруке грешака" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Захтева потпуно одређене називе домаћина у датотеци судоерса" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Вређа корисника када унесе нетачну лозинку" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Дозвољава кориснику да покрене судо само ако има конзолу" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Висудо ће поштовати променљиву окружења УРЕЂИВАЧА" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Тражи администраторову лозинку, а не корисника" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Тражи корисникову лозинку покреникао_основни, а не корисника" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Тражи корисникову лозинку мете, а не корисника" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Примењује основности у циљни кориснички разред пријављивања ако постоји" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Подешава променљиве окружења НАЗИВДНЕВНИКА и КОРИСНИК" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Подешава само ефективни јиб на крајњег корисника, а не стваран јиб" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Не покреће вектор групе ка оном крајњег корисника" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Дужина за преламање редова у датотеци дневника (0 — без преламања): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Време истека временске ознаке потврђивања идентитета: %.1f минута" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Време истека упита лозинке: %.1f минута" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Број покушаја за уношење лозинке: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Умаска за коришћење или 0777 за коришћење корисника: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Путања до датотеке дневника: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Путања до програма поште: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Опције за програм поште: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Адреса на коју послати поруку: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Адреса са које послати поруку: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Ред теме за поруке поште: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Порука нетачне лозинке: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Путања до директоријума стања обучавања: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Путања до директоријума временске ознаке потврђивања идентитета: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Власник директоријума временске ознаке потврђивања идентитета: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Корисницима у овој групи се не захтева лозинка и ПУТАЊА: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Основни упит лозинке: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Ако је подешено, упит лозинке ће преписати системски упит у свим случајевима." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Основни корисник за покретање наредби као: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Вредност за преписивање корисничке $ПУТАЊЕ са: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Путања до уређивача кога ће да користи висудо: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Када да затражи лозинку за псеудонаредбу „list“: %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Када да затражи лозинку за псеудонаредбу „verify“: %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Унапред учитава „sudo_noexec“ библиотеку која мења функцију извршавања" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Ако је ЛДАП директоријум изнет, да ли занемарујемо месну датотеку судоерса" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Описници датотека >= %d ће бити затворени пре извршавања наредбе" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Ако је подешено, корисници могу да препишу вредност „closefrom“ са опцијом „-C“" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Дозвољава корисницима да подесе произвољне променљиве окружења" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Враћа окружење на основни скуп променљивих" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Променљиве окружења за проверу исправности:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Променљиве окружења за уклањање:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Променљиве окружења за очување:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "СЕЛинукс улога за употребу у новом контексту безбедности: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "СЕЛинукс врста за употребу у новом контексту безбедности: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Путања до судо-посебне датотеке окружења: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Путања до ограничене судо-посебне датотеке окружења: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Језк за коришћење при обради судоерса: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Дозвољава да судо тражи лозинку чак и ако би била видљива" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Обезбеђује видну повратну поруку при тражењу лозинке када постоји унос корисника" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Користи брже упоређивање које је мање тачно али не приступа систему датотека" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Умаска наведена у судоерсима ће преписати корисникову, чак и ако има већа овлашћења" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Бележи корисников улаз за покренуту наредбу" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Бележи излаз покренуте наредбе" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Пакује У/И дневнике користећи злиб" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Увек покреће наредбе у привидној конзоли" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Прикључак за подршку не-Јуникс групе: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Директоријум за смештај улазних/излазних дневника: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Датотека за смештај улазно/излазног дневника: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Додаје унос у датотеку „utmp/utmpx“ када додељује „pty“" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Подешава корисника у „utmp“-у на корисника покрени-као, не призивајући корисника" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Скуп допуштених повластица: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Скуп повластица ограничења: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Покреће наредбе у позадини на назовитерминалу" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Назив ПАМ услуге за коришћење: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Назив ПАМ услуге за шкољке пријављивања: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Покушава да успостави ПАМ пуномоћства за циљног корисника" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Прави нову ПАМ сесију за покретање наредбе" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Обавља управљање провером ПАМ налога" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Највећи број низа У/И дневника: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Укључује подршку нетгрупе судоерса" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Проверава родитељски директоријум за уписивошћу када уређује датотеке са „sudoedit“" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Прати симболичке везе када уређује датотеке са „sudoedit“" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Пропитује прикључак групе за непознатим групама система" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Упоређује мрежне групе на основу читавог слога: корисник, домаћин и домен" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Допушта покретање наредби чак и ако судо не може да пише у дневник прегледа" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Допушта покретање наредби чак и ако судо не може да пише у дневник У/И" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Допушта покретање наредби чак и ако судо не може да пише у датотеку дневника" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Решава групе у судоерсима и упоређује ИД групе, а не назив" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Уноси дневника већи од ове вредности биће подељени на више порука системског дневника: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Корисник који ће поседовати датотеке дневника У/И: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Група која ће поседовати датотеке дневника У/И: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Режим датотеке за коришћење за датотеке дневника У/И: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Извршава наредбе описником датотеке уместо путањом: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Занемарује непознате уносе основности у судоерсу уместо да даје упозорење" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Време у секундама након ког ће наредба бити окончана: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Допушта кориснику да наведе време на линији наредби" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Пребацује У/И податке дневника на диск одмах уместо да га смешта у међумеморију" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Укључује ИБ процеса приликом пријављивања путем дневника система" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Врста временске ознаке потврђивања идентитета: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Потврђивање идентитета није успело: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Занемарује величину слова приликом поклапања назива корисника" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Занемарује величину слова приликом поклапања назива групе" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Пише дневник када судоерси дозвољавају наредбу" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Пише дневник када судоерси не дозвољавају наредбу" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Судо сервер(и) дневника за повезивање са изборним прикључником" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Време истека судо сервера дневника у секундама: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Укључује „SO_KEEPALIVE“ опцију прикључнице са повезаном прикључницом са сервером дневника" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Путања до датотеке групних издавача уверења сервера испитивања: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Путања до датотеке уверења судоерса: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Путања до датотеке датотеке личног кључа судоерса: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Потврђује да је исправно уверење дневника сервера" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Допушта коришћење непознатог „runas“ корисника и/или ИБ-а групе" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Допушта покретање наредби као корисник само са исправном шкољком" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Поставља пам удаљеног корисника на корисника покретача судо-а" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Поставља пам удаљеног домаћина на назив локалног домаћина" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Радни директоријум за прелазак пре извршавања наредбе: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Корени директоријум за прелазак пре извршавања наредбе: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "Формат резултирајућих дневника: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: непознат унос основности „%s“" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: непознат унос основности „%s“" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: није наведена вредност за „%s“" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: није наведена вредност за „%s“" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: опција „%s“ не узима вредност" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: опција „%s“ не узима вредност" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: неисправна врста основности 0x%x за опцију „%s“" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: неисправна врста основности 0x%x за опцију „%s“" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: вредност „%s“ је неисправна за опцију „%s“" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: вредност „%s“ је неисправна за опцију „%s“" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: вредност за „%s“ мора да почиње са /, ~ или *" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: вредност за „%s“ мора да почиње са /, ~ или *" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: вредност за „%s“ мора да почиње са /" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: вредност за „%s“ мора да почиње /" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: оштећено стави окружење, дужине не одговарају" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "не могу поново да изградим окружење" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "извините, није вам дозвољено да подесите следеће променљиве окружења: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "грешка обраде у %s близу реда %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "грешка обраде у %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "неподржана врста прихватања потврђивања иднтитета „%d“ за „%s“" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: грешка читања" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "„%s“ мора бити у власништву јиб-а %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "Само корисник може да пише у „%s“" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "не могу да учитам %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "не могу да нађем симбол „group_plugin“ у „%s“" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: несагласно веће издање прикључка групе %d, очекивано је %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "не могу да обрадим ИП адресу „%s“" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "не могу да обрадим мрежну маску „%s“" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Месна ИП адреса и парови мрежне маске:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "непозната група: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "не могу да освежим датотеку низа" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "не могу да пишем у датотеку дневника У/И: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "не могу да направим „%s/%s“" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: унутрашња грешка, датотека У/И дневника за догађај %d није отворена" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "не могу да прочитам сат" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: унутрашња грешка, неисправан сигнал %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "старттлс није подржано када се користи лдапс" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "не могу да покренем ССЛ уверење и бп кључа: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "морате да подесите „TLS_CERT“ у „%s“ да користите ССЛ" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "не могу да покренем ЛДАП: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "„start_tls“ је наведено али ЛДАП библиотеке не подржавају „ldap_start_tls_s()“ или „ldap_start_tls_s_np()“" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "неисправна особина „sudoOrder“: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: прикључник је превелик" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "неподржана врста ЛДАП путање: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "не могу да помешам лдап и лдапс путање" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "не могу да претворим „sudoOption“: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "не могу да отворим систем прегледа" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "не могу да пошаљем поруку прегледа" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "грешка у петљи догађаја" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Стварање новог „SSL_CTX“ објекта није успело: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "ТЛС повезивање са „%s:%s“ није успело: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "ТЛС покретање беше безуспешно" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "ТЛС руковање беше безуспешно" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: унутрашња грешка, неисправно излазно стање %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "изгубих везу са сервером дневника" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "недостаје међумеморија писања" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "не могу да се повежем на сервер дневника" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "корисник НИЈЕ у судоерсу" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "корисник НИЈЕ овлашћен на домаћину" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "наредба није допуштена" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "„%s“ се не налази у датотеци судоерса. О овом инциденту ће бити поднет извештај.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "„%s“ нема права да покрене судо над „%s“. О овом инциденту ће бити поднет извештај.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Извините, корисник %s не може покренути судо на %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Извините, кориснику %s није дозвољено да изврши „%s%s%s“ као %s%s%s на %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: нема такве наредбе" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"занемарујем „%s“ пронађено у „.“\n" +"Користите „sudo ./%s“ ако је то „%s“ које желите да покренете." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u покушај нетачне лозинке" +msgstr[1] "%u покушаја нетачне лозинке" +msgstr[2] "%u покушаја нетачне лозинке" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "потврђивање идентитета није успело" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "потребна је лозинка" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "не могу да отворим датотеку дневника: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "не могу да запишем датотеку дневника: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "приказ за %s (%s) није у %s облику" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"ЛДАП улога: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Унос судоерса:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " „Покрени-као“ корисници: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " „Покрени-као“ групе: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Опције: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Наредбе:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Упоређује уносе основности за „%s“ на %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Покрени-као и Наредбено-посебне основности за „%s“:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Корисник „%s“ може да покреће следеће наредбе на %s:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Корисник „%s“ нема права да покрене судо над „%s“.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "занемарујем непотпуно „sudoRole“: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "неисправна особина „LDIF“: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "судо челник је поставио неисправну „%.*s“" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "не могу да обрадим списак адреса мреже" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "судо челник није поставио име корисника" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "судо челник није поставио ИБ корисника" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "судо челник није поставио ИБ групе" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "судо челник није поставио назив домаћина" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "неисправан радни директоријум: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "неисправан „chroot“ директоријум: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "не могу да извршим „%s“" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Издање %s прикључка политике судоерса\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Граматика датотеке судоерса издање %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Путања судоерса: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "путања нс-прекидача: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "путања лдап.подешавања: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "путања лдап.тајне: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "немогу да региструјем прикачку врсте „%d“ (издање %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "не могу да сместим у оставу јиб „%u“" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "не могу да сместим у оставу јиб „%u“, већ постоји" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "не могу да сместим у оставу корисника „%s“" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "не могу да сместим у оставу корисника „%s“, већ постоји" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "не могу да сместим у оставу гиб „%u“" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "не могу да сместим у оставу гиб „%u“, већ постоји" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "не могу да сместим у оставу групу „%s“" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "не могу да сместим у оставу групу „%s“, већ постоји" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "не могу да сместим у оставу списак групе за „%s“, већ постоји" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "не могу да сместим у оставу списак групе за „%s“" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "не могу да обрадим групе за „%s“" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "не могу да обрадим гид-ове за „%s“" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "стално прекорачење спремника" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "стално поткорачење спремника" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "не могу да пређем на гиб администратора" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "не могу да пређем на гиб покреникао" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "не могу да подесим вектор „покрени-као група“" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "не могу да пређем на јиб покреникао" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "не могу да пређем на гиб судоерса" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "превише процеса" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "не могу да добавим тренутни радни директоријум" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "корисничка_наредба скраћене путање прегледа: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "„argv[0]“ скраћене путање прегледа: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "не могу да покренем ССС извор. Да ли је СССД инсталиран на вашем рачунару?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "не могу да нађем симбол „%s“ у „%s“" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "неприлике са основним уносима" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "нисам пронашао исправне изворе судоерса, прекидам" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "кориснику није дозвољено да промени корени директоријум у „%s“" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "није вам допуштено да користите опцију „-R“ са „%s“" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "кориснику није дозвољено да промени директоријум у „%s“" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "није вам допуштено да користите опцију „-D“ са „%s“" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "судоерси наводе да администратор није дозвољен у судоу" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "кориснику није дозвољено да препише „closefrom“ ограничење" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "није вам допуштено да користите опцију „-C“" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "власник временске ознаке (%s): нема таквог корисника" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "нема конзоле" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "извините, морате имати конзолу да покренете судо" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "неисправна шкољка за корисника „%s“: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "наредба у текућем директоријуму" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "кориснику није дозвољено да подеси време истека наредбе" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "извините, није вам дозвољено да подесите време истека наредбе" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "кориснику није дозвољено да сачува окружење" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "извините, није вам дозвољено да сачувате окружење" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "наредба је предуга" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "„sudoedit“ не треба да се покреће путем „sudo“-а" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "не могу да прочитам „%s“" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "не могу да добијем податке о „%s“" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "„%s“ није обична датотека" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s је у власништву уиб-а %u, а треба бити %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "Сви могу да пишу у „%s“" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s је у власништву уиб-а %u, а треба бити %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "само администратор може да користи „-c %s“" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "непознат разред пријављивања: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "не могу да решим домаћина „%s“" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "неисправна опција пропусника: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "неисправно најдуже чекање: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "неисправан чинилац брзине: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/временисање: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Понављам сесију судоа: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "не могу да подесим конзолу на сирови режим" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Упозорење: ваш терминал је премали да би исправно приказао дневник.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Геометрија дневника је %d x %d, а геометрија терминала је %d x %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Одговор је завршен, притисните неки тастер да повратите терминал." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "нејасан израз „%s“" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "непоклопљена ) у изразу" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "непознат појам претраге „%s“" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "„%s“ захтева аргумент" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "неисправан регуларан израз: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "не могу да обрадим датум „%s“" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "непоклопљена ( у изразу" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "недозвољено пратеће „или“" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "недозвољени пратећи „!“" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "непозната врста претраге „%d“" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "употреба: %s [-hnRS] [-d дир] [-m број] [-s број] ИБ\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "употреба: %s [-h] [-d дир] -l [израз претраге]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s — понавља дневнике сесије судоа\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Опције:\n" +" -d, --directory=дир наводи директоријум за дневнике сесије\n" +" -f, --filter=пропусник наводи У/И врсту(е) за приказивање\n" +" -h, --help приказује поруку помоћи и излази\n" +" -l, --list исписује доступне ИБ-ове сесије, са изборним изразом\n" +" -m, --max-wait=број највећи број секунди за чекање између догађаја\n" +" -n, --non-interactive без упита, сесија се шаље на стандардни излаз\n" +" -R, --no-resize не покушава да промени величину терминала\n" +" -S, --suspend-wait чека док се не обустави наредба\n" +" -s, --speed=број убрзава или успорава излаз\n" +" -V, --version приказује податке о издању и излази" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\tдомаћин није поклопљен" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Наредба је допуштена" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Наредба је одбијена" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Наредба није поклопљена" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "Група може да пише у „%s“" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "не могу да скратим датотеку временске ознаке на %lld бајта" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "занемарујем временску ознаку из будућности" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "временска ознака је превише у будућности: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "не могу да закључам датотеку временске ознаке „%s“" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "путања стања обучавања је предуга: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "„sudoedit“ не треба да се наводи са путањом" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "опција „-x“ биће уклоњена у наредном издању" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "размотрите коришћење помагала „cvtsudoers“" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "притисните „унеси“ да уредите „%s“: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "наведени уређивач (%s) не постоји" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "нисам пронашао уређивача (путања уређивача = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "грешка писања" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "не могу да добавим податке привремене датотеке (%s), %s је неизмењено" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "привремена датотека нулте дужине (%s), %s је неизмењено" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "уређивач (%s) није успео, %s је неизмењено" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "„%s“ је неизмењено" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "не могу поново да отворим привремену датотеку (%s), %s је неизмењено." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "не могу да обрадим привремену датотеку (%s), непозната грешка" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "унутрашња грешка, не могу да пронађем „%s“ на списку!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "не могу да подесим (јиб, гиб) за %s на (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "„%s“ и „%s“ нису на истом систему датотека, користим „mv“ за преименовање" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "наредба није успела: „%s %s %s“, %s је неизмењено" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "грешка преименовања „%s“, %s је неизмењено" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Шта сада? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Опције су:\n" +" e — опет уређује датотеку судоерса\n" +" x — излази без чувања измена у датотеци судоерса\n" +" Q — прекида и чува измене у датотеци судоерса (ОПАСНО!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "не могу да покренем %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: погрешан власник (јиб, гиб) треба бити (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: лоша овлашћења, требају бити у режиму 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: успешно је обрађено\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "„%s“ је заузет, покушајте касније" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "не могу да закључам „%s“" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Да ипак уреим? [д/Н]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Грешка: %s:%d:%d: циклус у „%s“ „%s“" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Упозорење: %s:%d:%d: циклус у „%s“ „%s“" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Грешка: %s:%d:%d: упута за „%s“ „%s“ постоји али није одређена" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Упозорење: %s:%d:%d: упута за „%s“ „%s“ постоји али није одређена" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Упозорење: %s:%d:%d: некоришћено „%s“ „%s“" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s — безбедно уређује датотеку судоерса\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Опције:\n" +" -c, --check режим само провере\n" +" -f, --file=судоерс наводи место датотеке судоерса\n" +" -h, --help приказује поруку помоћи и излази\n" +" -q, --quiet мање опширне (тихе) поруке грешке синтаксе\n" +" -s, --strict строга провера синтаксе\n" +" -V, --version приказује податке о издању и излази\n" + +#: toke.l:179 +msgid "empty string" +msgstr "празна ниска" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "празна група" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "празна мрежна група" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "неисправан наставак реда" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "неисправна ИПв6 адреса" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "неочекивани прекид реда у нисци" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "превише нивоа укључивања" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "Унапред учитава лажне функције извршавања које се налазе у библиотеци „sudo_noexec“" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports: прикључник је превелик" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "не могу да закључам датотеку дневника: %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "„SSL_повезивање“ није успело: ssl_грешка=%d, спремник=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "датотека групних издавача уверења није наведена" + +#~ msgid "Client certificate was not specified" +#~ msgstr "Уверење клијента није наведено" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "Не могу да доделим ссл објекат: %s\n" + +#~ msgid "Unable to attach socket to the ssl object: %s\n" +#~ msgstr "Не могу да прикачим прикључницу ссл објекту: %s\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "порука клијента је превелика: %zu\n" + +#~ msgid "server message too large: %u\n" +#~ msgstr "порука сервера је превелика: %u\n" + +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "Датотека групних издавача уверења није постављена у судоерсу" + +#~ msgid "Calling SSL_CTX_load_verify_locations() failed: %s" +#~ msgstr "Позивање „SSL_CTX_load_verify_locations()“ није успело: %s" + +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "Потписана датотека уверења није постављена у судоерсу" + +#~ msgid "Unable to load private key into the ssl context: %s" +#~ msgstr "Не могу да учитам лични кључ у ссл контекст: %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s" +#~ msgstr "„SSL_повезивање“ није успело: ssl_грешка=%d, спремник=%s" + +#~ msgid "SSL_read failed: ssl_error=%d, stack=%s" +#~ msgstr "„SSL_читање“ није успело: ssl_грешка=%d, спремник=%s" + +#~ msgid "SSL_write failed: ssl_error=%d, stack=%s" +#~ msgstr "„SSL_писање“ није успело: ssl_грешка=%d, спремник=%s" + +#~ msgid "unknown address family: %d" +#~ msgstr "непозната породица адресе: %d" + +#~ msgid "audit_failure message too long" +#~ msgstr "порука неуспеха прегледа је предуга" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "ЛДАП улога: НЕПОЗНАТО\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Поредак: %s\n" + +#~ msgid "No user or host" +#~ msgstr "Нема корисника или домаћина" + +#~ msgid "validation failure" +#~ msgstr "неуспех потврђивања" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "не могу да сместим у оставу корисника „%s“, нема више меморије" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "не могу да сместим у оставу групу „%s“, нема више меморије" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "не могу да сместим у оставу списак групе за „%s“, нема више меморије" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "СССД улога: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "СССД улога: НЕПОЗНАТО\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Упозорење: циклус у „%s“ „%s“" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Упозорење: упута за „%s“ „%s“ постоји али није одређена" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Упозорење: некоришћено „%s“ „%s“" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "путања временске ознаке је предуга: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "не могу да добавим податке уређивача (%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: нестаде простора проширујући међумеморију домаћина" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: нестаде простора изграђујући међумеморију домаћина" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "не поклапа се додела „sudo_ldap_build_pass1“" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "унутрашња грешка: недовољно простора за ред дневника" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: прекорачење међумеморије" diff --git a/plugins/sudoers/po/sudoers.pot b/plugins/sudoers/po/sudoers.pot new file mode 100644 index 0000000..e63b49b --- /dev/null +++ b/plugins/sudoers/po/sudoers.pot @@ -0,0 +1,3025 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# Todd C. Miller , 2011-2018 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.9.5\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2021-01-09 12:59-0700\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: confstr.sh:1 gram.y:1075 +msgid "syntax error" +msgstr "" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "" + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "" + +#: confstr.sh:4 +msgid "Password: " +msgstr "" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "" + +#: gram.y:224 gram.y:290 gram.y:297 gram.y:304 gram.y:311 gram.y:318 gram.y:338 +#: gram.y:362 gram.y:369 gram.y:376 gram.y:383 gram.y:390 gram.y:459 gram.y:468 +#: gram.y:479 gram.y:514 gram.y:521 gram.y:528 gram.y:535 gram.y:562 gram.y:658 +#: gram.y:665 gram.y:674 gram.y:683 gram.y:700 gram.y:838 gram.y:845 gram.y:853 +#: gram.y:859 gram.y:967 gram.y:974 gram.y:981 gram.y:988 gram.y:995 +#: gram.y:1021 gram.y:1028 gram.y:1035 gram.y:1123 gram.y:1244 gram.y:1534 +#: lib/eventlog/eventlog.c:288 lib/eventlog/eventlog.c:360 +#: lib/eventlog/eventlog.c:761 lib/eventlog/eventlog.c:825 +#: lib/eventlog/eventlog.c:1070 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:305 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_util.c:106 lib/iolog/iolog_util.c:115 +#: lib/iolog/iolog_util.c:125 lib/iolog/iolog_util.c:133 +#: lib/iolog/iolog_util.c:137 lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/audit.c:115 plugins/sudoers/audit.c:265 +#: plugins/sudoers/auth/bsdauth.c:143 plugins/sudoers/auth/kerb5.c:118 +#: plugins/sudoers/auth/kerb5.c:144 plugins/sudoers/auth/pam.c:669 +#: plugins/sudoers/auth/rfc1938.c:111 plugins/sudoers/auth/sia.c:59 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:160 +#: plugins/sudoers/cvtsudoers.c:177 plugins/sudoers/cvtsudoers.c:188 +#: plugins/sudoers/cvtsudoers.c:300 plugins/sudoers/cvtsudoers.c:428 +#: plugins/sudoers/cvtsudoers.c:561 plugins/sudoers/cvtsudoers.c:578 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:764 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:76 plugins/sudoers/cvtsudoers_ldif.c:151 +#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:235 +#: plugins/sudoers/cvtsudoers_ldif.c:300 plugins/sudoers/cvtsudoers_ldif.c:371 +#: plugins/sudoers/cvtsudoers_ldif.c:421 plugins/sudoers/cvtsudoers_ldif.c:429 +#: plugins/sudoers/cvtsudoers_ldif.c:440 plugins/sudoers/cvtsudoers_ldif.c:447 +#: plugins/sudoers/cvtsudoers_ldif.c:460 plugins/sudoers/cvtsudoers_ldif.c:468 +#: plugins/sudoers/cvtsudoers_ldif.c:615 plugins/sudoers/defaults.c:634 +#: plugins/sudoers/defaults.c:927 plugins/sudoers/defaults.c:1102 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:133 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:678 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:326 +#: plugins/sudoers/ldap_util.c:333 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:381 plugins/sudoers/log_client.c:686 +#: plugins/sudoers/log_client.c:704 plugins/sudoers/log_client.c:1413 +#: plugins/sudoers/log_client.c:1626 plugins/sudoers/log_client.c:1951 +#: plugins/sudoers/log_client.c:2008 plugins/sudoers/logging.c:100 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:426 +#: plugins/sudoers/logging.c:446 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:277 plugins/sudoers/match_command.c:445 +#: plugins/sudoers/match_command.c:495 plugins/sudoers/match_command.c:569 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:213 plugins/sudoers/parse.c:230 +#: plugins/sudoers/parse.c:244 plugins/sudoers/parse.c:264 +#: plugins/sudoers/parse.c:275 plugins/sudoers/parse_ldif.c:153 +#: plugins/sudoers/parse_ldif.c:184 plugins/sudoers/parse_ldif.c:253 +#: plugins/sudoers/parse_ldif.c:260 plugins/sudoers/parse_ldif.c:265 +#: plugins/sudoers/parse_ldif.c:341 plugins/sudoers/parse_ldif.c:352 +#: plugins/sudoers/parse_ldif.c:379 plugins/sudoers/parse_ldif.c:396 +#: plugins/sudoers/parse_ldif.c:408 plugins/sudoers/parse_ldif.c:412 +#: plugins/sudoers/parse_ldif.c:426 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:624 plugins/sudoers/parse_ldif.c:649 +#: plugins/sudoers/parse_ldif.c:707 plugins/sudoers/parse_ldif.c:724 +#: plugins/sudoers/parse_ldif.c:752 plugins/sudoers/parse_ldif.c:759 +#: plugins/sudoers/policy.c:526 plugins/sudoers/policy.c:874 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:194 +#: plugins/sudoers/pwutil.c:265 plugins/sudoers/pwutil.c:343 +#: plugins/sudoers/pwutil.c:517 plugins/sudoers/pwutil.c:581 +#: plugins/sudoers/pwutil.c:652 plugins/sudoers/pwutil.c:811 +#: plugins/sudoers/pwutil.c:867 plugins/sudoers/pwutil.c:911 +#: plugins/sudoers/pwutil.c:968 plugins/sudoers/sssd.c:145 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:298 +#: plugins/sudoers/sudoers.c:324 plugins/sudoers/sudoers.c:368 +#: plugins/sudoers/sudoers.c:379 plugins/sudoers/sudoers.c:389 +#: plugins/sudoers/sudoers.c:431 plugins/sudoers/sudoers.c:792 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:422 plugins/sudoers/timestamp.c:466 +#: plugins/sudoers/timestamp.c:967 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:129 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:916 +#: toke.l:1036 toke.l:1094 +msgid "unable to allocate memory" +msgstr "" + +#: gram.y:556 +msgid "a digest requires a path name" +msgstr "" + +#: gram.y:585 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "" + +#: gram.y:597 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "" + +#: gram.y:719 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "" + +#: gram.y:739 +msgid "invalid notbefore value" +msgstr "" + +#: gram.y:747 +msgid "invalid notafter value" +msgstr "" + +#: gram.y:756 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "" + +#: gram.y:758 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "" + +#: gram.y:1077 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "" + +#: gram.y:1121 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "" + +#: gram.y:1534 lib/eventlog/eventlog.c:288 lib/eventlog/eventlog.c:761 +#: lib/eventlog/eventlog.c:823 lib/eventlog/eventlog.c:824 +#: lib/eventlog/eventlog.c:1070 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1290 logsrvd/logsrvd.c:1303 +#: logsrvd/logsrvd.c:1348 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:265 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:634 +#: plugins/sudoers/defaults.c:927 plugins/sudoers/defaults.c:1102 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:86 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:686 plugins/sudoers/log_client.c:704 +#: plugins/sudoers/log_client.c:1413 plugins/sudoers/log_client.c:1626 +#: plugins/sudoers/log_client.c:1951 plugins/sudoers/log_client.c:2008 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:276 plugins/sudoers/match_command.c:444 +#: plugins/sudoers/match_command.c:494 plugins/sudoers/match_command.c:569 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:298 +#: plugins/sudoers/sudoers.c:324 plugins/sudoers/sudoers.c:368 +#: plugins/sudoers/sudoers.c:379 plugins/sudoers/sudoers.c:389 +#: plugins/sudoers/sudoers.c:431 plugins/sudoers/sudoers.c:792 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:422 plugins/sudoers/timestamp.c:466 +#: plugins/sudoers/timestamp.c:967 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:916 +#: toke.l:1036 toke.l:1094 +#, c-format +msgid "%s: %s" +msgstr "" + +#: lib/eventlog/eventlog.c:293 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:92 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "" + +#: lib/eventlog/eventlog.c:351 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: lib/eventlog/eventlog.c:396 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: lib/eventlog/eventlog.c:436 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "" + +#: lib/eventlog/eventlog.c:444 lib/eventlog/eventlog.c:498 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: lib/eventlog/eventlog.c:488 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: lib/eventlog/eventlog.c:902 +#, c-format +msgid "%8s : %s" +msgstr "" + +#: lib/eventlog/eventlog.c:931 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "" + +#: logsrvd/logsrvd.c:294 logsrvd/logsrvd.c:357 logsrvd/logsrvd.c:398 +#: logsrvd/logsrvd.c:453 logsrvd/logsrvd.c:521 logsrvd/logsrvd.c:572 +#: logsrvd/logsrvd.c:604 logsrvd/logsrvd.c:636 +msgid "state machine error" +msgstr "" + +#: logsrvd/logsrvd.c:303 +msgid "invalid AcceptMessage" +msgstr "" + +#: logsrvd/logsrvd.c:311 +msgid "error parsing AcceptMessage" +msgstr "" + +#: logsrvd/logsrvd.c:318 +msgid "error creating I/O log" +msgstr "" + +#: logsrvd/logsrvd.c:325 +msgid "error logging accept event" +msgstr "" + +#: logsrvd/logsrvd.c:366 +msgid "invalid RejectMessage" +msgstr "" + +#: logsrvd/logsrvd.c:374 +msgid "error parsing RejectMessage" +msgstr "" + +#: logsrvd/logsrvd.c:380 +msgid "error logging reject event" +msgstr "" + +#: logsrvd/logsrvd.c:490 +msgid "invalid AlertMessage" +msgstr "" + +#: logsrvd/logsrvd.c:498 +msgid "error parsing AlertMessage" +msgstr "" + +#: logsrvd/logsrvd.c:506 +msgid "error logging alert event" +msgstr "" + +#: logsrvd/logsrvd.c:527 logsrvd/logsrvd.c:578 logsrvd/logsrvd.c:610 +msgid "protocol error" +msgstr "" + +#: logsrvd/logsrvd.c:537 +msgid "error writing IoBuffer" +msgstr "" + +#: logsrvd/logsrvd.c:589 +msgid "error writing ChangeWindowSize" +msgstr "" + +#: logsrvd/logsrvd.c:621 +msgid "error writing CommandSuspend" +msgstr "" + +#: logsrvd/logsrvd.c:706 +msgid "unrecognized ClientMessage type" +msgstr "" + +#: logsrvd/logsrvd.c:977 +msgid "client message too large" +msgstr "" + +#: logsrvd/logsrvd.c:1207 logsrvd/logsrvd.c:1215 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "" + +#: logsrvd/logsrvd.c:1235 logsrvd/logsrvd.c:1243 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "" + +#: logsrvd/logsrvd.c:1279 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "" + +#: logsrvd/logsrvd.c:1284 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "" + +#: logsrvd/logsrvd.c:1291 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "" + +#: logsrvd/logsrvd.c:1304 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "" + +#: logsrvd/logsrvd.c:1349 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "" + +#: logsrvd/logsrvd.c:1366 logsrvd/logsrvd.c:1375 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "" + +#: logsrvd/logsrvd.c:1388 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "" + +#: logsrvd/logsrvd.c:1573 +msgid "unable to get remote IP addr" +msgstr "" + +#: logsrvd/logsrvd.c:1601 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "" + +#: logsrvd/logsrvd.c:1609 logsrvd/logsrvd.c:1731 logsrvd/logsrvd.c:1833 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:585 plugins/sudoers/log_client.c:592 +#: plugins/sudoers/log_client.c:1109 plugins/sudoers/log_client.c:1382 +#: plugins/sudoers/log_client.c:1423 plugins/sudoers/log_client.c:1431 +#: plugins/sudoers/log_client.c:1582 plugins/sudoers/log_client.c:1698 +#: plugins/sudoers/log_client.c:2016 plugins/sudoers/log_client.c:2024 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "" + +#: logsrvd/logsrvd.c:1785 logsrvd/logsrvd.c:2027 +msgid "unable setup listen socket" +msgstr "" + +#: logsrvd/logsrvd.c:1933 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" + +#: logsrvd/logsrvd.c:1936 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" + +#: logsrvd/logsrvd.c:1988 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "" + +#: logsrvd/logsrvd.c:2006 +#, c-format +msgid "invalid random drop value: %s" +msgstr "" + +#: logsrvd/logsrvd.c:2010 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:410 logsrvd/logsrvd_conf.c:655 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "" + +#: logsrvd/logsrvd_conf.c:769 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:780 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:788 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:794 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:808 +#, c-format +msgid "invalid value for %s: %s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:816 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:1005 +#, c-format +msgid "unknown syslog facility %s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:1009 logsrvd/logsrvd_conf.c:1013 +#: logsrvd/logsrvd_conf.c:1017 +#, c-format +msgid "unknown syslog priority %s" +msgstr "" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert " +"against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n " +"times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:692 +#, c-format +msgid "client message too large: %zu" +msgstr "" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1124 plugins/sudoers/log_client.c:1392 +#: plugins/sudoers/log_client.c:1460 plugins/sudoers/log_client.c:1496 +#, c-format +msgid "%s: unexpected state %d" +msgstr "" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1466 +msgid "invalid ServerHello" +msgstr "" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1540 +#, c-format +msgid "error message received from server: %s" +msgstr "" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1553 +#, c-format +msgid "abort message received from server: %s" +msgstr "" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1572 +msgid "unable to unpack ServerMessage" +msgstr "" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1603 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1760 +#, c-format +msgid "server message too large: %u" +msgstr "" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "" + +#: plugins/sudoers/audit.c:261 plugins/sudoers/audit.c:400 +#: plugins/sudoers/log_client.c:960 plugins/sudoers/log_client.c:1008 +#: plugins/sudoers/log_client.c:1056 plugins/sudoers/log_client.c:1181 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:369 +msgid "" +"Account expired or PAM config lacks an \"account\" section for sudo, contact " +"your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "" +"Invalid authentication methods compiled into sudo! You may not mix " +"standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "" +"There are no authentication methods compiled into sudo! If you want to turn " +"off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "" + +#: plugins/sudoers/check.c:264 +#, c-format +msgid "error reading lecture file %s" +msgstr "" + +#: plugins/sudoers/check.c:270 +#, c-format +msgid "ignoring lecture file %s: not a regular file" +msgstr "" + +#: plugins/sudoers/check.c:274 plugins/sudoers/cvtsudoers.c:617 +#: plugins/sudoers/cvtsudoers.c:634 plugins/sudoers/cvtsudoers.c:1244 +#: plugins/sudoers/cvtsudoers_json.c:872 plugins/sudoers/cvtsudoers_ldif.c:688 +#: plugins/sudoers/sudoers.c:1053 plugins/sudoers/sudoreplay.c:1435 +#: plugins/sudoers/timestamp.c:431 plugins/sudoers/tsdump.c:128 +#: plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: plugins/sudoers/check.c:283 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" + +#: plugins/sudoers/check.c:325 plugins/sudoers/check.c:335 +#: plugins/sudoers/sudoers.c:835 plugins/sudoers/sudoers.c:856 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "" + +#: plugins/sudoers/check.c:330 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1091 +#: plugins/sudoers/sudoers.c:438 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:315 plugins/sudoers/timestamp.c:318 +#, c-format +msgid "unable to write to %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "" +"the SUDOERS_BASE environment variable is not set and the -b option was not " +"specified." +msgstr "" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:286 +msgid "" +"If set, users may override the value of \"closefrom\" with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:338 +msgid "" +"Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:342 +msgid "" +"The umask specified in sudoers will override the user's, even if it is more " +"permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/def_data.c:422 +msgid "" +"Check parent directories for writability when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "" +"Log entries larger than this value will be split into multiple syslog " +"messages: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:474 +msgid "" +"Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:526 +msgid "" +"Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:574 +msgid "Enable SELinux RBAC support" +msgstr "" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "" + +#: plugins/sudoers/defaults.c:1038 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:1053 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1135 +msgid "unable to rebuild the environment" +msgstr "" + +#: plugins/sudoers/env.c:1209 +#, c-format +msgid "" +"sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:443 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:836 +#: plugins/sudoers/timestamp.c:928 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1199 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:1697 +msgid "" +"start_tls specified but LDAP libs do not support ldap_start_tls_s() or " +"ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:58 plugins/sudoers/linux_audit.c:60 +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:103 +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1437 plugins/sudoers/log_client.c:2032 +msgid "error in event loop" +msgstr "" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "" + +#: plugins/sudoers/log_client.c:1208 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "" + +#: plugins/sudoers/log_client.c:1723 plugins/sudoers/log_client.c:1747 +msgid "lost connection to log server" +msgstr "" + +#: plugins/sudoers/log_client.c:1824 +msgid "missing write buffer" +msgstr "" + +#: plugins/sudoers/log_client.c:1973 +msgid "unable to connect to log server" +msgstr "" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:581 +#: plugins/sudoers/sudoers.c:583 plugins/sudoers/sudoers.c:585 +#: plugins/sudoers/sudoers.c:587 plugins/sudoers/sudoers.c:737 +#: plugins/sudoers/sudoers.c:739 +#, c-format +msgid "%s: command not found" +msgstr "" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:577 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "" + +#: plugins/sudoers/logging.c:739 +#, c-format +msgid "unable to open log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:772 +#, c-format +msgid "unable to write log file: %s" +msgstr "" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr "" + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "" + +#: plugins/sudoers/policy.c:1114 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:1116 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:1125 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:1126 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:1159 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:290 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:317 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:318 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:349 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:409 +msgid "user not allowed to override closefrom limit" +msgstr "" + +#: plugins/sudoers/sudoers.c:410 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:470 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:485 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:486 +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:493 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:576 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:595 +msgid "user not allowed to set a command timeout" +msgstr "" + +#: plugins/sudoers/sudoers.c:597 +msgid "sorry, you are not allowed set a command timeout" +msgstr "" + +#: plugins/sudoers/sudoers.c:605 +msgid "user not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:607 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1115 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1120 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1123 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional " +"expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:326 plugins/sudoers/timestamp.c:661 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:847 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:870 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:992 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:1036 plugins/sudoers/timestamp.c:1056 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" + +#: toke.l:182 +msgid "empty string" +msgstr "" + +#: toke.l:192 toke.l:494 +msgid "empty group" +msgstr "" + +#: toke.l:200 toke.l:492 +msgid "empty netgroup" +msgstr "" + +#: toke.l:296 toke.l:308 toke.l:320 toke.l:336 toke.l:355 toke.l:395 +msgid "invalid line continuation" +msgstr "" + +#: toke.l:531 toke.l:543 +msgid "invalid IPv6 address" +msgstr "" + +#: toke.l:767 +msgid "unexpected line break in string" +msgstr "" + +#: toke.l:1087 +msgid "too many levels of includes" +msgstr "" diff --git a/plugins/sudoers/po/sv.mo b/plugins/sudoers/po/sv.mo new file mode 100644 index 0000000..a412301 Binary files /dev/null and b/plugins/sudoers/po/sv.mo differ diff --git a/plugins/sudoers/po/sv.po b/plugins/sudoers/po/sv.po new file mode 100644 index 0000000..4943e88 --- /dev/null +++ b/plugins/sudoers/po/sv.po @@ -0,0 +1,3285 @@ +# Swedish translation for sudoers. +# Copyright © 2012, 2016, 2017, 2018, 2019, 2020 Free Software Foundation, Inc. +# This file is put in the public domain. +# Daniel Nylander , 2012. +# Sebastian Rasmussen , 2016, 2017, 2018, 2019, 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-12-26 03:34+0100\n" +"Last-Translator: Sebastian Rasmussen \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.2\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "syntaxfel" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "lösenord för %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] lösenord för %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Lösenord: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SÄKERHETSINFORMATION för %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Försök igen." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "kan inte allokera minne" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "en kontrollsumma kräver ett sökvägsnamn" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "värden för ”CWD” måste börja med ett ”/”, ”~” eller ”*”" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "värden för ”CHROOT” måste börja med ett ”/”, ”~” eller ”*”" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "syntaxfel, reserverat ord %s använt som ett aliasnamn" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "ogiltigt notbefore-värde" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "ogiltigt notafter-värde" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "tidsgränsvärde för stort" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "ogiltigt värde för tidsgräns" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "internt fel, %s spill" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "kan inte duplicera stdin: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "kan inte köra %s: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "kan inte grena process" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "kan inte grena process: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "kan inte öppna rör: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (kommando fortsätter) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s finns men är inte en katalog (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "kan inte skapa katalogen %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "kan inte ändra läge för %s till 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "förväntade JSON_STRING, fick %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "saknar citationstecken i namn" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "förväntade JSON_OBJECT, fick %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "omatchad avslutningsklammerparentes" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "oväntat array" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "omatchad avslutningsklammer" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "oväntad sträng" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "saknar kolon efter namn" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "oväntad boolean" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "oväntat nummer" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u kan inte tolka ”%s”" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ogiltig loggfil" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: tidsstämpelfält saknas" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: tidsstämpel %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: användarfältet saknas" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: runas-användarfältet saknas" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: runas-gruppfältet saknas" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "fel vid inläsning av tidsmätningsfil: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "ogiltig rad i tidsmätningsfil: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "logg är redan komplett, kan inte startas om" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "kan inte starta om logg" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "kan inte öppna %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "saknar I/O-loggfil %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: kan inte söka framåt %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "kan inte hitta omstartspunkt [%lld, %ld] i %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "fel i tillståndsmaskin" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "ogiltigt AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "fel vid tolkning av AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "fel vid skapande av I/O-logg" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "fel vid loggning av acceptanshändelse" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "ogiltigt RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "fel vid tolkning av RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "fel vid loggning av avböjningshändelse" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "ogiltigt AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "fel vid tolkning av AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "fel vid loggning av alarmhändelse" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "protokollfel" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "fel vid skrivning av IoBuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "fel vid skrivning av ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "fel vid skrivning av CommandSuspend" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "okänd ClientMessage-typ" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "klientmeddelande för stort" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "kan inte ställa in TLS 1.2-krypteringssvit till %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "kan inte ställa in TLS 1.3-krypteringssvit till %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "kan inte hämta TLS-servermetod: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "kan inte skapa TLS-kontext: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "kan inte läsa in certifikat %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "kan inte läsa in certifikatauktoritetsbunt %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "kan inte läsa in privat nyckel %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "kunde inte sätta diffie-hellman-parametrar: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "kunde inte sätta minsta protokollversion till TLS 1.2: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "kan inte hämta fjärr-IP-adress" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Kan inte fästa användardata på ssl-objektet: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "kan inte lägga till händelse till kö" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "kan inte ställa in lyssningsuttag" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - skicka sudo I/O-logg till fjärrserver\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Flaggor:\n" +" -f, --file sökväg till konfigurationsfil\n" +" -h --help visa hjälptext och avslutan\n" +" -n, --no-fork grena inte, kör i förgrunden\n" +" -R, --random-drop antal procents chans att anslutningar bryts\n" +" -V, --version visa versionsinformation och avsluta\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Protobuf-C version 1.3 eller högre krävs" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "ogiltigt slumpmässigt avbrottsvärde: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s version %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "TLS stöds inte" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: inte fullständigt kvalificerad sökväg" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d omatchad ”[”: %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d ogiltigt konfigurationsavsnitt: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d ogiltig konfigurationsrad: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d avsnittsnamn förväntades: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "ogiltigt värde för %s: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d okänd nyckel: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "okänd syslog-funktionalitet: %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "okänd syslog-prioritet: %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Flaggor:\n" +" --help visa hjälpmeddelande och avsluta\n" +" -A, --accept skicka endast en accepteringshändelse (ingen I/O)\n" +" -h, --host värd att skicka loggar till\n" +" -i, --iolog_id fjärr-ID för I/O-logg som ska återupptas\n" +" -p, --port port att använda vid anslutning till värd\n" +" -r, --restart start om förgående överföring av I/O-logg\n" +" -R, --reject avböj kommandot med angiven anledning\n" +" -b, --ca-bundle certifikatbuntfil att verifiera serverns certifikat mot\n" +" -c, --cert certifikatfil för TLS-handskakning\n" +" -k, --key privat nyckelfil\n" +" -n, --no-verify verifiera inter servercertifikat\n" +" -t, --test testa granskningsserver genom att skicka valda I/O-loggmeddelanden parallellt n gånger\n" +" -V, --version visa versionsinformation och avsluta\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "kan inte slå upp %s:%s: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "kan inte hämta server-IP-adress" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "kan inte läsa %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "klientmeddelande för stort: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: skrivbuffert används redan" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "oväntad I/O-händelse %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: oväntat tillstånd %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "ogiltigt ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "felmeddelande mottaget från server: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "avbrottsmeddelande mottaget från server: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "kan inte packa upp ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: oväntat type_case-värde %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "tidsgräns passerad vid läsning från server" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "oväntad EOF" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "servermeddelande för långt: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "tidsgräns passerad vid skrivning till server" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "Tidsgräns för TLS-handskakning uppnådd" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "kan inte ställa in händelse" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "TLS-anslutning misslyckades: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Kan inte initiera ssl-kontext: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Kan inte allokera ssl-objekt: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Kan inte fästa kontakt på ssl-objektet: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "både omstartspunkt och iolog-ID måste anges" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "en omstartspunkt får inte sättas när ingen I/O skickas" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "avslutade oväntat i tillstånd %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "förfluten tid skickad till server [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "incheckningspunkt mottagen från server [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Aliaset ”%s” är redan definierat" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "kan inte hämta tid på dagen" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "kan inte ändra lösenord för %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kan inte hämta inloggningsklass för användaren %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "kan inte påbörja bsd-autentisering" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "ogiltig autentiseringstyp" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "kan inte initiera BSD-autentisering" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "ditt konto har gått ut" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "godkännande misslyckades" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "kan inte läsa fwtk-konfiguration" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "kan inte ansluta till autentiseringsservern" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "förlorade kontakten med autentiseringsservern" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"fel i autentiseringsservern:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: kan inte konvertera principal till sträng (”%s”): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: kan inte tolka ”%s”: %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: kan inte slå upp inloggningsuppgiftscache: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: kan inte allokera flaggor: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: kan inte hämta inloggningsuppgifter: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: kan inte initiera inloggningsuppgiftscache: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: kan inte lagra inloggningsuppgifter i cache: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: kan inte hämta principal för värd: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Kan inte verifiera TGT! Möjlig attack!: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "kan inte initiera PAM: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM-autentiseringsfel: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "kontovalidering misslyckades. Är ditt konto låst?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Kontot eller lösenordet har gått ut. Återställ ditt lösenord och försök igen" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "kan inte ändra utgånget lösenord: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Lösenordet har gått ut. Kontakta din systemadministratör" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Konto utgånget eller så saknar PAM-konfigurationen ett ”account”-avsnitt för sudo, kontakta din systemadministratör" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Fel vid hantering av PAM-konto: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "du finns inte i %s-databasen" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "misslyckades med att initiera ACE API-biblioteket" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "kan inte kontakta SecurID-servern" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "Användar-ID låst för SecurID-autentisering" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "ogiltig längd för användarnamn för SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "ogiltigt autentiseringshandtag för SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "SecurID-kommunikation misslyckades" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "okänt SecurID-fel" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "ogiltig lösenordslängd för SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "kan inte initiera SIA-session" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "ogiltiga autentiseringsmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Ogiltiga autentiseringsmetoder inkompilerade i sudo! Du får inte blanda fristående och icke-fristående autentisering." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "inga autentiseringsmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Det finns inga autentiseringsmetoder inbyggda i sudo! Om du vill inaktivera autentisering, använd konfigurationsflaggan --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Kan inte initiera autentiseringsmetoder." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Autentiseringsmetoder:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Kunde inte fastställa granskningsvillkor" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "kan inte bekräfta granskningsberättelse" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Vi litar på att du har fått den vanliga lektionen från den lokala system-\n" +"administratören. Den kan vanligtvis reduceras till dessa tre saker:\n" +"\n" +" #1) Respektera andras integritet.\n" +" #2) Tänk innan du skriver.\n" +" #3) Med stor makt kommer ett stort ansvar.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "okänt uid: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "okänd användare: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "ordningsinkrement: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "startordning: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "ordningsutfyllnad: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s grammatikversion %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "inmatningsformat %s stöds inte" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "utmatningsformat %s stöds inte" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: in- och utmatningsfiler måste vara olika" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "kan inte initiera sudoers standardvärden" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: okänt nyckelord: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "ogiltig standardtyp: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "ogiltig undertryckningstyp: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "ogiltigt filter: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "kan inte öppna %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "misslyckades med att tolka %s-filen, okänt fel" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "tolkningsfel i %s nära rad %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "tolkningsfel i %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "kan inte skriva till %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konvertera mellan sudoers filformat\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Flaggor:\n" +" -b, --base=dn DN-bas för sudo LDAP-förfrågningar\n" +" -c, --config=konffil sökvägen till konfigurationsfilen\n" +" -d, --defaults=stdtyper konvertera endast Standard av de angivna typerna\n" +" -e, --expand-aliases expandera alias under konvertering\n" +" -f, --output-format=format ställ in utmatningsformat: JSON, LDIF eller sudoers\n" +" -i, --input-format=format ställ in inmatningsformat: LDIF eller sudoers\n" +" -I, --increment=ant antal att öka varje sudoOrder med\n" +" -h, --help visa hjälpmeddelande och avsluta\n" +" -m, --match=filter konvertera endast poster som matchar filtret\n" +" -M, --match-local filtermatchning använder passwd och gruppdatabaser\n" +" -o, --output=utmatningsfil skriv konverterad sudoers till utmatningsfil\n" +" -O, --order-start=ant startpunkt för första sudoOrder\n" +" -p, --prune-matches skala bort användare, grupper och värdar som inte matchar\n" +" -P, --padding=num basutfyllnad för sudoOrder-inkrement\n" +" -s, --suppress=avsnitt undertryck utmatning av vissa avsnitt\n" +" -V, --version visa versionsinformation och avsluta" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "okänd standardpost ”%s”" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "kan inte hämta GMT-tid" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "kan inte formatera tidsstämpel" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "för många sudoers-poster, maximalt %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "miljövariabeln SUDOERS_BASE är inte satt och flaggan -b angavs inte." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-facilitet om syslog används för loggning: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioritet att använda när användaren lyckas med autentisering: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioritet att använda när användaren misslyckas med autentisering: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Lägg OTP-prompt på en egen rad" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ignorera ”.” i $PATH" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Skicka alltid e-post när sudo körs" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Skicka e-post om användarens autentisering misslyckas" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Skicka e-post om användaren inte finns med i sudoers" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Skicka e-post om användaren inte finns med i sudoers för denna värddator" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Skicka e-post om användaren inte tillåts att köra ett kommando" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Skicka e-post om användaren försöker köra ett kommando" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Använd en separat tidsstämpel för varje användar-/tty-kombination" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Lär upp användaren första gången de kör sudo" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fil som innehåller sudo-lektion: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Kräv att användare autentiseras som standard" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Root får köra sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Logga värdnamnet i (den icke syslog-baserade) loggfilen" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Logga året i (den icke syslog-baserade) loggfilen" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Om sudo startas utan argument, starta ett skal" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Ställ in $HOME till målanvändaren när ett skal startas med -s" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Ställ alltid in $HOME till målanvändarens hemkatalog" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Tillåt viss informationsinsamling för att ge meningsfulla felmeddelanden" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Kräv fullständiga värdnamn i sudoers-filen" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Förolämpa användaren när de anger ett felaktigt lösenord" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Tillåt bara användare att köra sudo om de har en tty" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo kommer att respektera miljövariabeln EDITOR" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Fråga efter root-lösenordet, inte användarens" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Fråga efter runas_default-användarens lösenord, inte användarens" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Fråga efter målanvändarens lösenord, inte användarens" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Tillämpa standardvärden i målanvändarens inloggningsklass om det finns en" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Ställ in miljövariablerna LOGNAME och USER" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Sätt bara det effektiva uid:t till målanvändaren, inte till det riktiga uid:t" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Initiera inte gruppvektorn till den från målanvändaren" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Längden vid vilken långa loggfilsrader radbryts (0 för att inte radbryta): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Tidsgräns för autentiseringstidsstämpel: %.1f minuter" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Tidsgräns för lösenordsprompt: %.1f minuter" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Antal försök att ange ett lösenord: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask att använda eller 0777 för att använda användarens: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Sökväg till loggfil: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Sökväg till e-postprogram: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Flaggor för e-postprogram: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adress att skicka e-post till: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adress att skicka e-post från: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Ämnesrad för e-postmeddelanden: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Meddelande vid felaktigt lösenord: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Sökväg till lektionsstatuskatalog: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Sökväg till katalog för autentiseringstidsstämplar: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Ägare av katalogen för autentiseringstidsstämplar: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Användare i denna grupp är undantagna från lösenords- och SÖKVÄGs-kraven: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standard lösenordsprompt: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Om inställt kommer passprompt att åsidosätta systemprompten i varje fall." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standardanvändaren att köra kommandon som: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Värde att åsidosätta användarens $PATH med: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Sökväg till textredigerare för användning av visudo: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "När ett lösenord ska krävas för pseudokommandot ”list”: %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "När lösenord ska krävas för pseudokommandot ”verify”: %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Förinläs sudo_noexec-biblioteket vilket ersätter exec-funktionerna" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Om LDAP-registret är uppe, ignorerar vi den lokala sudoers-filen" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Fildeskriptorer >= %d kommer att stängas innan ett kommando körs" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Om inställt kan användare åsidosätta värdet ”closefrom” med flaggan -C" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Låt användare ställa in godtyckliga miljövariabler" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Återställ miljön till standarduppsättningen av variabler" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Miljövariabler att säkerhetskontrollera:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Miljövariabler att ta bort:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Miljövariabler att behålla:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux-roll att använda i den nya säkerhetskontexten: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux-typ att använda i den nya säkerhetskontexten: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Sökväg till den sudo-specifika miljöfilen: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Sökväg till den begränsade sudo-specifika miljöfilen: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Lokalanpassning att använda vid tolkning av sudoers: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Tillåt sudo att fråga efter ett lösenord även om det skulle vara synligt" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Ge visuell återkoppling vid lösenordsprompten när det finns användarinmatad data" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Använd snabbare matchning som är mindre exakt men inte använder filsystemet" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Umasken angiven i sudoers kommer att åsidosätta användarens, även om den är mer tillåtande" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Logga användarens inmatning för kommandot som körs" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Logga utmatningen för kommandot som körs" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Komprimera I/O-loggar med hjälp av zlib" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Kör alltid kommandon i en pseudo-tty" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Insticksmodul för stöd för icke-Unix-grupper: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Katalog i vilken in-/utmatningsloggar lagras: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fil i vilken in-/utmatningsloggar lagras: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Lägg till en post till utmp/utmpx-filen när en pty allokeras" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Sätt användaren i utmp till runas-användaren, inte användaren som anropar" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Uppsättning tillåtna rättigheter: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Uppsättning av begränsningsrättigheter: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Kör kommandon i en pty i bakgrunden" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "PAM-tjänstnamn att använda: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-tjänstnamn att använda för inloggningsskal: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Försök att etablera PAM-inloggningsuppgifter för målanvändaren" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Skapa en ny PAM-session för kommandot att köra i" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Utför valideringshantering av PAM-konto" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Största sekvensnummer i I/O-logg: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Aktivera sudoers nätgruppsstöd" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontrollera överordnade kataloger för skrivbarhet när filer redigeras med sudoedit" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Följ symboliska länkar när filer redigeras med sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Fråga gruppinsticksmodulen efter okända systemgrupper" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Matcha nätgrupper baserat på hela tupeln: användare, värd och domän" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Tillåt kommandon att köras även om sudo inte kan skriva till granskningsloggen" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Tillåt kommandon att köras även om sudo inte kan skriva I/O-loggen" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Tillåt kommandon att köras även om sudo inte kan skriva till loggfilen" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Gör namnupplösning för grupper i sudoers och matcha efter grupp-ID, inte namnet" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Loggposter större än detta värde kommer att delas upp i flera syslog-meddelanden: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Användare som kommer att äga I/O-loggfilerna: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupp som kommer att äga I/O-loggfilerna: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Filrättigheter att använda för I/O-loggfilerna: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Kör kommandon efter fildeskriptor istället för efter sökväg: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Hoppa över okända Defaults-poster i sudoers istället för att skriva ut en varning" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tid i sekunder efter vilka kommandot kommer att avslutas: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Tillåt användaren att ange en tidsgräns på kommandoraden" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Spola ut I/O-loggdata till disk omedelbart istället för att buffra det" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Inkludera process-ID:t vid loggning via syslog" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Typ av post för autentiseringstidsstämplar: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Autentiseringsfelsmeddelande: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Matcha användarnamn skiftlägesokänsligt" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Matcha gruppnamn skiftlägesokänsligt" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Logga när ett kommando tillåts av sudoers" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Logga när ett kommando nekas av sudoers" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Sudo-loggservrar att ansluta till med valfri port" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Tidsgräns för sudo-loggserver i sekunder: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Aktivera SO_KEEPALIVE-kontaktalternativ på kontakten ansluten till loggservern" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Sökväg till granskningsserverns CA-buntfil: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Sökväg till sudoers certifikatfil: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Sökväg till sudoers privata nyckelfil: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Verifiera att loggserverns certifikatfil är giltig" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Tillåt användningen av okänd runas-användare och/eller grupp-ID" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Tillåt endast körning av kommandon som en användare med ett giltigt skal" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Ställ in pam-fjärranvändaren för användaren som kör sudo" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Ställ in pam-fjärrvärden till det lokala värdnamnet" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Arbetskatalog att ändra till före körning av kommandot: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Rotkatalog att ändra till innan kommandot körs: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "Formatet för loggarna som ska produceras: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: okänd standardpost ”%s”" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: okänd standardpost ”%s”" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: inget värde angivet för ”%s”" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: inget värde angivet för ”%s”" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: flaggan ”%s” tar inte emot något värde" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: flaggan ”%s” tar inte emot något värde" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: ogiltig standardtyp 0x%x för flagga ”%s”" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: ogiltig standardtyp 0x%x för flagga ”%s”" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: värdet ”%s” är ogiltigt för flaggan ”%s”" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: värdet ”%s” är ogiltigt för flaggan ”%s”" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: värden för ”%s” måste börja med ett ”/”, ”~” eller ”*”" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: värden för ”%s” måste börja med ett ”/”, ”~” eller ”*”" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: värden för ”%s” måste börja med ett ”/”" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: värden för ”%s” måste börja med ett ”/”" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: trasig envp, längd stämmer inte" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "kan inte återuppbygga miljön" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "du får inte lov att ställa in följande miljövariabler: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "tolkningsfel i %s nära rad %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "tolkningsfel i %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "typ %d av kontrollsumma stöds inte för %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: läsfel" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s måste ägas av uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s får endast vara skrivbar av ägaren" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "kan inte läsa in %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "kan inte hitta symbolen ”group_plugin” i %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: inkompatibel gruppinsticksmodul huvudversion %d, förväntade %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "kan inte tolka IP-adress ”%s”" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "kan inte tolka nätmask ”%s”" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Lokala IP-adress- och nätmaskpar:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "okänd grupp: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "kan inte uppdatera sekvensfil" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "kan inte skriva till I/O-loggfil: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "kan inte skapa %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: internt fel, I/O-loggfil för händelse %d inte öppen" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "kan inte läsa klockan" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: internt fel, ogiltig signal %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "starttls stöds inte när ldaps används" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "kan inte initiera SSL-certifikat och nyckeldatabas: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "du måste ställa in TLS_CERT i %s för att använda SSL" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "kan inte initiera LDAP: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls angivet men LDAP-bibliotek har inte stöd för ldap_start_tls_s() eller ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "ogiltigt sudoOrder-attribut: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: port för stor" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "LDAP-uri-typ stöds ej: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "kan inte blanda ldap- och ldaps-URI:er" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "kan inte konvertera sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "kan inte öppna granskningssystem" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "kan inte skicka granskningsmeddelande" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "fel i händelseloop" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Skapande av nytt SSL_CTX-objekt misslyckades: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "TLS-anslutning till %s:%s misslyckades: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "TLS-initiering misslyckades" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "TLS-handskakning misslyckades" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: internt fel, ogiltig avslutningskod %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "förlorade kontakten med loggservern" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "saknar skrivbuffert" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "kan inte ansluta till loggserver" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "användare finns INTE i sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "användaren är INTE auktoriserad på värddatorn" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "kommandot tillåts inte" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s finns inte i filen sudoers. Denna incident kommer att rapporteras.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s tillåts inte att köra sudo på %s. Denna incident kommer att rapporteras.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Tyvärr, användaren %s får inte köra sudo på %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Tyvärr, användaren %s tillåts inte att köra ”%s%s%s” som %s%s%s på %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: kommandot hittades inte" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignorerar ”%s” som hittades i ”.”\n" +"Använd ”sudo ./%s” om detta är den ”%s” som du vill köra." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u felaktigt lösenordsförsök" +msgstr[1] "%u felaktiga lösenordsförsök" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "autentiseringsfel" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "ett lösenord krävs" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "kan inte öppna loggfil: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "kan inte skriva till loggfil: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "kontrollsumma för %s (%s) är inte på %s-form" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-roll: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-post:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " KörSomAnvändare: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " KörSomGrupper: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Flaggor: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Kommandon:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Matchande standardposter för %s på %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas- och kommando-specifika standardvärden för %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Användare %s får köra följande kommandon på %s:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Användaren %s tillåts inte att köra sudo på %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "hoppar över ofullständig sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "ogiltigt LDIF-attribut: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "ogiltigt %.*s inställt av sudo-framände" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "kan inte tolka nätverksadresslista" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "användarnamn inte inställt av sudo-framände" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "användar-ID inte inställt av sudo-framände" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "grupp-ID inte inställt av sudo-framände" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "värdnamn inte inställt av sudo-framände" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "ogiltig arbetskatalog: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "ogiltig chroot-katalog: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "kan inte köra %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers policyinsticksmodul version %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers-filgrammatik version %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sökväg till sudoers: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "Sökväg till nsswitch: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "Sökväg till ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "Sökväg till ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "kan inte registrera krok av typ %d (version %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "kan inte cacha uid %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "kan inte cacha uid %u, finns redan" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "kan inte cacha användare %s" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "kan inte cacha användare %s, finns redan" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "kan inte cacha gid %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "kan inte cacha gid %u, finns redan" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "kan inte cacha grupp %s" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "kan inte cacha grupp %s, finns redan" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "kan inte cacha grupplista för %s, finns redan" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "kan inte cacha grupplista för %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "kan inte tolka grupper för %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "kan inte tolka gids för %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "perm-stackspill" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "perm-stackunderspill" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "kan inte ändra till root-gid" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "kan inte ändra till runas-gid" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "kan inte ställa in gruppvektor för runas" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "kan inte ändra till runas-uid" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "kan inte ändra till sudoers-gid" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "för många processer" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "kan inte hämta aktuell arbetskatalog" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "trunkerad granskningssökväg user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "trunkerad granskningssökväg argv[0]: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "kan inte initiera SSS-källa. Är SSSD installerat på din maskin?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "kan inte hitta symbol ”%s” i %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "problem med standardposter" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "inga giltiga sudoers-källor hittades, avslutar" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "användare inte tillåten att ändra rotkatalog till %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "du tillåts inte att använda flaggan -R med %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "användare inte tillåten att ändra katalog till %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "du tillåts inte att använda flaggan -D med %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers anger att root inte tillåts att använda sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "användare inte tillåten att åsidosätta closefrom-begränsning" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "du tillåts inte att använda flaggan -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "tidsstämpelägare (%s): Det finns ingen sådan användare" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "ingen tty" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "tyvärr, du måste ha en tty för att köra sudo" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "ogiltigt skal för användare %s: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "kommando i aktuell katalog" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "användare inte tillåten att ställa in en tidsgräns för kommandon" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "tyvärr, du tillåts inte att ställa in en tidsgräns för kommandon" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "användare inte tillåten att behålla miljön" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "tyvärr, du tillåts inte att behålla miljövariabler" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "kommandot för långt" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit behöver inte köras via sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "kan inte läsa %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "kan inte ta status på %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s är inte en vanlig fil" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s ägs av uid %u, ska vara %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s är skrivbar för alla" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s ägs av gid %u, ska vara %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "endast root kan använda ”-c %s”" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "okänd inloggningsklass: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "kan inte slå upp värddatorn %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "ogiltig filterflagga: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "ogiltig största väntan: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "ogiltig hastighetsfaktor: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/tidsmätning: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Spelar upp sudo-session: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "kan inte ställa in tty i råläge" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Varning: din terminal är för liten för att korrekt spela upp loggen.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Logg-geometri är %d x %d, din terminals geometri är %d x %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Uppspelning avslutad, tryck på en tangent för att återställa terminalen." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "tvetydigt uttryck ”%s”" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "omatchat ”)” i uttryck" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "okänt sökvillkor ”%s”" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s kräver ett argument" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "ogiltigt reguljärt uttryck: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "kunde inte tolka datumet ”%s”" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "omatchat ”(” i uttryck" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "ogiltigt avslutande ”or”" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "ogiltigt efterföljande ”!”" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "okänd söktyp %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "användning: %s [-hnRS] [-d kat] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "användning: %s [-h] [-d kat] -l [sökuttryck]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - spela upp loggar från sudo-session\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Flaggor:\n" +" -d, --directory=kat ange katalog för sessionsloggar\n" +" -f, --filter=filter ange vilka I/O-typer som ska visas\n" +" -h, --help visa hjälptext och avsluta\n" +" -l, --list lista tillgängliga sessions-ID:n, med valfritt uttryck\n" +" -m, --max-wait=num största antal sekunder att vänta mellan händelser\n" +" -n, --non-interactive inga frågor, sessionen skickas till standard ut\n" +" -R, --no-resize försök inte att ändra storlek på terminalen\n" +" -S, --suspend-wait vänta medan kommandot var i viloläge\n" +" -s, --speed=num påskynda eller fördröj utmatning\n" +" -V, --version visa versionsinformation och avsluta" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\tvärd omatchad" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Kommandot tillåts" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Kommandot nekades" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Kommando omatchat" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s är skrivbar för gruppen" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "kan inte trunkera tidsstämpelfil till %lld byte" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "ignorerar tidsstämpel från framtiden" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tidsstämpel är för långt in i framtiden: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "kan inte låsa tidsstämpelfil %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "sökväg för lektionsstatus för lång: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit ska inte anges med en sökväg" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "flaggan -x kommer att tas bort i en framtida version" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "överväg att använda verktyget cvtsudoers istället" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "tryck på retur för att redigera %s: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "angiven redigerare (%s) finns inte" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "ingen textredigerare hittad (sökväg för textredigerare = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "skrivfel" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "kan inte hämta filinformation för temporärfil (%s), %s oförändrad" + +# sebras: not an exact translation, but I think it captures the meaning of the original text. +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "temporärfil tom (%s), %s oförändrad" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "redigeraren (%s) misslyckades, %s är oförändrad" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s oförändrad" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "kan inte återöppna temporärfil (%s), %s är oförändrad." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "kan inte tolka temporärfil (%s), okänt fel" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "internt fel, kan inte hitta %s i listan!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "kan inte ställa in (uid, gid) för %s till (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s och %s finns inte på samma filsystem, använder mv för att byta namn" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "kommandot misslyckades: ”%s %s %s”, %s är oförändrad" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "fel vid namnbyte för %s, %s är oförändrad" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "Nu då? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Alternativen är:\n" +" r(e)digera sudoers-filen igen\n" +" avsluta (x) utan att spara ändringar i sudoers-filen\n" +" Avsluta (Q) och spara ändringar i sudoers-filen (FARLIGT!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "kan inte köra %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: felaktig ägare (uid, gid) ska vara (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: felaktiga rättigheter, bör vara läge 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: tolkad OK\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s är upptagen, försök igen senare" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "kan inte låsa %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Redigera ändå? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Fel: %s:%d:%d: cykel i %s ”%s”" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Varning: %s:%d:%d: cykel i %s ”%s”" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Fel: %s:%d:%d: %s ”%s” refererad till men inte definierad" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Varning: %s:%d:%d: %s ”%s” refererad till men inte definierad" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Varning: %s:%d:%d: oanvänd %s ”%s”" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - redigera sudoers-filen på ett säkert sätt\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Flaggor:\n" +" -c, --check genomför endast kontroller\n" +" -f, --file=sudoers ange plats för sudoers-filen\n" +" -h, --help visa hjälptext och avsluta\n" +" -q, --quiet mindre utförliga (tysta) syntaxfelmeddelanden\n" +" -s, --strict strikt syntaxkontroll\n" +" -V, --version visa versionsinformation och avsluta\n" + +#: toke.l:179 +msgid "empty string" +msgstr "tom sträng" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "tom grupp" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "tom nätgrupp" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "ogiltig radfortsättning" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "ogiltig IPv6-adress" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "oväntad radbrytning i sträng" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "för många nivåer av inkluderingar" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "Förinläs attrapp-exec-funktioner som finns i biblioteket sudo_noexec" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports: port är för stor" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "kan inte låsa loggfil: %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "SSL_connect misslyckades: ssl_error=%d, stack=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "Fil för CA-bunt angavs inte" + +#~ msgid "Client certificate was not specified" +#~ msgstr "Klientcertifikat angavs inte" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "Kan inte allokera ssl-objekt: %s\n" + +#~ msgid "Unable to attach socket to the ssl object: %s\n" +#~ msgstr "Kan inte fästa kontakt på ssl-objektet: %s\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "klientmeddelande för stort: %zu\n" + +#~ msgid "server message too large: %u\n" +#~ msgstr "servermeddelande för långt: %u\n" + +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "CA-buntfil inte inställd i sudoers" + +#~ msgid "Calling SSL_CTX_load_verify_locations() failed: %s" +#~ msgstr "Anrop av SSL_CTX_load_verify_locations() misslyckades: %s" + +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "Signerad certifikatfil inte inställd i sudoers" + +#~ msgid "Unable to load private key into the ssl context: %s" +#~ msgstr "Kan inte läsa in privatnyckel in i ssl-kontexten: %s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_connect misslyckades: ssl_error=%d, stack=%s" + +#~ msgid "SSL_read failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_read misslyckades: ssl_error=%d, stack=%s" + +#~ msgid "SSL_write failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_write misslyckades: ssl_error=%d, stack=%s" + +#~ msgid "unknown address family: %d" +#~ msgstr "okänd adressfamilj: %d" + +#~ msgid "audit_failure message too long" +#~ msgstr "audit_failure-meddelande för långt" + +#~ msgid "No user or host" +#~ msgstr "Ingen användare eller värddator" + +#~ msgid "validation failure" +#~ msgstr "valideringsfel" + +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/tidsmätning: %s" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "ignorerar ogiltigt attributvärde: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "kan inte cacha användare %s, slut på minne" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "kan inte cacha grupp %s, slut på minne" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "kan inte cacha grupplista för %s, slut på minne" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP-roll: OKÄND\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Ordning: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-roll: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-roll: OKÄND\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Varning: cykel i %s ”%s”" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Varning: %s ”%s” refererad till men inte definierad" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: misslyckades" + +#~ msgid "getauid failed" +#~ msgstr "getauid misslyckades" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: misslyckades" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: misslyckades" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: misslyckades" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: misslyckades" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: misslyckades" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "internt fel, stackspill i expand_prompt()" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s ägs av uid %u, ska vara uid %u" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s finns men är inte en vanlig fil (0%o)" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "internt fel, stackspill i sudo_setenv2()" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "internt fel, stackspill i sudo_setenv()" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s nära rad %d <<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "kunde inte ställa in lokalanpassning till \"%s\", använder \"C\"" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "kunde inte blanda ldaps och starttls" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "internt fel, stackspill i linux_audit_command()" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "internt fel: otillräckligt utrymme för loggrad" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Kommandon:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "kunde inte mellanlagra uid %u (%s), finns redan" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "kunde inte mellanlagra gid %u (%s), finns redan" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "internt fel, stackspill i runas_groups" + +#~ msgid "writing to standard output" +#~ msgstr "skriver till standard ut" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "internt fel, stackspill i init_vars()" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: buffertöverflöde" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "Password:" +#~ msgstr "Lösenord:" diff --git a/plugins/sudoers/po/tr.mo b/plugins/sudoers/po/tr.mo new file mode 100644 index 0000000..da71fd4 Binary files /dev/null and b/plugins/sudoers/po/tr.mo differ diff --git a/plugins/sudoers/po/tr.po b/plugins/sudoers/po/tr.po new file mode 100644 index 0000000..a7b94d3 --- /dev/null +++ b/plugins/sudoers/po/tr.po @@ -0,0 +1,1721 @@ +# Turkish translations for sudoers package +# This file is put in the public domain. +# Todd C. Miller , 2011-2013 +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.7b2\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2013-04-17 15:52-0400\n" +"PO-Revision-Date: 2013-04-27 23:41+0200\n" +"Last-Translator: Özgür Sarıer \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.5\n" + +#: confstr.sh:2 +msgid "Password:" +msgstr "Parola:" + +#: confstr.sh:3 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h için GÜVENLİK bilgisi ***" + +#: confstr.sh:4 +msgid "Sorry, try again." +msgstr "Üzgünüm, yeniden deneyin." + +#: plugins/sudoers/alias.c:124 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Takma ad `%s' önceden tanımlanmış" + +#: plugins/sudoers/auth/bsdauth.c:77 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kullanıcı %s için oturum açma sınıfı elde edilemedi" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "unable to begin bsd authentication" +msgstr "bsd kimlik doğrulama işlemine başlanılamadı" + +#: plugins/sudoers/auth/bsdauth.c:91 +msgid "invalid authentication type" +msgstr "geçersiz kimlik doğrulama türü" + +#: plugins/sudoers/auth/bsdauth.c:100 +msgid "unable to setup authentication" +msgstr "kimlik doğrulama gerçekleştirilemedi" + +#: plugins/sudoers/auth/fwtk.c:59 +#, c-format +msgid "unable to read fwtk config" +msgstr "fwtk yapılandırması okunamadı" + +#: plugins/sudoers/auth/fwtk.c:64 +#, c-format +msgid "unable to connect to authentication server" +msgstr "kimlik doğrulama sunucusuna bağlanılamadı" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:127 +#, c-format +msgid "lost connection to authentication server" +msgstr "kimlik doğrulama sunucusunda bağlantı kaybı" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"kimlik doğrulama sunucusu hatası:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:116 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:159 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: ayrıştırılamayan öge '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: kimlik bilgisi önbelleği çözülemedi: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: seçenekler ayrılamadı: %s" + +#: plugins/sudoers/auth/kerb5.c:233 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: kimlik bilgileri elde edilemedi: %s" + +#: plugins/sudoers/auth/kerb5.c:246 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: kimlik bilgisi önbelleği hazırlanamadı: %s" + +#: plugins/sudoers/auth/kerb5.c:250 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: kimlik bilgisi önbellekte saklanamadı: %s" + +#: plugins/sudoers/auth/kerb5.c:315 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT doğrulanamadı! Muhtemel saldırı!: %s" + +#: plugins/sudoers/auth/pam.c:105 +msgid "unable to initialize PAM" +msgstr "PAM başlatılamadı" + +#: plugins/sudoers/auth/pam.c:150 +msgid "account validation failure, is your account locked?" +msgstr "hesap geçerliliği teyit edilemedi, hesabınız kilitli mi?" + +#: plugins/sudoers/auth/pam.c:154 +msgid "Account or password is expired, reset your password and try again" +msgstr "Hesabın veya hesap parolasının süresi dolmuş, parolanızı sıfırlayınız ve yeniden deneyiniz" + +#: plugins/sudoers/auth/pam.c:162 +#, c-format +msgid "unable to change expired password: %s" +msgstr "zaman aşımına uğramış parola değiştirilemedi: %s" + +#: plugins/sudoers/auth/pam.c:167 +msgid "Password expired, contact your system administrator" +msgstr "Parola geçerlilik süresi dolmuş, sistem yöneticinizle temasa geçiniz" + +#: plugins/sudoers/auth/pam.c:171 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Hesap geçerlilik süresi dolmuş veya sudo için PAM yapılandırması bir \"account\" bölümünden yoksun, sistem yöneticinizle temasa geçiniz" + +#: plugins/sudoers/auth/pam.c:188 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM kimlik doğrulama hatası: %s" + +#: plugins/sudoers/auth/pam.c:247 +#, c-format +msgid "unable to establish credentials: %s" +msgstr "kimlik bilgileri oluşturulamadı: %s" + +#: plugins/sudoers/auth/rfc1938.c:103 plugins/sudoers/visudo.c:212 +#, c-format +msgid "you do not exist in the %s database" +msgstr "%s veritabanında bulunmuyorsunuz" + +#: plugins/sudoers/auth/securid5.c:80 +#, c-format +msgid "failed to initialise the ACE API library" +msgstr "ACE API kütüphanesinin hazırlanması başarısız oldu" + +#: plugins/sudoers/auth/securid5.c:106 +#, c-format +msgid "unable to contact the SecurID server" +msgstr "SecurID sunucusuyla bağlantı kurulamadı" + +#: plugins/sudoers/auth/securid5.c:115 +#, c-format +msgid "User ID locked for SecurID Authentication" +msgstr "Kullanıcı Kimliği(User ID), SecurID Kimlik Doğrulaması için kilitli" + +#: plugins/sudoers/auth/securid5.c:119 plugins/sudoers/auth/securid5.c:170 +#, c-format +msgid "invalid username length for SecurID" +msgstr "SecurID için geçersiz kullanıcı adı uzunluğu" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:175 +#, c-format +msgid "invalid Authentication Handle for SecurID" +msgstr "SecurID için geçersiz Kimlik Doğrulama İşleyicisi" + +#: plugins/sudoers/auth/securid5.c:127 +#, c-format +msgid "SecurID communication failed" +msgstr "SecurID iletişimi başarısız oldu" + +#: plugins/sudoers/auth/securid5.c:131 plugins/sudoers/auth/securid5.c:214 +#, c-format +msgid "unknown SecurID error" +msgstr "bilinmeyen SecurID hatası" + +#: plugins/sudoers/auth/securid5.c:165 +#, c-format +msgid "invalid passcode length for SecurID" +msgstr "SecurID için geçersiz şifre uzunluğu" + +#: plugins/sudoers/auth/sia.c:108 +msgid "unable to initialize SIA session" +msgstr "SIA oturumu başlatılamadı" + +#: plugins/sudoers/auth/sudo_auth.c:119 +msgid "invalid authentication methods" +msgstr "geçersiz kimlik doğrulama yöntemleri" + +#: plugins/sudoers/auth/sudo_auth.c:120 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Sudo içinde geçersiz kimlik doğrulama yöntemleri derlenmiş! Bağımsız ve bağımsız olmayan kimlik doğrulama yöntemlerini karma bir şekilde kullanamayabilirsiniz." + +#: plugins/sudoers/auth/sudo_auth.c:203 +msgid "no authentication methods" +msgstr "kimlik doğrulama yöntemleri yok" + +#: plugins/sudoers/auth/sudo_auth.c:205 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Sudo içinde herhangi bir kimlik doğrulama yöntemi derlenmemiş! Kimlik doğrulamayı kapatmak isterseniz, --disable-authentication seçeneğini kullanınız." + +#: plugins/sudoers/auth/sudo_auth.c:389 +msgid "Authentication methods:" +msgstr "Kimlik doğrulama yöntemleri:" + +#: plugins/sudoers/bsm_audit.c:60 plugins/sudoers/bsm_audit.c:63 +#: plugins/sudoers/bsm_audit.c:112 plugins/sudoers/bsm_audit.c:116 +#: plugins/sudoers/bsm_audit.c:168 plugins/sudoers/bsm_audit.c:172 +#, c-format +msgid "getaudit: failed" +msgstr "getaudit: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:90 plugins/sudoers/bsm_audit.c:153 +#, c-format +msgid "Could not determine audit condition" +msgstr "Denetim durumu belirlenemedi" + +#: plugins/sudoers/bsm_audit.c:101 plugins/sudoers/bsm_audit.c:160 +#, c-format +msgid "getauid: failed" +msgstr "getauid: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:103 plugins/sudoers/bsm_audit.c:162 +#, c-format +msgid "au_open: failed" +msgstr "au_open: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:118 plugins/sudoers/bsm_audit.c:174 +#, c-format +msgid "au_to_subject: failed" +msgstr "au_to_subject: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:122 plugins/sudoers/bsm_audit.c:178 +#, c-format +msgid "au_to_exec_args: failed" +msgstr "au_to_exec_args: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:126 plugins/sudoers/bsm_audit.c:187 +#, c-format +msgid "au_to_return32: failed" +msgstr "au_to_return32: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:129 plugins/sudoers/bsm_audit.c:190 +#, c-format +msgid "unable to commit audit record" +msgstr "denetim kaydı işlenemiyor" + +#: plugins/sudoers/bsm_audit.c:183 +#, c-format +msgid "au_to_text: failed" +msgstr "au_to_text: işlem başarısız" + +#: plugins/sudoers/check.c:189 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Yerel Sistem Yöneticisinden olağan öğütleri aldığınıza güveniyoruz.\n" +"Bunları genellikle aşağıdaki üç şeyle özetleyebiliriz:\n" +"\n" +" #1) Diğer kişilerin özel hayatına saygı gösterin.\n" +" #2) Bir yazmadan önce iki kere düşünün.\n" +" #3) Büyük gücün büyük bir sorumluluk getirdiğini unutmayın.\n" +"\n" + +#: plugins/sudoers/check.c:227 plugins/sudoers/check.c:233 +#: plugins/sudoers/sudoers.c:562 plugins/sudoers/sudoers.c:566 +#, c-format +msgid "unknown uid: %u" +msgstr "bilinmeyen uid: %u" + +#: plugins/sudoers/check.c:230 plugins/sudoers/policy.c:635 +#: plugins/sudoers/sudoers.c:845 plugins/sudoers/testsudoers.c:215 +#: plugins/sudoers/testsudoers.c:359 +#, c-format +msgid "unknown user: %s" +msgstr "bilinmeyen kullanıcı: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "OTP güdüsünü kendi satırına yerleştir" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "$PATH içindeki '.' ögesini yoksay" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "Sudonun çalıştırıldığı her zaman e-posta gönder" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "Kullanıcı kimlik doğrulaması başarısız olursa e-posta gönder" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "Kullanıcı sudoers içinde değilse e-posta gönder" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Kullanıcı bu makinedeki sudoers içinde değilse e-posta gönder" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Kullanıcının bir komut çalıştırmasına izin verilmiyor ise e-posta gönder" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Her kullanıcı/tty birleşik girişi için ayrı bir zaman damgası kullan" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "Sudoyu ilk defa çalıştırdıkları zaman kullanıcıya gerekli öğütleri ver" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Dosya sudo öğüdü içeriyor: %s" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "Öntanımlı olarak kullanıcıların kimlik doğrulaması gerekmektedir" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "Kök kullanıcı (root) sudoyu çalıştırabilir" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Eğer sudo herhangi bir bağımsız değişkenle uyandırılmazsa, bir kabuk başlat" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Kabuğu -s ile başlatırken $HOME çevre değişkenini hedef kullanıcıya ata" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "Her zaman $HOME çevre değişkenini hedef kullanıcının ev dizinine ata" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "Yararlı hata iletilerinin verilmesi için bazı bilgilerin toplanmasına izin ver" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Sudoers dosyası içerisinde tam nitelikli ana makine adlarının olması gerekmektedir" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "Hatalı parola girdikleri zaman kullanıcıyı aşağıla" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Ancak bir tty sahibi iseler kullanıcıya sudoyu çalıştırma izni ver" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo EDITOR çevre değişkeninin gereğini şerefle yerine getirecektir." + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Eğer bir tane varsa hedef kullanıcı oturum açma sınıfında öntanımlıları uygula" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "LOGNAME ve USER çevre değişkenlerini ata" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %d" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %d" +msgstr "Bir parola girişinde deneme sayısı: %d" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "Günlük kütüğü yolu: %s" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "E-posta programı yolu: %s" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "E-posta programı için bayraklar: %s" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "E-posta iletileri için konu satırı: %s" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Hatalı parola iletisi: %s" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Kimlik doğrulama zaman damgası dizininin yolu: %s" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Kimlik doğrulama zaman damgası dizininin sahibi: %s" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Visudo tarafından kullanılacak düzenleyici yolu: %s" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Sudo_noexec kütüphanesinin içerdiği taklit exec işlevlerini önyükle" + +#: plugins/sudoers/def_data.c:247 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "LDAP dizini kullanılabilir durumda ise, yerel sudoers dosyalarını yok sayalım mı" + +#: plugins/sudoers/def_data.c:251 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Compress I/O logs using zlib" +msgstr "I/O günlüklerini zlib kullanarak sıkıştır" + +#: plugins/sudoers/def_data.c:323 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:327 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:347 +msgid "Set of permitted privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:351 +msgid "Set of limit privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:355 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:359 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:363 +msgid "Maximum I/O log sequence number" +msgstr "" + +#: plugins/sudoers/defaults.c:207 plugins/sudoers/defaults.c:587 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:215 plugins/sudoers/defaults.c:225 +#: plugins/sudoers/defaults.c:245 plugins/sudoers/defaults.c:258 +#: plugins/sudoers/defaults.c:271 plugins/sudoers/defaults.c:284 +#: plugins/sudoers/defaults.c:297 plugins/sudoers/defaults.c:317 +#: plugins/sudoers/defaults.c:327 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:218 plugins/sudoers/defaults.c:228 +#: plugins/sudoers/defaults.c:236 plugins/sudoers/defaults.c:253 +#: plugins/sudoers/defaults.c:266 plugins/sudoers/defaults.c:279 +#: plugins/sudoers/defaults.c:292 plugins/sudoers/defaults.c:312 +#: plugins/sudoers/defaults.c:323 +#, c-format +msgid "no value specified for `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:241 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:288 plugins/sudoers/env.c:293 +#: plugins/sudoers/env.c:395 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/policy.c:420 plugins/sudoers/policy.c:427 +#: plugins/sudoers/prompt.c:171 plugins/sudoers/sudoers.c:654 +#: plugins/sudoers/testsudoers.c:243 +#, c-format +msgid "internal error, %s overflow" +msgstr "" + +#: plugins/sudoers/env.c:367 +#, c-format +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1012 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:113 plugins/sudoers/sssd.c:256 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:118 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:123 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:119 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:131 plugins/sudoers/iolog.c:144 +#: plugins/sudoers/timestamp.c:200 plugins/sudoers/timestamp.c:244 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:141 plugins/sudoers/iolog.c:155 +#: plugins/sudoers/iolog.c:159 plugins/sudoers/timestamp.c:165 +#: plugins/sudoers/timestamp.c:221 plugins/sudoers/timestamp.c:271 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:217 plugins/sudoers/sudoers.c:708 +#: plugins/sudoers/sudoreplay.c:354 plugins/sudoers/sudoreplay.c:815 +#: plugins/sudoers/sudoreplay.c:978 plugins/sudoers/timestamp.c:155 +#: plugins/sudoers/visudo.c:809 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: plugins/sudoers/iolog.c:250 plugins/sudoers/sudoers.c:711 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/iolog.c:274 plugins/sudoers/timestamp.c:159 +#, c-format +msgid "unable to write to %s" +msgstr "" + +#: plugins/sudoers/iolog.c:334 +#, c-format +msgid "unable to create %s" +msgstr "" + +#: plugins/sudoers/ldap.c:385 +#, c-format +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:408 +#, c-format +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:438 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:467 +#, c-format +msgid "invalid uri: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:473 +#, c-format +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:477 +#, c-format +msgid "unable to mix ldaps and starttls" +msgstr "" + +#: plugins/sudoers/ldap.c:496 +#, c-format +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:570 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:573 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1062 +#, c-format +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:1068 +#, c-format +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1076 +#, c-format +msgid "unable to build time filter" +msgstr "" + +#: plugins/sudoers/ldap.c:1295 +#, c-format +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "" + +#: plugins/sudoers/ldap.c:1842 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1844 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1891 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1899 plugins/sudoers/parse.c:515 +#: plugins/sudoers/sssd.c:1242 +#, c-format +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2321 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2355 +#, c-format +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:2591 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:57 +#, c-format +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:93 +#, c-format +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/logging.c:140 +#, c-format +msgid "%8s : %s" +msgstr "" + +#: plugins/sudoers/logging.c:168 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "" + +#: plugins/sudoers/logging.c:194 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "günlük kütüğü açılamadı: %s: %s" + +#: plugins/sudoers/logging.c:197 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "günlük kütüğü kilitlenemedi: %s: %s" + +#: plugins/sudoers/logging.c:245 +msgid "No user or host" +msgstr "Kullanıcı veya ana makine yok" + +#: plugins/sudoers/logging.c:247 +msgid "validation failure" +msgstr "doğrulama başarısız" + +#: plugins/sudoers/logging.c:254 +msgid "user NOT in sudoers" +msgstr "kullancı sudoers içinde DEĞİL" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT authorized on host" +msgstr "kullanıcı ana makine üzerinde yetkili DEĞİL" + +#: plugins/sudoers/logging.c:258 +msgid "command not allowed" +msgstr "komuta izin verilmiyor" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s sudoers dosyası içinde değil. Bu olay rapor edilecek.\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s, %s üzerinde sudoyu çalıştırma iznine sahip değil. Bu olay rapor edilecek.\n" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Üzgünüm, %s kullanıcısı %s üzerinde sudoyu çalıştıramayabilir.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Üzgünüm, %s kullanıcısı '%s%s%s' komutunu %s%s%s olarak %s üzerinde çalıştırma iznine sahip değil.\n" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:383 +#: plugins/sudoers/sudoers.c:384 plugins/sudoers/sudoers.c:386 +#: plugins/sudoers/sudoers.c:387 plugins/sudoers/sudoers.c:1001 +#: plugins/sudoers/sudoers.c:1002 +#, c-format +msgid "%s: command not found" +msgstr "%s: komut bulunamadı" + +#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:379 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:353 +msgid "authentication failure" +msgstr "" + +#: plugins/sudoers/logging.c:379 +msgid "a password is required" +msgstr "" + +#: plugins/sudoers/logging.c:443 plugins/sudoers/logging.c:487 +#, c-format +msgid "%d incorrect password attempt" +msgid_plural "%d incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/logging.c:566 +#, c-format +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:573 plugins/sudoers/logging.c:629 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:619 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:644 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:680 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/logging.c:899 +#, c-format +msgid "internal error: insufficient space for log line" +msgstr "" + +#: plugins/sudoers/match.c:631 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/match.c:661 +#, c-format +msgid "%s: read error" +msgstr "" + +#: plugins/sudoers/match.c:670 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/parse.c:124 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:127 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:462 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:463 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:477 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:486 +#, c-format +msgid " Options: " +msgstr "" + +#: plugins/sudoers/policy.c:517 plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to execute %s" +msgstr "" + +#: plugins/sudoers/policy.c:659 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:661 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:665 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:668 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:670 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:671 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/pwutil.c:148 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:190 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:374 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:410 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:564 plugins/sudoers/pwutil.c:586 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:584 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:445 +#: plugins/sudoers/set_perms.c:846 plugins/sudoers/set_perms.c:1141 +#: plugins/sudoers/set_perms.c:1431 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:130 plugins/sudoers/set_perms.c:453 +#: plugins/sudoers/set_perms.c:854 plugins/sudoers/set_perms.c:1149 +#: plugins/sudoers/set_perms.c:1439 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:189 plugins/sudoers/set_perms.c:500 +#: plugins/sudoers/set_perms.c:1200 plugins/sudoers/set_perms.c:1471 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1277 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:290 plugins/sudoers/set_perms.c:609 +#: plugins/sudoers/set_perms.c:993 plugins/sudoers/set_perms.c:1287 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:308 plugins/sudoers/set_perms.c:627 +#: plugins/sudoers/set_perms.c:1009 plugins/sudoers/set_perms.c:1303 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:361 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1055 plugins/sudoers/set_perms.c:1349 +#: plugins/sudoers/set_perms.c:1515 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/set_perms.c:1583 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/sssd.c:257 +#, c-format +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:263 plugins/sudoers/sssd.c:271 +#: plugins/sudoers/sssd.c:278 plugins/sudoers/sssd.c:285 +#: plugins/sudoers/sssd.c:292 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:283 +#, c-format +msgid "Matching Defaults entries for %s on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:296 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:309 +#, c-format +msgid "User %s may run the following commands on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:318 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:159 plugins/sudoers/sudoers.c:193 +#: plugins/sudoers/sudoers.c:673 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:165 +#, c-format +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:227 +#, c-format +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:234 +#, c-format +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:315 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:329 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:330 +#, c-format +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:378 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:395 +#, c-format +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:723 plugins/sudoers/timestamp.c:216 +#: plugins/sudoers/timestamp.c:260 plugins/sudoers/timestamp.c:328 +#: plugins/sudoers/visudo.c:310 plugins/sudoers/visudo.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:726 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:729 toke.l:913 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:733 toke.l:920 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:736 toke.l:925 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:763 +#, c-format +msgid "only root can use `-c %s'" +msgstr "" + +#: plugins/sudoers/sudoers.c:780 plugins/sudoers/sudoers.c:782 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:814 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:866 plugins/sudoers/testsudoers.c:377 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:292 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:305 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:311 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:314 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:339 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:345 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:363 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:369 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:370 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:400 +#, c-format +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:416 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:499 +#, c-format +msgid "writing to standard output" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:528 +#, c-format +msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:641 plugins/sudoers/sudoreplay.c:666 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:683 +#, c-format +msgid "too many parenthesized expressions, max %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:694 +#, c-format +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:700 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:714 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:718 plugins/sudoers/sudoreplay.c:1058 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:724 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:737 +#, c-format +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:739 +#, c-format +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:741 +#, c-format +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1182 +#, c-format +msgid "usage: %s [-h] [-d directory] [-m max_wait] [-s speed_factor] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1185 +#, c-format +msgid "usage: %s [-h] [-d directory] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1194 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1196 +msgid "" +"\n" +"Options:\n" +" -d directory specify directory for session logs\n" +" -f filter specify which I/O type to display\n" +" -h display help message and exit\n" +" -l [expression] list available session IDs that match expression\n" +" -m max_wait max number of seconds to wait between events\n" +" -s speed_factor speed up or slow down output\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:328 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:331 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:129 +#, c-format +msgid "timestamp path too long: %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:203 plugins/sudoers/timestamp.c:247 +#: plugins/sudoers/timestamp.c:292 +#, c-format +msgid "%s owned by uid %u, should be uid %u" +msgstr "" + +#: plugins/sudoers/timestamp.c:208 plugins/sudoers/timestamp.c:252 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0700" +msgstr "" + +#: plugins/sudoers/timestamp.c:286 +#, c-format +msgid "%s exists but is not a regular file (0%o)" +msgstr "" + +#: plugins/sudoers/timestamp.c:298 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0600" +msgstr "" + +#: plugins/sudoers/timestamp.c:353 +#, c-format +msgid "timestamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:407 +#, c-format +msgid "unable to remove %s, will reset to the epoch" +msgstr "" + +#: plugins/sudoers/timestamp.c:414 +#, c-format +msgid "unable to reset %s to the epoch" +msgstr "" + +#: plugins/sudoers/toke_util.c:176 +#, c-format +msgid "fill_args: buffer overflow" +msgstr "" + +#: plugins/sudoers/visudo.c:180 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:243 plugins/sudoers/visudo.c:533 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:326 plugins/sudoers/visudo.c:332 +#, c-format +msgid "write error" +msgstr "yazma hatası" + +#: plugins/sudoers/visudo.c:414 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:419 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:425 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:448 +#, c-format +msgid "%s unchanged" +msgstr "%s değişmemiş" + +#: plugins/sudoers/visudo.c:477 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "geçici dosya (%s) yeniden açılamadı, %s değişmemiş." + +#: plugins/sudoers/visudo.c:487 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:578 plugins/sudoers/visudo.c:587 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:582 plugins/sudoers/visudo.c:592 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:609 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:623 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:633 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:695 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:709 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:757 +#, c-format +msgid "unable to run %s" +msgstr "%s çalıştırılamadı" + +#: plugins/sudoers/visudo.c:783 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:790 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:815 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "%s dosyasının ayrıştırılması başarısız oldu, bilinmeyen hata" + +#: plugins/sudoers/visudo.c:831 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "%s içindeki %d satırı yakınında ayrıştırma hatası\n" + +#: plugins/sudoers/visudo.c:834 +#, c-format +msgid "parse error in %s\n" +msgstr "%s içinde ayrıştırma hatası\n" + +#: plugins/sudoers/visudo.c:841 plugins/sudoers/visudo.c:846 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: ayrıştırma TAMAM\n" + +#: plugins/sudoers/visudo.c:893 +#, c-format +msgid "%s busy, try again later" +msgstr "%s meşgul, daha sonra tekrar deneyin" + +#: plugins/sudoers/visudo.c:937 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "belirtilen düzenleyici (%s) yok" + +#: plugins/sudoers/visudo.c:960 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "düzenleyici (%s) başlatılamadı" + +#: plugins/sudoers/visudo.c:1008 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "hiçbir düzenleyici bulunamadı (düzenleyici yolu = %s)" + +#: plugins/sudoers/visudo.c:1100 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1101 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1104 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1105 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1240 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "" + +#: plugins/sudoers/visudo.c:1302 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1304 +msgid "" +"\n" +"Options:\n" +" -c check-only mode\n" +" -f sudoers specify sudoers file location\n" +" -h display help message and exit\n" +" -q less verbose (quiet) syntax error messages\n" +" -s strict syntax checking\n" +" -V display version information and exit" +msgstr "" +"\n" +"Seçenekler:\n" +" -c sadece denetim kipi\n" +" -f sudoers sudoers dosyasının konumu\n" +" -h yardım iletisini görüntüle ve çık\n" +" -q daha az ayrıntılı (sessiz=quiet) sözdizim hata iletileri\n" +" -s sıkı sözdizim denetimi\n" +" -V sürüm bilgisini görüntüle ve çık" + +#: toke.l:886 +msgid "too many levels of includes" +msgstr "" diff --git a/plugins/sudoers/po/uk.mo b/plugins/sudoers/po/uk.mo new file mode 100644 index 0000000..893265c Binary files /dev/null and b/plugins/sudoers/po/uk.mo differ diff --git a/plugins/sudoers/po/uk.po b/plugins/sudoers/po/uk.po new file mode 100644 index 0000000..a9d76a8 --- /dev/null +++ b/plugins/sudoers/po/uk.po @@ -0,0 +1,3098 @@ +# Ukrainian translation for sudoers. +# This file is put in the public domain. +# +# Yuri Chornoivan , 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-17 18:30+0200\n" +"Last-Translator: Yuri Chornoivan \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Lokalize 20.11.70\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "синтаксична помилка" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Пароль %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] пароль до %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Пароль: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Дані щодо ЗАХИСТУ %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Вибачте, повторіть спробу." + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "не вдалося отримати потрібний об’єм пам’яті" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "для контрольної суми слід вказати шлях" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "значення «CWD» мають починатися з «/», «~» або «*»" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "значення «CHROOT» мають починатися з «/», «~» або «*»" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "синтаксична помилка, як назву замінника використано зарезервоване слово %s" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "некоректне значення notbefore" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "некоректне значення notafter" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "значення часу очікування є надто великим" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "некоректне значення часу очікування" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "внутрішня помилка, переповнення %s" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "не вдалося здублювати stdin: %m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "не вдалося виконати %s: %m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "не вдалося створити відгалуження" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "не вдалося створити відгалуження: %m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "не вдалося відкрити канал: %m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (команда продовжується) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s існує, але не є каталогом (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "не вдалося створити каталог %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "не вдалося змінити режим доступу до %s на значення 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "мало бути використано JSON_STRING, отримано %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "пропущено подвійні лапки у назві" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "мало бути використано JSON_OBJECT, отримано %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "завершальна фігурна дужка без початкової" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "неочікуваний масив" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "завершальна дужка без початкової" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "неочікуваний рядок" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "пропущено двокрапку після назви" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "неочікуване булеве значення" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "неочікуване число" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u не вдалося обробити «%s»" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: некоректний файл журналу" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: не вказано даних щодо часової позначки" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: часова позначка %s: %s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: не вказано даних щодо користувача" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: не вказано даних щодо користувача, від імені якого відбуватиметься виконання" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: не вказано даних щодо групи, від імені якої відбуватиметься виконання" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "помилка під час спроби читання файла часових позначок: %s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "некоректний рядок у файлі timing: %s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "журнал вже завершено — його не можна перезапустити" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "не вдалося перезапустити журнал" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "не вдалося відкрити %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "не вистачає файла журналу введення-виведення, %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s: неможливо виконати позиціювання вперед на %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "не вдалося знайти точку відновлення [%lld, %ld] у %s/%s" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "помилка скінченного автомата" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "некоректне AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "помилка під час спроби обробити AcceptMessage" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "помилка під час створення журналу введення-виведення" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "помилка під час обробки події підтвердження дії журналу" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "некоректне RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "помилка під час проби обробити RejectMessage" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "помилка під час обробки події відмови у записі до журналу" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "некоректне AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "помилка під час спроби обробити AlertMessage" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "помилка під час обробки події критичного повідомлення журналу" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "помилка протоколу" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "помилка під час спроби записати IoBuffer" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "помилка під час спроби записати ChangeWindowSize" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "помилка під час спроби записати CommandSuspend" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "нерозпізнаний тип ClientMessage" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "повідомлення клієнта є надто великим" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "не вдалося встановити комплекс шифрування TLS 1.2 у %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "не вдалося встановити комплекс шифрування TLS 1.3 у %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "не вдалося отримати спосіб TLS сервера: %s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "не вдалося створити контекст TLS: %s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "не вдалося завантажити сертифікат %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "не вдалося завантажити комплект служби сертифікації %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "не вдалося завантажити закритий ключ %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "не вдалося встановити параметри Діфі-Гелмана: %s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "не вдалося встановити мінімальну версію протоколу у значення TLS 1.2: %s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "не вдалося отримати віддалену IP-адресу" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "Не вдалося долучити дані користувача до об'єкта SSL: %s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "не вдалося додати подію до черги обробки" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "не вдалося налаштувати сокет очікування на дані" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s — надсилання журналу введення-виведення sudo на віддалений сервер\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Параметри:\n" +" -f, --file шлях до файла налаштувань\n" +" -h --help показати довідкове повідомлення і вийти\n" +" -n, --no-fork не відгалужувати, запустити на передньому плані\n" +" -R, --random-drop ймовірність скидання з'єднань у відсотках\n" +" -V, --version вивести дані щодо версії і завершити роботу\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "Потрібна версія Protobuf-C 1.3 або новіша" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "некоректне значення ймовірності скидання: %s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s, версія %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "Підтримки TLS не передбачено" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s: не є повноцінним записом шляхуnot a fully qualified path" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d «[» без пари: %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d некоректний розділ налаштувань: %s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d некоректний рядок налаштувань: %s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d мало бути вказано назву розділу: %s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "некоректне значення %s: %s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d невідомий ключ: %s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "невідома можливість syslog %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "невідома пріоритетність syslog %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Параметри:\n" +" --help вивести довідкове повідомлення і завершити роботу\n" +" -A, --accept надсилати лише подію прийняття (без введення-виведення)\n" +" -h, --host вказати вузол для надсилання журналів\n" +" -i, --iolog_id вказати ідентифікатор журналу введення-виведення, яки слід відновити\n" +" -p, --port вказати порт, яким слід скористатися для з'єднання з вузлом\n" +" -r, --restart перезапустити попереднє передавання журналу введення-виведення\n" +" -R, --reject відмовити у виконанні команди із зазначенням вказаної причини\n" +" -b, --ca-bundle вказати файла пакета сертифікатів для перевірки сертифіката сервера\n" +" -c, --cert вказати файл сертифіката для узгодження зв'язку TLS\n" +" -k, --key вказати файл закритого ключа\n" +" -n, --no-verify не перевіряти сертифікат сервера\n" +" -t, --test перевірити сервер аудиту надсиланням вибраного журналу введення-виведення\n" +" паралельно n разів\n" +" -V, --version вивести дані щодо версії і завершити роботу\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "не вдалося виконати пошук %s:%s: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "не вдалося отримати IP-адресу сервера" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "не вдалося прочитати %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "повідомлення клієнта є надто довгим: %zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s: буфер запису вже використовується" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "неочікувана подія введення-виведення — %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s: неочікуваний стан — %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "некоректне ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "отримано повідомлення про помилку від сервера: %s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "отримано повідомлення про переривання від сервера: %s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "не вдалося розпакувати ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s: неочікуване значення type_case — %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "перевищено час очікування на читання з сервера" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "передчасне завершення файла" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "повідомлення сервера є надто великим: %u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "перевищено час очікування на запис на сервері" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "сталося перевищення часу очікування на узгодження зв'язку TLS" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "не вдалося встановити подію" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "Не вдалося встановити з'єднання TLS: %s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "Не вдалося ініціалізувати контекст SSL: %s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "Не вдалося розмістити об'єкт SSL у пам'яті: %s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "Не вдалося долучити сокет до об'єкта SSL: %s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "слід вказати одночасно точку перезапуску та ідентифікатор журналу введення-виведення" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "точку перезапуску не можна встановлювати, якщо не надсилається жодних даних введення-виведення" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "передчасний вихід зі станом %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "на сервер надіслано дані щодо часу, який лишився [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "отримано точку внеску від сервера [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Замінник «%s» вже визначено" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "не вдалося отримати дані щодо пори доби" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "не вдалося змінити пароль до %s" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "не вдалося отримати клас входу до системи для користувача %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "не вдалося розпочати розпізнавання за BSD" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "некоректний тип розпізнавання" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "не вдалося ініціалізувати розпізнавання за BSD" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "термін дії вашого облікового запису вичерпано" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "не вдалося підтвердити" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "не вдалося прочитати налаштування fwtk" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "не вдалося встановити з’єднання з сервером розпізнавання" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "втрачено зв’язок з сервером розпізнавання" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"помилка сервера розпізнавання:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: не вдалося перетворити реєстраційний запис на рядок («%s»): %s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: не вдалося обробити «%s»: %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: не вдалося визначити кеш реєстраційних даних: %s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: не вдалося розмістити параметри: %s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: не вдалося отримати реєстраційні дані: %s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: не вдалося ініціалізувати кеш реєстраційних даних: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: не вдалося зберегти реєстраційні дані у кеші: %s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: не вдалося отримати реєстраційний запис вузла: %s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: спроба перевірки TGT зазнала невдачі! Ймовірно, вас атаковано: %s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "не вдалося ініціалізувати PAM: %s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Помилка розпізнавання PAM: %s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "помилка під час спроби перевірки облікового запису. Ваш обліковий запис заблоковано?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "Строк дії облікового запису або пароля збіг, визначте новий пароль і повторіть спробу" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "не вдалося змінити пароль, строк дії якого завершився: %s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "Строк дії пароля збіг, зверніться до адміністратора вашої системи щодо поновлення пароля" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Строк дії облікового запису збіг або у файлі налаштувань PAM немає розділу \"account\" для sudo. Повідомте про це адміністратора вашої системи." + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "Помилка керування обліковими записами PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "вас немає у базі даних %s" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "не вдалося ініціалізувати бібліотеку програмного інтерфейсу до ACE" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "не вдалося встановити зв’язок з сервером SecurID" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "Ідентифікатор користувача заблоковано для розпізнавання SecurID" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "некоректна довжина імені користувача для SecurID" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "некоректний дескриптор розпізнавання для SecurID" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "спроба обміну даними з SecurID зазнала невдачі" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "невідома помилка SecurID" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "некоректна довжина коду пароля для SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "не вдалося ініціалізувати сеанс SIA" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "некоректні способи розпізнавання" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "sudo зібрано з підтримкою некоректних способів розпізнавання! Не можна змішувати власні і зовнішні способи розпізнавання." + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "немає способів розпізнавання" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "sudo зібрано без можливостей з взаємодії з інструментами розпізнавання! Якщо ви хочете вимкнути розпізнавання, скористайтеся параметром налаштування --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "Не вдалося ініціалізувати методи розпізнавання." + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "Способи розпізнавання:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "Не вдалося визначити умови аудита" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "не вдалося надіслати запис аудита" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Ми сподіваємося, що ви отримали належні настанови від адміністратора\n" +"локальної системи. Зазвичай, подібні настанови зводяться до такого:\n" +"\n" +" #1) Поважайте конфіденційність даних інших користувачів.\n" +" #2) Обдумайте свої дії, перш ніж виконувати їх.\n" +" #3) Користування широкими правами розширює сферу відповідальності.\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "невідоме значення uid: %u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "невідомий користувач: %s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "збільшення порядку: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "початковий порядок: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "доповнення порядку: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "Граматична перевірка %s, версія %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "непідтримуваний формат вхідних даних, %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "непідтримуваний формат виведення, %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: файли вхідних і вихідних даних мають бути різними файлами" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "не вдалося ініціалізувати типові значення sudoers" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: невідоме ключове слово: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "некоректний тип типових значень: %s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "некоректний тип придушення: %s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "некоректний фільтр: %s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "не вдалося відкрити %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "не вдалося обробити файл %s, невідома помилка" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "помилка обробки у %s поблизу рядка %d\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "помилка обробки у %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "не вдалося виконати запис до %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s — перетворення форматів файлів sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Параметри:\n" +" -b, --base=dn базовий DN для запитів sudo до LDAP\n" +" -c, --config=файл_налашт шлях до файла налаштувань\n" +" -d, --defaults=типи перетворювати лише записи Defaults вказаних типів\n" +" -e, --expand-aliases розгортати псевдоніми під час перетворення\n" +" -f, --output-format=формат встановити формат виведення: JSON, LDIF або sudoers\n" +" -i, --input-format=формат встановити формат вхідних даних: LDIF або sudoers\n" +" -I, --increment=число число, на яке слід збільшувати sudoOrder\n" +" -h, --help вивести довідкове повідомлення і завершити роботу\n" +" -m, --match=фільтр перетворювати лише записи, які відповідають фільтру\n" +" -M, --match-local встановлювати відповідність фільтра за базами даних passwd та груп\n" +" -o, --output=файл_результатів записати перетворені дані sudoers до файла файл_результатів\n" +" -O, --order-start=число початкова точка для першого sudoOrder\n" +" -p, --prune-matches вилучити невідповідні записи користувачів, груп і вузлів\n" +" -P, --padding=число доповнення основи для нарощування sudoOrder\n" +" -s, --suppress=розділи придушити виведення певних розділів\n" +" -V, --version вивести дані щодо версії і завершити роботу" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "невідомий запис типових параметрів «%s»" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "не вдалося отримати гринвіцький час" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "не вдалося виконати форматування часового штампа" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "забагато записів sudoers, максимальна кількість — %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "не встановлено значення змінної середовища SUDOERS_BASE і не вказано параметра -b." + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Інструмент ведення журналу, якщо використано syslog: %s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Пріоритетність, яка використовуватиметься у syslog для успішних розпізнавань: %s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Пріоритетність, яка використовуватиметься у syslog для неуспішних розпізнавань: %s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "Розташовувати запит щодо OTP у окремому рядку" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "Ігнорувати «.» у $PATH" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "Завжди надсилати листа, коли викликано sudo" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "Надсилати листа, якщо користувачу не вдалося пройти розпізнавання" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "Надсилати листа, якщо користувача немає серед sudoers" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Надсилати листа, якщо користувача немає у списку sudoers цього вузла" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Надсилати листа, якщо користувачеві заборонено виконувати команду" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "Надсилати листа, якщо користувач намагається віддати команду" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Окремий часовий штамп для кожної комбінації користувач/tty" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "Показувати настанови користувачеві під час першого запуску sudo" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Файл з настановами щодо sudo: %s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "Типово, вимагати розпізнавання" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Root може виконувати sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Записувати назву вузла до файла журналу (не syslog)" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "Записувати рік до файла журналу (не syslog)" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Якщо sudo викликано без параметрів, запускати командну оболонку" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Встановлювати $HOME відповідно до вказаного користувача для запуску оболонки з -s" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "Завжди встановлювати значенням $HOME домашній каталог вказаного користувача" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "Дозволити збирання даних з метою формування зрозумілих повідомлень про помилки" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "У файлі sudoers слід вказати повні назви вузлів" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "Знущатися з користувача, якщо введено помилковий пароль" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Дозволяти користувачеві виконувати sudo, лише якщо з ним пов’язано tty" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo зважатимwill honor the EDITOR environment variable" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "Надсилати запит на пароль root, а не користувача" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Надсилати запит щодо пароля runas_default, але пароля самого користувача" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "Надсилати запит щодо пароля потрібного користувача, але пароля самого користувача" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Застосовувати типові параметри у класі вказаного користувача, якщо такий клас є" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Встановити значення змінних середовища LOGNAME і USER" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Встановлювати для потрібного користувача ефективний uid, а не справжній uid" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Не ініціалізувати вектор групи відповідно до вказаного користувача" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Позиція, на якій слід переносити рядки файла журналу (0 — без перенесення): %u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Час очікування на часовий штамп розпізнавання: %.1f хвилина" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Час очікування на введення пароля: %.1f хвилина" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Кількість спроб введення пароля: %u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Потрібне значення umask або 0777 для користувачевого: 0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "Шлях до файла журналу: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "Шлях до програми ел. пошти: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Параметри програми ел. пошти: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Адреса, на яку надсилатимуться листи: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Адреса, з якої надсилатимуться листи: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Тема листів: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Повідомлення про помилковий пароль: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Шлях до каталогу стану отримання настанов: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Шлях до каталогу часових штампів розпізнавання: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Власник каталогу часових штампів розпізнавання: %s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Користувачів цієї групи звільнено від потреби у введенні пароля і PATH: %s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "Типовий запит пароля: %s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Якщо встановлено, запит щодо паролю замінюватиме запит системи." + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Типовий користувач для запуску команд: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Значення для заміни $PATH користувача: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Шлях до редактора, який використовуватиме visudo: %s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Умови запиту пароля для псевдокоманди «list»: %s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Умови запиту пароля для псевдокоманди «verify»: %s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "Попередньо завантажити бібліотеку sudo_noexec, яка замінює функції виконання" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Чи слід ігнорувати локальний файл sudoers, якщо є доступ до каталогу LDAP" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Дескриптори файлів >= %d буде закрито перед виконанням команди" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "Якщо встановлено, користувачі можуть перевизначати значення closefrom за допомогою параметра -C" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "Дозволити користувачам встановлювати значення довільних змінних середовища" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "Відновити типовий набір змінних середовища" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "Змінні середовища, безпечність яких слід перевіряти:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "Змінні середовища, які слід вилучити:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "Змінні середовища, які слід зберегти:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Роль SELinux, яку слід використати у новому контексті захисту: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Тип SELinux, який слід використати у новому контексті захисту: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Шлях до специфічного для sudo файла середовища: %s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Шлях до специфічного для sudo файла середовища з обмеженим доступом: %s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Локаль, яку слід використати під час обробки sudoers: %s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Дозволити sudo надсилати запит щодо пароля, навіть якщо цей пароль буде видимим" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Супроводжувати введення користувачем пароля показом замінників символів пароля" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Швидше встановлення відповідності, менш точне, але без доступу до файлової системи" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Значення umask, вказане у sudoers, перевизначатиме значення користувача, навіть якщо це значення відкриває ширший доступ" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "Записувати дані, вказані користувачем під час виконання команди" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "Записувати дані, виведені командою під час виконання" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "Стискати журнали за допомогою zlib" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "Завжди запускати команди у псевдо-tty" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Додаток для підтримки не-Unix груп: %s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Каталог, у якому слід зберігати журнали введення/виведення: %s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Файл, у якому слід зберігати журнал введення/виведення даних: %s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Додати запис до файла utmp/utmpx під час розміщення pty" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Встановити користувача у utmp у значення користувача, від імені якого виконується команда" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Набір дозвільних прав доступу: %s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Набір обмежувальних прав доступу: %s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "Виконувати команди у pty у фоновому режимі" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Назва служби PAM, якою слід скористатися: %s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Назва служби PAM, якою слід скористатися для оболонок входу до системи: %s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Спробувати встановити реєстраційні дані PAM для користувача, від імені якого виконуватимуться дії" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "Створити сеанс PAM для виконання команди" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "Виконати керування коректністю облікового запису PAM" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "Максимальний номер у послідовності журналу введення-виведення: %s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "Увімкнути підтримку мережевих груп у sudoers" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Перевіряти можливість запису до батьківського каталогу під час редагування фалів за допомогою sudoedit" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Переходити за символічними посиланнями під час редагування файлів за допомогою sudoedit" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "Надсилати запит до додатка груп щодо невідомих груп системи" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Встановлювати відповідність мережевим групам за усім кортежем даних: користувачем, вузлом і доменом" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Дозволити виконання команд, навіть якщо sudo не може здійснювати запис до журналу аудиту" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Дозволити виконання команд, навіть якщо sudo не може здійснювати запис до журналу введення-виведення" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Дозволити виконання команд, навіть якщо sudo не може здійснювати запис до файла журналу" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Визначати групи у sudoers і встановлювати відповідність не назві, а ідентифікатору групи" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Записи журналу, які виявляться довшими за це значення, буде поділено на декілька повідомлень журналу системи: %u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Користувач, який буде власником усіх файлів журналу введення-виведення: %s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Група, яка буде власником усіх файлів журналу введення-виведення: %s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Режим доступу до файлів, яким слід скористатися для файлів журналу введення-виведення: 0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Виконати команди за дескриптором файла замість виконання за шляхом: %s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ігнорувати невідомі записи Defaults у sudoers замість показу попередження" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Час у секундах, який має минути, щоб команду буде перервано: %u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Надати змогу користувачеві встановлювати час очікування у командному рядку" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Скидати дані журналу введення-виведення на диск негайно, без буферизації" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "Включати ідентифікатор процесу до журналів syslog" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Тип запису часової позначки розпізнавання: %s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Повідомлення про помилку розпізнавання: %s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "Ігнорувати регістр символів при пошуку імен користувачів" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "Ігнорувати регістр символів при пошуку назв груп" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "Записувати до журналу дані, коли виконання команди дозволене sudoers" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "Записувати до журналу дані, коли виконання команди заборонене sudoers" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "Сервер або сервери журналу sudo, з якими слід встановити з'єднання, з необов'язковим зазначенням порту" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Час очікування на дії сервера журналу sudo у секундах: %u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "Увімкнути параметр сокета SO_KEEPALIVE на сокеті, який з'єднано із сервером журналу" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "Шлях до файла пакета CA сервера аудиту: %s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "Шлях до файла сертифікатів sudoers: %s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "Шлях до файла закритого ключа sudoers: %s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "Перевірити, чи є сертифікат сервера журналювання чинним" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "Дозволити використання невідомих значень імені користувача і/або ідентифікатора групи для runas" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "Дозволяти виконання команд лише від імені користувачів із коректним записом командної оболонки" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "Встановити для віддаленого користувача PAM те саме ім'я, що і для користувача, від імені якого запущено sudo" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "Встановити для віддаленого вузла PAM назву локального вузла" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "Робочий каталог, до якого слід перейти перед виконанням команди: %s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "Кореневий каталог, до якого слід перейти перед виконанням команди: %s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "Формат журналу: %s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: невідомий запис типових параметрів, «%s»" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: невідомий запис типових параметрів, «%s»" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: не вказано значення для «%s»" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: не вказано значення для «%s»" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: параметру «%s» не потрібно передавати значення" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: параметру «%s» не потрібно передавати значення" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d:%d: некоректний тип Defaults, 0x%x, для параметра «%s»" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: некоректний тип Defaults, 0x%x, для параметра «%s»" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: значення «%s» є некоректним для параметра «%s»" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: значення «%s» є некоректним для параметра «%s»" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: значення для «%s» має починатися з «/», «~» або «*»" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: значення для «%s» має починатися з «/», «~» або «*»" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: значення для «%s» має починатися з «/»" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: значення для «%s» має починатися з «/»" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: помилкове значення envp, невідповідність довжин" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "не вдалося перебудувати середовище" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "вибачте, вам не дозволено встановлювати такі змінні середовища: %s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "помилка обробки у %s поблизу рядка %d" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "помилка обробки у %s" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "непідтримуваний тип контрольної суми, %d, для %s" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s: помилка читання" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s має належати користувачеві з uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s має бути доступним до запису лише для власника" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "не вдалося завантажити %s: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "не вдалося знайти символ «group_plugin» у %s" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: несумісна основна версія додатка обробки груп %d, мало бути — %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "не вдалося обробити IP-адресу «%s»" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "не вдалося обробити маску мережі «%s»" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "Пари локальних IP-адрес і масок мережі:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "невідома група: %s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "не вдалося оновити файл послідовності" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "не вдалося здійснити запис до файла журналу введення-виведення: %s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "не вдалося створити %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: внутрішня помилка, файл журналу введення-виведення для події %d не відкрито" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "не вдалося прочитати час на годиннику" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: внутрішня помилка, некоректний сигнал %d" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "підтримки starttls, якщо використовується ldaps, не передбачено" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "не вдалося ініціалізувати базу даних сертифікатів і ключів SSL: %s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "щоб скористатися SSL, вам слід встановити для TLS_CERT значення %s" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "не вдалося ініціалізувати LDAP: %s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls вказано, але у бібліотеках LDAP не передбачено підтримки ldap_start_tls_s() або ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "некоректний атрибут sudoOrder: %s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s: порт є надто великим" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "непідтримуваний тип адреси LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "не можна використовувати суміш з адрес ldap і ldaps" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "не вдалося перетворити запис sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "не вдалося відкрити систему аудита" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "не вдалося надіслати повідомлення аудита" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "помилка у циклі обробки подій" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "Не вдалося створити об'єкт SSL_CTX: %s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "Не вдалося встановити з'єднання TLS із %s:%s: %s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "Спроба ініціалізувати TLS завершилася невдало" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "Спроба узгодити зв'язок TLS завершилася невдало" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s: внутрішня помилка, некоректний стан виходу %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "втрачено зв’язок з сервером журналу" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "не вказано буфер запису" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "не вдалося встановити з'єднання із сервером журналу" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "користувача немає у списку sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "користувача не уповноважено на дії на вузлі" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "виконання команди заборонено" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s немає у файлі sudoers. Запис про подію додано до звіту.\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s заборонено виконувати sudo на %s. Запис про подію додано до звіту.\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Вибачте, користувач %s не має права виконувати sudo на %s.\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Вибачте, користувач %s не має права виконувати «%s%s%s» від імені %s%s%s на %s.\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s: команду не знайдено" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"пропущено «%s» знайдений у «.»\n" +"Скористайтеся командою «sudo ./%s», якщо вам потрібно виконати саме «%s»." + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u невдала спроба введення пароля" +msgstr[1] "%u невдалих спроби введення пароля" +msgstr[2] "%u невдалих спроб введення пароля" +msgstr[3] "одна невдала спроба введення пароля" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "помилка під час спроби розпізнавання" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "слід вказати пароль" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "не вдалося відкрити файл журналу: %s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "не вдалося виконати запис до файла журналу: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "контрольну суму для %s (%s) подано не у формі %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Роль LDAP: %s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Запис sudoers:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " Користувачі для запуску: " + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " Групи для запуску: " + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " Параметри: " + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " Команди:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Відповідність записів Defaults для %s на %s:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Типові значення для запуску від імені і команд для %s:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Користувач %s має право виконувати на %s такі команди:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Користувач %s не має права виконувати sudo на %s.\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ігноруємо неповний запис sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "некоректний атрибут LDIF: %s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "оболонкою sudo встановлено некоректне значення параметра %.*s" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "не вдалося обробити список мережевих адрес" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "ім'я користувача не встановлено за допомогою оболонки sudo" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "ідентифікатор користувача не встановлено за допомогою оболонки sudo" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "ідентифікатор групи не встановлено за допомогою оболонки sudo" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "назву вузла не встановлено за допомогою оболонки sudo" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "некоректний робочий каталог: %s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "некоректний каталог chroot: %s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "не вдалося виконати %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Додаток правил sudoers версії %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Граматична перевірка файла sudoers версії %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Шлях до sudoers: %s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "Шлях до nsswitch: %s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "Шлях до ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "Шлях до ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "неможливо зареєструвати процедуру перехоплення типу %d (версія %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "не вдалося кешувати uid %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "не вдалося кешувати uid %u, запис вже існує" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "не вдалося кешувати користувача %s" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "не вдалося кешувати користувача %s, запис вже існує" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "не вдалося кешувати gid %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "не вдалося кешувати gid %u, запис вже існує" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "не вдалося кешувати групу %s" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "не вдалося кешувати групу %s, запис вже існує" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "не вдалося кешувати список груп %s, запис вже існує" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "не вдалося кешувати список груп %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "не вдалося обробити записи груп %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "не вдалося обробити записи ідентифікаторів груп %s" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "переповнення стека доступу" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "вичерпання стека доступу" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "не вдалося змінити ідентифікатор групи (gid) root" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "не вдалося змінити gid на runas" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "не вдалося встановити вектор групи виконання" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "не вдалося змінити uid на runas" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "не вдалося змінити gid на sudoers" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "забагато процесів" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "не вдалося отримати поточний робочий каталог" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "обрізаний шлях аудиту user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "обрізаний шлях аудиту argv[0]: %s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "Не вдалося ініціалізувати джерело SSS. Чи встановлено у вашій системі SSSD?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "не вдалося знайти символ «%s» у %s" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "проблема з типовими записами" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "не знайдено коректних джерел даних sudoers, завершення роботи" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "користувачеві заборонено змінювати кореневий каталог на %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "вам не дозволено використовувати параметр -R з %s" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "користувачеві заборонено змінювати каталог на %s" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "вам не дозволено використовувати параметр -D з %s" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers вказує, що sudo не можна користуватися для виконання команд від root" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "користувачеві заборонено перевизначати обмеження closefrom" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "вам не дозволено використовувати параметр -C" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "власник часового штампа (%s): не знайдено користувача з таким іменем" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "немає tty" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "вибачте, для виконання sudo вашому користувачеві потрібен tty" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "некоректний запис оболонки для користувача %s: %s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "команда у поточному каталозі" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "користувачеві заборонено встановлювати час очікування на виконання команди" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "вибачте, вам не дозволено встановлювати час очікування на виконання команди" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "користувачеві заборонено зберігати середовище" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "вибачте, вам не дозволено зберігати середовище" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "надто довга команда" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "Немає потреби у запуску sudoedit за допомогою sudo" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "не вдалося прочитати %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "не вдалося виконати stat для %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s не є звичайним файлом" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s належить uid %u, має належати %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "Запис до «%s» можливий для довільного користувача" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s належить gid %u, має належати %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "використовувати «-c %s» може лише root" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "невідомий клас входу: %s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "не вдалося визначити адресу вузла %s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "некоректний параметр фільтрування: %s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "некоректне значення макс. очікування: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "некоректний коефіцієнт швидкості: %s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/розклад за часом: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Відтворення сеансу sudo: %s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "не вдалося перевести tty у режим без обробки даних" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Попередження: розміри вашого термінала є замалими для належного показу журналу.\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Встановлено формат журналу %d x %d, тоді як формат термінала — %d x %d." + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Відтворення завершено, натисніть будь-яку клавішу, щоб повернутися до термінала." + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "неоднозначний вираз «%s»" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "зайва дужка, «)», у виразі" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "невідомий ключ пошуку «%s»" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s потребує визначення аргументу" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "некоректний формальний вираз: %s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "не вдалося обробити дату «%s»" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "зайва дужка, «(», у виразі" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "помилкове завершальне «or»" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "помилкове завершальне «!»" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "невідомий тип пошуку %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "користування: %s [-hnRS] [-d каталог] [-m число] [-s число] ідентифікатор\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "використання: %s [-h] [-d каталог] -l [вираз для пошуку]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s — відтворення журналів сеансів sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Параметри:\n" +" -d, --directory=каталог вказати каталог для журналів сеансу\n" +" -f, --filter=фільтр вказати, який тип вводу-виводу слід показувати\n" +" -h, --help показати довідкове повідомлення і завершити роботу\n" +" -l, --list показати список можливих ідентифікаторів сеансів, відповідних до виразу\n" +" -m, --max-wait=макс_очік максимальний час (у секундах) очікування між подіями\n" +" -n, --non-interactive на надсилати запитів, сеанс роботи буде надіслано до стандартного виведення\n" +" -R, --no-resize не намагатися змінити розміри термінала\n" +" -S, --suspend-wait очікувати, доки виконання команди призупинено\n" +" -s, --speed=коеф_швидк коефіцієнт прискорення або сповільнення виводу даних\n" +" -V, --version показати дані щодо версії і завершити роботу" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\tвідповідника вузла не знайдено" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Команду дозволено" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Команду заборонено" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Не знайдено відповідника команди" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s доступний до запису учасниками групи" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "не вдалося обрізати файл часової позначки до %lld байтів" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "ігноруємо часову позначку з майбутнього" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "занадто далека часова позначка у майбутньому: %20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "не вдалося заблокувати файл часової позначки %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "шлях до даних щодо стану отримання настанов є занадто довгим: %s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit не слід вказувати разом із шляхом" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "параметр -x буде вилучено у наступному випуску" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "будь ласка, скористайтеся замість нього програмою cvtsudoers" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "натисніть Enter для редагування %s: " + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "вказаного редактора (%s) не існує" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "не знайдено жодного редактора (шлях до редактора = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "помилка запису" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "не вдалося обробити stat файл тимчасових даних (%s), %s не змінено" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "файл тимчасових даних має нульовий об’єм (%s), %s не змінено" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "помилка редактора (%s), %s не змінено" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s не змінено" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "не вдалося повторно відкрити файл тимчасових даних (%s), %s не змінено." + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "не вдалося обробити файл тимчасових даних (%s), невідома помилка" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "внутрішня помилка, не вдалося знайти %s у списку!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "не вдалося встановити (uid, gid) %s у значення (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s і %s не перебувають у одній файловій системі, використовуємо mv для перейменування" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "помилка команди: «%s %s %s», %s не змінено" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "помилка перейменування %s, %s не змінено" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "А зараз що? " + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Параметри:\n" +" (e) — повторне редагування файла sudoers\n" +" (x) — вийти без внесення змін до файла sudoers\n" +" (Q) — вийти зі збереженням файла sudoers (НЕБЕЗПЕЧНО!)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "не вдалося виконати %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: помилковий власник (uid, gid), має бути (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: помилкові права доступу, режим доступу має бути 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: вдала обробка\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s зайнято, повторіть спробу пізніше" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "не вдалося заблокувати %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "Редагувати попри усе? [y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Помилка: %s:%d:%d: цикл у %s «%s»" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "Попередження: %s:%d:%d: цикл у %s «%s»" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Помилка: виявлено посилання %s:%d:%d: %s «%s», яке не визначено" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "Попередження: виявлено посилання %s:%d:%d: %s «%s», яке не визначено" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "Попередження: %s:%d:%d: не використано %s «%s»" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s — безпечне редагування файла sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Параметри:\n" +" -c, --check режим лише перевірки\n" +" -f, --file=файл вказати розташування файла sudoers\n" +" -h, --help показати довідкове повідомлення і завершити роботу\n" +" -q, --quiet стислі повідомлення щодо синтаксичних помилок\n" +" -s, --strict строга перевірка синтаксису\n" +" -V, --version показати дані щодо версії і завершити роботу\n" + +#: toke.l:179 +msgid "empty string" +msgstr "порожній рядок" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "порожня група" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "порожня мережева група" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "некоректне продовження рядка" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "некоректна адреса IPv6" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "неочікуваний розрив рядків у рядку" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "занадто високий рівень вкладеності" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "Попередньо завантажувати фіктивні функції виконання з бібліотеки sudo_noexec" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "не вдалося заблокувати файл журналу: %s" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports: занадто великий номер порту" diff --git a/plugins/sudoers/po/vi.mo b/plugins/sudoers/po/vi.mo new file mode 100644 index 0000000..b0901ab Binary files /dev/null and b/plugins/sudoers/po/vi.mo differ diff --git a/plugins/sudoers/po/vi.po b/plugins/sudoers/po/vi.po new file mode 100644 index 0000000..0cc0095 --- /dev/null +++ b/plugins/sudoers/po/vi.po @@ -0,0 +1,2502 @@ +# Vietnamese translation for sudo. +# Bản dịch tiếng Việt dành cho sudo. +# This file is put in the public domain. +# Trần Ngọc Quân , 2012-2014, 2015, 2016, 2017, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.26b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-10-29 08:31-0600\n" +"PO-Revision-Date: 2018-11-01 14:10+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" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Language-Team-Website: \n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "lỗi cú pháp" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Mật khẩu của %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] mật khẩu dành cho %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Mật khẩu: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Thông tin AN NINH cho %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Rất tiếc, hãy thử lại." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:308 gram.y:315 gram.y:322 gram.y:329 gram.y:336 +#: gram.y:399 gram.y:407 gram.y:417 gram.y:450 gram.y:457 gram.y:464 +#: gram.y:471 gram.y:553 gram.y:560 gram.y:569 gram.y:578 gram.y:595 +#: gram.y:707 gram.y:714 gram.y:721 gram.y:729 gram.y:829 gram.y:836 +#: gram.y:843 gram.y:850 gram.y:857 gram.y:883 gram.y:890 gram.y:897 +#: gram.y:1020 gram.y:1294 plugins/sudoers/alias.c:130 +#: plugins/sudoers/alias.c:137 plugins/sudoers/alias.c:153 +#: plugins/sudoers/auth/bsdauth.c:146 plugins/sudoers/auth/kerb5.c:121 +#: plugins/sudoers/auth/kerb5.c:147 plugins/sudoers/auth/pam.c:524 +#: plugins/sudoers/auth/rfc1938.c:114 plugins/sudoers/auth/sia.c:62 +#: plugins/sudoers/cvtsudoers.c:123 plugins/sudoers/cvtsudoers.c:164 +#: plugins/sudoers/cvtsudoers.c:181 plugins/sudoers/cvtsudoers.c:192 +#: plugins/sudoers/cvtsudoers.c:304 plugins/sudoers/cvtsudoers.c:432 +#: plugins/sudoers/cvtsudoers.c:565 plugins/sudoers/cvtsudoers.c:582 +#: plugins/sudoers/cvtsudoers.c:645 plugins/sudoers/cvtsudoers.c:760 +#: plugins/sudoers/cvtsudoers.c:768 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_ldif.c:152 plugins/sudoers/cvtsudoers_ldif.c:195 +#: plugins/sudoers/cvtsudoers_ldif.c:242 plugins/sudoers/cvtsudoers_ldif.c:261 +#: plugins/sudoers/cvtsudoers_ldif.c:332 plugins/sudoers/cvtsudoers_ldif.c:387 +#: plugins/sudoers/cvtsudoers_ldif.c:395 plugins/sudoers/cvtsudoers_ldif.c:412 +#: plugins/sudoers/cvtsudoers_ldif.c:421 plugins/sudoers/cvtsudoers_ldif.c:568 +#: plugins/sudoers/defaults.c:661 plugins/sudoers/defaults.c:954 +#: plugins/sudoers/defaults.c:1125 plugins/sudoers/editor.c:70 +#: plugins/sudoers/editor.c:88 plugins/sudoers/editor.c:99 +#: plugins/sudoers/env.c:247 plugins/sudoers/filedigest.c:64 +#: plugins/sudoers/filedigest.c:80 plugins/sudoers/gc.c:57 +#: plugins/sudoers/group_plugin.c:136 plugins/sudoers/interfaces.c:76 +#: plugins/sudoers/iolog.c:939 plugins/sudoers/iolog_path.c:172 +#: plugins/sudoers/iolog_util.c:83 plugins/sudoers/iolog_util.c:122 +#: plugins/sudoers/iolog_util.c:131 plugins/sudoers/iolog_util.c:141 +#: plugins/sudoers/iolog_util.c:149 plugins/sudoers/iolog_util.c:153 +#: plugins/sudoers/ldap.c:183 plugins/sudoers/ldap.c:414 +#: plugins/sudoers/ldap.c:418 plugins/sudoers/ldap.c:430 +#: plugins/sudoers/ldap.c:721 plugins/sudoers/ldap.c:885 +#: plugins/sudoers/ldap.c:1233 plugins/sudoers/ldap.c:1660 +#: plugins/sudoers/ldap.c:1697 plugins/sudoers/ldap.c:1778 +#: plugins/sudoers/ldap.c:1913 plugins/sudoers/ldap.c:2014 +#: plugins/sudoers/ldap.c:2030 plugins/sudoers/ldap_conf.c:221 +#: plugins/sudoers/ldap_conf.c:252 plugins/sudoers/ldap_conf.c:304 +#: plugins/sudoers/ldap_conf.c:340 plugins/sudoers/ldap_conf.c:443 +#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:555 +#: plugins/sudoers/ldap_conf.c:588 plugins/sudoers/ldap_conf.c:680 +#: plugins/sudoers/ldap_conf.c:762 plugins/sudoers/ldap_util.c:508 +#: plugins/sudoers/ldap_util.c:564 plugins/sudoers/linux_audit.c:81 +#: plugins/sudoers/logging.c:195 plugins/sudoers/logging.c:511 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:573 +#: plugins/sudoers/logging.c:752 plugins/sudoers/logging.c:1010 +#: plugins/sudoers/match.c:725 plugins/sudoers/match.c:772 +#: plugins/sudoers/match.c:813 plugins/sudoers/match.c:841 +#: plugins/sudoers/match.c:929 plugins/sudoers/match.c:1009 +#: plugins/sudoers/parse.c:195 plugins/sudoers/parse.c:207 +#: plugins/sudoers/parse.c:222 plugins/sudoers/parse.c:234 +#: plugins/sudoers/parse_ldif.c:141 plugins/sudoers/parse_ldif.c:168 +#: plugins/sudoers/parse_ldif.c:237 plugins/sudoers/parse_ldif.c:244 +#: plugins/sudoers/parse_ldif.c:249 plugins/sudoers/parse_ldif.c:325 +#: plugins/sudoers/parse_ldif.c:336 plugins/sudoers/parse_ldif.c:342 +#: plugins/sudoers/parse_ldif.c:367 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:383 plugins/sudoers/parse_ldif.c:397 +#: plugins/sudoers/parse_ldif.c:564 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:619 plugins/sudoers/parse_ldif.c:679 +#: plugins/sudoers/parse_ldif.c:698 plugins/sudoers/parse_ldif.c:744 +#: plugins/sudoers/parse_ldif.c:754 plugins/sudoers/policy.c:502 +#: plugins/sudoers/policy.c:744 plugins/sudoers/prompt.c:98 +#: plugins/sudoers/pwutil.c:197 plugins/sudoers/pwutil.c:269 +#: plugins/sudoers/pwutil.c:346 plugins/sudoers/pwutil.c:520 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:656 +#: plugins/sudoers/pwutil.c:814 plugins/sudoers/pwutil.c:871 +#: plugins/sudoers/pwutil.c:916 plugins/sudoers/pwutil.c:974 +#: plugins/sudoers/sssd.c:152 plugins/sudoers/sssd.c:398 +#: plugins/sudoers/sssd.c:461 plugins/sudoers/sssd.c:505 +#: plugins/sudoers/sssd.c:552 plugins/sudoers/sssd.c:743 +#: plugins/sudoers/stubs.c:101 plugins/sudoers/stubs.c:109 +#: plugins/sudoers/sudoers.c:269 plugins/sudoers/sudoers.c:279 +#: plugins/sudoers/sudoers.c:288 plugins/sudoers/sudoers.c:330 +#: plugins/sudoers/sudoers.c:653 plugins/sudoers/sudoers.c:779 +#: plugins/sudoers/sudoers.c:823 plugins/sudoers/sudoers.c:1097 +#: plugins/sudoers/sudoers_debug.c:112 plugins/sudoers/sudoreplay.c:579 +#: plugins/sudoers/sudoreplay.c:582 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1459 plugins/sudoers/sudoreplay.c:1463 +#: plugins/sudoers/testsudoers.c:134 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/testsudoers.c:251 plugins/sudoers/testsudoers.c:585 +#: plugins/sudoers/timestamp.c:437 plugins/sudoers/timestamp.c:481 +#: plugins/sudoers/timestamp.c:958 plugins/sudoers/toke_util.c:57 +#: plugins/sudoers/toke_util.c:110 plugins/sudoers/toke_util.c:147 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:150 +#: plugins/sudoers/visudo.c:312 plugins/sudoers/visudo.c:318 +#: plugins/sudoers/visudo.c:428 plugins/sudoers/visudo.c:606 +#: plugins/sudoers/visudo.c:926 plugins/sudoers/visudo.c:1013 +#: plugins/sudoers/visudo.c:1102 toke.l:844 toke.l:945 toke.l:1102 +msgid "unable to allocate memory" +msgstr "không thể cấp phát bộ nhớ" + +#: gram.y:482 +msgid "a digest requires a path name" +msgstr "tóm lược yêu cầu một đối số là tên đường dẫn" + +#: gram.y:608 +msgid "invalid notbefore value" +msgstr "giá trị notbefore không hợp lệ" + +#: gram.y:616 +msgid "invalid notafter value" +msgstr "giá trị notafter không hợp lệ" + +#: gram.y:625 plugins/sudoers/policy.c:318 +msgid "timeout value too large" +msgstr "giá trị timeout quá lớn" + +#: gram.y:627 plugins/sudoers/policy.c:320 +msgid "invalid timeout value" +msgstr "giá trị timeout không hợp lệ" + +#: gram.y:1294 plugins/sudoers/auth/pam.c:354 plugins/sudoers/auth/pam.c:524 +#: plugins/sudoers/auth/rfc1938.c:114 plugins/sudoers/cvtsudoers.c:123 +#: plugins/sudoers/cvtsudoers.c:163 plugins/sudoers/cvtsudoers.c:180 +#: plugins/sudoers/cvtsudoers.c:191 plugins/sudoers/cvtsudoers.c:303 +#: plugins/sudoers/cvtsudoers.c:431 plugins/sudoers/cvtsudoers.c:564 +#: plugins/sudoers/cvtsudoers.c:581 plugins/sudoers/cvtsudoers.c:645 +#: plugins/sudoers/cvtsudoers.c:760 plugins/sudoers/cvtsudoers.c:767 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_ldif.c:151 +#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:241 +#: plugins/sudoers/cvtsudoers_ldif.c:260 plugins/sudoers/cvtsudoers_ldif.c:331 +#: plugins/sudoers/cvtsudoers_ldif.c:386 plugins/sudoers/cvtsudoers_ldif.c:394 +#: plugins/sudoers/cvtsudoers_ldif.c:411 plugins/sudoers/cvtsudoers_ldif.c:420 +#: plugins/sudoers/cvtsudoers_ldif.c:567 plugins/sudoers/defaults.c:661 +#: plugins/sudoers/defaults.c:954 plugins/sudoers/defaults.c:1125 +#: plugins/sudoers/editor.c:70 plugins/sudoers/editor.c:88 +#: plugins/sudoers/editor.c:99 plugins/sudoers/env.c:247 +#: plugins/sudoers/filedigest.c:64 plugins/sudoers/filedigest.c:80 +#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:136 +#: plugins/sudoers/interfaces.c:76 plugins/sudoers/iolog.c:939 +#: plugins/sudoers/iolog_path.c:172 plugins/sudoers/iolog_util.c:83 +#: plugins/sudoers/iolog_util.c:122 plugins/sudoers/iolog_util.c:131 +#: plugins/sudoers/iolog_util.c:141 plugins/sudoers/iolog_util.c:149 +#: plugins/sudoers/iolog_util.c:153 plugins/sudoers/ldap.c:183 +#: plugins/sudoers/ldap.c:414 plugins/sudoers/ldap.c:418 +#: plugins/sudoers/ldap.c:430 plugins/sudoers/ldap.c:721 +#: plugins/sudoers/ldap.c:885 plugins/sudoers/ldap.c:1233 +#: plugins/sudoers/ldap.c:1660 plugins/sudoers/ldap.c:1697 +#: plugins/sudoers/ldap.c:1778 plugins/sudoers/ldap.c:1913 +#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2030 +#: plugins/sudoers/ldap_conf.c:221 plugins/sudoers/ldap_conf.c:252 +#: plugins/sudoers/ldap_conf.c:304 plugins/sudoers/ldap_conf.c:340 +#: plugins/sudoers/ldap_conf.c:443 plugins/sudoers/ldap_conf.c:458 +#: plugins/sudoers/ldap_conf.c:555 plugins/sudoers/ldap_conf.c:588 +#: plugins/sudoers/ldap_conf.c:679 plugins/sudoers/ldap_conf.c:762 +#: plugins/sudoers/ldap_util.c:508 plugins/sudoers/ldap_util.c:564 +#: plugins/sudoers/linux_audit.c:81 plugins/sudoers/logging.c:195 +#: plugins/sudoers/logging.c:511 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:572 plugins/sudoers/logging.c:1010 +#: plugins/sudoers/match.c:724 plugins/sudoers/match.c:771 +#: plugins/sudoers/match.c:813 plugins/sudoers/match.c:841 +#: plugins/sudoers/match.c:929 plugins/sudoers/match.c:1008 +#: plugins/sudoers/parse.c:194 plugins/sudoers/parse.c:206 +#: plugins/sudoers/parse.c:221 plugins/sudoers/parse.c:233 +#: plugins/sudoers/parse_ldif.c:140 plugins/sudoers/parse_ldif.c:167 +#: plugins/sudoers/parse_ldif.c:236 plugins/sudoers/parse_ldif.c:243 +#: plugins/sudoers/parse_ldif.c:248 plugins/sudoers/parse_ldif.c:324 +#: plugins/sudoers/parse_ldif.c:335 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:366 plugins/sudoers/parse_ldif.c:378 +#: plugins/sudoers/parse_ldif.c:382 plugins/sudoers/parse_ldif.c:396 +#: plugins/sudoers/parse_ldif.c:564 plugins/sudoers/parse_ldif.c:593 +#: plugins/sudoers/parse_ldif.c:618 plugins/sudoers/parse_ldif.c:678 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:743 +#: plugins/sudoers/parse_ldif.c:753 plugins/sudoers/policy.c:132 +#: plugins/sudoers/policy.c:141 plugins/sudoers/policy.c:150 +#: plugins/sudoers/policy.c:176 plugins/sudoers/policy.c:303 +#: plugins/sudoers/policy.c:318 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:346 plugins/sudoers/policy.c:356 +#: plugins/sudoers/policy.c:400 plugins/sudoers/policy.c:410 +#: plugins/sudoers/policy.c:419 plugins/sudoers/policy.c:428 +#: plugins/sudoers/policy.c:502 plugins/sudoers/policy.c:744 +#: plugins/sudoers/prompt.c:98 plugins/sudoers/pwutil.c:197 +#: plugins/sudoers/pwutil.c:269 plugins/sudoers/pwutil.c:346 +#: plugins/sudoers/pwutil.c:520 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:656 plugins/sudoers/pwutil.c:814 +#: plugins/sudoers/pwutil.c:871 plugins/sudoers/pwutil.c:916 +#: plugins/sudoers/pwutil.c:974 plugins/sudoers/set_perms.c:392 +#: plugins/sudoers/set_perms.c:771 plugins/sudoers/set_perms.c:1155 +#: plugins/sudoers/set_perms.c:1481 plugins/sudoers/set_perms.c:1646 +#: plugins/sudoers/sssd.c:151 plugins/sudoers/sssd.c:398 +#: plugins/sudoers/sssd.c:461 plugins/sudoers/sssd.c:505 +#: plugins/sudoers/sssd.c:552 plugins/sudoers/sssd.c:743 +#: plugins/sudoers/stubs.c:101 plugins/sudoers/stubs.c:109 +#: plugins/sudoers/sudoers.c:269 plugins/sudoers/sudoers.c:279 +#: plugins/sudoers/sudoers.c:288 plugins/sudoers/sudoers.c:330 +#: plugins/sudoers/sudoers.c:653 plugins/sudoers/sudoers.c:779 +#: plugins/sudoers/sudoers.c:823 plugins/sudoers/sudoers.c:1097 +#: plugins/sudoers/sudoers_debug.c:111 plugins/sudoers/sudoreplay.c:579 +#: plugins/sudoers/sudoreplay.c:582 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1459 plugins/sudoers/sudoreplay.c:1463 +#: plugins/sudoers/testsudoers.c:134 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/testsudoers.c:251 plugins/sudoers/testsudoers.c:585 +#: plugins/sudoers/timestamp.c:437 plugins/sudoers/timestamp.c:481 +#: plugins/sudoers/timestamp.c:958 plugins/sudoers/toke_util.c:57 +#: plugins/sudoers/toke_util.c:110 plugins/sudoers/toke_util.c:147 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:150 +#: plugins/sudoers/visudo.c:312 plugins/sudoers/visudo.c:318 +#: plugins/sudoers/visudo.c:428 plugins/sudoers/visudo.c:606 +#: plugins/sudoers/visudo.c:926 plugins/sudoers/visudo.c:1013 +#: plugins/sudoers/visudo.c:1102 toke.l:844 toke.l:945 toke.l:1102 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Bí danh “%s” đã được định nghĩa rồi" + +#: plugins/sudoers/auth/bsdauth.c:73 +#, c-format +msgid "unable to get login class for user %s" +msgstr "không thể lấy lớp đăng nhập cho tài khoản %s" + +#: plugins/sudoers/auth/bsdauth.c:78 +msgid "unable to begin bsd authentication" +msgstr "không thể khởi chạy xác thực kiểu bsd" + +#: plugins/sudoers/auth/bsdauth.c:86 +msgid "invalid authentication type" +msgstr "kiểu xác thực không hợp lệ" + +#: plugins/sudoers/auth/bsdauth.c:95 +msgid "unable to initialize BSD authentication" +msgstr "không thể khởi tạo xác thực kiểu BSD" + +#: plugins/sudoers/auth/bsdauth.c:183 +msgid "your account has expired" +msgstr "tài khoản bạn đã hết hiệu lực" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "approval failed" +msgstr "gặp lỗi khi chấp thuận" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to read fwtk config" +msgstr "không thể đọc cấu hình fwtk" + +#: plugins/sudoers/auth/fwtk.c:62 +msgid "unable to connect to authentication server" +msgstr "không thể kết nối tới máy chủ xác thực" + +#: plugins/sudoers/auth/fwtk.c:68 plugins/sudoers/auth/fwtk.c:92 +#: plugins/sudoers/auth/fwtk.c:124 +msgid "lost connection to authentication server" +msgstr "mất kết nối đến máy phục vụ xác thực" + +#: plugins/sudoers/auth/fwtk.c:72 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"lỗi máy phục vụ xác thực:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:113 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: không thể chuyển đổi người ủy nhiệm sang chuỗi (“%s”): %s" + +#: plugins/sudoers/auth/kerb5.c:163 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: không thể phân tích “%s”: %s" + +#: plugins/sudoers/auth/kerb5.c:172 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: không thể phân giải bộ nhớ đệm “credential”: %s" + +#: plugins/sudoers/auth/kerb5.c:219 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: không thể phân bổ các tùy chọn: %s" + +#: plugins/sudoers/auth/kerb5.c:234 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: không thể lấy giấy ủy nhiệm: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: không thể khởi tạo bộ nhớ đệm “credential”: %s" + +#: plugins/sudoers/auth/kerb5.c:250 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: không thể cất giữ “credential” trong bộ nhớ tạm: %s" + +#: plugins/sudoers/auth/kerb5.c:314 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: không thể lấy tên máy chủ chính: %s" + +#: plugins/sudoers/auth/kerb5.c:328 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Không thể thẩm tra TGT! Gần như chắc chắn là bị tấn công!: %s" + +#: plugins/sudoers/auth/pam.c:113 +msgid "unable to initialize PAM" +msgstr "không thể khởi tạo PAM" + +#: plugins/sudoers/auth/pam.c:204 +#, c-format +msgid "PAM authentication error: %s" +msgstr "lỗi xác thực PAM: %s" + +#: plugins/sudoers/auth/pam.c:221 +msgid "account validation failure, is your account locked?" +msgstr "xác thực tài khoản gặp lỗi nghiêm trọng, có phải tài khoản của bạn đã bị khóa?" + +#: plugins/sudoers/auth/pam.c:229 +msgid "Account or password is expired, reset your password and try again" +msgstr "Mật khẩu hay tài khoản đã hết hạn sử dụng, hãy đặt lại mật khẩu của bạn và thử lại" + +#: plugins/sudoers/auth/pam.c:238 +#, c-format +msgid "unable to change expired password: %s" +msgstr "không thể thay đổi mật khẩu đã hết hạn: %s" + +#: plugins/sudoers/auth/pam.c:246 +msgid "Password expired, contact your system administrator" +msgstr "Mật khẩu đã hết hạn dùng, hãy liên lạc với người quản trị hệ thống của bạn" + +#: plugins/sudoers/auth/pam.c:250 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Tài khoản hết hạn hoặc cấu hình PAM không có phiên “tài khoản” cho sudo, hãy liên hệ với người quản trị hệ thống của bạn" + +#: plugins/sudoers/auth/pam.c:257 plugins/sudoers/auth/pam.c:262 +#, c-format +msgid "PAM account management error: %s" +msgstr "lỗi quản lý tài khoảnthực PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:102 plugins/sudoers/visudo.c:232 +#, c-format +msgid "you do not exist in the %s database" +msgstr "bạn không tồn tại trong cơ sở dữ liệu %s" + +#: plugins/sudoers/auth/securid5.c:75 +msgid "failed to initialise the ACE API library" +msgstr "gặp lỗi khi khởi tạo thư viện “ACE API”" + +#: plugins/sudoers/auth/securid5.c:101 +msgid "unable to contact the SecurID server" +msgstr "không thể liên lạc được với máy chủ SecurID" + +#: plugins/sudoers/auth/securid5.c:110 +msgid "User ID locked for SecurID Authentication" +msgstr "ID người dùng bị khóa với “SecurID Authentication”" + +#: plugins/sudoers/auth/securid5.c:114 plugins/sudoers/auth/securid5.c:165 +msgid "invalid username length for SecurID" +msgstr "sai chiều dài tên tài khoản cho SecurID" + +#: plugins/sudoers/auth/securid5.c:118 plugins/sudoers/auth/securid5.c:170 +msgid "invalid Authentication Handle for SecurID" +msgstr "sai Bộ Tiếp Hợp Xác Thực cho SecurID" + +#: plugins/sudoers/auth/securid5.c:122 +msgid "SecurID communication failed" +msgstr "Truyền thông với SecurID gặp lỗi" + +#: plugins/sudoers/auth/securid5.c:126 plugins/sudoers/auth/securid5.c:215 +msgid "unknown SecurID error" +msgstr "không hiểu lỗi SecurID" + +#: plugins/sudoers/auth/securid5.c:160 +msgid "invalid passcode length for SecurID" +msgstr "sai chiều dài passcode cho SecurID" + +#: plugins/sudoers/auth/sia.c:72 plugins/sudoers/auth/sia.c:127 +msgid "unable to initialize SIA session" +msgstr "không thể khởi tạo phiên SIA" + +#: plugins/sudoers/auth/sudo_auth.c:136 +msgid "invalid authentication methods" +msgstr "Phương thức xác thực không hợp lệ" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Phương thức xác thực không hợp lệ được biên dịch vào trong sudo! Bạn không thể pha trộn kiểu xác thực giữa standalone và non-standalone" + +#: plugins/sudoers/auth/sudo_auth.c:259 plugins/sudoers/auth/sudo_auth.c:309 +msgid "no authentication methods" +msgstr "chưa có phương thức xác thực" + +#: plugins/sudoers/auth/sudo_auth.c:261 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Ở đây không có phương thức xác thực nào được dịch vào trong sudo! Nếu bạn muốn tắt xác thực, sử dụng tùy chọn cấu hình --disable-authentication" + +#: plugins/sudoers/auth/sudo_auth.c:311 +msgid "Unable to initialize authentication methods." +msgstr "Không thể khởi tạo phương thức xác thực." + +#: plugins/sudoers/auth/sudo_auth.c:477 +msgid "Authentication methods:" +msgstr "Phương thức xác thực:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:215 +msgid "Could not determine audit condition" +msgstr "Không thể phân giải điều kiện audit" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:279 +msgid "unable to commit audit record" +msgstr "không thể chuyển giao bản ghi “audit”" + +#: plugins/sudoers/check.c:267 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Chúng tôi tin rằng bạn đã nhận được bài giảng từ Quản trị Hệ thống\n" +"nội bộ. Có thể tóm lược chúng lại thành một số điểm quan trọng sau:\n" +"\n" +" #1) Tôn trọng sự riêng tư của người khác.\n" +" #2) Nghĩ trước khi gõ một lệnh.\n" +" #3) Quyền lực lớn đi kèm với trách nhiệm lớn.\n" +"\n" + +#: plugins/sudoers/check.c:310 plugins/sudoers/check.c:320 +#: plugins/sudoers/sudoers.c:696 plugins/sudoers/sudoers.c:741 +#: plugins/sudoers/tsdump.c:124 +#, c-format +msgid "unknown uid: %u" +msgstr "không biết mã số người dùng: %u" + +#: plugins/sudoers/check.c:315 plugins/sudoers/iolog.c:253 +#: plugins/sudoers/policy.c:915 plugins/sudoers/sudoers.c:1136 +#: plugins/sudoers/testsudoers.c:225 plugins/sudoers/testsudoers.c:398 +#, c-format +msgid "unknown user: %s" +msgstr "không biết người dùng: %s" + +#: plugins/sudoers/cvtsudoers.c:198 +#, c-format +msgid "order increment: %s: %s" +msgstr "gia tăng thứ tự: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:214 +#, c-format +msgid "starting order: %s: %s" +msgstr "bắt đầu thứ tự: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:224 +#, c-format +msgid "order padding: %s: %s" +msgstr "đệm thứ tự: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:232 plugins/sudoers/sudoreplay.c:287 +#: plugins/sudoers/visudo.c:182 +#, c-format +msgid "%s version %s\n" +msgstr "%s phiên bản %s\n" + +#: plugins/sudoers/cvtsudoers.c:234 plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s grammar version %d\n" +msgstr "Ngữ pháp %s phiên bản %d\n" + +#: plugins/sudoers/cvtsudoers.c:251 plugins/sudoers/testsudoers.c:173 +#, c-format +msgid "unsupported input format %s" +msgstr "không hỗ trợ định dạng đầu vào %s" + +#: plugins/sudoers/cvtsudoers.c:266 +#, c-format +msgid "unsupported output format %s" +msgstr "không hỗ trợ định dạng đầu ra %s" + +#: plugins/sudoers/cvtsudoers.c:318 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: các tập tin đầu vào và đầu ra phải khác nhau" + +#: plugins/sudoers/cvtsudoers.c:334 plugins/sudoers/sudoers.c:172 +#: plugins/sudoers/testsudoers.c:264 plugins/sudoers/visudo.c:238 +#: plugins/sudoers/visudo.c:594 plugins/sudoers/visudo.c:917 +msgid "unable to initialize sudoers default values" +msgstr "không thể khởi giá trị mặc định sudoers" + +#: plugins/sudoers/cvtsudoers.c:420 plugins/sudoers/ldap_conf.c:433 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:479 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: không biết từ khóa: %s" + +#: plugins/sudoers/cvtsudoers.c:525 +#, c-format +msgid "invalid defaults type: %s" +msgstr "kiểu mặc định không hợp lệ: %s" + +#: plugins/sudoers/cvtsudoers.c:548 +#, c-format +msgid "invalid suppression type: %s" +msgstr "kiểu biểu thức không hợp lệ: %s" + +#: plugins/sudoers/cvtsudoers.c:588 plugins/sudoers/cvtsudoers.c:602 +#, c-format +msgid "invalid filter: %s" +msgstr "bộ lọc không hợp lệ: %s" + +#: plugins/sudoers/cvtsudoers.c:621 plugins/sudoers/cvtsudoers.c:638 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:1128 +#: plugins/sudoers/cvtsudoers_ldif.c:641 plugins/sudoers/iolog.c:411 +#: plugins/sudoers/iolog_util.c:72 plugins/sudoers/sudoers.c:903 +#: plugins/sudoers/sudoreplay.c:333 plugins/sudoers/sudoreplay.c:1425 +#: plugins/sudoers/timestamp.c:446 plugins/sudoers/tsdump.c:133 +#: plugins/sudoers/visudo.c:913 +#, c-format +msgid "unable to open %s" +msgstr "không thể mở “%s”" + +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/visudo.c:922 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "gặp lỗi khi phân tích tập tin %s, không rõ bị lỗi gì" + +#: plugins/sudoers/cvtsudoers.c:649 plugins/sudoers/visudo.c:939 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "lỗi cú pháp trong %s gần dòng %d\n" + +#: plugins/sudoers/cvtsudoers.c:652 plugins/sudoers/visudo.c:942 +#, c-format +msgid "parse error in %s\n" +msgstr "lỗi cú pháp trong %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/iolog.c:498 +#: plugins/sudoers/sudoreplay.c:1129 plugins/sudoers/timestamp.c:330 +#: plugins/sudoers/timestamp.c:333 +#, c-format +msgid "unable to write to %s" +msgstr "không thể ghi vào %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "%s - chuyển đổi giữa các định dạng các tập tin sudoers\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options:\n" +" -b, --base=dn DN cơ sở cho sudo truy vấn LDAP\n" +" -d, --defaults=deftypes chỉ chuyển đổi mặc định của kiểu đã cho\n" +" -e, --expand-aliases khai triển bí danh khi chuyển đổi\n" +" -f, --output-format=format đặt định dạng đầu ra: JSON, LDIF hay sudoers\n" +" -i, --input-format=format đặt định dạng đầu vào: LDIF hoặc sudoers\n" +" -I, --increment=số tổng gia tăng cho từng sudoOrder\n" +" -h, --help hiển thị trợ giúp rồi thoát\n" +" -m, --match=filter chỉ chuyển đổi những hạng mục khớp bộ lọc\n" +" -M, --match-local khớp lọc sử dụng cơ sở dữ liệu passwd và group người dùng\n" +" -o, --output=tập_tin_đầu_ra ghi sudoers đã chuyển đổi sang tập_tin_đầu_ra\n" +" -O, --order-start=số điểm đầu cho sudoOrder đầu tiên\n" +" -p, --prune-matches cắt bỏ những người dùng, nhóm và máy không khớp mẫu\n" +" -P, --padding=số đệm cơ sở cho gia tăng sudoOrder\n" +" -s, --suppress=sections chặn xuất cho từng phần cụ thể\n" +" -V, --version hiển thị phiên bản rồi thoát" + +#: plugins/sudoers/cvtsudoers_json.c:682 plugins/sudoers/cvtsudoers_json.c:718 +#: plugins/sudoers/cvtsudoers_json.c:936 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "không hiểu mục tin mặc định “%s”" + +#: plugins/sudoers/cvtsudoers_json.c:856 plugins/sudoers/cvtsudoers_json.c:871 +#: plugins/sudoers/cvtsudoers_ldif.c:306 plugins/sudoers/cvtsudoers_ldif.c:317 +#: plugins/sudoers/ldap.c:480 +msgid "unable to get GMT time" +msgstr "không thể lấy giờ quốc tế (GMT)" + +#: plugins/sudoers/cvtsudoers_json.c:859 plugins/sudoers/cvtsudoers_json.c:874 +#: plugins/sudoers/cvtsudoers_ldif.c:309 plugins/sudoers/cvtsudoers_ldif.c:320 +#: plugins/sudoers/ldap.c:486 +msgid "unable to format timestamp" +msgstr "không thể định dạng dấu-vết-thời-gian" + +#: plugins/sudoers/cvtsudoers_ldif.c:524 plugins/sudoers/env.c:309 +#: plugins/sudoers/env.c:316 plugins/sudoers/env.c:421 +#: plugins/sudoers/ldap.c:494 plugins/sudoers/ldap.c:725 +#: plugins/sudoers/ldap.c:1052 plugins/sudoers/ldap_conf.c:225 +#: plugins/sudoers/ldap_conf.c:315 plugins/sudoers/linux_audit.c:87 +#: plugins/sudoers/logging.c:1015 plugins/sudoers/policy.c:623 +#: plugins/sudoers/policy.c:633 plugins/sudoers/prompt.c:166 +#: plugins/sudoers/sudoers.c:845 plugins/sudoers/testsudoers.c:255 +#: plugins/sudoers/toke_util.c:159 +#, c-format +msgid "internal error, %s overflow" +msgstr "lỗi nội bộ, %s bị tràn" + +#: plugins/sudoers/cvtsudoers_ldif.c:593 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "Quá nhiều mục tin sudoers, tối đa là %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:636 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "biến môi trường SUDOERS_BASE chưa được đặt và tùy chọn chưa được đưa ra." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Trang bị Syslog nếu syslog được sử dụng cho việc ghi nhật ký: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Mức ưu tiên Syslog sẽ sử dụng khi người dùng đăng nhập thành công: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Mức ưu tiên Syslog sẽ sử dụng khi người dùng đăng nhập không thành công: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Đặt nhắc OTP (mật khẩu dùng một lần) tại dòng nó sở hữu" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Bỏ qua “.” trong biến $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Luôn gửi thư mỗi khi chạy lệnh sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Gửi thư nếu xác thực người dùng gặp lỗi" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Gửi thư nếu người dùng không ở trong sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Gửi thư nếu người dùng không có trong sudoers cho máy chủ này" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Gửi thư nếu người dùng không được phép chạy lệnh nào đó" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Gửi thư nếu người cố chạy lệnh nào đó" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Sử dụng dấu vết thời gian riêng rẽ cho từng cặp tkhoản/tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Hướng dẫn người dùng lần đầu tiên họ chạy lệnh sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "TẬP-TIN chứa thuyết trình về “sudo”: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Yêu cầu người dùng chứng thực theo mặc định" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Siêu người dùng (root) có thể chạy lệnh sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Ghi nhật ký tên-máy-chủ vào tập tin nhật ký (không dùng syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Ghi nhật ký năm vào tập tin nhật ký (không dùng syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Nếu lệnh sudo được triệu gọi mà không đưa ra tham số thì khởi chạy hệ vỏ" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Đặt biến $HOME cho người dùng đích khi sử dụng hệ vỏ (shell) với tùy chọn -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Luôn đặt biến $HOME cho thư mục cá nhân của người dùng đích" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Cho phép một số thông tin được thu thập để đưa ra các thông tin về lỗi hữu dụng" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Yêu cầu tên máy chủ dạng đầy đủ trong tập tin sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Lăng mạ người dùng khi họ nhập vào mật khẩu sai" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Chỉ cho phép người dùng chạy lệnh sudo nếu họ có tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo sẽ tôn trọng biến môi trường EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Hỏi mật khẩu của siêu người dùng, chứ không phải của người dùng" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Nhắc mật khẩu của người dùng runas_mặc_định, không phải của người dùng" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Nhắc mật khẩu của người dùng đích, không phải cái hiện tại" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Áp dụng mặc định trong lớp đăng nhập người dùng đích nếu ở đây có một" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Đặt biến môi trường LOGNAME và USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Chỉ đặt uid đang có hiệu lực cho người dùng đích, không sử dụng uid thật" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Không khởi tạo véc-tơ nhóm cho người dùng đích" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Độ dài mà tại đó các dòng trong tập tin nhật ký được ngắt dòng (0 là không ngắt dòng): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Thời gian chờ dấu vết thời gian xác thực tối đa: %.1f phút" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Thời gian chờ nhắc mật khẩu tối đa: %.1f phút" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Số lần nhập mật khẩu: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask để sử dụng hoặc 0777 để sử dụng của người dùng: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Đường dẫn tới tập tin nhật ký: “%s”" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Đường dẫn tới chương trình gửi thư (mail) %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Các cờ dành cho chương trình gửi thư (mail): %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Địa chỉ để gửi thư đến: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Địa chỉ dùng để gửi thư từ: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Chủ đề cho thư: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Mật khẩu không đúng: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Đường dẫn đến thư mục trạng thái thuyết trình: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Đường dẫn thư mục dấu vết thời gian xác thực: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Chủ sở hữu đường dẫn thư mục dấu vết thời gian xác thực: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Những tài khoản trong nhóm này được miễn mật khẩu và yêu cầu PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Lời nhắc nhập mật khẩu mặc định: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Nếu được đặt, lời nhắc mật khẩu sẽ đè lên dấu nhắc hệ thống trong mọi trường hợp." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Tài khoản mặc định chạy lệnh như là: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Giá trị dùng để ghi đè lên $PATH của người dùng: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Đường dẫn tới trình biên soạn để sử dụng cho lệnh visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Khi được yêu cầu mật khẩu cho “liệt kê” lệnh-giả: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Khi được yêu cầu mật khẩu cho lệnh-giả “verify” (“thẩm tra”): %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Tải trước các hàm thi hành giả được chứa trong thư viện sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Nếu thư mục LDAP đã bật, chúng tôi sẽ lờ đi tập tin sudoers phải không" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Các bộ mô tả tập tin >= %d sẽ bị đóng trước khi chạy một lệnh" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Nếu được đặt, người dùng có thể ghi đè lên giá trị của “closefrom” bằng tùy chọn -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Cho phép người dùng đặt biến môi trường tùy ý" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Đặt lại biến môi trường thành giá trị mặc định của chúng" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Các biến môi trường được kiểm tra xem có đúng mực không:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Các biến môi trường bị gỡ bỏ:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Các biến môi trường được giữ lại:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Vai trò SELinux được dùng trong ngữ cảnh an ninh mới: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Kiểu SELinux được dùng trong ngữ cảnh an ninh mới: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Đường dẫn tới tập tin môi trường đặc-tả-sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Đường dẫn tới tập tin môi trường đặc-tả-sudo-hạn-chế: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Miền địa phương sẽ sử dụng khi phân tích sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Cho phép sudo hỏi mật khẩu thậm chí ngay cả khi nó đã rõ ràng" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Cung cấp phản hồi ảo lúc nhắc mật khẩu khi đây là đầu nhập người dùng" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Sử dụng globbing kiểu nhanh hơn mà nó thì kém chính xác hơn nhưng lại không cần truy cập hệ thống tập tin" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Giá trị umask được chỉ định trong sudoers sẽ ghi đè lên giá trị này của người dùng, thậm chí nó còn dễ dãi hơn" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Ghi nhật ký kết xuất từ người dùng cho lệnh đang chạy" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Ghi lại nhật ký kết xuất của lệnh đang chạy" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Nén nhật ký V/R sử dụng định dạng zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Luôn chạy lệnh ở tty-giả" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Phần bổ sung cho hỗ trợ nhóm không-Unix: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Thư mục mà nó sẽ lưu nhật ký vào/ra: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Tập tin mà nó sẽ lưu nhật ký vào/ra: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Thêm một mục vào tập tin utmp/utmpx khi phân bổ một pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Đặt người dùng trong utmp thành người dùng runasr, không phải người dùng gọi" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Tập hợp các đặc quyền được phép: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Tập hợp các quyền bị giới hạn: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Chạy các câu lệnh trên một pty trong nền hệ thống" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Tên dịch vụ PAM được dùng: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Tên dịch vụ PAM được dùng cho các hệ vỏ đăng nhập: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Thử thiết lập ủy nhiệm PAM cho người dùng đích" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Tạo một phiên PAM mới để lệnh chạy với nó" + +#: plugins/sudoers/def_data.c:402 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Số lượng nhật ký I/O tối đa: %u" + +#: plugins/sudoers/def_data.c:406 +msgid "Enable sudoers netgroup support" +msgstr "Bật hỗ trợ nhóm-mạng “sudoers”" + +#: plugins/sudoers/def_data.c:410 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kiểm tra xem các thư mục cha có ghi được hay không khi sửa các tập tin bằng sudoedit" + +#: plugins/sudoers/def_data.c:414 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Theo các liên kết mềm khi sửa các tập tin bằng sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Query the group plugin for unknown system groups" +msgstr "Truy vấn các phần bổ sung nhóm cho các nhóm hệ thống chưa biết" + +#: plugins/sudoers/def_data.c:422 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Khớp nhóm mạng trên cơ sở toàn thể bộ dữ liệu : tài khoản, tên máy và tên miền" + +#: plugins/sudoers/def_data.c:426 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Cho phép các lệnh có thể chạy ngay cả khi sudo không thể ghi vào nhật ký audit" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Cho phép các lệnh có thể chạy ngay cả khi sudo không thể ghi vào nhật ký V/R" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Cho phép các lệnh có thể chạy ngay cả khi sudo không thể ghi vào tập tin nhật ký" + +#: plugins/sudoers/def_data.c:438 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Phân giải các nhóm trong sudoers và khớp dựa trên mã số nhóm, không phải là tên" + +#: plugins/sudoers/def_data.c:442 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Các mục tin của nhật ký lớn hơn giá trị này sẽ được chia thành nhiều chuỗi syslog nhỏ: %u" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Người mà sẽ sở hữu tập tin nhật ký V/R: %s" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Nhóm mà sẽ sở hữu tập tin nhật ký V/R: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Chế độ tập tin được dùng cho tập tin nhật ký V/R: 0%o" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Thực thi các lệnh theo bộ mô tả tập tin thay cho đường dẫn: %s" + +#: plugins/sudoers/def_data.c:462 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Bỏ qua các mục tin Mặc định chưa biết trong sudoers thay vì đưa ra cảnh báo" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Thời gian theo giây sau đó thì lệnh sẽ bị chấm dứt: %u" + +#: plugins/sudoers/def_data.c:470 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Cho phép người dùng chỉ định thời gian chờ dòng lệnh tối đa" + +#: plugins/sudoers/def_data.c:474 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Đẩy dữ liệu nhật ký V/R lên đĩa ngay lập tức thay vì nhớ đệm nó" + +#: plugins/sudoers/def_data.c:478 +msgid "Include the process ID when logging via syslog" +msgstr "Bao gồm mã số tiến trình khi ghi nhật ký thông qua syslog" + +#: plugins/sudoers/def_data.c:482 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Kiểu của bản ghi dấu vết thời gian xác thực: %s" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Thông tin xác thực gặp lỗi nghiêm trọng: %s" + +#: plugins/sudoers/def_data.c:490 +msgid "Ignore case when matching user names" +msgstr "Bỏ qua HOA/thường khi khớp tên người dùng" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching group names" +msgstr "Bỏ qua HOA/thường khi khớp tên nhóm" + +#: plugins/sudoers/defaults.c:229 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d không hiểu mục tin mặc định “%s”" + +#: plugins/sudoers/defaults.c:232 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: không hiểu mục tin mặc định “%s”" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d chưa chỉ ra giá trị cho “%s”" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: chưa chỉ ra giá trị cho “%s”" + +#: plugins/sudoers/defaults.c:298 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d giá trị cho “%s” phải bắt đầu bằng dấu “/”" + +#: plugins/sudoers/defaults.c:301 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: giá trị cho “%s” phải bắt đầu bằng dấu “/”" + +#: plugins/sudoers/defaults.c:323 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d tùy chọn “%s” không nhận giá trị" + +#: plugins/sudoers/defaults.c:326 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: tùy chọn “%s” không nhận giá trị" + +#: plugins/sudoers/defaults.c:351 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d kiểu Defaults không hợp lệ 0x%x cho tùy chọn “%s”" + +#: plugins/sudoers/defaults.c:354 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: kiểu Defaults không hợp lệ 0x%x cho tùy chọn “%s”" + +#: plugins/sudoers/defaults.c:364 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d giá trị “%s” là không hợp lệ đối với tùy chọn “%s”" + +#: plugins/sudoers/defaults.c:367 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: giá trị “%s” là không hợp lệ đối với tùy chọn “%s”" + +#: plugins/sudoers/env.c:390 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp sai hỏng, chiều dài không khớp" + +#: plugins/sudoers/env.c:1111 +msgid "unable to rebuild the environment" +msgstr "không thể xây dựng lại môi trường" + +#: plugins/sudoers/env.c:1185 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "rất tiếc, bạn không được phép đặt các biến môi trường sau đây: %1s" + +#: plugins/sudoers/file.c:114 +#, c-format +msgid "parse error in %s near line %d" +msgstr "lỗi phân tích trong %s gần dòng %d" + +#: plugins/sudoers/file.c:117 +#, c-format +msgid "parse error in %s" +msgstr "gặp lỗi phân tích trong %s" + +#: plugins/sudoers/filedigest.c:59 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "không hỗ trợ kiểu tóm lược %d dành cho %s" + +#: plugins/sudoers/filedigest.c:88 +#, c-format +msgid "%s: read error" +msgstr "%s: lỗi đọc" + +#: plugins/sudoers/group_plugin.c:88 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s phải được sở hữu bởi uid %d" + +#: plugins/sudoers/group_plugin.c:92 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s phải là những thứ chỉ có thể ghi bởi chủ sở hữu" + +#: plugins/sudoers/group_plugin.c:100 plugins/sudoers/sssd.c:561 +#, c-format +msgid "unable to load %s: %s" +msgstr "không thể tải %s: %s" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "không tìm thấy ký hiệu “group_plugin” trong %s" + +#: plugins/sudoers/group_plugin.c:111 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: phiên bản số lớn phần bổ sung nhóm không tương thích %d, mong đợi %d" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "không thể phân tích địa chỉ IP \"%s\"" + +#: plugins/sudoers/interfaces.c:89 plugins/sudoers/interfaces.c:106 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "không thể phân tích mặt nạ mạng \"%s\"" + +#: plugins/sudoers/interfaces.c:134 +msgid "Local IP address and netmask pairs:\n" +msgstr "Cặp địa chỉ IP và mặt nạ cục bộ:\n" + +#: plugins/sudoers/iolog.c:115 plugins/sudoers/mkdir_parents.c:80 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s có tồn tại nhưng nó không phải là một thư mục (0%o)" + +#: plugins/sudoers/iolog.c:140 plugins/sudoers/iolog.c:180 +#: plugins/sudoers/mkdir_parents.c:69 plugins/sudoers/timestamp.c:210 +#, c-format +msgid "unable to mkdir %s" +msgstr "không thể tạo thư mục “%s”" + +#: plugins/sudoers/iolog.c:184 plugins/sudoers/visudo.c:723 +#: plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "không thể chuyển đổi chế độ của %s thành 0%o" + +#: plugins/sudoers/iolog.c:292 plugins/sudoers/sudoers.c:1167 +#: plugins/sudoers/testsudoers.c:422 +#, c-format +msgid "unknown group: %s" +msgstr "không nhận ra nhóm: %s" + +#: plugins/sudoers/iolog.c:462 plugins/sudoers/sudoers.c:907 +#: plugins/sudoers/sudoreplay.c:840 plugins/sudoers/sudoreplay.c:1536 +#: plugins/sudoers/tsdump.c:143 +#, c-format +msgid "unable to read %s" +msgstr "không thể đọc %s" + +#: plugins/sudoers/iolog.c:577 plugins/sudoers/iolog.c:797 +#, c-format +msgid "unable to create %s" +msgstr "không thể tạo “%s”" + +#: plugins/sudoers/iolog.c:820 plugins/sudoers/iolog.c:1035 +#: plugins/sudoers/iolog.c:1111 plugins/sudoers/iolog.c:1205 +#: plugins/sudoers/iolog.c:1265 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "không thể ghi vào tập tin nhật ký V/R: %s" + +#: plugins/sudoers/iolog.c:1069 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: lỗi bên trong, tập tin nhật ký vào ra cho sự kiện %d chưa được mở" + +#: plugins/sudoers/iolog.c:1228 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: lỗi bên trong, tín hiệu %d không hợp lệ" + +#: plugins/sudoers/iolog_util.c:87 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: tập tin nhật ký không hợp lệ" + +#: plugins/sudoers/iolog_util.c:105 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: thiếu trường dấu vết thời gian" + +#: plugins/sudoers/iolog_util.c:111 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: dấu vết thời gian “%s”: %s" + +#: plugins/sudoers/iolog_util.c:118 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: thiếu trường tài khoản người dùng" + +#: plugins/sudoers/iolog_util.c:127 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: thiếu trường “runas user” (chạy với tư cách tài khoản này)" + +#: plugins/sudoers/iolog_util.c:136 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: thiếu trường “runas group” (chạy dưới danh nghĩa nhóm này)" + +#: plugins/sudoers/ldap.c:176 plugins/sudoers/ldap_conf.c:294 +msgid "starttls not supported when using ldaps" +msgstr "“starttls” chỉ được hỗ trợ khi dùng với “ldaps”" + +#: plugins/sudoers/ldap.c:247 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "không thể khởi tạo chứng nhận SSL và csdl khóa: %s" + +#: plugins/sudoers/ldap.c:250 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "bạn phải đặt TLS_CERT trong %s để sử dụng SSL" + +#: plugins/sudoers/ldap.c:1612 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "không thể khởi tạo LDAP: %s" + +#: plugins/sudoers/ldap.c:1648 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls được chỉ ra nhưng thư viện LDAP không hỗ trợ ldap_start_tls_s() hoặc ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1785 plugins/sudoers/parse_ldif.c:735 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "thuộc tính sudoOrder không hợp lệ: %s" + +#: plugins/sudoers/ldap_conf.c:203 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: cổng quá lớn" + +#: plugins/sudoers/ldap_conf.c:263 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "không hỗ trợ kiểu “LDAP uri”: %s" + +#: plugins/sudoers/ldap_conf.c:290 +msgid "unable to mix ldap and ldaps URIs" +msgstr "không thể trộn ldap và ldaps URIs" + +#: plugins/sudoers/ldap_util.c:454 plugins/sudoers/ldap_util.c:456 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "không thể chuyển đổi sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:57 +msgid "unable to open audit system" +msgstr "không thể mở hệ thống audit" + +#: plugins/sudoers/linux_audit.c:98 +msgid "unable to send audit message" +msgstr "không thể gửi thông tin audit" + +#: plugins/sudoers/logging.c:113 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:141 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (lệnh tiếp tục) %s" + +#: plugins/sudoers/logging.c:170 +#, c-format +msgid "unable to open log file: %s" +msgstr "không thể mở tập tin nhật ký: %s" + +#: plugins/sudoers/logging.c:178 +#, c-format +msgid "unable to lock log file: %s" +msgstr "không thể khóa tập tin nhật ký: %s" + +#: plugins/sudoers/logging.c:211 +#, c-format +msgid "unable to write log file: %s" +msgstr "không thể ghi vào tập tin nhật ký: %s" + +#: plugins/sudoers/logging.c:240 +msgid "No user or host" +msgstr "Không có tài khoản hay tên máy chủ" + +#: plugins/sudoers/logging.c:242 +msgid "validation failure" +msgstr "việc phê chuẩn thất bại" + +#: plugins/sudoers/logging.c:249 +msgid "user NOT in sudoers" +msgstr "tài khoản KHÔNG có trong sudoers" + +#: plugins/sudoers/logging.c:251 +msgid "user NOT authorized on host" +msgstr "tài khoản KHÔNG được cho phép sử dụng trên máy chủ" + +#: plugins/sudoers/logging.c:253 +msgid "command not allowed" +msgstr "lệnh không được phép" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s không trong tập tin sudoers. Sự việc này sẽ được báo cáo.\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s không được phép chạy lệnh sudo trên %s. Sự việc này sẽ được báo cáo.\n" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Rất tiếc, tài khoản %s không được chạy lệnh sudo trên %s.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Rất tiếc, tài khoản %s không được phép thi hành “%s%s%s” như là %s%s%s trên %s.\n" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:438 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:599 +#: plugins/sudoers/sudoers.c:601 +#, c-format +msgid "%s: command not found" +msgstr "%s: không tìm thấy lệnh" + +#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:434 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"đang bỏ qua “%s” được tìm thấy trong “.”\n" +"Sử dụng “sudo ./%s” nếu đây là “%s” bạn muốn chạy." + +#: plugins/sudoers/logging.c:354 +msgid "authentication failure" +msgstr "xác thực gặp lỗi nghiêm trọng" + +#: plugins/sudoers/logging.c:380 +msgid "a password is required" +msgstr "bắt buộc phải có mật khẩu" + +#: plugins/sudoers/logging.c:443 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "đã sai mật khẩu %u lần" + +#: plugins/sudoers/logging.c:666 +msgid "unable to fork" +msgstr "không thể tạo tiến trình con" + +#: plugins/sudoers/logging.c:674 plugins/sudoers/logging.c:726 +#, c-format +msgid "unable to fork: %m" +msgstr "không thể tạo tiến trình con: %m" + +#: plugins/sudoers/logging.c:716 +#, c-format +msgid "unable to open pipe: %m" +msgstr "không thể mở ống dẫn lệnh: %m" + +#: plugins/sudoers/logging.c:741 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "không thể dup (nhân đôi) stdin: %m" + +#: plugins/sudoers/logging.c:779 +#, c-format +msgid "unable to execute %s: %m" +msgstr "không thể thực thi %s: %m" + +#: plugins/sudoers/match.c:874 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "tóm lược cho %s (%s) không ở dạng thức %s" + +#: plugins/sudoers/mkdir_parents.c:75 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/visudo.c:421 plugins/sudoers/visudo.c:717 +#, c-format +msgid "unable to stat %s" +msgstr "không thể lấy thống kê %s" + +#: plugins/sudoers/parse.c:444 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Vai trò LDAP: %s\n" + +#: plugins/sudoers/parse.c:447 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Mục Sudoers:\n" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid " RunAsUsers: " +msgstr " ChạyVớiTưCáchNgườiDùng: " + +#: plugins/sudoers/parse.c:464 +#, c-format +msgid " RunAsGroups: " +msgstr " ChạyVớiTưCáchNhóm: " + +#: plugins/sudoers/parse.c:474 +#, c-format +msgid " Options: " +msgstr " Tùy chọn: " + +#: plugins/sudoers/parse.c:528 +#, c-format +msgid " Commands:\n" +msgstr " Lệnh:\n" + +#: plugins/sudoers/parse.c:719 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Các mục mặc định khớp cho %s trên máy %s:\n" + +#: plugins/sudoers/parse.c:737 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas và Đặc-tả-lệnh mặc định cho %s:\n" + +#: plugins/sudoers/parse.c:755 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Người dùng %s có thể chạy những lệnh sau trên máy %s:\n" + +#: plugins/sudoers/parse.c:770 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Tài khoản %s không được phép thi hành sudo trên %s.\n" + +#: plugins/sudoers/parse_ldif.c:145 +#, c-format +msgid "ignoring invalid attribute value: %s" +msgstr "bỏ qua giá trị thuộc tính không hợp lệ: %s" + +#: plugins/sudoers/parse_ldif.c:584 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "bỏ qua sudoRole chưa hoàn thiện: cn: %s" + +#: plugins/sudoers/policy.c:88 plugins/sudoers/policy.c:114 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s không hợp lệ đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:293 plugins/sudoers/testsudoers.c:278 +msgid "unable to parse network address list" +msgstr "không thể phân tích danh sách địa chỉ mạng" + +#: plugins/sudoers/policy.c:437 +msgid "user name not set by sudo front-end" +msgstr "tên người dùng không đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:441 +msgid "user ID not set by sudo front-end" +msgstr "mã số người dùng không đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:445 +msgid "group ID not set by sudo front-end" +msgstr "mã số nhóm không đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:449 +msgid "host name not set by sudo front-end" +msgstr "tên máy không đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:802 plugins/sudoers/visudo.c:220 +#: plugins/sudoers/visudo.c:851 +#, c-format +msgid "unable to execute %s" +msgstr "không thể thực thi %s" + +#: plugins/sudoers/policy.c:933 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Phiên bản của phần bổ sung chính sách Sudoers %s\n" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Phiên bản ngữ pháp tập tin Sudoers %d\n" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Đường dẫn Sudoers: %s\n" + +#: plugins/sudoers/policy.c:942 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "đường dẫn nsswitch: %s\n" + +#: plugins/sudoers/policy.c:944 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "đường dẫn ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "đường dẫn ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:978 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "không thể đăng ký móc kiểu %d (phiên bản %d.%d)" + +#: plugins/sudoers/pwutil.c:220 plugins/sudoers/pwutil.c:239 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "không thể lưu nhớ tạm uid %u, hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:233 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "không thể lưu nhớ tạm uid %u, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:293 plugins/sudoers/pwutil.c:311 +#: plugins/sudoers/pwutil.c:373 plugins/sudoers/pwutil.c:418 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "không thể lưu nhớ tạm tài khoản %s, hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:306 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "không thể lưu nhớ tạm tài khoản %s, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:537 plugins/sudoers/pwutil.c:556 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "không thể lưu nhớ tạm gid %u, đã hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:550 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "không thể lưu nhớ tạm gid %u, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:669 plugins/sudoers/pwutil.c:711 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "không thể lưu nhớ tạm nhóm %s, đã hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "không thể lưu nhớ tạm nhóm %s, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:837 plugins/sudoers/pwutil.c:889 +#: plugins/sudoers/pwutil.c:940 plugins/sudoers/pwutil.c:993 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "không thể lưu nhớ tạm danh sách nhóm cho %s, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:843 plugins/sudoers/pwutil.c:894 +#: plugins/sudoers/pwutil.c:946 plugins/sudoers/pwutil.c:998 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "không thể lưu nhớ tạm danh sách nhóm cho %s, đã hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:883 +#, c-format +msgid "unable to parse groups for %s" +msgstr "không thể phân tích nhóm cho %s" + +#: plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to parse gids for %s" +msgstr "không thể phân tích mã số nhóm cho %s" + +#: plugins/sudoers/set_perms.c:118 plugins/sudoers/set_perms.c:474 +#: plugins/sudoers/set_perms.c:917 plugins/sudoers/set_perms.c:1244 +#: plugins/sudoers/set_perms.c:1561 +msgid "perm stack overflow" +msgstr "ngăn xếp perm bị tràn" + +#: plugins/sudoers/set_perms.c:126 plugins/sudoers/set_perms.c:405 +#: plugins/sudoers/set_perms.c:482 plugins/sudoers/set_perms.c:784 +#: plugins/sudoers/set_perms.c:925 plugins/sudoers/set_perms.c:1168 +#: plugins/sudoers/set_perms.c:1252 plugins/sudoers/set_perms.c:1494 +#: plugins/sudoers/set_perms.c:1569 plugins/sudoers/set_perms.c:1659 +msgid "perm stack underflow" +msgstr "ngăn xếp stack tràn ngầm" + +#: plugins/sudoers/set_perms.c:185 plugins/sudoers/set_perms.c:528 +#: plugins/sudoers/set_perms.c:1303 plugins/sudoers/set_perms.c:1601 +msgid "unable to change to root gid" +msgstr "không thể thay đổi mã số nhóm của siêu người dùng root" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to change to runas gid" +msgstr "không thể thay đổi thành runas gid" + +#: plugins/sudoers/set_perms.c:279 plugins/sudoers/set_perms.c:630 +#: plugins/sudoers/set_perms.c:1059 plugins/sudoers/set_perms.c:1385 +msgid "unable to set runas group vector" +msgstr "không thể đặt véc-tơ nhóm runas" + +#: plugins/sudoers/set_perms.c:290 plugins/sudoers/set_perms.c:641 +#: plugins/sudoers/set_perms.c:1068 plugins/sudoers/set_perms.c:1394 +msgid "unable to change to runas uid" +msgstr "không thể thay đổi thành runas uid" + +#: plugins/sudoers/set_perms.c:308 plugins/sudoers/set_perms.c:659 +#: plugins/sudoers/set_perms.c:1084 plugins/sudoers/set_perms.c:1410 +msgid "unable to change to sudoers gid" +msgstr "không thể thay đổi thành mã số nhóm sudoers" + +#: plugins/sudoers/set_perms.c:392 plugins/sudoers/set_perms.c:771 +#: plugins/sudoers/set_perms.c:1155 plugins/sudoers/set_perms.c:1481 +#: plugins/sudoers/set_perms.c:1646 +msgid "too many processes" +msgstr "quá nhiều tiến trình" + +#: plugins/sudoers/solaris_audit.c:56 +msgid "unable to get current working directory" +msgstr "không thể lấy thư mục làm việc hiện tại" + +#: plugins/sudoers/solaris_audit.c:64 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "đã cắt ngắn đường dẫn audit user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:71 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "đã cắt ngắn đường dẫn audit argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:120 +msgid "audit_failure message too long" +msgstr "thông điệp audit_failure quá dài" + +#: plugins/sudoers/sssd.c:563 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "không thể khởi tạo nguồn SSS. SSSD đã được cài đặt trên máy của bạn chưa vậy?" + +#: plugins/sudoers/sssd.c:571 plugins/sudoers/sssd.c:580 +#: plugins/sudoers/sssd.c:589 plugins/sudoers/sssd.c:598 +#: plugins/sudoers/sssd.c:607 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "không thể tìm thấy ký hiệu “%s” trong %s" + +#: plugins/sudoers/sudoers.c:208 plugins/sudoers/sudoers.c:864 +msgid "problem with defaults entries" +msgstr "trục trặc với các mục mặc định" + +#: plugins/sudoers/sudoers.c:212 +msgid "no valid sudoers sources found, quitting" +msgstr "không có người dùng hợp lệ nào được tìm thấy, đang thoát ra" + +#: plugins/sudoers/sudoers.c:250 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers đã ghi rõ là siêu người dùng (root) không được phép chạy sudo" + +#: plugins/sudoers/sudoers.c:308 +msgid "you are not permitted to use the -C option" +msgstr "bạn không được phép sử dụng tùy chọn -C" + +#: plugins/sudoers/sudoers.c:355 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "người sở hữu dấu vết thời gian (%s): Không có người dùng nào như vậy" + +#: plugins/sudoers/sudoers.c:370 +msgid "no tty" +msgstr "không có tty" + +#: plugins/sudoers/sudoers.c:371 +msgid "sorry, you must have a tty to run sudo" +msgstr "rất tiếc, bạn phải có tty mới có thể chạy sudo" + +#: plugins/sudoers/sudoers.c:433 +msgid "command in current directory" +msgstr "lệnh trong thư mục hiện hành" + +#: plugins/sudoers/sudoers.c:452 +msgid "sorry, you are not allowed set a command timeout" +msgstr "rất tiếc, bạn không được phép đặt thời gian chờ lệnh tối đa" + +#: plugins/sudoers/sudoers.c:460 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "rất tiếc, bạn không được phép giữ lại môi trường" + +#: plugins/sudoers/sudoers.c:808 +msgid "command too long" +msgstr "lệnh quá dài" + +#: plugins/sudoers/sudoers.c:922 +#, c-format +msgid "%s is not a regular file" +msgstr "%s không phải tập tin thường" + +#: plugins/sudoers/sudoers.c:926 plugins/sudoers/timestamp.c:257 toke.l:965 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s được sở hữu bởi người dùng mang mã số %u, nên là %u" + +#: plugins/sudoers/sudoers.c:930 toke.l:970 +#, c-format +msgid "%s is world writable" +msgstr "%s ai ghi cũng được" + +#: plugins/sudoers/sudoers.c:934 toke.l:973 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s được sở hữu bởi nhóm mang mã số %u, nên là %u" + +#: plugins/sudoers/sudoers.c:967 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "chỉ có siêu người dùng (root) mới có thể sử dụng “-c %s”" + +#: plugins/sudoers/sudoers.c:986 +#, c-format +msgid "unknown login class: %s" +msgstr "không rõ lớp đăng nhập: %s" + +#: plugins/sudoers/sudoers.c:1069 plugins/sudoers/sudoers.c:1083 +#, c-format +msgid "unable to resolve host %s" +msgstr "không thể phân giải địa chỉ của máy %s" + +#: plugins/sudoers/sudoreplay.c:248 +#, c-format +msgid "invalid filter option: %s" +msgstr "tùy chọn lọc không hợp lệ: %s" + +#: plugins/sudoers/sudoreplay.c:261 +#, c-format +msgid "invalid max wait: %s" +msgstr "thời gian chờ tối đa không hợp lệ: %s" + +#: plugins/sudoers/sudoreplay.c:284 +#, c-format +msgid "invalid speed factor: %s" +msgstr "sai hệ số nhân tốc độ: %s" + +#: plugins/sudoers/sudoreplay.c:319 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/thời-gian: %s" + +#: plugins/sudoers/sudoreplay.c:325 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/thời-gian: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Đang chạy lại phiên sudo: %s" + +#: plugins/sudoers/sudoreplay.c:539 plugins/sudoers/sudoreplay.c:586 +#: plugins/sudoers/sudoreplay.c:783 plugins/sudoers/sudoreplay.c:892 +#: plugins/sudoers/sudoreplay.c:977 plugins/sudoers/sudoreplay.c:992 +#: plugins/sudoers/sudoreplay.c:999 plugins/sudoers/sudoreplay.c:1006 +#: plugins/sudoers/sudoreplay.c:1013 plugins/sudoers/sudoreplay.c:1020 +#: plugins/sudoers/sudoreplay.c:1168 +msgid "unable to add event to queue" +msgstr "không thể thêm sự kiện vào hàng đợi" + +#: plugins/sudoers/sudoreplay.c:654 +msgid "unable to set tty to raw mode" +msgstr "không thể đặt thiết bị tty chế độ thô (raw)" + +#: plugins/sudoers/sudoreplay.c:705 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Cảnh báo: thiết bị cuối quá nhỏ để có thể chạy nhật ký một cách đúng đắn.\n" + +#: plugins/sudoers/sudoreplay.c:706 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Định dạng của nhật ký là %d x %d, định dạng của thiết bị cuối là %d x %d." + +#: plugins/sudoers/sudoreplay.c:734 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Trình diễn lại đã kết thúc, vui lòng bấm một phím bất kỳ để hoàn lại thiết bị cuối." + +#: plugins/sudoers/sudoreplay.c:766 +#, c-format +msgid "invalid timing file line: %s" +msgstr "sai dòng ghi thời gian trong tập tin: %s" + +#: plugins/sudoers/sudoreplay.c:1202 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "biểu thức không rõ ràng “%s”" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "thiếu “)” trong biểu thức" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "không hiểu giới hạn tìm kiếm “%s”" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s yêu cầu một đối số" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1512 +#, c-format +msgid "invalid regular expression: %s" +msgstr "biểu thức chính quy không hợp lệ: %s" + +#: plugins/sudoers/sudoreplay.c:1275 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "không thể phân tích ngày tháng “%s”" + +#: plugins/sudoers/sudoreplay.c:1284 +msgid "unmatched '(' in expression" +msgstr "thiếu “(” trong biểu thức" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "illegal trailing \"or\"" +msgstr "thừa “or” ở cuối" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"!\"" +msgstr "thừa “!” ở cuối" + +#: plugins/sudoers/sudoreplay.c:1338 +#, c-format +msgid "unknown search type %d" +msgstr "không hiểu kiểu tìm kiếm “%d”" + +#: plugins/sudoers/sudoreplay.c:1605 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "cách dùng: %s [-hnRS] [-d thư-mục] [-m số] [-s số] ID\n" + +#: plugins/sudoers/sudoreplay.c:1608 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "cách dùng: %s [-h] [-d th.mục] -l [biểu thức tìm kiếm]\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - chạy lại nhật ký phiên sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1619 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Tùy chọn:\n" +" -d, --directory=th.mục chỉ định thư mục cho nhật ký phiên\n" +" -f, --filter=bộ-lọc chỉ định kiểu V/R để hiển thị\n" +" -h, --help hiển thị thông tin trợ giúp rồi thoát\n" +" -l, --list liệt kê ID phiên sẵn có, với biểu thức tùy chọn\n" +" -m, --max-wait=sô số giây tối đa sẽ chờ giữa hai sự kiện\n" +" -S, --suspend-wait chờ trong khi lệnh bị treo\n" +" -s, --speed=số tăng hoặc giảm tốc độ kết xuất\n" +" -V, --version hiển thị thông tin về phiên bản rồi thoát" + +#: plugins/sudoers/testsudoers.c:360 +msgid "\thost unmatched" +msgstr "\tmáy chủ không khớp" + +#: plugins/sudoers/testsudoers.c:363 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Lệnh được phép" + +#: plugins/sudoers/testsudoers.c:364 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Lệnh bị cấm" + +#: plugins/sudoers/testsudoers.c:364 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Lệnh không khớp" + +#: plugins/sudoers/timestamp.c:265 +#, c-format +msgid "%s is group writable" +msgstr "%s là người cùng nhóm được ghi" + +#: plugins/sudoers/timestamp.c:341 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "không thể cắt ngắn tập tin dấu-vết-thời-gian thành %lld byte" + +#: plugins/sudoers/timestamp.c:827 plugins/sudoers/timestamp.c:919 +#: plugins/sudoers/visudo.c:482 plugins/sudoers/visudo.c:488 +msgid "unable to read the clock" +msgstr "không thể đọc khóa" + +#: plugins/sudoers/timestamp.c:838 +msgid "ignoring time stamp from the future" +msgstr "bỏ qua dấu vết thời gian nằm ở thì tương lai" + +#: plugins/sudoers/timestamp.c:861 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "dấu vết thời gian nằm ở thì tương lai: %20.20s" + +#: plugins/sudoers/timestamp.c:983 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "không thể khóa tập tin dấu-vết-thời-gian %s" + +#: plugins/sudoers/timestamp.c:1027 plugins/sudoers/timestamp.c:1047 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "đường dẫn đến thư mục thuyết trình quá dài: %s/%s" + +#: plugins/sudoers/visudo.c:216 +msgid "the -x option will be removed in a future release" +msgstr "tùy chọn -x sẽ bị xóa bỏ trong tương lai" + +#: plugins/sudoers/visudo.c:217 +msgid "please consider using the cvtsudoers utility instead" +msgstr "vui lòng cân nhắc sử dụng tiện ích cvtsudoers để thay thế" + +#: plugins/sudoers/visudo.c:268 plugins/sudoers/visudo.c:650 +#, c-format +msgid "press return to edit %s: " +msgstr "bấm phím để trở về chỉnh sửa %s:" + +#: plugins/sudoers/visudo.c:329 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "trình biên soạn đã chỉ ra (%s) không tồn tại" + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "không tìm thấy trình biên soạn (đường dẫn của nó = %s)" + +#: plugins/sudoers/visudo.c:441 plugins/sudoers/visudo.c:449 +msgid "write error" +msgstr "lỗi ghi" + +#: plugins/sudoers/visudo.c:495 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "không thể lấy thống kê tập tin tạm (%s), %s không thay đổi gì." + +#: plugins/sudoers/visudo.c:502 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "tập tin tạm (%s) có kích cỡ bằng không, %s không thay đổi gì" + +#: plugins/sudoers/visudo.c:508 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "trình biên soạn (%s) gặp lỗi, %s không thay đổi gì" + +#: plugins/sudoers/visudo.c:530 +#, c-format +msgid "%s unchanged" +msgstr "%s không thay đổi" + +#: plugins/sudoers/visudo.c:589 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "không thể mở lại tập tin tạm (%s), %s không thay đổi gì." + +#: plugins/sudoers/visudo.c:601 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "không thể phân tích tập tin tạm (%s), lỗi chưa được biết" + +#: plugins/sudoers/visudo.c:639 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "lỗi hệ thống, không thể tìm thấy %s trong danh sách!" + +#: plugins/sudoers/visudo.c:719 plugins/sudoers/visudo.c:728 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "không thể đặt (uid, gid) của %s thành (%u, %u)" + +#: plugins/sudoers/visudo.c:751 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s và %s không ở trên cùng một hệ thống tập tin, sử dụng lệnh mv để đổi tên" + +#: plugins/sudoers/visudo.c:765 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "thực hiện lệnh gặp lỗi: “%s %s %s”, %s không thay đổi" + +#: plugins/sudoers/visudo.c:775 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "gặp lỗi khi đổi tên %s, %s không thay đổi" + +#: plugins/sudoers/visudo.c:796 +msgid "What now? " +msgstr "Vậy làm gì bây giờ? " + +#: plugins/sudoers/visudo.c:810 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Các tùy chọn là:\n" +" (e) sửa lại tập tin sudoers\n" +" (x) thoát ra mà không ghi lại tập tin sudoerse\n" +" (q) thoát ra và ghi lại tập tin sudoers (NGUY HIỂM!)\n" + +#: plugins/sudoers/visudo.c:856 +#, c-format +msgid "unable to run %s" +msgstr "không thể chạy %s" + +#: plugins/sudoers/visudo.c:886 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: sai sở hữu (uid, gid) đáng lẽ là (%u, %u)\n" + +#: plugins/sudoers/visudo.c:893 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: phân quyền sai, phải ở chế độ 0%o\n" + +#: plugins/sudoers/visudo.c:950 plugins/sudoers/visudo.c:957 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: vượt qua kiểm duyệt\n" + +#: plugins/sudoers/visudo.c:976 +#, c-format +msgid "%s busy, try again later" +msgstr "%s đang bận, hãy thử lại sau" + +#: plugins/sudoers/visudo.c:979 +#, c-format +msgid "unable to lock %s" +msgstr "không thể khóa %s" + +#: plugins/sudoers/visudo.c:980 +msgid "Edit anyway? [y/N]" +msgstr "Vẫn sửa? (có/KHÔNG) [y/N]" + +#: plugins/sudoers/visudo.c:1064 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Lỗi: %s:%d bị quẩn tròn trong %s “%s”" + +#: plugins/sudoers/visudo.c:1065 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Cảnh báo: %s:%d bị quẩn tròn trong %s “%s”" + +#: plugins/sudoers/visudo.c:1069 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Lỗi: %s:%d %s “%s” được tham chiếu nhưng chưa được định nghĩa" + +#: plugins/sudoers/visudo.c:1070 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Cảnh báo: %s:%d %s “%s” được tham chiếu nhưng chưa được định nghĩa" + +#: plugins/sudoers/visudo.c:1161 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Cảnh báo: %s:%d không dùng %s “%s”" + +#: plugins/sudoers/visudo.c:1276 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sửa tập tin sudoers một cách an toàn\n" +"\n" + +#: plugins/sudoers/visudo.c:1278 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Các tùy chọn:\n" +" -c, --check chế độ chỉ kiểm tra\n" +" -f, --file=tập-tin chỉ định vị trí tập tin sudoers\n" +" -h, --help hiển thị thông tin trợ giúp rồi thoát\n" +" -q, --quiet tối thiểu hóa các thông tin (quiet: im lặng)\n" +" -s, --strict kiểm tra cú pháp ngặt nghèo\n" +" -V, --version hiển thị thông tin về phiên bản rồi thoát\n" + +#: toke.l:939 +msgid "too many levels of includes" +msgstr "quá nhiều cấp bao gồm (include)" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Vai trò LDAP: KHÔNG HIỂU\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Thứ tự: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "Vai trò SSSD: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Vai trò SSSD: KHÔNG HIỂU\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Cảnh báo: quẩn tròn trong %s “%s”" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Cảnh báo: %s “%s” được tham chiếu nhưng chưa được định nghĩa" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Cảnh báo: chưa được dùng %s “%s”" + +#~ msgid "unable allocate memory" +#~ msgstr "không thể cấp phát bộ nhớ" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "đường dẫn dấu vết thời gian quá dài: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "không thể lấy thống kê trình biên soạn (%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: hết bộ nhớ để mở rộng hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: hết bộ nhớ để biên dịch “hostbuf”" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 phân bổ không khớp" + +#~ msgid "Password:" +#~ msgstr "Mật khẩu:" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "lỗi nội bộ: thiếu khoảng trống cho dòng ghi nhật ký" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: bộ đệm bị tràn" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s được sở hữu bởi uid %u, nên là %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s có thể được ghi bởi người không sở hữu nó (0%o), cần đặt chế độ 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s đã sẵn có nhưng không phải là một tập tin bình thường (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s có thể được ghi bởi người không sở hữu nó (0%o), cần đặt chế độ 0600" + +#~ msgid "unable to remove %s, will reset to the Unix epoch" +#~ msgstr "không thể gỡ bỏ %s, sẽ đặt lại thành thời điểm bắt đầu kiểu Unix" + +#~ msgid "unable to reset %s to the Unix epoch" +#~ msgstr "không thể đặt lại %s thành thời điểm bắt đầu kiểu Unix" + +#~ msgid "value out of range" +#~ msgstr "giá trị nằm ngoài phạm vi" + +#~ msgid "invalid uri: %s" +#~ msgstr "URI không hợp lệ: %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "không thể trộn ldaps và starttls" + +#~ msgid "writing to standard output" +#~ msgstr "ghi vào đầu ra tiêu chuẩn" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "có quá nhiều biểu thức trong dấu ngoặc đơn, tối đa là %d" + +#~ msgid "unable to setup authentication" +#~ msgstr "không thể cài đặt xác thực" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: gặp lỗi" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: gặp lỗi" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: gặp lỗi" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: gặp lỗi" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: gặp lỗi" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: gặp lỗi" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getauid failed" +#~ msgstr "getauid gặp lỗi" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "Không thể dlopen %s: %s" + +#~ msgid "invalid regex: %s" +#~ msgstr "biểu thức chính quy không hợp lệ: %s" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s gần dòng %d <<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "không thể đặt địa phương thành “%s”, sẽ dùng “C”" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Lệnh:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "không thể lưu nhớ tạm uid %u (%s), đã có sẵn rồi" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "không thể lưu nhớ tạm gid %u (%s), đã có sẵn rồi" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "không thể thực thi %s: %s" diff --git a/plugins/sudoers/po/zh_CN.mo b/plugins/sudoers/po/zh_CN.mo new file mode 100644 index 0000000..a2e4c9c Binary files /dev/null and b/plugins/sudoers/po/zh_CN.mo differ diff --git a/plugins/sudoers/po/zh_CN.po b/plugins/sudoers/po/zh_CN.po new file mode 100644 index 0000000..5c91d77 --- /dev/null +++ b/plugins/sudoers/po/zh_CN.po @@ -0,0 +1,3323 @@ +# Chinese simplified translation for sudoers. +# This file is put in the public domain. +# Wylmer Wang , 2011-2018 +# Boyuan Yang <073plan@gmail.com>, 2019, 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-29 15:59-0500\n" +"Last-Translator: Boyuan Yang <073plan@gmail.com>\n" +"Language-Team: Chinese (simplified) \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.4.2\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "语法错误" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p 的密码:" + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p 的密码:" + +#: confstr.sh:4 +msgid "Password: " +msgstr "密码:" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h 安全信息 ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "对不起,请重试。" + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "无法分配内存" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "摘要需要路径参数" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "“CWD”的值必须以“/”、“~”或“*”开头" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "“CHROOT”的值必须以“/”、“~”或“*”开头" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "语法错误,保留字 %s 被用作别名" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "无效的 notbefore 值" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "无效的 notafter 值" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "超时值过大" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "无效的超时值" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "内部错误,%s 溢出" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "无法 dup stdin:%m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "无法执行 %s:%m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "无法执行 fork" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "无法执行 fork:%m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "无法打开管道:%m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s:%s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s:(命令继续执行) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s 存在,但不是目录(0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "无法创建目录 %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "无法将 %s 的模式更改为 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "期望得到 JSON_STRING,但得到了 %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "名称中缺少双引号" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "期望得到 JSON_OBJECT,但得到了 %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "不匹配的右括号" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "未预期的数组" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "不匹配的右花括号" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "未预期的字符串" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "名称后缺少冒号" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "未预期的布尔值" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "未预期的数字" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u 无法解析 \"%s\"" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s:无效的日志文件" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s:缺少 时间戳 字段" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s:时间戳 %s:%s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s:缺少 用户 字段" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s:缺少 runas 用户 字段" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s:缺少 runas 组 字段" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "读取时序文件出错:%s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "无效的时序文件行:%s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "日志已完成,无法重新启动" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "无法重新启动 log" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "无法打开 %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "缺失 I/O 日志文件 %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s:无法向前查找 %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "无法找到恢复点 [%lld, %ld](在 %s/%s 中)" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "状态机错误" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "无效的 AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "解析 AcceptMessage 出错" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "创建 I/O 日志出错" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "记录接受事件时出错" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "无效的 RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "解析 RejectMessage 出错" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "记录拒绝事件时出错" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "无效的 AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "解析 AlertMessage 出错" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "记录警告事件时出错" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "协议错误" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "写入 IoBuffer 出错" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "写入 ChangeWindowSize 出错" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "写入 CommandSuspend 出错" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "无法识别的 ClientMessage 类型" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "客户端消息过长" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "无法将 TLS 1.2 密码套件设置为 %s: %s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "无法将 TLS 1.3 密码套件设置为 %s: %s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "无法获取 TLS 服务器方法:%s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "无法创建 TLS 上下文:%s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "无法加载证书 %s" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "无法加载数字证书认证机构集合(CA bundle) %s" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "无法加载私钥 %s" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "无法设置 diffie-hellman 参数:%s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "无法将最低协议版本设置为 TLS 1.2:%s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "无法获取远程 IP 地址" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "无法将用户数据附加到 ssl 对象上:%s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "无法将事件添加到队列" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "无法设置监听套接字" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - 将 sudo I/O 日志发送到远程服务器\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"选项:\n" +" -f, --file 指定配置文件的位置\n" +" -h, --help 显示帮助信息并退出\n" +" -n, --no-fork 不要进行 fork,在前台运行\n" +" -R, --random-drop 指定丢弃连接的百分比概率\n" +" -V, --version 显示版本信息并退出\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "需要 Protobuf-C 1.3 版或更高版本" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "无效的随机丢弃值:%s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s 版本 %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "不支持 TLS" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s:不是完全合格的路径" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d 不匹配的 '[':%s" + +#: logsrvd/logsrvd_conf.c:778 +#, fuzzy, c-format +#| msgid "invalid filter option: %s" +msgid "%s:%d invalid config section: %s" +msgstr "无效的过滤器选项:%s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d 无效的配置行:%s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "用于 %s 的无效的值:%s" + +#: logsrvd/logsrvd_conf.c:814 +#, fuzzy, c-format +#| msgid "%s: unknown key word: %s" +msgid "%s:%d unknown key: %s" +msgstr "%s:未知的关键词:%s" + +#: logsrvd/logsrvd_conf.c:1003 +#, fuzzy, c-format +#| msgid "unknown login class: %s" +msgid "unknown syslog facility %s" +msgstr "未知的登录类别:%s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "位置的 syslog 优先级 %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, fuzzy, c-format +#| msgid "unable to load %s: %s" +msgid "unable to look up %s:%s: %s" +msgstr "无法加载 %s:%s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "无法获取服务器 IP 地址" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "无法读取 %s/%s:%s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "客户端消息过大:%zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s:写缓冲已在使用" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "未预期的 I/O 事件 %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s:未预期的状态 %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "无效的 ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "从服务器收到了错误消息:%s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "从服务器收到了中止消息:%s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "无法解包 ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "从服务器读取超时" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "过早的文件结束" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "服务器消息过大:%u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "写入服务器时超时" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "TLS 握手超时" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "无法设置事件" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "TLS 连接失败:%s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "无法初始化 ssl 上下文:%s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "无法分配 ssl 对象:%s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "无法将套接字附加给 ssl 对象:%s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "过早地退出,状态码为 %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "别名“%s”已定义过" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "无法获取时间" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "无法为 %s 更改密码" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "无法获取用户 %s 的登录类别(login class)" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "无法开始 bsd 认证" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "无效的认证类型" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "无法初始化 bsd 认证" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "您的账户已过期" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "批准失败" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "无法读取 fwtk 配置" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "无法连接到认证服务器" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "丢失了到认证服务器的连接" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"认证服务器错误:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s:无法将主体(principal)转换为字符串(“%s”):%s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s:无法解析“%s”:%s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s:无法解析凭据缓存:%s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s:无法分配选项:%s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s:无法获取凭据:%s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s:无法初始化凭据缓存:%s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s:无法在缓存中储存凭据:%s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s:无法获取主机主体(principal):%s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s:无法验证目标!可能遭到了攻击!:%s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "无法初始化 PAM:%s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM 认证出错:%s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "账户验证失败,您的账户是不是上锁了?" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "账户或密码过期,重置您的密码并重试" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "无法更改过期的密码:%s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "密码过期,联系您的系统管理员" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "账户过期,或 PAM 配置缺少 sudo 使用的“account”节,联系您的系统管理员" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM 账户管理出错:%s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "%s 数据库中没有您" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "初始化 ACE API 库失败" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "无法联络 SecurID 服务器" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "为进行 SecurID 认证,已锁定用户 ID" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "SecurID 的用户名长度无效" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "SecurID 的认证句柄无效" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "SecurID 通讯失败" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "未知的 SecurID 错误" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "无效的 SecurID 密码长度" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "无法初始化 SIA 会话" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "无效的认证方法" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "编译进 sudo 的认证方法无效!您不能混用独立和非独立认证。" + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "无认证方法" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "sudo 编译时没有加入任何认证方法!如果您想关闭认证,使用 --disable-authentication 配置选项。" + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "无法初始化认证方法。" + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "认证方法:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "无法确定审核条件" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "无法提交审核记录" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"我们信任您已经从系统管理员那里了解了日常注意事项。\n" +"总结起来无外乎这三点:\n" +"\n" +" #1) 尊重别人的隐私。\n" +" #2) 输入前要先考虑(后果和风险)。\n" +" #3) 权力越大,责任越大。\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "未知的用户 ID:%u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "未知用户:%s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "顺序增量:%s: %s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "起始顺序:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "顺序填充:%s: %s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s 语法版本 %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "不支持的输入格式 %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "不支持的输出格式 %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s:输入和输出文件不能相同" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "无法初始化 sudoers 默认值" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s:%s:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s:未知的关键词:%s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "无效的默认值类型:%s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "无效的压缩类型:%s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "无效的过滤器:%s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "无法打开 %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "解析 %s 文件失败,未知错误" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "%s 中第 %d 行附近出现解析错误\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "%s 中出现解析错误\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "无法写入 %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - 转换 sudoers 文件格式\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"选项:\n" +" -b, --base=dn 用于 sudo LDAP 查询的基础 DN\n" +" -c, --config=conf_file 指向配置文件的路径\n" +" -d, --defaults=deftypes 只转换指定类型的默认值\n" +" -e, --expand-aliases 在转换时展开别名\n" +" -f, --output-format=format 设置输出格式:JSON、LDIF 或 sudoers\n" +" -i, --input-format=format 设置输入格式:LDIF 或 sudoers\n" +" -I, --increment=num 每个 sudoOrder 的增加量\n" +" -h, --help 显示帮助消息并退出\n" +" -m, --match=filter 只转换与过滤器匹配的条目\n" +" -M, --match-local 让匹配过滤器使用 passwd 和 group 数据库\n" +" -o, --output=output_file 将转换后的 sudoers 写入 output_file\n" +" -O, --order-start=num 第一个 sudoOrder 的起点\n" +" -p, --prune-matches 清理不匹配的用户、组和主机\n" +" -P, --padding=num sudoOrder 的增加基数\n" +" -s, --suppress=sections 压缩某些部分的输出\n" +" -V, --version 显示版本信息并退出" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "未知的默认条目“%s”" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "无法获取 GMT 时间" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "无法格式化时间戳" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "sudoers 条目过多,最多为 %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "没有设置 SUDOERS_BASE 环境变量,并且没有指定 -b 选项。" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "若使用了 syslog,用于记录日志的 syslog 设施:%s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "用户认证成功时使用的 syslog 优先级:%s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "用户认证不成功时使用的 syslog 优先级:%s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "将 OPT 提示放在独自的行中" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "忽略 $PATH 中的“.”" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "在运行 sudo 时总是发送邮件" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "在用户认证失败时发送邮件" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "在用户不在 sudoers 列表中时发送邮件" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "在用户不在此主机的 sudoers 列表中时发送邮件" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "在用户不允许执行某个命令时发送邮件" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "在用户尝试执行某个命令时发送邮件" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "对每个用户/终端组合使用独立的时间戳" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "在用户第一次运行 sudo 时向他致辞" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "包含 sudo 致辞的文件:%s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "默认要求用户认证" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "root 可以运行 sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "将主机名记录在(非 syslog)的日志文件中" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "将年份记录在(非 syslog)的日志文件中" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "如果不带参数调用 sudo,启动一个 shell" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "若使用 -s 选项启动 shell,将 $HOME 设为目标用户的主目录" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "总是将 $HOME 设为目标用户的主目录" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "允许收集一些信息,以提供有用的错误消息" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "要求 sudoers 文件中包含完全限定的主机名" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "在用户输入错误密码时对他们进行(玩笑式的)嘲讽" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "只允许拥有终端的用户执行 sudo" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo 将优先考虑 EDITOR 环境变量" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "询问 root 用户的密码而非用户的密码" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "询问 runas_default 用户的密码,而非用户密码" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "询问目标用户的密码,而非用户密码" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "应用目标用户登录类别中的默认设置,如果没有设置的话" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "设置 LOGNAME 和 USER 环境变量" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "只将有效用户 ID 设为目标用户的,而不是实际用户 ID" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "不将组向量初始化为目标用户的" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "日志文件折行的长度(0 则不折行):%u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "认证时间戳延时:%.1f 分钟" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "密码提示延时:%.1f 分钟" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "输入密码的尝试次数:%u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "要使用的 umask,或 0777 使用用户的:0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "日志文件路径:%s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "邮件程序路径:%s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "邮件程序标志:%s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "发送邮件的地址:%s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "接收邮件的地址:%s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "邮件消息的主题行:%s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "密码错误消息:%s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "致辞(lecture)状态文件夹的路径:%s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "认证时间戳文件夹的路径:%s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "认证时间戳的所有者:%s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "此组的用户不要求密码和 PATH:%s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "默认密码提示:%s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "如果设置,密码提示将覆盖各种情况下的系统提示。" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "运行命令的默认用户:%s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "覆盖用户的 $PATH 变量的值:%s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "visudo 所使用的编辑器的路径:%s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "何时为“list”伪命令请求密码:%s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "何时为“verify”伪命令请求密码:%s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "如果 LDAP 目录有效,是不是忽略本地的 sudoers 文件" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr ">= %d 的文件描述符将会在执行命令前关闭" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "如果设置,用户可以通过 -C 选项覆盖“closefrom”的值" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "允许用户设置任意的环境变量" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "将环境重设为默认的变量集" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "要检查安全性的环境变量:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "要移除的环境变量:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "要保留的环境变量:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "在新的安全环境中使用的 SELinux 角色:%s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "在新的安全环境中使用的 SELinux 类型:%s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "sudo 特定环境文件的路径:%s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "受限的 sudo 特定环境文件的路径:%s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "解析 sudoers 时使用的区域设置:%s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "允许 sudo 询问密码,即使它不可见" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "用户在询问密码窗口输入时提供视觉反馈" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "使用不太精确但不访问文件系统的较快通配方法" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "sudoers 中指定的 umask 会覆盖用户的,即使它允许的权限更多" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "记录用户在所执行命令中的输入" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "记录所执行命令的输出" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "使用 zlib 压缩 I/O 日志" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "总是在伪终端中运行命令" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "用于非 Unix 组支持的插件:%s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "用于保存输入/输出日志的目录:%s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "用于保存输入/输出日志的文件:%s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "在分配伪终端时向 utmp/utmpx 文件中添加一条记录" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "将 utmp 中的用户设为 runas 用户,而不是调用用户" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "允许权限的集合:%s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "限制权限的集合:%s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "在后台的伪终端上运行命令" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "要使用的 PAM 服务名称:%s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "用于登录 shell 的 PAM 服务名称:%s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "尝试为目标用户建立 PAM 凭据" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "创建一个新的 PAM 会话来运行该命令" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "执行 PAM 账户验证管理" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "最大 I/O 日志序列号:%s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "启用 support netgroup 支持" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "在使用 sudoedit 编辑文件时检查上级目录是否可写" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "使用 sudoedit 编辑文件时循符号连接(定位到原文件)" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "通过 组 插件查询未知的系统组" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "基于整个元组(用户、主机和域)来匹配网络组" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "即使 sudo 无法写入审核日志也允许命令运行" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "即使 sudo 无法写入 I/O 日志也允许命令运行" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "即使 sudo 无法写入日志文件也允许命令允许" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "解析 sudoers 中的组并与 组 ID (而不是名字) 匹配" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "大于此数值的日志条目会分为多条 syslog 消息:%u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "将拥有 I/O 日志文件的用户:%s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "将拥有 I/O 日志文件的组:%s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "I/O 日志文件要使用的文件模式:0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "根据文件描述符执行命令,而非根据路径:%s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "忽略 sudoers 中未知的 Defaults 条目而非产生警告" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "超过指定时间后终止命令(秒):%u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "允许用户在命令行中指定超时时间" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "立即冲洗(flush) I/O 日志数据而非将其缓存" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "通过 syslog 登录时包含进程 ID" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "认证时间戳记录的类型:%s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "认证失败消息:%s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "在匹配 用户 名时忽略大小写" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "在匹配 组 名时忽略大小写" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "命令被 sudoers 允许时的日志" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "命令被 sudoers 拒绝时的日志" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Sudo 日志服务器超时秒数:%u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "" + +#: plugins/sudoers/def_data.c:530 +#, fuzzy, c-format +#| msgid "Path to the sudo-specific environment file: %s" +msgid "Path to the audit server's CA bundle file: %s" +msgstr "sudo 特定环境文件的路径:%s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "到 sudoers 证书文件的路径:%s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "到 sudoers 私钥文件的路径:%s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "验证日志服务器证书有效性" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "" + +#: plugins/sudoers/def_data.c:562 +#, fuzzy, c-format +#| msgid "File descriptors >= %d will be closed before executing a command" +msgid "Working directory to change to before executing the command: %s" +msgstr ">= %d 的文件描述符将会在执行命令前关闭" + +#: plugins/sudoers/def_data.c:566 +#, fuzzy, c-format +#| msgid "File descriptors >= %d will be closed before executing a command" +msgid "Root directory to change to before executing the command: %s" +msgstr ">= %d 的文件描述符将会在执行命令前关闭" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "要产生日志的格式:%s" + +#: plugins/sudoers/defaults.c:185 +#, fuzzy, c-format +#| msgid "%s:%d: unknown defaults entry \"%s\"" +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:未知的默认条目“%s”" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s:未知的默认条目“%s”" + +#: plugins/sudoers/defaults.c:234 +#, fuzzy, c-format +#| msgid "%s:%d no value specified for \"%s\"" +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d 没有给“%s”指定值" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s:没有给“%s”指定值" + +#: plugins/sudoers/defaults.c:275 +#, fuzzy, c-format +#| msgid "%s:%d option \"%s\" does not take a value" +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d “%s”选项不带值" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s:“%s”选项不带值" + +#: plugins/sudoers/defaults.c:303 +#, fuzzy, c-format +#| msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:%2$d 选项“%4$s”的默认类型 0x%3$x 无效" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:选项“%3$s”的默认类型 0x%2$x 无效" + +#: plugins/sudoers/defaults.c:316 +#, fuzzy, c-format +#| msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%1$s:%2$d 值“%3$s”对选项“%4$s”无效" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:值“%s”对选项“%s”无效" + +#: plugins/sudoers/defaults.c:1030 +#, fuzzy, c-format +#| msgid "%s:%d values for \"%s\" must start with a '/'" +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d “%s”的值必须以“/”开头" + +#: plugins/sudoers/defaults.c:1034 +#, fuzzy, c-format +#| msgid "%s: values for \"%s\" must start with a '/'" +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:“%s”的值必须以“/”开头" + +#: plugins/sudoers/defaults.c:1045 +#, fuzzy, c-format +#| msgid "%s:%d values for \"%s\" must start with a '/'" +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d “%s”的值必须以“/”开头" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s:“%s”的值必须以“/”开头" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv:envp 损坏,长度不符" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "无法重建环境" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "对不起,您无权设置以下环境变量:%s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "%s 中第 %d 行附近有解析错误" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "%s 中出现解析错误" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "%2$s 的摘要类型 %1$d 不支持" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s:写错误" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s 必须属于用户 ID %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s 必须只对所有者可写" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "无法加载 %s:%s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "无法在 %s 中找到符号“group_plugin”" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s:不兼容的组插件主版本号 %d,应为 %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "无法解析 IP 地址列表“%s”" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "无法解析网络掩码“%s”" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "本地 IP 地址和网络掩码对:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "未知组:%s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "无法更新序列文件" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "无法写入 I/O 日志文件:%s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "无法创建 %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s:内部错误,事件 %d 的 I/O 日志文件未打开" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "无法读取时钟" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s:内部错误,信号 %d 无效" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "使用 ldaps 时不支持 starttls" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "无法初始化 SSL 证书和密钥数据库:%s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "要使用 SSL,您必须在 %s 中设置 TLS_CERT" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "无法初始化 LDAP:%s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "指定了 start_tls,但 LDAP 库不支持 ldap_start_tls_s() 或 ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "无效的 sudoOrder 属性:%s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s:端口过大" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "不支持的 LDAP URI 类型:%s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "无法混合 ldap 和 ldaps URI" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "无法转换 sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "无法打开审核系统" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "无法发送审核消息" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "事件循环中出错" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "创建新的 SSL_CTX 对象失败:%s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "到 %s:%s 的 TLS 连接失败:%s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "TLS 初始化不成功" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "TLS 握手不成功" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s:内部错误,无效的退出状态 %d" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "丢失了到日志服务器的连接" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "缺失写缓冲" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "无法连接到日志服务器" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "用户不在 sudoers 中" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "用户未获得此主机上的授权" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "命令禁止使用" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s 不在 sudoers 文件中。此事将被报告。\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s 无权在 %s 上运行 sudo。此事将被报告。\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "对不起,用户 %s 不能在 %s 上运行 sudo。\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "对不起,用户 %1$s 无权以 %5$s%6$s%7$s 的身份在 %8$s 上执行 %2$s%3$s%4$s。\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s:找不到命令" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"忽略在“.”中找到的“%s”\n" +"请使用“sudo ./%s”,如果这是您想运行的“%s”。" + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u 次错误密码尝试" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "认证失败" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "需要密码" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "无法打开日志文件:%s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "无法写入日志文件: %s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "%s(%s) 的摘要不是 %s 形式" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP 角色:%s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers 条目:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAs 用户:" + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAs 组:" + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " 选项:" + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " 命令:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "匹配 %2$s 上 %1$s 的默认条目:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "%s Runas 和命令特定的默认值:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "用户 %s 可以在 %s 上运行以下命令:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "用户 %s 无权在 %s 上运行 sudo。\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "将忽略不完整的 sudoRole:cn:%s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "无效的 LDIF 属性:%s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "sudo 前端设置了无效的 %.*s" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "无法解析网络地址列表" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "用户名未通过 sudo 前端设置" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "用户 ID 未通过 sudo 前端设置" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "组 ID 未通过 sudo 前端设置" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "主机名未通过 sudo 前端设置" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "无效的工作目录:%s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "无法的 chroot 目录:%s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "无法执行 %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers 策略插件版本 %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers 文件语法版本 %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers 路径:%s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch 路径:%s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf 路径:%s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret 路径:%s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "无法注册类型为 %d 的钩子(hook)(版本 %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "无法缓存用户 ID %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "无法缓存用户 ID %u,已存在" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "无法缓存用户 %s" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "无法缓存用户 %s,已存在" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "无法缓存组 ID %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "无法缓存组 ID %u,已存在" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "无法缓存组 %s" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "无法缓存组 %s,已存在" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "无法缓存组列表 %s,已存在" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "无法缓存组列表 %s" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "无法对 %s 解析组" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "无法解析 %s 的组 ID" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "权限堆栈上溢" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "权限堆栈下溢" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "无法切换为 root 组 ID" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "无法切换为 runas 组 ID" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "无法设置 runas 组向量" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "无法切换为 runas 用户 ID" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "无法切换为 sudoers 组 ID" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "进程过多" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "无法获取当前工作目录" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "截断的审核路径 user_cmnd:%s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "截断的审核路径 argv[0]:%s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "无法初始化 SSS 资源。您的计算机上安装 SSSD 了吗?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "无法在 %s 中找到符号“%s”" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "默认条目有问题" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "没有找到有效的 sudoers 资源,退出" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "用户不允许将根目录设置为 %s" + +#: plugins/sudoers/sudoers.c:294 +#, fuzzy, c-format +#| msgid "you are not permitted to use the -C option" +msgid "you are not permitted to use the -R option with %s" +msgstr "您无权使用 -C 选项" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "用户不允许将目录变更为 %s" + +#: plugins/sudoers/sudoers.c:320 +#, fuzzy, c-format +#| msgid "you are not permitted to use the -C option" +msgid "you are not permitted to use the -D option with %s" +msgstr "您无权使用 -C 选项" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers 指定 root 不允许执行 sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "您无权使用 -C 选项" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "时间戳所有者(%s):无此用户" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "无终端" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "抱歉,您必须拥有一个终端来执行 sudo" + +#: plugins/sudoers/sudoers.c:495 +#, fuzzy, c-format +#| msgid "invalid speed factor: %s" +msgid "invalid shell for user %s: %s" +msgstr "无法的速度系数:%s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "当前目录中的命令" + +#: plugins/sudoers/sudoers.c:597 +#, fuzzy +#| msgid "sorry, you are not allowed set a command timeout" +msgid "user not allowed to set a command timeout" +msgstr "抱歉,您无权设置超时时间" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "抱歉,您无权设置超时时间" + +#: plugins/sudoers/sudoers.c:607 +#, fuzzy +#| msgid "sorry, you are not allowed to preserve the environment" +msgid "user not allowed to preserve the environment" +msgstr "抱歉,您无权保留环境" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "抱歉,您无权保留环境" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "命令过长" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit 无需经由 sudo 运行" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "无法读取 %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "无法 stat %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s 不是常规文件" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s 属于用户 ID %u,应为 %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s 可被任何人写" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s 属于组 ID %u,应为 %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "只有 root 才能使用“-c %s”" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "未知的登录类别:%s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "无法解析主机:%s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "无效的过滤器选项:%s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "无效的最大等待:%s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "无法的速度系数:%s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/时序:%s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s:%s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "回放 sudo 会话:%s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "无法将终端设为原始模式" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "警告:您的终端尺寸太小,不能正常地回放日志。\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "日志的几何尺寸为 %dx%d,您终端的几何尺寸为 %dx%d。" + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "回放完成,请按任意键返回终端。" + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "有歧义的表达式“%s”" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "表达式中的“)”不匹配" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "未知的搜索词“%s”" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s 需要参数" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "无效的正则表达式:%s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "无法解析日期“%s”" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "表达式中的“(”不匹配" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "非法的结尾字符“or”" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "非法的结尾字符“!”" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "未知的搜索类型 %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "用法:%s [-hnRS] [-d 目录] [-m 数值] [-s 数值] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "用法:%s [-h] [-d 目录] -l [搜索表达式]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - 回放 sudo 会话记录\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"选项:\n" +" -d, --directory=目录 指定会话日志目录\n" +" -f, --filter=过滤器 指定要显示的 I/O 类型\n" +" -h, --help 显示帮助信息并退出\n" +" -l, --list 列出可用会话 ID,可加表达式限定\n" +" -m, --max-wait=数值 事件间等待的最大秒数\n" +" -n, --non-interactive 不进行提示,会话由标准输出送出\n" +" -R, --no-resize 不要尝试改变终端尺寸\n" +" -S, --suspend-wait 在命令挂起时等待\n" +" -s, --speed=数值 加速或减慢输出\n" +" -V, --version 显示版本信息并退出" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\t主机不匹配" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"命令允许" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"命令被拒" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"命令不匹配" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s 可被组写" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "无法将时间戳文件截短为 %lld 字节" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "将忽略超前的时间戳" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "时间戳太超前:%20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "无法锁定时间戳文件 %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "致辞(lecture)状态路径过长:%s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "不应当带路径调用 sudoedit" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "未来版本中 -x 选项会移除" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "请考虑换用 cvtsudoers 工具" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "按回车键编辑 %s:" + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "指定的编辑器(%s)不存在" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "未找到编辑器(编辑器路径 = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "写错误" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "无法 stat 临时文件(%s),%s 未更改" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "零长度的临时文件(%s),%s 未更改" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "编辑器(%s)失败,%s 未更改" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s 未更改" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "无法重新打开临时文件(%s),%s 未更改。" + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "无法解析临时文件(%s),未知错误" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "内部错误,在列表中找不到 %s!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "无法将 %s 的 (uid, gid) 设为 (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s 和 %s 不在同一个文件系统,使用 mv 进行重命名" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "命令失败:“%s %s %s”,%s 未更改" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "重命名 %s 出错,%s 未更改" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "现在做什么?" + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"选项有:\n" +" 重新编辑 sudoers 文件(e)\n" +" 退出,不保存对 sudoers 文件的更改(x)\n" +" 退出并将更改保存到 sudoers 文件(危险!)(Q)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "无法运行 %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s:错误的所有者(uid, gid),应为 (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s:权限不正确,模式应该是 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s:解析正确\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s 忙,请稍后重试" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "无法锁定 %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "仍然编辑?[y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, fuzzy, c-format +#| msgid "Error: %s:%d cycle in %s \"%s\"" +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "错误:%s:%d 在 %s “%s”中循环" + +#: plugins/sudoers/visudo.c:1092 +#, fuzzy, c-format +#| msgid "Warning: %s:%d cycle in %s \"%s\"" +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "警告:%s:%d 在 %s “%s”中循环" + +#: plugins/sudoers/visudo.c:1096 +#, fuzzy, c-format +#| msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "错误:%s:%d 引用了 %s “%s”但尚未定义" + +#: plugins/sudoers/visudo.c:1097 +#, fuzzy, c-format +#| msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "警告:%s:%d 引用了 %s “%s”但尚未定义" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "警告:%s:%d:%d:未使用的 %s“%s”" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - 安全地编辑 sudoers 文件\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"选项:\n" +" -c, --check 纯检查模式\n" +" -f, --file=sudoers 指定 sudoers 文件的位置\n" +" -h, --help 显示帮助信息并退出\n" +" -q, --quiet 较简略(安静)的语法错误信息\n" +" -s, --strict 严格语法检查\n" +" -V, --version 显示版本信息并退出\n" + +#: toke.l:179 +msgid "empty string" +msgstr "空字符串" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "空组" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +#, fuzzy +#| msgid "invalid authentication type" +msgid "invalid line continuation" +msgstr "无效的认证类型" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "无效的 IPv6 地址" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "字符串中未预期的换行" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "include 嵌套层数过多" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "预加载“sudo_noexec”库中包含的哑 exec 函数" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "无法锁定日志文件:%s" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports:端口太大" + +#~ msgid "No user or host" +#~ msgstr "无用户或主机" + +#~ msgid "validation failure" +#~ msgstr "校验失败" + +#~ msgid "audit_failure message too long" +#~ msgstr "audit_failure(审核失败)消息过长" + +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/时序:%s" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "将忽略无效的属性值:%s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "无法缓存用户 %s,内存不足" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "无法缓存组 %s,内存不足" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "无法缓存组列表 %s,内存不足" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP 角色:未知\n" + +#~ msgid " Order: %s\n" +#~ msgstr " 顺序:%s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 角色:%s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 角色:未知\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "警告:在 %s “%s”中循环" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "警告:引用了 %s “%s”但尚未定义" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "警告:%s “%s”未使用" + +#~ msgid "unable allocate memory" +#~ msgstr "无法分配内存" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "时间戳路径过长:%s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "无法 stat 编辑器(%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports:扩展主机缓存时空间不足" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri:构建主机缓存时空间不足" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 分配不匹配" + +#~ msgid "Password:" +#~ msgstr "密码:" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "内部错误:没有足够的空间存放日志行" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args:缓存溢出" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s 属于用户 ID %u,应为用户 ID %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s 对非所有者可写(0%o),模式应该为 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s 存在,但不是常规文件(0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s 对非所有者可写(0%o),模式应该为 0600" + +#~ msgid "unable to remove %s, will reset to the Unix epoch" +#~ msgstr "无法移除 %s ,将重设为 Unix 戳记" + +#~ msgid "unable to reset %s to the Unix epoch" +#~ msgstr "无法将 %s 重设为 Unix 戳记" + +#~ msgid "value out of range" +#~ msgstr "值超出范围" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "无法混合 ldaps 和 starttls" + +#~ msgid "writing to standard output" +#~ msgstr "写入标准输出" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "括号表达式过多,最多 %d" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit:失败" + +#~ msgid "getauid: failed" +#~ msgstr "getauid:失败" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject:失败" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args:失败" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32:失败" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text:失败" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep:tv_sec %ld,tv_nsec %ld" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok:%s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate:%s" + +#~ msgid "getauid failed" +#~ msgstr "getauid 失败" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "无法执行 dlopen %s:%s" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s:%s 在行 %d 附近<<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "无法将区域设置为“%s”,将使用“C”" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " 命令:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ":" + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "无法缓存用户 ID %u(%s),已存在" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "无法缓存组 ID %u(%s),已存在" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "内部错误,expand_prompt() 溢出" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "内部错误,sudo_setenv2() 溢出" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "内部错误,sudo_setenv()溢出" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "内部错误,linux_audit_command() 溢出" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "内部错误,runas_groups 溢出" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "内部错误,init_vars() 溢出" + +#~ msgid "fixed mode on %s" +#~ msgstr "对 %s 修正了模式" + +#~ msgid "unable to fix mode on %s" +#~ msgstr "无法对 %s 修正模式" + +#~ msgid "%s is mode 0%o, should be 0%o" +#~ msgstr "%s 的模式为 0%o,应为 0%o" + +#~ msgid "File containing dummy exec functions: %s" +#~ msgstr "含有哑 exec 函数的文件:%s" + +#~ msgid "" +#~ "Available options in a sudoers ``Defaults'' line:\n" +#~ "\n" +#~ msgstr "" +#~ "sudoers 中“Defaults”行中的可用选项:\n" +#~ "\n" + +#~ msgid "%s: %.*s\n" +#~ msgstr "%s:%.*s\n" + +#~ msgid "unable to get runas group vector" +#~ msgstr "无法获取 runas 组向量" + +#~ msgid "%s: %s_Alias `%s' references self" +#~ msgstr "%s:%s_Alias “%s”引用了自己" diff --git a/plugins/sudoers/po/zh_TW.mo b/plugins/sudoers/po/zh_TW.mo new file mode 100644 index 0000000..af4f54e Binary files /dev/null and b/plugins/sudoers/po/zh_TW.mo differ diff --git a/plugins/sudoers/po/zh_TW.po b/plugins/sudoers/po/zh_TW.po new file mode 100644 index 0000000..05ec214 --- /dev/null +++ b/plugins/sudoers/po/zh_TW.po @@ -0,0 +1,3166 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# +# Todd C. Miller , 2011-2018. +# Hugwalk , 2019. +# Yi-Jyun Pan , 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.9.4b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2020-11-14 06:24-0700\n" +"PO-Revision-Date: 2020-11-19 00:53+0800\n" +"Last-Translator: Yi-Jyun Pan \n" +"Language-Team: Chinese (traditional) \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.4.1\n" + +#: confstr.sh:1 gram.y:1077 +msgid "syntax error" +msgstr "語法錯誤" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p 的密碼:" + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p 的密碼:" + +#: confstr.sh:4 +msgid "Password: " +msgstr "密碼:" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h 須知的安全資訊 ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "抱歉,請重試。" + +#: gram.y:220 gram.y:286 gram.y:293 gram.y:300 gram.y:307 gram.y:314 +#: gram.y:334 gram.y:358 gram.y:365 gram.y:372 gram.y:379 gram.y:386 +#: gram.y:455 gram.y:464 gram.y:475 gram.y:510 gram.y:517 gram.y:524 +#: gram.y:531 gram.y:558 gram.y:654 gram.y:661 gram.y:670 gram.y:679 +#: gram.y:696 gram.y:834 gram.y:841 gram.y:849 gram.y:855 gram.y:971 +#: gram.y:978 gram.y:985 gram.y:992 gram.y:999 gram.y:1025 gram.y:1032 +#: gram.y:1039 gram.y:1236 gram.y:1526 lib/eventlog/eventlog.c:280 +#: lib/eventlog/eventlog.c:352 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:817 lib/eventlog/eventlog.c:1062 +#: lib/iolog/iolog_fileio.c:998 lib/iolog/iolog_json.c:120 +#: lib/iolog/iolog_json.c:305 lib/iolog/iolog_json.c:335 +#: lib/iolog/iolog_json.c:457 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/sendlog.c:480 +#: plugins/sudoers/alias.c:126 plugins/sudoers/alias.c:134 +#: plugins/sudoers/alias.c:153 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/bsdauth.c:143 +#: plugins/sudoers/auth/kerb5.c:118 plugins/sudoers/auth/kerb5.c:144 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/cvtsudoers.c:119 +#: plugins/sudoers/cvtsudoers.c:160 plugins/sudoers/cvtsudoers.c:177 +#: plugins/sudoers/cvtsudoers.c:188 plugins/sudoers/cvtsudoers.c:300 +#: plugins/sudoers/cvtsudoers.c:428 plugins/sudoers/cvtsudoers.c:561 +#: plugins/sudoers/cvtsudoers.c:578 plugins/sudoers/cvtsudoers.c:641 +#: plugins/sudoers/cvtsudoers.c:756 plugins/sudoers/cvtsudoers.c:764 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_json.c:76 +#: plugins/sudoers/cvtsudoers_ldif.c:151 plugins/sudoers/cvtsudoers_ldif.c:194 +#: plugins/sudoers/cvtsudoers_ldif.c:235 plugins/sudoers/cvtsudoers_ldif.c:300 +#: plugins/sudoers/cvtsudoers_ldif.c:371 plugins/sudoers/cvtsudoers_ldif.c:421 +#: plugins/sudoers/cvtsudoers_ldif.c:429 plugins/sudoers/cvtsudoers_ldif.c:440 +#: plugins/sudoers/cvtsudoers_ldif.c:447 plugins/sudoers/cvtsudoers_ldif.c:460 +#: plugins/sudoers/cvtsudoers_ldif.c:468 plugins/sudoers/cvtsudoers_ldif.c:615 +#: plugins/sudoers/defaults.c:630 plugins/sudoers/defaults.c:923 +#: plugins/sudoers/defaults.c:1098 plugins/sudoers/editor.c:181 +#: plugins/sudoers/env.c:261 plugins/sudoers/exptilde.c:92 +#: plugins/sudoers/filedigest.c:54 plugins/sudoers/filedigest.c:70 +#: plugins/sudoers/gc.c:56 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/interfaces.c:72 plugins/sudoers/iolog.c:596 +#: plugins/sudoers/iolog.c:613 plugins/sudoers/ldap.c:184 +#: plugins/sudoers/ldap.c:422 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:437 plugins/sudoers/ldap.c:441 +#: plugins/sudoers/ldap.c:453 plugins/sudoers/ldap.c:744 +#: plugins/sudoers/ldap.c:908 plugins/sudoers/ldap.c:1281 +#: plugins/sudoers/ldap.c:1709 plugins/sudoers/ldap.c:1746 +#: plugins/sudoers/ldap.c:1827 plugins/sudoers/ldap.c:1962 +#: plugins/sudoers/ldap.c:2063 plugins/sudoers/ldap.c:2079 +#: plugins/sudoers/ldap_conf.c:218 plugins/sudoers/ldap_conf.c:249 +#: plugins/sudoers/ldap_conf.c:301 plugins/sudoers/ldap_conf.c:337 +#: plugins/sudoers/ldap_conf.c:441 plugins/sudoers/ldap_conf.c:456 +#: plugins/sudoers/ldap_conf.c:553 plugins/sudoers/ldap_conf.c:586 +#: plugins/sudoers/ldap_conf.c:678 plugins/sudoers/ldap_conf.c:760 +#: plugins/sudoers/ldap_util.c:326 plugins/sudoers/ldap_util.c:333 +#: plugins/sudoers/ldap_util.c:603 plugins/sudoers/linux_audit.c:84 +#: plugins/sudoers/log_client.c:105 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:166 +#: plugins/sudoers/logging.c:426 plugins/sudoers/logging.c:446 +#: plugins/sudoers/logging.c:527 plugins/sudoers/match_command.c:281 +#: plugins/sudoers/match_command.c:449 plugins/sudoers/match_command.c:499 +#: plugins/sudoers/match_command.c:573 plugins/sudoers/match_digest.c:93 +#: plugins/sudoers/parse.c:199 plugins/sudoers/parse.c:213 +#: plugins/sudoers/parse.c:230 plugins/sudoers/parse.c:244 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse_ldif.c:153 plugins/sudoers/parse_ldif.c:184 +#: plugins/sudoers/parse_ldif.c:253 plugins/sudoers/parse_ldif.c:260 +#: plugins/sudoers/parse_ldif.c:265 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:352 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:396 plugins/sudoers/parse_ldif.c:408 +#: plugins/sudoers/parse_ldif.c:412 plugins/sudoers/parse_ldif.c:426 +#: plugins/sudoers/parse_ldif.c:594 plugins/sudoers/parse_ldif.c:624 +#: plugins/sudoers/parse_ldif.c:649 plugins/sudoers/parse_ldif.c:707 +#: plugins/sudoers/parse_ldif.c:724 plugins/sudoers/parse_ldif.c:752 +#: plugins/sudoers/parse_ldif.c:759 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:145 plugins/sudoers/sssd.c:407 +#: plugins/sudoers/sssd.c:470 plugins/sudoers/sssd.c:514 +#: plugins/sudoers/sssd.c:561 plugins/sudoers/sssd.c:754 +#: plugins/sudoers/stubs.c:110 plugins/sudoers/stubs.c:118 +#: plugins/sudoers/sudoers.c:300 plugins/sudoers/sudoers.c:326 +#: plugins/sudoers/sudoers.c:370 plugins/sudoers/sudoers.c:381 +#: plugins/sudoers/sudoers.c:391 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:794 plugins/sudoers/sudoers.c:927 +#: plugins/sudoers/sudoers.c:961 plugins/sudoers/sudoers.c:1265 +#: plugins/sudoers/sudoreplay.c:552 plugins/sudoers/sudoreplay.c:555 +#: plugins/sudoers/sudoreplay.c:1259 plugins/sudoers/sudoreplay.c:1469 +#: plugins/sudoers/sudoreplay.c:1473 plugins/sudoers/testsudoers.c:128 +#: plugins/sudoers/testsudoers.c:228 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:432 +#: plugins/sudoers/timestamp.c:476 plugins/sudoers/timestamp.c:986 +#: plugins/sudoers/toke_util.c:51 plugins/sudoers/toke_util.c:104 +#: plugins/sudoers/toke_util.c:129 plugins/sudoers/toke_util.c:157 +#: plugins/sudoers/tsdump.c:123 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:323 plugins/sudoers/visudo.c:329 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:615 +#: plugins/sudoers/visudo.c:935 plugins/sudoers/visudo.c:1008 +#: plugins/sudoers/visudo.c:1129 toke.l:913 toke.l:1033 toke.l:1091 +msgid "unable to allocate memory" +msgstr "無法分配記憶體" + +#: gram.y:552 +msgid "a digest requires a path name" +msgstr "摘要需要路徑名稱" + +#: gram.y:581 +msgid "values for \"CWD\" must start with a '/', '~', or '*'" +msgstr "\"CWD\" 的值開頭必須是 '/'、'~' 或 '*'" + +#: gram.y:593 +msgid "values for \"CHROOT\" must start with a '/', '~', or '*'" +msgstr "\"CHROOT\" 的值開頭必須是 '/'、'~' 或 '*'" + +#: gram.y:715 +#, c-format +msgid "syntax error, reserved word %s used as an alias name" +msgstr "語法錯誤,保留字 %s 被用作別名名稱" + +#: gram.y:735 +msgid "invalid notbefore value" +msgstr "notbefore 的值無效" + +#: gram.y:743 +msgid "invalid notafter value" +msgstr "notafter 的值無效" + +#: gram.y:752 plugins/sudoers/policy.c:335 +msgid "timeout value too large" +msgstr "timeout 值過長" + +#: gram.y:754 plugins/sudoers/policy.c:337 +msgid "invalid timeout value" +msgstr "timeout 值無效" + +#: gram.y:1079 +#, c-format +msgid "%s:%d:%d: %s\n" +msgstr "%s:%d:%d: %s\n" + +#: gram.y:1526 lib/eventlog/eventlog.c:280 lib/eventlog/eventlog.c:753 +#: lib/eventlog/eventlog.c:815 lib/eventlog/eventlog.c:816 +#: lib/eventlog/eventlog.c:1062 lib/iolog/iolog_fileio.c:998 +#: lib/iolog/iolog_json.c:120 lib/iolog/iolog_json.c:304 +#: lib/iolog/iolog_json.c:335 lib/iolog/iolog_json.c:457 +#: lib/iolog/iolog_json.c:735 lib/iolog/iolog_util.c:106 +#: lib/iolog/iolog_util.c:115 lib/iolog/iolog_util.c:125 +#: lib/iolog/iolog_util.c:133 lib/iolog/iolog_util.c:137 +#: lib/iolog/iolog_util.c:196 logsrvd/logsrvd.c:1280 logsrvd/logsrvd.c:1293 +#: logsrvd/logsrvd.c:1338 logsrvd/sendlog.c:480 logsrvd/sendlog.c:1321 +#: logsrvd/sendlog.c:1328 logsrvd/sendlog.c:1746 plugins/sudoers/audit.c:115 +#: plugins/sudoers/audit.c:210 plugins/sudoers/auth/pam.c:482 +#: plugins/sudoers/auth/pam.c:669 plugins/sudoers/auth/rfc1938.c:111 +#: plugins/sudoers/cvtsudoers.c:119 plugins/sudoers/cvtsudoers.c:159 +#: plugins/sudoers/cvtsudoers.c:176 plugins/sudoers/cvtsudoers.c:187 +#: plugins/sudoers/cvtsudoers.c:299 plugins/sudoers/cvtsudoers.c:427 +#: plugins/sudoers/cvtsudoers.c:560 plugins/sudoers/cvtsudoers.c:577 +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/cvtsudoers.c:756 +#: plugins/sudoers/cvtsudoers.c:763 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_json.c:75 plugins/sudoers/cvtsudoers_ldif.c:150 +#: plugins/sudoers/cvtsudoers_ldif.c:193 plugins/sudoers/cvtsudoers_ldif.c:234 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:370 +#: plugins/sudoers/cvtsudoers_ldif.c:420 plugins/sudoers/cvtsudoers_ldif.c:428 +#: plugins/sudoers/cvtsudoers_ldif.c:439 plugins/sudoers/cvtsudoers_ldif.c:446 +#: plugins/sudoers/cvtsudoers_ldif.c:459 plugins/sudoers/cvtsudoers_ldif.c:467 +#: plugins/sudoers/cvtsudoers_ldif.c:614 plugins/sudoers/defaults.c:630 +#: plugins/sudoers/defaults.c:923 plugins/sudoers/defaults.c:1098 +#: plugins/sudoers/editor.c:181 plugins/sudoers/env.c:261 +#: plugins/sudoers/exptilde.c:92 plugins/sudoers/filedigest.c:54 +#: plugins/sudoers/filedigest.c:70 plugins/sudoers/gc.c:56 +#: plugins/sudoers/group_plugin.c:132 plugins/sudoers/interfaces.c:72 +#: plugins/sudoers/iolog.c:596 plugins/sudoers/iolog.c:613 +#: plugins/sudoers/ldap.c:184 plugins/sudoers/ldap.c:422 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:437 +#: plugins/sudoers/ldap.c:441 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:744 plugins/sudoers/ldap.c:908 +#: plugins/sudoers/ldap.c:1281 plugins/sudoers/ldap.c:1709 +#: plugins/sudoers/ldap.c:1746 plugins/sudoers/ldap.c:1827 +#: plugins/sudoers/ldap.c:1962 plugins/sudoers/ldap.c:2063 +#: plugins/sudoers/ldap.c:2079 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:249 plugins/sudoers/ldap_conf.c:301 +#: plugins/sudoers/ldap_conf.c:337 plugins/sudoers/ldap_conf.c:441 +#: plugins/sudoers/ldap_conf.c:456 plugins/sudoers/ldap_conf.c:553 +#: plugins/sudoers/ldap_conf.c:586 plugins/sudoers/ldap_conf.c:677 +#: plugins/sudoers/ldap_conf.c:760 plugins/sudoers/ldap_util.c:325 +#: plugins/sudoers/ldap_util.c:332 plugins/sudoers/ldap_util.c:603 +#: plugins/sudoers/linux_audit.c:84 plugins/sudoers/log_client.c:105 +#: plugins/sudoers/log_client.c:214 plugins/sudoers/log_client.c:235 +#: plugins/sudoers/log_client.c:248 plugins/sudoers/log_client.c:381 +#: plugins/sudoers/log_client.c:688 plugins/sudoers/log_client.c:706 +#: plugins/sudoers/log_client.c:1407 plugins/sudoers/log_client.c:1620 +#: plugins/sudoers/log_client.c:1942 plugins/sudoers/log_client.c:1999 +#: plugins/sudoers/logging.c:100 plugins/sudoers/logging.c:165 +#: plugins/sudoers/logging.c:166 plugins/sudoers/logging.c:425 +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:527 +#: plugins/sudoers/match_command.c:280 plugins/sudoers/match_command.c:448 +#: plugins/sudoers/match_command.c:498 plugins/sudoers/match_command.c:573 +#: plugins/sudoers/match_digest.c:93 plugins/sudoers/parse.c:198 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:229 +#: plugins/sudoers/parse.c:243 plugins/sudoers/parse.c:263 +#: plugins/sudoers/parse.c:274 plugins/sudoers/parse_ldif.c:152 +#: plugins/sudoers/parse_ldif.c:183 plugins/sudoers/parse_ldif.c:252 +#: plugins/sudoers/parse_ldif.c:259 plugins/sudoers/parse_ldif.c:264 +#: plugins/sudoers/parse_ldif.c:340 plugins/sudoers/parse_ldif.c:351 +#: plugins/sudoers/parse_ldif.c:378 plugins/sudoers/parse_ldif.c:395 +#: plugins/sudoers/parse_ldif.c:407 plugins/sudoers/parse_ldif.c:411 +#: plugins/sudoers/parse_ldif.c:425 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:623 plugins/sudoers/parse_ldif.c:648 +#: plugins/sudoers/parse_ldif.c:706 plugins/sudoers/parse_ldif.c:723 +#: plugins/sudoers/parse_ldif.c:751 plugins/sudoers/parse_ldif.c:758 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:148 +#: plugins/sudoers/policy.c:157 plugins/sudoers/policy.c:183 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:335 +#: plugins/sudoers/policy.c:337 plugins/sudoers/policy.c:366 +#: plugins/sudoers/policy.c:375 plugins/sudoers/policy.c:418 +#: plugins/sudoers/policy.c:428 plugins/sudoers/policy.c:437 +#: plugins/sudoers/policy.c:446 plugins/sudoers/policy.c:526 +#: plugins/sudoers/policy.c:874 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:194 plugins/sudoers/pwutil.c:265 +#: plugins/sudoers/pwutil.c:343 plugins/sudoers/pwutil.c:517 +#: plugins/sudoers/pwutil.c:581 plugins/sudoers/pwutil.c:652 +#: plugins/sudoers/pwutil.c:811 plugins/sudoers/pwutil.c:867 +#: plugins/sudoers/pwutil.c:911 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 plugins/sudoers/sssd.c:144 +#: plugins/sudoers/sssd.c:407 plugins/sudoers/sssd.c:470 +#: plugins/sudoers/sssd.c:514 plugins/sudoers/sssd.c:561 +#: plugins/sudoers/sssd.c:754 plugins/sudoers/stubs.c:110 +#: plugins/sudoers/stubs.c:118 plugins/sudoers/sudoers.c:300 +#: plugins/sudoers/sudoers.c:326 plugins/sudoers/sudoers.c:370 +#: plugins/sudoers/sudoers.c:381 plugins/sudoers/sudoers.c:391 +#: plugins/sudoers/sudoers.c:433 plugins/sudoers/sudoers.c:794 +#: plugins/sudoers/sudoers.c:927 plugins/sudoers/sudoers.c:961 +#: plugins/sudoers/sudoers.c:1265 plugins/sudoers/sudoreplay.c:552 +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/sudoreplay.c:1473 +#: plugins/sudoers/testsudoers.c:128 plugins/sudoers/testsudoers.c:228 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/testsudoers.c:587 +#: plugins/sudoers/timestamp.c:432 plugins/sudoers/timestamp.c:476 +#: plugins/sudoers/timestamp.c:986 plugins/sudoers/toke_util.c:51 +#: plugins/sudoers/toke_util.c:104 plugins/sudoers/toke_util.c:128 +#: plugins/sudoers/toke_util.c:157 plugins/sudoers/tsdump.c:123 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:323 +#: plugins/sudoers/visudo.c:329 plugins/sudoers/visudo.c:439 +#: plugins/sudoers/visudo.c:615 plugins/sudoers/visudo.c:935 +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1129 toke.l:913 +#: toke.l:1033 toke.l:1091 +#, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: lib/eventlog/eventlog.c:285 lib/iolog/iolog_json.c:463 +#: lib/iolog/iolog_json.c:466 lib/iolog/iolog_json.c:468 +#: lib/iolog/iolog_json.c:560 plugins/sudoers/cvtsudoers_ldif.c:244 +#: plugins/sudoers/cvtsudoers_ldif.c:251 plugins/sudoers/cvtsudoers_ldif.c:571 +#: plugins/sudoers/env.c:323 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:437 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/ldap.c:517 plugins/sudoers/ldap.c:748 +#: plugins/sudoers/ldap.c:1081 plugins/sudoers/ldap_conf.c:222 +#: plugins/sudoers/ldap_conf.c:312 plugins/sudoers/linux_audit.c:90 +#: plugins/sudoers/policy.c:556 plugins/sudoers/policy.c:711 +#: plugins/sudoers/policy.c:721 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:983 plugins/sudoers/testsudoers.c:249 +#: plugins/sudoers/toke_util.c:169 +#, c-format +msgid "internal error, %s overflow" +msgstr "內部錯誤,%s 溢出" + +#: lib/eventlog/eventlog.c:343 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "無法 dup stdin:%m" + +#: lib/eventlog/eventlog.c:388 +#, c-format +msgid "unable to execute %s: %m" +msgstr "無法執行 %s:%m" + +#: lib/eventlog/eventlog.c:428 plugins/sudoers/auth/aix_auth.c:198 +msgid "unable to fork" +msgstr "無法執行 fork" + +#: lib/eventlog/eventlog.c:436 lib/eventlog/eventlog.c:490 +#, c-format +msgid "unable to fork: %m" +msgstr "無法執行 fork:%m" + +#: lib/eventlog/eventlog.c:480 +#, c-format +msgid "unable to open pipe: %m" +msgstr "無法開啟管線:%m" + +#: lib/eventlog/eventlog.c:894 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: lib/eventlog/eventlog.c:923 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (指令繼續執行) %s" + +#: lib/iolog/iolog_fileio.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s 存在,但非目錄 (0%o)" + +#: lib/iolog/iolog_fileio.c:185 lib/iolog/iolog_fileio.c:231 +#: plugins/sudoers/timestamp.c:205 +#, c-format +msgid "unable to mkdir %s" +msgstr "無法建立目錄 %s" + +#: lib/iolog/iolog_fileio.c:235 plugins/sudoers/visudo.c:732 +#: plugins/sudoers/visudo.c:743 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "無法將 %s 的模式變更為 0%o" + +#: lib/iolog/iolog_json.c:114 +#, c-format +msgid "expected JSON_STRING, got %d" +msgstr "應為 JSON_STRNG,但收到 %d" + +#: lib/iolog/iolog_json.c:327 +msgid "missing double quote in name" +msgstr "名稱中缺少雙引號" + +#: lib/iolog/iolog_json.c:414 +#, c-format +msgid "expected JSON_OBJECT, got %d" +msgstr "應為 JSON_OBJECT,但收到 %d" + +#: lib/iolog/iolog_json.c:629 lib/iolog/iolog_json.c:753 +msgid "unmatched close brace" +msgstr "未對稱的右大括弧" + +#: lib/iolog/iolog_json.c:638 +msgid "unexpected array" +msgstr "不應有陣列" + +#: lib/iolog/iolog_json.c:651 lib/iolog/iolog_json.c:755 +msgid "unmatched close bracket" +msgstr "未對稱的右中括弧" + +#: lib/iolog/iolog_json.c:659 +msgid "unexpected string" +msgstr "不應有字串" + +#: lib/iolog/iolog_json.c:669 +msgid "missing colon after name" +msgstr "名稱後缺少冒號" + +#: lib/iolog/iolog_json.c:680 lib/iolog/iolog_json.c:695 +#: lib/iolog/iolog_json.c:710 +msgid "unexpected boolean" +msgstr "不應有布林值" + +#: lib/iolog/iolog_json.c:726 +msgid "unexpected number" +msgstr "不應有數字" + +#: lib/iolog/iolog_json.c:763 +#, c-format +msgid "%s:%u unable to parse \"%s\"" +msgstr "%s:%u 無法解析「%s」" + +#: lib/iolog/iolog_util.c:71 +#, c-format +msgid "%s: invalid log file" +msgstr "%s:無效的記錄檔案" + +#: lib/iolog/iolog_util.c:89 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s:缺少 時間戳 欄位" + +#: lib/iolog/iolog_util.c:95 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s:時間戳 %s:%s" + +#: lib/iolog/iolog_util.c:102 +#, c-format +msgid "%s: user field is missing" +msgstr "%s:缺少 使用者 欄位" + +#: lib/iolog/iolog_util.c:111 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s:缺少 runas 使用者 欄位" + +#: lib/iolog/iolog_util.c:120 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s:缺少 runas 群組 欄位" + +#: lib/iolog/iolog_util.c:419 +#, c-format +msgid "error reading timing file: %s" +msgstr "讀取計時檔案時發生錯誤:%s" + +#: lib/iolog/iolog_util.c:426 +#, c-format +msgid "invalid timing file line: %s" +msgstr "無效的計時檔案行號:%s" + +#: logsrvd/iolog_writer.c:919 +msgid "log is already complete, cannot be restarted" +msgstr "記錄已完成,無法重新開始" + +#: logsrvd/iolog_writer.c:950 +msgid "unable to restart log" +msgstr "無法重新啟動記錄" + +#: logsrvd/logsrv_util.c:99 logsrvd/logsrv_util.c:106 +#: plugins/sudoers/sudoreplay.c:352 plugins/sudoers/sudoreplay.c:358 +#, c-format +msgid "unable to open %s/%s" +msgstr "無法開啟 %s/%s" + +#: logsrvd/logsrv_util.c:133 +#, c-format +msgid "missing I/O log file %s/%s" +msgstr "缺少 I/O 記錄檔 %s/%s" + +#: logsrvd/logsrv_util.c:140 +#, c-format +msgid "%s/%s: unable to seek forward %zu" +msgstr "%s/%s:無法往前搜尋 %zu" + +#: logsrvd/logsrv_util.c:150 +#, c-format +msgid "unable to find resume point [%lld, %ld] in %s/%s" +msgstr "%3$s/%4$s 中找不到繼續點 [%1$lld, %2$ld]" + +#: logsrvd/logsrvd.c:290 logsrvd/logsrvd.c:353 logsrvd/logsrvd.c:394 +#: logsrvd/logsrvd.c:449 logsrvd/logsrvd.c:517 logsrvd/logsrvd.c:568 +#: logsrvd/logsrvd.c:600 logsrvd/logsrvd.c:632 +msgid "state machine error" +msgstr "狀態機器發生錯誤" + +#: logsrvd/logsrvd.c:299 +msgid "invalid AcceptMessage" +msgstr "無效的 AcceptMessage" + +#: logsrvd/logsrvd.c:307 +msgid "error parsing AcceptMessage" +msgstr "解析 AcceptMessage 時發生錯誤" + +#: logsrvd/logsrvd.c:314 +msgid "error creating I/O log" +msgstr "建立 I/O 日誌時發生錯誤" + +#: logsrvd/logsrvd.c:321 +msgid "error logging accept event" +msgstr "記錄接受事件時發生錯誤" + +#: logsrvd/logsrvd.c:362 +msgid "invalid RejectMessage" +msgstr "無效的 RejectMessage" + +#: logsrvd/logsrvd.c:370 +msgid "error parsing RejectMessage" +msgstr "解析 RejectMessage 時發生錯誤" + +#: logsrvd/logsrvd.c:376 +msgid "error logging reject event" +msgstr "記錄拒絕事件時發生錯誤" + +#: logsrvd/logsrvd.c:486 +msgid "invalid AlertMessage" +msgstr "無效的 AlertMessage" + +#: logsrvd/logsrvd.c:494 +msgid "error parsing AlertMessage" +msgstr "解析 AlertMessage 時發生錯誤" + +#: logsrvd/logsrvd.c:502 +msgid "error logging alert event" +msgstr "記錄提醒事件時發生錯誤" + +#: logsrvd/logsrvd.c:523 logsrvd/logsrvd.c:574 logsrvd/logsrvd.c:606 +msgid "protocol error" +msgstr "通訊協定錯誤" + +#: logsrvd/logsrvd.c:533 +msgid "error writing IoBuffer" +msgstr "寫入 IoBuffer 時發生錯誤" + +#: logsrvd/logsrvd.c:585 +msgid "error writing ChangeWindowSize" +msgstr "寫入 ChangeWindowSize 時發生錯誤" + +#: logsrvd/logsrvd.c:617 +msgid "error writing CommandSuspend" +msgstr "寫入 CommandSuspend 時發生錯誤" + +#: logsrvd/logsrvd.c:702 +msgid "unrecognized ClientMessage type" +msgstr "無法識別的 ClientMessage 類型" + +#: logsrvd/logsrvd.c:967 +msgid "client message too large" +msgstr "用戶端訊息過長" + +#: logsrvd/logsrvd.c:1197 logsrvd/logsrvd.c:1205 +#, c-format +msgid "unable to set TLS 1.2 ciphersuite to %s: %s" +msgstr "無法將 TLS 1.2 加密套件設為 %s:%s" + +#: logsrvd/logsrvd.c:1225 logsrvd/logsrvd.c:1233 +#, c-format +msgid "unable to set TLS 1.3 ciphersuite to %s: %s" +msgstr "無法將 TLS 1.3 加密套件設為 %s:%s" + +#: logsrvd/logsrvd.c:1269 +#, c-format +msgid "unable to get TLS server method: %s" +msgstr "無法取得 TLS 伺服器方法:%s" + +#: logsrvd/logsrvd.c:1274 +#, c-format +msgid "unable to create TLS context: %s" +msgstr "無法建立 TLS 情境:%s" + +#: logsrvd/logsrvd.c:1281 plugins/sudoers/log_client.c:236 +#, c-format +msgid "unable to load certificate %s" +msgstr "無法載入 %s 憑證" + +#: logsrvd/logsrvd.c:1294 plugins/sudoers/log_client.c:216 +#, c-format +msgid "unable to load certificate authority bundle %s" +msgstr "無法載入 %s 憑證授權單位組合" + +#: logsrvd/logsrvd.c:1339 plugins/sudoers/log_client.c:249 +#, c-format +msgid "unable to load private key %s" +msgstr "無法載入 %s 私鑰" + +#: logsrvd/logsrvd.c:1356 logsrvd/logsrvd.c:1365 +#, c-format +msgid "unable to set diffie-hellman parameters: %s" +msgstr "無法設定迪菲-赫爾曼參數:%s" + +#: logsrvd/logsrvd.c:1378 +#, c-format +msgid "unable to set minimum protocol version to TLS 1.2: %s" +msgstr "無法將最低通訊協定版本設為 TLS 1.2:%s" + +#: logsrvd/logsrvd.c:1563 +msgid "unable to get remote IP addr" +msgstr "無法取得遠端 IP 地址" + +#: logsrvd/logsrvd.c:1591 plugins/sudoers/log_client.c:263 +#, c-format +msgid "Unable to attach user data to the ssl object: %s" +msgstr "無法將使用者資料連結至 SSL 物件:%s" + +#: logsrvd/logsrvd.c:1599 logsrvd/logsrvd.c:1721 logsrvd/logsrvd.c:1823 +#: logsrvd/sendlog.c:1125 logsrvd/sendlog.c:1481 logsrvd/sendlog.c:1496 +#: logsrvd/sendlog.c:1554 plugins/sudoers/iolog.c:956 +#: plugins/sudoers/iolog.c:1089 plugins/sudoers/iolog.c:1187 +#: plugins/sudoers/log_client.c:109 plugins/sudoers/log_client.c:324 +#: plugins/sudoers/log_client.c:340 plugins/sudoers/log_client.c:386 +#: plugins/sudoers/log_client.c:587 plugins/sudoers/log_client.c:594 +#: plugins/sudoers/log_client.c:1103 plugins/sudoers/log_client.c:1376 +#: plugins/sudoers/log_client.c:1417 plugins/sudoers/log_client.c:1425 +#: plugins/sudoers/log_client.c:1576 plugins/sudoers/log_client.c:1692 +#: plugins/sudoers/log_client.c:2007 plugins/sudoers/log_client.c:2015 +#: plugins/sudoers/sudoreplay.c:512 plugins/sudoers/sudoreplay.c:559 +#: plugins/sudoers/sudoreplay.c:791 plugins/sudoers/sudoreplay.c:903 +#: plugins/sudoers/sudoreplay.c:993 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1029 plugins/sudoers/sudoreplay.c:1036 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "無法將事件附加到佇列" + +#: logsrvd/logsrvd.c:1775 logsrvd/logsrvd.c:2011 +msgid "unable setup listen socket" +msgstr "無法設定監聽通訊端 (socket)" + +#: logsrvd/logsrvd.c:1917 logsrvd/sendlog.c:124 +#, c-format +msgid "" +"%s - send sudo I/O log to remote server\n" +"\n" +msgstr "" +"%s - 傳送 sudo I/O 記錄至遠端伺服器\n" +"\n" + +#: logsrvd/logsrvd.c:1920 +#, fuzzy +msgid "" +"\n" +"Options:\n" +" -f, --file path to configuration file\n" +" -h --help display help message and exit\n" +" -n, --no-fork do not fork, run in the foreground\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"選項:\n" +" -f, --file 設定檔路徑\n" +" -h, --help 顯示說明訊息並退出\n" +" -n, --no-fork 不要 fork,在前景執行\n" +" -R, --random-drop percent chance connections will drop\n" +" -V, --version 顯示版本資訊後離開\n" + +#: logsrvd/logsrvd.c:1972 logsrvd/sendlog.c:1719 +msgid "Protobuf-C version 1.3 or higher required" +msgstr "需要 Protobuf-C 版本 1.3 或更高版本" + +#: logsrvd/logsrvd.c:1990 +#, c-format +msgid "invalid random drop value: %s" +msgstr "隨機丟棄值無效:%s" + +#: logsrvd/logsrvd.c:1994 logsrvd/sendlog.c:1769 +#: plugins/sudoers/cvtsudoers.c:228 plugins/sudoers/sudoreplay.c:299 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s 版本 %s\n" + +#: logsrvd/logsrvd_conf.c:331 +msgid "TLS not supported" +msgstr "不支援 TLS" + +#: logsrvd/logsrvd_conf.c:343 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: logsrvd/logsrvd_conf.c:409 logsrvd/logsrvd_conf.c:653 +#, c-format +msgid "%s: not a fully qualified path" +msgstr "%s:路徑不完全合法" + +#: logsrvd/logsrvd_conf.c:767 +#, c-format +msgid "%s:%d unmatched '[': %s" +msgstr "%s:%d 不對稱的 '[': %s" + +#: logsrvd/logsrvd_conf.c:778 +#, c-format +msgid "%s:%d invalid config section: %s" +msgstr "%s:%d 無效的設定檔區段:%s" + +#: logsrvd/logsrvd_conf.c:786 +#, c-format +msgid "%s:%d invalid configuration line: %s" +msgstr "%s:%d 無效的設定檔行:%s" + +#: logsrvd/logsrvd_conf.c:792 +#, c-format +msgid "%s:%d expected section name: %s" +msgstr "%s:%d 應有區段名稱:%s" + +#: logsrvd/logsrvd_conf.c:806 +#, c-format +msgid "invalid value for %s: %s" +msgstr "%s 的值無效:%s" + +#: logsrvd/logsrvd_conf.c:814 +#, c-format +msgid "%s:%d unknown key: %s" +msgstr "%s:%d 未知鍵:%s" + +#: logsrvd/logsrvd_conf.c:1003 +#, c-format +msgid "unknown syslog facility %s" +msgstr "未知的 syslog 裝置 %s" + +#: logsrvd/logsrvd_conf.c:1007 logsrvd/logsrvd_conf.c:1011 +#: logsrvd/logsrvd_conf.c:1015 +#, c-format +msgid "unknown syslog priority %s" +msgstr "未知 syslog 優先級 %s" + +#: logsrvd/sendlog.c:127 +msgid "" +"\n" +"Options:\n" +" --help display help message and exit\n" +" -A, --accept only send an accept event (no I/O)\n" +" -h, --host host to send logs to\n" +" -i, --iolog_id remote ID of I/O log to be resumed\n" +" -p, --port port to use when connecting to host\n" +" -r, --restart restart previous I/O log transfer\n" +" -R, --reject reject the command with the given reason\n" +" -b, --ca-bundle certificate bundle file to verify server's cert against\n" +" -c, --cert certificate file for TLS handshake\n" +" -k, --key private key file\n" +" -n, --no-verify do not verify server certificate\n" +" -t, --test test audit server by sending selected I/O log n times in parallel\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"選項:\n" +" --help 顯示說明訊息後離開\n" +" -A, --accept 只傳送接受事件 (無 I/O)\n" +" -h, --host 要傳送記錄至的目標主機\n" +" -i, --iolog_id 要繼續的 I/O 記錄的遠端 ID\n" +" -p, --port 連線到主機時要使用的連線埠\n" +" -r, --restart 重新啟動上次的 I/O 記錄傳輸\n" +" -R, --reject 以提供的原因拒絕命令\n" +" -b, --ca-bundle 用來核驗伺服器憑證針對對象的憑證組合檔案\n" +" -c, --cert 用於 TLS 交握的憑證檔案\n" +" -k, --key 私鑰檔案\n" +" -n, --no-verify 不核驗伺服器憑證\n" +" -t, --test 透過並行傳送選取的 I/O 記錄 n 次來測試稽核伺服器\n" +" -V, --version 顯示版本資訊後離開\n" + +#: logsrvd/sendlog.c:164 plugins/sudoers/log_client.c:432 +#, c-format +msgid "unable to look up %s:%s: %s" +msgstr "無法查看 %s:%s: %s" + +#: logsrvd/sendlog.c:202 +msgid "unable to get server IP addr" +msgstr "無法取得伺服器 IP 地址" + +#: logsrvd/sendlog.c:256 plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "unable to read %s/%s: %s" +msgstr "無法讀取 %s/%s: %s" + +#: logsrvd/sendlog.c:277 plugins/sudoers/log_client.c:694 +#, c-format +msgid "client message too large: %zu" +msgstr "用戶端訊息過長:%zu" + +#: logsrvd/sendlog.c:810 +#, c-format +msgid "%s: write buffer already in use" +msgstr "%s:寫入緩衝區正被使用" + +#: logsrvd/sendlog.c:862 plugins/sudoers/iolog.c:880 +#: plugins/sudoers/iolog.c:949 +#, c-format +msgid "unexpected I/O event %d" +msgstr "不應有的 I/O 事件 %d" + +#: logsrvd/sendlog.c:908 logsrvd/sendlog.c:925 logsrvd/sendlog.c:959 +#: plugins/sudoers/log_client.c:1118 plugins/sudoers/log_client.c:1386 +#: plugins/sudoers/log_client.c:1454 plugins/sudoers/log_client.c:1490 +#, c-format +msgid "%s: unexpected state %d" +msgstr "%s:不應有的狀態 %d" + +#: logsrvd/sendlog.c:931 plugins/sudoers/log_client.c:1460 +msgid "invalid ServerHello" +msgstr "無效的 ServerHello" + +#: logsrvd/sendlog.c:995 plugins/sudoers/log_client.c:1534 +#, c-format +msgid "error message received from server: %s" +msgstr "自伺服器接收到錯誤訊息:%s" + +#: logsrvd/sendlog.c:1008 plugins/sudoers/log_client.c:1547 +#, c-format +msgid "abort message received from server: %s" +msgstr "自伺服器接收到中止訊息:%s" + +#: logsrvd/sendlog.c:1027 plugins/sudoers/log_client.c:1566 +msgid "unable to unpack ServerMessage" +msgstr "無法解開 ServerMessage" + +#: logsrvd/sendlog.c:1067 plugins/sudoers/log_client.c:1597 +#, c-format +msgid "%s: unexpected type_case value %d" +msgstr "%s:不應有的 type_case 值 %d" + +#: logsrvd/sendlog.c:1096 +msgid "timeout reading from server" +msgstr "從伺服器讀取逾時" + +#: logsrvd/sendlog.c:1174 +msgid "premature EOF" +msgstr "檔案過早結束" + +#: logsrvd/sendlog.c:1187 plugins/sudoers/log_client.c:1751 +#, c-format +msgid "server message too large: %u" +msgstr "伺服器訊息過長:%u" + +#: logsrvd/sendlog.c:1238 +msgid "timeout writing to server" +msgstr "寫入至伺服器逾時" + +#: logsrvd/sendlog.c:1457 plugins/sudoers/log_client.c:296 +msgid "TLS handshake timeout occurred" +msgstr "遇到 TLS 交握逾時" + +#: logsrvd/sendlog.c:1476 logsrvd/sendlog.c:1491 +#: plugins/sudoers/log_client.c:318 plugins/sudoers/log_client.c:334 +msgid "unable to set event" +msgstr "無法設定事件" + +#: logsrvd/sendlog.c:1501 logsrvd/sendlog.c:1505 +#, c-format +msgid "TLS connection failed: %s" +msgstr "TLS 連線失敗:%s" + +#: logsrvd/sendlog.c:1538 +#, c-format +msgid "Unable to initialize ssl context: %s" +msgstr "無法初始化 SSL 上下文:%s" + +#: logsrvd/sendlog.c:1543 plugins/sudoers/log_client.c:258 +#, c-format +msgid "Unable to allocate ssl object: %s" +msgstr "無法配置 SSL 物件:%s" + +#: logsrvd/sendlog.c:1548 +#, c-format +msgid "Unable to attach socket to the ssl object: %s" +msgstr "無法將 socket 通訊端連結至 SSL 物件:%s" + +#: logsrvd/sendlog.c:1792 +msgid "both restart point and iolog ID must be specified" +msgstr "必須指定重新啟動點 (restart point) 和 iolog ID" + +#: logsrvd/sendlog.c:1796 +msgid "a restart point may not be set when no I/O is sent" +msgstr "未傳送 I/O 時,不應設定重新開始點" + +#: logsrvd/sendlog.c:1871 +#, c-format +msgid "exited prematurely with state %d" +msgstr "過早結束,狀態碼 %d" + +#: logsrvd/sendlog.c:1872 +#, c-format +msgid "elapsed time sent to server [%lld, %ld]" +msgstr "已傳送耗用時間至伺服器 [%lld, %ld]" + +#: logsrvd/sendlog.c:1874 +#, c-format +msgid "commit point received from server [%lld, %ld]" +msgstr "自伺服器接收到提交點 (commit point) [%lld, %ld]" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "別名「%s」已定義過" + +#: plugins/sudoers/audit.c:206 plugins/sudoers/audit.c:343 +#: plugins/sudoers/log_client.c:954 plugins/sudoers/log_client.c:1002 +#: plugins/sudoers/log_client.c:1050 plugins/sudoers/log_client.c:1175 +#: plugins/sudoers/logging.c:548 plugins/sudoers/policy.c:114 +msgid "unable to get time of day" +msgstr "無法取得一日時間" + +#: plugins/sudoers/auth/aix_auth.c:277 +#, c-format +msgid "unable to change password for %s" +msgstr "無法變更 %s 的密碼" + +#: plugins/sudoers/auth/bsdauth.c:70 +#, c-format +msgid "unable to get login class for user %s" +msgstr "無法取得使用者 %s 的登入類別" + +#: plugins/sudoers/auth/bsdauth.c:75 +msgid "unable to begin bsd authentication" +msgstr "無法開始進行 BSD 認證" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "invalid authentication type" +msgstr "無效的認證類型" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "unable to initialize BSD authentication" +msgstr "無法初始化 BSD 認證程序" + +#: plugins/sudoers/auth/bsdauth.c:179 +msgid "your account has expired" +msgstr "您的帳號已經過期" + +#: plugins/sudoers/auth/bsdauth.c:181 +msgid "approval failed" +msgstr "核可失敗" + +#: plugins/sudoers/auth/fwtk.c:54 +msgid "unable to read fwtk config" +msgstr "無法讀取 fwtk 組態設定" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to connect to authentication server" +msgstr "無法連線到認證伺服器" + +#: plugins/sudoers/auth/fwtk.c:65 plugins/sudoers/auth/fwtk.c:89 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "失去對認證伺服器的連線" + +#: plugins/sudoers/auth/fwtk.c:69 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"認證伺服器發生錯誤:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:110 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s:無法將主體轉換成字串 ('%s'):%s" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s:無法解析「%s」:%s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s:無法解析憑證快取:%s" + +#: plugins/sudoers/auth/kerb5.c:216 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s:無法分配選項:%s" + +#: plugins/sudoers/auth/kerb5.c:231 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s:無法取得憑證:%s" + +#: plugins/sudoers/auth/kerb5.c:244 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s:無法初始化憑證快取:%s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s:無法將憑證儲存於快取:%s" + +#: plugins/sudoers/auth/kerb5.c:311 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s:無法取得主機主體:%s" + +#: plugins/sudoers/auth/kerb5.c:325 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s:無法驗證 TGT!可能發生攻擊事件!:%s" + +#: plugins/sudoers/auth/pam.c:218 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "無法初始化 PAM:%s" + +#: plugins/sudoers/auth/pam.c:317 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM 認證發生錯誤:%s" + +#: plugins/sudoers/auth/pam.c:336 +msgid "account validation failure, is your account locked?" +msgstr "檢查帳號有效性失敗,請檢查您的帳號是否被鎖定。" + +#: plugins/sudoers/auth/pam.c:347 +msgid "Account or password is expired, reset your password and try again" +msgstr "帳號或密碼已標為過期,請重設密碼後重試" + +#: plugins/sudoers/auth/pam.c:353 +#, c-format +msgid "unable to change expired password: %s" +msgstr "無法變更已過期密碼:%s" + +#: plugins/sudoers/auth/pam.c:364 +msgid "Password expired, contact your system administrator" +msgstr "密碼已標為過期,請聯絡您的系統管理員" + +#: plugins/sudoers/auth/pam.c:369 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "帳號已過期或是 PAM 組態設定缺少 sudo 的 \"account\" 部份,請聯絡您的系統管理員" + +#: plugins/sudoers/auth/pam.c:377 plugins/sudoers/auth/pam.c:382 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM 帳號管理發生錯誤:%s" + +#: plugins/sudoers/auth/rfc1938.c:99 plugins/sudoers/visudo.c:243 +#, c-format +msgid "you do not exist in the %s database" +msgstr "您不在 %s 資料庫中" + +#: plugins/sudoers/auth/securid5.c:72 +msgid "failed to initialise the ACE API library" +msgstr "無法初始化 ACE API 函式庫" + +#: plugins/sudoers/auth/securid5.c:98 +msgid "unable to contact the SecurID server" +msgstr "無法聯繫 SecurID 伺服器" + +#: plugins/sudoers/auth/securid5.c:107 +msgid "User ID locked for SecurID Authentication" +msgstr "用於 SecurID 認證的使用者 ID 已被鎖定" + +#: plugins/sudoers/auth/securid5.c:111 plugins/sudoers/auth/securid5.c:162 +msgid "invalid username length for SecurID" +msgstr "用於 SecurID 的使用者名稱長度無效" + +#: plugins/sudoers/auth/securid5.c:115 plugins/sudoers/auth/securid5.c:167 +msgid "invalid Authentication Handle for SecurID" +msgstr "用於 SecurID 的認證處理無效" + +#: plugins/sudoers/auth/securid5.c:119 +msgid "SecurID communication failed" +msgstr "SecurID 通訊失敗" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:210 +msgid "unknown SecurID error" +msgstr "未知 SecurID 錯誤" + +#: plugins/sudoers/auth/securid5.c:157 +msgid "invalid passcode length for SecurID" +msgstr "用於 SecurID 的密碼長度無效" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:123 +msgid "unable to initialize SIA session" +msgstr "無法初始化 SIA 工作階段" + +#: plugins/sudoers/auth/sudo_auth.c:132 +msgid "invalid authentication methods" +msgstr "無效的認證方式" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "sudo 被編譯進無效的認證方式!您不能混合獨立及非獨立認證方式。" + +#: plugins/sudoers/auth/sudo_auth.c:255 plugins/sudoers/auth/sudo_auth.c:305 +msgid "no authentication methods" +msgstr "沒有認證方式" + +#: plugins/sudoers/auth/sudo_auth.c:257 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "沒有編譯進 sudo 的認證方式!若要關閉認證功能,請使用 --disable-authentication 設定選項。" + +#: plugins/sudoers/auth/sudo_auth.c:307 +msgid "Unable to initialize authentication methods." +msgstr "無法初始化認證方式。" + +#: plugins/sudoers/auth/sudo_auth.c:471 +msgid "Authentication methods:" +msgstr "認證方式:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:214 +msgid "Could not determine audit condition" +msgstr "無法確定稽核條件" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:277 +msgid "unable to commit audit record" +msgstr "無法提交稽核記錄" + +#: plugins/sudoers/check.c:258 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"我們相信您已經從本機系統管理員取得\n" +"日常注意事項。注意事項通常可以歸結為三件事情:\n" +"\n" +" #1) 尊重他人隱私。\n" +" #2) 輸入指令前先三思。\n" +" #3) 權力越大則責任越大。\n" +"\n" + +#: plugins/sudoers/check.c:301 plugins/sudoers/check.c:311 +#: plugins/sudoers/sudoers.c:837 plugins/sudoers/sudoers.c:858 +#: plugins/sudoers/tsdump.c:119 +#, c-format +msgid "unknown uid: %u" +msgstr "未知 UID:%u" + +#: plugins/sudoers/check.c:306 plugins/sudoers/exptilde.c:85 +#: plugins/sudoers/iolog.c:118 plugins/sudoers/policy.c:1088 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:1307 +#: plugins/sudoers/testsudoers.c:219 plugins/sudoers/testsudoers.c:386 +#, c-format +msgid "unknown user: %s" +msgstr "未知使用者:%s" + +#: plugins/sudoers/cvtsudoers.c:194 +#, c-format +msgid "order increment: %s: %s" +msgstr "新增順序:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:210 +#, c-format +msgid "starting order: %s: %s" +msgstr "順序開頭:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:220 +#, c-format +msgid "order padding: %s: %s" +msgstr "順序間距:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:230 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s 語法版本 %d\n" + +#: plugins/sudoers/cvtsudoers.c:247 plugins/sudoers/testsudoers.c:167 +#, c-format +msgid "unsupported input format %s" +msgstr "不支援的輸入格式 %s" + +#: plugins/sudoers/cvtsudoers.c:262 +#, c-format +msgid "unsupported output format %s" +msgstr "不支援的輸出格式 %s" + +#: plugins/sudoers/cvtsudoers.c:314 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s:輸入及輸出檔案必須不一致" + +#: plugins/sudoers/cvtsudoers.c:330 plugins/sudoers/sudoers.c:178 +#: plugins/sudoers/testsudoers.c:258 plugins/sudoers/visudo.c:249 +#: plugins/sudoers/visudo.c:603 plugins/sudoers/visudo.c:926 +msgid "unable to initialize sudoers default values" +msgstr "無法初始化 sudoers 預設值" + +#: plugins/sudoers/cvtsudoers.c:416 plugins/sudoers/ldap_conf.c:431 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:475 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s:關鍵詞未知:%s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid defaults type: %s" +msgstr "預設類型無效:%s" + +#: plugins/sudoers/cvtsudoers.c:544 +#, c-format +msgid "invalid suppression type: %s" +msgstr "隱藏類型無效:%s" + +#: plugins/sudoers/cvtsudoers.c:584 plugins/sudoers/cvtsudoers.c:598 +#, c-format +msgid "invalid filter: %s" +msgstr "篩選器無效:%s" + +#: plugins/sudoers/cvtsudoers.c:617 plugins/sudoers/cvtsudoers.c:634 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:872 +#: plugins/sudoers/cvtsudoers_ldif.c:688 plugins/sudoers/sudoers.c:1053 +#: plugins/sudoers/sudoreplay.c:1435 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:922 +#, c-format +msgid "unable to open %s" +msgstr "無法開啟 %s" + +#: plugins/sudoers/cvtsudoers.c:637 plugins/sudoers/visudo.c:931 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "無法解析 %s 檔案,原因:未知錯誤" + +#: plugins/sudoers/cvtsudoers.c:645 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "因接近行 %2$d 的 %1$s 字串而導致解析錯誤\n" + +#: plugins/sudoers/cvtsudoers.c:648 +#, c-format +msgid "parse error in %s\n" +msgstr "因 %s 導致解析錯誤\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:325 plugins/sudoers/timestamp.c:328 +#, c-format +msgid "unable to write to %s" +msgstr "無法寫入 %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - 轉換 sudoers 檔案之間的格式\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"選項:\n" +" -b, --base=dn 用於 sudo LDAP 查詢的基礎 DN\n" +" -c, --config=設定檔 組態設定檔的路徑\n" +" -d, --defaults=deftypes 只轉換指定類型的預設值\n" +" -e, --expand-aliases 在轉換時展開別名\n" +" -f, --output-format=格式 設定輸出格式:JSON、LDIF 或 sudoers\n" +" -i, --input-format=格式 設定輸入格式:LDIF 或 sudoers\n" +" -I, --increment=量 每個 sudoOrder 的增加量\n" +" -h, --help 顯示說明訊息後退出\n" +" -m, --match=篩選器 只轉換符合過濾器的條目\n" +" -M, --match-local 符合使用 passwd 和群組資料庫的篩選器\n" +" -o, --output=輸出檔 將轉換後的 sudoers 寫入 <輸出檔>\n" +" -O, --order-start=起點值 第一個 sudoOrder 的起點\n" +" -p, --prune-matches 清理不符合的使用者、群組和主機\n" +" -P, --padding=間隔 sudoOrder 的增加間隔\n" +" -s, --suppress=部份 隱藏某些部分的輸出\n" +" -V, --version 顯示版本訊息後退出" + +#: plugins/sudoers/cvtsudoers_json.c:480 plugins/sudoers/cvtsudoers_json.c:514 +#: plugins/sudoers/cvtsudoers_json.c:713 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "預設項目「%s」未知" + +#: plugins/sudoers/cvtsudoers_json.c:651 plugins/sudoers/cvtsudoers_json.c:664 +#: plugins/sudoers/cvtsudoers_ldif.c:346 plugins/sudoers/cvtsudoers_ldif.c:357 +#: plugins/sudoers/ldap.c:503 +msgid "unable to get GMT time" +msgstr "無法取得 GMT 時間" + +#: plugins/sudoers/cvtsudoers_json.c:654 plugins/sudoers/cvtsudoers_json.c:667 +#: plugins/sudoers/cvtsudoers_ldif.c:349 plugins/sudoers/cvtsudoers_ldif.c:360 +#: plugins/sudoers/ldap.c:509 +msgid "unable to format timestamp" +msgstr "無法格式化時間戳" + +#: plugins/sudoers/cvtsudoers_ldif.c:640 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "過多 sudoers 項,最大值為 %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:683 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "未設定 SUDOERS_BASE 環境變數,且亦未指定 -b 選項。" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "若使用了 syslog 記錄,要使用的 syslog 裝置:%s" + +#: plugins/sudoers/def_data.c:54 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "使用者認證成功時要使用的 syslog 記錄優先級:%s" + +#: plugins/sudoers/def_data.c:58 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "使用者認證不成功時使用的 syslog 記錄優先級:%s" + +#: plugins/sudoers/def_data.c:62 +msgid "Put OTP prompt on its own line" +msgstr "將 OPT 提示放在獨自的行中" + +#: plugins/sudoers/def_data.c:66 +msgid "Ignore '.' in $PATH" +msgstr "忽略 $PATH 中的「.」" + +#: plugins/sudoers/def_data.c:70 +msgid "Always send mail when sudo is run" +msgstr "永遠在 sudo 執行時傳送信件" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if user authentication fails" +msgstr "使用者認證失敗後傳送信件" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not in sudoers" +msgstr "當使用者不在 sudoers 中時傳送信件" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "當使用者不在此主機的 sudoers 中時傳送信件" + +#: plugins/sudoers/def_data.c:86 +msgid "Send mail if the user is not allowed to run a command" +msgstr "當使用者不允許執行某指令時傳送信件" + +#: plugins/sudoers/def_data.c:90 +msgid "Send mail if the user tries to run a command" +msgstr "當使用者嘗試執行某指令時傳送信件" + +#: plugins/sudoers/def_data.c:94 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "對每個使用者和終端組合使用單獨的時間戳" + +#: plugins/sudoers/def_data.c:98 +msgid "Lecture user the first time they run sudo" +msgstr "在使用者第一次執行 sudo 時,通知使用者相關使用指引" + +#: plugins/sudoers/def_data.c:102 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "包含 sudo 使用指引的檔案:%s" + +#: plugins/sudoers/def_data.c:106 +msgid "Require users to authenticate by default" +msgstr "預設要求使用者認證" + +#: plugins/sudoers/def_data.c:110 +msgid "Root may run sudo" +msgstr "Root 可以執行 sudo" + +#: plugins/sudoers/def_data.c:114 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "在(非 syslog)記錄檔中記錄主機名稱" + +#: plugins/sudoers/def_data.c:118 +msgid "Log the year in the (non-syslog) log file" +msgstr "在(非 syslog)記錄檔中記錄年份" + +#: plugins/sudoers/def_data.c:122 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "若 sudo 不傳入參數呼叫,就開啟 shell" + +#: plugins/sudoers/def_data.c:126 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "若以 -s 參數開啟 shell,就設定目標使用者的 $HOME" + +#: plugins/sudoers/def_data.c:130 +msgid "Always set $HOME to the target user's home directory" +msgstr "永遠將 $HOME 設定為目標使用者的家目錄" + +#: plugins/sudoers/def_data.c:134 +msgid "Allow some information gathering to give useful error messages" +msgstr "允許收集一些訊息以提供有用的錯誤訊息" + +#: plugins/sudoers/def_data.c:138 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "要求在 sudoers 檔案中包含完整的主機名稱" + +#: plugins/sudoers/def_data.c:142 +msgid "Insult the user when they enter an incorrect password" +msgstr "在使用者輸入錯誤密碼時嘲諷他們" + +#: plugins/sudoers/def_data.c:146 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "只允許有終端的使用者執行 sudo" + +#: plugins/sudoers/def_data.c:150 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo 將優先考慮 EDITOR 環境變數" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for root's password, not the users's" +msgstr "詢問 root 使用者的密碼而非使用者的密碼" + +#: plugins/sudoers/def_data.c:158 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "詢問 runas_default 使用者的密碼,而非使用者密碼" + +#: plugins/sudoers/def_data.c:162 +msgid "Prompt for the target user's password, not the users's" +msgstr "詢問目標使用者的密碼,而非使用者密碼" + +#: plugins/sudoers/def_data.c:166 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "若有則套用目標使用者登入類別中的預設設定" + +#: plugins/sudoers/def_data.c:170 +msgid "Set the LOGNAME and USER environment variables" +msgstr "設定 LOGNAME 和 USER 環境變數" + +#: plugins/sudoers/def_data.c:174 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "只將有效使用者 ID 設為目標使用者的 ID,而非實際使用者的 ID" + +#: plugins/sudoers/def_data.c:178 +msgid "Don't initialize the group vector to that of the target user" +msgstr "不將群組集合初始化成目標使用者的群組集合" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "記錄檔案要換行的長度 (0 則不換行):%u" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "認證時間戳逾時:%.1f 分鐘" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "密碼提示逾時:%.1f 分鐘" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "密碼輸入嘗試次數:%u" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "要使用的 umask,或設定 0777 以使用使用者的 umask:0%o" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Path to log file: %s" +msgstr "記錄檔案路徑:%s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Path to mail program: %s" +msgstr "郵件程式路徑:%s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Flags for mail program: %s" +msgstr "郵件程式旗標:%s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Address to send mail to: %s" +msgstr "傳送郵件的位址:%s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Address to send mail from: %s" +msgstr "接收郵件的位址:%s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "郵件訊息的主旨:%s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Incorrect password message: %s" +msgstr "密碼不正確的訊息:%s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "指引狀態資料夾的路徑:%s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "認證時間戳資料夾的路徑:%s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "認證時間戳的所有者:%s" + +#: plugins/sudoers/def_data.c:242 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "此群組內的使用者不需要輸入密碼和 PATH:%s" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default password prompt: %s" +msgstr "預設密碼提示:%s" + +#: plugins/sudoers/def_data.c:250 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "如果設定,密碼提示將覆蓋所有情況下的系統提示。" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "要執行指令的預設使用者:%s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "要覆蓋使用者 $PATH 變數的值:%s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "visudo 所使用編輯器的路徑:%s" + +#: plugins/sudoers/def_data.c:266 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "何時要為「list」偽指令請求密碼:%s" + +#: plugins/sudoers/def_data.c:270 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "何時要為「verify」偽指令請求密碼:%s" + +#: plugins/sudoers/def_data.c:274 +msgid "Preload the sudo_noexec library which replaces the exec functions" +msgstr "預載會替換掉 exec 函數的 sudo_noexec 函式庫" + +#: plugins/sudoers/def_data.c:278 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "如果有啟用 LDAP 目錄,是否要忽略本機的 sudoers 檔案" + +#: plugins/sudoers/def_data.c:282 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr ">= %d 的檔案描述符將會在執行指令前關閉" + +#: plugins/sudoers/def_data.c:286 +msgid "If set, users may override the value of \"closefrom\" with the -C option" +msgstr "如果設定,使用者可以透過 -C 選項覆蓋「closefrom」的值" + +#: plugins/sudoers/def_data.c:290 +msgid "Allow users to set arbitrary environment variables" +msgstr "允許使用者設定任意的環境變數" + +#: plugins/sudoers/def_data.c:294 +msgid "Reset the environment to a default set of variables" +msgstr "將環境重設為預設的變數集" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to check for safety:" +msgstr "用來檢查安全性的環境變數:" + +#: plugins/sudoers/def_data.c:302 +msgid "Environment variables to remove:" +msgstr "要移除的環境變數:" + +#: plugins/sudoers/def_data.c:306 +msgid "Environment variables to preserve:" +msgstr "要保留的環境變數:" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "要在新的安全上下文中使用的 SELinux 角色:%s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "要在新的安全上下文中使用的 SELinux 類型:%s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "sudo 特定環境檔案的路徑:%s" + +#: plugins/sudoers/def_data.c:322 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "受限 sudo 特定環境檔案的路徑:%s" + +#: plugins/sudoers/def_data.c:326 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "解析 sudoers 時要使用的區域設定:%s" + +#: plugins/sudoers/def_data.c:330 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "允許 sudo 詢問密碼,即使它不可見" + +#: plugins/sudoers/def_data.c:334 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "使用者在密碼提示輸入時提供視覺回饋" + +#: plugins/sudoers/def_data.c:338 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "使用不太精確但不用存取檔案系統的較快 glob 方法" + +#: plugins/sudoers/def_data.c:342 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "sudoers 中指定的 umask 會覆蓋使用者的 umask,即使使用者允許的權限更多" + +#: plugins/sudoers/def_data.c:346 +msgid "Log user's input for the command being run" +msgstr "記錄指令執行時使用者的輸入內容" + +#: plugins/sudoers/def_data.c:350 +msgid "Log the output of the command being run" +msgstr "記錄指令執行時的輸出內容" + +#: plugins/sudoers/def_data.c:354 +msgid "Compress I/O logs using zlib" +msgstr "使用 zlib 壓縮 I/O 記錄" + +#: plugins/sudoers/def_data.c:358 +msgid "Always run commands in a pseudo-tty" +msgstr "總是在偽終端中執行指令" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "用於非 Unix 群組支援的外掛程式:%s" + +#: plugins/sudoers/def_data.c:366 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "用於儲存輸入/輸出記錄的目錄:%s" + +#: plugins/sudoers/def_data.c:370 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "用於儲存輸入/輸出記錄的檔案:%s" + +#: plugins/sudoers/def_data.c:374 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "在分配偽終端時向 utmp/utmpx 檔案中附加一條記錄" + +#: plugins/sudoers/def_data.c:378 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "將 utmp 中的使用者設為 runas 使用者,而不是呼叫使用者" + +#: plugins/sudoers/def_data.c:382 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "核准的權限集合:%s" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "限制的權限集合:%s" + +#: plugins/sudoers/def_data.c:390 +msgid "Run commands on a pty in the background" +msgstr "在背景的偽終端上執行指令" + +#: plugins/sudoers/def_data.c:394 +#, c-format +msgid "PAM service name to use: %s" +msgstr "要使用的 PAM 服務名稱:%s" + +#: plugins/sudoers/def_data.c:398 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "用於登入 shell 的 PAM 服務名稱:%s" + +#: plugins/sudoers/def_data.c:402 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "嘗試為目標使用者建立 PAM 憑證" + +#: plugins/sudoers/def_data.c:406 +msgid "Create a new PAM session for the command to run in" +msgstr "建立一個新的 PAM 工作階段來執行該指令" + +#: plugins/sudoers/def_data.c:410 +msgid "Perform PAM account validation management" +msgstr "執行 PAM 帳戶驗證管理工具" + +#: plugins/sudoers/def_data.c:414 +#, c-format +msgid "Maximum I/O log sequence number: %s" +msgstr "最大 I/O 記錄序號:%s" + +#: plugins/sudoers/def_data.c:418 +msgid "Enable sudoers netgroup support" +msgstr "啟用 sudoers netgroup 支援" + +#: plugins/sudoers/def_data.c:422 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "在使用 sudoedit 編輯檔案時檢查上層目錄是否可寫" + +#: plugins/sudoers/def_data.c:426 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "使用 sudoedit 編輯檔案時跟隨符號連結(定位到原檔案)" + +#: plugins/sudoers/def_data.c:430 +msgid "Query the group plugin for unknown system groups" +msgstr "透過群組外掛程式查詢未知的系統群組" + +#: plugins/sudoers/def_data.c:434 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "基於整個元組(使用者、主機和網域)來符合網路群組" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "即使 sudo 無法寫入稽核記錄也允許執行指令" + +#: plugins/sudoers/def_data.c:442 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "即使 sudo 無法寫入 I/O 記錄也允許執行指令" + +#: plugins/sudoers/def_data.c:446 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "即使 sudo 無法寫入記錄檔案也允許執行指令" + +#: plugins/sudoers/def_data.c:450 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "解析 sudoers 中的群組並基於群組 ID(不是名稱)比較" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "大於此數值的記錄條目會分為多條 syslog 訊息:%u" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "將擁有 I/O 記錄檔案的使用者:%s" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "將擁有 I/O 記錄檔案的群組:%s" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "I/O 記錄檔案要使用的檔案模式:0%o" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "根據檔案描述符執行指令,而非根據路徑:%s" + +#: plugins/sudoers/def_data.c:474 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "忽略 sudoers 中未知的預設 (Defaults) 條目而非產生警告" + +#: plugins/sudoers/def_data.c:478 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "超過指定時間後終止指令 (秒):%u" + +#: plugins/sudoers/def_data.c:482 +msgid "Allow the user to specify a timeout on the command line" +msgstr "允許使用者在指令行中指定逾時時間" + +#: plugins/sudoers/def_data.c:486 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "立即重新整理 I/O 記錄資料而非快取資料" + +#: plugins/sudoers/def_data.c:490 +msgid "Include the process ID when logging via syslog" +msgstr "透過 syslog 登入時包含行程 ID" + +#: plugins/sudoers/def_data.c:494 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "認證時間戳記錄的類型:%s" + +#: plugins/sudoers/def_data.c:498 +#, c-format +msgid "Authentication failure message: %s" +msgstr "認證失敗訊息:%s" + +#: plugins/sudoers/def_data.c:502 +msgid "Ignore case when matching user names" +msgstr "在比較使用者名稱時忽略大小寫" + +#: plugins/sudoers/def_data.c:506 +msgid "Ignore case when matching group names" +msgstr "在比較群組名稱時忽略大小寫" + +#: plugins/sudoers/def_data.c:510 +msgid "Log when a command is allowed by sudoers" +msgstr "當指令被 sudoers 允許通行時記錄" + +#: plugins/sudoers/def_data.c:514 +msgid "Log when a command is denied by sudoers" +msgstr "當指令被 sudoers 拒絕通行時記錄" + +#: plugins/sudoers/def_data.c:518 +msgid "Sudo log server(s) to connect to with optional port" +msgstr "要連線的 Sudo 記錄伺服器 (可加連線埠)" + +#: plugins/sudoers/def_data.c:522 +#, c-format +msgid "Sudo log server timeout in seconds: %u" +msgstr "Sudo 記錄伺服器逾時 (秒):%u" + +#: plugins/sudoers/def_data.c:526 +msgid "Enable SO_KEEPALIVE socket option on the socket connected to the logserver" +msgstr "請在已連線至記錄伺服器的 socket 通訊端啟用 SO_KEEPALIVE socket 選項" + +#: plugins/sudoers/def_data.c:530 +#, c-format +msgid "Path to the audit server's CA bundle file: %s" +msgstr "稽核伺服器的 CA 組合 (bundle) 檔案路徑:%s" + +#: plugins/sudoers/def_data.c:534 +#, c-format +msgid "Path to the sudoers certificate file: %s" +msgstr "sudoers 憑證檔案的路徑:%s" + +#: plugins/sudoers/def_data.c:538 +#, c-format +msgid "Path to the sudoers private key file: %s" +msgstr "sudoers 私鑰檔案的路徑:%s" + +#: plugins/sudoers/def_data.c:542 +msgid "Verify that the log server's certificate is valid" +msgstr "核驗記錄伺服器的憑證是否有效" + +#: plugins/sudoers/def_data.c:546 +msgid "Allow the use of unknown runas user and/or group ID" +msgstr "允許使用未知 runas 使用者及 (或) 群組 ID" + +#: plugins/sudoers/def_data.c:550 +msgid "Only permit running commands as a user with a valid shell" +msgstr "只允許以使用有效 Shell 的使用者執行命令" + +#: plugins/sudoers/def_data.c:554 +msgid "Set the pam remote user to the user running sudo" +msgstr "設定 pam 遠端使用者為執行 sudo 的使用者" + +#: plugins/sudoers/def_data.c:558 +msgid "Set the pam remote host to the local host name" +msgstr "設定 pam 遠端主機至本機主機名稱" + +#: plugins/sudoers/def_data.c:562 +#, c-format +msgid "Working directory to change to before executing the command: %s" +msgstr "執行命令前,要切換到的工作目錄:%s" + +#: plugins/sudoers/def_data.c:566 +#, c-format +msgid "Root directory to change to before executing the command: %s" +msgstr "執行命令前,要切換到的根目錄:%s" + +#: plugins/sudoers/def_data.c:570 +#, c-format +msgid "The format of logs to produce: %s" +msgstr "要產出的記錄格式:%s" + +#: plugins/sudoers/defaults.c:185 +#, c-format +msgid "%s:%d:%d: unknown defaults entry \"%s\"" +msgstr "%s:%d:%d: 未知的預設條目「%s」" + +#: plugins/sudoers/defaults.c:188 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s:未知的預設條目「%s」" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s:%d:%d: no value specified for \"%s\"" +msgstr "%s:%d:%d: 沒有指定「%s」的值" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s:沒有給「%s」指定值" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d:%d: option \"%s\" does not take a value" +msgstr "%s:%d:%d: 「%s」選項不帶值" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s:「%s」選項不帶值" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s:%d:%d: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:%2$d:%3$d: 選項「%5$s」的預設 (Defaults) 類型 0x%4$x 無效" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:選項「%3$s」的預設類型 0x%2$x 無效" + +#: plugins/sudoers/defaults.c:316 +#, c-format +msgid "%s:%d:%d: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d:%d: 「%s」值對「%s」選項無效" + +#: plugins/sudoers/defaults.c:319 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:值「%s」對選項「%s」無效" + +#: plugins/sudoers/defaults.c:1030 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s:%d:%d: \"%s\" 的值開頭必須是 '/'、'~' 或 '*'" + +#: plugins/sudoers/defaults.c:1034 +#, c-format +msgid "%s: values for \"%s\" must start with a '/', '~', or '*'" +msgstr "%s: \"%s\" 的值開頭必須是 '/'、'~' 或 '*'" + +#: plugins/sudoers/defaults.c:1045 +#, c-format +msgid "%s:%d:%d: values for \"%s\" must start with a '/'" +msgstr "%s:%d:%d: \"%s\" 的值開頭必須是 '/'" + +#: plugins/sudoers/defaults.c:1049 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s:「%s」的值必須以「/」開頭" + +#: plugins/sudoers/env.c:405 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv:envp 損壞,長度不符" + +#: plugins/sudoers/env.c:1133 +msgid "unable to rebuild the environment" +msgstr "無法重建環境" + +#: plugins/sudoers/env.c:1207 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "對不起,您沒有權限設定以下環境變數:%s" + +#: plugins/sudoers/file.c:107 +#, c-format +msgid "parse error in %s near line %d" +msgstr "解析接近第 %2$d 行的 %1$s 時發生錯誤" + +#: plugins/sudoers/file.c:110 +#, c-format +msgid "parse error in %s" +msgstr "解析 %s 中的內容時發生錯誤" + +#: plugins/sudoers/filedigest.c:49 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "不支援 %2$s 的摘要類型 %1$d" + +#: plugins/sudoers/filedigest.c:78 +#, c-format +msgid "%s: read error" +msgstr "%s:讀取錯誤" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s 必須由使用者 ID %d 所有" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s 必須只允許所有者可寫" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:569 +#, c-format +msgid "unable to load %s: %s" +msgstr "無法載入 %s:%s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "無法在 %s 中找到符號「group_plugin」" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s:不相容的群組外掛程式主要版本號碼 %d,版本應該為 %d" + +#: plugins/sudoers/interfaces.c:80 plugins/sudoers/interfaces.c:97 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "無法解析 IP 位址列表「%s」" + +#: plugins/sudoers/interfaces.c:85 plugins/sudoers/interfaces.c:102 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "無法解析網路遮罩「%s」" + +#: plugins/sudoers/interfaces.c:130 +msgid "Local IP address and netmask pairs:\n" +msgstr "本機 IP 位址和網路遮罩配對:\n" + +#: plugins/sudoers/iolog.c:143 plugins/sudoers/sudoers.c:445 +#: plugins/sudoers/sudoers.c:1341 plugins/sudoers/testsudoers.c:410 +#, c-format +msgid "unknown group: %s" +msgstr "未知群組:%s" + +#: plugins/sudoers/iolog.c:622 +msgid "unable to update sequence file" +msgstr "無法更新序列檔" + +#: plugins/sudoers/iolog.c:653 plugins/sudoers/iolog.c:841 +#: plugins/sudoers/iolog.c:994 plugins/sudoers/iolog.c:1001 +#: plugins/sudoers/iolog.c:1122 plugins/sudoers/iolog.c:1129 +#: plugins/sudoers/iolog.c:1228 plugins/sudoers/iolog.c:1235 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "無法寫入 I/O 記錄檔案:%s" + +#: plugins/sudoers/iolog.c:661 +#, c-format +msgid "unable to create %s/%s" +msgstr "無法建立 %s/%s" + +#: plugins/sudoers/iolog.c:886 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s:內部錯誤,未開啟事件 %d 的 I/O 記錄檔案" + +#: plugins/sudoers/iolog.c:979 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1212 plugins/sudoers/timestamp.c:855 +#: plugins/sudoers/timestamp.c:947 plugins/sudoers/visudo.c:493 +#: plugins/sudoers/visudo.c:499 +msgid "unable to read the clock" +msgstr "無法讀取時鐘" + +#: plugins/sudoers/iolog.c:1204 plugins/sudoers/log_client.c:1193 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s:內部錯誤,訊號 %d 無效" + +#: plugins/sudoers/ldap.c:177 plugins/sudoers/ldap_conf.c:291 +msgid "starttls not supported when using ldaps" +msgstr "使用 ldaps 時不支援使用 starttls" + +#: plugins/sudoers/ldap.c:248 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "無法初始化 SSL 憑證和金鑰資料庫:%s" + +#: plugins/sudoers/ldap.c:251 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "要使用 SSL,您必須在 %s 設定 TLS_CERT" + +#: plugins/sudoers/ldap.c:1660 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "無法初始化 LDAP:%s" + +#: plugins/sudoers/ldap.c:1697 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "指定了 start_tls,但 LDAP 函式庫不支援 ldap_start_tls_s() 或 ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1834 plugins/sudoers/parse_ldif.c:744 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "無效的 sudoOrder 屬性:%s" + +#: plugins/sudoers/ldap_conf.c:200 +#, c-format +msgid "%s: port too large" +msgstr "%s:連線埠過大" + +#: plugins/sudoers/ldap_conf.c:260 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "不支援的 LDAP URI 類型:%s" + +#: plugins/sudoers/ldap_conf.c:287 +msgid "unable to mix ldap and ldaps URIs" +msgstr "無法混合 ldap 和 ldaps URI" + +#: plugins/sudoers/ldap_util.c:553 plugins/sudoers/ldap_util.c:555 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "無法轉換 sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:58 +msgid "unable to open audit system" +msgstr "無法開啟稽核系統" + +#: plugins/sudoers/linux_audit.c:101 +msgid "unable to send audit message" +msgstr "無法傳送稽核訊息" + +#: plugins/sudoers/log_client.c:113 plugins/sudoers/log_client.c:391 +#: plugins/sudoers/log_client.c:1431 plugins/sudoers/log_client.c:2023 +msgid "error in event loop" +msgstr "事件循環中發生錯誤" + +#: plugins/sudoers/log_client.c:193 +#, c-format +msgid "Creation of new SSL_CTX object failed: %s" +msgstr "建立新 SSL_CTX 物件失敗:%s" + +#: plugins/sudoers/log_client.c:345 plugins/sudoers/log_client.c:350 +#, c-format +msgid "TLS connection to %s:%s failed: %s" +msgstr "TLS 連線至 %s:%s 失敗:%s" + +#: plugins/sudoers/log_client.c:519 +msgid "TLS initialization was unsuccessful" +msgstr "TLS 初始化失敗" + +#: plugins/sudoers/log_client.c:528 +msgid "TLS handshake was unsuccessful" +msgstr "TLS 交握失敗" + +#: plugins/sudoers/log_client.c:1202 +#, c-format +msgid "%s: internal error, invalid exit status %d" +msgstr "%s:內部錯誤,退出狀態碼 %d 無效" + +#: plugins/sudoers/log_client.c:1738 +msgid "lost connection to log server" +msgstr "失去對記錄伺服器的連線" + +#: plugins/sudoers/log_client.c:1815 +msgid "missing write buffer" +msgstr "缺少寫入緩衝區" + +#: plugins/sudoers/log_client.c:1964 +msgid "unable to connect to log server" +msgstr "無法連線到記錄伺服器" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "使用者不在 sudoers 中" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "使用者未取得此主機上的授權" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "不允許使用指令" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s 不在 sudoers 檔案中。此事件將會回報。\n" + +#: plugins/sudoers/logging.c:272 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s 沒有權限在 %s 上執行 sudo。此事件將會回報。\n" + +#: plugins/sudoers/logging.c:276 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "對不起,使用者 %s 不能在 %s 上執行 sudo。\n" + +#: plugins/sudoers/logging.c:279 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "對不起,使用者 %1$s 不允許以 %8$s 上的 %5$s%6$s%7$s 身份執行「%2$s%3$s%4$s」\n" + +#: plugins/sudoers/logging.c:316 plugins/sudoers/sudoers.c:583 +#: plugins/sudoers/sudoers.c:585 plugins/sudoers/sudoers.c:587 +#: plugins/sudoers/sudoers.c:589 plugins/sudoers/sudoers.c:739 +#: plugins/sudoers/sudoers.c:741 +#, c-format +msgid "%s: command not found" +msgstr "%s:找不到指令" + +#: plugins/sudoers/logging.c:318 plugins/sudoers/sudoers.c:579 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"忽略在「.」中找到的「%s」\n" +"請使用「sudo ./%s」,若這是您想執行的「%s」。" + +#: plugins/sudoers/logging.c:337 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u 次密碼錯誤嘗試" + +#: plugins/sudoers/logging.c:393 +msgid "authentication failure" +msgstr "認證失敗" + +#: plugins/sudoers/logging.c:433 plugins/sudoers/logging.c:453 +msgid "a password is required" +msgstr "需要密碼" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to open log file: %s" +msgstr "無法開啟記錄檔案:%s" + +#: plugins/sudoers/logging.c:762 +#, c-format +msgid "unable to write log file: %s" +msgstr "無法寫入記錄檔案:%s" + +#: plugins/sudoers/match_digest.c:129 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "%s(%s) 的摘要的形式不是 %s" + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP 角色:%s\n" + +#: plugins/sudoers/parse.c:521 +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers 條目:\n" + +#: plugins/sudoers/parse.c:523 +msgid " RunAsUsers: " +msgstr " RunAs 使用者:" + +#: plugins/sudoers/parse.c:538 +msgid " RunAsGroups: " +msgstr " RunAs 群組:" + +#: plugins/sudoers/parse.c:548 +msgid " Options: " +msgstr " 選項:" + +#: plugins/sudoers/parse.c:602 +msgid " Commands:\n" +msgstr " 指令:\n" + +#: plugins/sudoers/parse.c:793 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "比較 %s (%s 上) 的預設條目:\n" + +#: plugins/sudoers/parse.c:811 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "%s RunAs 和指令指定的預設值:\n" + +#: plugins/sudoers/parse.c:829 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "使用者 %s 可以在 %s 上執行以下指令:\n" + +#: plugins/sudoers/parse.c:844 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "使用者 %s 沒有權限在 %s 上執行 sudo。\n" + +#: plugins/sudoers/parse_ldif.c:614 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "將忽略不完整的 sudoRole:cn:%s" + +#: plugins/sudoers/parse_ldif.c:674 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "LDIF 屬性無效:%s" + +#: plugins/sudoers/policy.c:78 plugins/sudoers/policy.c:102 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "sudo 前端設定的 %.*s 無效" + +#: plugins/sudoers/policy.c:310 plugins/sudoers/testsudoers.c:272 +msgid "unable to parse network address list" +msgstr "無法解析網路位址列表" + +#: plugins/sudoers/policy.c:455 +msgid "user name not set by sudo front-end" +msgstr "sudo 前端未設定使用者名稱" + +#: plugins/sudoers/policy.c:459 +msgid "user-ID not set by sudo front-end" +msgstr "sudo 前端未設定使用者 ID (user-ID)" + +#: plugins/sudoers/policy.c:463 +msgid "group-ID not set by sudo front-end" +msgstr "sudo 前端未設定群組 ID (group-ID)" + +#: plugins/sudoers/policy.c:467 +msgid "host name not set by sudo front-end" +msgstr "sudo 前端未設定主機名稱" + +#: plugins/sudoers/policy.c:643 +#, c-format +msgid "invalid working directory: %s" +msgstr "無效的工作目錄:%s" + +#: plugins/sudoers/policy.c:811 +#, c-format +msgid "invalid chroot directory: %s" +msgstr "無效的 chroot 目錄:%s" + +#: plugins/sudoers/policy.c:947 plugins/sudoers/visudo.c:231 +#: plugins/sudoers/visudo.c:860 +#, c-format +msgid "unable to execute %s" +msgstr "無法執行 %s" + +#: plugins/sudoers/policy.c:1111 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers 策略外掛程式版本 %s\n" + +#: plugins/sudoers/policy.c:1113 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers 檔案文法版本 %d\n" + +#: plugins/sudoers/policy.c:1117 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers 路徑:%s\n" + +#: plugins/sudoers/policy.c:1120 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch 路徑:%s\n" + +#: plugins/sudoers/policy.c:1122 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf 路徑:%s\n" + +#: plugins/sudoers/policy.c:1123 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret 路徑:%s\n" + +#: plugins/sudoers/policy.c:1156 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "無法註冊類型為 %d 的觸發器 (版本 %d.%d)" + +#: plugins/sudoers/pwutil.c:217 plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u" +msgstr "無法快取使用者 ID %u" + +#: plugins/sudoers/pwutil.c:229 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "無法快取使用者 ID %u,原因:使用者 ID 已存在" + +#: plugins/sudoers/pwutil.c:289 plugins/sudoers/pwutil.c:307 +#: plugins/sudoers/pwutil.c:370 plugins/sudoers/pwutil.c:415 +#, c-format +msgid "unable to cache user %s" +msgstr "無法快取 %s 使用者" + +#: plugins/sudoers/pwutil.c:302 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "無法快取使用者 %s,原因:已存在" + +#: plugins/sudoers/pwutil.c:534 plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache gid %u" +msgstr "無法快取群組 ID %u" + +#: plugins/sudoers/pwutil.c:546 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "無法快取群組 ID %u,原因:已經存在" + +#: plugins/sudoers/pwutil.c:599 plugins/sudoers/pwutil.c:617 +#: plugins/sudoers/pwutil.c:665 plugins/sudoers/pwutil.c:707 +#, c-format +msgid "unable to cache group %s" +msgstr "無法快取 %s 群組" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "無法快取群組 %s,原因:已經存在" + +#: plugins/sudoers/pwutil.c:834 plugins/sudoers/pwutil.c:885 +#: plugins/sudoers/pwutil.c:935 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "無法快取群組列表 %s,原因:已經存在" + +#: plugins/sudoers/pwutil.c:840 plugins/sudoers/pwutil.c:890 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s" +msgstr "無法快取 %s 的群組列表" + +#: plugins/sudoers/pwutil.c:879 +#, c-format +msgid "unable to parse groups for %s" +msgstr "無法解析 %s 的群組" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "無法解析 %s 的群組 ID" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:441 +#: plugins/sudoers/set_perms.c:844 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1444 +msgid "perm stack overflow" +msgstr "權限堆疊溢位" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:372 +#: plugins/sudoers/set_perms.c:449 plugins/sudoers/set_perms.c:711 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1074 +#: plugins/sudoers/set_perms.c:1158 plugins/sudoers/set_perms.c:1377 +#: plugins/sudoers/set_perms.c:1452 plugins/sudoers/set_perms.c:1542 +msgid "perm stack underflow" +msgstr "權限堆疊反向溢位" + +#: plugins/sudoers/set_perms.c:181 plugins/sudoers/set_perms.c:495 +#: plugins/sudoers/set_perms.c:1211 plugins/sudoers/set_perms.c:1485 +msgid "unable to change to root gid" +msgstr "無法切換為 root 群組 ID" + +#: plugins/sudoers/set_perms.c:272 plugins/sudoers/set_perms.c:592 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas gid" +msgstr "無法切換為 runas 群組 ID" + +#: plugins/sudoers/set_perms.c:277 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:988 plugins/sudoers/set_perms.c:1293 +msgid "unable to set runas group vector" +msgstr "無法設定 runas 群組集合" + +#: plugins/sudoers/set_perms.c:288 plugins/sudoers/set_perms.c:608 +#: plugins/sudoers/set_perms.c:997 plugins/sudoers/set_perms.c:1302 +msgid "unable to change to runas uid" +msgstr "無法切換成 runas 使用者 ID" + +#: plugins/sudoers/set_perms.c:306 plugins/sudoers/set_perms.c:626 +#: plugins/sudoers/set_perms.c:1013 plugins/sudoers/set_perms.c:1318 +msgid "unable to change to sudoers gid" +msgstr "無法切換為 sudoers 群組 ID" + +#: plugins/sudoers/set_perms.c:359 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1364 +#: plugins/sudoers/set_perms.c:1529 +msgid "too many processes" +msgstr "行程過多" + +#: plugins/sudoers/solaris_audit.c:61 +msgid "unable to get current working directory" +msgstr "無法取得目前工作目錄" + +#: plugins/sudoers/solaris_audit.c:69 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "截短的稽核路徑 user_cmnd:%s" + +#: plugins/sudoers/solaris_audit.c:76 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "截短的稽核路徑 argv[0]:%s" + +#: plugins/sudoers/sssd.c:572 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "無法初始化 SSS 來源。是否已在您的電腦上安裝 SSSD?" + +#: plugins/sudoers/sssd.c:580 plugins/sudoers/sssd.c:589 +#: plugins/sudoers/sssd.c:598 plugins/sudoers/sssd.c:607 +#: plugins/sudoers/sssd.c:616 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "無法在 %2$s 中找到符號「%1$s」" + +#: plugins/sudoers/sudoers.c:214 plugins/sudoers/sudoers.c:1010 +msgid "problem with defaults entries" +msgstr "預設條目有問題" + +#: plugins/sudoers/sudoers.c:218 +msgid "no valid sudoers sources found, quitting" +msgstr "未找到有效的 sudoers 來源,退出" + +#: plugins/sudoers/sudoers.c:292 +#, c-format +msgid "user not allowed to change root directory to %s" +msgstr "不允許使用者切換根目錄至 %s" + +#: plugins/sudoers/sudoers.c:294 +#, c-format +msgid "you are not permitted to use the -R option with %s" +msgstr "不允許您將 -R 選項與 %s 一起使用" + +#: plugins/sudoers/sudoers.c:319 +#, c-format +msgid "user not allowed to change directory to %s" +msgstr "不允許使用者切換至 %s 目錄" + +#: plugins/sudoers/sudoers.c:320 +#, c-format +msgid "you are not permitted to use the -D option with %s" +msgstr "不允許您將 -D 選項與 %s 一起使用" + +#: plugins/sudoers/sudoers.c:351 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers 指定 root 不允許執行 sudo" + +#: plugins/sudoers/sudoers.c:411 +msgid "user not allowed to override closefrom limit" +msgstr "使用者不允許覆蓋 closefrom 限制" + +#: plugins/sudoers/sudoers.c:412 +msgid "you are not permitted to use the -C option" +msgstr "您沒有權限使用 -C 選項" + +#: plugins/sudoers/sudoers.c:472 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "時間戳所有者 (%s):無此使用者" + +#: plugins/sudoers/sudoers.c:487 +msgid "no tty" +msgstr "找不到終端" + +#: plugins/sudoers/sudoers.c:488 +msgid "sorry, you must have a tty to run sudo" +msgstr "抱歉,您必須先要有終端才能執行 sudo" + +#: plugins/sudoers/sudoers.c:495 +#, c-format +msgid "invalid shell for user %s: %s" +msgstr "%s 使用者的 Shell 無效:%s" + +#: plugins/sudoers/sudoers.c:578 +msgid "command in current directory" +msgstr "目前目錄中的指令" + +#: plugins/sudoers/sudoers.c:597 +msgid "user not allowed to set a command timeout" +msgstr "使用者不允許設定命令逾時" + +#: plugins/sudoers/sudoers.c:599 +msgid "sorry, you are not allowed set a command timeout" +msgstr "抱歉,您沒有權限設定逾時時間" + +#: plugins/sudoers/sudoers.c:607 +msgid "user not allowed to preserve the environment" +msgstr "使用者不允許保留環境" + +#: plugins/sudoers/sudoers.c:609 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "抱歉,您沒有權限保留環境" + +#: plugins/sudoers/sudoers.c:945 +msgid "command too long" +msgstr "指令過長" + +#: plugins/sudoers/sudoers.c:1003 +msgid "sudoedit doesn't need to be run via sudo" +msgstr "sudoedit 不用以 sudo 執行" + +#: plugins/sudoers/sudoers.c:1057 plugins/sudoers/sudoreplay.c:1547 +#: plugins/sudoers/tsdump.c:138 +#, c-format +msgid "unable to read %s" +msgstr "無法讀取 %s" + +#: plugins/sudoers/sudoers.c:1082 plugins/sudoers/visudo.c:432 +#: plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to stat %s" +msgstr "無法 stat %s" + +#: plugins/sudoers/sudoers.c:1086 plugins/sudoers/visudo.c:1018 +#, c-format +msgid "%s is not a regular file" +msgstr "%s 不是一般檔案" + +#: plugins/sudoers/sudoers.c:1090 plugins/sudoers/timestamp.c:252 toke.l:1112 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s 由使用者 ID %u 所有,應為 %u" + +#: plugins/sudoers/sudoers.c:1094 toke.l:1117 +#, c-format +msgid "%s is world writable" +msgstr "%s 允許任何人寫入" + +#: plugins/sudoers/sudoers.c:1098 toke.l:1120 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s 屬於群組 ID %u,應為 %u" + +#: plugins/sudoers/sudoers.c:1131 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "只有 root 才能使用「-c %s」" + +#: plugins/sudoers/sudoers.c:1150 +#, c-format +msgid "unknown login class: %s" +msgstr "未知的登入類別:%s" + +#: plugins/sudoers/sudoers.c:1235 plugins/sudoers/sudoers.c:1250 +#, c-format +msgid "unable to resolve host %s" +msgstr "無法解析主機:%s" + +#: plugins/sudoers/sudoreplay.c:257 +#, c-format +msgid "invalid filter option: %s" +msgstr "無效的過濾器選項:%s" + +#: plugins/sudoers/sudoreplay.c:273 +#, c-format +msgid "invalid max wait: %s" +msgstr "無效的最大等待時間:%s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "invalid speed factor: %s" +msgstr "無效的速度因數:%s" + +#: plugins/sudoers/sudoreplay.c:332 +#, c-format +msgid "%s/%.2s/%.2s/%.2s: %s" +msgstr "%s/%.2s/%.2s/%.2s: %s" + +#: plugins/sudoers/sudoreplay.c:337 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/計時:%s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s: %s" +msgstr "%s/%s: %s" + +#: plugins/sudoers/sudoreplay.c:365 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "重播 sudo 工作階段:%s" + +#: plugins/sudoers/sudoreplay.c:627 +msgid "unable to set tty to raw mode" +msgstr "無法將終端設為原始 (RAW) 模式" + +#: plugins/sudoers/sudoreplay.c:678 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "警告:您的終端尺寸太小,不能正常地重播記錄。\n" + +#: plugins/sudoers/sudoreplay.c:679 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "記錄的幾何尺寸為 %dx%d,但您終端的幾何尺寸為 %dx%d。" + +#: plugins/sudoers/sudoreplay.c:707 +msgid "Replay finished, press any key to restore the terminal." +msgstr "重播完成,請按任意鍵返回終端。" + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "不明確的表達式「%s」" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "表達式中的「)」不對稱" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "未知的搜尋詞彙「%s」" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s 需要參數" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1523 +#, c-format +msgid "invalid regular expression: %s" +msgstr "無效的正規表示式:%s" + +#: plugins/sudoers/sudoreplay.c:1276 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "無法解析日期「%s」" + +#: plugins/sudoers/sudoreplay.c:1285 +msgid "unmatched '(' in expression" +msgstr "表達式中的「(」不對稱" + +#: plugins/sudoers/sudoreplay.c:1287 +msgid "illegal trailing \"or\"" +msgstr "無效的結尾字元「or」" + +#: plugins/sudoers/sudoreplay.c:1289 +msgid "illegal trailing \"!\"" +msgstr "無效的結尾字元「!」" + +#: plugins/sudoers/sudoreplay.c:1347 +#, c-format +msgid "unknown search type %d" +msgstr "未知的搜尋類型 %d" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "用法:%s [-hnRS] [-d 目錄] [-m 數值] [-s 數值] ID\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "用法:%s [-h] [-d 目錄] -l [搜尋表達式]\n" + +#: plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - 重播 sudo 工作階段記錄\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1628 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"選項:\n" +" -d, --directory=目錄 指定工作階段的記錄目錄\n" +" -f, --filter=過濾器 指定要顯示的 I/O 類型\n" +" -h, --help 顯示說明訊息並退出\n" +" -l, --list 列出可用工作階段 ID,可加表達式限定列出階段\n" +" -m, --max-wait=數值 事件間等待的最大秒數\n" +" -n, --non-interactive 不提示,將工作階段送至標準輸出\n" +" -R, --no-resize 不嘗試重新調整終端機大小\n" +" -S, --suspend-wait 在指令暫停時等待\n" +" -s, --speed=數值 加速或減速輸出速度\n" +" -V, --version 顯示版本訊息並退出" + +#: plugins/sudoers/testsudoers.c:348 +msgid "\thost unmatched" +msgstr "\t主機不相符" + +#: plugins/sudoers/testsudoers.c:351 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"指令已允許" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"指令被拒" + +#: plugins/sudoers/testsudoers.c:352 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"指令不相符" + +#: plugins/sudoers/timestamp.c:260 +#, c-format +msgid "%s is group writable" +msgstr "%s 允許群組寫入" + +#: plugins/sudoers/timestamp.c:336 plugins/sudoers/timestamp.c:680 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "無法將時間戳檔案截短為 %lld 位元組" + +#: plugins/sudoers/timestamp.c:866 +msgid "ignoring time stamp from the future" +msgstr "將忽略未來時間的時間戳" + +#: plugins/sudoers/timestamp.c:889 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "時間戳超前目前時間過多:%20.20s" + +#: plugins/sudoers/timestamp.c:1011 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "無法鎖定時間戳檔案 %s" + +#: plugins/sudoers/timestamp.c:1055 plugins/sudoers/timestamp.c:1075 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "指引狀態路徑過長:%s/%s" + +#: plugins/sudoers/toke_util.c:124 +msgid "sudoedit should not be specified with a path" +msgstr "sudoedit 不應用路徑指定" + +#: plugins/sudoers/visudo.c:226 +msgid "the -x option will be removed in a future release" +msgstr "未來版本會移除 -x 選項" + +#: plugins/sudoers/visudo.c:228 +msgid "please consider using the cvtsudoers utility instead" +msgstr "請考慮換用 cvtsudoers 工具" + +#: plugins/sudoers/visudo.c:279 plugins/sudoers/visudo.c:659 +#, c-format +msgid "press return to edit %s: " +msgstr "按確認鍵編輯 %s:" + +#: plugins/sudoers/visudo.c:340 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "指定的編輯器 (%s) 不存在" + +#: plugins/sudoers/visudo.c:342 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "未找到編輯器 (編輯器路徑 = %s)" + +#: plugins/sudoers/visudo.c:452 plugins/sudoers/visudo.c:460 +msgid "write error" +msgstr "寫入時發生錯誤" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "無法 stat 暫存檔 (%s),%s 未變更" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "暫存檔內沒有內容 (%s),%s 未變更" + +#: plugins/sudoers/visudo.c:519 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "編輯器 (%s) 執行失敗,%s 未變更" + +#: plugins/sudoers/visudo.c:541 +#, c-format +msgid "%s unchanged" +msgstr "%s 未變更" + +#: plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "無法重新開啟暫存檔 (%s),%s 未變更。" + +#: plugins/sudoers/visudo.c:610 +#, c-format +msgid "unable to parse temporary file (%s), unknown error" +msgstr "無法解析暫存檔 (%s),未知錯誤" + +#: plugins/sudoers/visudo.c:648 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "內部錯誤,原因:列表中找不到 %s!" + +#: plugins/sudoers/visudo.c:728 plugins/sudoers/visudo.c:737 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "無法將 %s 的 (uid, gid) 設為 (%u, %u)" + +#: plugins/sudoers/visudo.c:760 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s 和 %s 不在同一個檔案系統,將使用 mv 進行重新命名" + +#: plugins/sudoers/visudo.c:774 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "指令失敗:「%s %s %s」,%s 未變更" + +#: plugins/sudoers/visudo.c:784 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "重新命名 %s 發生錯誤,%s 未變更" + +#: plugins/sudoers/visudo.c:805 +msgid "What now? " +msgstr "現在該做些什麼?" + +#: plugins/sudoers/visudo.c:819 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"選項有:\n" +" 重新編輯 sudoers 檔案 (e)\n" +" 退出,不儲存對 sudoers 檔案的變更 (x)\n" +" 退出並將變更儲存到 sudoers 檔案(十分危險!)(Q)\n" + +#: plugins/sudoers/visudo.c:865 +#, c-format +msgid "unable to run %s" +msgstr "無法執行 %s" + +#: plugins/sudoers/visudo.c:895 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s:所有者無效,(uid, gid) 應為 (%u, %u)\n" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s:權限不正確,模式應該是 0%o\n" + +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo.c:958 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s:解析正確\n" + +#: plugins/sudoers/visudo.c:977 +#, c-format +msgid "%s busy, try again later" +msgstr "%s 忙碌中,請稍後重試" + +#: plugins/sudoers/visudo.c:980 +#, c-format +msgid "unable to lock %s" +msgstr "無法鎖定 %s" + +#: plugins/sudoers/visudo.c:981 +msgid "Edit anyway? [y/N]" +msgstr "仍然編輯?[y/N]" + +#: plugins/sudoers/visudo.c:1091 +#, c-format +msgid "Error: %s:%d:%d: cycle in %s \"%s\"" +msgstr "錯誤:%s:%d:%d: %s「%s」中有循環" + +#: plugins/sudoers/visudo.c:1092 +#, c-format +msgid "Warning: %s:%d:%d: cycle in %s \"%s\"" +msgstr "警告:%s:%d:%d: %s「%s」中有循環" + +#: plugins/sudoers/visudo.c:1096 +#, c-format +msgid "Error: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "錯誤:%s:%d:%d: 已引用但未定義 %s「%s」" + +#: plugins/sudoers/visudo.c:1097 +#, c-format +msgid "Warning: %s:%d:%d: %s \"%s\" referenced but not defined" +msgstr "警告:%s:%d:%d: 已引用但未定義 %s「%s」" + +#: plugins/sudoers/visudo.c:1188 +#, c-format +msgid "Warning: %s:%d:%d: unused %s \"%s\"" +msgstr "警告:%s:%d:%d: %s「%s」未使用" + +#: plugins/sudoers/visudo.c:1303 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - 安全地編輯 sudoers 檔案\n" +"\n" + +#: plugins/sudoers/visudo.c:1305 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"選項:\n" +" -c, --check 純檢查模式\n" +" -f, --file=sudoers 指定 sudoers 檔的位置\n" +" -h, --help 顯示說明訊息並退出\n" +" -q, --quiet 不詳細(不輸出)的語法錯誤訊息\n" +" -s, --strict 嚴格語法檢查\n" +" -V, --version 顯示版本訊息並退出\n" + +#: toke.l:179 +msgid "empty string" +msgstr "字串空白" + +#: toke.l:189 toke.l:491 +msgid "empty group" +msgstr "group 空白" + +#: toke.l:197 toke.l:489 +msgid "empty netgroup" +msgstr "netgroup 空白" + +#: toke.l:293 toke.l:305 toke.l:317 toke.l:333 toke.l:352 toke.l:392 +msgid "invalid line continuation" +msgstr "無效的行接續符號" + +#: toke.l:528 toke.l:540 +msgid "invalid IPv6 address" +msgstr "無效的 IPv6 地址" + +#: toke.l:764 +msgid "unexpected line break in string" +msgstr "字串中有非預期的斷行字元" + +#: toke.l:1084 +msgid "too many levels of includes" +msgstr "include 嵌套層數過多" + +#~ msgid "Preload the dummy exec functions contained in the sudo_noexec library" +#~ msgstr "預載「sudo_noexec」函式庫中包含的空 exec 函數" + +#~ msgid "unable to lock log file: %s" +#~ msgstr "無法鎖定記錄檔案:%s" + +#~ msgid "sudo_ldap_conf_add_ports: port too large" +#~ msgstr "sudo_ldap_conf_add_ports:連線埠過大" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s\n" +#~ msgstr "SSL_connect 失敗:ssl_error=%d, stack=%s\n" + +#~ msgid "CA bundle file was not specified" +#~ msgstr "未指定 CA bundle 檔案" + +#~ msgid "Client certificate was not specified" +#~ msgstr "未指定用戶端憑證" + +#~ msgid "Unable to allocate ssl object: %s\n" +#~ msgstr "無法配置 SSL 物件:%s\n" + +#~ msgid "Unable to attach socket to the ssl object: %s\n" +#~ msgstr "無法將 socket 通訊端連結到 SSL 物件:%s\v\n" + +#~ msgid "client message too large: %zu\n" +#~ msgstr "用戶端訊息過長:%zu\n" + +#~ msgid "server message too large: %u\n" +#~ msgstr "伺服器訊息過長:%u\n" + +#~ msgid "CA bundle file is not set in sudoers" +#~ msgstr "sudoers 中未設定 CA bundle 檔案" + +#~ msgid "Calling SSL_CTX_load_verify_locations() failed: %s" +#~ msgstr "呼叫 SSL_CTX_load_verify_locations() 失敗:%s" + +#~ msgid "Signed certificate file is not set in sudoers" +#~ msgstr "sudoers 中未設定已簽名的憑證檔案" + +#~ msgid "Unable to load private key into the ssl context: %s" +#~ msgstr "無法載入私鑰進 SSL 上下文:%s" + +#~ msgid "SSL_connect failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_connect 失敗:ssl_error=%d, stack=%s" + +#~ msgid "SSL_read failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_read 失敗:ssl_error=%d, stack=%s" + +#~ msgid "SSL_write failed: ssl_error=%d, stack=%s" +#~ msgstr "SSL_write 失敗:ssl_error=%d, stack=%s" + +#~ msgid "unknown address family: %d" +#~ msgstr "未知的位址家族:%d" + +#~ msgid "audit_failure message too long" +#~ msgstr "audit_failure 訊息過長" + +#~ msgid "No user or host" +#~ msgstr "找不到使用者或主機" + +#~ msgid "validation failure" +#~ msgstr "檢查有效性失敗" + +#~ msgid "%s/%s/timing: %s" +#~ msgstr "%s/%s/計時:%s" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "將忽略無效的屬性值:%s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "無法快取使用者 %s,原因:記憶體不足" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "無法快取群組 %s,原因:記憶體不足" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "無法快取群組列表 %s,原因:已經存在" diff --git a/plugins/sudoers/policy.c b/plugins/sudoers/policy.c new file mode 100644 index 0000000..d675d2f --- /dev/null +++ b/plugins/sudoers/policy.c @@ -0,0 +1,1186 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudoers_version.h" +#include "interfaces.h" + +/* + * Command execution args to be filled in: argv, envp and command info. + */ +struct sudoers_exec_args { + char ***argv; + char ***envp; + char ***info; +}; + +static unsigned int sudo_version; +static const char *interfaces_string; +bool sudoers_recovery = true; +sudo_conv_t sudo_conv; +sudo_printf_t sudo_printf; +const char *path_ldap_conf = _PATH_LDAP_CONF; +const char *path_ldap_secret = _PATH_LDAP_SECRET; +static bool session_opened; + +extern sudo_dso_public struct policy_plugin sudoers_policy; + +#ifdef HAVE_BSD_AUTH_H +extern char *login_style; +#endif /* HAVE_BSD_AUTH_H */ + +static int +parse_bool(const char *line, int varlen, int *flags, int fval) +{ + debug_decl(parse_bool, SUDOERS_DEBUG_PLUGIN); + + switch (sudo_strtobool(line + varlen + 1)) { + case true: + SET(*flags, fval); + debug_return_int(true); + case false: + CLR(*flags, fval); + debug_return_int(false); + default: + sudo_warn(U_("invalid %.*s set by sudo front-end"), + varlen, line); + debug_return_int(-1); + } +} + +/* + * Deserialize args, settings and user_info arrays. + * Fills in struct sudo_user and other common sudoers state. + */ +int +sudoers_policy_deserialize_info(void *v) +{ + const int edit_mask = MODE_EDIT|MODE_IGNORE_TICKET|MODE_NONINTERACTIVE; + struct sudoers_open_info *info = v; + const char *p, *errstr, *groups = NULL; + const char *remhost = NULL; + char * const *cur; + int flags = 0; + debug_decl(sudoers_policy_deserialize_info, SUDOERS_DEBUG_PLUGIN); + +#define MATCHES(s, v) \ + (strncmp((s), (v), sizeof(v) - 1) == 0) + +#define INVALID(v) do { \ + sudo_warn(U_("invalid %.*s set by sudo front-end"), \ + (int)(sizeof(v) - 2), (v)); \ +} while (0) + +#define CHECK(s, v) do { \ + if ((s)[sizeof(v) - 1] == '\0') { \ + INVALID(v); \ + goto bad; \ + } \ +} while (0) + + if (sudo_gettime_real(&sudo_user.submit_time) == -1) { + sudo_warn("%s", U_("unable to get time of day")); + goto bad; + } + + /* Parse sudo.conf plugin args. */ + if (info->plugin_args != NULL) { + for (cur = info->plugin_args; *cur != NULL; cur++) { + if (MATCHES(*cur, "error_recovery=")) { + int val = sudo_strtobool(*cur + sizeof("error_recovery=") - 1); + if (val == -1) { + INVALID("error_recovery="); /* Not a fatal error. */ + } else { + sudoers_recovery = val; + } + continue; + } + if (MATCHES(*cur, "sudoers_file=")) { + CHECK(*cur, "sudoers_file="); + sudoers_file = *cur + sizeof("sudoers_file=") - 1; + continue; + } + if (MATCHES(*cur, "sudoers_uid=")) { + p = *cur + sizeof("sudoers_uid=") - 1; + sudoers_uid = (uid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "sudoers_gid=")) { + p = *cur + sizeof("sudoers_gid=") - 1; + sudoers_gid = (gid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "sudoers_mode=")) { + p = *cur + sizeof("sudoers_mode=") - 1; + sudoers_mode = sudo_strtomode(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "ldap_conf=")) { + CHECK(*cur, "ldap_conf="); + path_ldap_conf = *cur + sizeof("ldap_conf=") - 1; + continue; + } + if (MATCHES(*cur, "ldap_secret=")) { + CHECK(*cur, "ldap_secret="); + path_ldap_secret = *cur + sizeof("ldap_secret=") - 1; + continue; + } + } + } + + /* Parse command line settings. */ + user_closefrom = -1; + for (cur = info->settings; *cur != NULL; cur++) { + if (MATCHES(*cur, "closefrom=")) { + errno = 0; + p = *cur + sizeof("closefrom=") - 1; + user_closefrom = sudo_strtonum(p, 3, INT_MAX, &errstr); + if (user_closefrom == 0) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "cmnd_chroot=")) { + CHECK(*cur, "cmnd_chroot="); + user_runchroot = *cur + sizeof("cmnd_chroot=") - 1; + continue; + } + if (MATCHES(*cur, "cmnd_cwd=")) { + CHECK(*cur, "cmnd_cwd="); + user_runcwd = *cur + sizeof("cmnd_cwd=") - 1; + continue; + } + if (MATCHES(*cur, "runas_user=")) { + CHECK(*cur, "runas_user="); + sudo_user.runas_user = *cur + sizeof("runas_user=") - 1; + SET(sudo_user.flags, RUNAS_USER_SPECIFIED); + continue; + } + if (MATCHES(*cur, "runas_group=")) { + CHECK(*cur, "runas_group="); + sudo_user.runas_group = *cur + sizeof("runas_group=") - 1; + SET(sudo_user.flags, RUNAS_GROUP_SPECIFIED); + continue; + } + if (MATCHES(*cur, "prompt=")) { + /* Allow epmpty prompt. */ + user_prompt = *cur + sizeof("prompt=") - 1; + def_passprompt_override = true; + continue; + } + if (MATCHES(*cur, "set_home=")) { + if (parse_bool(*cur, sizeof("set_home") - 1, &flags, + MODE_RESET_HOME) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "preserve_environment=")) { + if (parse_bool(*cur, sizeof("preserve_environment") - 1, &flags, + MODE_PRESERVE_ENV) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "run_shell=")) { + if (parse_bool(*cur, sizeof("run_shell") -1, &flags, + MODE_SHELL) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "login_shell=")) { + if (parse_bool(*cur, sizeof("login_shell") - 1, &flags, + MODE_LOGIN_SHELL) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "implied_shell=")) { + if (parse_bool(*cur, sizeof("implied_shell") - 1, &flags, + MODE_IMPLIED_SHELL) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "preserve_groups=")) { + if (parse_bool(*cur, sizeof("preserve_groups") - 1, &flags, + MODE_PRESERVE_GROUPS) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "ignore_ticket=")) { + if (parse_bool(*cur, sizeof("ignore_ticket") -1, &flags, + MODE_IGNORE_TICKET) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "noninteractive=")) { + if (parse_bool(*cur, sizeof("noninteractive") - 1, &flags, + MODE_NONINTERACTIVE) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "sudoedit=")) { + if (parse_bool(*cur, sizeof("sudoedit") - 1, &flags, + MODE_EDIT) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "login_class=")) { + CHECK(*cur, "login_class="); + login_class = *cur + sizeof("login_class=") - 1; + def_use_loginclass = true; + continue; + } +#ifdef HAVE_PRIV_SET + if (MATCHES(*cur, "runas_privs=")) { + CHECK(*cur, "runas_privs="); + def_privs = *cur + sizeof("runas_privs=") - 1; + continue; + } + if (MATCHES(*cur, "runas_limitprivs=")) { + CHECK(*cur, "runas_limitprivs="); + def_limitprivs = *cur + sizeof("runas_limitprivs=") - 1; + continue; + } +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + if (MATCHES(*cur, "selinux_role=")) { + CHECK(*cur, "selinux_role="); + user_role = *cur + sizeof("selinux_role=") - 1; + continue; + } + if (MATCHES(*cur, "selinux_type=")) { + CHECK(*cur, "selinux_type="); + user_type = *cur + sizeof("selinux_type=") - 1; + continue; + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_BSD_AUTH_H + if (MATCHES(*cur, "bsdauth_type=")) { + CHECK(*cur, "login_style="); + login_style = *cur + sizeof("bsdauth_type=") - 1; + continue; + } +#endif /* HAVE_BSD_AUTH_H */ + if (MATCHES(*cur, "network_addrs=")) { + interfaces_string = *cur + sizeof("network_addrs=") - 1; + if (!set_interfaces(interfaces_string)) { + sudo_warn("%s", U_("unable to parse network address list")); + goto bad; + } + continue; + } + if (MATCHES(*cur, "max_groups=")) { + errno = 0; + p = *cur + sizeof("max_groups=") - 1; + sudo_user.max_groups = sudo_strtonum(p, 1, INT_MAX, &errstr); + if (sudo_user.max_groups == 0) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "remote_host=")) { + CHECK(*cur, "remote_host="); + remhost = *cur + sizeof("remote_host=") - 1; + continue; + } + if (MATCHES(*cur, "timeout=")) { + p = *cur + sizeof("timeout=") - 1; + user_timeout = parse_timeout(p); + if (user_timeout == -1) { + if (errno == ERANGE) + sudo_warnx(U_("%s: %s"), p, U_("timeout value too large")); + else + sudo_warnx(U_("%s: %s"), p, U_("invalid timeout value")); + goto bad; + } + continue; + } +#ifdef ENABLE_SUDO_PLUGIN_API + if (MATCHES(*cur, "plugin_dir=")) { + CHECK(*cur, "plugin_dir="); + path_plugin_dir = *cur + sizeof("plugin_dir=") - 1; + continue; + } +#endif + } + + /* Sudo front-end should restrict mode flags for sudoedit. */ + if (ISSET(flags, MODE_EDIT) && (flags & edit_mask) != flags) { + sudo_warnx(U_("invalid mode flags from sudo front end: 0x%x"), flags); + goto bad; + } + + user_gid = (gid_t)-1; + user_sid = (pid_t)-1; + user_uid = (gid_t)-1; + user_umask = (mode_t)-1; + for (cur = info->user_info; *cur != NULL; cur++) { + if (MATCHES(*cur, "user=")) { + CHECK(*cur, "user="); + if ((user_name = strdup(*cur + sizeof("user=") - 1)) == NULL) + goto oom; + continue; + } + if (MATCHES(*cur, "uid=")) { + p = *cur + sizeof("uid=") - 1; + user_uid = (uid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "gid=")) { + p = *cur + sizeof("gid=") - 1; + user_gid = (gid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "groups=")) { + CHECK(*cur, "groups="); + groups = *cur + sizeof("groups=") - 1; + continue; + } + if (MATCHES(*cur, "cwd=")) { + CHECK(*cur, "cwd="); + if ((user_cwd = strdup(*cur + sizeof("cwd=") - 1)) == NULL) + goto oom; + continue; + } + if (MATCHES(*cur, "tty=")) { + CHECK(*cur, "tty="); + if ((user_ttypath = strdup(*cur + sizeof("tty=") - 1)) == NULL) + goto oom; + user_tty = user_ttypath; + if (strncmp(user_tty, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) + user_tty += sizeof(_PATH_DEV) - 1; + continue; + } + if (MATCHES(*cur, "host=")) { + CHECK(*cur, "host="); + if ((user_host = strdup(*cur + sizeof("host=") - 1)) == NULL) + goto oom; + if ((p = strchr(user_host, '.')) != NULL) { + user_shost = strndup(user_host, (size_t)(p - user_host)); + if (user_shost == NULL) + goto oom; + } else { + user_shost = user_host; + } + continue; + } + if (MATCHES(*cur, "lines=")) { + errno = 0; + p = *cur + sizeof("lines=") - 1; + sudo_user.lines = sudo_strtonum(p, 1, INT_MAX, &errstr); + if (sudo_user.lines == 0) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "cols=")) { + errno = 0; + p = *cur + sizeof("cols=") - 1; + sudo_user.cols = sudo_strtonum(p, 1, INT_MAX, &errstr); + if (sudo_user.cols == 0) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "sid=")) { + p = *cur + sizeof("sid=") - 1; + user_sid = (pid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "umask=")) { + p = *cur + sizeof("umask=") - 1; + sudo_user.umask = sudo_strtomode(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + } + + /* User name, user-ID, group-ID and host name must be specified. */ + if (user_name == NULL) { + sudo_warnx("%s", U_("user name not set by sudo front-end")); + goto bad; + } + if (user_uid == (uid_t)-1) { + sudo_warnx("%s", U_("user-ID not set by sudo front-end")); + goto bad; + } + if (user_gid == (gid_t)-1) { + sudo_warnx("%s", U_("group-ID not set by sudo front-end")); + goto bad; + } + if (user_host == NULL) { + sudo_warnx("%s", U_("host name not set by sudo front-end")); + goto bad; + } + + if ((user_runhost = strdup(remhost ? remhost : user_host)) == NULL) + goto oom; + if ((p = strchr(user_runhost, '.')) != NULL) { + user_srunhost = strndup(user_runhost, (size_t)(p - user_runhost)); + if (user_srunhost == NULL) + goto oom; + } else { + user_srunhost = user_runhost; + } + if (user_cwd == NULL) { + if ((user_cwd = strdup("unknown")) == NULL) + goto oom; + } + if (user_runcwd == NULL) { + if ((user_runcwd = strdup(user_cwd)) == NULL) + goto oom; + } + if (user_tty == NULL) { + if ((user_tty = strdup("unknown")) == NULL) + goto oom; + /* user_ttypath remains NULL */ + } + + if (groups != NULL) { + /* sudo_parse_gids() will print a warning on error. */ + user_ngids = sudo_parse_gids(groups, &user_gid, &user_gids); + if (user_ngids == -1) + goto bad; + } + + /* umask is only set in user_info[] for API 1.10 and above. */ + if (user_umask == (mode_t)-1) { + user_umask = umask(0); + umask(user_umask); + } + + /* Always reset the environment for a login shell. */ + if (ISSET(flags, MODE_LOGIN_SHELL)) + def_env_reset = true; + + /* Some systems support fexecve() which we use for digest matches. */ + cmnd_fd = -1; + + /* Dump settings and user info (XXX - plugin args) */ + for (cur = info->settings; *cur != NULL; cur++) + sudo_debug_printf(SUDO_DEBUG_INFO, "settings: %s", *cur); + for (cur = info->user_info; *cur != NULL; cur++) + sudo_debug_printf(SUDO_DEBUG_INFO, "user_info: %s", *cur); + +#undef MATCHES +#undef INVALID +#undef CHECK + debug_return_int(flags); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +bad: + debug_return_int(MODE_ERROR); +} + +/* + * Convert struct list_members to a comma-separated string with + * the given variable name. + */ +static char * +serialize_list(const char *varname, struct list_members *members) +{ + struct list_member *lm, *next; + size_t len, result_size; + char *result; + debug_decl(serialize_list, SUDOERS_DEBUG_PLUGIN); + + result_size = strlen(varname) + 1; + SLIST_FOREACH(lm, members, entries) { + result_size += strlen(lm->value) + 1; + } + if ((result = malloc(result_size)) == NULL) + goto bad; + /* No need to check len for overflow here. */ + len = strlcpy(result, varname, result_size); + result[len++] = '='; + result[len] = '\0'; + SLIST_FOREACH_SAFE(lm, members, entries, next) { + len = strlcat(result, lm->value, result_size); + if (len + (next != NULL) >= result_size) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto bad; + } + if (next != NULL) { + result[len++] = ','; + result[len] = '\0'; + } + } + debug_return_str(result); +bad: + free(result); + debug_return_str(NULL); +} + +/* + * Store the execution environment and other front-end settings. + * Builds up the command_info list and sets argv and envp. + * Consumes iolog_path if not NULL. + * Returns 1 on success and -1 on error. + */ +bool +sudoers_policy_store_result(bool accepted, char *argv[], char *envp[], + mode_t cmnd_umask, char *iolog_path, void *v) +{ + struct sudoers_exec_args *exec_args = v; + char **command_info; + int info_len = 0; + debug_decl(sudoers_policy_store_result, SUDOERS_DEBUG_PLUGIN); + + if (exec_args == NULL) + debug_return_bool(true); /* nothing to do */ + + /* Increase the length of command_info as needed, it is *not* checked. */ + command_info = calloc(55, sizeof(char *)); + if (command_info == NULL) + goto oom; + + if (safe_cmnd != NULL) { + command_info[info_len] = sudo_new_key_val("command", safe_cmnd); + if (command_info[info_len++] == NULL) + goto oom; + } + if (def_log_input || def_log_output) { + if (iolog_path) + command_info[info_len++] = iolog_path; /* now owned */ + if (def_log_input) { + if ((command_info[info_len++] = strdup("iolog_stdin=true")) == NULL) + goto oom; + if ((command_info[info_len++] = strdup("iolog_ttyin=true")) == NULL) + goto oom; + } + if (def_log_output) { + if ((command_info[info_len++] = strdup("iolog_stdout=true")) == NULL) + goto oom; + if ((command_info[info_len++] = strdup("iolog_stderr=true")) == NULL) + goto oom; + if ((command_info[info_len++] = strdup("iolog_ttyout=true")) == NULL) + goto oom; + } + if (def_compress_io) { + if ((command_info[info_len++] = strdup("iolog_compress=true")) == NULL) + goto oom; + } + if (def_iolog_flush) { + if ((command_info[info_len++] = strdup("iolog_flush=true")) == NULL) + goto oom; + } + if (def_maxseq != NULL) { + if (asprintf(&command_info[info_len++], "maxseq=%s", def_maxseq) == -1) + goto oom; + } + } + if (ISSET(sudo_mode, MODE_EDIT)) { + if ((command_info[info_len++] = strdup("sudoedit=true")) == NULL) + goto oom; + if (!def_sudoedit_checkdir) { + if ((command_info[info_len++] = strdup("sudoedit_checkdir=false")) == NULL) + goto oom; + } + if (def_sudoedit_follow) { + if ((command_info[info_len++] = strdup("sudoedit_follow=true")) == NULL) + goto oom; + } + } + if (def_runcwd && strcmp(def_runcwd, "*") != 0) { + /* Set cwd to explicit value in sudoers. */ + if (!expand_tilde(&def_runcwd, runas_pw->pw_name)) { + sudo_warnx(U_("invalid working directory: %s"), def_runcwd); + goto bad; + } + if ((command_info[info_len++] = sudo_new_key_val("cwd", def_runcwd)) == NULL) + goto oom; + } else if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + /* Set cwd to run user's homedir. */ + if ((command_info[info_len++] = sudo_new_key_val("cwd", runas_pw->pw_dir)) == NULL) + goto oom; + if ((command_info[info_len++] = strdup("cwd_optional=true")) == NULL) + goto oom; + } + if ((command_info[info_len++] = sudo_new_key_val("runas_user", runas_pw->pw_name)) == NULL) + goto oom; + if (runas_gr != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("runas_group", runas_gr->gr_name)) == NULL) + goto oom; + } + if (def_stay_setuid) { + if (asprintf(&command_info[info_len++], "runas_uid=%u", + (unsigned int)user_uid) == -1) + goto oom; + if (asprintf(&command_info[info_len++], "runas_gid=%u", + (unsigned int)user_gid) == -1) + goto oom; + if (asprintf(&command_info[info_len++], "runas_euid=%u", + (unsigned int)runas_pw->pw_uid) == -1) + goto oom; + if (asprintf(&command_info[info_len++], "runas_egid=%u", + runas_gr ? (unsigned int)runas_gr->gr_gid : + (unsigned int)runas_pw->pw_gid) == -1) + goto oom; + } else { + if (asprintf(&command_info[info_len++], "runas_uid=%u", + (unsigned int)runas_pw->pw_uid) == -1) + goto oom; + if (asprintf(&command_info[info_len++], "runas_gid=%u", + runas_gr ? (unsigned int)runas_gr->gr_gid : + (unsigned int)runas_pw->pw_gid) == -1) + goto oom; + } + if (def_preserve_groups) { + if ((command_info[info_len++] = strdup("preserve_groups=true")) == NULL) + goto oom; + } else { + int i, len; + gid_t egid; + size_t glsize; + char *cp, *gid_list; + struct gid_list *gidlist; + + /* Only use results from a group db query, not the front end. */ + gidlist = sudo_get_gidlist(runas_pw, ENTRY_TYPE_QUERIED); + + /* We reserve an extra spot in the list for the effective gid. */ + glsize = sizeof("runas_groups=") - 1 + + ((gidlist->ngids + 1) * (MAX_UID_T_LEN + 1)); + gid_list = malloc(glsize); + if (gid_list == NULL) + goto oom; + memcpy(gid_list, "runas_groups=", sizeof("runas_groups=") - 1); + cp = gid_list + sizeof("runas_groups=") - 1; + + /* On BSD systems the effective gid is the first group in the list. */ + egid = runas_gr ? (unsigned int)runas_gr->gr_gid : + (unsigned int)runas_pw->pw_gid; + len = snprintf(cp, glsize - (cp - gid_list), "%u", (unsigned int)egid); + if (len < 0 || (size_t)len >= glsize - (cp - gid_list)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + free(gid_list); + goto bad; + } + cp += len; + for (i = 0; i < gidlist->ngids; i++) { + if (gidlist->gids[i] != egid) { + len = snprintf(cp, glsize - (cp - gid_list), ",%u", + (unsigned int) gidlist->gids[i]); + if (len < 0 || (size_t)len >= glsize - (cp - gid_list)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + free(gid_list); + goto bad; + } + cp += len; + } + } + command_info[info_len++] = gid_list; + sudo_gidlist_delref(gidlist); + } + if (def_closefrom >= 0) { + if (asprintf(&command_info[info_len++], "closefrom=%d", def_closefrom) == -1) + goto oom; + } + if (def_ignore_iolog_errors) { + if ((command_info[info_len++] = strdup("ignore_iolog_errors=true")) == NULL) + goto oom; + } + if (def_noexec) { + if ((command_info[info_len++] = strdup("noexec=true")) == NULL) + goto oom; + } + if (def_exec_background) { + if ((command_info[info_len++] = strdup("exec_background=true")) == NULL) + goto oom; + } + if (def_set_utmp) { + if ((command_info[info_len++] = strdup("set_utmp=true")) == NULL) + goto oom; + } + if (def_use_pty) { + if ((command_info[info_len++] = strdup("use_pty=true")) == NULL) + goto oom; + } + if (def_utmp_runas) { + if ((command_info[info_len++] = sudo_new_key_val("utmp_user", runas_pw->pw_name)) == NULL) + goto oom; + } + if (def_iolog_mode != (S_IRUSR|S_IWUSR)) { + if (asprintf(&command_info[info_len++], "iolog_mode=0%o", (unsigned int)def_iolog_mode) == -1) + goto oom; + } + if (def_iolog_user != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("iolog_user", def_iolog_user)) == NULL) + goto oom; + } + if (def_iolog_group != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("iolog_group", def_iolog_group)) == NULL) + goto oom; + } + if (!SLIST_EMPTY(&def_log_servers)) { + char *log_servers = serialize_list("log_servers", &def_log_servers); + if (log_servers == NULL) + goto oom; + command_info[info_len++] = log_servers; + + if (asprintf(&command_info[info_len++], "log_server_timeout=%u", def_log_server_timeout) == -1) + goto oom; + } + + if ((command_info[info_len++] = sudo_new_key_val("log_server_keepalive", + def_log_server_keepalive ? "true" : "false")) == NULL) + goto oom; + + if ((command_info[info_len++] = sudo_new_key_val("log_server_verify", + def_log_server_verify ? "true" : "false")) == NULL) + goto oom; + + if (def_log_server_cabundle != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("log_server_cabundle", def_log_server_cabundle)) == NULL) + goto oom; + } + if (def_log_server_peer_cert != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("log_server_peer_cert", def_log_server_peer_cert)) == NULL) + goto oom; + } + if (def_log_server_peer_key != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("log_server_peer_key", def_log_server_peer_key)) == NULL) + goto oom; + } + + if (def_command_timeout > 0 || user_timeout > 0) { + int timeout = user_timeout; + if (timeout == 0 || def_command_timeout < timeout) + timeout = def_command_timeout; + if (asprintf(&command_info[info_len++], "timeout=%u", timeout) == -1) + goto oom; + } + if (def_runchroot != NULL && strcmp(def_runchroot, "*") != 0) { + if (!expand_tilde(&def_runchroot, runas_pw->pw_name)) { + sudo_warnx(U_("invalid chroot directory: %s"), def_runchroot); + goto bad; + } + if ((command_info[info_len++] = sudo_new_key_val("chroot", def_runchroot)) == NULL) + goto oom; + } + if (cmnd_umask != ACCESSPERMS) { + if (asprintf(&command_info[info_len++], "umask=0%o", (unsigned int)cmnd_umask) == -1) + goto oom; + } + if (force_umask) { + if ((command_info[info_len++] = strdup("umask_override=true")) == NULL) + goto oom; + } + if (cmnd_fd != -1) { + if (sudo_version < SUDO_API_MKVERSION(1, 9)) { + /* execfd only supported by plugin API 1.9 and higher */ + close(cmnd_fd); + cmnd_fd = -1; + } else { + if (asprintf(&command_info[info_len++], "execfd=%d", cmnd_fd) == -1) + goto oom; + } + } +#ifdef HAVE_LOGIN_CAP_H + if (def_use_loginclass) { + if ((command_info[info_len++] = sudo_new_key_val("login_class", login_class)) == NULL) + goto oom; + } +#endif /* HAVE_LOGIN_CAP_H */ +#ifdef HAVE_SELINUX + if (def_selinux && user_role != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("selinux_role", user_role)) == NULL) + goto oom; + } + if (def_selinux && user_type != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("selinux_type", user_type)) == NULL) + goto oom; + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + if (runas_privs != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("runas_privs", runas_privs)) == NULL) + goto oom; + } + if (runas_limitprivs != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("runas_limitprivs", runas_limitprivs)) == NULL) + goto oom; + } +#endif /* HAVE_SELINUX */ + + /* Free on exit; they are not available in the close function. */ + sudoers_gc_add(GC_VECTOR, envp); + sudoers_gc_add(GC_VECTOR, command_info); + + /* Fill in exec environment info. */ + *(exec_args->argv) = argv; + *(exec_args->envp) = envp; + *(exec_args->info) = command_info; + + debug_return_bool(true); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +bad: + free(audit_msg); + audit_msg = NULL; + while (info_len--) + free(command_info[info_len]); + free(command_info); + debug_return_bool(false); +} + +static int +sudoers_policy_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t plugin_printf, char * const settings[], + char * const user_info[], char * const envp[], char * const args[], + const char **errstr) +{ + struct sudo_conf_debug_file_list debug_files = TAILQ_HEAD_INITIALIZER(debug_files); + struct sudoers_open_info info; + const char *cp, *plugin_path = NULL; + char * const *cur; + int ret; + debug_decl(sudoers_policy_open, SUDOERS_DEBUG_PLUGIN); + + sudo_version = version; + sudo_conv = conversation; + sudo_printf = plugin_printf; + + /* Plugin args are only specified for API version 1.2 and higher. */ + if (sudo_version < SUDO_API_MKVERSION(1, 2)) + args = NULL; + + /* Initialize the debug subsystem. */ + for (cur = settings; (cp = *cur) != NULL; cur++) { + if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) { + cp += sizeof("debug_flags=") - 1; + if (!sudoers_debug_parse_flags(&debug_files, cp)) + debug_return_int(-1); + continue; + } + if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) { + plugin_path = cp + sizeof("plugin_path=") - 1; + continue; + } + } + if (!sudoers_debug_register(plugin_path, &debug_files)) + debug_return_int(-1); + + /* Call the sudoers init function. */ + info.settings = settings; + info.user_info = user_info; + info.plugin_args = args; + ret = sudoers_init(&info, envp); + + /* The audit functions set audit_msg on failure. */ + if (ret != 1 && audit_msg != NULL) { + if (sudo_version >= SUDO_API_MKVERSION(1, 15)) + *errstr = audit_msg; + } + debug_return_int(ret); +} + +static void +sudoers_policy_close(int exit_status, int error_code) +{ + debug_decl(sudoers_policy_close, SUDOERS_DEBUG_PLUGIN); + + if (session_opened) { + /* Close the session we opened in sudoers_policy_init_session(). */ + (void)sudo_auth_end_session(runas_pw); + + /* We do not currently log the exit status. */ + if (error_code) { + errno = error_code; + sudo_warn(U_("unable to execute %s"), safe_cmnd); + } + } + + /* Deregister the callback for sudo_fatal()/sudo_fatalx(). */ + sudo_fatal_callback_deregister(sudoers_cleanup); + + /* Free stashed copy of the environment. */ + (void)env_init(NULL); + + /* Free remaining references to password and group entries. */ + /* XXX - move cleanup to function in sudoers.c */ + if (sudo_user.pw != NULL) { + sudo_pw_delref(sudo_user.pw); + sudo_user.pw = NULL; + } + if (runas_pw != NULL) { + sudo_pw_delref(runas_pw); + runas_pw = NULL; + } + if (runas_gr != NULL) { + sudo_gr_delref(runas_gr); + runas_gr = NULL; + } + if (user_gid_list != NULL) { + sudo_gidlist_delref(user_gid_list); + user_gid_list = NULL; + } + free(user_gids); + user_gids = NULL; + free(audit_msg); + audit_msg = NULL; + + /* sudoers_debug_deregister() calls sudo_debug_exit() for us. */ + sudoers_debug_deregister(); +} + +/* + * The init_session function is called before executing the command + * and before uid/gid changes occur. + * Returns 1 on success, 0 on failure and -1 on error. + */ +static int +sudoers_policy_init_session(struct passwd *pwd, char **user_env[], + const char **errstr) +{ + int ret; + debug_decl(sudoers_policy_init_session, SUDOERS_DEBUG_PLUGIN); + + /* user_env is only specified for API version 1.2 and higher. */ + if (sudo_version < SUDO_API_MKVERSION(1, 2)) + user_env = NULL; + + ret = sudo_auth_begin_session(pwd, user_env); + + if (ret == 1) { + session_opened = true; + } else if (audit_msg != NULL) { + /* The audit functions set audit_msg on failure. */ + if (sudo_version >= SUDO_API_MKVERSION(1, 15)) + *errstr = audit_msg; + } + debug_return_int(ret); +} + +static int +sudoers_policy_check(int argc, char * const argv[], char *env_add[], + char **command_infop[], char **argv_out[], char **user_env_out[], + const char **errstr) +{ + struct sudoers_exec_args exec_args; + int ret; + debug_decl(sudoers_policy_check, SUDOERS_DEBUG_PLUGIN); + + if (!ISSET(sudo_mode, MODE_EDIT)) + SET(sudo_mode, MODE_RUN); + + exec_args.argv = argv_out; + exec_args.envp = user_env_out; + exec_args.info = command_infop; + + ret = sudoers_policy_main(argc, argv, 0, env_add, false, &exec_args); + if (ret == true && sudo_version >= SUDO_API_MKVERSION(1, 3)) { + /* Unset close function if we don't need it to avoid extra process. */ + if (!def_log_input && !def_log_output && !def_use_pty && + !sudo_auth_needs_end_session()) + sudoers_policy.close = NULL; + } + + /* The audit functions set audit_msg on failure. */ + if (ret != 1 && audit_msg != NULL) { + if (sudo_version >= SUDO_API_MKVERSION(1, 15)) + *errstr = audit_msg; + } + debug_return_int(ret); +} + +static int +sudoers_policy_validate(const char **errstr) +{ + int ret; + debug_decl(sudoers_policy_validate, SUDOERS_DEBUG_PLUGIN); + + user_cmnd = "validate"; + SET(sudo_mode, MODE_VALIDATE); + + ret = sudoers_policy_main(0, NULL, I_VERIFYPW, NULL, false, NULL); + + /* The audit functions set audit_msg on failure. */ + if (ret != 1 && audit_msg != NULL) { + if (sudo_version >= SUDO_API_MKVERSION(1, 15)) + *errstr = audit_msg; + } + debug_return_int(ret); +} + +static void +sudoers_policy_invalidate(int unlinkit) +{ + debug_decl(sudoers_policy_invalidate, SUDOERS_DEBUG_PLUGIN); + + user_cmnd = "kill"; + /* XXX - plugin API should support a return value for fatal errors. */ + timestamp_remove(unlinkit); + sudoers_cleanup(); + + debug_return; +} + +static int +sudoers_policy_list(int argc, char * const argv[], int verbose, + const char *list_user, const char **errstr) +{ + int ret; + debug_decl(sudoers_policy_list, SUDOERS_DEBUG_PLUGIN); + + user_cmnd = "list"; + if (argc) + SET(sudo_mode, MODE_CHECK); + else + SET(sudo_mode, MODE_LIST); + if (list_user) { + list_pw = sudo_getpwnam(list_user); + if (list_pw == NULL) { + sudo_warnx(U_("unknown user: %s"), list_user); + debug_return_int(-1); + } + } + ret = sudoers_policy_main(argc, argv, I_LISTPW, NULL, verbose, NULL); + if (list_user) { + sudo_pw_delref(list_pw); + list_pw = NULL; + } + + /* The audit functions set audit_msg on failure. */ + if (ret != 1 && audit_msg != NULL) { + if (sudo_version >= SUDO_API_MKVERSION(1, 15)) + *errstr = audit_msg; + } + debug_return_int(ret); +} + +static int +sudoers_policy_version(int verbose) +{ + debug_decl(sudoers_policy_version, SUDOERS_DEBUG_PLUGIN); + + sudo_printf(SUDO_CONV_INFO_MSG, _("Sudoers policy plugin version %s\n"), + PACKAGE_VERSION); + sudo_printf(SUDO_CONV_INFO_MSG, _("Sudoers file grammar version %d\n"), + SUDOERS_GRAMMAR_VERSION); + + if (verbose) { + sudo_printf(SUDO_CONV_INFO_MSG, _("\nSudoers path: %s\n"), sudoers_file); +#ifdef HAVE_LDAP +# ifdef _PATH_NSSWITCH_CONF + sudo_printf(SUDO_CONV_INFO_MSG, _("nsswitch path: %s\n"), _PATH_NSSWITCH_CONF); +# endif + sudo_printf(SUDO_CONV_INFO_MSG, _("ldap.conf path: %s\n"), path_ldap_conf); + sudo_printf(SUDO_CONV_INFO_MSG, _("ldap.secret path: %s\n"), path_ldap_secret); +#endif + dump_auth_methods(); + dump_defaults(); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + if (interfaces_string != NULL) { + dump_interfaces(interfaces_string); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + } + debug_return_int(true); +} + +static struct sudo_hook sudoers_hooks[] = { + { SUDO_HOOK_VERSION, SUDO_HOOK_SETENV, sudoers_hook_setenv, NULL }, + { SUDO_HOOK_VERSION, SUDO_HOOK_UNSETENV, sudoers_hook_unsetenv, NULL }, + { SUDO_HOOK_VERSION, SUDO_HOOK_GETENV, sudoers_hook_getenv, NULL }, + { SUDO_HOOK_VERSION, SUDO_HOOK_PUTENV, sudoers_hook_putenv, NULL }, + { 0, 0, NULL, NULL } +}; + +/* + * Register environment function hooks. + * Note that we have not registered sudoers with the debug subsystem yet. + */ +static void +sudoers_policy_register_hooks(int version, int (*register_hook)(struct sudo_hook *hook)) +{ + struct sudo_hook *hook; + + for (hook = sudoers_hooks; hook->hook_fn != NULL; hook++) { + if (register_hook(hook) != 0) { + sudo_warn_nodebug( + U_("unable to register hook of type %d (version %d.%d)"), + hook->hook_type, SUDO_API_VERSION_GET_MAJOR(hook->hook_version), + SUDO_API_VERSION_GET_MINOR(hook->hook_version)); + } + } +} + +sudo_dso_public struct policy_plugin sudoers_policy = { + SUDO_POLICY_PLUGIN, + SUDO_API_VERSION, + sudoers_policy_open, + sudoers_policy_close, + sudoers_policy_version, + sudoers_policy_check, + sudoers_policy_list, + sudoers_policy_validate, + sudoers_policy_invalidate, + sudoers_policy_init_session, + sudoers_policy_register_hooks, + NULL /* event_alloc() filled in by sudo */ +}; diff --git a/plugins/sudoers/prompt.c b/plugins/sudoers/prompt.c new file mode 100644 index 0000000..0632b34 --- /dev/null +++ b/plugins/sudoers/prompt.c @@ -0,0 +1,163 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996,1998-2005, 2007-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include + +#include "sudoers.h" + +/* + * Expand %h and %u escapes (if present) in the prompt and pass back + * the dynamically allocated result. + */ +char * +expand_prompt(const char *old_prompt, const char *auth_user) +{ + size_t len, n; + int subst; + const char *p; + char *np, *new_prompt, *endp; + debug_decl(expand_prompt, SUDOERS_DEBUG_AUTH); + + /* How much space do we need to malloc for the prompt? */ + subst = 0; + for (p = old_prompt, len = strlen(old_prompt); *p; p++) { + if (p[0] =='%') { + switch (p[1]) { + case 'h': + p++; + len += strlen(user_shost) - 2; + subst = 1; + break; + case 'H': + p++; + len += strlen(user_host) - 2; + subst = 1; + break; + case 'p': + p++; + len += strlen(auth_user) - 2; + subst = 1; + break; + case 'u': + p++; + len += strlen(user_name) - 2; + subst = 1; + break; + case 'U': + p++; + len += strlen(runas_pw->pw_name) - 2; + subst = 1; + break; + case '%': + p++; + len--; + subst = 1; + break; + default: + break; + } + } + } + + if ((new_prompt = malloc(++len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_str(NULL); + } + + if (subst) { + endp = new_prompt + len; + for (p = old_prompt, np = new_prompt; *p; p++) { + if (p[0] =='%') { + switch (p[1]) { + case 'h': + p++; + n = strlcpy(np, user_shost, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case 'H': + p++; + n = strlcpy(np, user_host, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case 'p': + p++; + n = strlcpy(np, auth_user, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case 'u': + p++; + n = strlcpy(np, user_name, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case 'U': + p++; + n = strlcpy(np, runas_pw->pw_name, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case '%': + /* convert %% -> % */ + p++; + break; + default: + /* no conversion */ + break; + } + } + *np++ = *p; + if (np >= endp) + goto oflow; + } + *np = '\0'; + } else { + /* Nothing to expand. */ + memcpy(new_prompt, old_prompt, len); /* len includes NUL */ + } + + debug_return_str(new_prompt); + +oflow: + /* We pre-allocate enough space, so this should never happen. */ + free(new_prompt); + sudo_warnx(U_("internal error, %s overflow"), __func__); + debug_return_str(NULL); +} diff --git a/plugins/sudoers/pwutil.c b/plugins/sudoers/pwutil.c new file mode 100644 index 0000000..ea0159f --- /dev/null +++ b/plugins/sudoers/pwutil.c @@ -0,0 +1,1100 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include /* strcasecmp */ +#endif +#ifdef HAVE_SETAUTHDB +# include +#endif /* HAVE_SETAUTHDB */ +#include +#include +#include + +#include "sudoers.h" +#include "redblack.h" +#include "pwutil.h" + +/* + * The passwd and group caches. + */ +static struct rbtree *pwcache_byuid, *pwcache_byname; +static struct rbtree *grcache_bygid, *grcache_byname; +static struct rbtree *gidlist_cache, *grlist_cache; + +static int cmp_pwuid(const void *, const void *); +static int cmp_pwnam(const void *, const void *); +static int cmp_grgid(const void *, const void *); + +/* + * Default functions for building cache items. + */ +static sudo_make_pwitem_t make_pwitem = sudo_make_pwitem; +static sudo_make_gritem_t make_gritem = sudo_make_gritem; +static sudo_make_gidlist_item_t make_gidlist_item = sudo_make_gidlist_item; +static sudo_make_grlist_item_t make_grlist_item = sudo_make_grlist_item; + +#define cmp_grnam cmp_pwnam + +/* + * AIX has the concept of authentication registries (files, NIS, LDAP, etc). + * This allows you to have separate ID <-> name mappings based on which + * authentication registries the user was looked up in. + * We store the registry as part of the key and use it when matching. + */ +#ifdef HAVE_SETAUTHDB +# define getauthregistry(u, r) aix_getauthregistry((u), (r)) +#else +# define getauthregistry(u, r) ((r)[0] = '\0') +#endif + +/* + * Change the default pwutil backend functions. + * The default functions query the password and group databases. + */ +void +sudo_pwutil_set_backend(sudo_make_pwitem_t pwitem, sudo_make_gritem_t gritem, + sudo_make_gidlist_item_t gidlist_item, sudo_make_grlist_item_t grlist_item) +{ + debug_decl(sudo_pwutil_set_backend, SUDOERS_DEBUG_NSS); + + make_pwitem = pwitem; + make_gritem = gritem; + make_gidlist_item = gidlist_item; + make_grlist_item = grlist_item; + + debug_return; +} + +/* + * Compare by user-ID. + * v1 is the key to find or data to insert, v2 is in-tree data. + */ +static int +cmp_pwuid(const void *v1, const void *v2) +{ + const struct cache_item *ci1 = (const struct cache_item *) v1; + const struct cache_item *ci2 = (const struct cache_item *) v2; + if (ci1->k.uid == ci2->k.uid) + return strcmp(ci1->registry, ci2->registry); + if (ci1->k.uid < ci2->k.uid) + return -1; + return 1; +} + +/* + * Compare by user/group name. + * v1 is the key to find or data to insert, v2 is in-tree data. + */ +static int +cmp_pwnam(const void *v1, const void *v2) +{ + const struct cache_item *ci1 = (const struct cache_item *) v1; + const struct cache_item *ci2 = (const struct cache_item *) v2; + int ret = strcmp(ci1->k.name, ci2->k.name); + if (ret == 0) + ret = strcmp(ci1->registry, ci2->registry); + return ret; +} + +/* + * Compare by user name, taking into account the source type. + * Need to differentiate between group-IDs received from the front-end + * (via getgroups()) and groups IDs queried from the group database. + * v1 is the key to find or data to insert, v2 is in-tree data. + */ +static int +cmp_gidlist(const void *v1, const void *v2) +{ + const struct cache_item *ci1 = (const struct cache_item *) v1; + const struct cache_item *ci2 = (const struct cache_item *) v2; + int ret = strcmp(ci1->k.name, ci2->k.name); + if (ret == 0) { + if (ci1->type == ENTRY_TYPE_ANY || ci1->type == ci2->type) + return strcmp(ci1->registry, ci2->registry); + if (ci1->type < ci2->type) + return -1; + return 1; + } + return ret; +} + +void +sudo_pw_addref(struct passwd *pw) +{ + debug_decl(sudo_pw_addref, SUDOERS_DEBUG_NSS); + ptr_to_item(pw)->refcnt++; + debug_return; +} + +static void +sudo_pw_delref_item(void *v) +{ + struct cache_item *item = v; + debug_decl(sudo_pw_delref_item, SUDOERS_DEBUG_NSS); + + if (--item->refcnt == 0) + free(item); + + debug_return; +} + +void +sudo_pw_delref(struct passwd *pw) +{ + debug_decl(sudo_pw_delref, SUDOERS_DEBUG_NSS); + sudo_pw_delref_item(ptr_to_item(pw)); + debug_return; +} + +/* + * Get a password entry by uid and allocate space for it. + */ +struct passwd * +sudo_getpwuid(uid_t uid) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_getpwuid, SUDOERS_DEBUG_NSS); + + if (pwcache_byuid == NULL) { + pwcache_byuid = rbcreate(cmp_pwuid); + if (pwcache_byuid == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.uid = uid; + getauthregistry(IDtouser(uid), key.registry); + if ((node = rbfind(pwcache_byuid, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache passwd db entry if it exists or a negative response if not. + */ +#ifdef HAVE_SETAUTHDB + aix_setauthdb(IDtouser(uid), key.registry); +#endif + item = make_pwitem(uid, NULL); +#ifdef HAVE_SETAUTHDB + aix_restoreauthdb(); +#endif + if (item == NULL) { + if (errno != ENOENT || (item = calloc(1, sizeof(*item))) == NULL) { + sudo_warn(U_("unable to cache uid %u"), (unsigned int) uid); + /* cppcheck-suppress memleak */ + debug_return_ptr(NULL); + } + item->refcnt = 1; + item->k.uid = uid; + /* item->d.pw = NULL; */ + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(pwcache_byuid, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache uid %u, already exists"), + (unsigned int) uid); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache uid %u"), (unsigned int) uid); + item->refcnt = 0; + break; + } +done: + if (item->refcnt != 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: uid %u [%s] -> user %s [%s] (%s)", __func__, + (unsigned int)uid, key.registry, + item->d.pw ? item->d.pw->pw_name : "unknown", + item->registry, node ? "cache hit" : "cached"); + } + if (item->d.pw != NULL) + item->refcnt++; + debug_return_ptr(item->d.pw); +} + +/* + * Get a password entry by name and allocate space for it. + */ +struct passwd * +sudo_getpwnam(const char *name) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_getpwnam, SUDOERS_DEBUG_NSS); + + if (pwcache_byname == NULL) { + pwcache_byname = rbcreate(cmp_pwnam); + if (pwcache_byname == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.name = (char *) name; + getauthregistry((char *) name, key.registry); + if ((node = rbfind(pwcache_byname, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache passwd db entry if it exists or a negative response if not. + */ +#ifdef HAVE_SETAUTHDB + aix_setauthdb((char *) name, key.registry); +#endif + item = make_pwitem((uid_t)-1, name); +#ifdef HAVE_SETAUTHDB + aix_restoreauthdb(); +#endif + if (item == NULL) { + const size_t len = strlen(name) + 1; + if (errno != ENOENT || (item = calloc(1, sizeof(*item) + len)) == NULL) { + sudo_warn(U_("unable to cache user %s"), name); + /* cppcheck-suppress memleak */ + debug_return_ptr(NULL); + } + item->refcnt = 1; + item->k.name = (char *) item + sizeof(*item); + memcpy(item->k.name, name, len); + /* item->d.pw = NULL; */ + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(pwcache_byname, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache user %s, already exists"), name); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache user %s"), name); + item->refcnt = 0; + break; + } +done: + if (item->refcnt != 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: user %s [%s] -> uid %d [%s] (%s)", __func__, name, + key.registry, item->d.pw ? (int)item->d.pw->pw_uid : -1, + item->registry, node ? "cache hit" : "cached"); + } + if (item->d.pw != NULL) + item->refcnt++; + debug_return_ptr(item->d.pw); +} + +/* + * Take a user, uid, gid, home and shell and return a faked up passwd struct. + * If home or shell are NULL default values will be used. + */ +struct passwd * +sudo_mkpwent(const char *user, uid_t uid, gid_t gid, const char *home, + const char *shell) +{ + struct cache_item_pw *pwitem; + struct cache_item *item; + struct passwd *pw; + size_t len, name_len, home_len, shell_len; + int i; + debug_decl(sudo_mkpwent, SUDOERS_DEBUG_NSS); + + if (pwcache_byuid == NULL) + pwcache_byuid = rbcreate(cmp_pwuid); + if (pwcache_byname == NULL) + pwcache_byname = rbcreate(cmp_pwnam); + if (pwcache_byuid == NULL || pwcache_byname == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + + /* Optional arguments. */ + if (home == NULL) + home = "/"; + if (shell == NULL) + shell = _PATH_BSHELL; + + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: creating and caching passwd struct for %s:%u:%u:%s:%s", __func__, + user, (unsigned int)uid, (unsigned int)gid, home, shell); + + name_len = strlen(user); + home_len = strlen(home); + shell_len = strlen(shell); + len = sizeof(*pwitem) + name_len + 1 /* pw_name */ + + sizeof("*") /* pw_passwd */ + sizeof("") /* pw_gecos */ + + home_len + 1 /* pw_dir */ + shell_len + 1 /* pw_shell */; + + for (i = 0; i < 2; i++) { + struct rbtree *pwcache; + struct rbnode *node; + + pwitem = calloc(1, len); + if (pwitem == NULL) { + sudo_warn(U_("unable to cache user %s"), user); + debug_return_ptr(NULL); + } + pw = &pwitem->pw; + pw->pw_uid = uid; + pw->pw_gid = gid; + pw->pw_name = (char *)(pwitem + 1); + memcpy(pw->pw_name, user, name_len + 1); + pw->pw_passwd = pw->pw_name + name_len + 1; + memcpy(pw->pw_passwd, "*", 2); + pw->pw_gecos = pw->pw_passwd + 2; + pw->pw_gecos[0] = '\0'; + pw->pw_dir = pw->pw_gecos + 1; + memcpy(pw->pw_dir, home, home_len + 1); + pw->pw_shell = pw->pw_dir + home_len + 1; + memcpy(pw->pw_shell, shell, shell_len + 1); + + item = &pwitem->cache; + item->refcnt = 1; + item->d.pw = pw; + if (i == 0) { + /* Store by uid. */ + item->k.uid = pw->pw_uid; + pwcache = pwcache_byuid; + } else { + /* Store by name. */ + item->k.name = pw->pw_name; + pwcache = pwcache_byname; + } + getauthregistry(NULL, item->registry); + switch (rbinsert(pwcache, item, &node)) { + case 1: + /* Already exists. */ + item = node->data; + if (item->d.pw == NULL) { + /* Negative cache entry, replace with ours. */ + sudo_pw_delref_item(item); + item = node->data = &pwitem->cache; + } else { + /* Good entry, discard our fake one. */ + free(pwitem); + } + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache user %s"), user); + item->refcnt = 0; + break; + } + } + item->refcnt++; + debug_return_ptr(item->d.pw); +} + +/* + * Take a uid in string form "#123" and return a faked up passwd struct. + */ +struct passwd * +sudo_fakepwnam(const char *user, gid_t gid) +{ + const char *errstr; + uid_t uid; + debug_decl(sudo_fakepwnam, SUDOERS_DEBUG_NSS); + + uid = (uid_t) sudo_strtoid(user + 1, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_DIAG|SUDO_DEBUG_LINENO, + "uid %s %s", user, errstr); + debug_return_ptr(NULL); + } + debug_return_ptr(sudo_mkpwent(user, uid, gid, NULL, NULL)); +} + +void +sudo_freepwcache(void) +{ + debug_decl(sudo_freepwcache, SUDOERS_DEBUG_NSS); + + if (pwcache_byuid != NULL) { + rbdestroy(pwcache_byuid, sudo_pw_delref_item); + pwcache_byuid = NULL; + } + if (pwcache_byname != NULL) { + rbdestroy(pwcache_byname, sudo_pw_delref_item); + pwcache_byname = NULL; + } + + debug_return; +} + +/* + * Compare by group-ID. + * v1 is the key to find or data to insert, v2 is in-tree data. + */ +static int +cmp_grgid(const void *v1, const void *v2) +{ + const struct cache_item *ci1 = (const struct cache_item *) v1; + const struct cache_item *ci2 = (const struct cache_item *) v2; + if (ci1->k.gid == ci2->k.gid) + return strcmp(ci1->registry, ci2->registry); + if (ci1->k.gid < ci2->k.gid) + return -1; + return 1; +} + +void +sudo_gr_addref(struct group *gr) +{ + debug_decl(sudo_gr_addref, SUDOERS_DEBUG_NSS); + ptr_to_item(gr)->refcnt++; + debug_return; +} + +static void +sudo_gr_delref_item(void *v) +{ + struct cache_item *item = v; + debug_decl(sudo_gr_delref_item, SUDOERS_DEBUG_NSS); + + if (--item->refcnt == 0) + free(item); + + debug_return; +} + +void +sudo_gr_delref(struct group *gr) +{ + debug_decl(sudo_gr_delref, SUDOERS_DEBUG_NSS); + sudo_gr_delref_item(ptr_to_item(gr)); + debug_return; +} + +/* + * Get a group entry by gid and allocate space for it. + */ +struct group * +sudo_getgrgid(gid_t gid) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_getgrgid, SUDOERS_DEBUG_NSS); + + if (grcache_bygid == NULL) { + grcache_bygid = rbcreate(cmp_grgid); + if (grcache_bygid == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.gid = gid; + getauthregistry(NULL, key.registry); + if ((node = rbfind(grcache_bygid, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache group db entry if it exists or a negative response if not. + */ + item = make_gritem(gid, NULL); + if (item == NULL) { + if (errno != ENOENT || (item = calloc(1, sizeof(*item))) == NULL) { + sudo_warn(U_("unable to cache gid %u"), (unsigned int) gid); + /* cppcheck-suppress memleak */ + debug_return_ptr(NULL); + } + item->refcnt = 1; + item->k.gid = gid; + /* item->d.gr = NULL; */ + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(grcache_bygid, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache gid %u, already exists"), + (unsigned int) gid); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache gid %u"), (unsigned int) gid); + item->refcnt = 0; + break; + } +done: + if (item->refcnt != 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: gid %u [%s] -> group %s [%s] (%s)", __func__, + (unsigned int)gid, key.registry, + item->d.gr ? item->d.gr->gr_name : "unknown", + item->registry, node ? "cache hit" : "cached"); + } + item->refcnt++; + debug_return_ptr(item->d.gr); +} + +/* + * Get a group entry by name and allocate space for it. + */ +struct group * +sudo_getgrnam(const char *name) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_getgrnam, SUDOERS_DEBUG_NSS); + + if (grcache_byname == NULL) { + grcache_byname = rbcreate(cmp_grnam); + if (grcache_byname == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.name = (char *) name; + getauthregistry(NULL, key.registry); + if ((node = rbfind(grcache_byname, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache group db entry if it exists or a negative response if not. + */ + item = make_gritem((gid_t)-1, name); + if (item == NULL) { + const size_t len = strlen(name) + 1; + if (errno != ENOENT || (item = calloc(1, sizeof(*item) + len)) == NULL) { + sudo_warn(U_("unable to cache group %s"), name); + /* cppcheck-suppress memleak */ + debug_return_ptr(NULL); + } + item->refcnt = 1; + item->k.name = (char *) item + sizeof(*item); + memcpy(item->k.name, name, len); + /* item->d.gr = NULL; */ + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(grcache_byname, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache group %s, already exists"), name); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache group %s"), name); + item->refcnt = 0; + break; + } +done: + if (item->refcnt != 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: group %s [%s] -> gid %d [%s] (%s)", __func__, name, + key.registry, item->d.gr ? (int)item->d.gr->gr_gid : -1, + item->registry, node ? "cache hit" : "cached"); + } + if (item->d.gr != NULL) + item->refcnt++; + debug_return_ptr(item->d.gr); +} + +/* + * Take a gid in string form "#123" and return a faked up group struct. + */ +struct group * +sudo_fakegrnam(const char *group) +{ + struct cache_item_gr *gritem; + struct cache_item *item; + const char *errstr; + struct group *gr; + size_t len, name_len; + int i; + debug_decl(sudo_fakegrnam, SUDOERS_DEBUG_NSS); + + if (grcache_bygid == NULL) + grcache_bygid = rbcreate(cmp_grgid); + if (grcache_byname == NULL) + grcache_byname = rbcreate(cmp_grnam); + if (grcache_bygid == NULL || grcache_byname == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + + name_len = strlen(group); + len = sizeof(*gritem) + name_len + 1; + + for (i = 0; i < 2; i++) { + struct rbtree *grcache; + struct rbnode *node; + + gritem = calloc(1, len); + if (gritem == NULL) { + sudo_warn(U_("unable to cache group %s"), group); + debug_return_ptr(NULL); + } + gr = &gritem->gr; + gr->gr_gid = (gid_t) sudo_strtoid(group + 1, &errstr); + gr->gr_name = (char *)(gritem + 1); + memcpy(gr->gr_name, group, name_len + 1); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_DIAG|SUDO_DEBUG_LINENO, + "gid %s %s", group, errstr); + free(gritem); + debug_return_ptr(NULL); + } + + item = &gritem->cache; + item->refcnt = 1; + item->d.gr = gr; + if (i == 0) { + /* Store by gid if it doesn't already exist. */ + item->k.gid = gr->gr_gid; + grcache = grcache_bygid; + } else { + /* Store by name, overwriting cached version. */ + gritem->cache.k.name = gr->gr_name; + grcache = grcache_byname; + } + getauthregistry(NULL, item->registry); + switch (rbinsert(grcache, item, &node)) { + case 1: + /* Already exists. */ + item = node->data; + if (item->d.gr == NULL) { + /* Negative cache entry, replace with ours. */ + sudo_gr_delref_item(item); + item = node->data = &gritem->cache; + } else { + /* Good entry, discard our fake one. */ + free(gritem); + } + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache group %s"), group); + item->refcnt = 0; + break; + } + } + if (item->d.gr != NULL) + item->refcnt++; + debug_return_ptr(item->d.gr); +} + +void +sudo_gidlist_addref(struct gid_list *gidlist) +{ + debug_decl(sudo_gidlist_addref, SUDOERS_DEBUG_NSS); + ptr_to_item(gidlist)->refcnt++; + debug_return; +} + +static void +sudo_gidlist_delref_item(void *v) +{ + struct cache_item *item = v; + debug_decl(sudo_gidlist_delref_item, SUDOERS_DEBUG_NSS); + + if (--item->refcnt == 0) + free(item); + + debug_return; +} + +void +sudo_gidlist_delref(struct gid_list *gidlist) +{ + debug_decl(sudo_gidlist_delref, SUDOERS_DEBUG_NSS); + sudo_gidlist_delref_item(ptr_to_item(gidlist)); + debug_return; +} + +void +sudo_grlist_addref(struct group_list *grlist) +{ + debug_decl(sudo_grlist_addref, SUDOERS_DEBUG_NSS); + ptr_to_item(grlist)->refcnt++; + debug_return; +} + +static void +sudo_grlist_delref_item(void *v) +{ + struct cache_item *item = v; + debug_decl(sudo_grlist_delref_item, SUDOERS_DEBUG_NSS); + + if (--item->refcnt == 0) + free(item); + + debug_return; +} + +void +sudo_grlist_delref(struct group_list *grlist) +{ + debug_decl(sudo_grlist_delref, SUDOERS_DEBUG_NSS); + sudo_grlist_delref_item(ptr_to_item(grlist)); + debug_return; +} + +void +sudo_freegrcache(void) +{ + debug_decl(sudo_freegrcache, SUDOERS_DEBUG_NSS); + + if (grcache_bygid != NULL) { + rbdestroy(grcache_bygid, sudo_gr_delref_item); + grcache_bygid = NULL; + } + if (grcache_byname != NULL) { + rbdestroy(grcache_byname, sudo_gr_delref_item); + grcache_byname = NULL; + } + if (grlist_cache != NULL) { + rbdestroy(grlist_cache, sudo_grlist_delref_item); + grlist_cache = NULL; + } + if (gidlist_cache != NULL) { + rbdestroy(gidlist_cache, sudo_gidlist_delref_item); + gidlist_cache = NULL; + } + + debug_return; +} + +struct group_list * +sudo_get_grlist(const struct passwd *pw) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_get_grlist, SUDOERS_DEBUG_NSS); + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: looking up group names for %s", + __func__, pw->pw_name); + + if (grlist_cache == NULL) { + grlist_cache = rbcreate(cmp_pwnam); + if (grlist_cache == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.name = pw->pw_name; + getauthregistry(pw->pw_name, key.registry); + if ((node = rbfind(grlist_cache, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache group db entry if it exists or a negative response if not. + */ + item = make_grlist_item(pw, NULL); + if (item == NULL) { + /* Out of memory? */ + debug_return_ptr(NULL); + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(grlist_cache, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache group list for %s, already exists"), + pw->pw_name); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache group list for %s"), pw->pw_name); + item->refcnt = 0; + break; + } + if (item->d.grlist != NULL) { + int i; + for (i = 0; i < item->d.grlist->ngroups; i++) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: user %s is a member of group %s", __func__, + pw->pw_name, item->d.grlist->groups[i]); + } + } +done: + if (item->d.grlist != NULL) + item->refcnt++; + debug_return_ptr(item->d.grlist); +} + +int +sudo_set_grlist(struct passwd *pw, char * const *groups) +{ + struct cache_item key, *item; + debug_decl(sudo_set_grlist, SUDOERS_DEBUG_NSS); + + if (grlist_cache == NULL) { + grlist_cache = rbcreate(cmp_pwnam); + if (grlist_cache == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + } + + /* + * Cache group db entry if it doesn't already exist + */ + key.k.name = pw->pw_name; + getauthregistry(NULL, key.registry); + if (rbfind(grlist_cache, &key) == NULL) { + if ((item = make_grlist_item(pw, groups)) == NULL) { + sudo_warnx(U_("unable to parse groups for %s"), pw->pw_name); + debug_return_int(-1); + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(grlist_cache, item, NULL)) { + case 1: + sudo_warnx(U_("unable to cache group list for %s, already exists"), + pw->pw_name); + sudo_grlist_delref_item(item); + break; + case -1: + sudo_warn(U_("unable to cache group list for %s"), pw->pw_name); + sudo_grlist_delref_item(item); + debug_return_int(-1); + } + } + debug_return_int(0); +} + +struct gid_list * +sudo_get_gidlist(const struct passwd *pw, unsigned int type) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_get_gidlist, SUDOERS_DEBUG_NSS); + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: looking up group-IDs for %s", + __func__, pw->pw_name); + + if (gidlist_cache == NULL) { + gidlist_cache = rbcreate(cmp_gidlist); + if (gidlist_cache == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.name = pw->pw_name; + key.type = type; + getauthregistry(pw->pw_name, key.registry); + if ((node = rbfind(gidlist_cache, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache group db entry if it exists or a negative response if not. + */ + item = make_gidlist_item(pw, NULL, type); + if (item == NULL) { + /* Out of memory? */ + debug_return_ptr(NULL); + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(gidlist_cache, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache group list for %s, already exists"), + pw->pw_name); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache group list for %s"), pw->pw_name); + item->refcnt = 0; + break; + } + if (item->d.gidlist != NULL) { + int i; + for (i = 0; i < item->d.gidlist->ngids; i++) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: user %s has supplementary gid %u", __func__, + pw->pw_name, (unsigned int)item->d.gidlist->gids[i]); + } + } +done: + if (item->d.gidlist != NULL) + item->refcnt++; + debug_return_ptr(item->d.gidlist); +} + +int +sudo_set_gidlist(struct passwd *pw, char * const *gids, unsigned int type) +{ + struct cache_item key, *item; + debug_decl(sudo_set_gidlist, SUDOERS_DEBUG_NSS); + + if (gidlist_cache == NULL) { + gidlist_cache = rbcreate(cmp_gidlist); + if (gidlist_cache == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + } + + /* + * Cache group db entry if it doesn't already exist + */ + key.k.name = pw->pw_name; + key.type = type; + getauthregistry(NULL, key.registry); + if (rbfind(gidlist_cache, &key) == NULL) { + if ((item = make_gidlist_item(pw, gids, type)) == NULL) { + sudo_warnx(U_("unable to parse gids for %s"), pw->pw_name); + debug_return_int(-1); + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(gidlist_cache, item, NULL)) { + case 1: + sudo_warnx(U_("unable to cache group list for %s, already exists"), + pw->pw_name); + sudo_gidlist_delref_item(item); + break; + case -1: + sudo_warn(U_("unable to cache group list for %s"), pw->pw_name); + sudo_gidlist_delref_item(item); + debug_return_int(-1); + } + } + debug_return_int(0); +} + +bool +user_in_group(const struct passwd *pw, const char *group) +{ + struct group_list *grlist = NULL; + struct gid_list *gidlist = NULL; + struct group *grp = NULL; + bool matched = false; + int i; + debug_decl(user_in_group, SUDOERS_DEBUG_NSS); + + /* + * If it could be a sudo-style group-ID check gids first. + */ + if (group[0] == '#') { + const char *errstr; + gid_t gid = (gid_t) sudo_strtoid(group + 1, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_DIAG|SUDO_DEBUG_LINENO, + "gid %s %s", group, errstr); + } else { + if (gid == pw->pw_gid) { + matched = true; + goto done; + } + if ((gidlist = sudo_get_gidlist(pw, ENTRY_TYPE_ANY)) != NULL) { + for (i = 0; i < gidlist->ngids; i++) { + if (gid == gidlist->gids[i]) { + matched = true; + goto done; + } + } + } + } + } + + /* + * Next match the group name. By default, sudoers resolves all the user's + * group-IDs to names and matches by name. If match_group_by_gid is + * set, each group is sudoers is resolved and matching is by group-ID. + */ + if (def_match_group_by_gid) { + gid_t gid; + + /* Look up the ID of the group in sudoers. */ + if ((grp = sudo_getgrnam(group)) == NULL) + goto done; + gid = grp->gr_gid; + + /* Check against user's primary (passwd file) group-ID. */ + if (gid == pw->pw_gid) { + matched = true; + goto done; + } + + /* Check the supplementary group vector. */ + if (gidlist == NULL) { + if ((gidlist = sudo_get_gidlist(pw, ENTRY_TYPE_ANY)) != NULL) { + for (i = 0; i < gidlist->ngids; i++) { + if (gid == gidlist->gids[i]) { + matched = true; + goto done; + } + } + } + } + } else if ((grlist = sudo_get_grlist(pw)) != NULL) { + int (*compare)(const char *, const char *); + if (def_case_insensitive_group) + compare = strcasecmp; + else + compare = strcmp; + + /* Check the supplementary group vector. */ + for (i = 0; i < grlist->ngroups; i++) { + if (compare(group, grlist->groups[i]) == 0) { + matched = true; + goto done; + } + } + + /* Check against user's primary (passwd file) group. */ + if ((grp = sudo_getgrgid(pw->pw_gid)) != NULL) { + if (compare(group, grp->gr_name) == 0) { + matched = true; + goto done; + } + } + } + +done: + if (grp != NULL) + sudo_gr_delref(grp); + if (grlist != NULL) + sudo_grlist_delref(grlist); + if (gidlist != NULL) + sudo_gidlist_delref(gidlist); + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: user %s %sin group %s", + __func__, pw->pw_name, matched ? "" : "NOT ", group); + debug_return_bool(matched); +} diff --git a/plugins/sudoers/pwutil.h b/plugins/sudoers/pwutil.h new file mode 100644 index 0000000..d08f61f --- /dev/null +++ b/plugins/sudoers/pwutil.h @@ -0,0 +1,77 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2013, 2015-2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_PWUTIL_H +#define SUDOERS_PWUTIL_H + +#define ptr_to_item(p) ((struct cache_item *)((char *)p - offsetof(struct cache_item_##p, p))) + +/* + * Generic cache element. + */ +struct cache_item { + unsigned int refcnt; + unsigned int type; /* only used for gidlist */ + char registry[16]; /* AIX-specific, empty otherwise */ + /* key */ + union { + uid_t uid; + gid_t gid; + char *name; + } k; + /* datum */ + union { + struct passwd *pw; + struct group *gr; + struct group_list *grlist; + struct gid_list *gidlist; + } d; +}; + +/* + * Container structs to simpify size and offset calculations and guarantee + * proper alignment of struct passwd, group, gid_list and group_list. + */ +struct cache_item_pw { + struct cache_item cache; + struct passwd pw; +}; + +struct cache_item_gr { + struct cache_item cache; + struct group gr; +}; + +struct cache_item_grlist { + struct cache_item cache; + struct group_list grlist; + /* actually bigger */ +}; + +struct cache_item_gidlist { + struct cache_item cache; + struct gid_list gidlist; + /* actually bigger */ +}; + +struct cache_item *sudo_make_gritem(gid_t gid, const char *group); +struct cache_item *sudo_make_grlist_item(const struct passwd *pw, char * const *groups); +struct cache_item *sudo_make_gidlist_item(const struct passwd *pw, char * const *gids, unsigned int type); +struct cache_item *sudo_make_pwitem(uid_t uid, const char *user); + +#endif /* SUDOERS_PWUTIL_H */ diff --git a/plugins/sudoers/pwutil_impl.c b/plugins/sudoers/pwutil_impl.c new file mode 100644 index 0000000..2e39e08 --- /dev/null +++ b/plugins/sudoers/pwutil_impl.c @@ -0,0 +1,414 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "pwutil.h" + +#ifndef LOGIN_NAME_MAX +# ifdef _POSIX_LOGIN_NAME_MAX +# define LOGIN_NAME_MAX _POSIX_LOGIN_NAME_MAX +# else +# define LOGIN_NAME_MAX 9 +# endif +#endif /* LOGIN_NAME_MAX */ + +#define FIELD_SIZE(src, name, size) \ +do { \ + if (src->name) { \ + size = strlen(src->name) + 1; \ + total += size; \ + } else { \ + size = 0; \ + } \ +} while (0) + +#define FIELD_COPY(src, dst, name, size) \ +do { \ + if (src->name) { \ + memcpy(cp, src->name, size); \ + dst->name = cp; \ + cp += size; \ + } \ +} while (0) + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. If name is non-NULL it is used as the key, else the + * uid is the key. Fills in datum from struct password. + * Returns NULL on calloc error or unknown name/id, setting errno + * to ENOMEM or ENOENT respectively. + */ +struct cache_item * +sudo_make_pwitem(uid_t uid, const char *name) +{ + char *cp; + const char *pw_shell; + size_t nsize, psize, gsize, dsize, ssize, total; +#ifdef HAVE_LOGIN_CAP_H + size_t csize; +#endif + struct cache_item_pw *pwitem; + struct passwd *pw, *newpw; + debug_decl(sudo_make_pwitem, SUDOERS_DEBUG_NSS); + + /* Look up by name or uid. */ + pw = name ? getpwnam(name) : getpwuid(uid); + if (pw == NULL) { + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* If shell field is empty, expand to _PATH_BSHELL. */ + pw_shell = (pw->pw_shell == NULL || pw->pw_shell[0] == '\0') + ? _PATH_BSHELL : pw->pw_shell; + + /* Allocate in one big chunk for easy freeing. */ + total = sizeof(*pwitem); + FIELD_SIZE(pw, pw_name, nsize); + FIELD_SIZE(pw, pw_passwd, psize); +#ifdef HAVE_LOGIN_CAP_H + FIELD_SIZE(pw, pw_class, csize); +#endif + FIELD_SIZE(pw, pw_gecos, gsize); + FIELD_SIZE(pw, pw_dir, dsize); + /* Treat shell specially since we expand "" -> _PATH_BSHELL */ + ssize = strlen(pw_shell) + 1; + total += ssize; + if (name != NULL) + total += strlen(name) + 1; + + /* Allocate space for struct item, struct passwd and the strings. */ + if ((pwitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + newpw = &pwitem->pw; + + /* + * Copy in passwd contents and make strings relative to space + * at the end of the struct. + */ + memcpy(newpw, pw, sizeof(*pw)); + cp = (char *)(pwitem + 1); + FIELD_COPY(pw, newpw, pw_name, nsize); + FIELD_COPY(pw, newpw, pw_passwd, psize); +#ifdef HAVE_LOGIN_CAP_H + FIELD_COPY(pw, newpw, pw_class, csize); +#endif + FIELD_COPY(pw, newpw, pw_gecos, gsize); + FIELD_COPY(pw, newpw, pw_dir, dsize); + /* Treat shell specially since we expand "" -> _PATH_BSHELL */ + memcpy(cp, pw_shell, ssize); + newpw->pw_shell = cp; + cp += ssize; + + /* Set key and datum. */ + if (name != NULL) { + memcpy(cp, name, strlen(name) + 1); + pwitem->cache.k.name = cp; + } else { + pwitem->cache.k.uid = pw->pw_uid; + } + pwitem->cache.d.pw = newpw; + pwitem->cache.refcnt = 1; + + debug_return_ptr(&pwitem->cache); +} + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. If name is non-NULL it is used as the key, else the + * gid is the key. Fills in datum from struct group. + * Returns NULL on calloc error or unknown name/id, setting errno + * to ENOMEM or ENOENT respectively. + */ +struct cache_item * +sudo_make_gritem(gid_t gid, const char *name) +{ + char *cp; + size_t nsize, psize, total, len, nmem = 0; + struct cache_item_gr *gritem; + struct group *gr, *newgr; + debug_decl(sudo_make_gritem, SUDOERS_DEBUG_NSS); + + /* Look up by name or gid. */ + gr = name ? getgrnam(name) : getgrgid(gid); + if (gr == NULL) { + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Allocate in one big chunk for easy freeing. */ + total = sizeof(*gritem); + FIELD_SIZE(gr, gr_name, nsize); + FIELD_SIZE(gr, gr_passwd, psize); + if (gr->gr_mem) { + for (nmem = 0; gr->gr_mem[nmem] != NULL; nmem++) + total += strlen(gr->gr_mem[nmem]) + 1; + nmem++; + total += sizeof(char *) * nmem; + } + if (name != NULL) + total += strlen(name) + 1; + + if ((gritem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + /* + * Copy in group contents and make strings relative to space + * at the end of the buffer. Note that gr_mem must come + * immediately after struct group to guarantee proper alignment. + */ + newgr = &gritem->gr; + memcpy(newgr, gr, sizeof(*gr)); + cp = (char *)(gritem + 1); + if (gr->gr_mem) { + newgr->gr_mem = (char **)cp; + cp += sizeof(char *) * nmem; + for (nmem = 0; gr->gr_mem[nmem] != NULL; nmem++) { + len = strlen(gr->gr_mem[nmem]) + 1; + memcpy(cp, gr->gr_mem[nmem], len); + newgr->gr_mem[nmem] = cp; + cp += len; + } + newgr->gr_mem[nmem] = NULL; + } + FIELD_COPY(gr, newgr, gr_passwd, psize); + FIELD_COPY(gr, newgr, gr_name, nsize); + + /* Set key and datum. */ + if (name != NULL) { + memcpy(cp, name, strlen(name) + 1); + gritem->cache.k.name = cp; + } else { + gritem->cache.k.gid = gr->gr_gid; + } + gritem->cache.d.gr = newgr; + gritem->cache.refcnt = 1; + + debug_return_ptr(&gritem->cache); +} + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. Fills in datum from user_gids or from sudo_getgrouplist2(3). + */ +struct cache_item * +sudo_make_gidlist_item(const struct passwd *pw, char * const *unused1, + unsigned int type) +{ + char *cp; + size_t nsize, total; + struct cache_item_gidlist *glitem; + struct gid_list *gidlist; + GETGROUPS_T *gids; + int i, ngids; + debug_decl(sudo_make_gidlist_item, SUDOERS_DEBUG_NSS); + + /* Don't use user_gids if the entry type says we must query the db. */ + if (type != ENTRY_TYPE_QUERIED && pw == sudo_user.pw && sudo_user.gids != NULL) { + gids = user_gids; + ngids = user_ngids; + user_gids = NULL; + user_ngids = 0; + type = ENTRY_TYPE_FRONTEND; + } else { + type = ENTRY_TYPE_QUERIED; + if (sudo_user.max_groups > 0) { + ngids = sudo_user.max_groups; + gids = reallocarray(NULL, ngids, sizeof(GETGROUPS_T)); + if (gids == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + (void)sudo_getgrouplist2(pw->pw_name, pw->pw_gid, &gids, &ngids); + } else { + gids = NULL; + if (sudo_getgrouplist2(pw->pw_name, pw->pw_gid, &gids, &ngids) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + } + } + if (ngids <= 0) { + free(gids); + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Allocate in one big chunk for easy freeing. */ + nsize = strlen(pw->pw_name) + 1; + total = sizeof(*glitem) + nsize; + total += sizeof(gid_t *) * ngids; + + if ((glitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(gids); + debug_return_ptr(NULL); + } + + /* + * Copy in group list and make pointers relative to space + * at the end of the buffer. Note that the groups array must come + * immediately after struct group to guarantee proper alignment. + */ + gidlist = &glitem->gidlist; + cp = (char *)(glitem + 1); + gidlist->gids = (gid_t *)cp; + cp += sizeof(gid_t) * ngids; + + /* Set key and datum. */ + memcpy(cp, pw->pw_name, nsize); + glitem->cache.k.name = cp; + glitem->cache.d.gidlist = gidlist; + glitem->cache.refcnt = 1; + glitem->cache.type = type; + + /* + * Store group IDs. + */ + for (i = 0; i < ngids; i++) + gidlist->gids[i] = gids[i]; + gidlist->ngids = ngids; + free(gids); + + debug_return_ptr(&glitem->cache); +} + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. Fills in group names from a call to sudo_get_gidlist(). + */ +struct cache_item * +sudo_make_grlist_item(const struct passwd *pw, char * const *unused1) +{ + char *cp; + size_t nsize, ngroups, total, len; + struct cache_item_grlist *grlitem; + struct group_list *grlist; + struct gid_list *gidlist; + struct group *grp = NULL; + int i, groupname_len; + debug_decl(sudo_make_grlist_item, SUDOERS_DEBUG_NSS); + + gidlist = sudo_get_gidlist(pw, ENTRY_TYPE_ANY); + if (gidlist == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "no gid list for use %s", pw->pw_name); + errno = ENOENT; + debug_return_ptr(NULL); + } + +#ifdef _SC_LOGIN_NAME_MAX + groupname_len = MAX((int)sysconf(_SC_LOGIN_NAME_MAX), 32); +#else + groupname_len = MAX(LOGIN_NAME_MAX, 32); +#endif + + /* Allocate in one big chunk for easy freeing. */ + nsize = strlen(pw->pw_name) + 1; + total = sizeof(*grlitem) + nsize; + total += sizeof(char *) * gidlist->ngids; + total += groupname_len * gidlist->ngids; + +again: + if ((grlitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + sudo_gidlist_delref(gidlist); + debug_return_ptr(NULL); + } + + /* + * Copy in group list and make pointers relative to space + * at the end of the buffer. Note that the groups array must come + * immediately after struct group to guarantee proper alignment. + */ + grlist = &grlitem->grlist; + cp = (char *)(grlitem + 1); + grlist->groups = (char **)cp; + cp += sizeof(char *) * gidlist->ngids; + + /* Set key and datum. */ + memcpy(cp, pw->pw_name, nsize); + grlitem->cache.k.name = cp; + grlitem->cache.d.grlist = grlist; + grlitem->cache.refcnt = 1; + cp += nsize; + + /* + * Resolve and store group names by ID. + */ +#ifdef HAVE_SETAUTHDB + if (grp == NULL) + aix_setauthdb((char *) pw->pw_name, NULL); +#endif + ngroups = 0; + for (i = 0; i < gidlist->ngids; i++) { + if ((grp = sudo_getgrgid(gidlist->gids[i])) != NULL) { + len = strlen(grp->gr_name) + 1; + if (cp - (char *)grlitem + len > total) { + total += len + groupname_len; + free(grlitem); + sudo_gr_delref(grp); + goto again; + } + memcpy(cp, grp->gr_name, len); + grlist->groups[ngroups++] = cp; + cp += len; + sudo_gr_delref(grp); + } + } + grlist->ngroups = ngroups; + sudo_gidlist_delref(gidlist); + +#ifdef HAVE_SETAUTHDB + aix_restoreauthdb(); +#endif + + debug_return_ptr(&grlitem->cache); +} diff --git a/plugins/sudoers/rcstr.c b/plugins/sudoers/rcstr.c new file mode 100644 index 0000000..04233a3 --- /dev/null +++ b/plugins/sudoers/rcstr.c @@ -0,0 +1,100 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2016-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include + +#include "sudoers.h" + +/* Trivial reference-counted strings. */ +struct rcstr { + int refcnt; + char str[1]; /* actually bigger */ +}; + +/* + * Allocate a reference-counted string and copy src to it. + * Returns the newly-created string with a refcnt of 1. + */ +char * +rcstr_dup(const char *src) +{ + size_t len = strlen(src); + char *dst; + debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL); + + dst = rcstr_alloc(len); + memcpy(dst, src, len); + dst[len] = '\0'; + debug_return_ptr(dst); +} + +char * +rcstr_alloc(size_t len) +{ + struct rcstr *rcs; + debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL); + + /* Note: sizeof(struct rcstr) includes space for the NUL */ + rcs = malloc(sizeof(struct rcstr) + len); + if (rcs == NULL) + return NULL; + + rcs->refcnt = 1; + rcs->str[0] = '\0'; + /* cppcheck-suppress memleak */ + debug_return_ptr(rcs->str); // -V773 +} + +char * +rcstr_addref(const char *s) +{ + struct rcstr *rcs; + debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL); + + if (s == NULL) + debug_return_ptr(NULL); + + rcs = __containerof((const void *)s, struct rcstr, str); + rcs->refcnt++; + debug_return_ptr(rcs->str); +} + +void +rcstr_delref(const char *s) +{ + struct rcstr *rcs; + debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL); + + if (s != NULL) { + rcs = __containerof((const void *)s, struct rcstr, str); + if (--rcs->refcnt == 0) { + rcs->str[0] = '\0'; + free(rcs); + } + } + debug_return; +} diff --git a/plugins/sudoers/redblack.c b/plugins/sudoers/redblack.c new file mode 100644 index 0000000..a7d023c --- /dev/null +++ b/plugins/sudoers/redblack.c @@ -0,0 +1,479 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007, 2009-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Adapted from the following code written by Emin Martinian: + * http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html + * + * Copyright (c) 2001 Emin Martinian + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that neither the name of Emin + * Martinian nor the names of any contributors are 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 + * OWNER 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 "sudoers.h" +#include "redblack.h" + +static void rbrepair(struct rbtree *, struct rbnode *); +static void rotate_left(struct rbtree *, struct rbnode *); +static void rotate_right(struct rbtree *, struct rbnode *); +static void rbdestroy_int(struct rbtree *, struct rbnode *, void (*)(void *)); + +/* + * Red-Black tree, see http://en.wikipedia.org/wiki/Red-black_tree + * + * A red-black tree is a binary search tree where each node has a color + * attribute, the value of which is either red or black. Essentially, it + * is just a convenient way to express a 2-3-4 binary search tree where + * the color indicates whether the node is part of a 3-node or a 4-node. + * In addition to the ordinary requirements imposed on binary search + * trees, we make the following additional requirements of any valid + * red-black tree: + * 1) Every node is either red or black. + * 2) The root is black. + * 3) All leaves are black. + * 4) Both children of each red node are black. + * 5) The paths from each leaf up to the root each contain the same + * number of black nodes. + */ + +/* + * Create a red black tree struct using the specified compare routine. + * Allocates and returns the initialized (empty) tree or NULL if + * memory cannot be allocated. + */ +struct rbtree * +rbcreate(int (*compar)(const void *, const void*)) +{ + struct rbtree *tree; + debug_decl(rbcreate, SUDOERS_DEBUG_RBTREE); + + if ((tree = malloc(sizeof(*tree))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + tree->compar = compar; + + /* + * We use a self-referencing sentinel node called nil to simplify the + * code by avoiding the need to check for NULL pointers. + */ + tree->nil.left = tree->nil.right = tree->nil.parent = &tree->nil; + tree->nil.color = black; + tree->nil.data = NULL; + + /* + * Similarly, the fake root node keeps us from having to worry + * about splitting the root. + */ + tree->root.left = tree->root.right = tree->root.parent = &tree->nil; // -V778 + tree->root.color = black; + tree->root.data = NULL; + + debug_return_ptr(tree); +} + +/* + * Perform a left rotation starting at node. + */ +static void +rotate_left(struct rbtree *tree, struct rbnode *node) +{ + struct rbnode *child; + debug_decl(rotate_left, SUDOERS_DEBUG_RBTREE); + + child = node->right; + node->right = child->left; + + if (child->left != rbnil(tree)) + child->left->parent = node; + child->parent = node->parent; + + if (node == node->parent->left) + node->parent->left = child; + else + node->parent->right = child; + child->left = node; + node->parent = child; + + debug_return; +} + +/* + * Perform a right rotation starting at node. + */ +static void +rotate_right(struct rbtree *tree, struct rbnode *node) +{ + struct rbnode *child; + debug_decl(rotate_right, SUDOERS_DEBUG_RBTREE); + + child = node->left; + node->left = child->right; + + if (child->right != rbnil(tree)) + child->right->parent = node; + child->parent = node->parent; + + if (node == node->parent->left) + node->parent->left = child; + else + node->parent->right = child; + child->right = node; + node->parent = child; + + debug_return; +} + +/* + * Insert data pointer into a redblack tree. + * Returns a 0 on success, 1 if a node matching "data" already exists + * (filling in "existing" if not NULL), or -1 on malloc() failure. + */ +int +rbinsert(struct rbtree *tree, void *data, struct rbnode **existing) +{ + struct rbnode *node = rbfirst(tree); + struct rbnode *parent = rbroot(tree); + int res; + debug_decl(rbinsert, SUDOERS_DEBUG_RBTREE); + + /* Find correct insertion point. */ + while (node != rbnil(tree)) { + parent = node; + if ((res = tree->compar(data, node->data)) == 0) { + if (existing != NULL) + *existing = node; + debug_return_int(1); + } + node = res < 0 ? node->left : node->right; + } + + node = malloc(sizeof(*node)); + if (node == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_int(-1); + } + node->data = data; + node->left = node->right = rbnil(tree); + node->parent = parent; + if (parent == rbroot(tree) || tree->compar(data, parent->data) < 0) + parent->left = node; + else + parent->right = node; + node->color = red; + + /* + * If the parent node is black we are all set, if it is red we have + * the following possible cases to deal with. We iterate through + * the rest of the tree to make sure none of the required properties + * is violated. + * + * 1) The uncle is red. We repaint both the parent and uncle black + * and repaint the grandparent node red. + * + * 2) The uncle is black and the new node is the right child of its + * parent, and the parent in turn is the left child of its parent. + * We do a left rotation to switch the roles of the parent and + * child, relying on further iterations to fixup the old parent. + * + * 3) The uncle is black and the new node is the left child of its + * parent, and the parent in turn is the left child of its parent. + * We switch the colors of the parent and grandparent and perform + * a right rotation around the grandparent. This makes the former + * parent the parent of the new node and the former grandparent. + * + * Note that because we use a sentinel for the root node we never + * need to worry about replacing the root. + */ + while (node->parent->color == red) { + struct rbnode *uncle; + if (node->parent == node->parent->parent->left) { + uncle = node->parent->parent->right; + if (uncle->color == red) { + node->parent->color = black; + uncle->color = black; + node->parent->parent->color = red; + node = node->parent->parent; + } else /* if (uncle->color == black) */ { + if (node == node->parent->right) { + node = node->parent; + rotate_left(tree, node); + } + node->parent->color = black; + node->parent->parent->color = red; + rotate_right(tree, node->parent->parent); + } + } else { /* if (node->parent == node->parent->parent->right) */ + uncle = node->parent->parent->left; + if (uncle->color == red) { + node->parent->color = black; + uncle->color = black; + node->parent->parent->color = red; + node = node->parent->parent; + } else /* if (uncle->color == black) */ { + if (node == node->parent->left) { + node = node->parent; + rotate_right(tree, node); + } + node->parent->color = black; + node->parent->parent->color = red; + rotate_left(tree, node->parent->parent); + } + } + } + rbfirst(tree)->color = black; /* first node is always black */ + debug_return_int(0); +} + +/* + * Look for a node matching key in tree. + * Returns a pointer to the node if found, else NULL. + */ +struct rbnode * +rbfind(struct rbtree *tree, void *key) +{ + struct rbnode *node = rbfirst(tree); + int res; + debug_decl(rbfind, SUDOERS_DEBUG_RBTREE); + + while (node != rbnil(tree)) { + if ((res = tree->compar(key, node->data)) == 0) + debug_return_ptr(node); + node = res < 0 ? node->left : node->right; + } + debug_return_ptr(NULL); +} + +/* + * Call func() for each node, passing it the node data and a cookie; + * If func() returns non-zero for a node, the traversal stops and the + * error value is returned. Returns 0 on successful traversal. + */ +int +rbapply_node(struct rbtree *tree, struct rbnode *node, + int (*func)(void *, void *), void *cookie, enum rbtraversal order) +{ + int error; + debug_decl(rbapply_node, SUDOERS_DEBUG_RBTREE); + + if (node != rbnil(tree)) { + if (order == preorder) + if ((error = func(node->data, cookie)) != 0) + debug_return_int(error); + if ((error = rbapply_node(tree, node->left, func, cookie, order)) != 0) + debug_return_int(error); + if (order == inorder) + if ((error = func(node->data, cookie)) != 0) + debug_return_int(error); + if ((error = rbapply_node(tree, node->right, func, cookie, order)) != 0) + debug_return_int(error); + if (order == postorder) + if ((error = func(node->data, cookie)) != 0) + debug_return_int(error); + } + debug_return_int(0); +} + +/* + * Returns the successor of node, or nil if there is none. + */ +static struct rbnode * +rbsuccessor(struct rbtree *tree, struct rbnode *node) +{ + struct rbnode *succ; + debug_decl(rbsuccessor, SUDOERS_DEBUG_RBTREE); + + if ((succ = node->right) != rbnil(tree)) { + while (succ->left != rbnil(tree)) + succ = succ->left; + } else { + /* No right child, move up until we find it or hit the root */ + for (succ = node->parent; node == succ->right; succ = succ->parent) + node = succ; + if (succ == rbroot(tree)) + succ = rbnil(tree); + } + debug_return_ptr(succ); +} + +/* + * Recursive portion of rbdestroy(). + */ +static void +rbdestroy_int(struct rbtree *tree, struct rbnode *node, void (*destroy)(void *)) +{ + debug_decl(rbdestroy_int, SUDOERS_DEBUG_RBTREE); + if (node != rbnil(tree)) { + rbdestroy_int(tree, node->left, destroy); + rbdestroy_int(tree, node->right, destroy); + if (destroy != NULL) + destroy(node->data); + free(node); + } + debug_return; +} + +/* + * Destroy the specified tree, calling the destructor "destroy" + * for each node and then freeing the tree itself. + */ +void +rbdestroy(struct rbtree *tree, void (*destroy)(void *)) +{ + debug_decl(rbdestroy, SUDOERS_DEBUG_RBTREE); + rbdestroy_int(tree, rbfirst(tree), destroy); + free(tree); + debug_return; +} + +/* + * Delete node 'z' from the tree and return its data pointer. + */ +void *rbdelete(struct rbtree *tree, struct rbnode *z) +{ + struct rbnode *x, *y; + void *data = z->data; + debug_decl(rbdelete, SUDOERS_DEBUG_RBTREE); + + if (z->left == rbnil(tree) || z->right == rbnil(tree)) + y = z; + else + y = rbsuccessor(tree, z); + x = (y->left == rbnil(tree)) ? y->right : y->left; + + if ((x->parent = y->parent) == rbroot(tree)) { + rbfirst(tree) = x; + } else { + if (y == y->parent->left) + y->parent->left = x; + else + y->parent->right = x; + } + if (y->color == black) + rbrepair(tree, x); + if (y != z) { + y->left = z->left; + y->right = z->right; + y->parent = z->parent; + y->color = z->color; + z->left->parent = z->right->parent = y; + if (z == z->parent->left) + z->parent->left = y; + else + z->parent->right = y; + } + free(z); + + debug_return_ptr(data); +} + +/* + * Repair the tree after a node has been deleted by rotating and repainting + * colors to restore the 4 properties inherent in red-black trees. + */ +static void +rbrepair(struct rbtree *tree, struct rbnode *node) +{ + struct rbnode *sibling; + debug_decl(rbrepair, SUDOERS_DEBUG_RBTREE); + + while (node->color == black && node != rbfirst(tree)) { + if (node == node->parent->left) { + sibling = node->parent->right; + if (sibling->color == red) { + sibling->color = black; + node->parent->color = red; + rotate_left(tree, node->parent); + sibling = node->parent->right; + } + if (sibling->right->color == black && sibling->left->color == black) { + sibling->color = red; + node = node->parent; + } else { + if (sibling->right->color == black) { + sibling->left->color = black; + sibling->color = red; + rotate_right(tree, sibling); + sibling = node->parent->right; + } + sibling->color = node->parent->color; + node->parent->color = black; + sibling->right->color = black; + rotate_left(tree, node->parent); + node = rbfirst(tree); /* exit loop */ + } + } else { /* if (node == node->parent->right) */ + sibling = node->parent->left; + if (sibling->color == red) { + sibling->color = black; + node->parent->color = red; + rotate_right(tree, node->parent); + sibling = node->parent->left; + } + if (sibling->right->color == black && sibling->left->color == black) { + sibling->color = red; + node = node->parent; + } else { + if (sibling->left->color == black) { + sibling->right->color = black; + sibling->color = red; + rotate_left(tree, sibling); + sibling = node->parent->left; + } + sibling->color = node->parent->color; + node->parent->color = black; + sibling->left->color = black; + rotate_right(tree, node->parent); + node = rbfirst(tree); /* exit loop */ + } + } + } + node->color = black; + + debug_return; +} diff --git a/plugins/sudoers/redblack.h b/plugins/sudoers/redblack.h new file mode 100644 index 0000000..300383d --- /dev/null +++ b/plugins/sudoers/redblack.h @@ -0,0 +1,60 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004, 2007, 2010, 2013 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_REDBLACK_H +#define SUDOERS_REDBLACK_H + +enum rbcolor { + red, + black +}; + +enum rbtraversal { + preorder, + inorder, + postorder +}; + +struct rbnode { + struct rbnode *left, *right, *parent; + void *data; + enum rbcolor color; +}; + +struct rbtree { + int (*compar)(const void *, const void *); + struct rbnode root; + struct rbnode nil; +}; + +#define rbapply(t, f, c, o) rbapply_node((t), (t)->root.left, (f), (c), (o)) +#define rbisempty(t) ((t)->root.left == &(t)->nil && (t)->root.right == &(t)->nil) +#define rbfirst(t) ((t)->root.left) +#define rbroot(t) (&(t)->root) +#define rbnil(t) (&(t)->nil) + +void *rbdelete(struct rbtree *, struct rbnode *); +int rbapply_node(struct rbtree *, struct rbnode *, + int (*)(void *, void *), void *, enum rbtraversal); +struct rbnode *rbfind(struct rbtree *, void *); +int rbinsert(struct rbtree *, void *, struct rbnode **); +struct rbtree *rbcreate(int (*)(const void *, const void *)); +void rbdestroy(struct rbtree *, void (*)(void *)); + +#endif /* SUDOERS_REDBLACK_H */ diff --git a/plugins/sudoers/regress/check_symbols/check_symbols.c b/plugins/sudoers/regress/check_symbols/check_symbols.c new file mode 100644 index 0000000..5a5e02b --- /dev/null +++ b/plugins/sudoers/regress/check_symbols/check_symbols.c @@ -0,0 +1,99 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2012-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_dso.h" +#include "sudo_util.h" +#include "sudo_fatal.h" + +sudo_dso_public int main(int argc, char *argv[]); + +static void +usage(void) +{ + fprintf(stderr, "usage: %s plugin.so symbols_file\n", getprogname()); + exit(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + void *handle, *sym; + const char *plugin_path; + const char *symbols_file; + char *cp, line[LINE_MAX]; + FILE *fp; + int ntests = 0, errors = 0; + + initprogname(argc > 0 ? argv[0] : "check_symbols"); + + if (argc != 3) + usage(); + plugin_path = argv[1]; + symbols_file = argv[2]; + + handle = sudo_dso_load(plugin_path, SUDO_DSO_LAZY|SUDO_DSO_GLOBAL); + if (handle == NULL) { + const char *errstr = sudo_dso_strerror(); + sudo_fatalx_nodebug("unable to load %s: %s", plugin_path, + errstr ? errstr : "unknown error"); + } + + fp = fopen(symbols_file, "r"); + if (fp == NULL) + sudo_fatal_nodebug("unable to open %s", symbols_file); + + while (fgets(line, sizeof(line), fp) != NULL) { + ntests++; + if ((cp = strchr(line, '\n')) != NULL) + *cp = '\0'; + sym = sudo_dso_findsym(handle, line); + if (sym == NULL) { + const char *errstr = sudo_dso_strerror(); + printf("%s: test %d: unable to resolve symbol %s: %s\n", + getprogname(), ntests, line, errstr ? errstr : "unknown error"); + errors++; + } + } + + /* + * Make sure unexported symbols are not available. + */ + ntests++; + sym = sudo_dso_findsym(handle, "user_in_group"); + if (sym != NULL) { + printf("%s: test %d: able to resolve local symbol user_in_group\n", + getprogname(), ntests); + errors++; + } + + sudo_dso_unload(handle); + + printf("%s: %d tests run, %d errors, %d%% success rate\n", getprogname(), + ntests, errors, (ntests - errors) * 100 / ntests); + + exit(errors); +} diff --git a/plugins/sudoers/regress/cvtsudoers/sudoers b/plugins/sudoers/regress/cvtsudoers/sudoers new file mode 100644 index 0000000..8a926f8 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/sudoers @@ -0,0 +1,126 @@ +# +# Sample /etc/sudoers file. +# +# This file MUST be edited with the 'visudo' command as root. +# +# See the sudoers man page for the details on how to write a sudoers file. + +## +# Override built-in defaults +## +Defaults syslog=auth +Defaults>root !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec + +## +# User alias specification +## +User_Alias FULLTIMERS = millert, mikef, dowdy +User_Alias PARTTIMERS = bostley, jwfox, crawl +User_Alias WEBADMIN = will, wendy, wim + +## +# Runas alias specification +## +Runas_Alias OP = root, operator +Runas_Alias DB = oracle, sybase + +## +# Host alias specification +## +Host_Alias SPARC = bigtime, eclipse, moet, anchor:\ + SGI = grolsch, dandelion, black:\ + ALPHA = widget, thalamus, foobar:\ + HPPA = boa, nag, python +Host_Alias CUNETS = 128.138.0.0/255.255.0.0 +Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0 +Host_Alias SERVERS = primary, mail, www, ns +Host_Alias CDROM = orion, perseus, hercules + +## +# Cmnd alias specification +## +Cmnd_Alias DUMPS = /usr/sbin/dump, /usr/sbin/rdump, /usr/sbin/restore, \ + /usr/sbin/rrestore, /usr/bin/mt, \ + sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== \ + /home/operator/bin/start_backups +Cmnd_Alias KILL = /usr/bin/kill, /usr/bin/top +Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm +Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown +Cmnd_Alias HALT = /usr/sbin/halt +Cmnd_Alias REBOOT = /usr/sbin/reboot +Cmnd_Alias SHELLS = /sbin/sh, /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \ + /usr/local/bin/tcsh, /usr/bin/rsh, \ + /usr/local/bin/zsh +Cmnd_Alias SU = /usr/bin/su +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, \ + /usr/bin/chfn +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +## +# User specification +## + +# root and users in group wheel can run anything on any machine as any user +root ALL = (ALL) ALL +%wheel ALL = (ALL) ALL + +# full time sysadmins can run anything on any machine without a password +FULLTIMERS ALL = NOPASSWD: ALL + +# part time sysadmins may run anything but need a password +PARTTIMERS ALL = ALL + +# jack may run anything on machines in CSNETS +jack CSNETS = ALL + +# lisa may run any command on any host in CUNETS (a class B network) +lisa CUNETS = ALL + +# operator may run maintenance commands and anything in /usr/oper/bin/ +operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\ + sudoedit /etc/printcap, /usr/oper/bin/ + +# joe may su only to operator +joe ALL = /usr/bin/su operator + +# pete may change passwords for anyone but root on the hp snakes +pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd *root* + +# bob may run anything on the sparc and sgi machines as any user +# listed in the Runas_Alias "OP" (ie: root and operator) +bob SPARC = (OP) ALL : SGI = (OP) ALL + +# fred can run commands as oracle or sybase without a password +fred ALL = (DB) NOPASSWD: ALL + +# on the alphas, john may su to anyone but root and flags are not allowed +john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* + +# jen can run anything on all machines except the ones +# in the "SERVERS" Host_Alias +jen ALL, !SERVERS = ALL + +# jill can run any commands in the directory /usr/bin/, except for +# those in the SU and SHELLS aliases. +jill SERVERS = /usr/bin/, !SU, !SHELLS + +# steve can run any command in the directory /usr/local/op_commands/ +# as user operator. +steve CSNETS = (operator) /usr/local/op_commands/ + +# matt needs to be able to kill things on his workstation when +# they get hung. +matt valkyrie = KILL + +# users in the WEBADMIN User_Alias (will, wendy, and wim) +# may run any command as user www (which owns the web pages) +# or simply su to www. +WEBADMIN www = (www) ALL, (root) /usr/bin/su www + +# anyone can mount/unmount a cd-rom on the machines in the CDROM alias +ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\ + /sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM diff --git a/plugins/sudoers/regress/cvtsudoers/sudoers.defs b/plugins/sudoers/regress/cvtsudoers/sudoers.defs new file mode 100755 index 0000000..b374930 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/sudoers.defs @@ -0,0 +1,19 @@ +Defaults syslog=auth +Defaults>ROOT !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec + +User_Alias FULLTIMERS = millert, mikef, dowdy +User_Alias PARTTIMERS = bostley, jwfox, crawl + +Host_Alias SERVERS = primary, mail, www, ns +Host_Alias CDROM = orion, perseus, hercules + +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, \ + /usr/bin/chfn +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +Runas_Alias ROOT = root, toor +Runas_Alias OPERATOR = operator, backup diff --git a/plugins/sudoers/regress/cvtsudoers/test1.out.ok b/plugins/sudoers/regress/cvtsudoers/test1.out.ok new file mode 100644 index 0000000..da3f555 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test1.out.ok @@ -0,0 +1,14 @@ +Defaults syslog=auth +Defaults>root !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults!PAGERS noexec + +Host_Alias CDROM = orion, perseus, hercules +User_Alias FULLTIMERS = millert, mikef, dowdy +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +FULLTIMERS ALL = NOPASSWD: ALL + +ALL CDROM = NOPASSWD: /sbin/umount /CDROM, /sbin/mount -o nosuid\,nodev\ + /dev/cd0a /CDROM diff --git a/plugins/sudoers/regress/cvtsudoers/test1.sh b/plugins/sudoers/regress/cvtsudoers/test1.sh new file mode 100755 index 0000000..ba5f87f --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test1.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test user and host filters +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -m user=millert,host=hercules $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/cvtsudoers/test10.out.ok b/plugins/sudoers/regress/cvtsudoers/test10.out.ok new file mode 100644 index 0000000..26a05d2 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test10.out.ok @@ -0,0 +1 @@ +Defaults!PAGERS noexec diff --git a/plugins/sudoers/regress/cvtsudoers/test10.sh b/plugins/sudoers/regress/cvtsudoers/test10.sh new file mode 100755 index 0000000..38550a9 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test10.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test command defaults filtering +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -s aliases,privileges -d command $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/cvtsudoers/test11.out.ok b/plugins/sudoers/regress/cvtsudoers/test11.out.ok new file mode 100644 index 0000000..5c4c4e8 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test11.out.ok @@ -0,0 +1,7 @@ +Defaults!PAGERS noexec + +Host_Alias CDROM = orion, perseus, hercules +Runas_Alias OPERATOR = operator, backup +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less +User_Alias PARTTIMERS = bostley, jwfox, crawl +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, /usr/bin/chfn diff --git a/plugins/sudoers/regress/cvtsudoers/test11.sh b/plugins/sudoers/regress/cvtsudoers/test11.sh new file mode 100755 index 0000000..f8d37ef --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test11.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test that Aliases are removed when filtering by defaults type +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -d command $TESTDIR/sudoers.defs diff --git a/plugins/sudoers/regress/cvtsudoers/test12.out.ok b/plugins/sudoers/regress/cvtsudoers/test12.out.ok new file mode 100644 index 0000000..7f2b15e --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test12.out.ok @@ -0,0 +1,8 @@ +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate + +Host_Alias CDROM = orion, perseus, hercules +User_Alias FULLTIMERS = millert, mikef, dowdy +Runas_Alias OPERATOR = operator, backup +User_Alias PARTTIMERS = bostley, jwfox, crawl +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, /usr/bin/chfn diff --git a/plugins/sudoers/regress/cvtsudoers/test12.sh b/plugins/sudoers/regress/cvtsudoers/test12.sh new file mode 100755 index 0000000..dd2cab0 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test12.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test that Aliases are removed when filtering by defaults type +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -d user $TESTDIR/sudoers.defs diff --git a/plugins/sudoers/regress/cvtsudoers/test13.out.ok b/plugins/sudoers/regress/cvtsudoers/test13.out.ok new file mode 100644 index 0000000..5276327 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test13.out.ok @@ -0,0 +1,7 @@ +Defaults@SERVERS log_year, logfile=/var/log/sudo.log + +Host_Alias CDROM = orion, perseus, hercules +Runas_Alias OPERATOR = operator, backup +User_Alias PARTTIMERS = bostley, jwfox, crawl +Host_Alias SERVERS = primary, mail, www, ns +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, /usr/bin/chfn diff --git a/plugins/sudoers/regress/cvtsudoers/test13.sh b/plugins/sudoers/regress/cvtsudoers/test13.sh new file mode 100755 index 0000000..8ee6000 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test13.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test that Aliases are removed when filtering by defaults type +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -d host $TESTDIR/sudoers.defs diff --git a/plugins/sudoers/regress/cvtsudoers/test14.out.ok b/plugins/sudoers/regress/cvtsudoers/test14.out.ok new file mode 100644 index 0000000..3f7710a --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test14.out.ok @@ -0,0 +1,7 @@ +Defaults>ROOT !set_logname + +Host_Alias CDROM = orion, perseus, hercules +Runas_Alias OPERATOR = operator, backup +User_Alias PARTTIMERS = bostley, jwfox, crawl +Runas_Alias ROOT = root, toor +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, /usr/bin/chfn diff --git a/plugins/sudoers/regress/cvtsudoers/test14.sh b/plugins/sudoers/regress/cvtsudoers/test14.sh new file mode 100755 index 0000000..4486faa --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test14.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test that Aliases are removed when filtering by defaults type +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -d runas $TESTDIR/sudoers.defs diff --git a/plugins/sudoers/regress/cvtsudoers/test15.out.ok b/plugins/sudoers/regress/cvtsudoers/test15.out.ok new file mode 100644 index 0000000..5177139 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test15.out.ok @@ -0,0 +1 @@ +user1 host1, host2, host3 = ALL diff --git a/plugins/sudoers/regress/cvtsudoers/test15.sh b/plugins/sudoers/regress/cvtsudoers/test15.sh new file mode 100755 index 0000000..6d65c78 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test15.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test filters and pruning +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -p -m user=user1 <root !set_logname +Defaults:FULLTIMERS !lecture +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec + +User_Alias FULLTIMERS = millert, mikef, dowdy +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less +Host_Alias SERVERS = primary, mail, www, ns + +FULLTIMERS ALL = NOPASSWD: ALL diff --git a/plugins/sudoers/regress/cvtsudoers/test19.sh b/plugins/sudoers/regress/cvtsudoers/test19.sh new file mode 100755 index 0000000..b3c1bf7 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test19.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test filters and pruning; alias contents don't get pruned +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -p -m user=FULLTIMERS,host=SERVERS $TESTDIR/sudoers diff --git a/plugins/sudoers/regress/cvtsudoers/test2.out.ok b/plugins/sudoers/regress/cvtsudoers/test2.out.ok new file mode 100644 index 0000000..d99e0e5 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test2.out.ok @@ -0,0 +1,10 @@ +Defaults syslog=auth +Defaults>root !set_logname +Defaults:millert, mikef, dowdy !lecture +Defaults:millert !authenticate +Defaults!/usr/bin/more, /usr/bin/pg, /usr/bin/less noexec + +millert, mikef, dowdy ALL = NOPASSWD: ALL + +ALL orion, perseus, hercules = NOPASSWD: /sbin/umount /CDROM, /sbin/mount -o\ + nosuid\,nodev /dev/cd0a /CDROM diff --git a/plugins/sudoers/regress/cvtsudoers/test2.sh b/plugins/sudoers/regress/cvtsudoers/test2.sh new file mode 100755 index 0000000..70e9553 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test2.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test user and host filters, expanding aliases +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -e -m user=millert,host=hercules $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/cvtsudoers/test20.conf b/plugins/sudoers/regress/cvtsudoers/test20.conf new file mode 100644 index 0000000..b60725c --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test20.conf @@ -0,0 +1,6 @@ +defaults = global +expand_aliases = yes +input_format = sudoers +match = user=user2 +output_format = sudoers +prune_matches = yes diff --git a/plugins/sudoers/regress/cvtsudoers/test20.out.ok b/plugins/sudoers/regress/cvtsudoers/test20.out.ok new file mode 100644 index 0000000..79b420b --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test20.out.ok @@ -0,0 +1 @@ +user2 ALL = /usr/bin/id diff --git a/plugins/sudoers/regress/cvtsudoers/test20.sh b/plugins/sudoers/regress/cvtsudoers/test20.sh new file mode 100755 index 0000000..e651e16 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test20.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# +# Test cvtsudoers.conf +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c $TESTDIR/test20.conf < LDIF -> sudoers +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -b "ou=SUDOers,dc=sudo,dc=ws" $TESTDIR/test23.out.ok | \ + $CVTSUDOERS -c "" -i LDIF -f sudoers | grep -v '^#' diff --git a/plugins/sudoers/regress/cvtsudoers/test24.out.ok b/plugins/sudoers/regress/cvtsudoers/test24.out.ok new file mode 100644 index 0000000..0951767 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test24.out.ok @@ -0,0 +1,89 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: logfile=/var/log/sudo + +dn: cn=root,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: root +sudoUser: root +sudoHost: ALL +sudoRunAsUser: ALL +sudoCommand: ALL +sudoOrder: 1 + +dn: cn=%wheel,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %wheel +sudoUser: %wheel +sudoHost: ALL +sudoRunAsUser: ALL +sudoCommand: ALL +sudoOrder: 2 + +dn: cn=\+admins,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \+admins +sudoUser: +admins +sudoHost: ALL +sudoOption: !authenticate +sudoCommand: ALL +sudoOrder: 3 + +dn: cn=jack,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: jack +sudoUser: jack +sudoHost: 128.138.204.0/24 +sudoHost: 128.138.242.0 +sudoHost: 128.138.243.0 +sudoCommand: ALL +sudoOrder: 4 + +dn: cn=lisa,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: lisa +sudoUser: lisa +sudoHost: 128.138.0.0/255.255.0.0 +sudoCommand: ALL +sudoOrder: 5 + +dn: cn=operator,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: operator +sudoUser: operator +sudoHost: ALL +sudoCommand: /usr/sbin/dump +sudoCommand: /usr/sbin/rdump +sudoCommand: /usr/sbin/restore +sudoCommand: /usr/sbin/rrestore +sudoCommand: /usr/bin/mt +sudoCommand: sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== /home/operator/bin/start_backups +sudoCommand: /usr/bin/kill +sudoCommand: /usr/bin/top +sudoCommand: /usr/sbin/shutdown +sudoCommand: /usr/sbin/halt +sudoCommand: /usr/sbin/reboot +sudoCommand: /usr/sbin/lpc +sudoCommand: /usr/bin/lprm +sudoCommand: sudoedit /etc/printcap +sudoCommand: /usr/oper/bin/ +sudoOrder: 6 + +dn: cn=joe,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: joe +sudoUser: joe +sudoHost: ALL +sudoCommand: /usr/bin/su operator +sudoOrder: 7 + diff --git a/plugins/sudoers/regress/cvtsudoers/test24.sh b/plugins/sudoers/regress/cvtsudoers/test24.sh new file mode 100755 index 0000000..72d9983 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test24.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# +# Test round-tripping of LDIF -> sudoers -> LDIF +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -i LDIF -f sudoers $TESTDIR/test24.out.ok | \ + $CVTSUDOERS -c "" -b "ou=SUDOers,dc=sudo,dc=ws" diff --git a/plugins/sudoers/regress/cvtsudoers/test25.out.ok b/plugins/sudoers/regress/cvtsudoers/test25.out.ok new file mode 100644 index 0000000..d404815 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test25.out.ok @@ -0,0 +1,31 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: log_output + +dn: cn=root,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: root +sudoUser: root +sudoHost: ALL +sudoRunAsUser: ALL +sudoRunAsGroup: ALL +sudoOption: !authenticate +sudoCommand: ALL +sudoOrder: 10 + +dn: cn=%wheel,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %wheel +sudoUser: %wheel +sudoHost: +sudo-hosts +sudoRunAsUser: ALL +sudoRunAsGroup: ALL +sudoOption: !authenticate +sudoCommand: ALL +sudoOrder: 20 + diff --git a/plugins/sudoers/regress/cvtsudoers/test25.sh b/plugins/sudoers/regress/cvtsudoers/test25.sh new file mode 100755 index 0000000..bbb9b51 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test25.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# +# Test LDIF base64 attribute parsing +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -i ldif -b "ou=SUDOers,dc=sudo,dc=ws" -I 10 -O 10 <root !set_logname +Defaults!PAGERS noexec + +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +%wheel ALL = (ALL) ALL diff --git a/plugins/sudoers/regress/cvtsudoers/test3.sh b/plugins/sudoers/regress/cvtsudoers/test3.sh new file mode 100755 index 0000000..8e42cbc --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test3.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test group and host filters +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -m group=wheel,host=blackhole $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/cvtsudoers/test30.out.ok b/plugins/sudoers/regress/cvtsudoers/test30.out.ok new file mode 100644 index 0000000..009a54e --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test30.out.ok @@ -0,0 +1,26 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user1" }, + { "username": "user2" }, + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Commands": [ + { "command": "/path/to/cmda" }, + { + "command": "/path/to/cmdb", + "negated": true + }, + { "command": "/path/to/cmdc" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/cvtsudoers/test30.sh b/plugins/sudoers/regress/cvtsudoers/test30.sh new file mode 100755 index 0000000..c5f7615 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test30.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# +# Test alias expansion when converting to JSON. +# See https://bugzilla.sudo.ws/show_bug.cgi?id=853 +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -e -f json <root !set_logname +Defaults!/usr/bin/more, /usr/bin/pg, /usr/bin/less noexec + +%wheel ALL = (ALL) ALL diff --git a/plugins/sudoers/regress/cvtsudoers/test4.sh b/plugins/sudoers/regress/cvtsudoers/test4.sh new file mode 100755 index 0000000..860eff4 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test4.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test group and host filters, expanding aliases +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -e -m group=wheel,host=blackhole $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/cvtsudoers/test5.out.ok b/plugins/sudoers/regress/cvtsudoers/test5.out.ok new file mode 100644 index 0000000..d209fdf --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test5.out.ok @@ -0,0 +1,6 @@ +Defaults syslog=auth +Defaults>root !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec diff --git a/plugins/sudoers/regress/cvtsudoers/test5.sh b/plugins/sudoers/regress/cvtsudoers/test5.sh new file mode 100755 index 0000000..dd7782d --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test5.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test defaults type filtering +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -s aliases,privileges -d all $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/cvtsudoers/test6.out.ok b/plugins/sudoers/regress/cvtsudoers/test6.out.ok new file mode 100644 index 0000000..5e65e61 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test6.out.ok @@ -0,0 +1 @@ +Defaults syslog=auth diff --git a/plugins/sudoers/regress/cvtsudoers/test6.sh b/plugins/sudoers/regress/cvtsudoers/test6.sh new file mode 100755 index 0000000..a6c7ec4 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test6.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test global defaults filtering +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -s aliases,privileges -d global $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/cvtsudoers/test7.out.ok b/plugins/sudoers/regress/cvtsudoers/test7.out.ok new file mode 100644 index 0000000..381de43 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test7.out.ok @@ -0,0 +1,2 @@ +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate diff --git a/plugins/sudoers/regress/cvtsudoers/test7.sh b/plugins/sudoers/regress/cvtsudoers/test7.sh new file mode 100755 index 0000000..2f1a301 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test7.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test user defaults filtering +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -s aliases,privileges -d user $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/cvtsudoers/test8.out.ok b/plugins/sudoers/regress/cvtsudoers/test8.out.ok new file mode 100644 index 0000000..7079ee0 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test8.out.ok @@ -0,0 +1 @@ +Defaults>root !set_logname diff --git a/plugins/sudoers/regress/cvtsudoers/test8.sh b/plugins/sudoers/regress/cvtsudoers/test8.sh new file mode 100755 index 0000000..d00f90e --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test8.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test runas defaults filtering +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -s aliases,privileges -d runas $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/cvtsudoers/test9.out.ok b/plugins/sudoers/regress/cvtsudoers/test9.out.ok new file mode 100644 index 0000000..d2a39c4 --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test9.out.ok @@ -0,0 +1 @@ +Defaults@SERVERS log_year, logfile=/var/log/sudo.log diff --git a/plugins/sudoers/regress/cvtsudoers/test9.sh b/plugins/sudoers/regress/cvtsudoers/test9.sh new file mode 100755 index 0000000..b668e1f --- /dev/null +++ b/plugins/sudoers/regress/cvtsudoers/test9.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Test host defaults filtering +# + +: ${CVTSUDOERS=cvtsudoers} + +$CVTSUDOERS -c "" -f sudoers -s aliases,privileges -d host $TESTDIR/sudoers + +exit 0 diff --git a/plugins/sudoers/regress/env_match/check_env_pattern.c b/plugins/sudoers/regress/env_match/check_env_pattern.c new file mode 100644 index 0000000..ce2c267 --- /dev/null +++ b/plugins/sudoers/regress/env_match/check_env_pattern.c @@ -0,0 +1,76 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include + +#include "sudoers.h" + +sudo_dso_public int main(int argc, char *argv[]); + +int +main(int argc, char *argv[]) +{ + FILE *fp = stdin; + char pattern[1024], string[1024]; + int errors = 0, tests = 0, got, want; + + initprogname(argc > 0 ? argv[0] : "check_env_pattern"); + + if (argc > 1) { + if ((fp = fopen(argv[1], "r")) == NULL) { + perror(argv[1]); + exit(EXIT_FAILURE); + } + } + + /* + * Read in test file, which is formatted thusly: + * + * pattern string 1/0 + * + */ + for (;;) { + bool full_match = false; + + got = fscanf(fp, "%s %s %d\n", pattern, string, &want); + if (got == EOF) + break; + if (got == 3) { + got = matches_env_pattern(pattern, string, &full_match); + if (full_match) + got++; + if (got != want) { + fprintf(stderr, + "%s: %s %s: want %d, got %d\n", + getprogname(), pattern, string, want, got); + errors++; + } + tests++; + } + } + if (tests != 0) { + printf("%s: %d test%s run, %d errors, %d%% success rate\n", + getprogname(), tests, tests == 1 ? "" : "s", errors, + (tests - errors) * 100 / tests); + } + exit(errors); +} diff --git a/plugins/sudoers/regress/env_match/data b/plugins/sudoers/regress/env_match/data new file mode 100644 index 0000000..ea28b1b --- /dev/null +++ b/plugins/sudoers/regress/env_match/data @@ -0,0 +1,22 @@ +foo=(){false;} foo=(){false;} 2 +foo foo=(){false;} 1 +foo= foo=(){false;} 0 +foo=* foo=(){false;} 1 +foo=(* foo=(){false;} 2 +foo=()* foo=(){false;} 2 +foo=*()* foo=(){false;} 2 +foo() foo()=a 1 +foo*() foo()=b 1 +foo*()* foo()= 1 +foo()* foo()= 1 +foo* foo()= 1 +fo*o*() foo()= 1 +fo*o*() fooo()== 1 +fo*o*() foooo()= 1 +fo*o*() foooo 0 +MYPATH=*:/mydir:* MYPATH=/dir1/subdir1:/mydir:/dir2:/dir3/subdir2 2 +MYPATH=*:/mydir:** MYPATH=/dir1/subdir1:/mydir:/dir2:/dir3/subdir2 2 +MYPATH=*:/mdir:* MYPATH=/dir1/subdir1:/mydir:/dir2:/dir3/subdir2 0 +a*a*a*a*a*a* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=b 1 +a*a*a*a*a*a*=b* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=b 2 +a*a*a*a*a*a*=* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=c 1 diff --git a/plugins/sudoers/regress/exptilde/check_exptilde.c b/plugins/sudoers/regress/exptilde/check_exptilde.c new file mode 100644 index 0000000..02d4bf0 --- /dev/null +++ b/plugins/sudoers/regress/exptilde/check_exptilde.c @@ -0,0 +1,101 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudoers.h" + +#include + +struct sudo_user sudo_user; + +struct test_data { + char *input; + char *output; + char *user; + bool result; +} test_data[] = { + { "foo/bar", NULL, NULL, false }, + { "~root", "/", NULL, true }, + { "~", "/home/millert", "millert", true }, + { "~millert", "/home/millert", "millert", true }, + { NULL } +}; + +sudo_dso_public int main(int argc, char *argv[]); + +int +main(int argc, char *argv[]) +{ + int ntests = 0, errors = 0; + struct test_data *td; + struct passwd *pw; + char *path = NULL; + bool result; + + initprogname(argc > 0 ? argv[0] : "check_exptilde"); + + /* Prime the passwd cache */ + pw = sudo_mkpwent("root", 0, 0, "/", "/bin/sh"); + if (pw == NULL) + sudo_fatalx("unable to create passwd entry for root"); + sudo_pw_delref(pw); + + pw = sudo_mkpwent("millert", 8036, 20, "/home/millert", "/bin/tcsh"); + if (pw == NULL) + sudo_fatalx("unable to create passwd entry for millert"); + sudo_pw_delref(pw); + + for (td = test_data; td->input != NULL; td++) { + ntests++; + free(path); + if ((path = strdup(td->input)) == NULL) + sudo_fatal(NULL); + result = expand_tilde(&path, td->user); + if (result != td->result) { + errors++; + if (result) { + sudo_warnx("unexpected success: input %s, output %s", + td->input, path); + } else { + sudo_warnx("unexpected failure: input %s", td->input); + } + continue; + } + if (td->result && strcmp(path, td->output) != 0) { + errors++; + sudo_warnx("incorrect output for input %s: expected %s, got %s", + td->input, td->output, path); + continue; + } + } + + printf("%s: %d tests run, %d errors, %d%% success rate\n", getprogname(), + ntests, errors, (ntests - errors) * 100 / ntests); + + exit(errors); +} diff --git a/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c b/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c new file mode 100644 index 0000000..1d21a4d --- /dev/null +++ b/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c @@ -0,0 +1,430 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudoers.h" +#include "sudo_eventlog.h" +#include "sudo_iolog.h" +#include "sudo_plugin.h" + +#include /* for iolog_path.c */ + +extern struct io_plugin sudoers_io; + +struct sudo_user sudo_user; +struct passwd *list_pw; +sudo_printf_t sudo_printf; +sudo_conv_t sudo_conv; + +sudo_dso_public int main(int argc, char *argv[], char *envp[]); + +static void +usage(void) +{ + fprintf(stderr, "usage: %s pathname\n", getprogname()); + exit(EXIT_FAILURE); +} + +static int +sudo_printf_int(int msg_type, const char *fmt, ...) +{ + va_list ap; + int len; + + switch (msg_type) { + case SUDO_CONV_INFO_MSG: + va_start(ap, fmt); + len = vfprintf(stdout, fmt, ap); + va_end(ap); + break; + case SUDO_CONV_ERROR_MSG: + va_start(ap, fmt); + len = vfprintf(stderr, fmt, ap); + va_end(ap); + break; + default: + len = -1; + errno = EINVAL; + break; + } + + return len; +} + +static bool +validate_iolog_info(const char *log_dir, bool legacy) +{ + struct eventlog *evlog; + time_t now; + + time(&now); + + /* Parse log file. */ + if ((evlog = iolog_parse_loginfo(-1, log_dir)) == NULL) + return false; + + if (evlog->cwd == NULL || strcmp(evlog->cwd, "/") != 0) { + sudo_warnx("bad cwd: want \"/\", got \"%s\"", + evlog->cwd ? evlog->cwd : "NULL"); + return false; + } + + /* No host in the legacy log file. */ + if (!legacy) { + if (evlog->submithost == NULL || strcmp(evlog->submithost, "localhost") != 0) { + sudo_warnx("bad host: want \"localhost\", got \"%s\"", + evlog->submithost ? evlog->submithost : "NULL"); + return false; + } + } + + if (evlog->submituser == NULL || strcmp(evlog->submituser, "nobody") != 0) { + sudo_warnx("bad user: want \"nobody\" got \"%s\"", + evlog->submituser ? evlog->submituser : "NULL"); + return false; + } + + if (evlog->runuser == NULL || strcmp(evlog->runuser, "root") != 0) { + sudo_warnx("bad runuser: want \"root\" got \"%s\"", + evlog->runuser ? evlog->runuser : "NULL"); + return false; + } + + /* No runas group specified, should be NULL. */ + if (evlog->rungroup != NULL) { + sudo_warnx("bad rungroup: want \"\" got \"%s\"", evlog->rungroup); + return false; + } + + if (evlog->ttyname == NULL || strcmp(evlog->ttyname, "/dev/console") != 0) { + sudo_warnx("bad tty: want \"/dev/console\" got \"%s\"", + evlog->ttyname ? evlog->ttyname : "NULL"); + return false; + } + + if (evlog->command == NULL || strcmp(evlog->command, "/usr/bin/id") != 0) { + sudo_warnx("bad command: want \"/usr/bin/id\" got \"%s\"", + evlog->command ? evlog->command : "NULL"); + return false; + } + + if (evlog->lines != 24) { + sudo_warnx("bad lines: want 24 got %d", evlog->lines); + return false; + } + + if (evlog->columns != 80) { + sudo_warnx("bad columns: want 80 got %d", evlog->columns); + return false; + } + + if (evlog->submit_time.tv_sec < now - 10 || evlog->submit_time.tv_sec > now + 10) { + sudo_warnx("bad submit_time: want %lld got %lld", (long long)now, + (long long)evlog->submit_time.tv_sec); + return false; + } + + eventlog_free(evlog); + + return true; +} + +bool +validate_timing(FILE *fp, int recno, int type, unsigned int p1, unsigned int p2) +{ + struct timing_closure timing; + char buf[LINE_MAX]; + + if (!fgets(buf, sizeof(buf), fp)) { + sudo_warn("unable to read timing file"); + return false; + } + buf[strcspn(buf, "\n")] = '\0'; + if (!iolog_parse_timing(buf, &timing)) { + sudo_warnx("invalid timing file line: %s", buf); + return false; + } + if (timing.event != type) { + sudo_warnx("record %d: want type %d, got type %d", recno, type, + timing.event); + return false; + } + if (type == IO_EVENT_WINSIZE) { + if (timing.u.winsize.lines != (int)p1) { + sudo_warnx("record %d: want %u lines, got %u", recno, p1, + timing.u.winsize.lines); + return false; + } + if (timing.u.winsize.cols != (int)p2) { + sudo_warnx("record %d: want %u cols, got %u", recno, p2, + timing.u.winsize.cols); + return false; + } + } else { + if (timing.u.nbytes != p1) { + sudo_warnx("record %d: want len %u, got type %zu", recno, p1, + timing.u.nbytes); + return false; + } + } + if (timing.delay.tv_sec != 0) { + sudo_warnx("record %d: got excessive delay %lld.%09ld", recno, + (long long)timing.delay.tv_sec, timing.delay.tv_nsec); + return false; + } + + return true; +} + + +/* + * Test sudoers I/O log plugin endpoints. + */ +void +test_endpoints(int *ntests, int *nerrors, const char *iolog_dir, char *envp[]) +{ + int rc, cmnd_argc = 1; + const char *errstr = NULL; + char buf[1024], iolog_path[PATH_MAX]; + char runas_gid[64], runas_uid[64]; + FILE *fp; + char *cmnd_argv[] = { + "/usr/bin/id", + NULL + }; + char *user_info[] = { + "cols=80", + "lines=24", + "cwd=/", + "host=localhost", + "tty=/dev/console", + "user=nobody", + NULL + }; + char *command_info[] = { + "command=/usr/bin/id", + iolog_path, + "iolog_stdin=true", + "iolog_stdout=true", + "iolog_stderr=true", + "iolog_ttyin=true", + "iolog_ttyout=true", + "iolog_compress=false", + "iolog_mode=0644", + runas_gid, + runas_uid, + NULL + }; + char *settings[] = { + NULL + }; + const char output[] = "uid=0(root) gid=0(wheel)\r\n"; + + /* Set runas uid/gid to root. */ + snprintf(runas_uid, sizeof(runas_uid), "runas_uid=%u", + (unsigned int)runas_pw->pw_uid); + snprintf(runas_gid, sizeof(runas_gid), "runas_gid=%u", + (unsigned int)runas_pw->pw_gid); + + /* Set path to the iolog directory the user passed in. */ + snprintf(iolog_path, sizeof(iolog_path), "iolog_path=%s", iolog_dir); + + /* Test open endpoint. */ + rc = sudoers_io.open(SUDO_API_VERSION, NULL, sudo_printf_int, settings, + user_info, command_info, cmnd_argc, cmnd_argv, envp, NULL, &errstr); + (*ntests)++; + if (rc != 1) { + sudo_warnx("I/O log open endpoint failed"); + (*nerrors)++; + return; + } + + /* Test log_ttyout endpoint. */ + rc = sudoers_io.log_ttyout(output, strlen(output), &errstr); + (*ntests)++; + if (rc != 1) { + sudo_warnx("I/O log_ttyout endpoint failed"); + (*nerrors)++; + return; + } + + /* Test change_winsize endpoint (twice). */ + rc = sudoers_io.change_winsize(32, 128, &errstr); + (*ntests)++; + if (rc != 1) { + sudo_warnx("I/O change_winsize endpoint failed"); + (*nerrors)++; + return; + } + rc = sudoers_io.change_winsize(24, 80, &errstr); + (*ntests)++; + if (rc != 1) { + sudo_warnx("I/O change_winsize endpoint failed"); + (*nerrors)++; + return; + } + + /* Close the plugin. */ + sudoers_io.close(0, 0); + + /* Validate I/O log info file (json). */ + (*ntests)++; + if (!validate_iolog_info(iolog_dir, false)) + (*nerrors)++; + + /* Validate I/O log info file (legacy). */ + snprintf(iolog_path, sizeof(iolog_path), "%s/log.json", iolog_dir); + unlink(iolog_path); + (*ntests)++; + if (!validate_iolog_info(iolog_dir, true)) + (*nerrors)++; + + /* Validate the timing file. */ + snprintf(iolog_path, sizeof(iolog_path), "%s/timing", iolog_dir); + (*ntests)++; + if ((fp = fopen(iolog_path, "r")) == NULL) { + sudo_warn("unable to open %s", iolog_path); + (*nerrors)++; + return; + } + + /* Line 1: output of id command. */ + if (!validate_timing(fp, 1, IO_EVENT_TTYOUT, strlen(output), 0)) { + (*nerrors)++; + return; + } + + /* Line 2: window size change. */ + if (!validate_timing(fp, 2, IO_EVENT_WINSIZE, 32, 128)) { + (*nerrors)++; + return; + } + + /* Line 3: window size change. */ + if (!validate_timing(fp, 3, IO_EVENT_WINSIZE, 24, 80)) { + (*nerrors)++; + return; + } + + /* Validate ttyout log file. */ + snprintf(iolog_path, sizeof(iolog_path), "%s/ttyout", iolog_dir); + (*ntests)++; + fclose(fp); + if ((fp = fopen(iolog_path, "r")) == NULL) { + sudo_warn("unable to open %s", iolog_path); + (*nerrors)++; + return; + } + if (!fgets(buf, sizeof(buf), fp)) { + sudo_warn("unable to read %s", iolog_path); + (*nerrors)++; + return; + } + if (strcmp(buf, output) != 0) { + sudo_warnx("ttylog mismatch: want \"%s\", got \"%s\"", output, buf); + (*nerrors)++; + return; + } +} + +int +main(int argc, char *argv[], char *envp[]) +{ + struct passwd *tpw; + int tests = 0, errors = 0; + const char *iolog_dir; + + initprogname(argc > 0 ? argv[0] : "check_iolog_plugin"); + + if (argc != 2) + usage(); + iolog_dir = argv[1]; + + /* Set runas user. */ + if ((tpw = getpwuid(0)) == NULL) { + if ((tpw = getpwnam("root")) == NULL) + sudo_fatalx("unable to look up uid 0 or root"); + } + sudo_user._runas_pw = pw_dup(tpw); + + /* Set invoking user. */ + if ((tpw = getpwuid(geteuid())) == NULL) + sudo_fatalx("unable to look up invoking user's uid"); + sudo_user.pw = pw_dup(tpw); + + /* Set iolog uid/gid to invoking user. */ + iolog_set_owner(sudo_user.pw->pw_uid, sudo_user.pw->pw_gid); + + test_endpoints(&tests, &errors, iolog_dir, envp); + + if (tests != 0) { + printf("check_iolog_plugin: %d test%s run, %d errors, %d%% success rate\n", + tests, tests == 1 ? "" : "s", errors, + (tests - errors) * 100 / tests); + } + + exit(errors); +} + +/* Stub functions */ + +bool +set_perms(int perm) +{ + return true; +} + +bool +restore_perms(void) +{ + return true; +} + +bool +log_warning(int flags, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + sudo_vwarn_nodebug(fmt, ap); + va_end(ap); + + return true; +} + +bool +log_warningx(int flags, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + sudo_vwarnx_nodebug(fmt, ap); + va_end(ap); + + return true; +} diff --git a/plugins/sudoers/regress/parser/check_addr.c b/plugins/sudoers/regress/parser/check_addr.c new file mode 100644 index 0000000..cf50226 --- /dev/null +++ b/plugins/sudoers/regress/parser/check_addr.c @@ -0,0 +1,139 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudoers.h" +#include "interfaces.h" + +sudo_dso_public int main(int argc, char *argv[]); + +static int +check_addr(char *input) +{ + int expected, matched; + const char *errstr; + size_t len; + char *cp; + + while (isspace((unsigned char)*input)) + input++; + + /* input: "addr[/mask] 1/0" */ + len = strcspn(input, " \t"); + cp = input + len; + while (isspace((unsigned char)*cp)) + cp++; + expected = sudo_strtonum(cp, 0, 1, &errstr); + if (errstr != NULL) + sudo_fatalx("expecting 0 or 1, got %s", cp); + input[len] = '\0'; + + matched = addr_matches(input); + if (matched != expected) { + sudo_warnx("%s %smatched: FAIL", input, matched ? "" : "not "); + return 1; + } + return 0; +} + +static void +usage(void) +{ + fprintf(stderr, "usage: %s datafile\n", getprogname()); + exit(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + int ntests = 0, errors = 0; + char *cp, line[2048]; + size_t len; + FILE *fp; + + initprogname(argc > 0 ? argv[0] : "check_addr"); + + if (argc != 2) + usage(); + + fp = fopen(argv[1], "r"); + if (fp == NULL) + sudo_fatalx("unable to open %s", argv[1]); + + /* + * Input is in the following format. There are two types of + * lines: interfaces, which sets the address and mask of the + * locally connected ethernet interfaces for the lines that + * follow and, address lines that include and address (with + * optional netmask) to match, followed by expected match status + * (1 or 0). E.g. + * + * interfaces: addr1/mask addr2/mask ... + * address: addr[/mask] 1/0 + * address: addr[/mask] 1/0 + * interfaces: addr3/mask addr4/mask ... + * address: addr[/mask] 1/0 + */ + + while (fgets(line, sizeof(line), fp) != NULL) { + len = strcspn(line, "\n"); + line[len] = '\0'; + + /* Ignore comments */ + if ((cp = strchr(line, '#')) != NULL) + *cp = '\0'; + + /* Skip blank lines. */ + if (line[0] == '\0') + continue; + + if (strncmp(line, "interfaces:", sizeof("interfaces:") - 1) == 0) { + if (!set_interfaces(line + sizeof("interfaces:") - 1)) { + sudo_warn("unable to parse interfaces list"); + errors++; + } + } else if (strncmp(line, "address:", sizeof("address:") - 1) == 0) { + errors += check_addr(line + sizeof("address:") - 1); + ntests++; + } else { + sudo_warnx("unexpected data line: %s\n", line); + continue; + } + } + + if (ntests != 0) { + printf("check_addr: %d tests run, %d errors, %d%% success rate\n", + ntests, errors, (ntests - errors) * 100 / ntests); + } + + exit(errors); +} diff --git a/plugins/sudoers/regress/parser/check_addr.in b/plugins/sudoers/regress/parser/check_addr.in new file mode 100644 index 0000000..a3c8612 --- /dev/null +++ b/plugins/sudoers/regress/parser/check_addr.in @@ -0,0 +1,13 @@ +# +interfaces: 10.5.54.73/255.255.240.0 +address: 10.5.48.0 1 +address: 10.5.54.0/20 1 +# +interfaces: 128.138.243.151/255.255.255.0 128.138.241.53/255.255.255.0 +address: 128.138.243.0 1 +address: 128.138.243.0/24 1 +address: 128.138.241.0 1 +address: 128.138.241.0/24 1 +address: 128.138.242.0/24 0 +address: 128.138.0.0 0 +address: 128.138.0.0/16 1 diff --git a/plugins/sudoers/regress/parser/check_base64.c b/plugins/sudoers/regress/parser/check_base64.c new file mode 100644 index 0000000..195ada1 --- /dev/null +++ b/plugins/sudoers/regress/parser/check_base64.c @@ -0,0 +1,114 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_util.h" + +/* From parse.h */ +extern size_t base64_decode(const char *str, unsigned char *dst, size_t dsize); +extern size_t base64_encode(const unsigned char *in, size_t in_len, char *out, size_t out_len); + +sudo_dso_public int main(int argc, char *argv[]); + +static unsigned char bstring1[] = { 0xea, 0xb8, 0xa2, 0x71, 0xef, 0x67, 0xc1, 0xcd, 0x0d, 0xd9, 0xa6, 0xaa, 0xa8, 0x24, 0x77, 0x2a, 0xfc, 0x6f, 0x76, 0x37, 0x1b, 0xed, 0x9e, 0x1a, 0x90, 0x5f, 0xcf, 0xbc, 0x00 }; + +struct base64_test { + const char *ascii; + const char *encoded; +} test_strings[] = { + { + (char *)bstring1, + "6riice9nwc0N2aaqqCR3Kvxvdjcb7Z4akF/PvA==" + }, + { + "any carnal pleasure.", + "YW55IGNhcm5hbCBwbGVhc3VyZS4=" + }, + { + "any carnal pleasure", + "YW55IGNhcm5hbCBwbGVhc3VyZQ==" + }, + { + "any carnal pleasur", + "YW55IGNhcm5hbCBwbGVhc3Vy" + }, + { + "any carnal pleasu", + "YW55IGNhcm5hbCBwbGVhc3U=" + }, + { + "any carnal pleas", + "YW55IGNhcm5hbCBwbGVhcw==" + } +}; + +int +main(int argc, char *argv[]) +{ + int ntests = nitems(test_strings); + int i, errors = 0; + unsigned char buf[64]; + size_t len; + + initprogname(argc > 0 ? argv[0] : "check_base64"); + + for (i = 0; i < ntests; i++) { + /* Test decode. */ + len = base64_decode(test_strings[i].encoded, buf, sizeof(buf)); + if (len == (size_t)-1) { + fprintf(stderr, "check_base64: failed to decode %s\n", + test_strings[i].encoded); + errors++; + } else { + buf[len] = '\0'; + if (strcmp(test_strings[i].ascii, (char *)buf) != 0) { + fprintf(stderr, "check_base64: expected %s, got %s\n", + test_strings[i].ascii, buf); + errors++; + } + } + + /* Test encode. */ + len = base64_encode((unsigned char *)test_strings[i].ascii, + strlen(test_strings[i].ascii), (char *)buf, sizeof(buf)); + if (len == (size_t)-1) { + fprintf(stderr, "check_base64: failed to encode %s\n", + test_strings[i].ascii); + errors++; + } else { + if (strcmp(test_strings[i].encoded, (char *)buf) != 0) { + fprintf(stderr, "check_base64: expected %s, got %s\n", + test_strings[i].encoded, buf); + errors++; + } + } + } + ntests *= 2; /* we test in both directions */ + + printf("check_base64: %d tests run, %d errors, %d%% success rate\n", + ntests, errors, (ntests - errors) * 100 / ntests); + exit(errors); +} diff --git a/plugins/sudoers/regress/parser/check_digest.c b/plugins/sudoers/regress/parser/check_digest.c new file mode 100644 index 0000000..c784b2b --- /dev/null +++ b/plugins/sudoers/regress/parser/check_digest.c @@ -0,0 +1,125 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_queue.h" +#include "sudo_digest.h" +#include "sudo_util.h" +#include "parse.h" + +sudo_dso_public int main(int argc, char *argv[]); + +#define NUM_TESTS 8 +static const char *test_strings[NUM_TESTS] = { + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "12345678901234567890123456789012345678901234567890123456789" + "012345678901234567890", +}; + +static unsigned char * +check_digest(int digest_type, const char *buf, size_t buflen, size_t *digest_len) +{ + char tfile[] = "digest.XXXXXX"; + unsigned char *digest = NULL; + int tfd; + + /* Write test data to temporary file. */ + tfd = mkstemp(tfile); + if (tfd == -1) { + sudo_warn_nodebug("mkstemp"); + goto done; + } + if ((size_t)write(tfd, buf, buflen) != buflen) { + sudo_warn_nodebug("write"); + goto done; + } + lseek(tfd, 0, SEEK_SET); + + /* Get file digest. */ + digest = sudo_filedigest(tfd, tfile, digest_type, digest_len); + if (digest == NULL) { + /* Warning (if any) printed by sudo_filedigest() */ + goto done; + } +done: + if (tfd != -1) { + close(tfd); + unlink(tfile); + } + return digest; +} + +int +main(int argc, char *argv[]) +{ + static const char hex[] = "0123456789abcdef"; + char buf[1000 * 1000]; + unsigned char *digest; + unsigned int i, j; + size_t digest_len; + int digest_type; + + initprogname(argc > 0 ? argv[0] : "check_digest"); + + for (digest_type = 0; digest_type < SUDO_DIGEST_INVALID; digest_type++) { + for (i = 0; i < NUM_TESTS; i++) { + digest = check_digest(digest_type, test_strings[i], + strlen(test_strings[i]), &digest_len); + if (digest != NULL) { + printf("%s (\"%s\") = ", digest_type_to_name(digest_type), + test_strings[i]); + for (j = 0; j < digest_len; j++) { + putchar(hex[digest[j] >> 4]); + putchar(hex[digest[j] & 0x0f]); + } + putchar('\n'); + free(digest); + } + } + + /* Simulate a string of a million 'a' characters. */ + memset(buf, 'a', sizeof(buf)); + digest = check_digest(digest_type, buf, sizeof(buf), &digest_len); + if (digest != NULL) { + printf("%s (one million 'a' characters) = ", + digest_type_to_name(digest_type)); + for (j = 0; j < digest_len; j++) { + putchar(hex[digest[j] >> 4]); + putchar(hex[digest[j] & 0x0f]); + } + putchar('\n'); + free(digest); + } + } + + return 0; +} diff --git a/plugins/sudoers/regress/parser/check_digest.out.ok b/plugins/sudoers/regress/parser/check_digest.out.ok new file mode 100644 index 0000000..a353664 --- /dev/null +++ b/plugins/sudoers/regress/parser/check_digest.out.ok @@ -0,0 +1,36 @@ +sha224 ("") = d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f +sha224 ("a") = abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5 +sha224 ("abc") = 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 +sha224 ("message digest") = 2cb21c83ae2f004de7e81c3c7019cbcb65b71ab656b22d6d0c39b8eb +sha224 ("abcdefghijklmnopqrstuvwxyz") = 45a5f72c39c5cff2522eb3429799e49e5f44b356ef926bcf390dccc2 +sha224 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525 +sha224 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = bff72b4fcb7d75e5632900ac5f90d219e05e97a7bde72e740db393d9 +sha224 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = b50aecbe4e9bb0b57bc5f3ae760a8e01db24f203fb3cdcd13148046e +sha224 (one million 'a' characters) = 20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67 +sha256 ("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +sha256 ("a") = ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb +sha256 ("abc") = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad +sha256 ("message digest") = f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650 +sha256 ("abcdefghijklmnopqrstuvwxyz") = 71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73 +sha256 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1 +sha256 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0 +sha256 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = f371bc4a311f2b009eef952dd83ca80e2b60026c8e935592d0f9c308453c813e +sha256 (one million 'a' characters) = cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0 +sha384 ("") = 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b +sha384 ("a") = 54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31 +sha384 ("abc") = cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 +sha384 ("message digest") = 473ed35167ec1f5d8e550368a3db39be54639f828868e9454c239fc8b52e3c61dbd0d8b4de1390c256dcbb5d5fd99cd5 +sha384 ("abcdefghijklmnopqrstuvwxyz") = feb67349df3db6f5924815d6c3dc133f091809213731fe5c7b5f4999e463479ff2877f5f2936fa63bb43784b12f3ebb4 +sha384 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b +sha384 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 1761336e3f7cbfe51deb137f026f89e01a448e3b1fafa64039c1464ee8732f11a5341a6f41e0c202294736ed64db1a84 +sha384 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = b12932b0627d1c060942f5447764155655bd4da0c9afa6dd9b9ef53129af1b8fb0195996d2de9ca0df9d821ffee67026 +sha384 (one million 'a' characters) = 9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985 +sha512 ("") = cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e +sha512 ("a") = 1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75 +sha512 ("abc") = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f +sha512 ("message digest") = 107dbf389d9e9f71a3a95f6c055b9251bc5268c2be16d6c13492ea45b0199f3309e16455ab1e96118e8a905d5597b72038ddb372a89826046de66687bb420e7c +sha512 ("abcdefghijklmnopqrstuvwxyz") = 4dbff86cc2ca1bae1e16468a05cb9881c97f1753bce3619034898faa1aabe429955a1bf8ec483d7421fe3c1646613a59ed5441fb0f321389f77f48a879c7b1f1 +sha512 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445 +sha512 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 1e07be23c26a86ea37ea810c8ec7809352515a970e9253c26f536cfc7a9996c45c8370583e0a78fa4a90041d71a4ceab7423f19c71b9d5a3e01249f0bebd5894 +sha512 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 72ec1ef1124a45b047e8b7c75a932195135bb61de24ec0d1914042246e0aec3a2354e093d76f3048b456764346900cb130d2a4fd5dd16abb5e30bcb850dee843 +sha512 (one million 'a' characters) = e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b diff --git a/plugins/sudoers/regress/parser/check_fill.c b/plugins/sudoers/regress/parser/check_fill.c new file mode 100644 index 0000000..2ced0f1 --- /dev/null +++ b/plugins/sudoers/regress/parser/check_fill.c @@ -0,0 +1,189 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_queue.h" +#include "parse.h" +#include "toke.h" +#include "sudo_plugin.h" +#include "sudo_util.h" +#include + +sudo_dso_public int main(int argc, char *argv[]); + +/* + * TODO: test realloc + */ + +YYSTYPE sudoerslval; +bool sudoers_strict; + +struct fill_test { + const char *input; + const char *output; + int len; + int addspace; +}; + +/* + * In "normal" fill, anything can be escaped and hex chars are expanded. + */ +static struct fill_test txt_data[] = { + { "Embedded\\x20Space", "Embedded Space", 0 }, + { "\\x20Leading", " Leading", 0 }, + { "Trailing\\x20", "Trailing ", 0 }, + { "Multiple\\x20\\x20Spaces", "Multiple Spaces", 0 }, + { "Hexparse\\x200Check", "Hexparse 0Check", 0 }, + { "Escaped\\\\Escape", "Escaped\\Escape", 0 }, + { "LongGroupName", "LongGrou", 8 } +}; + +/* + * The only escaped chars in a command should be [,:= \t#] + * The rest are done by glob() or fnmatch(). + */ +static struct fill_test cmd_data[] = { + { "foo\\,bar", "foo,bar", 0 }, + { "this\\:that", "this:that", 0 }, + { "foo\\=bar", "foo=bar", 0 }, + { "tab\\\tstop", "tab\tstop", 0 }, + { "not a \\#comment", "not a #comment", 0 } +}; + +/* + * No escaped characters in command line args. + * Arguments get appended. + */ +static struct fill_test args_data[] = { + { "/", "/", 0, 0 }, + { "-type", "/ -type", 0, 1 }, + { "f", "/ -type f", 0, 1 }, + { "-exec", "/ -type f -exec", 0, 1 }, + { "ls", "/ -type f -exec ls", 0, 1 }, + { "{}", "/ -type f -exec ls {}", 0, 1 } +}; + +static int +check_fill(const char *input, int len, int addspace, const char *expect, char **resultp) +{ + if (sudoerslval.string != NULL) { + free(sudoerslval.string); + sudoerslval.string = NULL; + } + if (!fill(input, len)) + return -1; + *resultp = sudoerslval.string; + return !strcmp(sudoerslval.string, expect); +} + +static int +check_fill_cmnd(const char *input, int len, int addspace, const char *expect, char **resultp) +{ + if (sudoerslval.command.cmnd != NULL) { + free(sudoerslval.command.cmnd); + sudoerslval.command.cmnd = NULL; + } + if (!fill_cmnd(input, len)) + return -1; + *resultp = sudoerslval.command.cmnd; + return !strcmp(sudoerslval.command.cmnd, expect); +} + +static int +check_fill_args(const char *input, int len, int addspace, const char *expect, char **resultp) +{ + /* Must not free old sudoerslval.command.args as gets appended to. */ + if (!fill_args(input, len, addspace)) + return -1; + *resultp = sudoerslval.command.args; + return !strcmp(sudoerslval.command.args, expect); +} + +static int +do_tests(int (*checker)(const char *, int, int, const char *, char **), + struct fill_test *data, size_t ntests) +{ + int len, errors = 0; + unsigned int i; + char *result; + + for (i = 0; i < ntests; i++) { + if (data[i].len == 0) + len = strlen(data[i].input); + else + len = data[i].len; + + switch ((*checker)(data[i].input, len, data[i].addspace, data[i].output, &result)) { + case 0: + /* no match */ + fprintf(stderr, "Failed parsing %.*s: expected [%s], got [%s]\n", + (int)data[i].len, data[i].input, data[i].output, result); + errors++; + break; + case 1: + /* match */ + break; + default: + /* error */ + fprintf(stderr, "Failed parsing %.*s: fill function failure\n", + (int)data[i].len, data[i].input); + errors++; + break; + } + } + + return errors; +} + +int +main(int argc, char *argv[]) +{ + int ntests, errors = 0; + + initprogname(argc > 0 ? argv[0] : "check_fill"); + + errors += do_tests(check_fill, txt_data, nitems(txt_data)); + errors += do_tests(check_fill_cmnd, cmd_data, nitems(cmd_data)); + errors += do_tests(check_fill_args, args_data, nitems(args_data)); + + ntests = nitems(txt_data) + nitems(cmd_data) + nitems(args_data); + printf("%s: %d tests run, %d errors, %d%% success rate\n", getprogname(), + ntests, errors, (ntests - errors) * 100 / ntests); + + exit(errors); +} + +/* STUB */ +void +sudoerserror(const char *s) +{ + return; +} diff --git a/plugins/sudoers/regress/parser/check_gentime.c b/plugins/sudoers/regress/parser/check_gentime.c new file mode 100644 index 0000000..899d7e4 --- /dev/null +++ b/plugins/sudoers/regress/parser/check_gentime.c @@ -0,0 +1,83 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_util.h" +#include "sudoers_debug.h" +#include "parse.h" + +sudo_dso_public int main(int argc, char *argv[]); + +const struct gentime_test { + char *gentime; + time_t unixtime; +} tests[] = { + { "199412161032ZZ", -1 }, + { "199412161032Z", 787573920 }, + { "199412160532-0500", 787573920 }, + { "199412160532-05000", -1 }, + { "199412160532", 787573920 }, /* local time is EST */ + { "20170214083000-0500", 1487079000 }, + { "201702140830-0500", 1487079000 }, + { "201702140830", 1487079000 }, /* local time is EST */ + { "201702140830.3-0500", 1487079018 }, + { "201702140830,3-0500", 1487079018 }, + { "20170214083000.5Z", 1487061000 }, + { "20170214083000,5Z", 1487061000 }, + { "201702142359.4Z", 1487116764 }, + { "201702142359,4Z", 1487116764 }, + { "2017021408.5Z", 1487061000 }, + { "2017021408,5Z", 1487061000 }, + { "20170214Z", -1 }, +}; + +int +main(int argc, char *argv[]) +{ + const int ntests = nitems(tests); + int i, errors = 0; + time_t result; + + initprogname(argc > 0 ? argv[0] : "check_gentime"); + + /* Do local time tests in Eastern Standard Time. */ + putenv("TZ=EST5EST5"); + tzset(); + + for (i = 0; i < ntests; i++) { + result = parse_gentime(tests[i].gentime); + if (result != tests[i].unixtime) { + fprintf(stderr, "check_gentime[%d]: %s: expected %lld, got %lld\n", + i, tests[i].gentime, + (long long)tests[i].unixtime, (long long)result); + errors++; + } + } + printf("check_gentime: %d tests run, %d errors, %d%% success rate\n", + ntests, errors, (ntests - errors) * 100 / ntests); + exit(errors); +} diff --git a/plugins/sudoers/regress/parser/check_hexchar.c b/plugins/sudoers/regress/parser/check_hexchar.c new file mode 100644 index 0000000..593ef72 --- /dev/null +++ b/plugins/sudoers/regress/parser/check_hexchar.c @@ -0,0 +1,81 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_util.h" + +int hexchar(const char *s); + +sudo_dso_public int main(int argc, char *argv[]); + +struct hexchar_test { + char hex[3]; + int value; +}; + +int +main(int argc, char *argv[]) +{ + struct hexchar_test *test_data; + int i, ntests, result, errors = 0; + static const char xdigs_lower[] = "0123456789abcdef"; + static const char xdigs_upper[] = "0123456789ABCDEF"; + + initprogname(argc > 0 ? argv[0] : "check_hexchar"); + + /* Build up test data. */ + ntests = 256 + 256 + 3; + test_data = calloc(sizeof(*test_data), ntests); + for (i = 0; i < 256; i++) { + /* lower case */ + test_data[i].value = i; + test_data[i].hex[1] = xdigs_lower[ (i & 0x0f)]; + test_data[i].hex[0] = xdigs_lower[((i & 0xf0) >> 4)]; + /* upper case */ + test_data[i + 256].value = i; + test_data[i + 256].hex[1] = xdigs_upper[ (i & 0x0f)]; + test_data[i + 256].hex[0] = xdigs_upper[((i & 0xf0) >> 4)]; + } + /* Also test invalid data */ + test_data[ntests - 3].hex[0] = '\0'; + test_data[ntests - 3].value = -1; + strlcpy(test_data[ntests - 2].hex, "AG", sizeof(test_data[ntests - 2].hex)); + test_data[ntests - 2].value = -1; + strlcpy(test_data[ntests - 1].hex, "-1", sizeof(test_data[ntests - 1].hex)); + test_data[ntests - 1].value = -1; + + for (i = 0; i < ntests; i++) { + result = hexchar(test_data[i].hex); + if (result != test_data[i].value) { + fprintf(stderr, "check_hexchar: expected %d, got %d\n", + test_data[i].value, result); + errors++; + } + } + printf("check_hexchar: %d tests run, %d errors, %d%% success rate\n", + ntests, errors, (ntests - errors) * 100 / ntests); + exit(errors); +} diff --git a/plugins/sudoers/regress/starttime/check_starttime.c b/plugins/sudoers/regress/starttime/check_starttime.c new file mode 100644 index 0000000..8951443 --- /dev/null +++ b/plugins/sudoers/regress/starttime/check_starttime.c @@ -0,0 +1,118 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_util.h" +#include "sudo_fatal.h" +#include "check.h" + +sudo_dso_public int main(int argc, char *argv[]); + +#ifdef __linux__ +static int +get_now(struct timespec *now) +{ + const char *errstr; + char buf[1024]; + time_t seconds; + int ret = -1; + FILE *fp; + + /* Linux process start time is relative to boot time. */ + fp = fopen("/proc/stat", "r"); + if (fp != NULL) { + while (fgets(buf, sizeof(buf), fp) != NULL) { + if (strncmp(buf, "btime ", 6) != 0) + continue; + buf[strcspn(buf, "\n")] = '\0'; + + /* Boot time is in seconds since the epoch. */ + seconds = sudo_strtonum(buf + 6, 0, TIME_T_MAX, &errstr); + if (errstr != NULL) + return -1; + + /* Instead of the real time, "now" is relative to boot time. */ + if (sudo_gettime_real(now) == -1) + return -1; + now->tv_sec -= seconds; + ret = 0; + break; + } + fclose(fp); + } + return ret; +} +#else +static int +get_now(struct timespec *now) +{ + /* Process start time is relative to wall clock time. */ + return sudo_gettime_real(now); +} +#endif + +int +main(int argc, char *argv[]) +{ + int ntests = 0, errors = 0; + struct timespec now, then, delta; + pid_t pids[2]; + int i; + + initprogname(argc > 0 ? argv[0] : "check_starttime"); + + if (get_now(&now) == -1) + sudo_fatal_nodebug("unable to get current time"); + + pids[0] = getpid(); + pids[1] = getppid(); + + for (i = 0; i < 2; i++) { + ntests++; + if (get_starttime(pids[i], &then) == -1) { + printf("%s: test %d: unable to get start time for pid %d\n", + getprogname(), ntests, (int)pids[i]); + errors++; + } + if (i != 0) + continue; + + /* Verify our own process start time, allowing for some drift. */ + ntests++; + sudo_timespecsub(&then, &now, &delta); + if (delta.tv_sec > 30 || delta.tv_sec < -30) { + printf("%s: test %d: unexpected start time for pid %d: %s", + getprogname(), ntests, (int)pids[i], ctime(&then.tv_sec)); + errors++; + } + } + + printf("%s: %d tests run, %d errors, %d%% success rate\n", getprogname(), + ntests, errors, (ntests - errors) * 100 / ntests); + + exit(errors); +} diff --git a/plugins/sudoers/regress/sudoers/test1.in b/plugins/sudoers/regress/sudoers/test1.in new file mode 100644 index 0000000..d87c872 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test1.in @@ -0,0 +1,12 @@ +# +# Verify that all command tags are parsed OK. +# See https://bugzilla.sudo.ws/show_bug.cgi?id=437 +# +user1 ALL = LOG_INPUT: LOG_OUTPUT: /usr/bin/su -:\ + ALL = NOLOG_INPUT: NOLOG_OUTPUT: /usr/bin/id +user2 ALL = NOPASSWD: NOEXEC: SETENV: /usr/bin/vi:\ + ALL = PASSWD: EXEC: NOSETENV: /usr/bin/echo +user3 ALL = MAIL: /bin/sh:\ + ALL = NOMAIL: /usr/bin/id +user4 ALL = FOLLOW: sudoedit /etc/motd:\ + ALL = NOFOLLOW: sudoedit /home/*/* diff --git a/plugins/sudoers/regress/sudoers/test1.json.ok b/plugins/sudoers/regress/sudoers/test1.json.ok new file mode 100644 index 0000000..9523e4a --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test1.json.ok @@ -0,0 +1,154 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "log_input": true }, + { "log_output": true } + ], + "Commands": [ + { "command": "/usr/bin/su -" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "log_input": false }, + { "log_output": false } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "authenticate": false }, + { "noexec": true }, + { "setenv": true } + ], + "Commands": [ + { "command": "/usr/bin/vi" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "authenticate": true }, + { "noexec": false }, + { "setenv": false } + ], + "Commands": [ + { "command": "/usr/bin/echo" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "send_mail": true } + ], + "Commands": [ + { "command": "/bin/sh" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "send_mail": false } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "sudoedit_follow": true } + ], + "Commands": [ + { "command": "sudoedit /etc/motd" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "sudoedit_follow": false } + ], + "Commands": [ + { "command": "sudoedit /home/*/*" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test1.ldif.ok b/plugins/sudoers/regress/sudoers/test1.ldif.ok new file mode 100644 index 0000000..7f3fcfc --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test1.ldif.ok @@ -0,0 +1,88 @@ +dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1 +sudoUser: user1 +sudoHost: ALL +sudoOption: log_input +sudoOption: log_output +sudoCommand: /usr/bin/su - +sudoOrder: 1 + +dn: cn=user1_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1_1 +sudoUser: user1 +sudoHost: ALL +sudoOption: !log_input +sudoOption: !log_output +sudoCommand: /usr/bin/id +sudoOrder: 2 + +dn: cn=user2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2 +sudoUser: user2 +sudoHost: ALL +sudoOption: !authenticate +sudoOption: noexec +sudoOption: setenv +sudoCommand: /usr/bin/vi +sudoOrder: 3 + +dn: cn=user2_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2_1 +sudoUser: user2 +sudoHost: ALL +sudoOption: authenticate +sudoOption: !noexec +sudoOption: !setenv +sudoCommand: /usr/bin/echo +sudoOrder: 4 + +dn: cn=user3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3 +sudoUser: user3 +sudoHost: ALL +sudoOption: mail_all_cmnds +sudoCommand: /bin/sh +sudoOrder: 5 + +dn: cn=user3_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3_1 +sudoUser: user3 +sudoHost: ALL +sudoOption: !mail_all_cmnds +sudoOption: !mail_always +sudoOption: !mail_no_perms +sudoCommand: /usr/bin/id +sudoOrder: 6 + +dn: cn=user4,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4 +sudoUser: user4 +sudoHost: ALL +sudoOption: sudoedit_follow +sudoCommand: sudoedit /etc/motd +sudoOrder: 7 + +dn: cn=user4_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4_1 +sudoUser: user4 +sudoHost: ALL +sudoOption: !sudoedit_follow +sudoCommand: sudoedit /home/*/* +sudoOrder: 8 + diff --git a/plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok new file mode 100644 index 0000000..126fe91 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok @@ -0,0 +1,13 @@ +# sudoRole user1, user1_1 +user1 ALL = LOG_INPUT: LOG_OUTPUT: /usr/bin/su -, NOLOG_INPUT: NOLOG_OUTPUT:\ + /usr/bin/id + +# sudoRole user2, user2_1 +user2 ALL = SETENV: NOEXEC: NOPASSWD: /usr/bin/vi, NOSETENV: EXEC: PASSWD:\ + /usr/bin/echo + +# sudoRole user3, user3_1 +user3 ALL = MAIL: /bin/sh, NOMAIL: /usr/bin/id + +# sudoRole user4, user4_1 +user4 ALL = FOLLOW: sudoedit /etc/motd, NOFOLLOW: sudoedit /home/*/* diff --git a/plugins/sudoers/regress/sudoers/test1.out.ok b/plugins/sudoers/regress/sudoers/test1.out.ok new file mode 100644 index 0000000..3d6bab4 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test1.out.ok @@ -0,0 +1,6 @@ +Parses OK + +user1 ALL = LOG_INPUT: LOG_OUTPUT: /usr/bin/su - : ALL = NOLOG_INPUT: NOLOG_OUTPUT: /usr/bin/id +user2 ALL = SETENV: NOEXEC: NOPASSWD: /usr/bin/vi : ALL = NOSETENV: EXEC: PASSWD: /usr/bin/echo +user3 ALL = MAIL: /bin/sh : ALL = NOMAIL: /usr/bin/id +user4 ALL = FOLLOW: sudoedit /etc/motd : ALL = NOFOLLOW: sudoedit /home/*/* diff --git a/plugins/sudoers/regress/sudoers/test1.toke.ok b/plugins/sudoers/regress/sudoers/test1.toke.ok new file mode 100644 index 0000000..28c8592 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test1.toke.ok @@ -0,0 +1,8 @@ +# +# +# +# +WORD(6) ALL = LOG_INPUT LOG_OUTPUT COMMAND ARG : ALL = NOLOG_INPUT NOLOG_OUTPUT COMMAND +WORD(6) ALL = NOPASSWD NOEXEC SETENV COMMAND : ALL = PASSWD EXEC NOSETENV COMMAND +WORD(6) ALL = MAIL COMMAND : ALL = NOMAIL COMMAND +WORD(6) ALL = FOLLOW COMMAND ARG : ALL = NOFOLLOW COMMAND ARG diff --git a/plugins/sudoers/regress/sudoers/test10.in b/plugins/sudoers/regress/sudoers/test10.in new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test10.in @@ -0,0 +1 @@ + diff --git a/plugins/sudoers/regress/sudoers/test10.json.ok b/plugins/sudoers/regress/sudoers/test10.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test10.ldif.ok b/plugins/sudoers/regress/sudoers/test10.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test10.out.ok b/plugins/sudoers/regress/sudoers/test10.out.ok new file mode 100644 index 0000000..5af5c53 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test10.out.ok @@ -0,0 +1,2 @@ +Parses OK + diff --git a/plugins/sudoers/regress/sudoers/test10.toke.ok b/plugins/sudoers/regress/sudoers/test10.toke.ok new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test10.toke.ok @@ -0,0 +1 @@ + diff --git a/plugins/sudoers/regress/sudoers/test11.in b/plugins/sudoers/regress/sudoers/test11.in new file mode 100644 index 0000000..5ffba7b --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test11.in @@ -0,0 +1 @@ +bogus diff --git a/plugins/sudoers/regress/sudoers/test11.json.ok b/plugins/sudoers/regress/sudoers/test11.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test11.ldif.ok b/plugins/sudoers/regress/sudoers/test11.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test11.out.ok b/plugins/sudoers/regress/sudoers/test11.out.ok new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test11.out.ok @@ -0,0 +1 @@ + diff --git a/plugins/sudoers/regress/sudoers/test11.toke.ok b/plugins/sudoers/regress/sudoers/test11.toke.ok new file mode 100644 index 0000000..bfef7a7 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test11.toke.ok @@ -0,0 +1,2 @@ +WORD(6) +<*> \ No newline at end of file diff --git a/plugins/sudoers/regress/sudoers/test12.in b/plugins/sudoers/regress/sudoers/test12.in new file mode 100644 index 0000000..23bda4a --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test12.in @@ -0,0 +1 @@ +user ALL = (ALL) diff --git a/plugins/sudoers/regress/sudoers/test12.json.ok b/plugins/sudoers/regress/sudoers/test12.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test12.ldif.ok b/plugins/sudoers/regress/sudoers/test12.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test12.out.ok b/plugins/sudoers/regress/sudoers/test12.out.ok new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test12.out.ok @@ -0,0 +1 @@ + diff --git a/plugins/sudoers/regress/sudoers/test12.toke.ok b/plugins/sudoers/regress/sudoers/test12.toke.ok new file mode 100644 index 0000000..0d79959 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test12.toke.ok @@ -0,0 +1,2 @@ +WORD(6) ALL = ( ALL ) +<*> \ No newline at end of file diff --git a/plugins/sudoers/regress/sudoers/test13.in b/plugins/sudoers/regress/sudoers/test13.in new file mode 100644 index 0000000..b8002bc --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test13.in @@ -0,0 +1 @@ +user ALL = (ALL) \ No newline at end of file diff --git a/plugins/sudoers/regress/sudoers/test13.json.ok b/plugins/sudoers/regress/sudoers/test13.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test13.ldif.ok b/plugins/sudoers/regress/sudoers/test13.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test13.out.ok b/plugins/sudoers/regress/sudoers/test13.out.ok new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test13.out.ok @@ -0,0 +1 @@ + diff --git a/plugins/sudoers/regress/sudoers/test13.toke.ok b/plugins/sudoers/regress/sudoers/test13.toke.ok new file mode 100644 index 0000000..0d79959 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test13.toke.ok @@ -0,0 +1,2 @@ +WORD(6) ALL = ( ALL ) +<*> \ No newline at end of file diff --git a/plugins/sudoers/regress/sudoers/test14.in b/plugins/sudoers/regress/sudoers/test14.in new file mode 100644 index 0000000..985f6e3 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test14.in @@ -0,0 +1,6 @@ +Cmnd_Alias LS = sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1, sha224:d7910e1967342b4605cb73a550944044c631cd3514001900966962ac /bin/ls +Cmnd_Alias SH = sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=, sha256:1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4= /bin/sh + +millert ALL = LS, SH, sha512:srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw /bin/kill + +operator ALL = sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=, sha256:1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4= ALL diff --git a/plugins/sudoers/regress/sudoers/test14.json.ok b/plugins/sudoers/regress/sudoers/test14.json.ok new file mode 100644 index 0000000..e772d6e --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test14.json.ok @@ -0,0 +1,62 @@ +{ + "Command_Aliases": { + "LS": [ + { + "command": "/bin/ls", + "sha224": "d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1", + "sha224": "d7910e1967342b4605cb73a550944044c631cd3514001900966962ac" + } + ], + "SH": [ + { + "command": "/bin/sh", + "sha256": "hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=", + "sha256": "1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4=" + } + ] + }, + "User_Specs": [ + { + "User_List": [ + { "username": "millert" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Commands": [ + { "cmndalias": "LS" }, + { "cmndalias": "SH" }, + { + "command": "/bin/kill", + "sha512": "srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw" + } + ] + } + ] + }, + { + "User_List": [ + { "username": "operator" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "setenv": true } + ], + "Commands": [ + { + "command": "ALL", + "sha256": "hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=", + "sha256": "1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4=" + } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test14.ldif.ok b/plugins/sudoers/regress/sudoers/test14.ldif.ok new file mode 100644 index 0000000..ea9e957 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test14.ldif.ok @@ -0,0 +1,20 @@ +dn: cn=millert,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: millert +sudoUser: millert +sudoHost: ALL +sudoCommand: sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1, sha224:d7910e1967342b4605cb73a550944044c631cd3514001900966962ac /bin/ls +sudoCommand: sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=, sha256:1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4= /bin/sh +sudoCommand: sha512:srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw /bin/kill +sudoOrder: 1 + +dn: cn=operator,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: operator +sudoUser: operator +sudoHost: ALL +sudoCommand: sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=, sha256:1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4= ALL +sudoOrder: 2 + diff --git a/plugins/sudoers/regress/sudoers/test14.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test14.ldif2sudo.ok new file mode 100644 index 0000000..b916cca --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test14.ldif2sudo.ok @@ -0,0 +1,11 @@ +# sudoRole millert +millert ALL = sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1,\ + sha224:d7910e1967342b4605cb73a550944044c631cd3514001900966962ac /bin/ls,\ + sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=,\ + sha256:1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4= /bin/sh,\ + sha512:srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw\ + /bin/kill + +# sudoRole operator +operator ALL = sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=,\ + sha256:1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4= ALL diff --git a/plugins/sudoers/regress/sudoers/test14.out.ok b/plugins/sudoers/regress/sudoers/test14.out.ok new file mode 100644 index 0000000..05d0a20 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test14.out.ok @@ -0,0 +1,7 @@ +Parses OK + +Cmnd_Alias LS = sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1, sha224:d7910e1967342b4605cb73a550944044c631cd3514001900966962ac /bin/ls +Cmnd_Alias SH = sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=, sha256:1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4= /bin/sh + +millert ALL = LS, SH, sha512:srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw /bin/kill +operator ALL = sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=, sha256:1IXHRCxXgSnIEnb+xBz4PAfWaPdXIBWKFF0QCwxJ5G4= ALL diff --git a/plugins/sudoers/regress/sudoers/test14.toke.ok b/plugins/sudoers/regress/sudoers/test14.toke.ok new file mode 100644 index 0000000..0b4f36a --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test14.toke.ok @@ -0,0 +1,6 @@ +CMNDALIAS ALIAS = SHA224_TOK : DIGEST , SHA224_TOK : DIGEST COMMAND +CMNDALIAS ALIAS = SHA256_TOK : DIGEST , SHA256_TOK : DIGEST COMMAND + +WORD(6) ALL = ALIAS , ALIAS , SHA512_TOK : DIGEST COMMAND + +WORD(6) ALL = SHA256_TOK : DIGEST , SHA256_TOK : DIGEST ALL diff --git a/plugins/sudoers/regress/sudoers/test15.in b/plugins/sudoers/regress/sudoers/test15.in new file mode 100644 index 0000000..11bcb13 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test15.in @@ -0,0 +1,2 @@ +# Test parsing of sudoedit rule +user ALL = sudoedit /etc/motd diff --git a/plugins/sudoers/regress/sudoers/test15.json.ok b/plugins/sudoers/regress/sudoers/test15.json.ok new file mode 100644 index 0000000..ff1795a --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test15.json.ok @@ -0,0 +1,19 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Commands": [ + { "command": "sudoedit /etc/motd" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test15.ldif.ok b/plugins/sudoers/regress/sudoers/test15.ldif.ok new file mode 100644 index 0000000..ac35ba0 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test15.ldif.ok @@ -0,0 +1,9 @@ +dn: cn=user,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user +sudoUser: user +sudoHost: ALL +sudoCommand: sudoedit /etc/motd +sudoOrder: 1 + diff --git a/plugins/sudoers/regress/sudoers/test15.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test15.ldif2sudo.ok new file mode 100644 index 0000000..775d59e --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test15.ldif2sudo.ok @@ -0,0 +1,2 @@ +# sudoRole user +user ALL = sudoedit /etc/motd diff --git a/plugins/sudoers/regress/sudoers/test15.out.ok b/plugins/sudoers/regress/sudoers/test15.out.ok new file mode 100644 index 0000000..b230cf2 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test15.out.ok @@ -0,0 +1,3 @@ +Parses OK + +user ALL = sudoedit /etc/motd diff --git a/plugins/sudoers/regress/sudoers/test15.toke.ok b/plugins/sudoers/regress/sudoers/test15.toke.ok new file mode 100644 index 0000000..08bb2b8 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test15.toke.ok @@ -0,0 +1,2 @@ +# +WORD(6) ALL = COMMAND ARG diff --git a/plugins/sudoers/regress/sudoers/test16.in b/plugins/sudoers/regress/sudoers/test16.in new file mode 100644 index 0000000..d2a79ea --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test16.in @@ -0,0 +1,3 @@ +# Test parsing of sudoedit rule in a Cmnd_Alias +Cmnd_Alias EDIT = sudoedit /etc/motd +user ALL = EDIT diff --git a/plugins/sudoers/regress/sudoers/test16.json.ok b/plugins/sudoers/regress/sudoers/test16.json.ok new file mode 100644 index 0000000..7c42654 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test16.json.ok @@ -0,0 +1,24 @@ +{ + "Command_Aliases": { + "EDIT": [ + { "command": "sudoedit /etc/motd" } + ] + }, + "User_Specs": [ + { + "User_List": [ + { "username": "user" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Commands": [ + { "cmndalias": "EDIT" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test16.ldif.ok b/plugins/sudoers/regress/sudoers/test16.ldif.ok new file mode 100644 index 0000000..ac35ba0 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test16.ldif.ok @@ -0,0 +1,9 @@ +dn: cn=user,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user +sudoUser: user +sudoHost: ALL +sudoCommand: sudoedit /etc/motd +sudoOrder: 1 + diff --git a/plugins/sudoers/regress/sudoers/test16.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test16.ldif2sudo.ok new file mode 100644 index 0000000..775d59e --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test16.ldif2sudo.ok @@ -0,0 +1,2 @@ +# sudoRole user +user ALL = sudoedit /etc/motd diff --git a/plugins/sudoers/regress/sudoers/test16.out.ok b/plugins/sudoers/regress/sudoers/test16.out.ok new file mode 100644 index 0000000..7b8c918 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test16.out.ok @@ -0,0 +1,5 @@ +Parses OK + +Cmnd_Alias EDIT = sudoedit /etc/motd + +user ALL = EDIT diff --git a/plugins/sudoers/regress/sudoers/test16.toke.ok b/plugins/sudoers/regress/sudoers/test16.toke.ok new file mode 100644 index 0000000..debc4c7 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test16.toke.ok @@ -0,0 +1,3 @@ +# +CMNDALIAS ALIAS = COMMAND ARG +WORD(6) ALL = ALIAS diff --git a/plugins/sudoers/regress/sudoers/test17.in b/plugins/sudoers/regress/sudoers/test17.in new file mode 100644 index 0000000..37d066c --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.in @@ -0,0 +1,13 @@ +# Test parsing of command_timeout and TIMEOUT syntax +Defaults command_timeout=2d8h10m59s +user0 ALL = TIMEOUT=7D4H10M30S /usr/bin/id, /usr/bin/who, TIMEOUT=0 /bin/ls +user1 ALL = TIMEOUT=7d4h10m30s /usr/bin/id +user2 ALL = TIMEOUT=4h10m30s /usr/bin/id +user3 ALL = TIMEOUT=10m30s /usr/bin/id +user4 ALL = TIMEOUT=14d /usr/bin/id +user5 ALL = TIMEOUT=5m /usr/bin/id +user6 ALL = TIMEOUT=30s /usr/bin/id +user7 ALL = TIMEOUT=45 /usr/bin/id +user8 ALL = TIMEOUT=7d4h10m30s /usr/bin/id, TIMEOUT=4h10m30s /usr/bin/id, \ + TIMEOUT=10m30s /usr/bin/id, TIMEOUT=14d /usr/bin/id, \ + TIMEOUT=5m /usr/bin/id, TIMEOUT=30s /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test17.json.ok b/plugins/sudoers/regress/sudoers/test17.json.ok new file mode 100644 index 0000000..2f39a37 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.json.ok @@ -0,0 +1,180 @@ +{ + "Defaults": [ + { + "Options": [ + { "command_timeout": "2d8h10m59s" } + ] + } + ], + "User_Specs": [ + { + "User_List": [ + { "username": "user0" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 619830 } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/who" }, + { "command": "/bin/ls" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 619830 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 15030 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 630 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 1209600 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user5" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 300 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user6" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 30 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user7" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 45 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user8" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 619830 } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test17.ldif.ok b/plugins/sudoers/regress/sudoers/test17.ldif.ok new file mode 100644 index 0000000..bdc784c --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.ldif.ok @@ -0,0 +1,104 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: command_timeout=2d8h10m59s + +dn: cn=user0,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user0 +sudoUser: user0 +sudoHost: ALL +sudoOption: command_timeout=619830 +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/who +sudoCommand: /bin/ls +sudoOrder: 1 + +dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1 +sudoUser: user1 +sudoHost: ALL +sudoOption: command_timeout=619830 +sudoCommand: /usr/bin/id +sudoOrder: 2 + +dn: cn=user2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2 +sudoUser: user2 +sudoHost: ALL +sudoOption: command_timeout=15030 +sudoCommand: /usr/bin/id +sudoOrder: 3 + +dn: cn=user3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3 +sudoUser: user3 +sudoHost: ALL +sudoOption: command_timeout=630 +sudoCommand: /usr/bin/id +sudoOrder: 4 + +dn: cn=user4,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4 +sudoUser: user4 +sudoHost: ALL +sudoOption: command_timeout=1209600 +sudoCommand: /usr/bin/id +sudoOrder: 5 + +dn: cn=user5,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user5 +sudoUser: user5 +sudoHost: ALL +sudoOption: command_timeout=300 +sudoCommand: /usr/bin/id +sudoOrder: 6 + +dn: cn=user6,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user6 +sudoUser: user6 +sudoHost: ALL +sudoOption: command_timeout=30 +sudoCommand: /usr/bin/id +sudoOrder: 7 + +dn: cn=user7,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user7 +sudoUser: user7 +sudoHost: ALL +sudoOption: command_timeout=45 +sudoCommand: /usr/bin/id +sudoOrder: 8 + +dn: cn=user8,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user8 +sudoUser: user8 +sudoHost: ALL +sudoOption: command_timeout=619830 +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoOrder: 9 + diff --git a/plugins/sudoers/regress/sudoers/test17.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test17.ldif2sudo.ok new file mode 100644 index 0000000..608f52f --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.ldif2sudo.ok @@ -0,0 +1,29 @@ +Defaults command_timeout=2d8h10m59s + +# sudoRole user0 +user0 ALL = TIMEOUT=619830 /usr/bin/id, /usr/bin/who, /bin/ls + +# sudoRole user1 +user1 ALL = TIMEOUT=619830 /usr/bin/id + +# sudoRole user2 +user2 ALL = TIMEOUT=15030 /usr/bin/id + +# sudoRole user3 +user3 ALL = TIMEOUT=630 /usr/bin/id + +# sudoRole user4 +user4 ALL = TIMEOUT=1209600 /usr/bin/id + +# sudoRole user5 +user5 ALL = TIMEOUT=300 /usr/bin/id + +# sudoRole user6 +user6 ALL = TIMEOUT=30 /usr/bin/id + +# sudoRole user7 +user7 ALL = TIMEOUT=45 /usr/bin/id + +# sudoRole user8 +user8 ALL = TIMEOUT=619830 /usr/bin/id, /usr/bin/id, /usr/bin/id, /usr/bin/id,\ + /usr/bin/id, /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test17.out.ok b/plugins/sudoers/regress/sudoers/test17.out.ok new file mode 100644 index 0000000..f0c8086 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.out.ok @@ -0,0 +1,13 @@ +Parses OK + +Defaults command_timeout=2d8h10m59s + +user0 ALL = TIMEOUT=619830 /usr/bin/id, /usr/bin/who, /bin/ls +user1 ALL = TIMEOUT=619830 /usr/bin/id +user2 ALL = TIMEOUT=15030 /usr/bin/id +user3 ALL = TIMEOUT=630 /usr/bin/id +user4 ALL = TIMEOUT=1209600 /usr/bin/id +user5 ALL = TIMEOUT=300 /usr/bin/id +user6 ALL = TIMEOUT=30 /usr/bin/id +user7 ALL = TIMEOUT=45 /usr/bin/id +user8 ALL = TIMEOUT=619830 /usr/bin/id, TIMEOUT=15030 /usr/bin/id, TIMEOUT=630 /usr/bin/id, TIMEOUT=1209600 /usr/bin/id, TIMEOUT=300 /usr/bin/id, TIMEOUT=30 /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test17.toke.ok b/plugins/sudoers/regress/sudoers/test17.toke.ok new file mode 100644 index 0000000..d0a82ca --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.toke.ok @@ -0,0 +1,11 @@ +# +DEFAULTS DEFVAR = WORD(2) +WORD(6) ALL = CMND_TIMEOUT = WORD(6) COMMAND , COMMAND , CMND_TIMEOUT = WORD(6) COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) COMMAND , CMND_TIMEOUT = WORD(6) COMMAND , CMND_TIMEOUT = WORD(6) COMMAND , CMND_TIMEOUT = WORD(6) COMMAND , CMND_TIMEOUT = WORD(6) COMMAND , CMND_TIMEOUT = WORD(6) COMMAND diff --git a/plugins/sudoers/regress/sudoers/test18.in b/plugins/sudoers/regress/sudoers/test18.in new file mode 100644 index 0000000..8d94ec7 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test18.in @@ -0,0 +1,8 @@ +# Test command_timeout and TIMEOUT syntax errors +Defaults command_timeout=2d8h10m59ss +Defaults:root command_timeout=15f +user0 ALL = TIMEOUT=7dd4h10m30s /usr/bin/id, /usr/bin/who, TIMEOUT=0 /bin/ls +user1 ALL = TIMEOUT=7d4h10mm30s /usr/bin/id +user2 ALL = TIMEOUT=4hg10m30s /usr/bin/id +user3 ALL = TIMEOUT=10m30ss /usr/bin/id +user4 ALL = TIMEOUT=14g /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test18.json.ok b/plugins/sudoers/regress/sudoers/test18.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test18.ldif.ok b/plugins/sudoers/regress/sudoers/test18.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test18.out.ok b/plugins/sudoers/regress/sudoers/test18.out.ok new file mode 100644 index 0000000..eefdc3a --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test18.out.ok @@ -0,0 +1,4 @@ +Problem with defaults entries + +Defaults command_timeout=2d8h10m59ss +Defaults:root command_timeout=15f diff --git a/plugins/sudoers/regress/sudoers/test18.toke.ok b/plugins/sudoers/regress/sudoers/test18.toke.ok new file mode 100644 index 0000000..78e9ba6 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test18.toke.ok @@ -0,0 +1,10 @@ +# +DEFAULTS DEFVAR = WORD(2) +DEFAULTS_USER WORD(6) DEFVAR = WORD(2) +WORD(6) ALL = CMND_TIMEOUT = WORD(6) <*> COMMAND , COMMAND , CMND_TIMEOUT = WORD(6) COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) <*> COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) <*> COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) <*> COMMAND +WORD(6) ALL = CMND_TIMEOUT = WORD(6) <*> COMMAND +testsudoers: sudoers:2:26: value "2d8h10m59ss" is invalid for option "command_timeout" +testsudoers: sudoers:3:31: value "15f" is invalid for option "command_timeout" diff --git a/plugins/sudoers/regress/sudoers/test19.in b/plugins/sudoers/regress/sudoers/test19.in new file mode 100644 index 0000000..5f637a7 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test19.in @@ -0,0 +1,12 @@ +# Test parsing of NOTBEFORE and NOTAFTER syntax +# Local time zone parsing is checked in visudo/test10.sh +user0 ALL = NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /usr/bin/id, /bin/ls +user1 ALL = NOTBEFORE=201702140830Z /usr/bin/id, NOTAFTER=20170301083000Z /bin/ls +user2 ALL = NOTBEFORE=201702140830.3Z /usr/bin/id +user3 ALL = NOTBEFORE=2017021408Z /usr/bin/id +user4 ALL = NOTBEFORE=2017021408.4Z /usr/bin/id +user5 ALL = NOTBEFORE=20170214083000.5Z /usr/bin/id +user6 ALL = NOTBEFORE=20170214083000\,5Z /usr/bin/id +user7 ALL = NOTBEFORE=20170214033000-0500 /usr/bin/id +user8 ALL = NOTBEFORE=20170214033000.0-0500 /usr/bin/id +user9 ALL = NOTBEFORE=20170214033000\,0-0500 /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test19.json.ok b/plugins/sudoers/regress/sudoers/test19.json.ok new file mode 100644 index 0000000..c9a1bfd --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test19.json.ok @@ -0,0 +1,187 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user0" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" }, + { "notafter": "20170301083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/bin/ls" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/bin/ls" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083018Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214080000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214082400Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user5" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user6" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user7" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user8" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user9" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test19.ldif.ok b/plugins/sudoers/regress/sudoers/test19.ldif.ok new file mode 100644 index 0000000..362aa9e --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test19.ldif.ok @@ -0,0 +1,103 @@ +dn: cn=user0,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user0 +sudoUser: user0 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoNotAfter: 20170301083000Z +sudoCommand: /usr/bin/id +sudoCommand: /bin/ls +sudoOrder: 1 + +dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1 +sudoUser: user1 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoCommand: /bin/ls +sudoOrder: 2 + +dn: cn=user2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2 +sudoUser: user2 +sudoHost: ALL +sudoNotBefore: 20170214083018Z +sudoCommand: /usr/bin/id +sudoOrder: 3 + +dn: cn=user3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3 +sudoUser: user3 +sudoHost: ALL +sudoNotBefore: 20170214080000Z +sudoCommand: /usr/bin/id +sudoOrder: 4 + +dn: cn=user4,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4 +sudoUser: user4 +sudoHost: ALL +sudoNotBefore: 20170214082400Z +sudoCommand: /usr/bin/id +sudoOrder: 5 + +dn: cn=user5,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user5 +sudoUser: user5 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 6 + +dn: cn=user6,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user6 +sudoUser: user6 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 7 + +dn: cn=user7,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user7 +sudoUser: user7 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 8 + +dn: cn=user8,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user8 +sudoUser: user8 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 9 + +dn: cn=user9,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user9 +sudoUser: user9 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 10 + diff --git a/plugins/sudoers/regress/sudoers/test19.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test19.ldif2sudo.ok new file mode 100644 index 0000000..1aef1bc --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test19.ldif2sudo.ok @@ -0,0 +1,30 @@ +# sudoRole user0 +user0 ALL = NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /usr/bin/id,\ + /bin/ls + +# sudoRole user1 +user1 ALL = NOTBEFORE=20170214083000Z /usr/bin/id, /bin/ls + +# sudoRole user2 +user2 ALL = NOTBEFORE=20170214083018Z /usr/bin/id + +# sudoRole user3 +user3 ALL = NOTBEFORE=20170214080000Z /usr/bin/id + +# sudoRole user4 +user4 ALL = NOTBEFORE=20170214082400Z /usr/bin/id + +# sudoRole user5 +user5 ALL = NOTBEFORE=20170214083000Z /usr/bin/id + +# sudoRole user6 +user6 ALL = NOTBEFORE=20170214083000Z /usr/bin/id + +# sudoRole user7 +user7 ALL = NOTBEFORE=20170214083000Z /usr/bin/id + +# sudoRole user8 +user8 ALL = NOTBEFORE=20170214083000Z /usr/bin/id + +# sudoRole user9 +user9 ALL = NOTBEFORE=20170214083000Z /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test19.out.ok b/plugins/sudoers/regress/sudoers/test19.out.ok new file mode 100644 index 0000000..dacfefd --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test19.out.ok @@ -0,0 +1,12 @@ +Parses OK + +user0 ALL = NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /usr/bin/id, /bin/ls +user1 ALL = NOTBEFORE=20170214083000Z /usr/bin/id, NOTAFTER=20170301083000Z /bin/ls +user2 ALL = NOTBEFORE=20170214083018Z /usr/bin/id +user3 ALL = NOTBEFORE=20170214080000Z /usr/bin/id +user4 ALL = NOTBEFORE=20170214082400Z /usr/bin/id +user5 ALL = NOTBEFORE=20170214083000Z /usr/bin/id +user6 ALL = NOTBEFORE=20170214083000Z /usr/bin/id +user7 ALL = NOTBEFORE=20170214083000Z /usr/bin/id +user8 ALL = NOTBEFORE=20170214083000Z /usr/bin/id +user9 ALL = NOTBEFORE=20170214083000Z /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test19.toke.ok b/plugins/sudoers/regress/sudoers/test19.toke.ok new file mode 100644 index 0000000..04461d9 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test19.toke.ok @@ -0,0 +1,12 @@ +# +# +WORD(6) ALL = NOTBEFORE = WORD(6) NOTAFTER = WORD(6) COMMAND , COMMAND +WORD(6) ALL = NOTBEFORE = WORD(6) COMMAND , NOTAFTER = WORD(6) COMMAND +WORD(6) ALL = NOTBEFORE = WORD(6) COMMAND +WORD(6) ALL = NOTBEFORE = WORD(6) COMMAND +WORD(6) ALL = NOTBEFORE = WORD(6) COMMAND +WORD(6) ALL = NOTBEFORE = WORD(6) COMMAND +WORD(6) ALL = NOTBEFORE = WORD(6) COMMAND +WORD(6) ALL = NOTBEFORE = WORD(6) COMMAND +WORD(6) ALL = NOTBEFORE = WORD(6) COMMAND +WORD(6) ALL = NOTBEFORE = WORD(6) COMMAND diff --git a/plugins/sudoers/regress/sudoers/test2.in b/plugins/sudoers/regress/sudoers/test2.in new file mode 100644 index 0000000..cfdfaa3 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test2.in @@ -0,0 +1,60 @@ +# Check quoted user name in User_Alias +User_Alias UA1 = "foo" +User_Alias UA2 = "foo.bar" +User_Alias UA3 = "foo\"" +User_Alias UA4 = "foo:bar" +User_Alias UA5 = "foo:bar\"" + +# Check quoted group name in User_Alias +User_Alias UA6 = "%baz" +User_Alias UA7 = "%baz.biz" + +# Check quoted non-Unix group name in User_Alias +User_Alias UA8 = "%:C/non UNIX 0 c" +User_Alias UA9 = "%:C/non\'UNIX\'1 c" +User_Alias UA10 = "%:C/non\"UNIX\"0 c" +User_Alias UA11 = "%:C/non_UNIX_0 c" +User_Alias UA12 = "%:C/non\'UNIX_3 c" + +# Check quoted user name in Runas_Alias +Runas_Alias RA1 = "foo" +Runas_Alias RA2 = "foo\"" +Runas_Alias RA3 = "foo:bar" +Runas_Alias RA4 = "foo:bar\"" + +# Check quoted host name in Defaults +Defaults@"somehost" set_home +Defaults@"quoted\"" set_home + +# Check quoted user name in Defaults +Defaults:"you" set_home +Defaults:"us\"" set_home +Defaults:"%them" set_home +Defaults:"%: non UNIX 0 c" set_home +Defaults:"+net" set_home + +# Check quoted runas name in Defaults +Defaults>"someone" set_home +Defaults>"some one" set_home + +# Check quoted command in Defaults +# XXX - not currently supported +#Defaults!"/bin/ls -l" set_home +#Defaults!"/bin/ls -l \"foo\"" set_home + +# Check quoted user, runas and host name in Cmnd_Spec +"foo" "hosta" = ("root") ALL +"foo.bar" "hostb" = ("root") ALL +"foo\"" "hostc" = ("root") ALL +"foo:bar" "hostd" = ("root") ALL +"foo:bar\"" "hoste" = ("root") ALL + +# Check quoted group/netgroup name in Cmnd_Spec +"%baz" "hosta" = ("root") ALL +"%baz.biz" "hostb" = ("root") ALL +"%:C/non UNIX 0 c" "hostc" = ("root") ALL +"%:C/non\'UNIX\'1 c" "hostd" = ("root") ALL +"%:C/non\"UNIX\"0 c" "hoste" = ("root") ALL +"%:C/non_UNIX_0 c" "hostf" = ("root") ALL +"%:C/non\'UNIX_3 c" "hostg" = ("root") ALL +"+netgr" "hosth" = ("root") ALL diff --git a/plugins/sudoers/regress/sudoers/test2.json.ok b/plugins/sudoers/regress/sudoers/test2.json.ok new file mode 100644 index 0000000..769c3fd --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test2.json.ok @@ -0,0 +1,403 @@ +{ + "Defaults": [ + { + "Binding": [ + { "hostname": "somehost" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "hostname": "quoted\"" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "username": "you" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "username": "us\"" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "usergroup": "them" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "nonunixgroup": " non UNIX 0 c" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "netgroup": "net" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "username": "someone" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "username": "some one" } + ], + "Options": [ + { "set_home": true } + ] + } + ], + "User_Aliases": { + "UA1": [ + { "username": "foo" } + ], + "UA10": [ + { "nonunixgroup": "C/non\"UNIX\"0 c" } + ], + "UA11": [ + { "nonunixgroup": "C/non_UNIX_0 c" } + ], + "UA12": [ + { "nonunixgroup": "C/non\\'UNIX_3 c" } + ], + "UA2": [ + { "username": "foo.bar" } + ], + "UA3": [ + { "username": "foo\"" } + ], + "UA4": [ + { "username": "foo:bar" } + ], + "UA5": [ + { "username": "foo:bar\"" } + ], + "UA6": [ + { "usergroup": "baz" } + ], + "UA7": [ + { "usergroup": "baz.biz" } + ], + "UA8": [ + { "nonunixgroup": "C/non UNIX 0 c" } + ], + "UA9": [ + { "nonunixgroup": "C/non\\'UNIX\\'1 c" } + ] + }, + "Runas_Aliases": { + "RA1": [ + { "username": "foo" } + ], + "RA2": [ + { "username": "foo\"" } + ], + "RA3": [ + { "username": "foo:bar" } + ], + "RA4": [ + { "username": "foo:bar\"" } + ] + }, + "User_Specs": [ + { + "User_List": [ + { "username": "foo" } + ], + "Host_List": [ + { "hostname": "hosta" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "foo.bar" } + ], + "Host_List": [ + { "hostname": "hostb" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "foo\"" } + ], + "Host_List": [ + { "hostname": "hostc" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "foo:bar" } + ], + "Host_List": [ + { "hostname": "hostd" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "foo:bar\"" } + ], + "Host_List": [ + { "hostname": "hoste" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "usergroup": "baz" } + ], + "Host_List": [ + { "hostname": "hosta" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "usergroup": "baz.biz" } + ], + "Host_List": [ + { "hostname": "hostb" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non UNIX 0 c" } + ], + "Host_List": [ + { "hostname": "hostc" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non\\'UNIX\\'1 c" } + ], + "Host_List": [ + { "hostname": "hostd" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non\"UNIX\"0 c" } + ], + "Host_List": [ + { "hostname": "hoste" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non_UNIX_0 c" } + ], + "Host_List": [ + { "hostname": "hostf" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non\\'UNIX_3 c" } + ], + "Host_List": [ + { "hostname": "hostg" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "netgroup": "netgr" } + ], + "Host_List": [ + { "hostname": "hosth" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test2.ldif.ok b/plugins/sudoers/regress/sudoers/test2.ldif.ok new file mode 100644 index 0000000..48ba655 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test2.ldif.ok @@ -0,0 +1,157 @@ +# Unable to translate stdin:26:29: +# Defaults@somehost set_home + +# Unable to translate stdin:27:29: +# Defaults@quoted\" set_home + +# Unable to translate stdin:30:24: +# Defaults:you set_home + +# Unable to translate stdin:31:25: +# Defaults:us\" set_home + +# Unable to translate stdin:32:26: +# Defaults:%them set_home + +# Unable to translate stdin:33:36: +# Defaults:"%: non UNIX 0 c" set_home + +# Unable to translate stdin:34:25: +# Defaults:+net set_home + +# Unable to translate stdin:37:28: +# Defaults>someone set_home + +# Unable to translate stdin:38:29: +# Defaults>"some one" set_home + +dn: cn=foo,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo +sudoUser: foo +sudoHost: hosta +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 1 + +dn: cn=foo.bar,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo.bar +sudoUser: foo.bar +sudoHost: hostb +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 2 + +dn: cn=foo\",ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo\" +sudoUser: foo" +sudoHost: hostc +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 3 + +dn: cn=foo:bar,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo:bar +sudoUser: foo:bar +sudoHost: hostd +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 4 + +dn: cn=foo:bar\",ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo:bar\" +sudoUser: foo:bar" +sudoHost: hoste +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 5 + +dn: cn=%baz,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %baz +sudoUser: %baz +sudoHost: hosta +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 6 + +dn: cn=%baz.biz,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %baz.biz +sudoUser: %baz.biz +sudoHost: hostb +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 7 + +dn: cn=%:C/non UNIX 0 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non UNIX 0 c +sudoUser: %:C/non UNIX 0 c +sudoHost: hostc +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 8 + +dn: cn=%:C/non\\'UNIX\\'1 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non\\'UNIX\\'1 c +sudoUser: %:C/non\'UNIX\'1 c +sudoHost: hostd +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 9 + +dn: cn=%:C/non\"UNIX\"0 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non\"UNIX\"0 c +sudoUser: %:C/non"UNIX"0 c +sudoHost: hoste +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 10 + +dn: cn=%:C/non_UNIX_0 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non_UNIX_0 c +sudoUser: %:C/non_UNIX_0 c +sudoHost: hostf +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 11 + +dn: cn=%:C/non\\'UNIX_3 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non\\'UNIX_3 c +sudoUser: %:C/non\'UNIX_3 c +sudoHost: hostg +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 12 + +dn: cn=\+netgr,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \+netgr +sudoUser: +netgr +sudoHost: hosth +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 13 + diff --git a/plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok new file mode 100644 index 0000000..7039523 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok @@ -0,0 +1,38 @@ +# sudoRole foo +foo hosta = (root) ALL + +# sudoRole foo.bar +foo.bar hostb = (root) ALL + +# sudoRole foo" +foo\" hostc = (root) ALL + +# sudoRole foo:bar +foo\:bar hostd = (root) ALL + +# sudoRole foo:bar" +foo\:bar\" hoste = (root) ALL + +# sudoRole %baz +%baz hosta = (root) ALL + +# sudoRole %baz.biz +%baz.biz hostb = (root) ALL + +# sudoRole %:C/non UNIX 0 c +"%:C/non UNIX 0 c" hostc = (root) ALL + +# sudoRole %:C/non\'UNIX\'1 c +"%:C/non\'UNIX\'1 c" hostd = (root) ALL + +# sudoRole %:C/non"UNIX"0 c +"%:C/non\"UNIX\"0 c" hoste = (root) ALL + +# sudoRole %:C/non_UNIX_0 c +"%:C/non_UNIX_0 c" hostf = (root) ALL + +# sudoRole %:C/non\'UNIX_3 c +"%:C/non\'UNIX_3 c" hostg = (root) ALL + +# sudoRole +netgr ++netgr hosth = (root) ALL diff --git a/plugins/sudoers/regress/sudoers/test2.out.ok b/plugins/sudoers/regress/sudoers/test2.out.ok new file mode 100644 index 0000000..c99f6d0 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test2.out.ok @@ -0,0 +1,42 @@ +Parses OK + +Defaults@somehost set_home +Defaults@quoted\" set_home +Defaults:you set_home +Defaults:us\" set_home +Defaults:%them set_home +Defaults:"%: non UNIX 0 c" set_home +Defaults:+net set_home +Defaults>someone set_home +Defaults>"some one" set_home + +Runas_Alias RA1 = foo +Runas_Alias RA2 = foo\" +Runas_Alias RA3 = foo\:bar +Runas_Alias RA4 = foo\:bar\" +User_Alias UA1 = foo +User_Alias UA10 = "%:C/non\"UNIX\"0 c" +User_Alias UA11 = "%:C/non_UNIX_0 c" +User_Alias UA12 = "%:C/non\'UNIX_3 c" +User_Alias UA2 = foo.bar +User_Alias UA3 = foo\" +User_Alias UA4 = foo\:bar +User_Alias UA5 = foo\:bar\" +User_Alias UA6 = %baz +User_Alias UA7 = %baz.biz +User_Alias UA8 = "%:C/non UNIX 0 c" +User_Alias UA9 = "%:C/non\'UNIX\'1 c" + +foo hosta = (root) ALL +foo.bar hostb = (root) ALL +foo\" hostc = (root) ALL +foo\:bar hostd = (root) ALL +foo\:bar\" hoste = (root) ALL +%baz hosta = (root) ALL +%baz.biz hostb = (root) ALL +"%:C/non UNIX 0 c" hostc = (root) ALL +"%:C/non\'UNIX\'1 c" hostd = (root) ALL +"%:C/non\"UNIX\"0 c" hoste = (root) ALL +"%:C/non_UNIX_0 c" hostf = (root) ALL +"%:C/non\'UNIX_3 c" hostg = (root) ALL ++netgr hosth = (root) ALL diff --git a/plugins/sudoers/regress/sudoers/test2.toke.ok b/plugins/sudoers/regress/sudoers/test2.toke.ok new file mode 100644 index 0000000..63e1648 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test2.toke.ok @@ -0,0 +1,60 @@ +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) + +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP + +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY BACKSLASH STRBODY BACKSLASH STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY BACKSLASH STRBODY ENDSTR USERGROUP + +# +RUNASALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +RUNASALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +RUNASALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +RUNASALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) + +# +DEFAULTS_HOST BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_HOST BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR + +# +DEFAULTS_USER BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR USERGROUP DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR USERGROUP DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR NETGROUP DEFVAR + +# +DEFAULTS_RUNAS BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_RUNAS BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR + +# +# +# +# + +# +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL + +# +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY BACKSLASH STRBODY BACKSLASH STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY BACKSLASH STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR NETGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL diff --git a/plugins/sudoers/regress/sudoers/test20.in b/plugins/sudoers/regress/sudoers/test20.in new file mode 100644 index 0000000..c24f88a --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test20.in @@ -0,0 +1,26 @@ +# Test parsing of tuples +Defaults lecture +Defaults !lecture +Defaults lecture=never +Defaults lecture=once +Defaults lecture=always + +Defaults listpw +Defaults !listpw +Defaults listpw=never +Defaults listpw=any +Defaults listpw=all +Defaults listpw=always + +Defaults verifypw +Defaults !verifypw +Defaults verifypw=never +Defaults verifypw=any +Defaults verifypw=all +Defaults verifypw=always + +Defaults fdexec +Defaults !fdexec +Defaults fdexec=never +Defaults fdexec=digest_only +Defaults fdexec=always diff --git a/plugins/sudoers/regress/sudoers/test20.json.ok b/plugins/sudoers/regress/sudoers/test20.json.ok new file mode 100644 index 0000000..f2f1d55 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test20.json.ok @@ -0,0 +1,114 @@ +{ + "Defaults": [ + { + "Options": [ + { "lecture": true } + ] + }, + { + "Options": [ + { "lecture": false } + ] + }, + { + "Options": [ + { "lecture": "never" } + ] + }, + { + "Options": [ + { "lecture": "once" } + ] + }, + { + "Options": [ + { "lecture": "always" } + ] + }, + { + "Options": [ + { "listpw": true } + ] + }, + { + "Options": [ + { "listpw": false } + ] + }, + { + "Options": [ + { "listpw": "never" } + ] + }, + { + "Options": [ + { "listpw": "any" } + ] + }, + { + "Options": [ + { "listpw": "all" } + ] + }, + { + "Options": [ + { "listpw": "always" } + ] + }, + { + "Options": [ + { "verifypw": true } + ] + }, + { + "Options": [ + { "verifypw": false } + ] + }, + { + "Options": [ + { "verifypw": "never" } + ] + }, + { + "Options": [ + { "verifypw": "any" } + ] + }, + { + "Options": [ + { "verifypw": "all" } + ] + }, + { + "Options": [ + { "verifypw": "always" } + ] + }, + { + "Options": [ + { "fdexec": true } + ] + }, + { + "Options": [ + { "fdexec": false } + ] + }, + { + "Options": [ + { "fdexec": "never" } + ] + }, + { + "Options": [ + { "fdexec": "digest_only" } + ] + }, + { + "Options": [ + { "fdexec": "always" } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test20.ldif.ok b/plugins/sudoers/regress/sudoers/test20.ldif.ok new file mode 100644 index 0000000..de01cde --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test20.ldif.ok @@ -0,0 +1,28 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: lecture +sudoOption: !lecture +sudoOption: lecture=never +sudoOption: lecture=once +sudoOption: lecture=always +sudoOption: listpw +sudoOption: !listpw +sudoOption: listpw=never +sudoOption: listpw=any +sudoOption: listpw=all +sudoOption: listpw=always +sudoOption: verifypw +sudoOption: !verifypw +sudoOption: verifypw=never +sudoOption: verifypw=any +sudoOption: verifypw=all +sudoOption: verifypw=always +sudoOption: fdexec +sudoOption: !fdexec +sudoOption: fdexec=never +sudoOption: fdexec=digest_only +sudoOption: fdexec=always + diff --git a/plugins/sudoers/regress/sudoers/test20.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test20.ldif2sudo.ok new file mode 100644 index 0000000..e1c743c --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test20.ldif2sudo.ok @@ -0,0 +1,22 @@ +Defaults lecture +Defaults !lecture +Defaults lecture=never +Defaults lecture=once +Defaults lecture=always +Defaults listpw +Defaults !listpw +Defaults listpw=never +Defaults listpw=any +Defaults listpw=all +Defaults listpw=always +Defaults verifypw +Defaults !verifypw +Defaults verifypw=never +Defaults verifypw=any +Defaults verifypw=all +Defaults verifypw=always +Defaults fdexec +Defaults !fdexec +Defaults fdexec=never +Defaults fdexec=digest_only +Defaults fdexec=always diff --git a/plugins/sudoers/regress/sudoers/test20.out.ok b/plugins/sudoers/regress/sudoers/test20.out.ok new file mode 100644 index 0000000..260be81 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test20.out.ok @@ -0,0 +1,24 @@ +Parses OK + +Defaults lecture +Defaults !lecture +Defaults lecture=never +Defaults lecture=once +Defaults lecture=always +Defaults listpw +Defaults !listpw +Defaults listpw=never +Defaults listpw=any +Defaults listpw=all +Defaults listpw=always +Defaults verifypw +Defaults !verifypw +Defaults verifypw=never +Defaults verifypw=any +Defaults verifypw=all +Defaults verifypw=always +Defaults fdexec +Defaults !fdexec +Defaults fdexec=never +Defaults fdexec=digest_only +Defaults fdexec=always diff --git a/plugins/sudoers/regress/sudoers/test20.toke.ok b/plugins/sudoers/regress/sudoers/test20.toke.ok new file mode 100644 index 0000000..1847149 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test20.toke.ok @@ -0,0 +1,26 @@ +# +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) diff --git a/plugins/sudoers/regress/sudoers/test21.in b/plugins/sudoers/regress/sudoers/test21.in new file mode 100644 index 0000000..65416cf --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test21.in @@ -0,0 +1,36 @@ +# Test parsing of syslog settings +Defaults syslog +Defaults !syslog +Defaults syslog=auth +Defaults syslog=daemon +Defaults syslog=user +Defaults syslog=local0 +Defaults syslog=local1 +Defaults syslog=local2 +Defaults syslog=local3 +Defaults syslog=local4 +Defaults syslog=local5 +Defaults syslog=local6 +Defaults syslog=local7 + +Defaults !syslog_goodpri +Defaults syslog_goodpri=alert +Defaults syslog_goodpri=crit +Defaults syslog_goodpri=debug +Defaults syslog_goodpri=emerg +Defaults syslog_goodpri=err +Defaults syslog_goodpri=info +Defaults syslog_goodpri=notice +Defaults syslog_goodpri=warning +Defaults syslog_goodpri=none + +Defaults !syslog_badpri +Defaults syslog_badpri=alert +Defaults syslog_badpri=crit +Defaults syslog_badpri=debug +Defaults syslog_badpri=emerg +Defaults syslog_badpri=err +Defaults syslog_badpri=info +Defaults syslog_badpri=notice +Defaults syslog_badpri=warning +Defaults syslog_badpri=none diff --git a/plugins/sudoers/regress/sudoers/test21.json.ok b/plugins/sudoers/regress/sudoers/test21.json.ok new file mode 100644 index 0000000..7896965 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test21.json.ok @@ -0,0 +1,169 @@ +{ + "Defaults": [ + { + "Options": [ + { "syslog": true } + ] + }, + { + "Options": [ + { "syslog": false } + ] + }, + { + "Options": [ + { "syslog": "auth" } + ] + }, + { + "Options": [ + { "syslog": "daemon" } + ] + }, + { + "Options": [ + { "syslog": "user" } + ] + }, + { + "Options": [ + { "syslog": "local0" } + ] + }, + { + "Options": [ + { "syslog": "local1" } + ] + }, + { + "Options": [ + { "syslog": "local2" } + ] + }, + { + "Options": [ + { "syslog": "local3" } + ] + }, + { + "Options": [ + { "syslog": "local4" } + ] + }, + { + "Options": [ + { "syslog": "local5" } + ] + }, + { + "Options": [ + { "syslog": "local6" } + ] + }, + { + "Options": [ + { "syslog": "local7" } + ] + }, + { + "Options": [ + { "syslog_goodpri": false } + ] + }, + { + "Options": [ + { "syslog_goodpri": "alert" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "crit" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "debug" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "emerg" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "err" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "info" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "notice" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "warning" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "none" } + ] + }, + { + "Options": [ + { "syslog_badpri": false } + ] + }, + { + "Options": [ + { "syslog_badpri": "alert" } + ] + }, + { + "Options": [ + { "syslog_badpri": "crit" } + ] + }, + { + "Options": [ + { "syslog_badpri": "debug" } + ] + }, + { + "Options": [ + { "syslog_badpri": "emerg" } + ] + }, + { + "Options": [ + { "syslog_badpri": "err" } + ] + }, + { + "Options": [ + { "syslog_badpri": "info" } + ] + }, + { + "Options": [ + { "syslog_badpri": "notice" } + ] + }, + { + "Options": [ + { "syslog_badpri": "warning" } + ] + }, + { + "Options": [ + { "syslog_badpri": "none" } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test21.ldif.ok b/plugins/sudoers/regress/sudoers/test21.ldif.ok new file mode 100644 index 0000000..b3bede8 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test21.ldif.ok @@ -0,0 +1,39 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: syslog +sudoOption: !syslog +sudoOption: syslog=auth +sudoOption: syslog=daemon +sudoOption: syslog=user +sudoOption: syslog=local0 +sudoOption: syslog=local1 +sudoOption: syslog=local2 +sudoOption: syslog=local3 +sudoOption: syslog=local4 +sudoOption: syslog=local5 +sudoOption: syslog=local6 +sudoOption: syslog=local7 +sudoOption: !syslog_goodpri +sudoOption: syslog_goodpri=alert +sudoOption: syslog_goodpri=crit +sudoOption: syslog_goodpri=debug +sudoOption: syslog_goodpri=emerg +sudoOption: syslog_goodpri=err +sudoOption: syslog_goodpri=info +sudoOption: syslog_goodpri=notice +sudoOption: syslog_goodpri=warning +sudoOption: syslog_goodpri=none +sudoOption: !syslog_badpri +sudoOption: syslog_badpri=alert +sudoOption: syslog_badpri=crit +sudoOption: syslog_badpri=debug +sudoOption: syslog_badpri=emerg +sudoOption: syslog_badpri=err +sudoOption: syslog_badpri=info +sudoOption: syslog_badpri=notice +sudoOption: syslog_badpri=warning +sudoOption: syslog_badpri=none + diff --git a/plugins/sudoers/regress/sudoers/test21.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test21.ldif2sudo.ok new file mode 100644 index 0000000..56e09ff --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test21.ldif2sudo.ok @@ -0,0 +1,33 @@ +Defaults syslog +Defaults !syslog +Defaults syslog=auth +Defaults syslog=daemon +Defaults syslog=user +Defaults syslog=local0 +Defaults syslog=local1 +Defaults syslog=local2 +Defaults syslog=local3 +Defaults syslog=local4 +Defaults syslog=local5 +Defaults syslog=local6 +Defaults syslog=local7 +Defaults !syslog_goodpri +Defaults syslog_goodpri=alert +Defaults syslog_goodpri=crit +Defaults syslog_goodpri=debug +Defaults syslog_goodpri=emerg +Defaults syslog_goodpri=err +Defaults syslog_goodpri=info +Defaults syslog_goodpri=notice +Defaults syslog_goodpri=warning +Defaults syslog_goodpri=none +Defaults !syslog_badpri +Defaults syslog_badpri=alert +Defaults syslog_badpri=crit +Defaults syslog_badpri=debug +Defaults syslog_badpri=emerg +Defaults syslog_badpri=err +Defaults syslog_badpri=info +Defaults syslog_badpri=notice +Defaults syslog_badpri=warning +Defaults syslog_badpri=none diff --git a/plugins/sudoers/regress/sudoers/test21.out.ok b/plugins/sudoers/regress/sudoers/test21.out.ok new file mode 100644 index 0000000..136ec64 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test21.out.ok @@ -0,0 +1,35 @@ +Parses OK + +Defaults syslog +Defaults !syslog +Defaults syslog=auth +Defaults syslog=daemon +Defaults syslog=user +Defaults syslog=local0 +Defaults syslog=local1 +Defaults syslog=local2 +Defaults syslog=local3 +Defaults syslog=local4 +Defaults syslog=local5 +Defaults syslog=local6 +Defaults syslog=local7 +Defaults !syslog_goodpri +Defaults syslog_goodpri=alert +Defaults syslog_goodpri=crit +Defaults syslog_goodpri=debug +Defaults syslog_goodpri=emerg +Defaults syslog_goodpri=err +Defaults syslog_goodpri=info +Defaults syslog_goodpri=notice +Defaults syslog_goodpri=warning +Defaults syslog_goodpri=none +Defaults !syslog_badpri +Defaults syslog_badpri=alert +Defaults syslog_badpri=crit +Defaults syslog_badpri=debug +Defaults syslog_badpri=emerg +Defaults syslog_badpri=err +Defaults syslog_badpri=info +Defaults syslog_badpri=notice +Defaults syslog_badpri=warning +Defaults syslog_badpri=none diff --git a/plugins/sudoers/regress/sudoers/test21.toke.ok b/plugins/sudoers/regress/sudoers/test21.toke.ok new file mode 100644 index 0000000..871584b --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test21.toke.ok @@ -0,0 +1,36 @@ +# +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) diff --git a/plugins/sudoers/regress/sudoers/test22.in b/plugins/sudoers/regress/sudoers/test22.in new file mode 100644 index 0000000..ecf2fd9 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test22.in @@ -0,0 +1,6 @@ +# Test parsing of empty Runas_List + +user1 ALL = ( : ) ALL +user2 ALL = (:) ALL +user3 ALL = ( ) ALL +user4 ALL = () ALL diff --git a/plugins/sudoers/regress/sudoers/test22.json.ok b/plugins/sudoers/regress/sudoers/test22.json.ok new file mode 100644 index 0000000..22141a1 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test22.json.ok @@ -0,0 +1,88 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test22.ldif.ok b/plugins/sudoers/regress/sudoers/test22.ldif.ok new file mode 100644 index 0000000..14c3df4 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test22.ldif.ok @@ -0,0 +1,40 @@ +dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1 +sudoUser: user1 +sudoHost: ALL +sudoRunAsUser: +sudoCommand: ALL +sudoOrder: 1 + +dn: cn=user2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2 +sudoUser: user2 +sudoHost: ALL +sudoRunAsUser: +sudoCommand: ALL +sudoOrder: 2 + +dn: cn=user3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3 +sudoUser: user3 +sudoHost: ALL +sudoRunAsUser: +sudoCommand: ALL +sudoOrder: 3 + +dn: cn=user4,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4 +sudoUser: user4 +sudoHost: ALL +sudoRunAsUser: +sudoCommand: ALL +sudoOrder: 4 + diff --git a/plugins/sudoers/regress/sudoers/test22.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test22.ldif2sudo.ok new file mode 100644 index 0000000..e0c98e0 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test22.ldif2sudo.ok @@ -0,0 +1,11 @@ +# sudoRole user1 +user1 ALL = () ALL + +# sudoRole user2 +user2 ALL = () ALL + +# sudoRole user3 +user3 ALL = () ALL + +# sudoRole user4 +user4 ALL = () ALL diff --git a/plugins/sudoers/regress/sudoers/test22.out.ok b/plugins/sudoers/regress/sudoers/test22.out.ok new file mode 100644 index 0000000..7117e18 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test22.out.ok @@ -0,0 +1,6 @@ +Parses OK + +user1 ALL = (root) ALL +user2 ALL = (root) ALL +user3 ALL = (root) ALL +user4 ALL = (root) ALL diff --git a/plugins/sudoers/regress/sudoers/test22.sudo.ok b/plugins/sudoers/regress/sudoers/test22.sudo.ok new file mode 100644 index 0000000..879e1bd --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test22.sudo.ok @@ -0,0 +1,7 @@ +user1 ALL = () ALL + +user2 ALL = () ALL + +user3 ALL = () ALL + +user4 ALL = () ALL diff --git a/plugins/sudoers/regress/sudoers/test22.toke.ok b/plugins/sudoers/regress/sudoers/test22.toke.ok new file mode 100644 index 0000000..9eeb964 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test22.toke.ok @@ -0,0 +1,6 @@ +# + +WORD(6) ALL = ( : ) ALL +WORD(6) ALL = ( : ) ALL +WORD(6) ALL = ( ) ALL +WORD(6) ALL = ( ) ALL diff --git a/plugins/sudoers/regress/sudoers/test23.in b/plugins/sudoers/regress/sudoers/test23.in new file mode 100644 index 0000000..5e03d9e --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test23.in @@ -0,0 +1,11 @@ +# Test parsing of env_check, env_delete and env_keep +Defaults env_check = "COLORTERM LANG LANGUAGE LC_* LINGUAS" +Defaults env_check += "TERM TZ" + +Defaults env_delete = "IFS CDPATH LOCALDOMAIN RES_OPTIONS HOSTALIASES" +Defaults env_delete += "NLSPATH PATH_LOCALE LD_* _RLD*" + +Defaults env_keep += "LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET" +Defaults env_keep -= _XKB_CHARSET +Defaults env_keep += "XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH" +Defaults env_keep += XDG_SESSION_COOKIE diff --git a/plugins/sudoers/regress/sudoers/test23.json.ok b/plugins/sudoers/regress/sudoers/test23.json.ok new file mode 100644 index 0000000..5e8b0da --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test23.json.ok @@ -0,0 +1,102 @@ +{ + "Defaults": [ + { + "Options": [ + { + "operation": "list_assign", + "env_check": [ + "COLORTERM", + "LANG", + "LANGUAGE", + "LC_*", + "LINGUAS" + ] + } + ] + }, + { + "Options": [ + { + "operation": "list_add", + "env_check": [ + "TERM", + "TZ" + ] + } + ] + }, + { + "Options": [ + { + "operation": "list_assign", + "env_delete": [ + "IFS", + "CDPATH", + "LOCALDOMAIN", + "RES_OPTIONS", + "HOSTALIASES" + ] + } + ] + }, + { + "Options": [ + { + "operation": "list_add", + "env_delete": [ + "NLSPATH", + "PATH_LOCALE", + "LD_*", + "_RLD*" + ] + } + ] + }, + { + "Options": [ + { + "operation": "list_add", + "env_keep": [ + "LANG", + "LANGUAGE", + "LINGUAS", + "LC_*", + "_XKB_CHARSET" + ] + } + ] + }, + { + "Options": [ + { + "operation": "list_remove", + "env_keep": [ + "_XKB_CHARSET" + ] + } + ] + }, + { + "Options": [ + { + "operation": "list_add", + "env_keep": [ + "XAPPLRESDIR", + "XFILESEARCHPATH", + "XUSERFILESEARCHPATH" + ] + } + ] + }, + { + "Options": [ + { + "operation": "list_add", + "env_keep": [ + "XDG_SESSION_COOKIE" + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test23.ldif.ok b/plugins/sudoers/regress/sudoers/test23.ldif.ok new file mode 100644 index 0000000..97c1fbd --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test23.ldif.ok @@ -0,0 +1,14 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: env_check=COLORTERM LANG LANGUAGE LC_* LINGUAS +sudoOption: env_check+=TERM TZ +sudoOption: env_delete=IFS CDPATH LOCALDOMAIN RES_OPTIONS HOSTALIASES +sudoOption: env_delete+=NLSPATH PATH_LOCALE LD_* _RLD* +sudoOption: env_keep+=LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET +sudoOption: env_keep-=_XKB_CHARSET +sudoOption: env_keep+=XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH +sudoOption: env_keep+=XDG_SESSION_COOKIE + diff --git a/plugins/sudoers/regress/sudoers/test23.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test23.ldif2sudo.ok new file mode 100644 index 0000000..bb9f2e9 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test23.ldif2sudo.ok @@ -0,0 +1,8 @@ +Defaults env_check="COLORTERM LANG LANGUAGE LC_* LINGUAS" +Defaults env_check+="TERM TZ" +Defaults env_delete="IFS CDPATH LOCALDOMAIN RES_OPTIONS HOSTALIASES" +Defaults env_delete+="NLSPATH PATH_LOCALE LD_* _RLD*" +Defaults env_keep+="LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET" +Defaults env_keep-=_XKB_CHARSET +Defaults env_keep+="XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH" +Defaults env_keep+=XDG_SESSION_COOKIE diff --git a/plugins/sudoers/regress/sudoers/test23.out.ok b/plugins/sudoers/regress/sudoers/test23.out.ok new file mode 100644 index 0000000..fe6e415 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test23.out.ok @@ -0,0 +1,10 @@ +Parses OK + +Defaults env_check="COLORTERM LANG LANGUAGE LC_* LINGUAS" +Defaults env_check+="TERM TZ" +Defaults env_delete="IFS CDPATH LOCALDOMAIN RES_OPTIONS HOSTALIASES" +Defaults env_delete+="NLSPATH PATH_LOCALE LD_* _RLD*" +Defaults env_keep+="LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET" +Defaults env_keep-=_XKB_CHARSET +Defaults env_keep+="XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH" +Defaults env_keep+=XDG_SESSION_COOKIE diff --git a/plugins/sudoers/regress/sudoers/test23.sudo.ok b/plugins/sudoers/regress/sudoers/test23.sudo.ok new file mode 100644 index 0000000..bb9f2e9 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test23.sudo.ok @@ -0,0 +1,8 @@ +Defaults env_check="COLORTERM LANG LANGUAGE LC_* LINGUAS" +Defaults env_check+="TERM TZ" +Defaults env_delete="IFS CDPATH LOCALDOMAIN RES_OPTIONS HOSTALIASES" +Defaults env_delete+="NLSPATH PATH_LOCALE LD_* _RLD*" +Defaults env_keep+="LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET" +Defaults env_keep-=_XKB_CHARSET +Defaults env_keep+="XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH" +Defaults env_keep+=XDG_SESSION_COOKIE diff --git a/plugins/sudoers/regress/sudoers/test23.toke.ok b/plugins/sudoers/regress/sudoers/test23.toke.ok new file mode 100644 index 0000000..3d7cd84 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test23.toke.ok @@ -0,0 +1,11 @@ +# +DEFAULTS DEFVAR = BEGINSTR STRBODY ENDSTR WORD(4) +DEFAULTS DEFVAR += BEGINSTR STRBODY ENDSTR WORD(4) + +DEFAULTS DEFVAR = BEGINSTR STRBODY ENDSTR WORD(4) +DEFAULTS DEFVAR += BEGINSTR STRBODY ENDSTR WORD(4) + +DEFAULTS DEFVAR += BEGINSTR STRBODY ENDSTR WORD(4) +DEFAULTS DEFVAR -= WORD(2) +DEFAULTS DEFVAR += BEGINSTR STRBODY ENDSTR WORD(4) +DEFAULTS DEFVAR += WORD(2) diff --git a/plugins/sudoers/regress/sudoers/test24.in b/plugins/sudoers/regress/sudoers/test24.in new file mode 100644 index 0000000..3fc3bbc --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test24.in @@ -0,0 +1,6 @@ +# Test parsing of CHROOT and CWD syntax +Defaults runcwd=~ +Defaults runchroot=/ +# +user0 ALL = CHROOT=/var/www CWD=/htdocs /bin/ksh +user1 ALL = CWD=~root /usr/bin/id, CWD=/tmp /bin/ls diff --git a/plugins/sudoers/regress/sudoers/test24.json.ok b/plugins/sudoers/regress/sudoers/test24.json.ok new file mode 100644 index 0000000..964359c --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test24.json.ok @@ -0,0 +1,61 @@ +{ + "Defaults": [ + { + "Options": [ + { "runcwd": "~" } + ] + }, + { + "Options": [ + { "runchroot": "/" } + ] + } + ], + "User_Specs": [ + { + "User_List": [ + { "username": "user0" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + "runchroot": "/var/www", + "runcwd": "/htdocs" + ], + "Commands": [ + { "command": "/bin/ksh" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + "runcwd": "~root" + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + }, + { + "Options": [ + "runcwd": "/tmp" + ], + "Commands": [ + { "command": "/bin/ls" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test24.ldif.ok b/plugins/sudoers/regress/sudoers/test24.ldif.ok new file mode 100644 index 0000000..aeb5f7a --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test24.ldif.ok @@ -0,0 +1,39 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: runcwd=~ +sudoOption: runchroot=/ + +dn: cn=user0,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user0 +sudoUser: user0 +sudoHost: ALL +sudoOption: runchroot=/var/www +sudoOption: runcwd=/htdocs +sudoCommand: /bin/ksh +sudoOrder: 1 + +dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1 +sudoUser: user1 +sudoHost: ALL +sudoOption: runcwd=~root +sudoCommand: /usr/bin/id +sudoOrder: 2 + +dn: cn=user1_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1_1 +sudoUser: user1 +sudoHost: ALL +sudoOption: runcwd=/tmp +sudoCommand: /bin/ls +sudoOrder: 3 + diff --git a/plugins/sudoers/regress/sudoers/test24.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test24.ldif2sudo.ok new file mode 100644 index 0000000..4c09657 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test24.ldif2sudo.ok @@ -0,0 +1,8 @@ +Defaults runcwd=~ +Defaults runchroot=/ + +# sudoRole user0 +user0 ALL = CHROOT=/var/www CWD=/htdocs /bin/ksh + +# sudoRole user1, user1_1 +user1 ALL = CWD=~root /usr/bin/id, CWD=/tmp /bin/ls diff --git a/plugins/sudoers/regress/sudoers/test24.out.ok b/plugins/sudoers/regress/sudoers/test24.out.ok new file mode 100644 index 0000000..530b700 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test24.out.ok @@ -0,0 +1,7 @@ +Parses OK + +Defaults runcwd=~ +Defaults runchroot=/ + +user0 ALL = CHROOT=/var/www CWD=/htdocs /bin/ksh +user1 ALL = CWD=~root /usr/bin/id, CWD=/tmp /bin/ls diff --git a/plugins/sudoers/regress/sudoers/test24.sudo.ok b/plugins/sudoers/regress/sudoers/test24.sudo.ok new file mode 100644 index 0000000..8203b0c --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test24.sudo.ok @@ -0,0 +1,6 @@ +Defaults runcwd=~ +Defaults runchroot=/ + +user0 ALL = CHROOT=/var/www CWD=/htdocs /bin/ksh + +user1 ALL = CWD=~root /usr/bin/id, CWD=/tmp /bin/ls diff --git a/plugins/sudoers/regress/sudoers/test24.toke.ok b/plugins/sudoers/regress/sudoers/test24.toke.ok new file mode 100644 index 0000000..47842f4 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test24.toke.ok @@ -0,0 +1,6 @@ +# +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +# +WORD(6) ALL = CHROOT = WORD(5) CWD = WORD(5) COMMAND +WORD(6) ALL = CWD = WORD(5) COMMAND , CWD = WORD(5) COMMAND diff --git a/plugins/sudoers/regress/sudoers/test3.in b/plugins/sudoers/regress/sudoers/test3.in new file mode 100644 index 0000000..82fcd83 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test3.in @@ -0,0 +1,6 @@ +# Test whitespace in User_List as part of a per-user Defaults entry +User_Alias FOO = foo, bar +Defaults:FOO env_reset +Defaults:foo,bar env_reset +Defaults:foo,\ bar env_reset +Defaults:foo, bar env_reset diff --git a/plugins/sudoers/regress/sudoers/test3.json.ok b/plugins/sudoers/regress/sudoers/test3.json.ok new file mode 100644 index 0000000..fc69eb1 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test3.json.ok @@ -0,0 +1,45 @@ +{ + "Defaults": [ + { + "Binding": [ + { "useralias": "FOO" } + ], + "Options": [ + { "env_reset": true } + ] + }, + { + "Binding": [ + { "username": "foo" }, + { "username": "bar" } + ], + "Options": [ + { "env_reset": true } + ] + }, + { + "Binding": [ + { "username": "foo" }, + { "username": " bar" } + ], + "Options": [ + { "env_reset": true } + ] + }, + { + "Binding": [ + { "username": "foo" }, + { "username": "bar" } + ], + "Options": [ + { "env_reset": true } + ] + } + ], + "User_Aliases": { + "FOO": [ + { "username": "foo" }, + { "username": "bar" } + ] + } +} diff --git a/plugins/sudoers/regress/sudoers/test3.ldif.ok b/plugins/sudoers/regress/sudoers/test3.ldif.ok new file mode 100644 index 0000000..783cde5 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test3.ldif.ok @@ -0,0 +1,12 @@ +# Unable to translate stdin:3:23: +# Defaults:foo, bar env_reset + +# Unable to translate stdin:4:27: +# Defaults:foo, bar env_reset + +# Unable to translate stdin:5:29: +# Defaults:foo, " bar" env_reset + +# Unable to translate stdin:6:28: +# Defaults:foo, bar env_reset + diff --git a/plugins/sudoers/regress/sudoers/test3.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test3.ldif2sudo.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test3.out.ok b/plugins/sudoers/regress/sudoers/test3.out.ok new file mode 100644 index 0000000..7f620c4 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test3.out.ok @@ -0,0 +1,8 @@ +Parses OK + +Defaults:FOO env_reset +Defaults:foo, bar env_reset +Defaults:foo, " bar" env_reset +Defaults:foo, bar env_reset + +User_Alias FOO = foo, bar diff --git a/plugins/sudoers/regress/sudoers/test3.toke.ok b/plugins/sudoers/regress/sudoers/test3.toke.ok new file mode 100644 index 0000000..028f333 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test3.toke.ok @@ -0,0 +1,6 @@ +# +USERALIAS ALIAS = WORD(6) , WORD(6) +DEFAULTS_USER ALIAS DEFVAR +DEFAULTS_USER WORD(6) , WORD(6) DEFVAR +DEFAULTS_USER WORD(6) , WORD(6) DEFVAR +DEFAULTS_USER WORD(6) , WORD(6) DEFVAR diff --git a/plugins/sudoers/regress/sudoers/test4.in b/plugins/sudoers/regress/sudoers/test4.in new file mode 100644 index 0000000..b8df454 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test4.in @@ -0,0 +1,7 @@ +# Test line continuation with anchored matches +User_Alias FOO = foo \ +: BAR = bar + +# This used to pass for sudo < 1.8.1 (though it should not have) +User_Alias FOO = foo \ +User_Alias BAR = bar diff --git a/plugins/sudoers/regress/sudoers/test4.json.ok b/plugins/sudoers/regress/sudoers/test4.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test4.ldif.ok b/plugins/sudoers/regress/sudoers/test4.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test4.out.ok b/plugins/sudoers/regress/sudoers/test4.out.ok new file mode 100644 index 0000000..de27db3 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test4.out.ok @@ -0,0 +1,3 @@ + +User_Alias BAR = bar +User_Alias FOO = foo diff --git a/plugins/sudoers/regress/sudoers/test4.toke.ok b/plugins/sudoers/regress/sudoers/test4.toke.ok new file mode 100644 index 0000000..307945f --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test4.toke.ok @@ -0,0 +1,5 @@ +# +USERALIAS ALIAS = WORD(6) : ALIAS = WORD(6) + +# +USERALIAS ALIAS = WORD(6) <*> ERROR ALIAS = WORD(6) diff --git a/plugins/sudoers/regress/sudoers/test5.in b/plugins/sudoers/regress/sudoers/test5.in new file mode 100644 index 0000000..354f589 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test5.in @@ -0,0 +1,3 @@ +# Test empty string in User_Alias and Command_Spec +User_Alias FOO = "" +"" ALL = ALL diff --git a/plugins/sudoers/regress/sudoers/test5.json.ok b/plugins/sudoers/regress/sudoers/test5.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test5.ldif.ok b/plugins/sudoers/regress/sudoers/test5.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test5.out.ok b/plugins/sudoers/regress/sudoers/test5.out.ok new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test5.out.ok @@ -0,0 +1 @@ + diff --git a/plugins/sudoers/regress/sudoers/test5.toke.ok b/plugins/sudoers/regress/sudoers/test5.toke.ok new file mode 100644 index 0000000..fb8152f --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test5.toke.ok @@ -0,0 +1,3 @@ +# +USERALIAS ALIAS = BEGINSTR ENDSTR <*> ERROR +BEGINSTR ENDSTR <*> ERROR ALL = ALL diff --git a/plugins/sudoers/regress/sudoers/test6.in b/plugins/sudoers/regress/sudoers/test6.in new file mode 100644 index 0000000..e804571 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test6.in @@ -0,0 +1,15 @@ +# Check that uids work in per-user and per-runas Defaults +Defaults:#123 set_home +Defaults>#123 set_home +Defaults:"#123" set_home +Defaults>"#123" set_home + +# Check that uids work in a Command_Spec +#0 ALL = ALL +#0 ALL = (#0 : #0) ALL +"#0" ALL = ALL +"#0" ALL = ("#0" : "#0") ALL + +# Check that gids work in a Command_Spec +%#0 ALL = ALL +"%#0" ALL = ALL diff --git a/plugins/sudoers/regress/sudoers/test6.json.ok b/plugins/sudoers/regress/sudoers/test6.json.ok new file mode 100644 index 0000000..be1f80f --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test6.json.ok @@ -0,0 +1,158 @@ +{ + "Defaults": [ + { + "Binding": [ + { "userid": 123 } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "userid": 123 } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "userid": 123 } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "userid": 123 } + ], + "Options": [ + { "set_home": true } + ] + } + ], + "User_Specs": [ + { + "User_List": [ + { "userid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "userid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "userid": 0 } + ], + "runasgroups": [ + { "usergroup": "#0" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "userid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "userid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "userid": 0 } + ], + "runasgroups": [ + { "usergroup": "#0" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "usergid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "usergid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test6.ldif.ok b/plugins/sudoers/regress/sudoers/test6.ldif.ok new file mode 100644 index 0000000..046b334 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test6.ldif.ok @@ -0,0 +1,70 @@ +# Unable to translate stdin:2:23: +# Defaults:#123 set_home + +# Unable to translate stdin:3:23: +# Defaults>#123 set_home + +# Unable to translate stdin:4:25: +# Defaults:#123 set_home + +# Unable to translate stdin:5:25: +# Defaults>#123 set_home + +dn: cn=\#0,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \#0 +sudoUser: #0 +sudoHost: ALL +sudoCommand: ALL +sudoOrder: 1 + +dn: cn=\#0_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \#0_1 +sudoUser: #0 +sudoHost: ALL +sudoRunAsUser: #0 +sudoRunAsGroup: #0 +sudoCommand: ALL +sudoOrder: 2 + +dn: cn=\#0_2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \#0_2 +sudoUser: #0 +sudoHost: ALL +sudoCommand: ALL +sudoOrder: 3 + +dn: cn=\#0_3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \#0_3 +sudoUser: #0 +sudoHost: ALL +sudoRunAsUser: #0 +sudoRunAsGroup: #0 +sudoCommand: ALL +sudoOrder: 4 + +dn: cn=%\#0,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %\#0 +sudoUser: %#0 +sudoHost: ALL +sudoCommand: ALL +sudoOrder: 5 + +dn: cn=%\#0_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %\#0_1 +sudoUser: %#0 +sudoHost: ALL +sudoCommand: ALL +sudoOrder: 6 + diff --git a/plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok b/plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok new file mode 100644 index 0000000..bfe40bb --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok @@ -0,0 +1,5 @@ +# sudoRole #0, #0_1, #0_2, #0_3 +#0 ALL = ALL, (#0 : #0) ALL, ALL, (#0 : #0) ALL + +# sudoRole %#0, %#0_1 +%#0 ALL = ALL, ALL diff --git a/plugins/sudoers/regress/sudoers/test6.out.ok b/plugins/sudoers/regress/sudoers/test6.out.ok new file mode 100644 index 0000000..73b8fe0 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test6.out.ok @@ -0,0 +1,13 @@ +Parses OK + +Defaults:#123 set_home +Defaults>#123 set_home +Defaults:#123 set_home +Defaults>#123 set_home + +#0 ALL = ALL +#0 ALL = (#0 : #0) ALL +#0 ALL = ALL +#0 ALL = (#0 : #0) ALL +%#0 ALL = ALL +%#0 ALL = ALL diff --git a/plugins/sudoers/regress/sudoers/test6.toke.ok b/plugins/sudoers/regress/sudoers/test6.toke.ok new file mode 100644 index 0000000..db8e1c5 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test6.toke.ok @@ -0,0 +1,15 @@ +# +DEFAULTS_USER WORD(6) DEFVAR +DEFAULTS_RUNAS WORD(6) DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_RUNAS BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR + +# +WORD(6) ALL = ALL +WORD(6) ALL = ( WORD(6) : WORD(6) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) ALL = ALL +BEGINSTR STRBODY ENDSTR WORD(4) ALL = ( BEGINSTR STRBODY ENDSTR WORD(4) : BEGINSTR STRBODY ENDSTR WORD(4) ) ALL + +# +USERGROUP ALL = ALL +BEGINSTR STRBODY ENDSTR USERGROUP ALL = ALL diff --git a/plugins/sudoers/regress/sudoers/test7.in b/plugins/sudoers/regress/sudoers/test7.in new file mode 100644 index 0000000..7b241d0 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test7.in @@ -0,0 +1,7 @@ +# These should all be syntax errors +User_Alias FOO1 = "%" +User_Alias FOO2 = "%:" +User_Alias FOO3 = "+" +User_Alias FOO4 = % +User_Alias FOO5 = %: +User_Alias FOO6 = + diff --git a/plugins/sudoers/regress/sudoers/test7.json.ok b/plugins/sudoers/regress/sudoers/test7.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test7.ldif.ok b/plugins/sudoers/regress/sudoers/test7.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test7.out.ok b/plugins/sudoers/regress/sudoers/test7.out.ok new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test7.out.ok @@ -0,0 +1 @@ + diff --git a/plugins/sudoers/regress/sudoers/test7.toke.ok b/plugins/sudoers/regress/sudoers/test7.toke.ok new file mode 100644 index 0000000..b0da147 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test7.toke.ok @@ -0,0 +1,7 @@ +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR <*> ERROR +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR <*> ERROR +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR <*> ERROR +USERALIAS ALIAS = <*> ERROR +USERALIAS ALIAS = <*> ERROR +USERALIAS ALIAS = <*> ERROR diff --git a/plugins/sudoers/regress/sudoers/test8.in b/plugins/sudoers/regress/sudoers/test8.in new file mode 100644 index 0000000..d25e834 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test8.in @@ -0,0 +1,8 @@ +# Test quoted strings +User_Alias UA1 = "xy" +User_Alias UA2 = "x\ +y" +User_Alias UA3 = x\"y + +# A newline in the middle of a string is an error +User_Alias UA4 = "x diff --git a/plugins/sudoers/regress/sudoers/test8.json.ok b/plugins/sudoers/regress/sudoers/test8.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test8.ldif.ok b/plugins/sudoers/regress/sudoers/test8.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test8.out.ok b/plugins/sudoers/regress/sudoers/test8.out.ok new file mode 100644 index 0000000..e62f97f --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test8.out.ok @@ -0,0 +1,4 @@ + +User_Alias UA1 = xy +User_Alias UA2 = xy +User_Alias UA3 = x\"y diff --git a/plugins/sudoers/regress/sudoers/test8.toke.ok b/plugins/sudoers/regress/sudoers/test8.toke.ok new file mode 100644 index 0000000..f775645 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test8.toke.ok @@ -0,0 +1,7 @@ +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = WORD(6) + +# +USERALIAS ALIAS = BEGINSTR STRBODY <*> ERROR diff --git a/plugins/sudoers/regress/sudoers/test9.in b/plugins/sudoers/regress/sudoers/test9.in new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test9.json.ok b/plugins/sudoers/regress/sudoers/test9.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test9.ldif.ok b/plugins/sudoers/regress/sudoers/test9.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/sudoers/test9.out.ok b/plugins/sudoers/regress/sudoers/test9.out.ok new file mode 100644 index 0000000..5af5c53 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test9.out.ok @@ -0,0 +1,2 @@ +Parses OK + diff --git a/plugins/sudoers/regress/sudoers/test9.toke.ok b/plugins/sudoers/regress/sudoers/test9.toke.ok new file mode 100644 index 0000000..e69de29 diff --git a/plugins/sudoers/regress/testsudoers/group b/plugins/sudoers/regress/testsudoers/group new file mode 100644 index 0000000..e2202d6 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/group @@ -0,0 +1,15 @@ +wheel:*:0:root +daemon:*:1:daemon +kmem:*:2:root +sys:*:3:root +tty:*:4:root +operator:*:5:root +bin:*:7: +wsrc:*:9: +users:*:10: +auth:*:11: +games:*:13: +staff:*:20:root +guest:*:31:root +nogroup:*:32766: +nobody:*:32767: diff --git a/plugins/sudoers/regress/testsudoers/test1.out.ok b/plugins/sudoers/regress/testsudoers/test1.out.ok new file mode 100644 index 0000000..5c292be --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test1.out.ok @@ -0,0 +1,8 @@ +Parses OK + +Entries for user root: + +ALL = ALL + host matched + +Command unmatched diff --git a/plugins/sudoers/regress/testsudoers/test1.sh b/plugins/sudoers/regress/testsudoers/test1.sh new file mode 100755 index 0000000..495f237 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test1.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# +# Test for NULL dereference with "sudo -g group" when the sudoers rule +# has no runas user or group listed. +# This is RedHat bug Bug 667103. +# + +: ${TESTSUDOERS=testsudoers} + +exec 2>&1 +$TESTSUDOERS -g bin -P ${TESTDIR}/group root id <"$TESTDIR/test 10.inc" <&1 + +echo "Testing @include of a path with escaped white space" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <<-EOF + @include $TESTDIR/test\ 10.inc +EOF + +echo "" +echo "Testing @include of a double-quoted path with white space" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <<-EOF + @include "$TESTDIR/test 10.inc" +EOF + +echo "" +echo "Testing #include of a path with escaped white space" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <<-EOF + #include $TESTDIR/test\ 10.inc +EOF + +echo "" +echo "Testing #include of a double-quoted path with white space" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <<-EOF + #include "$TESTDIR/test 10.inc" +EOF + +rm -f "$TESTDIR/test 10.inc" +exit 0 diff --git a/plugins/sudoers/regress/testsudoers/test11.out.ok b/plugins/sudoers/regress/testsudoers/test11.out.ok new file mode 100644 index 0000000..987ab65 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test11.out.ok @@ -0,0 +1,21 @@ +Testing @include with garbage after the path name + +sudoers:1:24: syntax error +@include sudoers.local womp womp + ^~~~ +testsudoers: unable to stat sudoers.local: No such file or directory + +Entries for user root: + +Command unmatched + +Testing #include with garbage after the path name + +sudoers:1:24: syntax error +#include sudoers.local womp womp + ^~~~ +testsudoers: unable to stat sudoers.local: No such file or directory + +Entries for user root: + +Command unmatched diff --git a/plugins/sudoers/regress/testsudoers/test11.sh b/plugins/sudoers/regress/testsudoers/test11.sh new file mode 100755 index 0000000..79bdadd --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test11.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# +# Test @include with garbage after the path name +# The standard error output is dup'd to the standard output. +# + +: ${TESTSUDOERS=testsudoers} + +# Avoid warnings about memory leaks when there is a syntax error +ASAN_OPTIONS=detect_leaks=0; export ASAN_OPTIONS + +MYUID=`\ls -ln $TESTDIR/test2.inc | awk '{print $3}'` +MYGID=`\ls -ln $TESTDIR/test2.inc | awk '{print $4}'` + +echo "Testing @include with garbage after the path name" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <&1 | sed 's/\(syntax error\), .*/\1/' +@include sudoers.local womp womp +EOF + +echo "" +echo "Testing #include with garbage after the path name" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <&1 | sed 's/\(syntax error\), .*/\1/' +#include sudoers.local womp womp +EOF + +exit 0 diff --git a/plugins/sudoers/regress/testsudoers/test12.out.ok b/plugins/sudoers/regress/testsudoers/test12.out.ok new file mode 100644 index 0000000..93205dd --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test12.out.ok @@ -0,0 +1,15 @@ +Testing sudoers with multiple syntax errors + +sudoers:1:20: syntax error +User_Alias A1 = u1 u2 : A2 = u3, u4 + ^~ +sudoers:3:26: syntax error +millert ALL = /fail : foo + ^ +sudoers:5:16: syntax error +root ALL = ALL bar + ^~~ + +User_Alias A1 = u1 + +millert ALL = /fail diff --git a/plugins/sudoers/regress/testsudoers/test12.sh b/plugins/sudoers/regress/testsudoers/test12.sh new file mode 100755 index 0000000..d496e3d --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test12.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# +# Test sudoers file with multiple syntax errors +# The standard error output is dup'd to the standard output. +# + +: ${TESTSUDOERS=testsudoers} + +# Avoid warnings about memory leaks when there is a syntax error +ASAN_OPTIONS=detect_leaks=0; export ASAN_OPTIONS + +echo "Testing sudoers with multiple syntax errors" +echo "" +$TESTSUDOERS -d <&1 | sed 's/\(syntax error\), .*/\1/' +User_Alias A1 = u1 u2 : A2 = u3, u4 + +millert ALL = /fail : foo + +root ALL = ALL bar +EOF diff --git a/plugins/sudoers/regress/testsudoers/test13.out.ok b/plugins/sudoers/regress/testsudoers/test13.out.ok new file mode 100644 index 0000000..bfb9f53 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test13.out.ok @@ -0,0 +1,22 @@ +Testing alias definitions using reserved words + +sudoers:1:12: syntax error, reserved word ALL used as an alias name +Cmnd_Alias ALL=ALL + ^~~ +sudoers:2:12: syntax error, reserved word CHROOT used as an alias name +Cmnd_Alias CHROOT=foo + ^~~~~~ +sudoers:3:12: syntax error, reserved word CMND_TIMEOUT used as an alias name +User_Alias TIMEOUT=foo + ^~~~~~~ +sudoers:4:13: syntax error, reserved word CWD used as an alias name +Runas_Alias CWD=bar + ^~~ +sudoers:5:12: syntax error, reserved word NOTBEFORE used as an alias name +Host_Alias NOTBEFORE=baz + ^~~~~~~~~ +sudoers:6:12: syntax error, reserved word NOTAFTER used as an alias name +Host_Alias NOTAFTER=biff + ^~~~~~~~ + +root ALL = ALL diff --git a/plugins/sudoers/regress/testsudoers/test13.sh b/plugins/sudoers/regress/testsudoers/test13.sh new file mode 100755 index 0000000..e33cbb1 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test13.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Test sudoers file with reserved words as alias names. +# The standard error output is dup'd to the standard output. +# + +: ${TESTSUDOERS=testsudoers} + +# Avoid warnings about memory leaks when there is a syntax error +ASAN_OPTIONS=detect_leaks=0; export ASAN_OPTIONS + +echo "Testing alias definitions using reserved words" +echo "" +$TESTSUDOERS -d <&1 +Cmnd_Alias ALL=ALL +Cmnd_Alias CHROOT=foo +User_Alias TIMEOUT=foo +Runas_Alias CWD=bar +Host_Alias NOTBEFORE=baz +Host_Alias NOTAFTER=biff + +root ALL = ALL +EOF + +exit 0 diff --git a/plugins/sudoers/regress/testsudoers/test14.out.ok b/plugins/sudoers/regress/testsudoers/test14.out.ok new file mode 100644 index 0000000..add1bb2 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test14.out.ok @@ -0,0 +1,18 @@ + +Testing user privilege without a newline + +Parses OK + +millert ALL = ALL + +Testing alias without a newline + +Parses OK + +Cmnd_Alias FOO = /bin/bar + +Testing Defaults without a newline + +Parses OK + +Defaults log_output diff --git a/plugins/sudoers/regress/testsudoers/test14.sh b/plugins/sudoers/regress/testsudoers/test14.sh new file mode 100755 index 0000000..7739c67 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test14.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Test entries with no trailing newline. +# + +: ${TESTSUDOERS=testsudoers} + +exec 2>&1 + +echo "" +echo "Testing user privilege without a newline" +echo "" +printf "millert ALL = ALL" | $TESTSUDOERS -d + +echo "" +echo "Testing alias without a newline" +echo "" +printf "Cmnd_Alias FOO=/bin/bar" | $TESTSUDOERS -d + +echo "" +echo "Testing Defaults without a newline" +echo "" +printf "Defaults log_output" | $TESTSUDOERS -d + +exit 0 diff --git a/plugins/sudoers/regress/testsudoers/test15.out.ok b/plugins/sudoers/regress/testsudoers/test15.out.ok new file mode 100644 index 0000000..ca02857 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test15.out.ok @@ -0,0 +1,17 @@ +Testing @include of a file with a missing newline + +Parses OK + +Entries for user root: + +ALL = /usr/bin/id + host matched + runas matched + cmnd unmatched + +ALL = ALL + host matched + runas matched + cmnd allowed + +Command allowed diff --git a/plugins/sudoers/regress/testsudoers/test15.sh b/plugins/sudoers/regress/testsudoers/test15.sh new file mode 100755 index 0000000..a4596cd --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test15.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Test @include of a file with a missing newline +# + +: ${TESTSUDOERS=testsudoers} + +# Create test file +TESTDIR="`pwd`/regress/testsudoers" +printf "root ALL = ALL" >"$TESTDIR/test15.inc" + +MYUID=`\ls -lnd "$TESTDIR/test15.inc" | awk '{print $3}'` +MYGID=`\ls -lnd "$TESTDIR/test15.inc" | awk '{print $4}'` +exec 2>&1 + +echo "Testing @include of a file with a missing newline" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <<-EOF + @include $TESTDIR/test15.inc + ALL ALL = /usr/bin/id +EOF + +rm -f "$TESTDIR/test15.inc" +exit 0 diff --git a/plugins/sudoers/regress/testsudoers/test2.inc b/plugins/sudoers/regress/testsudoers/test2.inc new file mode 100644 index 0000000..52ca040 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test2.inc @@ -0,0 +1 @@ +root ALL = ALL diff --git a/plugins/sudoers/regress/testsudoers/test2.out.ok b/plugins/sudoers/regress/testsudoers/test2.out.ok new file mode 100644 index 0000000..661f22e --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test2.out.ok @@ -0,0 +1,25 @@ +Testing @include + +Parses OK + +Entries for user root: + +ALL = ALL + host matched + runas matched + cmnd allowed + +Command allowed + +Testing #include + +Parses OK + +Entries for user root: + +ALL = ALL + host matched + runas matched + cmnd allowed + +Command allowed diff --git a/plugins/sudoers/regress/testsudoers/test2.sh b/plugins/sudoers/regress/testsudoers/test2.sh new file mode 100755 index 0000000..0b0b3f8 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test2.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Test @include facility +# + +: ${TESTSUDOERS=testsudoers} + +MYUID=`\ls -ln $TESTDIR/test2.inc | awk '{print $3}'` +MYGID=`\ls -ln $TESTDIR/test2.inc | awk '{print $4}'` +exec 2>&1 + +echo "Testing @include" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <"$TESTDIR/test3.d/root" <<-EOF + root ALL = ALL +EOF + +MYUID=`\ls -lnd $TESTDIR/test3.d | awk '{print $3}'` +MYGID=`\ls -lnd $TESTDIR/test3.d | awk '{print $4}'` +exec 2>&1 + +echo "Testing @includedir of an unquoted path" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <<-EOF + @includedir $TESTDIR/test3.d +EOF + +echo "" +echo "Testing @includedir of a double-quoted path" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <<-EOF + @includedir "$TESTDIR/test3.d" +EOF + +echo "" +echo "Testing #includedir of an unquoted path" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <<-EOF + #includedir $TESTDIR/test3.d +EOF + +echo "" +echo "Testing #includedir of a double-quoted path" +echo "" +$TESTSUDOERS -U $MYUID -G $MYGID root id <<-EOF + #includedir "$TESTDIR/test3.d" +EOF + +rm -rf "$TESTDIR/test3.d" +exit 0 diff --git a/plugins/sudoers/regress/testsudoers/test4.out.ok b/plugins/sudoers/regress/testsudoers/test4.out.ok new file mode 100644 index 0000000..cf68da5 --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test4.out.ok @@ -0,0 +1,5 @@ +testsudoers: test2.inc should be owned by uid 1 + +Entries for user root: + +Command unmatched diff --git a/plugins/sudoers/regress/testsudoers/test4.sh b/plugins/sudoers/regress/testsudoers/test4.sh new file mode 100755 index 0000000..2ec47ce --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test4.sh @@ -0,0 +1,16 @@ +#!/bin/sh +# +# Test sudoers owner check +# + +: ${TESTSUDOERS=testsudoers} + +# Avoid warnings about memory leaks when there is a syntax error +ASAN_OPTIONS=detect_leaks=0; export ASAN_OPTIONS + +exec 2>&1 +$TESTSUDOERS -U 1 root id <"$TESTFILE" <&1 + +# Test world writable +chmod 666 $TESTFILE +$TESTSUDOERS -U $MYUID -G $MYGID root id <&1 +$TESTSUDOERS root id <&1 +$TESTSUDOERS root id <&1 + +echo "Testing @include without a newline" +echo "" +printf "@include $TESTDIR/test2.inc" | \ + $TESTSUDOERS -U $MYUID -G $MYGID root id + +echo "" +echo "Testing #include without a newline" +echo "" +printf "#include $TESTDIR/test2.inc" | \ + $TESTSUDOERS -U $MYUID -G $MYGID root id + +exit 0 diff --git a/plugins/sudoers/regress/testsudoers/test9.out.ok b/plugins/sudoers/regress/testsudoers/test9.out.ok new file mode 100644 index 0000000..3ec84bd --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test9.out.ok @@ -0,0 +1,10 @@ +Parses OK + +Entries for user root: + +ALL = ALL + host matched + runas matched + cmnd allowed + +Command allowed diff --git a/plugins/sudoers/regress/testsudoers/test9.sh b/plugins/sudoers/regress/testsudoers/test9.sh new file mode 100755 index 0000000..850bbac --- /dev/null +++ b/plugins/sudoers/regress/testsudoers/test9.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# +# Test #include facility +# + +: ${TESTSUDOERS=testsudoers} + +MYUID=`\ls -ln $TESTDIR/test2.inc | awk '{print $3}'` +MYGID=`\ls -ln $TESTDIR/test2.inc | awk '{print $4}'` +exec 2>&1 +$TESTSUDOERS -U $MYUID -G $MYGID root id <root !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec + +Defaults env_keep -= "HOME" +Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS" +Defaults env_keep += "MAIL PS1 PS2 QTDIR LANG LC_ADDRESS LC_CTYPE" + +User_Alias FULLTIMERS = millert, mikef, dowdy + +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +Host_Alias SERVERS = primary, mail, www, ns +EOF + +exit 0 diff --git a/plugins/sudoers/regress/visudo/test7.out.ok b/plugins/sudoers/regress/visudo/test7.out.ok new file mode 100644 index 0000000..e5c355c --- /dev/null +++ b/plugins/sudoers/regress/visudo/test7.out.ok @@ -0,0 +1 @@ +stdin: parsed OK diff --git a/plugins/sudoers/regress/visudo/test7.sh b/plugins/sudoers/regress/visudo/test7.sh new file mode 100755 index 0000000..b993fe7 --- /dev/null +++ b/plugins/sudoers/regress/visudo/test7.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# +# Test sudoers_locale early Defaults +# + +: ${VISUDO=visudo} + +LANG=C; export LANG +LC_NUMERIC=fr_FR.UTF-8; export LC_NUMERIC + +# First check that visudo supports non-C locales +# Note that older versions of sudo did not set the locale +# until sudoers was read so this check will fail on them. +$VISUDO -csf - >/dev/null 2>&1 <<-EOF + Defaults sudoers_locale = fr_FR.UTF-8 + Defaults passwd_timeout = "2,5" + EOF + +# Now make sure we can set passwd_timeout to a floating point value +# using a non-C locale. +if [ $? -eq 0 ]; then + $VISUDO -csf - <<-EOF + Defaults passwd_timeout = "2,5" + Defaults sudoers_locale = fr_FR.UTF-8 + EOF +else + # No support for LC_NUMERIC? + echo "stdin: parsed OK" +fi + +exit 0 diff --git a/plugins/sudoers/regress/visudo/test8.err.ok b/plugins/sudoers/regress/visudo/test8.err.ok new file mode 100644 index 0000000..3e71f62 --- /dev/null +++ b/plugins/sudoers/regress/visudo/test8.err.ok @@ -0,0 +1 @@ +visudo: stdin:1: value "2.5" is invalid for option "passwd_timeout" diff --git a/plugins/sudoers/regress/visudo/test8.out.ok b/plugins/sudoers/regress/visudo/test8.out.ok new file mode 100644 index 0000000..16ebc45 --- /dev/null +++ b/plugins/sudoers/regress/visudo/test8.out.ok @@ -0,0 +1 @@ +parse error in stdin near line 1 diff --git a/plugins/sudoers/regress/visudo/test8.sh b/plugins/sudoers/regress/visudo/test8.sh new file mode 100755 index 0000000..85bdd9f --- /dev/null +++ b/plugins/sudoers/regress/visudo/test8.sh @@ -0,0 +1,32 @@ +#!/bin/sh +# +# Test sudoers_locale early Defaults +# + +: ${VISUDO=visudo} + +LANG=C; export LANG +LC_NUMERIC=fr_FR.UTF-8; export LC_NUMERIC + +# First check that visudo supports non-C locales +# Note that older versions of sudo did not set the locale +# until sudoers was read so this check will fail on them. +$VISUDO -csf - >/dev/null 2>&1 <<-EOF + Defaults sudoers_locale = fr_FR.UTF-8 + Defaults passwd_timeout = "2,5" + EOF + +# Now make sure we can set passwd_timeout to a floating point value +# using a non-C locale. +if [ $? -eq 0 ]; then + $VISUDO -csf - <<-EOF + Defaults passwd_timeout = "2.5" + Defaults sudoers_locale = fr_FR.UTF-8 + EOF +else + # No support for LC_NUMERIC? + echo "parse error in stdin near line 1" + echo 'visudo: stdin:1: value "2.5" is invalid for option "passwd_timeout"' 1>&2 +fi + +exit 0 diff --git a/plugins/sudoers/regress/visudo/test9.out.ok b/plugins/sudoers/regress/visudo/test9.out.ok new file mode 100644 index 0000000..e5c355c --- /dev/null +++ b/plugins/sudoers/regress/visudo/test9.out.ok @@ -0,0 +1 @@ +stdin: parsed OK diff --git a/plugins/sudoers/regress/visudo/test9.sh b/plugins/sudoers/regress/visudo/test9.sh new file mode 100755 index 0000000..175ad6e --- /dev/null +++ b/plugins/sudoers/regress/visudo/test9.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# +# Test IP and network address in host-based Defaults statements +# Bugzilla #766 +# + +: ${VISUDO=visudo} + +$VISUDO -cf - <<-EOF + Defaults@127.0.0.1 !authenticate + Defaults@10.0.0.0/8 !always_set_home + EOF + +exit 0 diff --git a/plugins/sudoers/set_perms.c b/plugins/sudoers/set_perms.c new file mode 100644 index 0000000..31e5f66 --- /dev/null +++ b/plugins/sudoers/set_perms.c @@ -0,0 +1,1593 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1994-1996, 1998-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#ifdef _AIX +# include +#endif +#include +#include +#include + +#include "sudoers.h" + +/* + * Prototypes + */ +#if defined(HAVE_SETRESUID) || defined(HAVE_SETREUID) || defined(HAVE_SETEUID) +static struct gid_list *runas_setgroups(void); +#endif + +/* + * We keep track of the current permisstions and use a stack to restore + * the old permissions. A depth of 16 is overkill. + */ +struct perm_state { + uid_t ruid; + uid_t euid; +#if defined(HAVE_SETRESUID) || defined(ID_SAVED) + uid_t suid; +#endif + gid_t rgid; + gid_t egid; +#if defined(HAVE_SETRESUID) || defined(ID_SAVED) + gid_t sgid; +#endif + struct gid_list *gidlist; +}; + +#define PERM_STACK_MAX 16 +static struct perm_state perm_stack[PERM_STACK_MAX]; +static int perm_stack_depth = 0; + +#undef ID +#define ID(x) (state->x == ostate->x ? (uid_t)-1 : state->x) +#undef OID +#define OID(x) (ostate->x == state->x ? (uid_t)-1 : ostate->x) + +bool +rewind_perms(void) +{ + debug_decl(rewind_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth != 0) { + while (perm_stack_depth > 1) { + if (!restore_perms()) + debug_return_bool(false); + } + sudo_gidlist_delref(perm_stack[0].gidlist); + } + + debug_return_bool(true); +} + +#if defined(HAVE_SETRESUID) + +#define UID_CHANGED (state->ruid != ostate->ruid || state->euid != ostate->euid || state->suid != ostate->suid) +#define GID_CHANGED (state->rgid != ostate->rgid || state->egid != ostate->egid || state->sgid != ostate->sgid) + +/* + * Set real and effective and saved uids and gids based on perm. + * We always retain a saved uid of 0 unless we are headed for an exec(). + * We only flip the effective gid since it only changes for PERM_SUDOERS. + * This version of set_perms() works fine with the "stay_setuid" option. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ +#ifdef HAVE_GETRESUID + if (getresuid(&state->ruid, &state->euid, &state->suid)) { + errstr = "PERM_INITIAL: getresuid"; + goto bad; + + } + if (getresgid(&state->rgid, &state->egid, &state->sgid)) { + errstr = "PERM_INITIAL: getresgid"; + goto bad; + } +#else + state->ruid = getuid(); + state->euid = geteuid(); + state->suid = state->euid; /* in case we are setuid */ + + state->rgid = getgid(); + state->egid = getegid(); + state->sgid = state->egid; /* in case we are setgid */ +#endif + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, euid: %d, suid: %d, rgid: %d, egid: %d, sgid: %d", + __func__, (int)state->ruid, (int)state->euid, (int)state->suid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + break; + + case PERM_ROOT: + state->ruid = ROOT_UID; + state->euid = ROOT_UID; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + state->rgid = ostate->rgid; + state->egid = ROOT_GID; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + errstr = N_("unable to change to root gid"); + goto bad; + } + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + + case PERM_USER: + state->rgid = ostate->rgid; + state->egid = user_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setresgid(%d, %d, %d)", + (int)ID(rgid), (int)ID(egid), (int)ID(sgid)); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + break; + + case PERM_FULL_USER: + /* headed for exec() */ + state->rgid = user_gid; + state->egid = user_gid; + state->sgid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setresgid(%d, %d, %d)", + (int)ID(rgid), (int)ID(egid), (int)ID(sgid)); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + state->suid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + break; + + case PERM_RUNAS: + state->rgid = ostate->rgid; + state->egid = runas_gr ? runas_gr->gr_gid : runas_pw->pw_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + errstr = N_("unable to change to runas gid"); + goto bad; + } + state->gidlist = runas_setgroups(); + if (state->gidlist == NULL) { + errstr = N_("unable to set runas group vector"); + goto bad; + } + state->ruid = ostate->ruid; + state->euid = runas_pw ? runas_pw->pw_uid : user_uid; + state->suid = ostate->suid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + errstr = N_("unable to change to runas uid"); + goto bad; + } + break; + + case PERM_SUDOERS: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + + /* assumes euid == ROOT_UID, ruid == user */ + state->rgid = ostate->rgid; + state->egid = sudoers_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + errstr = N_("unable to change to sudoers gid"); + goto bad; + } + + state->ruid = ROOT_UID; + /* + * If sudoers_uid == ROOT_UID and sudoers_mode is group readable + * we use a non-zero uid in order to avoid NFS lossage. + * Using uid 1 is a bit bogus but should work on all OS's. + */ + if (sudoers_uid == ROOT_UID && (sudoers_mode & S_IRGRP)) + state->euid = 1; + else + state->euid = sudoers_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + break; + + case PERM_TIMESTAMP: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = ostate->egid; + state->sgid = ostate->sgid; + state->ruid = ROOT_UID; + state->euid = timestamp_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_TIMESTAMP: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +bool +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth < 2) { + sudo_warnx("%s", U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d, %d, %d] -> [%d, %d, %d]", + __func__, (int)state->ruid, (int)state->euid, (int)state->suid, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d, %d, %d] -> [%d, %d, %d]", + __func__, (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid); + + /* XXX - more cases here where euid != ruid */ + if (OID(euid) == ROOT_UID) { + if (setresuid(-1, ROOT_UID, -1)) { + sudo_warn("setresuid() [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + -1, ROOT_UID, -1); + goto bad; + } + } + if (setresgid(OID(rgid), OID(egid), OID(sgid))) { + sudo_warn("setresgid() [%d, %d, %d] -> [%d, %d, %d]", + (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)OID(rgid), (int)OID(egid), (int)OID(sgid)); + goto bad; + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + if (setresuid(OID(ruid), OID(euid), OID(suid))) { + sudo_warn("setresuid() [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + (int)OID(ruid), (int)OID(euid), (int)OID(suid)); + goto bad; + } + sudo_gidlist_delref(state->gidlist); + debug_return_bool(true); + +bad: + debug_return_bool(false); +} + +#elif defined(_AIX) && defined(ID_SAVED) + +#define UID_CHANGED (state->ruid != ostate->ruid || state->euid != ostate->euid || state->suid != ostate->suid) +#define GID_CHANGED (state->rgid != ostate->rgid || state->egid != ostate->egid || state->sgid != ostate->sgid) + +/* + * Set real and effective and saved uids and gids based on perm. + * We always retain a saved uid of 0 unless we are headed for an exec(). + * We only flip the effective gid since it only changes for PERM_SUDOERS. + * This version of set_perms() works fine with the "stay_setuid" option. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ + state->ruid = getuidx(ID_REAL); + state->euid = getuidx(ID_EFFECTIVE); + state->suid = getuidx(ID_SAVED); + state->rgid = getgidx(ID_REAL); + state->egid = getgidx(ID_EFFECTIVE); + state->sgid = getgidx(ID_SAVED); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, euid: %d, suid: %d, rgid: %d, egid: %d, sgid: %d", + __func__, (int)state->ruid, (int)state->euid, (int)state->suid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + break; + + case PERM_ROOT: + state->ruid = ROOT_UID; + state->euid = ROOT_UID; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + ROOT_UID); + goto bad; + } + state->rgid = ostate->rgid; + state->egid = ROOT_GID; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE, ROOT_GID)) { + errstr = N_("unable to change to root gid"); + goto bad; + } + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + + case PERM_USER: + state->rgid = ostate->rgid; + state->egid = user_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE, user_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setgidx(ID_EFFECTIVE, %d)", (int)user_gid); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (ostate->euid != ROOT_UID || ostate->suid != ROOT_UID) { + if (setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + ROOT_UID); + goto bad; + } + } + if (setuidx(ID_EFFECTIVE|ID_REAL, user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setuidx(ID_EFFECTIVE|ID_REAL, %d)", (int)user_uid); + goto bad; + } + break; + + case PERM_FULL_USER: + /* headed for exec() */ + state->rgid = user_gid; + state->egid = user_gid; + state->sgid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, user_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + (int)user_gid); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + state->suid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + (int)user_uid); + goto bad; + } + break; + + case PERM_RUNAS: + state->rgid = ostate->rgid; + state->egid = runas_gr ? runas_gr->gr_gid : runas_pw->pw_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE, state->egid)) { + errstr = N_("unable to change to runas gid"); + goto bad; + } + state->gidlist = runas_setgroups(); + if (state->gidlist == NULL) { + errstr = N_("unable to set runas group vector"); + goto bad; + } + state->ruid = ostate->ruid; + state->euid = runas_pw ? runas_pw->pw_uid : user_uid; + state->suid = ostate->suid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setuidx(ID_EFFECTIVE, state->euid)) { + errstr = N_("unable to change to runas uid"); + goto bad; + } + break; + + case PERM_SUDOERS: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + + /* assume euid == ROOT_UID, ruid == user */ + state->rgid = ostate->rgid; + state->egid = sudoers_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE, sudoers_gid)) { + errstr = N_("unable to change to sudoers gid"); + goto bad; + } + + state->ruid = ROOT_UID; + /* + * If sudoers_uid == ROOT_UID and sudoers_mode is group readable + * we use a non-zero uid in order to avoid NFS lossage. + * Using uid 1 is a bit bogus but should work on all OS's. + */ + if (sudoers_uid == ROOT_UID && (sudoers_mode & S_IRGRP)) + state->euid = 1; + else + state->euid = sudoers_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED) { + if (ostate->ruid != ROOT_UID || ostate->suid != ROOT_UID) { + if (setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + ROOT_UID); + goto bad; + } + } + if (setuidx(ID_EFFECTIVE, state->euid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: setuidx(ID_EFFECTIVE, %d)", (int)sudoers_uid); + goto bad; + } + } + break; + + case PERM_TIMESTAMP: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = ostate->egid; + state->sgid = ostate->sgid; + state->ruid = ROOT_UID; + state->euid = timestamp_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_TIMESTAMP: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED) { + if (ostate->ruid != ROOT_UID || ostate->suid != ROOT_UID) { + if (setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + ROOT_UID); + goto bad; + } + } + if (setuidx(ID_EFFECTIVE, timestamp_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: setuidx(ID_EFFECTIVE, %d)", + (int)timestamp_uid); + goto bad; + } + } + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +bool +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth < 2) { + sudo_warnx("%s", U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d, %d, %d] -> [%d, %d, %d]", + __func__, (int)state->ruid, (int)state->euid, (int)state->suid, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d, %d, %d] -> [%d, %d, %d]", + __func__, (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid); + + if (OID(ruid) != (uid_t)-1 || OID(euid) != (uid_t)-1 || OID(suid) != (uid_t)-1) { + if (OID(euid) == ROOT_UID) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: setuidx(ID_EFFECTIVE, %d)", + __func__, ROOT_UID); + if (setuidx(ID_EFFECTIVE, ROOT_UID)) { + sudo_warn("setuidx(ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + -1, ROOT_UID, -1); + goto bad; + } + } + if (OID(ruid) == OID(euid) && OID(euid) == OID(suid)) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + __func__, (int)OID(ruid)); + if (setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, OID(ruid))) { + sudo_warn("setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + (int)OID(ruid), (int)OID(euid), (int)OID(suid)); + goto bad; + } + } else if (OID(ruid) == (uid_t)-1 && OID(suid) == (uid_t)-1) { + /* May have already changed euid to ROOT_UID above. */ + if (OID(euid) != ROOT_UID) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setuidx(ID_EFFECTIVE, %d)", __func__, OID(euid)); + if (setuidx(ID_EFFECTIVE, OID(euid))) { + sudo_warn("setuidx(ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + (int)OID(ruid), (int)OID(euid), (int)OID(suid)); + goto bad; + } + } + } else if (OID(suid) == (uid_t)-1) { + /* Cannot set the real uid alone. */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setuidx(ID_REAL|ID_EFFECTIVE, %d)", __func__, OID(ruid)); + if (setuidx(ID_REAL|ID_EFFECTIVE, OID(ruid))) { + sudo_warn("setuidx(ID_REAL|ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + (int)OID(ruid), (int)OID(euid), (int)OID(suid)); + goto bad; + } + /* Restore the effective euid if it doesn't match the ruid. */ + if (OID(euid) != OID(ruid)) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setuidx(ID_EFFECTIVE, %d)", __func__, ostate->euid); + if (setuidx(ID_EFFECTIVE, ostate->euid)) { + sudo_warn("setuidx(ID_EFFECTIVE, %d)", (int)ostate->euid); + goto bad; + } + } + } + } + if (OID(rgid) != (gid_t)-1 || OID(egid) != (gid_t)-1 || OID(sgid) != (gid_t)-1) { + if (OID(rgid) == OID(egid) && OID(egid) == OID(sgid)) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + __func__, (int)OID(rgid)); + if (setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, OID(rgid))) { + sudo_warn("setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)OID(rgid), (int)OID(egid), (int)OID(sgid)); + goto bad; + } + } else if (OID(rgid) == (gid_t)-1 && OID(sgid) == (gid_t)-1) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: setgidx(ID_EFFECTIVE, %d)", + __func__, (int)OID(egid)); + if (setgidx(ID_EFFECTIVE, OID(egid))) { + sudo_warn("setgidx(ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)OID(rgid), (int)OID(egid), (int)OID(sgid)); + goto bad; + } + } else if (OID(sgid) == (gid_t)-1) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setgidx(ID_EFFECTIVE|ID_REAL, %d)", __func__, OID(rgid)); + if (setgidx(ID_REAL|ID_EFFECTIVE, OID(rgid))) { + sudo_warn("setgidx(ID_REAL|ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)OID(rgid), (int)OID(egid), (int)OID(sgid)); + goto bad; + } + } + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + sudo_gidlist_delref(state->gidlist); + debug_return_bool(true); + +bad: + debug_return_bool(false); +} + +#elif defined(HAVE_SETREUID) + +#define UID_CHANGED (state->ruid != ostate->ruid || state->euid != ostate->euid) +#define GID_CHANGED (state->rgid != ostate->rgid || state->egid != ostate->egid) + +/* + * Set real and effective and saved uids and gids based on perm. + * We always retain a saved uid of 0 unless we are headed for an exec(). + * We only flip the effective gid since it only changes for PERM_SUDOERS. + * This version of set_perms() works fine with the "stay_setuid" option. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ + state->ruid = getuid(); + state->euid = geteuid(); + state->rgid = getgid(); + state->egid = getegid(); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, euid: %d, rgid: %d, egid: %d", __func__, + (int)state->ruid, (int)state->euid, + (int)state->rgid, (int)state->egid); + break; + + case PERM_ROOT: + state->ruid = ROOT_UID; + state->euid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + /* + * setreuid(0, 0) may fail on some systems if euid is not already 0. + */ + if (ostate->euid != ROOT_UID) { + if (setreuid(-1, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setreuid(-1, %d)", ROOT_UID); + goto bad; + } + } + if (ostate->ruid != ROOT_UID) { + if (setreuid(ROOT_UID, -1)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setreuid(%d, -1)", ROOT_UID); + goto bad; + } + } + state->rgid = ostate->rgid; + state->egid = ROOT_GID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setregid(%d, %d)", (int)ID(rgid), (int)ID(egid)); + goto bad; + } + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + + case PERM_USER: + state->rgid = ostate->rgid; + state->egid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setregid(%d, %d)", (int)ID(rgid), (int)ID(egid)); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_USER: setgroups"; + goto bad; + } + } + state->ruid = ROOT_UID; + state->euid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setreuid(%d, %d)", (int)ID(ruid), (int)ID(euid)); + goto bad; + } + break; + + case PERM_FULL_USER: + /* headed for exec() */ + state->rgid = user_gid; + state->egid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setregid(%d, %d)", + (int)ID(rgid), (int)ID(egid)); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setreuid(%d, %d)", + (int)ID(ruid), (int)ID(euid)); + goto bad; + } + break; + + case PERM_RUNAS: + state->rgid = ostate->rgid; + state->egid = runas_gr ? runas_gr->gr_gid : runas_pw->pw_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + errstr = N_("unable to change to runas gid"); + goto bad; + } + state->gidlist = runas_setgroups(); + if (state->gidlist == NULL) { + errstr = N_("unable to set runas group vector"); + goto bad; + } + state->ruid = ROOT_UID; + state->euid = runas_pw ? runas_pw->pw_uid : user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + errstr = N_("unable to change to runas uid"); + goto bad; + } + break; + + case PERM_SUDOERS: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + + /* assume euid == ROOT_UID, ruid == user */ + state->rgid = ostate->rgid; + state->egid = sudoers_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + errstr = N_("unable to change to sudoers gid"); + goto bad; + } + + state->ruid = ROOT_UID; + /* + * If sudoers_uid == ROOT_UID and sudoers_mode is group readable + * we use a non-zero uid in order to avoid NFS lossage. + * Using uid 1 is a bit bogus but should work on all OS's. + */ + if (sudoers_uid == ROOT_UID && (sudoers_mode & S_IRGRP)) + state->euid = 1; + else + state->euid = sudoers_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: setreuid(%d, %d)", + (int)ID(ruid), (int)ID(euid)); + goto bad; + } + break; + + case PERM_TIMESTAMP: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = ostate->egid; + state->ruid = ROOT_UID; + state->euid = timestamp_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_TIMESTAMP: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: setreuid(%d, %d)", + (int)ID(ruid), (int)ID(euid)); + goto bad; + } + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +bool +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth < 2) { + sudo_warnx("%s", U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d, %d] -> [%d, %d]", + __func__, (int)state->ruid, (int)state->euid, + (int)ostate->ruid, (int)ostate->euid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d, %d] -> [%d, %d]", + __func__, (int)state->rgid, (int)state->egid, + (int)ostate->rgid, (int)ostate->egid); + + /* + * When changing euid to ROOT_UID, setreuid() may fail even if + * the ruid is ROOT_UID so call setuid() first. + */ + if (OID(euid) == ROOT_UID) { + /* setuid() may not set the saved ID unless the euid is ROOT_UID */ + if (ID(euid) != ROOT_UID) { + if (setreuid(-1, ROOT_UID) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "setreuid() [%d, %d] -> [-1, %d)", (int)state->ruid, + (int)state->euid, ROOT_UID); + } + } + if (setuid(ROOT_UID)) { + sudo_warn("setuid() [%d, %d] -> %d)", (int)state->ruid, + (int)state->euid, ROOT_UID); + goto bad; + } + } + if (setreuid(OID(ruid), OID(euid))) { + sudo_warn("setreuid() [%d, %d] -> [%d, %d]", (int)state->ruid, + (int)state->euid, (int)OID(ruid), (int)OID(euid)); + goto bad; + } + if (setregid(OID(rgid), OID(egid))) { + sudo_warn("setregid() [%d, %d] -> [%d, %d]", (int)state->rgid, + (int)state->egid, (int)OID(rgid), (int)OID(egid)); + goto bad; + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + sudo_gidlist_delref(state->gidlist); + debug_return_bool(true); + +bad: + debug_return_bool(false); +} + +#elif defined(HAVE_SETEUID) + +#define GID_CHANGED (state->rgid != ostate->rgid || state->egid != ostate->egid) + +/* + * Set real and effective uids and gids based on perm. + * We always retain a real or effective uid of ROOT_UID unless + * we are headed for an exec(). + * This version of set_perms() works fine with the "stay_setuid" option. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + /* + * Since we only have setuid() and seteuid() and semantics + * for these calls differ on various systems, we set + * real and effective uids to ROOT_UID initially to be safe. + */ + if (perm != PERM_INITIAL) { + if (ostate->euid != ROOT_UID && seteuid(ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "set_perms: seteuid(%d)", ROOT_UID); + goto bad; + } + if (ostate->ruid != ROOT_UID && setuid(ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "set_perms: setuid(%d)", ROOT_UID); + goto bad; + } + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ + state->ruid = getuid(); + state->euid = geteuid(); + state->rgid = getgid(); + state->egid = getegid(); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, euid: %d, rgid: %d, egid: %d", __func__, + (int)state->ruid, (int)state->euid, + (int)state->rgid, (int)state->egid); + break; + + case PERM_ROOT: + /* We already set ruid/euid above. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, ROOT_UID, ROOT_UID); + state->ruid = ROOT_UID; + state->euid = ROOT_UID; + state->rgid = ostate->rgid; + state->egid = ROOT_GID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, ROOT_GID, ROOT_GID); + if (GID_CHANGED && setegid(ROOT_GID)) { + errstr = N_("unable to change to root gid"); + goto bad; + } + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + + case PERM_USER: + state->egid = user_gid; + state->rgid = ostate->rgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setegid(user_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setegid(%d)", (int)user_gid); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_USER: setgroups"; + goto bad; + } + } + state->ruid = ROOT_UID; + state->euid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (seteuid(user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: seteuid(%d)", (int)user_uid); + goto bad; + } + break; + + case PERM_FULL_USER: + /* headed for exec() */ + state->rgid = user_gid; + state->egid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setgid(user_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setgid(%d)", (int)user_gid); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (setuid(user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setuid(%d)", (int)user_uid); + goto bad; + } + break; + + case PERM_RUNAS: + state->rgid = ostate->rgid; + state->egid = runas_gr ? runas_gr->gr_gid : runas_pw->pw_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setegid(state->egid)) { + errstr = N_("unable to change to runas gid"); + goto bad; + } + state->gidlist = runas_setgroups(); + if (state->gidlist == NULL) { + errstr = N_("unable to set runas group vector"); + goto bad; + } + state->ruid = ostate->ruid; + state->euid = runas_pw ? runas_pw->pw_uid : user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (seteuid(state->euid)) { + errstr = N_("unable to change to runas uid"); + goto bad; + } + break; + + case PERM_SUDOERS: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + + /* assume euid == ROOT_UID, ruid == user */ + state->rgid = ostate->rgid; + state->egid = sudoers_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setegid(sudoers_gid)) { + errstr = N_("unable to change to sudoers gid"); + goto bad; + } + + state->ruid = ROOT_UID; + /* + * If sudoers_uid == ROOT_UID and sudoers_mode is group readable + * we use a non-zero uid in order to avoid NFS lossage. + * Using uid 1 is a bit bogus but should work on all OS's. + */ + if (sudoers_uid == ROOT_UID && (sudoers_mode & S_IRGRP)) + state->euid = 1; + else + state->euid = sudoers_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (seteuid(state->euid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: seteuid(%d)", (int)state->euid); + goto bad; + } + break; + + case PERM_TIMESTAMP: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = ostate->egid; + state->ruid = ROOT_UID; + state->euid = timestamp_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_TIMESTAMP: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (seteuid(timestamp_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: seteuid(%d)", (int)timestamp_uid); + goto bad; + } + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +bool +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth < 2) { + sudo_warnx("%s", U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d, %d] -> [%d, %d]", + __func__, (int)state->ruid, (int)state->euid, + (int)ostate->ruid, (int)ostate->euid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d, %d] -> [%d, %d]", + __func__, (int)state->rgid, (int)state->egid, + (int)ostate->rgid, (int)ostate->egid); + + /* + * Since we only have setuid() and seteuid() and semantics + * for these calls differ on various systems, we set + * real and effective uids to ROOT_UID initially to be safe. + */ + if (seteuid(ROOT_UID)) { + sudo_warn("seteuid() [%d] -> [%d]", (int)state->euid, ROOT_UID); + goto bad; + } + if (setuid(ROOT_UID)) { + sudo_warn("setuid() [%d, %d] -> [%d, %d]", (int)state->ruid, ROOT_UID, + ROOT_UID, ROOT_UID); + goto bad; + } + + if (OID(egid) != (gid_t)-1 && setegid(ostate->egid)) { + sudo_warn("setegid(%d)", (int)ostate->egid); + goto bad; + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + if (OID(euid) != (uid_t)-1 && seteuid(ostate->euid)) { + sudo_warn("seteuid(%d)", (int)ostate->euid); + goto bad; + } + sudo_gidlist_delref(state->gidlist); + debug_return_bool(true); + +bad: + debug_return_bool(false); +} + +#else /* !HAVE_SETRESUID && !HAVE_SETREUID && !HAVE_SETEUID */ + +/* + * Set uids and gids based on perm via setuid() and setgid(). + * NOTE: does not support the "stay_setuid" or timestampowner options. + * Also, sudoers_uid and sudoers_gid are not used. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ + state->ruid = geteuid() == ROOT_UID ? ROOT_UID : getuid(); + state->rgid = getgid(); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, rgid: %d", __func__, (int)state->ruid, (int)state->rgid); + break; + + case PERM_ROOT: + state->ruid = ROOT_UID; + state->rgid = ROOT_GID; + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d] -> [%d]", __func__, (int)ostate->ruid, (int)state->ruid); + if (setuid(ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setuid(%d)", ROOT_UID); + goto bad; + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d] -> [%d]", __func__, (int)ostate->rgid, (int)state->rgid); + if (setgid(ROOT_GID)) { + errstr = N_("unable to change to root gid"); + goto bad; + } + break; + + case PERM_FULL_USER: + state->rgid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d] -> [%d]", __func__, (int)ostate->rgid, (int)state->rgid); + (void) setgid(user_gid); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d] -> [%d]", __func__, (int)ostate->ruid, (int)state->ruid); + if (setuid(user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setuid(%d)", (int)user_uid); + goto bad; + } + break; + + case PERM_USER: + case PERM_SUDOERS: + case PERM_RUNAS: + case PERM_TIMESTAMP: + /* Unsupported since we can't set euid. */ + state->ruid = ostate->ruid; + state->rgid = ostate->rgid; + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +bool +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS); + + if (perm_stack_depth < 2) { + sudo_warnx("%s", U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d] -> [%d]", + __func__, (int)state->ruid, (int)ostate->ruid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d] -> [%d]", + __func__, (int)state->rgid, (int)ostate->rgid); + + if (OID(rgid) != (gid_t)-1 && setgid(ostate->rgid)) { + sudo_warn("setgid(%d)", (int)ostate->rgid); + goto bad; + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + sudo_gidlist_delref(state->gidlist); + if (OID(ruid) != (uid_t)-1 && setuid(ostate->ruid)) { + sudo_warn("setuid(%d)", (int)ostate->ruid); + goto bad; + } + debug_return_bool(true); + +bad: + debug_return_bool(false); +} +#endif /* HAVE_SETRESUID || HAVE_SETREUID || HAVE_SETEUID */ + +#if defined(HAVE_SETRESUID) || defined(HAVE_SETREUID) || defined(HAVE_SETEUID) +static struct gid_list * +runas_setgroups(void) +{ + struct gid_list *gidlist; + debug_decl(runas_setgroups, SUDOERS_DEBUG_PERMS); + + gidlist = runas_getgroups(); + if (gidlist != NULL && !def_preserve_groups) { + if (sudo_setgroups(gidlist->ngids, gidlist->gids) < 0) { + sudo_gidlist_delref(gidlist); + gidlist = NULL; + } + } + debug_return_ptr(gidlist); +} +#endif /* HAVE_SETRESUID || HAVE_SETREUID || HAVE_SETEUID */ diff --git a/plugins/sudoers/solaris_audit.c b/plugins/sudoers/solaris_audit.c new file mode 100644 index 0000000..1d5786c --- /dev/null +++ b/plugins/sudoers/solaris_audit.c @@ -0,0 +1,139 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014, Oracle and/or its affiliates. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_SOLARIS_AUDIT + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "sudoers.h" +#include "solaris_audit.h" + +static adt_session_data_t *ah; /* audit session handle */ +static adt_event_data_t *event; /* event to be generated */ +static char cwd[PATH_MAX]; +static char cmdpath[PATH_MAX]; + +static int +adt_sudo_common(char *const argv[]) +{ + int argc; + + if (adt_start_session(&ah, NULL, ADT_USE_PROC_DATA) != 0) { + log_warning(SLOG_NO_STDERR, "adt_start_session"); + return -1; + } + if ((event = adt_alloc_event(ah, ADT_sudo)) == NULL) { + log_warning(SLOG_NO_STDERR, "alloc_event"); + (void) adt_end_session(ah); + return -1; + } + if ((event->adt_sudo.cwdpath = getcwd(cwd, sizeof(cwd))) == NULL) { + log_warning(SLOG_NO_STDERR, _("unable to get current working directory")); + } + + /* get the real executable name */ + if (user_cmnd != NULL) { + if (strlcpy(cmdpath, (const char *)user_cmnd, + sizeof(cmdpath)) >= sizeof(cmdpath)) { + log_warningx(SLOG_NO_STDERR, + _("truncated audit path user_cmnd: %s"), + user_cmnd); + } + } else { + if (strlcpy(cmdpath, argv[0], + sizeof(cmdpath)) >= sizeof(cmdpath)) { + log_warningx(SLOG_NO_STDERR, + _("truncated audit path argv[0]: %s"), + argv[0]); + } + } + + for (argc = 0; argv[argc] != NULL; argc++) + continue; + + event->adt_sudo.cmdpath = cmdpath; + event->adt_sudo.argc = argc - 1; + event->adt_sudo.argv = (char **)&argv[1]; + event->adt_sudo.envp = env_get(); + + return 0; +} + + +/* + * Returns 0 on success or -1 on error. + */ +int +solaris_audit_success(char *const argv[]) +{ + int rc = -1; + + if (adt_sudo_common(argv) != 0) { + return -1; + } + if (adt_put_event(event, ADT_SUCCESS, ADT_SUCCESS) != 0) { + log_warning(SLOG_NO_STDERR, "adt_put_event(ADT_SUCCESS)"); + } else { + rc = 0; + } + adt_free_event(event); + (void) adt_end_session(ah); + + return rc; +} + +/* + * Returns 0 on success or -1 on error. + */ +int +solaris_audit_failure(char *const argv[], const char *errmsg) +{ + int rc = -1; + + if (adt_sudo_common(argv) != 0) { + return -1; + } + + event->adt_sudo.errmsg = (char *)errmsg; + if (adt_put_event(event, ADT_FAILURE, ADT_FAIL_VALUE_PROGRAM) != 0) { + log_warning(SLOG_NO_STDERR, "adt_put_event(ADT_FAILURE)"); + } else { + rc = 0; + } + adt_free_event(event); + (void) adt_end_session(ah); + + return rc; +} + +#endif /* HAVE_SOLARIS_AUDIT */ diff --git a/plugins/sudoers/solaris_audit.h b/plugins/sudoers/solaris_audit.h new file mode 100644 index 0000000..c323f99 --- /dev/null +++ b/plugins/sudoers/solaris_audit.h @@ -0,0 +1,25 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014, Oracle and/or its affiliates. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_SOLARIS_AUDIT_H +#define SUDOERS_SOLARIS_AUDIT_H + +int solaris_audit_success(char *const argv[]); +int solaris_audit_failure(char *const argv[], const char *errmsg); + +#endif /* SUDOERS_SOLARIS_AUDIT_H */ diff --git a/plugins/sudoers/sssd.c b/plugins/sudoers/sssd.c new file mode 100644 index 0000000..4455327 --- /dev/null +++ b/plugins/sudoers/sssd.c @@ -0,0 +1,801 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2003-2020 Todd C. Miller + * Copyright (c) 2011 Daniel Kopecek + * + * This code is derived from software contributed by Aaron Spangler. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_SSSD + +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#include "sudoers.h" +#include "sudo_lbuf.h" +#include "sudo_ldap.h" +#include "sudo_dso.h" + +/* SSSD <--> SUDO interface - do not change */ +struct sss_sudo_attr { + char *name; + char **values; + unsigned int num_values; +}; + +struct sss_sudo_rule { + unsigned int num_attrs; + struct sss_sudo_attr *attrs; +}; + +struct sss_sudo_result { + unsigned int num_rules; + struct sss_sudo_rule *rules; +}; + +typedef int (*sss_sudo_send_recv_t)(uid_t, const char*, const char*, + uint32_t*, struct sss_sudo_result**); + +typedef int (*sss_sudo_send_recv_defaults_t)(uid_t, const char*, uint32_t*, + char**, struct sss_sudo_result**); + +typedef void (*sss_sudo_free_result_t)(struct sss_sudo_result*); + +typedef int (*sss_sudo_get_values_t)(struct sss_sudo_rule*, const char*, + char***); + +typedef void (*sss_sudo_free_values_t)(char**); + +/* sudo_nss handle */ +struct sudo_sss_handle { + char *domainname; + char *ipa_host; + char *ipa_shost; + struct passwd *pw; + void *ssslib; + struct sudoers_parse_tree parse_tree; + sss_sudo_send_recv_t fn_send_recv; + sss_sudo_send_recv_defaults_t fn_send_recv_defaults; + sss_sudo_free_result_t fn_free_result; + sss_sudo_get_values_t fn_get_values; + sss_sudo_free_values_t fn_free_values; +}; + +static int +get_ipa_hostname(char **shostp, char **lhostp) +{ + size_t linesize = 0; + char *lhost = NULL; + char *shost = NULL; + char *line = NULL; + int ret = false; + ssize_t len; + FILE *fp; + debug_decl(get_ipa_hostname, SUDOERS_DEBUG_SSSD); + + fp = fopen(_PATH_SSSD_CONF, "r"); + if (fp != NULL) { + while ((len = getdelim(&line, &linesize, '\n', fp)) != -1) { + char *cp = line; + + /* Trim trailing and leading spaces. */ + while (len > 0 && isspace((unsigned char)line[len - 1])) + line[--len] = '\0'; + while (isspace((unsigned char)*cp)) + cp++; + + /* + * Match ipa_hostname = foo + * Note: currently ignores the domain (XXX) + */ + if (strncmp(cp, "ipa_hostname", 12) == 0) { + cp += 12; + /* Trim " = " after "ipa_hostname" */ + while (isblank((unsigned char)*cp)) + cp++; + if (*cp++ != '=') + continue; + while (isblank((unsigned char)*cp)) + cp++; + /* Ignore empty value */ + if (*cp == '\0') + continue; + lhost = strdup(cp); + if (lhost != NULL && (cp = strchr(lhost, '.')) != NULL) { + shost = strndup(lhost, (size_t)(cp - lhost)); + } else { + shost = lhost; + } + if (shost != NULL && lhost != NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "ipa_hostname %s overrides %s", lhost, user_host); + *shostp = shost; + *lhostp = lhost; + ret = true; + } else { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + free(shost); + free(lhost); + ret = -1; + } + break; + } + } + fclose(fp); + free(line); + } + debug_return_int(ret); +} + +/* + * SSSD doesn't handle netgroups, we have to ensure they are correctly filtered + * in sudo. The rules may contain mixed sudoUser specification so we have to + * check not only for netgroup membership but also for user and group matches. + * Otherwise, a netgroup non-match could override a user/group match. + */ +static bool +sudo_sss_check_user(struct sudo_sss_handle *handle, struct sss_sudo_rule *rule) +{ + const char *host = handle->ipa_host ? handle->ipa_host : user_runhost; + const char *shost = handle->ipa_shost ? handle->ipa_shost : user_srunhost; + char **val_array; + int i, ret = false; + debug_decl(sudo_sss_check_user, SUDOERS_DEBUG_SSSD); + + if (rule == NULL) + debug_return_bool(false); + + switch (handle->fn_get_values(rule, "sudoUser", &val_array)) { + case 0: + break; + case ENOENT: + sudo_debug_printf(SUDO_DEBUG_INFO, "No result."); + debug_return_bool(false); + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, + "handle->fn_get_values(sudoUser): != 0"); + debug_return_bool(false); + } + + /* Walk through sudoUser values. */ + for (i = 0; val_array[i] != NULL && !ret; ++i) { + const char *val = val_array[i]; + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "val[%d]=%s", i, val); + switch (*val) { + case '+': + /* Netgroup spec found, check membership. */ + if (netgr_matches(val, def_netgroup_tuple ? host : NULL, + def_netgroup_tuple ? shost : NULL, handle->pw->pw_name)) { + ret = true; + } + break; + case '%': + /* User group found, check membership. */ + if (usergr_matches(val, handle->pw->pw_name, handle->pw)) { + ret = true; + } + break; + default: + /* Not a netgroup or user group. */ + if (strcmp(val, "ALL") == 0 || + userpw_matches(val, handle->pw->pw_name, handle->pw)) { + ret = true; + } + break; + } + sudo_debug_printf(SUDO_DEBUG_DIAG, + "sssd/ldap sudoUser '%s' ... %s (%s)", val, + ret ? "MATCH!" : "not", handle->pw->pw_name); + } + handle->fn_free_values(val_array); + debug_return_bool(ret); +} + +static char * +val_array_iter(void **vp) +{ + char **val_array = *vp; + + *vp = val_array + 1; + + return *val_array; +} + +/* + * Wrapper for sudo_ldap_role_to_priv() that takes an sss rule.. + * Returns a struct privilege on success or NULL on failure. + */ +static struct privilege * +sss_rule_to_priv(struct sudo_sss_handle *handle, struct sss_sudo_rule *rule, + int *rc_out) +{ + char **cmnds = NULL, **runasusers = NULL, **runasgroups = NULL; + char **opts = NULL, **notbefore = NULL, **notafter = NULL; + char **hosts = NULL, **cn_array = NULL, *cn = NULL; + struct privilege *priv = NULL; + int rc; + debug_decl(sss_rule_to_priv, SUDOERS_DEBUG_SSSD); + + /* Ignore sudoRole without sudoCommand or sudoHost. */ + rc = handle->fn_get_values(rule, "sudoCommand", &cmnds); + if (rc != 0) + goto cleanup; + rc = handle->fn_get_values(rule, "sudoHost", &hosts); + if (rc != 0) + goto cleanup; + + /* Get the entry's dn for long format printing. */ + rc = handle->fn_get_values(rule, "cn", &cn_array); + if (rc != 0) + goto cleanup; + cn = cn_array[0]; + + /* Get sudoRunAsUser / sudoRunAs */ + rc = handle->fn_get_values(rule, "sudoRunAsUser", &runasusers); + switch (rc) { + case 0: + break; + case ENOENT: + rc = handle->fn_get_values(rule, "sudoRunAs", &runasusers); + switch (rc) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + break; + default: + goto cleanup; + } + + /* Get sudoRunAsGroup */ + rc = handle->fn_get_values(rule, "sudoRunAsGroup", &runasgroups); + switch (rc) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + + /* Get sudoNotBefore */ + rc = handle->fn_get_values(rule, "sudoNotBefore", ¬before); + switch (rc) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + + /* Get sudoNotAfter */ + rc = handle->fn_get_values(rule, "sudoNotAfter", ¬after); + switch (rc) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + + /* Parse sudoOptions. */ + rc = handle->fn_get_values(rule, "sudoOption", &opts); + switch (rc) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + + priv = sudo_ldap_role_to_priv(cn, hosts, runasusers, runasgroups, + cmnds, opts, notbefore ? notbefore[0] : NULL, + notafter ? notafter[0] : NULL, false, true, val_array_iter); + if (priv == NULL) { + rc = ENOMEM; + goto cleanup; + } + rc = 0; + +cleanup: + if (cn_array != NULL) + handle->fn_free_values(cn_array); + if (cmnds != NULL) + handle->fn_free_values(cmnds); + if (hosts != NULL) + handle->fn_free_values(hosts); + if (runasusers != NULL) + handle->fn_free_values(runasusers); + if (runasgroups != NULL) + handle->fn_free_values(runasgroups); + if (opts != NULL) + handle->fn_free_values(opts); + if (notbefore != NULL) + handle->fn_free_values(notbefore); + if (notafter != NULL) + handle->fn_free_values(notafter); + + *rc_out = rc; + + debug_return_ptr(priv); +} + +static bool +sss_to_sudoers(struct sudo_sss_handle *handle, + struct sss_sudo_result *sss_result) +{ + struct userspec *us; + struct member *m; + unsigned int i; + debug_decl(sss_to_sudoers, SUDOERS_DEBUG_SSSD); + + /* We only have a single userspec */ + if ((us = calloc(1, sizeof(*us))) == NULL) + goto oom; + us->file = rcstr_dup("SSSD"); + TAILQ_INIT(&us->users); + TAILQ_INIT(&us->privileges); + STAILQ_INIT(&us->comments); + TAILQ_INSERT_TAIL(&handle->parse_tree.userspecs, us, entries); + + /* We only include rules where the user matches. */ + if ((m = new_member_all(NULL)) == NULL) + goto oom; + TAILQ_INSERT_TAIL(&us->users, m, entries); + + /* + * Treat each rule as a separate privilege. + * + * Sssd has already sorted the rules in descending order. + * The conversion to a sudoers parse tree requires that entries be + * in *ascending* order so we we iterate from last to first. + */ + for (i = sss_result->num_rules; i-- > 0; ) { + struct sss_sudo_rule *rule = sss_result->rules + i; + struct privilege *priv; + int rc; + + /* + * We don't know whether a rule was included due to a user/group + * match or because it contained a netgroup. + */ + if (!sudo_sss_check_user(handle, rule)) + continue; + + if ((priv = sss_rule_to_priv(handle, rule, &rc)) == NULL) { + if (rc == ENOMEM) + goto oom; + continue; + } + TAILQ_INSERT_TAIL(&us->privileges, priv, entries); + } + + debug_return_bool(true); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free_userspecs(&handle->parse_tree.userspecs); + debug_return_bool(false); +} + +static bool +sudo_sss_parse_options(struct sudo_sss_handle *handle, struct sss_sudo_rule *rule, struct defaults_list *defs) +{ + int i; + char *source = NULL; + bool ret = false; + char **val_array = NULL; + char **cn_array = NULL; + debug_decl(sudo_sss_parse_options, SUDOERS_DEBUG_SSSD); + + if (rule == NULL) + debug_return_bool(true); + + switch (handle->fn_get_values(rule, "sudoOption", &val_array)) { + case 0: + break; + case ENOENT: + sudo_debug_printf(SUDO_DEBUG_INFO, "No result."); + debug_return_bool(true); + case ENOMEM: + goto oom; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, "handle->fn_get_values(sudoOption): != 0"); + debug_return_bool(false); + } + + /* Use sudoRole in place of file name in defaults. */ + if (handle->fn_get_values(rule, "cn", &cn_array) == 0) { + if (cn_array[0] != NULL) { + char *cp; + if (asprintf(&cp, "sudoRole %s", cn_array[0]) == -1) + goto oom; + source = rcstr_dup(cp); + free(cp); + if (source == NULL) + goto oom; + } + handle->fn_free_values(cn_array); + cn_array = NULL; + } + if (source == NULL) { + if ((source = rcstr_dup("sudoRole UNKNOWN")) == NULL) + goto oom; + } + + /* Walk through options, appending to defs. */ + for (i = 0; val_array[i] != NULL; i++) { + char *var, *val; + int op; + + op = sudo_ldap_parse_option(val_array[i], &var, &val); + if (!sudo_ldap_add_default(var, val, op, source, defs)) + goto oom; + } + ret = true; + goto done; + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + +done: + rcstr_delref(source); + handle->fn_free_values(val_array); + debug_return_bool(ret); +} + +static struct sss_sudo_result * +sudo_sss_result_get(struct sudo_nss *nss, struct passwd *pw) +{ + struct sudo_sss_handle *handle = nss->handle; + struct sss_sudo_result *sss_result = NULL; + uint32_t sss_error = 0, rc; + debug_decl(sudo_sss_result_get, SUDOERS_DEBUG_SSSD); + + sudo_debug_printf(SUDO_DEBUG_DIAG, " username=%s", pw->pw_name); + sudo_debug_printf(SUDO_DEBUG_DIAG, "domainname=%s", + handle->domainname ? handle->domainname : "NULL"); + + rc = handle->fn_send_recv(pw->pw_uid, pw->pw_name, + handle->domainname, &sss_error, &sss_result); + switch (rc) { + case 0: + switch (sss_error) { + case 0: + if (sss_result != NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, "Received %u rule(s)", + sss_result->num_rules); + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "Internal error: sss_result == NULL && sss_error == 0"); + debug_return_ptr(NULL); + } + break; + case ENOENT: + sudo_debug_printf(SUDO_DEBUG_INFO, "The user was not found in SSSD."); + debug_return_ptr(NULL); + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, "sss_error=%u\n", sss_error); + debug_return_ptr(NULL); + } + break; + case ENOMEM: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + FALLTHROUGH; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, "handle->fn_send_recv: rc=%d", rc); + debug_return_ptr(NULL); + } + + debug_return_ptr(sss_result); +} + +/* sudo_nss implementation */ +static int +sudo_sss_close(struct sudo_nss *nss) +{ + struct sudo_sss_handle *handle = nss->handle; + debug_decl(sudo_sss_close, SUDOERS_DEBUG_SSSD); + + if (handle != NULL) { + sudo_dso_unload(handle->ssslib); + if (handle->pw != NULL) + sudo_pw_delref(handle->pw); + free(handle->ipa_host); + if (handle->ipa_host != handle->ipa_shost) + free(handle->ipa_shost); + free_parse_tree(&handle->parse_tree); + free(handle); + nss->handle = NULL; + } + debug_return_int(0); +} + +static int +sudo_sss_open(struct sudo_nss *nss) +{ + struct sudo_sss_handle *handle; + static const char path[] = _PATH_SSSD_LIB"/libsss_sudo.so"; + debug_decl(sudo_sss_open, SUDOERS_DEBUG_SSSD); + + if (nss->handle != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with non-NULL handle %p", __func__, nss->handle); + sudo_sss_close(nss); + } + + /* Create a handle container. */ + handle = calloc(1, sizeof(struct sudo_sss_handle)); + if (handle == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(ENOMEM); + } + + /* Load symbols */ + handle->ssslib = sudo_dso_load(path, SUDO_DSO_LAZY); + if (handle->ssslib == NULL) { + const char *errstr = sudo_dso_strerror(); + sudo_warnx(U_("unable to load %s: %s"), path, + errstr ? errstr : "unknown error"); + sudo_warnx("%s", + U_("unable to initialize SSS source. Is SSSD installed on your machine?")); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_send_recv = + sudo_dso_findsym(handle->ssslib, "sss_sudo_send_recv"); + if (handle->fn_send_recv == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_send_recv"); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_send_recv_defaults = + sudo_dso_findsym(handle->ssslib, "sss_sudo_send_recv_defaults"); + if (handle->fn_send_recv_defaults == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_send_recv_defaults"); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_free_result = + sudo_dso_findsym(handle->ssslib, "sss_sudo_free_result"); + if (handle->fn_free_result == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_free_result"); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_get_values = + sudo_dso_findsym(handle->ssslib, "sss_sudo_get_values"); + if (handle->fn_get_values == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_get_values"); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_free_values = + sudo_dso_findsym(handle->ssslib, "sss_sudo_free_values"); + if (handle->fn_free_values == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_free_values"); + free(handle); + debug_return_int(EFAULT); + } + + /* + * If runhost is the same as the local host, check for ipa_hostname + * in sssd.conf and use it in preference to user_runhost. + */ + if (strcasecmp(user_runhost, user_host) == 0) { + if (get_ipa_hostname(&handle->ipa_shost, &handle->ipa_host) == -1) { + free(handle); + debug_return_int(ENOMEM); + } + } + + /* The "parse tree" contains userspecs, defaults, aliases and hostnames. */ + init_parse_tree(&handle->parse_tree, handle->ipa_host, handle->ipa_shost); + nss->handle = handle; + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "handle=%p", handle); + + debug_return_int(0); +} + +/* + * Perform query for user and host and convert to sudoers parse tree. + */ +static int +sudo_sss_query(struct sudo_nss *nss, struct passwd *pw) +{ + struct sudo_sss_handle *handle = nss->handle; + struct sss_sudo_result *sss_result = NULL; + int ret = 0; + debug_decl(sudo_sss_query, SUDOERS_DEBUG_SSSD); + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_int(-1); + } + + /* Use cached result if it matches pw. */ + if (handle->pw != NULL) { + if (pw == handle->pw) + goto done; + sudo_pw_delref(handle->pw); + handle->pw = NULL; + } + + /* Free old userspecs, if any. */ + free_userspecs(&handle->parse_tree.userspecs); + + /* Fetch list of sudoRole entries that match user and host. */ + sss_result = sudo_sss_result_get(nss, pw); + + sudo_debug_printf(SUDO_DEBUG_DIAG, + "searching SSSD/LDAP for sudoers entries for user %s, host %s", + pw->pw_name, user_runhost); + + /* Stash a ref to the passwd struct in the handle. */ + sudo_pw_addref(pw); + handle->pw = pw; + + /* Convert to sudoers parse tree if the user was found. */ + if (sss_result != NULL) { + if (!sss_to_sudoers(handle, sss_result)) { + ret = -1; + goto done; + } + } + +done: + /* Cleanup */ + handle->fn_free_result(sss_result); + if (ret == -1) { + free_userspecs(&handle->parse_tree.userspecs); + if (handle->pw != NULL) { + sudo_pw_delref(handle->pw); + handle->pw = NULL; + } + } + + sudo_debug_printf(SUDO_DEBUG_DIAG, "Done with LDAP searches"); + + debug_return_int(ret); +} + +/* + * Return the initialized (but empty) sudoers parse tree. + * The contents will be populated by the getdefs() and query() functions. + */ +static struct sudoers_parse_tree * +sudo_sss_parse(struct sudo_nss *nss) +{ + struct sudo_sss_handle *handle = nss->handle; + debug_decl(sudo_sss_parse, SUDOERS_DEBUG_SSSD); + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_ptr(NULL); + } + + debug_return_ptr(&handle->parse_tree); +} + +static int +sudo_sss_getdefs(struct sudo_nss *nss) +{ + struct sudo_sss_handle *handle = nss->handle; + struct sss_sudo_result *sss_result = NULL; + static bool cached; + uint32_t sss_error; + unsigned int i; + int rc; + debug_decl(sudo_sss_getdefs, SUDOERS_DEBUG_SSSD); + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_int(-1); + } + + /* Use cached result if present. */ + if (cached) + debug_return_int(0); + + sudo_debug_printf(SUDO_DEBUG_DIAG, "Looking for cn=defaults"); + + /* NOTE: these are global defaults, user-ID and name are not used. */ + rc = handle->fn_send_recv_defaults(sudo_user.pw->pw_uid, + sudo_user.pw->pw_name, &sss_error, &handle->domainname, &sss_result); + switch (rc) { + case 0: + break; + case ENOMEM: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + FALLTHROUGH; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, + "handle->fn_send_recv_defaults: rc=%d, sss_error=%u", rc, sss_error); + debug_return_int(-1); + } + + switch (sss_error) { + case 0: + /* Success */ + for (i = 0; i < sss_result->num_rules; ++i) { + struct sss_sudo_rule *sss_rule = sss_result->rules + i; + sudo_debug_printf(SUDO_DEBUG_DIAG, + "Parsing cn=defaults, %d/%d", i, sss_result->num_rules); + if (!sudo_sss_parse_options(handle, sss_rule, + &handle->parse_tree.defaults)) + goto bad; + } + break; + case ENOENT: + sudo_debug_printf(SUDO_DEBUG_INFO, + "No global defaults entry found in SSSD."); + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, "sss_error=%u\n", sss_error); + goto bad; + } + handle->fn_free_result(sss_result); + cached = true; + debug_return_int(0); + +bad: + handle->fn_free_result(sss_result); + debug_return_int(-1); +} + +/* sudo_nss implementation */ +struct sudo_nss sudo_nss_sss = { + { NULL, NULL }, + sudo_sss_open, + sudo_sss_close, + sudo_sss_parse, + sudo_sss_query, + sudo_sss_getdefs +}; + +#endif /* HAVE_SSSD */ diff --git a/plugins/sudoers/starttime.c b/plugins/sudoers/starttime.c new file mode 100644 index 0000000..daee5fd --- /dev/null +++ b/plugins/sudoers/starttime.c @@ -0,0 +1,308 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2012-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +/* Large files not supported by procfs.h on Solaris. */ +#if defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) +# undef _FILE_OFFSET_BITS +# undef _LARGE_FILES +#endif + +#include +#include +#if defined(HAVE_KINFO_PROC_44BSD) || defined (HAVE_KINFO_PROC_OPENBSD) || defined(HAVE_KINFO_PROC2_NETBSD) +# include +#elif defined(HAVE_KINFO_PROC_FREEBSD) +# include +# include +# include +#endif +#if defined(HAVE_PROCFS_H) +# include +#elif defined(HAVE_SYS_PROCFS_H) +# include +#endif +#ifdef HAVE_PSTAT_GETPROC +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "check.h" + +/* + * Arguments for sysctl(2) when reading the process start time. + */ +#if defined(HAVE_KINFO_PROC2_NETBSD) +# define SUDO_KERN_PROC KERN_PROC2 +# define sudo_kinfo_proc kinfo_proc2 +# define sudo_kp_namelen 6 +#elif defined(HAVE_KINFO_PROC_OPENBSD) +# define SUDO_KERN_PROC KERN_PROC +# define sudo_kinfo_proc kinfo_proc +# define sudo_kp_namelen 6 +#elif defined(HAVE_KINFO_PROC_FREEBSD) || defined(HAVE_KINFO_PROC_44BSD) +# define SUDO_KERN_PROC KERN_PROC +# define sudo_kinfo_proc kinfo_proc +# define sudo_kp_namelen 4 +#endif + +/* + * Store start time of the specified process in starttime. + */ + +#if defined(sudo_kinfo_proc) +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + struct sudo_kinfo_proc *ki_proc = NULL; + size_t size = sizeof(*ki_proc); + int mib[6], rc; + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL); + + /* + * Lookup start time for pid via sysctl. + */ + mib[0] = CTL_KERN; + mib[1] = SUDO_KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = (int)pid; + mib[4] = sizeof(*ki_proc); + mib[5] = 1; + for (;;) { + struct sudo_kinfo_proc *kp; + + size += size / 10; + if ((kp = realloc(ki_proc, size)) == NULL) { + rc = -1; + break; /* really out of memory. */ + } + ki_proc = kp; + rc = sysctl(mib, sudo_kp_namelen, ki_proc, &size, NULL, 0); + if (rc != -1 || errno != ENOMEM) + break; + } + if (rc != -1) { +#if defined(HAVE_KINFO_PROC_FREEBSD) + /* FreeBSD and Dragonfly */ + TIMEVAL_TO_TIMESPEC(&ki_proc->ki_start, starttime); +#elif defined(HAVE_KINFO_PROC_44BSD) + /* 4.4BSD and macOS */ + TIMEVAL_TO_TIMESPEC(&ki_proc->kp_proc.p_starttime, starttime); +#else + /* NetBSD and OpenBSD */ + starttime->tv_sec = ki_proc->p_ustart_sec; + starttime->tv_nsec = ki_proc->p_ustart_usec * 1000; +#endif + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: start time for %d: { %lld, %ld }", __func__, + (int)pid, (long long)starttime->tv_sec, (long)starttime->tv_nsec); + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to get start time for %d via KERN_PROC", (int)pid); + } + free(ki_proc); + + debug_return_int(rc == -1 ? -1 : 0); +} +#elif defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + struct psinfo psinfo; + char path[PATH_MAX]; + ssize_t nread; + int fd, ret = -1; + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL); + + /* Determine the start time from pr_start in /proc/pid/psinfo. */ + (void)snprintf(path, sizeof(path), "/proc/%u/psinfo", (unsigned int)pid); + if ((fd = open(path, O_RDONLY, 0)) != -1) { + nread = read(fd, &psinfo, sizeof(psinfo)); + close(fd); + if (nread == (ssize_t)sizeof(psinfo)) { + starttime->tv_sec = psinfo.pr_start.tv_sec; + starttime->tv_nsec = psinfo.pr_start.tv_nsec; + ret = 0; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: start time for %d: { %lld, %ld }", __func__, (int)pid, + (long long)starttime->tv_sec, (long)starttime->tv_nsec); + } + } + + if (ret == -1) + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to get start time for %d via %s", (int)pid, path); + debug_return_int(ret); +} +#elif defined(__linux__) +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + char path[PATH_MAX]; + char *cp, buf[1024]; + ssize_t nread; + int ret = -1; + int fd = -1; + long tps; + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL); + + /* + * Start time is in ticks per second on Linux. + */ + tps = sysconf(_SC_CLK_TCK); + if (tps == -1) + goto done; + + /* + * Determine the start time from 22nd field in /proc/pid/stat. + * Ignore /proc/self/stat if it contains embedded NUL bytes. + * XXX - refactor common code with ttyname.c? + */ + (void)snprintf(path, sizeof(path), "/proc/%u/stat", (unsigned int)pid); + if ((fd = open(path, O_RDONLY | O_NOFOLLOW)) != -1) { + cp = buf; + while ((nread = read(fd, cp, buf + sizeof(buf) - cp)) != 0) { + if (nread == -1) { + if (errno == EAGAIN || errno == EINTR) + continue; + break; + } + cp += nread; + if (cp >= buf + sizeof(buf)) + break; + } + if (nread == 0 && memchr(buf, '\0', cp - buf) == NULL) { + /* + * Field 22 is the start time (%ull). + * Since the process name at field 2 "(comm)" may include + * whitespace (including newlines), start at the last ')' found. + */ + *cp = '\0'; + cp = strrchr(buf, ')'); + if (cp != NULL) { + char *ep = cp; + int field = 1; + + while (*++ep != '\0') { + if (*ep == ' ') { + if (++field == 22) { + unsigned long long ullval; + + /* Must start with a digit (not negative). */ + if (!isdigit((unsigned char)*cp)) { + errno = EINVAL; + goto done; + } + + /* starttime is %ul in 2.4 and %ull in >= 2.6 */ + errno = 0; + ullval = strtoull(cp, &ep, 10); + if (ep == cp || *ep != ' ') { + errno = EINVAL; + goto done; + } + if (errno == ERANGE && ullval == ULLONG_MAX) + goto done; + + /* Convert from ticks to timespec */ + starttime->tv_sec = ullval / tps; + starttime->tv_nsec = + (ullval % tps) * (1000000000 / tps); + ret = 0; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: start time for %d: { %lld, %ld }", + __func__, (int)pid, + (long long)starttime->tv_sec, + (long)starttime->tv_nsec); + + goto done; + } + cp = ep + 1; + } + } + } + } + } + errno = ENOENT; + +done: + if (fd != -1) + close(fd); + if (ret == -1) + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to get start time for %d via %s", (int)pid, path); + + debug_return_int(ret); +} +#elif defined(HAVE_PSTAT_GETPROC) +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + struct pst_status pst; + int rc; + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL); + + /* + * Determine the start time from pst_start in struct pst_status. + * EOVERFLOW is not a fatal error for the fields we use. + * See the "EOVERFLOW Error" section of pstat_getvminfo(3). + */ + rc = pstat_getproc(&pst, sizeof(pst), 0, pid); + if (rc != -1 || errno == EOVERFLOW) { + starttime->tv_sec = pst.pst_start; + starttime->tv_nsec = 0; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: start time for %d: { %lld, %ld }", __func__, + (int)pid, (long long)starttime->tv_sec, (long)starttime->tv_nsec); + + debug_return_int(0); + } + + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to get start time for %d via pstat_getproc", (int)pid); + debug_return_int(-1); +} +#else +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL); + + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "process start time not supported by sudo on this system"); + debug_return_int(-1); +} +#endif diff --git a/plugins/sudoers/strlist.c b/plugins/sudoers/strlist.c new file mode 100644 index 0000000..4b633ab --- /dev/null +++ b/plugins/sudoers/strlist.c @@ -0,0 +1,92 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include "sudo_compat.h" +#include "sudo_queue.h" +#include "sudo_util.h" +#include "sudoers_debug.h" +#include "strlist.h" + +struct sudoers_string * +sudoers_string_alloc(const char *s) +{ + struct sudoers_string *cs; + debug_decl(sudoers_string_alloc, SUDOERS_DEBUG_UTIL); + + if ((cs = malloc(sizeof(*cs))) != NULL) { + if ((cs->str = strdup(s)) == NULL) { + free(cs); + cs = NULL; + } + } + + debug_return_ptr(cs); +} + +void +sudoers_string_free(struct sudoers_string *cs) +{ + if (cs != NULL) { + free(cs->str); + free(cs); + } +} + +struct sudoers_str_list * +str_list_alloc(void) +{ + struct sudoers_str_list *strlist; + debug_decl(str_list_alloc, SUDOERS_DEBUG_UTIL); + + strlist = malloc(sizeof(*strlist)); + if (strlist != NULL) { + STAILQ_INIT(strlist); + strlist->refcnt = 1; + } + + debug_return_ptr(strlist); +} + +void +str_list_free(void *v) +{ + struct sudoers_str_list *strlist = v; + struct sudoers_string *first; + debug_decl(str_list_free, SUDOERS_DEBUG_UTIL); + + if (strlist != NULL) { + if (--strlist->refcnt == 0) { + while ((first = STAILQ_FIRST(strlist)) != NULL) { + STAILQ_REMOVE_HEAD(strlist, entries); + sudoers_string_free(first); + } + free(strlist); + } + } + debug_return; +} diff --git a/plugins/sudoers/strlist.h b/plugins/sudoers/strlist.h new file mode 100644 index 0000000..022f52b --- /dev/null +++ b/plugins/sudoers/strlist.h @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_STRLIST_H +#define SUDOERS_STRLIST_H + +/* + * Simple string list with optional reference count. + */ +struct sudoers_string { + STAILQ_ENTRY(sudoers_string) entries; + char *str; +}; +struct sudoers_str_list { + struct sudoers_string *stqh_first; + struct sudoers_string **stqh_last; + unsigned int refcnt; +}; + +struct sudoers_str_list *str_list_alloc(void); +void str_list_free(void *v); +struct sudoers_string *sudoers_string_alloc(const char *s); +void sudoers_string_free(struct sudoers_string *ls); + +#endif /* SUDOERS_STRLIST_H */ diff --git a/plugins/sudoers/stubs.c b/plugins/sudoers/stubs.c new file mode 100644 index 0000000..fb1e975 --- /dev/null +++ b/plugins/sudoers/stubs.c @@ -0,0 +1,124 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Stub versions of functions needed by the parser. + * Required to link cvtsudoers and visudo. + */ + +#include + +#include +#include + +#include +#include + +#include "sudoers.h" +#include "interfaces.h" + +/* STUB */ +bool +init_envtables(void) +{ + return true; +} + +/* STUB */ +bool +user_is_exempt(void) +{ + return false; +} + +/* STUB */ +void +sudo_setspent(void) +{ + return; +} + +/* STUB */ +void +sudo_endspent(void) +{ + return; +} + +/* STUB */ +int +group_plugin_query(const char *user, const char *group, const struct passwd *pw) +{ + return false; +} + +/* STUB */ +struct interface_list * +get_interfaces(void) +{ + static struct interface_list empty = SLIST_HEAD_INITIALIZER(interfaces); + return ∅ +} + +/* STUB */ +int +set_cmnd_path(const char *runchroot) +{ + return FOUND; +} + +/* STUB */ +void +init_eventlog_config(void) +{ + return; +} + +/* + * Look up the hostname and set user_host and user_shost. + */ +void +get_hostname(void) +{ + char *cp; + debug_decl(get_hostname, SUDOERS_DEBUG_UTIL); + + if ((user_host = sudo_gethostname()) != NULL) { + if ((cp = strchr(user_host, '.'))) { + *cp = '\0'; + if ((user_shost = strdup(user_host)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + *cp = '.'; + } else { + user_shost = user_host; + } + } else { + user_host = user_shost = strdup("localhost"); + if (user_host == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + user_runhost = user_host; + user_srunhost = user_shost; + + debug_return; +} diff --git a/plugins/sudoers/sudo_ldap.h b/plugins/sudoers/sudo_ldap.h new file mode 100644 index 0000000..f0a3d0b --- /dev/null +++ b/plugins/sudoers/sudo_ldap.h @@ -0,0 +1,31 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_LDAP_H +#define SUDOERS_LDAP_H + +/* Iterators used by sudo_ldap_role_to_priv() to handle bervar ** or char ** */ +typedef char * (*sudo_ldap_iter_t)(void **); + +/* ldap_util.c */ +bool sudo_ldap_is_negated(char **valp); +bool sudo_ldap_add_default(const char *var, const char *val, int op, char *source, struct defaults_list *defs); +int sudo_ldap_parse_option(char *optstr, char **varp, char **valp); +struct privilege *sudo_ldap_role_to_priv(const char *cn, void *hosts, void *runasusers, void *runasgroups, void *cmnds, void *opts, const char *notbefore, const char *notafter, bool warnings, bool store_options, sudo_ldap_iter_t iter); + +#endif /* SUDOERS_LDAP_H */ diff --git a/plugins/sudoers/sudo_ldap_conf.h b/plugins/sudoers/sudo_ldap_conf.h new file mode 100644 index 0000000..a5a4da1 --- /dev/null +++ b/plugins/sudoers/sudo_ldap_conf.h @@ -0,0 +1,138 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_LDAP_CONF_H +#define SUDOERS_LDAP_CONF_H + +/* Macros for checking strlcpy/strlcat/sudo_ldap_value_cat return value. */ +#define CHECK_STRLCPY(d, s, l) do { \ + if (strlcpy((d), (s), (l)) >= (l)) { \ + goto overflow; \ + } \ +} while (0) +#define CHECK_STRLCAT(d, s, l) do { \ + if (strlcat((d), (s), (l)) >= (l)) { \ + goto overflow; \ + } \ +} while (0) +#define CHECK_LDAP_VCAT(d, s, l) do { \ + if (sudo_ldap_value_cat((d), (s), (l)) >= (l)) { \ + goto overflow; \ + } \ +} while (0) + +#if defined(__GNUC__) && __GNUC__ == 2 +# define DPRINTF1(fmt...) do { \ + sudo_debug_printf(SUDO_DEBUG_DIAG, fmt); \ + if (ldap_conf.debug >= 1) { \ + sudo_warnx_nodebug(fmt); \ + } \ +} while (0) +# define DPRINTF2(fmt...) do { \ + sudo_debug_printf(SUDO_DEBUG_INFO, fmt); \ + if (ldap_conf.debug >= 2) { \ + sudo_warnx_nodebug(fmt); \ + } \ +} while (0) +#else +# define DPRINTF1(...) do { \ + sudo_debug_printf(SUDO_DEBUG_DIAG, __VA_ARGS__); \ + if (ldap_conf.debug >= 1) { \ + sudo_warnx_nodebug(__VA_ARGS__); \ + } \ +} while (0) +# define DPRINTF2(...) do { \ + sudo_debug_printf(SUDO_DEBUG_INFO, __VA_ARGS__); \ + if (ldap_conf.debug >= 2) { \ + sudo_warnx_nodebug(__VA_ARGS__); \ + } \ +} while (0) +#endif + +#define CONF_BOOL 0 +#define CONF_INT 1 +#define CONF_STR 2 +#define CONF_LIST_STR 4 +#define CONF_DEREF_VAL 5 +#define CONF_REQCERT_VAL 6 + +#define SUDO_LDAP_CLEAR 0 +#define SUDO_LDAP_SSL 1 +#define SUDO_LDAP_STARTTLS 2 + +struct ldap_config_table { + const char *conf_str; /* config file string */ + int type; /* CONF_BOOL, CONF_INT, CONF_STR */ + int opt_val; /* LDAP_OPT_* (or -1 for sudo internal) */ + void *valp; /* pointer into ldap_conf */ +}; + +struct ldap_config_str { + STAILQ_ENTRY(ldap_config_str) entries; + char val[1]; +}; +STAILQ_HEAD(ldap_config_str_list, ldap_config_str); + +/* LDAP configuration structure */ +struct ldap_config { + int port; + int version; + int debug; + int ldap_debug; + int tls_checkpeer; + int tls_reqcert; + int timelimit; + int timeout; + int bind_timelimit; + int use_sasl; + int rootuse_sasl; + int ssl_mode; + int timed; + int deref; + char *host; + struct ldap_config_str_list uri; + char *binddn; + char *bindpw; + char *rootbinddn; + struct ldap_config_str_list base; + struct ldap_config_str_list netgroup_base; + char *search_filter; + char *netgroup_search_filter; + char *ssl; + char *tls_cacertfile; + char *tls_cacertdir; + char *tls_random_file; + char *tls_cipher_suite; + char *tls_certfile; + char *tls_keyfile; + char *tls_keypw; + char *sasl_mech; + char *sasl_auth_id; + char *rootsasl_auth_id; + char *sasl_secprops; + char *krb5_ccname; +}; + +extern struct ldap_config ldap_conf; + +const char *sudo_krb5_ccname_path(const char *old_ccname); +bool sudo_ldap_read_config(void); +int sudo_ldap_set_options_global(void); +int sudo_ldap_set_options_conn(LDAP *ld); + +#endif /* SUDOERS_LDAP_CONF_H */ diff --git a/plugins/sudoers/sudo_nss.c b/plugins/sudoers/sudo_nss.c new file mode 100644 index 0000000..a48bb67 --- /dev/null +++ b/plugins/sudoers/sudo_nss.c @@ -0,0 +1,264 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2007-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#include "sudoers.h" + +extern struct sudo_nss sudo_nss_file; +#ifdef HAVE_LDAP +extern struct sudo_nss sudo_nss_ldap; +#endif +#ifdef HAVE_SSSD +extern struct sudo_nss sudo_nss_sss; +#endif + +/* Make sure we have not already inserted the nss entry. */ +#define SUDO_NSS_CHECK_UNUSED(nss, tag) \ + if (nss.entries.tqe_next != NULL || nss.entries.tqe_prev != NULL) { \ + sudo_warnx("internal error: nsswitch entry \"%s\" already in use", \ + tag); \ + continue; \ + } + +#if (defined(HAVE_LDAP) || defined(HAVE_SSSD)) && defined(_PATH_NSSWITCH_CONF) +/* + * Read in /etc/nsswitch.conf + * Returns a tail queue of matches. + */ +struct sudo_nss_list * +sudo_read_nss(void) +{ + FILE *fp; + char *line = NULL; + size_t linesize = 0; +#ifdef HAVE_SSSD + bool saw_sss = false; +#endif +#ifdef HAVE_LDAP + bool saw_ldap = false; +#endif + bool saw_files = false; + bool got_match = false; + static struct sudo_nss_list snl = TAILQ_HEAD_INITIALIZER(snl); + debug_decl(sudo_read_nss, SUDOERS_DEBUG_NSS); + + if ((fp = fopen(_PATH_NSSWITCH_CONF, "r")) == NULL) + goto nomatch; + + while (sudo_parseln(&line, &linesize, NULL, fp, 0) != -1) { + char *cp, *last; + + /* Skip blank or comment lines */ + if (*line == '\0') + continue; + + /* Look for a line starting with "sudoers:" */ + if (strncasecmp(line, "sudoers:", 8) != 0) + continue; + + /* Parse line */ + for ((cp = strtok_r(line + 8, " \t", &last)); cp != NULL; (cp = strtok_r(NULL, " \t", &last))) { + if (strcasecmp(cp, "files") == 0 && !saw_files) { + SUDO_NSS_CHECK_UNUSED(sudo_nss_file, "files"); + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + got_match = saw_files = true; +#ifdef HAVE_LDAP + } else if (strcasecmp(cp, "ldap") == 0 && !saw_ldap) { + SUDO_NSS_CHECK_UNUSED(sudo_nss_ldap, "ldap"); + TAILQ_INSERT_TAIL(&snl, &sudo_nss_ldap, entries); + got_match = saw_ldap = true; +#endif +#ifdef HAVE_SSSD + } else if (strcasecmp(cp, "sss") == 0 && !saw_sss) { + SUDO_NSS_CHECK_UNUSED(sudo_nss_sss, "sss"); + TAILQ_INSERT_TAIL(&snl, &sudo_nss_sss, entries); + got_match = saw_sss = true; +#endif + } else if (strcasecmp(cp, "[NOTFOUND=return]") == 0 && got_match) { + /* NOTFOUND affects the most recent entry */ + TAILQ_LAST(&snl, sudo_nss_list)->ret_if_notfound = true; + got_match = false; + } else if (strcasecmp(cp, "[SUCCESS=return]") == 0 && got_match) { + /* SUCCESS affects the most recent entry */ + TAILQ_LAST(&snl, sudo_nss_list)->ret_if_found = true; + got_match = false; + } else + got_match = false; + } + /* Only parse the first "sudoers:" line */ + break; + } + free(line); + fclose(fp); + +nomatch: + /* Default to files only if no matches */ + if (TAILQ_EMPTY(&snl)) + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + + debug_return_ptr(&snl); +} + +#else /* (HAVE_LDAP || HAVE_SSSD) && _PATH_NSSWITCH_CONF */ + +# if (defined(HAVE_LDAP) || defined(HAVE_SSSD)) && defined(_PATH_NETSVC_CONF) + +/* + * Read in /etc/netsvc.conf (like nsswitch.conf on AIX) + * Returns a tail queue of matches. + */ +struct sudo_nss_list * +sudo_read_nss(void) +{ + FILE *fp; + char *cp, *ep, *last, *line = NULL; + size_t linesize = 0; +#ifdef HAVE_SSSD + bool saw_sss = false; +#endif + bool saw_files = false; + bool saw_ldap = false; + bool got_match = false; + static struct sudo_nss_list snl = TAILQ_HEAD_INITIALIZER(snl); + debug_decl(sudo_read_nss, SUDOERS_DEBUG_NSS); + + if ((fp = fopen(_PATH_NETSVC_CONF, "r")) == NULL) + goto nomatch; + + while (sudo_parseln(&line, &linesize, NULL, fp, 0) != -1) { + /* Skip blank or comment lines */ + if (*(cp = line) == '\0') + continue; + + /* Look for a line starting with "sudoers = " */ + if (strncasecmp(cp, "sudoers", 7) != 0) + continue; + cp += 7; + while (isspace((unsigned char)*cp)) + cp++; + if (*cp++ != '=') + continue; + + /* Parse line */ + for ((cp = strtok_r(cp, ",", &last)); cp != NULL; (cp = strtok_r(NULL, ",", &last))) { + /* Trim leading whitespace. */ + while (isspace((unsigned char)*cp)) + cp++; + + if (!saw_files && strncasecmp(cp, "files", 5) == 0 && + (isspace((unsigned char)cp[5]) || cp[5] == '\0')) { + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + got_match = saw_files = true; + ep = &cp[5]; +#ifdef HAVE_LDAP + } else if (!saw_ldap && strncasecmp(cp, "ldap", 4) == 0 && + (isspace((unsigned char)cp[4]) || cp[4] == '\0')) { + TAILQ_INSERT_TAIL(&snl, &sudo_nss_ldap, entries); + got_match = saw_ldap = true; + ep = &cp[4]; +#endif +#ifdef HAVE_SSSD + } else if (!saw_sss && strncasecmp(cp, "sss", 3) == 0 && + (isspace((unsigned char)cp[3]) || cp[3] == '\0')) { + TAILQ_INSERT_TAIL(&snl, &sudo_nss_sss, entries); + got_match = saw_sss = true; + ep = &cp[3]; +#endif + } else { + got_match = false; + } + + /* check for = auth qualifier */ + if (got_match && *ep) { + cp = ep; + while (isspace((unsigned char)*cp) || *cp == '=') + cp++; + if (strncasecmp(cp, "auth", 4) == 0 && + (isspace((unsigned char)cp[4]) || cp[4] == '\0')) { + TAILQ_LAST(&snl, sudo_nss_list)->ret_if_found = true; + } + } + } + /* Only parse the first "sudoers" line */ + break; + } + fclose(fp); + +nomatch: + /* Default to files only if no matches */ + if (TAILQ_EMPTY(&snl)) + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + + debug_return_ptr(&snl); +} + +# else /* !_PATH_NETSVC_CONF && !_PATH_NSSWITCH_CONF */ + +/* + * Non-nsswitch.conf version with hard-coded order. + */ +struct sudo_nss_list * +sudo_read_nss(void) +{ + static struct sudo_nss_list snl = TAILQ_HEAD_INITIALIZER(snl); + debug_decl(sudo_read_nss, SUDOERS_DEBUG_NSS); + +# ifdef HAVE_SSSD + TAILQ_INSERT_TAIL(&snl, &sudo_nss_sss, entries); +# endif +# ifdef HAVE_LDAP + TAILQ_INSERT_TAIL(&snl, &sudo_nss_ldap, entries); +# endif + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + + debug_return_ptr(&snl); +} + +# endif /* !HAVE_LDAP || !_PATH_NETSVC_CONF */ + +#endif /* HAVE_LDAP && _PATH_NSSWITCH_CONF */ + +bool +sudo_nss_can_continue(struct sudo_nss *nss, int match) +{ + debug_decl(sudo_nss_should_continue, SUDOERS_DEBUG_NSS); + + /* Handle [NOTFOUND=return] */ + if (nss->ret_if_notfound && match == UNSPEC) + debug_return_bool(false); + + /* Handle [SUCCESS=return] */ + if (nss->ret_if_found && match != UNSPEC) + debug_return_bool(false); + + debug_return_bool(true); +} diff --git a/plugins/sudoers/sudo_nss.h b/plugins/sudoers/sudo_nss.h new file mode 100644 index 0000000..bb0c49a --- /dev/null +++ b/plugins/sudoers/sudo_nss.h @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2007-2011, 2013-2015, 2017-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_NSS_H +#define SUDOERS_NSS_H + +struct passwd; +struct userspec_list; +struct defaults_list; + +/* XXX - parse_tree, ret_if_found and ret_if_notfound should be private */ +struct sudo_nss { + TAILQ_ENTRY(sudo_nss) entries; + int (*open)(struct sudo_nss *nss); + int (*close)(struct sudo_nss *nss); + struct sudoers_parse_tree *(*parse)(struct sudo_nss *nss); + int (*query)(struct sudo_nss *nss, struct passwd *pw); + int (*getdefs)(struct sudo_nss *nss); + void *handle; + struct sudoers_parse_tree *parse_tree; + bool ret_if_found; + bool ret_if_notfound; +}; + +TAILQ_HEAD(sudo_nss_list, sudo_nss); + +struct sudo_nss_list *sudo_read_nss(void); +bool sudo_nss_can_continue(struct sudo_nss *nss, int match); + +#endif /* SUDOERS_NSS_H */ diff --git a/plugins/sudoers/sudo_printf.c b/plugins/sudoers/sudo_printf.c new file mode 100644 index 0000000..5f07162 --- /dev/null +++ b/plugins/sudoers/sudo_printf.c @@ -0,0 +1,69 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2012 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_plugin.h" +#include "sudo_debug.h" +#include "pathnames.h" + +static int +sudo_printf_int(int msg_type, const char *fmt, ...) +{ + FILE *fp = stdout; + FILE *ttyfp = NULL; + va_list ap; + int len; + + if (ISSET(msg_type, SUDO_CONV_PREFER_TTY)) { + /* Try writing to /dev/tty first. */ + ttyfp = fopen(_PATH_TTY, "w"); + } + + switch (msg_type & 0xff) { + case SUDO_CONV_ERROR_MSG: + fp = stderr; + FALLTHROUGH; + case SUDO_CONV_INFO_MSG: + va_start(ap, fmt); + len = vfprintf(ttyfp ? ttyfp : fp, fmt, ap); + va_end(ap); + break; + default: + len = -1; + errno = EINVAL; + break; + } + + if (ttyfp != NULL) + fclose(ttyfp); + + return len; +} + +sudo_printf_t sudo_printf = sudo_printf_int; diff --git a/plugins/sudoers/sudoers.c b/plugins/sudoers/sudoers.c new file mode 100644 index 0000000..20f760b --- /dev/null +++ b/plugins/sudoers/sudoers.c @@ -0,0 +1,1711 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996, 1998-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#ifdef __TANDEM +# include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LOGIN_CAP_H +# include +# ifndef LOGIN_DEFROOTCLASS +# define LOGIN_DEFROOTCLASS "daemon" +# endif +# ifndef LOGIN_SETENV +# define LOGIN_SETENV 0 +# endif +#endif +#ifdef HAVE_SELINUX +# include +#endif +#include +#ifndef HAVE_GETADDRINFO +# include "compat/getaddrinfo.h" +#endif + +#include "sudoers.h" +#include "parse.h" +#include "auth/sudo_auth.h" +#include "sudo_iolog.h" + +/* + * Prototypes + */ +static int set_cmnd(void); +static int create_admin_success_flag(void); +static bool init_vars(char * const *); +static bool set_loginclass(struct passwd *); +static bool set_runasgr(const char *, bool); +static bool set_runaspw(const char *, bool); +static bool tty_present(void); +static void set_callbacks(void); + +/* + * Globals + */ +struct sudo_user sudo_user; +struct passwd *list_pw; +uid_t timestamp_uid; +gid_t timestamp_gid; +#ifdef HAVE_BSD_AUTH_H +char *login_style; +#endif /* HAVE_BSD_AUTH_H */ +bool force_umask; +int sudo_mode; + +static char *prev_user; +static struct sudo_nss_list *snl; +static bool unknown_runas_uid; +static bool unknown_runas_gid; +static int cmnd_status = -1; + +#ifdef __linux__ +static struct rlimit nproclimit; +#endif + +/* XXX - must be extern for audit bits of sudo_auth.c */ +int NewArgc; +char **NewArgv; + +#ifdef SUDOERS_LOG_CLIENT +# define remote_iologs (!SLIST_EMPTY(&def_log_servers)) +#else +# define remote_iologs 0 +#endif + +/* + * Unlimit the number of processes since Linux's setuid() will + * apply resource limits when changing uid and return EAGAIN if + * nproc would be exceeded by the uid switch. + */ +static void +unlimit_nproc(void) +{ +#ifdef __linux__ + struct rlimit rl; + debug_decl(unlimit_nproc, SUDOERS_DEBUG_UTIL); + + if (getrlimit(RLIMIT_NPROC, &nproclimit) != 0) + sudo_warn("getrlimit(RLIMIT_NPROC)"); + rl.rlim_cur = rl.rlim_max = RLIM_INFINITY; + if (setrlimit(RLIMIT_NPROC, &rl) != 0) { + rl.rlim_cur = rl.rlim_max = nproclimit.rlim_max; + if (setrlimit(RLIMIT_NPROC, &rl) != 0) + sudo_warn("setrlimit(RLIMIT_NPROC)"); + } + debug_return; +#endif /* __linux__ */ +} + +/* + * Restore saved value of RLIMIT_NPROC. + */ +static void +restore_nproc(void) +{ +#ifdef __linux__ + debug_decl(restore_nproc, SUDOERS_DEBUG_UTIL); + + if (setrlimit(RLIMIT_NPROC, &nproclimit) != 0) + sudo_warn("setrlimit(RLIMIT_NPROC)"); + + debug_return; +#endif /* __linux__ */ +} + +int +sudoers_init(void *info, char * const envp[]) +{ + struct sudo_nss *nss, *nss_next; + int oldlocale, sources = 0; + static int ret = -1; + debug_decl(sudoers_init, SUDOERS_DEBUG_PLUGIN); + + if (ret == true) + debug_return_int(true); + + bindtextdomain("sudoers", LOCALEDIR); + + /* Register fatal/fatalx callback. */ + sudo_fatal_callback_register(sudoers_cleanup); + + /* Initialize environment functions (including replacements). */ + if (!env_init(envp)) + debug_return_int(-1); + + /* Setup defaults data structures. */ + if (!init_defaults()) { + sudo_warnx("%s", U_("unable to initialize sudoers default values")); + debug_return_int(-1); + } + + /* Parse info from front-end. */ + sudo_mode = sudoers_policy_deserialize_info(info); + if (ISSET(sudo_mode, MODE_ERROR)) + debug_return_int(-1); + + if (!init_vars(envp)) + debug_return_int(-1); + + /* Parse nsswitch.conf for sudoers order. */ + snl = sudo_read_nss(); + + /* LDAP or NSS may modify the euid so we need to be root for the open. */ + if (!set_perms(PERM_ROOT)) + debug_return_int(-1); + + /* + * Open and parse sudoers, set global defaults. + * Uses the C locale unless another is specified in sudoers. + */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + sudo_warn_set_locale_func(sudoers_warn_setlocale); + init_parser(sudoers_file, false, false); + TAILQ_FOREACH_SAFE(nss, snl, entries, nss_next) { + if (nss->open(nss) == -1 || (nss->parse_tree = nss->parse(nss)) == NULL) { + TAILQ_REMOVE(snl, nss, entries); + continue; + } + + sources++; + if (nss->getdefs(nss) == -1 || !update_defaults(nss->parse_tree, NULL, + SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER|SETDEF_RUNAS, false)) { + log_warningx(SLOG_SEND_MAIL|SLOG_NO_STDERR, + N_("problem with defaults entries")); + } + } + if (sources == 0) { + sudo_warnx("%s", U_("no valid sudoers sources found, quitting")); + goto cleanup; + } + + /* Set login class if applicable (after sudoers is parsed). */ + if (set_loginclass(runas_pw ? runas_pw : sudo_user.pw)) + ret = true; + +cleanup: + if (!restore_perms()) + ret = -1; + + /* Restore user's locale. */ + sudo_warn_set_locale_func(NULL); + sudoers_setlocale(oldlocale, NULL); + + debug_return_int(ret); +} + +/* + * Expand I/O log dir and file into a full path. + * Returns the full I/O log path prefixed with "iolog_path=". + * Sets sudo_user.iolog_file as a side effect. + */ +static char * +format_iolog_path(void) +{ + char dir[PATH_MAX], file[PATH_MAX]; + char *iolog_path = NULL; + int oldlocale; + bool ok; + debug_decl(format_iolog_path, SUDOERS_DEBUG_PLUGIN); + + /* Use sudoers locale for strftime() */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + ok = expand_iolog_path(def_iolog_dir, dir, sizeof(dir), + &sudoers_iolog_path_escapes[1], NULL); + if (ok) { + ok = expand_iolog_path(def_iolog_file, file, sizeof(file), + &sudoers_iolog_path_escapes[0], dir); + } + sudoers_setlocale(oldlocale, NULL); + if (!ok) + goto done; + + if (asprintf(&iolog_path, "iolog_path=%s/%s", dir, file) == -1) { + iolog_path = NULL; + goto done; + } + + /* Stash pointer to the I/O log for the event log. */ + sudo_user.iolog_path = iolog_path + sizeof("iolog_path=") - 1; + sudo_user.iolog_file = sudo_user.iolog_path + 1 + strlen(dir); + +done: + debug_return_str(iolog_path); +} + +static int +check_user_runchroot(void) +{ + debug_decl(check_user_runchroot, SUDOERS_DEBUG_PLUGIN); + + if (user_runchroot == NULL) + debug_return_bool(true); + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_runchroot %s, user_runchroot %s", + def_runchroot ? def_runchroot : "none", + user_runchroot ? user_runchroot : "none"); + + if (def_runchroot == NULL || (strcmp(def_runchroot, "*") != 0 && + strcmp(def_runchroot, user_runchroot) != 0)) { + log_warningx(SLOG_NO_STDERR|SLOG_AUDIT, + N_("user not allowed to change root directory to %s"), + user_runchroot); + sudo_warnx(U_("you are not permitted to use the -R option with %s"), + user_cmnd); + debug_return_bool(false); + } + free(def_runchroot); + if ((def_runchroot = strdup(user_runchroot)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + debug_return_bool(true); +} + +static int +check_user_runcwd(void) +{ + debug_decl(check_user_runcwd, SUDOERS_DEBUG_PLUGIN); + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_runcwd %s, user_runcwd %s, user_cwd %s", + def_runcwd ? def_runcwd : "none", user_runcwd ? user_runcwd : "none", + user_cwd ? user_cwd : "none"); + + if (strcmp(user_cwd, user_runcwd) != 0) { + if (def_runcwd == NULL || strcmp(def_runcwd, "*") != 0) { + log_warningx(SLOG_NO_STDERR|SLOG_AUDIT, + N_("user not allowed to change directory to %s"), user_runcwd); + sudo_warnx(U_("you are not permitted to use the -D option with %s"), + user_cmnd); + debug_return_bool(false); + } + free(def_runcwd); + if ((def_runcwd = strdup(user_runcwd)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + } + debug_return_bool(true); +} + +int +sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[], + bool verbose, void *closure) +{ + char *iolog_path = NULL; + mode_t cmnd_umask = ACCESSPERMS; + struct sudo_nss *nss; + int oldlocale, validated, ret = -1; + debug_decl(sudoers_policy_main, SUDOERS_DEBUG_PLUGIN); + + sudo_warn_set_locale_func(sudoers_warn_setlocale); + + unlimit_nproc(); + + /* Is root even allowed to run sudo? */ + if (user_uid == 0 && !def_root_sudo) { + /* Not an audit event (should it be?). */ + sudo_warnx("%s", + U_("sudoers specifies that root is not allowed to sudo")); + goto bad; + } + + if (!set_perms(PERM_INITIAL)) + goto bad; + + /* Environment variables specified on the command line. */ + if (env_add != NULL && env_add[0] != NULL) + sudo_user.env_vars = env_add; + + /* + * Make a local copy of argc/argv, with special handling + * for pseudo-commands and the '-i' option. + */ + if (argc == 0) { + NewArgc = 1; + NewArgv = reallocarray(NULL, NewArgc + 1, sizeof(char *)); + if (NewArgv == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + sudoers_gc_add(GC_VECTOR, NewArgv); + NewArgv[0] = user_cmnd; + NewArgv[1] = NULL; + } else { + /* Must leave an extra slot before NewArgv for bash's --login */ + NewArgc = argc; + NewArgv = reallocarray(NULL, NewArgc + 2, sizeof(char *)); + if (NewArgv == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + sudoers_gc_add(GC_VECTOR, NewArgv); + NewArgv++; /* reserve an extra slot for --login */ + memcpy(NewArgv, argv, argc * sizeof(char *)); + NewArgv[NewArgc] = NULL; + if (ISSET(sudo_mode, MODE_LOGIN_SHELL) && runas_pw != NULL) { + NewArgv[0] = strdup(runas_pw->pw_shell); + if (NewArgv[0] == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + sudoers_gc_add(GC_PTR, NewArgv[0]); + } + } + + /* If given the -P option, set the "preserve_groups" flag. */ + if (ISSET(sudo_mode, MODE_PRESERVE_GROUPS)) + def_preserve_groups = true; + + /* Find command in path and apply per-command Defaults. */ + cmnd_status = set_cmnd(); + if (cmnd_status == NOT_FOUND_ERROR) + goto done; + + /* Check for -C overriding def_closefrom. */ + if (user_closefrom >= 0 && user_closefrom != def_closefrom) { + if (!def_closefrom_override) { + log_warningx(SLOG_NO_STDERR|SLOG_AUDIT, + N_("user not allowed to override closefrom limit")); + sudo_warnx("%s", U_("you are not permitted to use the -C option")); + goto bad; + } + def_closefrom = user_closefrom; + } + + /* + * Check sudoers sources, using the locale specified in sudoers. + */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + validated = sudoers_lookup(snl, sudo_user.pw, &cmnd_status, pwflag); + if (ISSET(validated, VALIDATE_ERROR)) { + /* The lookup function should have printed an error. */ + goto done; + } + + /* Restore user's locale. */ + sudoers_setlocale(oldlocale, NULL); + + if (safe_cmnd == NULL) { + if ((safe_cmnd = strdup(user_cmnd)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + } + + /* Defer uid/gid checks until after defaults have been updated. */ + if (unknown_runas_uid && !def_runas_allow_unknown_id) { + log_warningx(SLOG_AUDIT, N_("unknown user: %s"), runas_pw->pw_name); + goto done; + } + if (runas_gr != NULL) { + if (unknown_runas_gid && !def_runas_allow_unknown_id) { + log_warningx(SLOG_AUDIT, N_("unknown group: %s"), + runas_gr->gr_name); + goto done; + } + } + + /* + * Look up the timestamp dir owner if one is specified. + */ + if (def_timestampowner) { + struct passwd *pw = NULL; + + if (*def_timestampowner == '#') { + const char *errstr; + uid_t uid = sudo_strtoid(def_timestampowner + 1, &errstr); + if (errstr == NULL) + pw = sudo_getpwuid(uid); + } + if (pw == NULL) + pw = sudo_getpwnam(def_timestampowner); + if (pw != NULL) { + timestamp_uid = pw->pw_uid; + timestamp_gid = pw->pw_gid; + sudo_pw_delref(pw); + } else { + /* XXX - audit too? */ + log_warningx(SLOG_SEND_MAIL, + N_("timestamp owner (%s): No such user"), def_timestampowner); + timestamp_uid = ROOT_UID; + timestamp_gid = ROOT_GID; + } + } + + /* If no command line args and "shell_noargs" is not set, error out. */ + if (ISSET(sudo_mode, MODE_IMPLIED_SHELL) && !def_shell_noargs) { + /* Not an audit event. */ + ret = -2; /* usage error */ + goto done; + } + + /* Bail if a tty is required and we don't have one. */ + if (def_requiretty && !tty_present()) { + log_warningx(SLOG_NO_STDERR|SLOG_AUDIT, N_("no tty")); + sudo_warnx("%s", U_("sorry, you must have a tty to run sudo")); + goto bad; + } + + /* Check runas user's shell. */ + if (!check_user_shell(runas_pw)) { + log_warningx(SLOG_RAW_MSG|SLOG_AUDIT, + N_("invalid shell for user %s: %s"), + runas_pw->pw_name, runas_pw->pw_shell); + goto bad; + } + + /* + * We don't reset the environment for sudoedit or if the user + * specified the -E command line flag and they have setenv privs. + */ + if (ISSET(sudo_mode, MODE_EDIT) || + (ISSET(sudo_mode, MODE_PRESERVE_ENV) && def_setenv)) + def_env_reset = false; + + /* Build a new environment that avoids any nasty bits. */ + if (!rebuild_env()) + goto bad; + + /* Require a password if sudoers says so. */ + switch (check_user(validated, sudo_mode)) { + case true: + /* user authenticated successfully. */ + break; + case false: + /* Note: log_denial() calls audit for us. */ + if (!ISSET(validated, VALIDATE_SUCCESS)) { + /* Only display a denial message if no password was read. */ + if (!log_denial(validated, def_passwd_tries <= 0)) + goto done; + } + goto bad; + default: + /* some other error, ret is -1. */ + goto done; + } + + /* Check whether user_runchroot is permitted (if specified). */ + switch (check_user_runchroot()) { + case true: + break; + case false: + goto bad; + default: + goto done; + } + + /* Check whether user_runcwd is permitted (if specified). */ + switch (check_user_runcwd()) { + case true: + break; + case false: + goto bad; + default: + goto done; + } + + /* If run as root with SUDO_USER set, set sudo_user.pw to that user. */ + /* XXX - causes confusion when root is not listed in sudoers */ + if (ISSET(sudo_mode, MODE_RUN|MODE_EDIT) && prev_user != NULL) { + if (user_uid == 0 && strcmp(prev_user, "root") != 0) { + struct passwd *pw; + + if ((pw = sudo_getpwnam(prev_user)) != NULL) { + if (sudo_user.pw != NULL) + sudo_pw_delref(sudo_user.pw); + sudo_user.pw = pw; + } + } + } + + /* If the user was not allowed to run the command we are done. */ + if (!ISSET(validated, VALIDATE_SUCCESS)) { + /* Note: log_failure() calls audit for us. */ + if (!log_failure(validated, cmnd_status)) + goto done; + goto bad; + } + + /* Create Ubuntu-style dot file to indicate sudo was successful. */ + if (create_admin_success_flag() == -1) + goto done; + + /* Finally tell the user if the command did not exist. */ + if (cmnd_status == NOT_FOUND_DOT) { + audit_failure(NewArgv, N_("command in current directory")); + sudo_warnx(U_("ignoring \"%s\" found in '.'\nUse \"sudo ./%s\" if this is the \"%s\" you wish to run."), user_cmnd, user_cmnd, user_cmnd); + goto bad; + } else if (cmnd_status == NOT_FOUND) { + if (ISSET(sudo_mode, MODE_CHECK)) { + audit_failure(NewArgv, N_("%s: command not found"), + NewArgv[0]); + sudo_warnx(U_("%s: command not found"), NewArgv[0]); + } else { + audit_failure(NewArgv, N_("%s: command not found"), + user_cmnd); + sudo_warnx(U_("%s: command not found"), user_cmnd); + } + goto bad; + } + + /* If user specified a timeout make sure sudoers allows it. */ + if (!def_user_command_timeouts && user_timeout > 0) { + log_warningx(SLOG_NO_STDERR|SLOG_AUDIT, + N_("user not allowed to set a command timeout")); + sudo_warnx("%s", + U_("sorry, you are not allowed set a command timeout")); + goto bad; + } + + /* If user specified env vars make sure sudoers allows it. */ + if (ISSET(sudo_mode, MODE_RUN) && !def_setenv) { + if (ISSET(sudo_mode, MODE_PRESERVE_ENV)) { + log_warningx(SLOG_NO_STDERR|SLOG_AUDIT, + N_("user not allowed to preserve the environment")); + sudo_warnx("%s", + U_("sorry, you are not allowed to preserve the environment")); + goto bad; + } else { + if (!validate_env_vars(sudo_user.env_vars)) + goto bad; + } + } + + if (ISSET(sudo_mode, (MODE_RUN | MODE_EDIT)) && !remote_iologs) { + if ((def_log_input || def_log_output) && def_iolog_file && def_iolog_dir) { + if ((iolog_path = format_iolog_path()) == NULL) { + if (!def_ignore_iolog_errors) + goto done; + /* Unable to expand I/O log path, disable I/O logging. */ + def_log_input = false; + def_log_output = false; + } + } + } + + switch (sudo_mode & MODE_MASK) { + case MODE_CHECK: + ret = display_cmnd(snl, list_pw ? list_pw : sudo_user.pw); + break; + case MODE_LIST: + ret = display_privs(snl, list_pw ? list_pw : sudo_user.pw, verbose); + break; + case MODE_VALIDATE: + case MODE_RUN: + case MODE_EDIT: + /* ret may be overridden by "goto bad" later */ + ret = true; + break; + default: + /* Should not happen. */ + sudo_warnx("internal error, unexpected sudo mode 0x%x", sudo_mode); + goto done; + } + + /* Cleanup sudoers sources */ + TAILQ_FOREACH(nss, snl, entries) { + nss->close(nss); + } + if (def_group_plugin) + group_plugin_unload(); + init_parser(NULL, false, false); + + if (ISSET(sudo_mode, (MODE_VALIDATE|MODE_CHECK|MODE_LIST))) { + /* ret already set appropriately */ + goto done; + } + + /* + * Set umask based on sudoers. + * If user's umask is more restrictive, OR in those bits too + * unless umask_override is set. + */ + if (def_umask != ACCESSPERMS) { + cmnd_umask = def_umask; + if (!def_umask_override) + cmnd_umask |= user_umask; + } + + if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + char *p; + + /* Convert /bin/sh -> -sh so shell knows it is a login shell */ + if ((p = strrchr(NewArgv[0], '/')) == NULL) + p = NewArgv[0]; + *p = '-'; + NewArgv[0] = p; + + /* + * Newer versions of bash require the --login option to be used + * in conjunction with the -c option even if the shell name starts + * with a '-'. Unfortunately, bash 1.x uses -login, not --login + * so this will cause an error for that. + */ + if (NewArgc > 1 && strcmp(NewArgv[0], "-bash") == 0 && + strcmp(NewArgv[1], "-c") == 0) { + /* Use the extra slot before NewArgv so we can store --login. */ + NewArgv--; + NewArgc++; + NewArgv[0] = NewArgv[1]; + NewArgv[1] = "--login"; + } + +#if defined(_AIX) || (defined(__linux__) && !defined(HAVE_PAM)) + /* Insert system-wide environment variables. */ + if (!read_env_file(_PATH_ENVIRONMENT, true, false)) + sudo_warn("%s", _PATH_ENVIRONMENT); +#endif +#ifdef HAVE_LOGIN_CAP_H + /* Set environment based on login class. */ + if (login_class) { + login_cap_t *lc = login_getclass(login_class); + if (lc != NULL) { + setusercontext(lc, runas_pw, runas_pw->pw_uid, LOGIN_SETPATH|LOGIN_SETENV); + login_close(lc); + } + } +#endif /* HAVE_LOGIN_CAP_H */ + } + + /* Insert system-wide environment variables. */ + if (def_restricted_env_file) { + if (!read_env_file(def_restricted_env_file, false, true)) + sudo_warn("%s", def_restricted_env_file); + } + if (def_env_file) { + if (!read_env_file(def_env_file, false, false)) + sudo_warn("%s", def_env_file); + } + + /* Insert user-specified environment variables. */ + if (!insert_env_vars(sudo_user.env_vars)) + goto done; + + /* Note: must call audit before uid change. */ + if (ISSET(sudo_mode, MODE_EDIT)) { + char **edit_argv; + int edit_argc; + const char *env_editor; + + free(safe_cmnd); + safe_cmnd = find_editor(NewArgc - 1, NewArgv + 1, &edit_argc, + &edit_argv, NULL, &env_editor, false); + if (safe_cmnd == NULL) { + if (errno != ENOENT) + goto done; + audit_failure(NewArgv, N_("%s: command not found"), + env_editor ? env_editor : def_editor); + sudo_warnx(U_("%s: command not found"), + env_editor ? env_editor : def_editor); + goto bad; + } + sudoers_gc_add(GC_VECTOR, edit_argv); + NewArgv = edit_argv; + NewArgc = edit_argc; + + /* We want to run the editor with the unmodified environment. */ + env_swap_old(); + } + + goto done; + +bad: + ret = false; + +done: + if (ret == -1) { + /* Free stashed copy of the environment. */ + (void)env_init(NULL); + } else { + /* Store settings to pass back to front-end. */ + if (!sudoers_policy_store_result(ret, NewArgv, env_get(), cmnd_umask, + iolog_path, closure)) + ret = -1; + } + + if (!rewind_perms()) + ret = -1; + + restore_nproc(); + + /* Destroy the password and group caches and free the contents. */ + sudo_freepwcache(); + sudo_freegrcache(); + + sudo_warn_set_locale_func(NULL); + + debug_return_int(ret); +} + +/* + * Initialize timezone and fill in sudo_user struct. + */ +static bool +init_vars(char * const envp[]) +{ + char * const * ep; + bool unknown_user = false; + debug_decl(init_vars, SUDOERS_DEBUG_PLUGIN); + + if (!sudoers_initlocale(setlocale(LC_ALL, NULL), def_sudoers_locale)) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + +#define MATCHES(s, v) \ + (strncmp((s), (v), sizeof(v) - 1) == 0 && (s)[sizeof(v) - 1] != '\0') + + for (ep = envp; *ep; ep++) { + switch (**ep) { + case 'K': + if (MATCHES(*ep, "KRB5CCNAME=")) + user_ccname = *ep + sizeof("KRB5CCNAME=") - 1; + break; + case 'P': + if (MATCHES(*ep, "PATH=")) + user_path = *ep + sizeof("PATH=") - 1; + break; + case 'S': + if (MATCHES(*ep, "SUDO_PROMPT=")) { + /* Don't override "sudo -p prompt" */ + if (user_prompt == NULL) + user_prompt = *ep + sizeof("SUDO_PROMPT=") - 1; + break; + } + if (MATCHES(*ep, "SUDO_USER=")) + prev_user = *ep + sizeof("SUDO_USER=") - 1; + break; + } + } +#undef MATCHES + + /* + * Get a local copy of the user's passwd struct and group list if we + * don't already have them. + */ + if (sudo_user.pw == NULL) { + if ((sudo_user.pw = sudo_getpwnam(user_name)) == NULL) { + /* + * It is not unusual for users to place "sudo -k" in a .logout + * file which can cause sudo to be run during reboot after the + * YP/NIS/NIS+/LDAP/etc daemon has died. + */ + if (sudo_mode == MODE_KILL || sudo_mode == MODE_INVALIDATE) { + sudo_warnx(U_("unknown uid: %u"), (unsigned int) user_uid); + debug_return_bool(false); + } + + /* Need to make a fake struct passwd for the call to log_warningx(). */ + sudo_user.pw = sudo_mkpwent(user_name, user_uid, user_gid, NULL, NULL); + unknown_user = true; + } + } + if (user_gid_list == NULL) + user_gid_list = sudo_get_gidlist(sudo_user.pw, ENTRY_TYPE_ANY); + + /* Store initialize permissions so we can restore them later. */ + if (!set_perms(PERM_INITIAL)) + debug_return_bool(false); + + /* Set parse callbacks */ + set_callbacks(); + + /* It is now safe to use log_warningx() and set_perms() */ + if (unknown_user) { + log_warningx(SLOG_SEND_MAIL, N_("unknown uid: %u"), + (unsigned int) user_uid); + debug_return_bool(false); + } + + /* + * Set runas passwd/group entries based on command line or sudoers. + * Note that if runas_group was specified without runas_user we + * run the command as the invoking user. + */ + if (sudo_user.runas_group != NULL) { + if (!set_runasgr(sudo_user.runas_group, false)) + debug_return_bool(false); + if (!set_runaspw(sudo_user.runas_user ? + sudo_user.runas_user : user_name, false)) + debug_return_bool(false); + } else { + if (!set_runaspw(sudo_user.runas_user ? + sudo_user.runas_user : def_runas_default, false)) + debug_return_bool(false); + } + + debug_return_bool(true); +} + +/* + * Fill in user_cmnd and user_stat variables. + * Does not fill in user_base. + */ +int +set_cmnd_path(const char *runchroot) +{ + char *path = user_path; + int ret; + debug_decl(set_cmnd_path, SUDOERS_DEBUG_PLUGIN); + + if (def_secure_path && !user_is_exempt()) + path = def_secure_path; + if (!set_perms(PERM_RUNAS)) + debug_return_int(NOT_FOUND_ERROR); + ret = find_path(NewArgv[0], &user_cmnd, user_stat, path, + runchroot, def_ignore_dot, NULL); + if (!restore_perms()) + debug_return_int(NOT_FOUND_ERROR); + if (ret == NOT_FOUND) { + /* Failed as root, try as invoking user. */ + if (!set_perms(PERM_USER)) + debug_return_int(false); + ret = find_path(NewArgv[0], &user_cmnd, user_stat, path, + runchroot, def_ignore_dot, NULL); + if (!restore_perms()) + debug_return_int(NOT_FOUND_ERROR); + } + + debug_return_int(ret); +} + +/* + * Fill in user_cmnd, user_args, user_base and user_stat variables + * and apply any command-specific defaults entries. + */ +static int +set_cmnd(void) +{ + struct sudo_nss *nss; + int ret = FOUND; + debug_decl(set_cmnd, SUDOERS_DEBUG_PLUGIN); + + /* Allocate user_stat for find_path() and match functions. */ + user_stat = calloc(1, sizeof(struct stat)); + if (user_stat == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(NOT_FOUND_ERROR); + } + + /* Default value for cmnd, overridden below. */ + if (user_cmnd == NULL) + user_cmnd = NewArgv[0]; + + if (ISSET(sudo_mode, MODE_RUN|MODE_EDIT|MODE_CHECK)) { + if (!ISSET(sudo_mode, MODE_EDIT)) { + const char *runchroot = user_runchroot; + if (runchroot == NULL && def_runchroot != NULL && + strcmp(def_runchroot, "*") != 0) + runchroot = def_runchroot; + + ret = set_cmnd_path(runchroot); + if (ret == NOT_FOUND_ERROR) { + if (errno == ENAMETOOLONG) { + audit_failure(NewArgv, N_("command too long")); + } + log_warning(0, "%s", NewArgv[0]); + debug_return_int(ret); + } + } + + /* set user_args */ + if (NewArgc > 1) { + char *to, *from, **av; + size_t size, n; + + /* Alloc and build up user_args. */ + for (size = 0, av = NewArgv + 1; *av; av++) + size += strlen(*av) + 1; + if (size == 0 || (user_args = malloc(size)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(NOT_FOUND_ERROR); + } + if (ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL) && + ISSET(sudo_mode, MODE_RUN)) { + /* + * When running a command via a shell, the sudo front-end + * escapes potential meta chars. We unescape non-spaces + * for sudoers matching and logging purposes. + */ + for (to = user_args, av = NewArgv + 1; (from = *av); av++) { + while (*from) { + if (from[0] == '\\' && from[1] != '\0' && + !isspace((unsigned char)from[1])) { + from++; + } + if (size - (to - user_args) < 1) { + sudo_warnx(U_("internal error, %s overflow"), + __func__); + debug_return_int(NOT_FOUND_ERROR); + } + *to++ = *from++; + } + if (size - (to - user_args) < 1) { + sudo_warnx(U_("internal error, %s overflow"), + __func__); + debug_return_int(NOT_FOUND_ERROR); + } + *to++ = ' '; + } + *--to = '\0'; + } else { + for (to = user_args, av = NewArgv + 1; *av; av++) { + n = strlcpy(to, *av, size - (to - user_args)); + if (n >= size - (to - user_args)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + debug_return_int(NOT_FOUND_ERROR); + } + to += n; + *to++ = ' '; + } + *--to = '\0'; + } + } + } + + if ((user_base = strrchr(user_cmnd, '/')) != NULL) + user_base++; + else + user_base = user_cmnd; + + /* Convert "sudo sudoedit" -> "sudoedit" */ + if (ISSET(sudo_mode, MODE_RUN) && strcmp(user_base, "sudoedit") == 0) { + CLR(sudo_mode, MODE_RUN); + SET(sudo_mode, MODE_EDIT); + sudo_warnx("%s", U_("sudoedit doesn't need to be run via sudo")); + user_base = user_cmnd = "sudoedit"; + } + + TAILQ_FOREACH(nss, snl, entries) { + if (!update_defaults(nss->parse_tree, NULL, SETDEF_CMND, false)) { + log_warningx(SLOG_SEND_MAIL|SLOG_NO_STDERR, + N_("problem with defaults entries")); + } + } + + debug_return_int(ret); +} + +/* + * Open sudoers file and check mode/owner/type. + * Returns a handle to the sudoers file or NULL on error. + */ +FILE * +open_sudoers(const char *file, bool doedit, bool *keepopen) +{ + struct stat sb; + FILE *fp = NULL; + bool perm_root = false; + debug_decl(open_sudoers, SUDOERS_DEBUG_PLUGIN); + + if (!set_perms(PERM_SUDOERS)) + debug_return_ptr(NULL); + +again: + switch (sudo_secure_file(file, sudoers_uid, sudoers_gid, &sb)) { + case SUDO_PATH_SECURE: + /* + * If we are expecting sudoers to be group readable by + * SUDOERS_GID but it is not, we must open the file as root, + * not uid 1. + */ + if (sudoers_uid == ROOT_UID && ISSET(sudoers_mode, S_IRGRP)) { + if (!ISSET(sb.st_mode, S_IRGRP) || sb.st_gid != SUDOERS_GID) { + if (!perm_root) { + if (!restore_perms() || !set_perms(PERM_ROOT)) + debug_return_ptr(NULL); + } + } + } + /* + * Open file and make sure we can read it so we can present + * the user with a reasonable error message (unlike the lexer). + */ + if ((fp = fopen(file, "r")) == NULL) { + log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), file); + } else { + if (sb.st_size != 0 && fgetc(fp) == EOF) { + log_warning(SLOG_SEND_MAIL, + N_("unable to read %s"), file); + fclose(fp); + fp = NULL; + } else { + /* Rewind fp and set close on exec flag. */ + rewind(fp); + (void) fcntl(fileno(fp), F_SETFD, 1); + } + } + break; + case SUDO_PATH_MISSING: + /* + * If we tried to stat() sudoers as non-root but got EACCES, + * try again as root. + */ + if (errno == EACCES && geteuid() != ROOT_UID) { + int serrno = errno; + if (restore_perms()) { + if (!set_perms(PERM_ROOT)) + debug_return_ptr(NULL); + perm_root = true; + goto again; + } + errno = serrno; + } + log_warning(SLOG_SEND_MAIL, N_("unable to stat %s"), file); + break; + case SUDO_PATH_BAD_TYPE: + log_warningx(SLOG_SEND_MAIL, + N_("%s is not a regular file"), file); + break; + case SUDO_PATH_WRONG_OWNER: + log_warningx(SLOG_SEND_MAIL, + N_("%s is owned by uid %u, should be %u"), file, + (unsigned int) sb.st_uid, (unsigned int) sudoers_uid); + break; + case SUDO_PATH_WORLD_WRITABLE: + log_warningx(SLOG_SEND_MAIL, N_("%s is world writable"), file); + break; + case SUDO_PATH_GROUP_WRITABLE: + log_warningx(SLOG_SEND_MAIL, + N_("%s is owned by gid %u, should be %u"), file, + (unsigned int) sb.st_gid, (unsigned int) sudoers_gid); + break; + default: + /* NOTREACHED */ + break; + } + + if (!restore_perms()) { + /* unable to change back to root */ + if (fp != NULL) { + fclose(fp); + fp = NULL; + } + } + + debug_return_ptr(fp); +} + +#ifdef HAVE_LOGIN_CAP_H +static bool +set_loginclass(struct passwd *pw) +{ + const int errflags = SLOG_RAW_MSG; + login_cap_t *lc; + bool ret = true; + debug_decl(set_loginclass, SUDOERS_DEBUG_PLUGIN); + + if (!def_use_loginclass) + goto done; + + if (login_class && strcmp(login_class, "-") != 0) { + if (user_uid != 0 && pw->pw_uid != 0) { + sudo_warnx(U_("only root can use \"-c %s\""), login_class); + ret = false; + goto done; + } + } else { + login_class = pw->pw_class; + if (!login_class || !*login_class) + login_class = + (pw->pw_uid == 0) ? LOGIN_DEFROOTCLASS : LOGIN_DEFCLASS; + } + + /* Make sure specified login class is valid. */ + lc = login_getclass(login_class); + if (!lc || !lc->lc_class || strcmp(lc->lc_class, login_class) != 0) { + /* + * Don't make it an error if the user didn't specify the login + * class themselves. We do this because if login.conf gets + * corrupted we want the admin to be able to use sudo to fix it. + */ + log_warningx(errflags, N_("unknown login class: %s"), login_class); + def_use_loginclass = false; + if (login_class) + ret = false; + } + login_close(lc); +done: + debug_return_bool(ret); +} +#else +static bool +set_loginclass(struct passwd *pw) +{ + return true; +} +#endif /* HAVE_LOGIN_CAP_H */ + +#ifndef AI_FQDN +# define AI_FQDN AI_CANONNAME +#endif + +/* + * Look up the fully qualified domain name of host. + * Use AI_FQDN if available since "canonical" is not always the same as fqdn. + * Returns true on success, setting longp and shortp. + * Returns false on failure, longp and shortp are unchanged. + */ +static int +resolve_host(const char *host, char **longp, char **shortp) +{ + struct addrinfo *res0, hint; + char *cp, *lname, *sname; + int ret; + debug_decl(resolve_host, SUDOERS_DEBUG_PLUGIN); + + memset(&hint, 0, sizeof(hint)); + hint.ai_family = PF_UNSPEC; + hint.ai_flags = AI_FQDN; + + if ((ret = getaddrinfo(host, NULL, &hint, &res0)) != 0) + debug_return_int(ret); + if ((lname = strdup(res0->ai_canonname)) == NULL) { + freeaddrinfo(res0); + debug_return_int(EAI_MEMORY); + } + if ((cp = strchr(lname, '.')) != NULL) { + sname = strndup(lname, (size_t)(cp - lname)); + if (sname == NULL) { + free(lname); + freeaddrinfo(res0); + debug_return_int(EAI_MEMORY); + } + } else { + sname = lname; + } + freeaddrinfo(res0); + *longp = lname; + *shortp = sname; + + debug_return_int(0); +} + +/* + * Look up the fully qualified domain name of user_host and user_runhost. + * Sets user_host, user_shost, user_runhost and user_srunhost. + */ +static bool +cb_fqdn(const union sudo_defs_val *sd_un) +{ + bool remote; + int rc; + char *lhost, *shost; + debug_decl(cb_fqdn, SUDOERS_DEBUG_PLUGIN); + + /* Nothing to do if fqdn flag is disabled. */ + if (sd_un != NULL && !sd_un->flag) + debug_return_bool(true); + + /* If the -h flag was given we need to resolve both host and runhost. */ + remote = strcmp(user_runhost, user_host) != 0; + + /* First resolve user_host, setting user_host and user_shost. */ + if (resolve_host(user_host, &lhost, &shost) != 0) { + if ((rc = resolve_host(user_runhost, &lhost, &shost)) != 0) { + gai_log_warning(SLOG_SEND_MAIL|SLOG_RAW_MSG, rc, + N_("unable to resolve host %s"), user_host); + debug_return_bool(false); + } + } + if (user_shost != user_host) + free(user_shost); + free(user_host); + user_host = lhost; + user_shost = shost; + + /* Next resolve user_runhost, setting user_runhost and user_srunhost. */ + lhost = shost = NULL; + if (remote) { + if ((rc = resolve_host(user_runhost, &lhost, &shost)) != 0) { + gai_log_warning(SLOG_NO_LOG|SLOG_RAW_MSG, rc, + N_("unable to resolve host %s"), user_runhost); + debug_return_bool(false); + } + } else { + /* Not remote, just use user_host. */ + if ((lhost = strdup(user_host)) != NULL) { + if (user_shost != user_host) + shost = strdup(user_shost); + else + shost = lhost; + } + if (lhost == NULL || shost == NULL) { + free(lhost); + if (lhost != shost) + free(shost); + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + } + if (lhost != NULL && shost != NULL) { + if (user_srunhost != user_runhost) + free(user_srunhost); + free(user_runhost); + user_runhost = lhost; + user_srunhost = shost; + } + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "host %s, shost %s, runhost %s, srunhost %s", + user_host, user_shost, user_runhost, user_srunhost); + debug_return_bool(true); +} + +/* + * Get passwd entry for the user we are going to run commands as + * and store it in runas_pw. By default, commands run as "root". + */ +static bool +set_runaspw(const char *user, bool quiet) +{ + struct passwd *pw = NULL; + debug_decl(set_runaspw, SUDOERS_DEBUG_PLUGIN); + + unknown_runas_uid = false; + if (*user == '#') { + const char *errstr; + uid_t uid = sudo_strtoid(user + 1, &errstr); + if (errstr == NULL) { + if ((pw = sudo_getpwuid(uid)) == NULL) { + unknown_runas_uid = true; + pw = sudo_fakepwnam(user, user_gid); + } + } + } + if (pw == NULL) { + if ((pw = sudo_getpwnam(user)) == NULL) { + if (!quiet) + log_warningx(SLOG_AUDIT, N_("unknown user: %s"), user); + debug_return_bool(false); + } + } + if (runas_pw != NULL) + sudo_pw_delref(runas_pw); + runas_pw = pw; + debug_return_bool(true); +} + +/* + * Get group entry for the group we are going to run commands as + * and store it in runas_gr. + */ +static bool +set_runasgr(const char *group, bool quiet) +{ + struct group *gr = NULL; + debug_decl(set_runasgr, SUDOERS_DEBUG_PLUGIN); + + unknown_runas_gid = false; + if (*group == '#') { + const char *errstr; + gid_t gid = sudo_strtoid(group + 1, &errstr); + if (errstr == NULL) { + if ((gr = sudo_getgrgid(gid)) == NULL) { + unknown_runas_gid = true; + gr = sudo_fakegrnam(group); + } + } + } + if (gr == NULL) { + if ((gr = sudo_getgrnam(group)) == NULL) { + if (!quiet) + log_warningx(SLOG_AUDIT, N_("unknown group: %s"), group); + debug_return_bool(false); + } + } + if (runas_gr != NULL) + sudo_gr_delref(runas_gr); + runas_gr = gr; + debug_return_bool(true); +} + +/* + * Callback for runas_default sudoers setting. + */ +static bool +cb_runas_default(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_runas_default, SUDOERS_DEBUG_PLUGIN); + + /* Only reset runaspw if user didn't specify one. */ + if (sudo_user.runas_user == NULL && sudo_user.runas_group == NULL) + debug_return_bool(set_runaspw(sd_un->str, true)); + debug_return_bool(true); +} + +/* + * Callback for tty_tickets sudoers setting. + */ +static bool +cb_tty_tickets(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_tty_tickets, SUDOERS_DEBUG_PLUGIN); + + /* Convert tty_tickets -> timestamp_type */ + if (sd_un->flag) + def_timestamp_type = tty; + else + def_timestamp_type = global; + debug_return_bool(true); +} + +/* + * Callback for umask sudoers setting. + */ +static bool +cb_umask(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_umask, SUDOERS_DEBUG_PLUGIN); + + /* Force umask if explicitly set in sudoers. */ + force_umask = sd_un->mode != ACCESSPERMS; + + debug_return_bool(true); +} + +/* + * Callback for runchroot sudoers setting. + */ +static bool +cb_runchroot(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_runchroot, SUDOERS_DEBUG_PLUGIN); + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "def_runchroot now %s", sd_un->str); + if (user_cmnd != NULL) { + /* Update user_cmnd based on the new chroot. */ + cmnd_status = set_cmnd_path(sd_un->str); + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "user_cmnd now %s", user_cmnd); + } + + debug_return_bool(true); +} + +static bool +cb_logfile(const union sudo_defs_val *sd_un) +{ + int logtype = def_syslog ? EVLOG_SYSLOG : EVLOG_NONE; + debug_decl(cb_logfile, SUDOERS_DEBUG_PLUGIN); + + if (sd_un->str != NULL) + SET(logtype, EVLOG_FILE); + eventlog_set_type(logtype); + eventlog_set_logpath(sd_un->str); + + debug_return_bool(true); +} + +static bool +cb_log_format(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_log_format, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_format(sd_un->tuple == sudo ? EVLOG_SUDO : EVLOG_JSON); + + debug_return_bool(true); +} + +static bool +cb_syslog(const union sudo_defs_val *sd_un) +{ + int logtype = def_logfile ? EVLOG_FILE : EVLOG_NONE; + debug_decl(cb_syslog, SUDOERS_DEBUG_PLUGIN); + + if (sd_un->str != NULL) + SET(logtype, EVLOG_SYSLOG); + eventlog_set_type(logtype); + + debug_return_bool(true); +} + +static bool +cb_syslog_goodpri(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_syslog_goodpri, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_syslog_acceptpri(sd_un->ival); + + debug_return_bool(true); +} + +static bool +cb_syslog_badpri(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_syslog_badpri, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_syslog_rejectpri(sd_un->ival); + eventlog_set_syslog_alertpri(sd_un->ival); + + debug_return_bool(true); +} + +static bool +cb_syslog_maxlen(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_syslog_maxlen, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_syslog_maxlen(sd_un->ival); + + debug_return_bool(true); +} + +static bool +cb_loglinelen(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_loglinelen, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_file_maxlen(sd_un->ival); + + debug_return_bool(true); +} + +static bool +cb_log_year(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_syslog_maxlen, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_time_fmt(sd_un->flag ? "%h %e %T %Y" : "%h %e %T"); + + debug_return_bool(true); +} + +static bool +cb_log_host(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_syslog_maxlen, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_omit_hostname(!sd_un->flag); + + debug_return_bool(true); +} + +static bool +cb_mailerpath(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_mailerpath, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_mailerpath(sd_un->str); + + debug_return_bool(true); +} + +static bool +cb_mailerflags(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_mailerflags, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_mailerflags(sd_un->str); + + debug_return_bool(true); +} + +static bool +cb_mailfrom(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_mailfrom, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_mailfrom(sd_un->str); + + debug_return_bool(true); +} + +static bool +cb_mailto(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_mailto, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_mailto(sd_un->str); + + debug_return_bool(true); +} + +static bool +cb_mailsub(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_mailsub, SUDOERS_DEBUG_PLUGIN); + + eventlog_set_mailsub(sd_un->str); + + debug_return_bool(true); +} + +/* + * Set parse Defaults callbacks. + * We do this here instead in def_data.in so we don't have to + * stub out the callbacks for visudo and testsudoers. + */ +static void +set_callbacks(void) +{ + debug_decl(set_callbacks, SUDOERS_DEBUG_PLUGIN); + + /* Set fqdn callback. */ + sudo_defs_table[I_FQDN].callback = cb_fqdn; + + /* Set group_plugin callback. */ + sudo_defs_table[I_GROUP_PLUGIN].callback = cb_group_plugin; + + /* Set runas callback. */ + sudo_defs_table[I_RUNAS_DEFAULT].callback = cb_runas_default; + + /* Set locale callback. */ + sudo_defs_table[I_SUDOERS_LOCALE].callback = sudoers_locale_callback; + + /* Set maxseq callback. */ + sudo_defs_table[I_MAXSEQ].callback = cb_maxseq; + + /* Set iolog_user callback. */ + sudo_defs_table[I_IOLOG_USER].callback = cb_iolog_user; + + /* Set iolog_group callback. */ + sudo_defs_table[I_IOLOG_GROUP].callback = cb_iolog_group; + + /* Set iolog_mode callback. */ + sudo_defs_table[I_IOLOG_MODE].callback = cb_iolog_mode; + + /* Set tty_tickets callback. */ + sudo_defs_table[I_TTY_TICKETS].callback = cb_tty_tickets; + + /* Set umask callback. */ + sudo_defs_table[I_UMASK].callback = cb_umask; + + /* Set runchroot callback. */ + sudo_defs_table[I_RUNCHROOT].callback = cb_runchroot; + + /* eventlog callbacks */ + sudo_defs_table[I_SYSLOG].callback = cb_syslog; + sudo_defs_table[I_SYSLOG_GOODPRI].callback = cb_syslog_goodpri; + sudo_defs_table[I_SYSLOG_BADPRI].callback = cb_syslog_badpri; + sudo_defs_table[I_SYSLOG_MAXLEN].callback = cb_syslog_maxlen; + sudo_defs_table[I_LOGLINELEN].callback = cb_loglinelen; + sudo_defs_table[I_LOG_HOST].callback = cb_log_host; + sudo_defs_table[I_LOGFILE].callback = cb_logfile; + sudo_defs_table[I_LOG_FORMAT].callback = cb_log_format; + sudo_defs_table[I_LOG_YEAR].callback = cb_log_year; + sudo_defs_table[I_MAILERPATH].callback = cb_mailerpath; + sudo_defs_table[I_MAILERFLAGS].callback = cb_mailerflags; + sudo_defs_table[I_MAILFROM].callback = cb_mailfrom; + sudo_defs_table[I_MAILTO].callback = cb_mailto; + sudo_defs_table[I_MAILSUB].callback = cb_mailsub; + + debug_return; +} + +/* + * Cleanup hook for sudo_fatal()/sudo_fatalx() + */ +void +sudoers_cleanup(void) +{ + struct sudo_nss *nss; + debug_decl(sudoers_cleanup, SUDOERS_DEBUG_PLUGIN); + + if (snl != NULL) { + TAILQ_FOREACH(nss, snl, entries) { + nss->close(nss); + } + } + if (def_group_plugin) + group_plugin_unload(); + sudo_freepwcache(); + sudo_freegrcache(); + + debug_return; +} + +#ifdef USE_ADMIN_FLAG +static int +create_admin_success_flag(void) +{ + char flagfile[PATH_MAX]; + int len, ret = -1; + debug_decl(create_admin_success_flag, SUDOERS_DEBUG_PLUGIN); + + /* Check whether the user is in the sudo or admin group. */ + if (!user_in_group(sudo_user.pw, "sudo") && + !user_in_group(sudo_user.pw, "admin")) + debug_return_int(true); + + /* Build path to flag file. */ + len = snprintf(flagfile, sizeof(flagfile), "%s/.sudo_as_admin_successful", + user_dir); + if (len < 0 || len >= ssizeof(flagfile)) + debug_return_int(false); + + /* Create admin flag file if it doesn't already exist. */ + if (set_perms(PERM_USER)) { + int fd = open(flagfile, O_CREAT|O_WRONLY|O_NONBLOCK|O_EXCL, 0644); + ret = fd != -1 || errno == EEXIST; + if (fd != -1) + close(fd); + if (!restore_perms()) + ret = -1; + } + debug_return_int(ret); +} +#else /* !USE_ADMIN_FLAG */ +static int +create_admin_success_flag(void) +{ + /* STUB */ + return true; +} +#endif /* USE_ADMIN_FLAG */ + +static bool +tty_present(void) +{ + debug_decl(tty_present, SUDOERS_DEBUG_PLUGIN); + + if (user_ttypath == NULL) { + int fd = open(_PATH_TTY, O_RDWR); + if (fd == -1) + debug_return_bool(false); + close(fd); + } + debug_return_bool(true); +} diff --git a/plugins/sudoers/sudoers.exp b/plugins/sudoers/sudoers.exp new file mode 100644 index 0000000..f0b2c97 --- /dev/null +++ b/plugins/sudoers/sudoers.exp @@ -0,0 +1,7 @@ +sudoers_policy +sudoers_io +sudoers_audit +sudo_getgrgid +sudo_getgrnam +sudo_gr_addref +sudo_gr_delref diff --git a/plugins/sudoers/sudoers.h b/plugins/sudoers/sudoers.h new file mode 100644 index 0000000..bece1eb --- /dev/null +++ b/plugins/sudoers/sudoers.h @@ -0,0 +1,458 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996, 1998-2005, 2007-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDOERS_SUDOERS_H +#define SUDOERS_SUDOERS_H + +#include /* for gid_t, mode_t, pid_t, size_t, uid_t */ +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ + +#define DEFAULT_TEXT_DOMAIN "sudoers" + +#include "pathnames.h" +#include "sudo_compat.h" +#include "sudo_conf.h" +#include "sudo_eventlog.h" +#include "sudo_fatal.h" +#include "sudo_gettext.h" +#include "sudo_nss.h" +#include "sudo_plugin.h" +#include "sudo_queue.h" +#include "sudo_util.h" +#include "sudoers_debug.h" + +#include "defaults.h" +#include "logging.h" +#include "parse.h" + +/* + * Info passed in from the sudo front-end. + */ +struct sudoers_open_info { + char * const *settings; + char * const *user_info; + char * const *plugin_args; +}; + +/* + * Supplementary group IDs for a user. + */ +struct gid_list { + int ngids; + GETGROUPS_T *gids; +}; + +/* + * Supplementary group names for a user. + */ +struct group_list { + int ngroups; + char **groups; +}; + +/* + * Info pertaining to the invoking user. + * XXX - can we embed struct eventlog here or use it instead? + */ +struct sudo_user { + struct timespec submit_time; + struct passwd *pw; + struct passwd *_runas_pw; + struct group *_runas_gr; + struct stat *cmnd_stat; + char *cwd; + char *name; + char *runas_user; + char *runas_group; + char *path; + char *tty; + char *ttypath; + char *host; + char *shost; + char *runhost; + char *srunhost; + char *runchroot; + char *runcwd; + char *prompt; + char *cmnd; + char *cmnd_args; + char *cmnd_base; + char *cmnd_safe; + char *class_name; + char *krb5_ccname; + struct gid_list *gid_list; + char * const * env_vars; +#ifdef HAVE_SELINUX + char *role; + char *type; +#endif +#ifdef HAVE_PRIV_SET + char *privs; + char *limitprivs; +#endif + char *iolog_file; + char *iolog_path; + GETGROUPS_T *gids; + int execfd; + int ngids; + int closefrom; + int lines; + int cols; + int flags; + int max_groups; + int timeout; + mode_t umask; + uid_t uid; + uid_t gid; + pid_t sid; +}; + +/* + * sudo_get_gidlist() type values + */ +#define ENTRY_TYPE_ANY 0x00 +#define ENTRY_TYPE_QUERIED 0x01 +#define ENTRY_TYPE_FRONTEND 0x02 + +/* + * sudo_user flag values + */ +#define RUNAS_USER_SPECIFIED 0x01 +#define RUNAS_GROUP_SPECIFIED 0x02 + +/* + * Return values for sudoers_lookup(), also used as arguments for log_auth() + * Note: cannot use '0' as a value here. + */ +#define VALIDATE_ERROR 0x001 +#define VALIDATE_SUCCESS 0x002 +#define VALIDATE_FAILURE 0x004 +#define FLAG_CHECK_USER 0x010 +#define FLAG_NO_USER 0x020 +#define FLAG_NO_HOST 0x040 +#define FLAG_NO_CHECK 0x080 +#define FLAG_NON_INTERACTIVE 0x100 +#define FLAG_BAD_PASSWORD 0x200 + +/* + * find_path()/set_cmnd() return values + */ +#define FOUND 0 +#define NOT_FOUND 1 +#define NOT_FOUND_DOT 2 +#define NOT_FOUND_ERROR 3 +#define NOT_FOUND_PATH 4 + +/* + * Various modes sudo can be in (based on arguments) in hex + */ +#define MODE_RUN 0x00000001 +#define MODE_EDIT 0x00000002 +#define MODE_VALIDATE 0x00000004 +#define MODE_INVALIDATE 0x00000008 +#define MODE_KILL 0x00000010 +#define MODE_VERSION 0x00000020 +#define MODE_HELP 0x00000040 +#define MODE_LIST 0x00000080 +#define MODE_CHECK 0x00000100 +#define MODE_ERROR 0x00000200 +#define MODE_MASK 0x0000ffff + +/* Mode flags */ +#define MODE_BACKGROUND 0x00010000 /* XXX - unused */ +#define MODE_SHELL 0x00020000 +#define MODE_LOGIN_SHELL 0x00040000 +#define MODE_IMPLIED_SHELL 0x00080000 +#define MODE_RESET_HOME 0x00100000 +#define MODE_PRESERVE_GROUPS 0x00200000 +#define MODE_PRESERVE_ENV 0x00400000 +#define MODE_NONINTERACTIVE 0x00800000 +#define MODE_IGNORE_TICKET 0x01000000 + +/* + * Used with set_perms() + */ +#define PERM_INITIAL 0x00 +#define PERM_ROOT 0x01 +#define PERM_USER 0x02 +#define PERM_FULL_USER 0x03 +#define PERM_SUDOERS 0x04 +#define PERM_RUNAS 0x05 +#define PERM_TIMESTAMP 0x06 +#define PERM_IOLOG 0x07 + +/* + * Shortcuts for sudo_user contents. + */ +#define user_name (sudo_user.name) +#define user_uid (sudo_user.uid) +#define user_gid (sudo_user.gid) +#define user_sid (sudo_user.sid) +#define user_umask (sudo_user.umask) +#define user_passwd (sudo_user.pw->pw_passwd) +#define user_dir (sudo_user.pw->pw_dir) +#define user_gids (sudo_user.gids) +#define user_ngids (sudo_user.ngids) +#define user_gid_list (sudo_user.gid_list) +#define user_tty (sudo_user.tty) +#define user_ttypath (sudo_user.ttypath) +#define user_cwd (sudo_user.cwd) +#define user_cmnd (sudo_user.cmnd) +#define user_args (sudo_user.cmnd_args) +#define user_base (sudo_user.cmnd_base) +#define user_stat (sudo_user.cmnd_stat) +#define user_path (sudo_user.path) +#define user_prompt (sudo_user.prompt) +#define user_host (sudo_user.host) +#define user_shost (sudo_user.shost) +#define user_runhost (sudo_user.runhost) +#define user_srunhost (sudo_user.srunhost) +#define user_ccname (sudo_user.krb5_ccname) +#define safe_cmnd (sudo_user.cmnd_safe) +#define cmnd_fd (sudo_user.execfd) +#define login_class (sudo_user.class_name) +#define runas_pw (sudo_user._runas_pw) +#define runas_gr (sudo_user._runas_gr) +#define user_role (sudo_user.role) +#define user_type (sudo_user.type) +#define user_closefrom (sudo_user.closefrom) +#define runas_privs (sudo_user.privs) +#define runas_limitprivs (sudo_user.limitprivs) +#define user_timeout (sudo_user.timeout) +#define user_runchroot (sudo_user.runchroot) +#define user_runcwd (sudo_user.runcwd) + +/* Default sudoers uid/gid/mode if not set by the Makefile. */ +#ifndef SUDOERS_UID +# define SUDOERS_UID 0 +#endif +#ifndef SUDOERS_GID +# define SUDOERS_GID 0 +#endif +#ifndef SUDOERS_MODE +# define SUDOERS_MODE 0600 +#endif + +struct sudo_lbuf; +struct passwd; +struct stat; +struct timespec; + +/* + * Function prototypes + */ +#define YY_DECL int sudoerslex(void) + +/* goodpath.c */ +bool sudo_goodpath(const char *path, const char *runchroot, struct stat *sbp); + +/* findpath.c */ +int find_path(const char *infile, char **outfile, struct stat *sbp, + const char *path, const char *runchroot, int ignore_dot, + char * const *allowlist); + +/* check.c */ +int check_user(int validate, int mode); +bool check_user_shell(const struct passwd *pw); +bool user_is_exempt(void); + +/* prompt.c */ +char *expand_prompt(const char *old_prompt, const char *auth_user); + +/* timestamp.c */ +int timestamp_remove(bool unlinkit); + +/* sudo_auth.c */ +bool sudo_auth_needs_end_session(void); +int verify_user(struct passwd *pw, char *prompt, int validated, struct sudo_conv_callback *callback); +int sudo_auth_begin_session(struct passwd *pw, char **user_env[]); +int sudo_auth_end_session(struct passwd *pw); +int sudo_auth_init(struct passwd *pw); +int sudo_auth_approval(struct passwd *pw, int validated, bool exempt); +int sudo_auth_cleanup(struct passwd *pw, bool force); + +/* set_perms.c */ +bool rewind_perms(void); +bool set_perms(int); +bool restore_perms(void); +int pam_prep_user(struct passwd *); + +/* gram.y */ +int sudoersparse(void); +extern char *login_style; +extern char *errorfile; +extern int errorlineno; +extern bool parse_error; +extern bool sudoers_warnings; +extern bool sudoers_recovery; +extern bool sudoers_strict; + +/* toke.l */ +YY_DECL; +extern FILE *sudoersin; +extern const char *sudoers_file; +extern char *sudoers; +extern mode_t sudoers_mode; +extern uid_t sudoers_uid; +extern gid_t sudoers_gid; +extern int sudolineno; + +/* defaults.c */ +void dump_defaults(void); +void dump_auth_methods(void); + +/* getspwuid.c */ +char *sudo_getepw(const struct passwd *); + +/* pwutil.c */ +typedef struct cache_item * (*sudo_make_pwitem_t)(uid_t uid, const char *user); +typedef struct cache_item * (*sudo_make_gritem_t)(gid_t gid, const char *group); +typedef struct cache_item * (*sudo_make_gidlist_item_t)(const struct passwd *pw, char * const *gids, unsigned int type); +typedef struct cache_item * (*sudo_make_grlist_item_t)(const struct passwd *pw, char * const *groups); +sudo_dso_public struct group *sudo_getgrgid(gid_t); +sudo_dso_public struct group *sudo_getgrnam(const char *); +sudo_dso_public void sudo_gr_addref(struct group *); +sudo_dso_public void sudo_gr_delref(struct group *); +bool user_in_group(const struct passwd *, const char *); +struct group *sudo_fakegrnam(const char *); +struct gid_list *sudo_get_gidlist(const struct passwd *pw, unsigned int type); +struct group_list *sudo_get_grlist(const struct passwd *pw); +struct passwd *sudo_fakepwnam(const char *, gid_t); +struct passwd *sudo_mkpwent(const char *user, uid_t uid, gid_t gid, const char *home, const char *shell); +struct passwd *sudo_getpwnam(const char *); +struct passwd *sudo_getpwuid(uid_t); +void sudo_endspent(void); +void sudo_freegrcache(void); +void sudo_freepwcache(void); +void sudo_gidlist_addref(struct gid_list *); +void sudo_gidlist_delref(struct gid_list *); +void sudo_grlist_addref(struct group_list *); +void sudo_grlist_delref(struct group_list *); +void sudo_pw_addref(struct passwd *); +void sudo_pw_delref(struct passwd *); +int sudo_set_gidlist(struct passwd *pw, char * const *gids, unsigned int type); +int sudo_set_grlist(struct passwd *pw, char * const *groups); +void sudo_pwutil_set_backend(sudo_make_pwitem_t, sudo_make_gritem_t, sudo_make_gidlist_item_t, sudo_make_grlist_item_t); +void sudo_setspent(void); + +/* timestr.c */ +char *get_timestr(time_t, int); + +/* boottime.c */ +bool get_boottime(struct timespec *); + +/* iolog.c */ +bool cb_maxseq(const union sudo_defs_val *sd_un); +bool cb_iolog_user(const union sudo_defs_val *sd_un); +bool cb_iolog_group(const union sudo_defs_val *sd_un); +bool cb_iolog_mode(const union sudo_defs_val *sd_un); + +/* iolog_path_escapes.c */ +struct iolog_path_escape; +extern const struct iolog_path_escape *sudoers_iolog_path_escapes; + +/* env.c */ +char **env_get(void); +bool env_merge(char * const envp[]); +bool env_swap_old(void); +bool env_init(char * const envp[]); +bool init_envtables(void); +bool insert_env_vars(char * const envp[]); +bool read_env_file(const char *path, bool overwrite, bool restricted); +bool rebuild_env(void); +bool validate_env_vars(char * const envp[]); +int sudo_setenv(const char *var, const char *val, int overwrite); +int sudo_unsetenv(const char *var); +char *sudo_getenv(const char *name); +int sudoers_hook_getenv(const char *name, char **value, void *closure); +int sudoers_hook_putenv(char *string, void *closure); +int sudoers_hook_setenv(const char *name, const char *value, int overwrite, void *closure); +int sudoers_hook_unsetenv(const char *name, void *closure); +void register_env_file(void * (*ef_open)(const char *), void (*ef_close)(void *), char * (*ef_next)(void *, int *), bool system); + +/* env_pattern.c */ +bool matches_env_pattern(const char *pattern, const char *var, bool *full_match); + +/* sudoers.c */ +FILE *open_sudoers(const char *, bool, bool *); +int set_cmnd_path(const char *runchroot); +int sudoers_init(void *info, char * const envp[]); +int sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[], bool verbose, void *closure); +void sudoers_cleanup(void); +extern struct sudo_user sudo_user; +extern struct passwd *list_pw; +extern bool force_umask; +extern int sudo_mode; +extern uid_t timestamp_uid; +extern gid_t timestamp_gid; +extern sudo_conv_t sudo_conv; +extern sudo_printf_t sudo_printf; + +/* sudoers_debug.c */ +bool sudoers_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files, const char *entry); +bool sudoers_debug_register(const char *plugin_path, struct sudo_conf_debug_file_list *debug_files); +void sudoers_debug_deregister(void); + +/* policy.c */ +int sudoers_policy_deserialize_info(void *v); +bool sudoers_policy_store_result(bool accepted, char *argv[], char *envp[], mode_t cmnd_umask, char *iolog_path, void *v); +extern const char *path_ldap_conf; +extern const char *path_ldap_secret; + +/* group_plugin.c */ +int group_plugin_load(char *plugin_info); +void group_plugin_unload(void); +int group_plugin_query(const char *user, const char *group, + const struct passwd *pwd); +bool cb_group_plugin(const union sudo_defs_val *sd_un); +extern const char *path_plugin_dir; + +/* editor.c */ +char *find_editor(int nfiles, char **files, int *argc_out, char ***argv_out, + char * const *allowlist, const char **env_editor, bool env_error); + +/* exptilde.c */ +bool expand_tilde(char **path, const char *user); + +/* gc.c */ +enum sudoers_gc_types { + GC_UNKNOWN, + GC_VECTOR, + GC_PTR +}; +bool sudoers_gc_add(enum sudoers_gc_types type, void *ptr); +bool sudoers_gc_remove(enum sudoers_gc_types type, void *ptr); +void sudoers_gc_init(void); + +/* rcstr.c */ +char *rcstr_dup(const char *src); +char *rcstr_alloc(size_t len); +char *rcstr_addref(const char *s); +void rcstr_delref(const char *s); + +#endif /* SUDOERS_SUDOERS_H */ diff --git a/plugins/sudoers/sudoers.in b/plugins/sudoers/sudoers.in new file mode 100644 index 0000000..c3ccd4f --- /dev/null +++ b/plugins/sudoers/sudoers.in @@ -0,0 +1,96 @@ +## sudoers file. +## +## This file MUST be edited with the 'visudo' command as root. +## Failure to use 'visudo' may result in syntax or file permission errors +## that prevent sudo from running. +## +## See the sudoers man page for the details on how to write a sudoers file. +## + +## +## Host alias specification +## +## Groups of machines. These may include host names (optionally with wildcards), +## IP addresses, network numbers or netgroups. +# Host_Alias WEBSERVERS = www1, www2, www3 + +## +## User alias specification +## +## Groups of users. These may consist of user names, uids, Unix groups, +## or netgroups. +# User_Alias ADMINS = millert, dowdy, mikef + +## +## Cmnd alias specification +## +## Groups of commands. Often used to group related commands together. +# Cmnd_Alias PROCESSES = /usr/bin/nice, /bin/kill, /usr/bin/renice, \ +# /usr/bin/pkill, /usr/bin/top +# Cmnd_Alias REBOOT = /sbin/halt, /sbin/reboot, /sbin/poweroff + +## +## Defaults specification +## +## You may wish to keep some of the following environment variables +## when running commands via sudo. +## +## Locale settings +# Defaults env_keep += "LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET" +## +## Run X applications through sudo; HOME is used to find the +## .Xauthority file. Note that other programs use HOME to find +## configuration files and this may lead to privilege escalation! +# Defaults env_keep += "HOME" +## +## X11 resource path settings +# Defaults env_keep += "XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH" +## +## Desktop path settings +# Defaults env_keep += "QTDIR KDEDIR" +## +## Allow sudo-run commands to inherit the callers' ConsoleKit session +# Defaults env_keep += "XDG_SESSION_COOKIE" +## +## Uncomment to enable special input methods. Care should be taken as +## this may allow users to subvert the command being run via sudo. +# Defaults env_keep += "XMODIFIERS GTK_IM_MODULE QT_IM_MODULE QT_IM_SWITCHER" +## +## Uncomment to use a hard-coded PATH instead of the user's to find commands +# Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +## +## Uncomment to send mail if the user does not enter the correct password. +# Defaults mail_badpass +## +## Uncomment to enable logging of a command's output, except for +## sudoreplay and reboot. Use sudoreplay to play back logged sessions. +# Defaults log_output +# Defaults!/usr/bin/sudoreplay !log_output +# Defaults!/usr/local/bin/sudoreplay !log_output +# Defaults!REBOOT !log_output + +## +## Runas alias specification +## + +## +## User privilege specification +## +root ALL=(ALL) ALL + +## Uncomment to allow members of group wheel to execute any command +# %wheel ALL=(ALL) ALL + +## Same thing without a password +# %wheel ALL=(ALL) NOPASSWD: ALL + +## Uncomment to allow members of group sudo to execute any command +# %sudo ALL=(ALL) ALL + +## Uncomment to allow any user to run sudo if they know the password +## of the user they are running the command as (root by default). +# Defaults targetpw # Ask for the password of the target user +# ALL ALL=(ALL) ALL # WARNING: only use this together with 'Defaults targetpw' + +## Read drop-in files from @sysconfdir@/sudoers.d +@includedir @sysconfdir@/sudoers.d diff --git a/plugins/sudoers/sudoers_debug.c b/plugins/sudoers/sudoers_debug.c new file mode 100644 index 0000000..6b03f68 --- /dev/null +++ b/plugins/sudoers/sudoers_debug.c @@ -0,0 +1,135 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include + +#include "sudoers.h" + +static int sudoers_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; +static unsigned int sudoers_debug_refcnt; + +static const char *const sudoers_subsystem_names[] = { + "alias", + "audit", + "auth", + "defaults", + "env", + "event", + "ldap", + "logging", + "main", + "match", + "netif", + "nss", + "parser", + "perms", + "plugin", + "rbtree", + "sssd", + "util", + NULL +}; + +#define NUM_SUBSYSTEMS (nitems(sudoers_subsystem_names) - 1) + +/* Subsystem IDs assigned at registration time. */ +unsigned int sudoers_subsystem_ids[NUM_SUBSYSTEMS]; + +/* + * Parse the "filename flags,..." debug_flags entry and insert a new + * sudo_debug_file struct into debug_files. + */ +bool +sudoers_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files, + const char *entry) +{ + /* Already initialized? */ + if (sudoers_debug_instance != SUDO_DEBUG_INSTANCE_INITIALIZER) + return true; + + return sudo_debug_parse_flags(debug_files, entry) != -1; +} + +/* + * Register the specified debug files and program with the + * debug subsystem, freeing the debug list when done. + * Sets the active debug instance as a side effect. + */ +bool +sudoers_debug_register(const char *program, + struct sudo_conf_debug_file_list *debug_files) +{ + int instance = sudoers_debug_instance; + struct sudo_debug_file *debug_file, *debug_next; + + /* Setup debugging if indicated. */ + if (debug_files != NULL && !TAILQ_EMPTY(debug_files)) { + if (program != NULL) { + instance = sudo_debug_register(program, sudoers_subsystem_names, + sudoers_subsystem_ids, debug_files); + } + TAILQ_FOREACH_SAFE(debug_file, debug_files, entries, debug_next) { + TAILQ_REMOVE(debug_files, debug_file, entries); + free(debug_file->debug_file); + free(debug_file->debug_flags); + free(debug_file); + } + } + + switch (instance) { + case SUDO_DEBUG_INSTANCE_ERROR: + return false; + case SUDO_DEBUG_INSTANCE_INITIALIZER: + /* Nothing to do */ + break; + default: + /* New debug instance or additional reference on existing one. */ + sudoers_debug_instance = instance; + sudo_debug_set_active_instance(sudoers_debug_instance); + sudoers_debug_refcnt++; + break; + } + + return true; +} + +/* + * Deregister sudoers_debug_instance if it is registered. + */ +void +sudoers_debug_deregister(void) +{ + debug_decl(sudoers_debug_deregister, SUDOERS_DEBUG_PLUGIN); + + if (sudoers_debug_refcnt != 0) { + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); + if (--sudoers_debug_refcnt == 0) { + if (sudo_debug_deregister(sudoers_debug_instance) < 1) + sudoers_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; + } + } +} diff --git a/plugins/sudoers/sudoers_debug.h b/plugins/sudoers/sudoers_debug.h new file mode 100644 index 0000000..a3119fe --- /dev/null +++ b/plugins/sudoers/sudoers_debug.h @@ -0,0 +1,48 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_DEBUG_H +#define SUDOERS_DEBUG_H + +#include "sudo_debug.h" + +/* + * Sudoers debug subsystems. + * Note that sudoers_subsystem_ids[] is filled in at debug registration time. + */ +extern unsigned int sudoers_subsystem_ids[]; +#define SUDOERS_DEBUG_ALIAS (sudoers_subsystem_ids[ 0]) /* sudoers alias functions */ +#define SUDOERS_DEBUG_AUDIT (sudoers_subsystem_ids[ 1]) /* audit */ +#define SUDOERS_DEBUG_AUTH (sudoers_subsystem_ids[ 2]) /* authentication functions */ +#define SUDOERS_DEBUG_DEFAULTS (sudoers_subsystem_ids[ 3]) /* sudoers defaults settings */ +#define SUDOERS_DEBUG_ENV (sudoers_subsystem_ids[ 4]) /* environment handling */ +#define SUDOERS_DEBUG_EVENT (sudoers_subsystem_ids[ 5]) /* event handling */ +#define SUDOERS_DEBUG_LDAP (sudoers_subsystem_ids[ 6]) /* sudoers LDAP */ +#define SUDOERS_DEBUG_LOGGING (sudoers_subsystem_ids[ 7]) /* logging functions */ +#define SUDOERS_DEBUG_MAIN (sudoers_subsystem_ids[ 8]) /* main() */ +#define SUDOERS_DEBUG_MATCH (sudoers_subsystem_ids[ 9]) /* sudoers matching */ +#define SUDOERS_DEBUG_NETIF (sudoers_subsystem_ids[10]) /* network interface functions */ +#define SUDOERS_DEBUG_NSS (sudoers_subsystem_ids[11]) /* network service switch */ +#define SUDOERS_DEBUG_PARSER (sudoers_subsystem_ids[12]) /* sudoers parser */ +#define SUDOERS_DEBUG_PERMS (sudoers_subsystem_ids[13]) /* uid/gid swapping functions */ +#define SUDOERS_DEBUG_PLUGIN (sudoers_subsystem_ids[14]) /* main plugin functions */ +#define SUDOERS_DEBUG_RBTREE (sudoers_subsystem_ids[15]) /* red-black tree functions */ +#define SUDOERS_DEBUG_SSSD (sudoers_subsystem_ids[16]) /* sudoers SSSD */ +#define SUDOERS_DEBUG_UTIL (sudoers_subsystem_ids[17]) /* utility functions */ + +#endif /* SUDOERS_DEBUG_H */ diff --git a/plugins/sudoers/sudoers_version.h b/plugins/sudoers/sudoers_version.h new file mode 100644 index 0000000..dada649 --- /dev/null +++ b/plugins/sudoers/sudoers_version.h @@ -0,0 +1,80 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2013, 2015, 2017, 2019-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Major sudoers grammar changes are documented here. + * Note that minor changes such as added Defaults options are not listed here. + * + * 1 sudo 1.1 + * 2 sudo 1.3, adds support specifying a directory instead of a command. + * 3 sudo 1.3.2, new parser, Aliases have to be upper case + * 4 sudo 1.3.2, adds User_Alias + * 5 sudo 1.3.4, netgroup support + * 6 sudo 1.3.5, support for escaping special chars + * 7 sudo 1.3.7, unix group support + * 8 sudo 1.4.1, wildcard support + * 9 sudo 1.4.2, double quote support in sudoers command line args + * 10 sudo 1.4.3, added NOPASSWD tag + * 11 sudo 1.4.3, added Runas_Spec + * 12 sudo 1.4.3, wildcards may be used in the pathname + * 13 sudo 1.4.3, command args of "" means no args allowed + * 14 sudo 1.4.4, '(' in command args no longer are a syntax error. + * 15 sudo 1.4.4, '!command' works in the presence of runas user or NOPASSWD. + * 16 sudo 1.4.4, all-caps user and host names are now handled properly. + * 17 sudo 1.5.0, usernames may now begin with a digit + * 18 sudo 1.5.3, adds Runas_Alias + * 19 sudo 1.5.7, %group may be used in a Runas_List + * 20 sudo 1.6.0, The runas user and NOPASSWD tags are now persistent across entries in a command list. A PASSWD tag has been added to reverse NOPASSWD + * 21 sudo 1.6.0, The '!' operator can be used in a Runas_Spec or an *_Alias + * 22 sudo 1.6.0, a list of hosts may be used in a Host_Spec + * 23 sudo 1.6.0, a list of users may be used in a User_Spec + * 24 sudo 1.6.0, It is now possible to escape "special" characters in usernames, hostnames, etc with a backslash. + * 25 sudo 1.6.0, Added Defaults run-time settings in sudoers. + * 26 sudo 1.6.0, relaxed the regexp for matching user, host, group names. + * 27 sudo 1.6.1, #uid is now allowed in a Runas_Alias. + * 28 sudo 1.6.2, Wildcards are now allowed in hostnames. + * 29 sudo 1.6.3p7, escaped special characters may be included in pathnames. + * 30 sudo 1.6.8, added NOEXEC and EXEC tags. + * 31 sudo 1.6.9, added SETENV and NOSETENV tags. + * 32 sudo 1.6.9p4, support for IPv6 address matching. + * 33 sudo 1.7.0, #include support. + * 34 sudo 1.7.0, Runas_Group support. + * 35 sudo 1.7.0, uid may now be used anywhere a username is valid. + * 36 sudo 1.7.2, #includedir support. + * 37 sudo 1.7.4, per-command Defaults support. + * 38 sudo 1.7.4, added LOG_INPUT/LOG_OUTPUT and NOLOG_INPUT/NOLOG_OUTPUT tags + * 39 sudo 1.7.6/1.8.1, White space is now permitted within a User_List in a per-user Defaults definition. + * 40 sudo 1.7.6/1.8.1, A group ID is now allowed in a User_List or Runas_List. + * 41 sudo 1.7.6/1.8.4, Support for relative paths in #include and #includedir + * 42 sudo 1.8.6, Support for empty Runas_List (with or without a colon) to mean the invoking user. Support for Solaris Privilege Sets (PRIVS= and LIMITPRIVS=). + * 43 sudo 1.8.7, Support for specifying a digest along with the command. + * 44 sudo 1.8.13, added MAIL/NOMAIL tags. + * 45 sudo 1.8.15, added FOLLOW/NOFOLLOW tags as well as sudoedit_follow and sudoedit_checkdir Defaults. + * 46 sudo 1.8.20, added TIMEOUT, NOTBEFORE and NOTAFTER options. + * 47 sudo 1.9.0, Cmd_Alias treated as Cmnd_Alias, support for multiple digests per command and for ALL. + * 48 sudo 1.9.1, @include and @includedir, include path escaping/quoting. + * 49 sudo 1.9.3, CWD and CHROOT options. + */ + +#ifndef SUDOERS_VERSION_H +#define SUDOERS_VERSION_H + +#define SUDOERS_GRAMMAR_VERSION 48 + +#endif /* SUDOERS_VERSION_H */ diff --git a/plugins/sudoers/sudoreplay.c b/plugins/sudoers/sudoreplay.c new file mode 100644 index 0000000..3d94954 --- /dev/null +++ b/plugins/sudoers/sudoreplay.c @@ -0,0 +1,1650 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include + +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#include +#ifdef HAVE_GETOPT_LONG +# include +# else +# include "compat/getopt.h" +#endif /* HAVE_GETOPT_LONG */ + +#include "pathnames.h" +#include "sudo_compat.h" +#include "sudo_conf.h" +#include "sudo_debug.h" +#include "sudo_event.h" +#include "sudo_eventlog.h" +#include "sudo_fatal.h" +#include "sudo_gettext.h" +#include "sudo_iolog.h" +#include "sudo_plugin.h" +#include "sudo_queue.h" +#include "sudo_util.h" + +#include "logging.h" + +struct replay_closure { + const char *iolog_dir; + struct sudo_event_base *evbase; + struct sudo_event *delay_ev; + struct sudo_event *keyboard_ev; + struct sudo_event *output_ev; + struct sudo_event *sighup_ev; + struct sudo_event *sigint_ev; + struct sudo_event *sigquit_ev; + struct sudo_event *sigterm_ev; + struct sudo_event *sigtstp_ev; + struct timespec *max_delay; + struct timing_closure timing; + int iolog_dir_fd; + bool interactive; + bool suspend_wait; + struct io_buffer { + unsigned int len; /* buffer length (how much produced) */ + unsigned int off; /* write position (how much already consumed) */ + unsigned int toread; /* how much remains to be read */ + int lastc; /* last char written */ + char buf[64 * 1024]; + } iobuf; +}; + +/* + * Handle expressions like: + * ( user millert or user root ) and tty console and command /bin/sh + */ +STAILQ_HEAD(search_node_list, search_node); +struct search_node { + STAILQ_ENTRY(search_node) entries; +#define ST_EXPR 1 +#define ST_TTY 2 +#define ST_USER 3 +#define ST_PATTERN 4 +#define ST_RUNASUSER 5 +#define ST_RUNASGROUP 6 +#define ST_FROMDATE 7 +#define ST_TODATE 8 +#define ST_CWD 9 +#define ST_HOST 10 + char type; + bool negated; + bool or; + union { + regex_t cmdre; + struct timespec tstamp; + char *cwd; + char *host; + char *tty; + char *user; + char *runas_group; + char *runas_user; + struct search_node_list expr; + void *ptr; + } u; +}; + +static struct search_node_list search_expr = STAILQ_HEAD_INITIALIZER(search_expr); + +static double speed_factor = 1.0; + +static const char *session_dir = _PATH_SUDO_IO_LOGDIR; + +static bool terminal_can_resize, terminal_was_resized, follow_mode; + +static int terminal_lines, terminal_cols; + +static int ttyfd = -1; + +static struct iolog_file iolog_files[] = { + { false }, /* IOFD_STDIN */ + { false }, /* IOFD_STDOUT */ + { false }, /* IOFD_STDERR */ + { false }, /* IOFD_TTYIN */ + { false }, /* IOFD_TTYOUT */ + { true, }, /* IOFD_TIMING */ +}; + +static const char short_opts[] = "d:f:Fhlm:nRSs:V"; +static struct option long_opts[] = { + { "directory", required_argument, NULL, 'd' }, + { "filter", required_argument, NULL, 'f' }, + { "follow", no_argument, NULL, 'F' }, + { "help", no_argument, NULL, 'h' }, + { "list", no_argument, NULL, 'l' }, + { "max-wait", required_argument, NULL, 'm' }, + { "non-interactive", no_argument, NULL, 'n' }, + { "no-resize", no_argument, NULL, 'R' }, + { "suspend-wait", no_argument, NULL, 'S' }, + { "speed", required_argument, NULL, 's' }, + { "version", no_argument, NULL, 'V' }, + { NULL, no_argument, NULL, '\0' }, +}; + +/* XXX move to separate header? (currently in sudoers.h) */ +extern char *get_timestr(time_t, int); +extern time_t get_date(char *); + +static int list_sessions(int, char **, const char *, const char *, const char *); +static int parse_expr(struct search_node_list *, char **, bool); +static void read_keyboard(int fd, int what, void *v); +static void help(void) __attribute__((__noreturn__)); +static int replay_session(int iolog_dir_fd, const char *iolog_dir, + struct timespec *max_wait, const char *decimal, bool interactive, + bool suspend_wait); +static void sudoreplay_cleanup(void); +static void usage(int); +static void write_output(int fd, int what, void *v); +static void restore_terminal_size(void); +static void setup_terminal(struct eventlog *evlog, bool interactive, bool resize); + +#define VALID_ID(s) (isalnum((unsigned char)(s)[0]) && \ + isalnum((unsigned char)(s)[1]) && isalnum((unsigned char)(s)[2]) && \ + isalnum((unsigned char)(s)[3]) && isalnum((unsigned char)(s)[4]) && \ + isalnum((unsigned char)(s)[5]) && (s)[6] == '\0') + +#define IS_IDLOG(s) ( \ + isalnum((unsigned char)(s)[0]) && isalnum((unsigned char)(s)[1]) && \ + (s)[2] == '/' && \ + isalnum((unsigned char)(s)[3]) && isalnum((unsigned char)(s)[4]) && \ + (s)[5] == '/' && \ + isalnum((unsigned char)(s)[6]) && isalnum((unsigned char)(s)[7]) && \ + (s)[8] == '\0') + +sudo_dso_public int main(int argc, char *argv[]); + +int +main(int argc, char *argv[]) +{ + int ch, i, iolog_dir_fd, len, exitcode = EXIT_FAILURE; + bool def_filter = true, listonly = false; + bool interactive = true, suspend_wait = false, resize = true; + const char *decimal, *id, *user = NULL, *pattern = NULL, *tty = NULL; + char *cp, *ep, iolog_dir[PATH_MAX]; + struct eventlog *evlog; + struct timespec max_delay_storage, *max_delay = NULL; + double dval; + debug_decl(main, SUDO_DEBUG_MAIN); + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + { + extern char *malloc_options; + malloc_options = "S"; + } +#endif + + initprogname(argc > 0 ? argv[0] : "sudoreplay"); + setlocale(LC_ALL, ""); + decimal = localeconv()->decimal_point; + bindtextdomain("sudoers", LOCALEDIR); /* XXX - should have sudoreplay domain */ + textdomain("sudoers"); + + /* Register fatal/fatalx callback. */ + sudo_fatal_callback_register(sudoreplay_cleanup); + + /* Read sudo.conf and initialize the debug subsystem. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG) == -1) + exit(EXIT_FAILURE); + sudo_debug_register(getprogname(), NULL, NULL, + sudo_conf_debug_files(getprogname())); + + while ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch (ch) { + case 'd': + session_dir = optarg; + break; + case 'f': + /* Set the replay filter. */ + def_filter = false; + for (cp = strtok_r(optarg, ",", &ep); cp; cp = strtok_r(NULL, ",", &ep)) { + if (strcmp(cp, "stdin") == 0) + iolog_files[IOFD_STDIN].enabled = true; + else if (strcmp(cp, "stdout") == 0) + iolog_files[IOFD_STDOUT].enabled = true; + else if (strcmp(cp, "stderr") == 0) + iolog_files[IOFD_STDERR].enabled = true; + else if (strcmp(cp, "ttyin") == 0) + iolog_files[IOFD_TTYIN].enabled = true; + else if (strcmp(cp, "ttyout") == 0) + iolog_files[IOFD_TTYOUT].enabled = true; + else + sudo_fatalx(U_("invalid filter option: %s"), optarg); + } + break; + case 'F': + follow_mode = true; + break; + case 'h': + help(); + /* NOTREACHED */ + case 'l': + listonly = true; + break; + case 'm': + errno = 0; + dval = strtod(optarg, &ep); + if (*ep != '\0' || errno != 0) + sudo_fatalx(U_("invalid max wait: %s"), optarg); + if (dval <= 0.0) { + sudo_timespecclear(&max_delay_storage); + } else { + max_delay_storage.tv_sec = dval; + max_delay_storage.tv_nsec = + (dval - max_delay_storage.tv_sec) * 1000000000.0; + } + max_delay = &max_delay_storage; + break; + case 'n': + interactive = false; + break; + case 'R': + resize = false; + break; + case 'S': + suspend_wait = true; + break; + case 's': + errno = 0; + speed_factor = strtod(optarg, &ep); + if (*ep != '\0' || errno != 0) + sudo_fatalx(U_("invalid speed factor: %s"), optarg); + break; + case 'V': + (void) printf(_("%s version %s\n"), getprogname(), PACKAGE_VERSION); + exitcode = EXIT_SUCCESS; + goto done; + default: + usage(1); + /* NOTREACHED */ + } + + } + argc -= optind; + argv += optind; + + if (listonly) { + exitcode = list_sessions(argc, argv, pattern, user, tty); + goto done; + } + + if (argc != 1) + usage(1); + + /* By default we replay stdout, stderr and ttyout. */ + if (def_filter) { + iolog_files[IOFD_STDOUT].enabled = true; + iolog_files[IOFD_STDERR].enabled = true; + iolog_files[IOFD_TTYOUT].enabled = true; + } + + /* 6 digit ID in base 36, e.g. 01G712AB or free-form name */ + id = argv[0]; + if (VALID_ID(id)) { + len = snprintf(iolog_dir, sizeof(iolog_dir), "%s/%.2s/%.2s/%.2s", + session_dir, id, &id[2], &id[4]); + if (len < 0 || len >= ssizeof(iolog_dir)) + sudo_fatalx(U_("%s/%.2s/%.2s/%.2s: %s"), session_dir, + id, &id[2], &id[4], strerror(ENAMETOOLONG)); + } else if (id[0] == '/') { + len = snprintf(iolog_dir, sizeof(iolog_dir), "%s", id); + if (len < 0 || len >= ssizeof(iolog_dir)) + sudo_fatalx(U_("%s/timing: %s"), id, strerror(ENAMETOOLONG)); + } else { + len = snprintf(iolog_dir, sizeof(iolog_dir), "%s/%s", session_dir, id); + if (len < 0 || len >= ssizeof(iolog_dir)) { + sudo_fatalx(U_("%s/%s: %s"), session_dir, id, + strerror(ENAMETOOLONG)); + } + } + + /* Open files for replay, applying replay filter for the -f flag. */ + if ((iolog_dir_fd = iolog_openat(AT_FDCWD, iolog_dir, O_RDONLY)) == -1) + sudo_fatal("%s", iolog_dir); + for (i = 0; i < IOFD_MAX; i++) { + if (!iolog_open(&iolog_files[i], iolog_dir_fd, i, "r")) { + if (errno != ENOENT) { + sudo_fatal(U_("unable to open %s/%s"), iolog_dir, + iolog_fd_to_name(i)); + } + } + } + if (!iolog_files[IOFD_TIMING].enabled) { + sudo_fatal(U_("unable to open %s/%s"), iolog_dir, + iolog_fd_to_name(IOFD_TIMING)); + } + + /* Parse log file. */ + if ((evlog = iolog_parse_loginfo(iolog_dir_fd, iolog_dir)) == NULL) + goto done; + printf(_("Replaying sudo session: %s"), evlog->command); + + /* Setup terminal if appropriate. */ + if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) + interactive = false; + setup_terminal(evlog, interactive, resize); + putchar('\r'); + putchar('\n'); + + /* Done with parsed log file. */ + eventlog_free(evlog); + evlog = NULL; + + /* Replay session corresponding to iolog_files[]. */ + exitcode = replay_session(iolog_dir_fd, iolog_dir, max_delay, decimal, + interactive, suspend_wait); + + restore_terminal_size(); + sudo_term_restore(ttyfd, true); +done: + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); + return exitcode; +} + +/* + * List of terminals that support xterm-like resizing. + * This is not an exhaustive list. + * For a list of VT100 style escape codes, see: + * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#VT100%20Mode + */ +struct term_names { + const char *name; + unsigned int len; +} compatible_terms[] = { + { "Eterm", 5 }, + { "aterm", 5 }, + { "dtterm", 6 }, + { "gnome", 5 }, + { "konsole", 7 }, + { "kvt\0", 4 }, + { "mlterm", 6 }, + { "rxvt", 4 }, + { "xterm", 5 }, + { NULL, 0 } +}; + +struct getsize_closure { + int nums[2]; + int nums_depth; + int nums_maxdepth; + int state; + const char *cp; + struct sudo_event *ev; + struct timespec timeout; +}; + +/* getsize states */ +#define INITIAL 0x00 +#define NEW_NUMBER 0x01 +#define NUMBER 0x02 +#define GOTSIZE 0x04 +#define READCHAR 0x10 + +/* + * Callback for reading the terminal size response. + * We use an event for this to support timeouts. + */ +static void +getsize_cb(int fd, int what, void *v) +{ + struct getsize_closure *gc = v; + unsigned char ch = '\0'; + debug_decl(getsize_cb, SUDO_DEBUG_UTIL); + + for (;;) { + if (gc->cp[0] == '\0') { + gc->state = GOTSIZE; + goto done; + } + if (ISSET(gc->state, READCHAR)) { + ssize_t nread = read(ttyfd, &ch, 1); + switch (nread) { + case -1: + if (errno == EAGAIN) + goto another; + FALLTHROUGH; + case 0: + goto done; + default: + CLR(gc->state, READCHAR); + break; + } + } + switch (gc->state) { + case INITIAL: + if (ch == 0233 && gc->cp[0] == '\033') { + /* meta escape, equivalent to ESC[ */ + ch = '['; + gc->cp++; + } + if (gc->cp[0] == '%' && gc->cp[1] == 'd') { + gc->state = NEW_NUMBER; + continue; + } + if (gc->cp[0] != ch) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "got %d, expected %d", ch, gc->cp[0]); + goto done; + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "got %d", ch); + SET(gc->state, READCHAR); + gc->cp++; + break; + case NEW_NUMBER: + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "parsing number"); + if (!isdigit(ch)) + goto done; + gc->cp += 2; + if (gc->nums_depth > gc->nums_maxdepth) + goto done; + gc->nums[gc->nums_depth] = 0; + gc->state = NUMBER; + FALLTHROUGH; + case NUMBER: + if (!isdigit(ch)) { + /* done with number, reparse ch */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "number %d (ch %d)", gc->nums[gc->nums_depth], ch); + gc->nums_depth++; + gc->state = INITIAL; + continue; + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "got %d", ch); + if (gc->nums[gc->nums_depth] > INT_MAX / 10) + goto done; + gc->nums[gc->nums_depth] *= 10; + gc->nums[gc->nums_depth] += (ch - '0'); + SET(gc->state, READCHAR); + break; + } + } + +another: + if (sudo_ev_add(NULL, gc->ev, &gc->timeout, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); +done: + debug_return; +} + + +/* + * Get the terminal size using vt100 terminal escapes. + */ +static bool +xterm_get_size(int *new_lines, int *new_cols) +{ + struct sudo_event_base *evbase; + struct getsize_closure gc; + const char getsize_request[] = "\0337\033[r\033[999;999H\033[6n"; + const char getsize_response[] = "\033[%d;%dR"; + bool ret = false; + debug_decl(xterm_get_size, SUDO_DEBUG_UTIL); + + /* request the terminal's size */ + if (write(ttyfd, getsize_request, strlen(getsize_request)) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "%s: error writing xterm size request", __func__); + goto done; + } + + /* + * Callback info for reading back the size with a 10 second timeout. + * We expect two numbers (lines and cols). + */ + gc.state = INITIAL|READCHAR; + gc.nums_depth = 0; + gc.nums_maxdepth = 1; + gc.cp = getsize_response; + gc.timeout.tv_sec = 10; + gc.timeout.tv_nsec = 0; + + /* Setup an event for reading the terminal size */ + evbase = sudo_ev_base_alloc(); + if (evbase == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + gc.ev = sudo_ev_alloc(ttyfd, SUDO_EV_READ, getsize_cb, &gc); + if (gc.ev == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Read back terminal size response */ + if (sudo_ev_add(evbase, gc.ev, &gc.timeout, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + sudo_ev_dispatch(evbase); + + if (gc.state == GOTSIZE) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "terminal size %d x %x", gc.nums[0], gc.nums[1]); + *new_lines = gc.nums[0]; + *new_cols = gc.nums[1]; + ret = true; + } + + sudo_ev_base_free(evbase); + sudo_ev_free(gc.ev); + +done: + debug_return_bool(ret); +} + +/* + * Set the size of the text area to lines and cols. + * Depending on the terminal implementation, the window itself may + * or may not shrink to a smaller size. + */ +static bool +xterm_set_size(int lines, int cols) +{ + const char setsize_fmt[] = "\033[8;%d;%dt"; + int len, new_lines, new_cols; + bool ret = false; + char buf[1024]; + debug_decl(xterm_set_size, SUDO_DEBUG_UTIL); + + /* XXX - save cursor and position restore after resizing */ + len = snprintf(buf, sizeof(buf), setsize_fmt, lines, cols); + if (len < 0 || len >= ssizeof(buf)) { + /* not possible due to size of buf */ + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: internal error, buffer too small?", __func__); + goto done; + } + if (write(ttyfd, buf, strlen(buf)) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "%s: error writing xterm resize request", __func__); + goto done; + } + /* XXX - keyboard input will interfere with this */ + if (!xterm_get_size(&new_lines, &new_cols)) + goto done; + if (lines == new_lines && cols == new_cols) + ret = true; + +done: + debug_return_bool(ret); +} + +static void +setup_terminal(struct eventlog *evlog, bool interactive, bool resize) +{ + const char *term; + debug_decl(check_terminal, SUDO_DEBUG_UTIL); + + fflush(stdout); + + /* Open fd for /dev/tty and set to raw mode. */ + if (interactive) { + ttyfd = open(_PATH_TTY, O_RDWR); + while (!sudo_term_raw(ttyfd, 1)) { + if (errno != EINTR) + sudo_fatal("%s", U_("unable to set tty to raw mode")); + kill(getpid(), SIGTTOU); + } + } + + /* Find terminal size if the session has size info. */ + if (evlog->lines == 0 && evlog->columns == 0) { + /* no tty size info, hope for the best... */ + debug_return; + } + + if (resize && ttyfd != -1) { + term = getenv("TERM"); + if (term != NULL && *term != '\0') { + struct term_names *tn; + + for (tn = compatible_terms; tn->name != NULL; tn++) { + if (strncmp(term, tn->name, tn->len) == 0) { + /* xterm-like terminals can resize themselves. */ + if (xterm_get_size(&terminal_lines, &terminal_cols)) + terminal_can_resize = true; + break; + } + } + } + } + + if (!terminal_can_resize) { + /* either not xterm or not interactive */ + sudo_get_ttysize(&terminal_lines, &terminal_cols); + } + + if (evlog->lines == terminal_lines && evlog->columns == terminal_cols) { + /* nothing to change */ + debug_return; + } + + if (terminal_can_resize) { + /* session terminal size is different, try to resize ours */ + if (xterm_set_size(evlog->lines, evlog->columns)) { + /* success */ + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "resized terminal to %d x %x", evlog->lines, evlog->columns); + terminal_was_resized = true; + debug_return; + } + /* resize failed, don't try again */ + terminal_can_resize = false; + } + + if (evlog->lines > terminal_lines || evlog->columns > terminal_cols) { + fputs(_("Warning: your terminal is too small to properly replay the log.\n"), stdout); + printf(_("Log geometry is %d x %d, your terminal's geometry is %d x %d."), evlog->lines, evlog->columns, terminal_lines, terminal_cols); + } + debug_return; +} + +static void +resize_terminal(int lines, int cols) +{ + debug_decl(resize_terminal, SUDO_DEBUG_UTIL); + + if (terminal_can_resize) { + if (xterm_set_size(lines, cols)) + terminal_was_resized = true; + else + terminal_can_resize = false; + } + + debug_return; +} + +static void +restore_terminal_size(void) +{ + debug_decl(restore_terminal, SUDO_DEBUG_UTIL); + + if (terminal_was_resized) { + /* We are still in raw mode, hence the carriage return. */ + putchar('\r'); + fputs(U_("Replay finished, press any key to restore the terminal."), + stdout); + fflush(stdout); + (void)getchar(); + xterm_set_size(terminal_lines, terminal_cols); + putchar('\r'); + putchar('\n'); + } + + debug_return; +} + +static bool +iolog_complete(struct replay_closure *closure) +{ + struct stat sb; + debug_decl(iolog_complete, SUDO_DEBUG_UTIL); + + if (fstatat(closure->iolog_dir_fd, "timing", &sb, 0) != -1) { + if (ISSET(sb.st_mode, S_IWUSR|S_IWGRP|S_IWOTH)) + debug_return_bool(false); + } + + debug_return_bool(true); +} + +/* + * Read the next record from the timing file and schedule a delay + * event with the specified timeout. + * In follow mode, ignore EOF and just delay for a short time. + * Return 0 on success, 1 on EOF and -1 on error. + */ +static int +get_timing_record(struct replay_closure *closure) +{ + struct timing_closure *timing = &closure->timing; + bool nodelay = false; + debug_decl(get_timing_record, SUDO_DEBUG_UTIL); + + if (follow_mode && timing->event == IO_EVENT_COUNT) { + /* In follow mode, we already waited. */ + nodelay = true; + } + + switch (iolog_read_timing_record(&iolog_files[IOFD_TIMING], timing)) { + case -1: + /* error */ + debug_return_int(-1); + case 1: + /* EOF */ + if (!follow_mode || iolog_complete(closure)) { + debug_return_int(1); + } + /* Follow mode, keep reading until done. */ + iolog_clearerr(&iolog_files[IOFD_TIMING]); + timing->delay.tv_sec = 0; + timing->delay.tv_nsec = 1000000; + timing->iol = NULL; + timing->event = IO_EVENT_COUNT; + break; + default: + /* Record number bytes to read. */ + if (timing->event != IO_EVENT_WINSIZE && + timing->event != IO_EVENT_SUSPEND) { + closure->iobuf.len = 0; + closure->iobuf.off = 0; + closure->iobuf.lastc = '\0'; + closure->iobuf.toread = timing->u.nbytes; + } + + if (nodelay) { + /* Already waited, fire immediately. */ + timing->delay.tv_sec = 0; + timing->delay.tv_nsec = 0; + } else { + /* Adjust delay using speed factor and max_delay. */ + iolog_adjust_delay(&timing->delay, closure->max_delay, + speed_factor); + } + break; + } + + /* Schedule the delay event. */ + if (sudo_ev_add(closure->evbase, closure->delay_ev, &timing->delay, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + + debug_return_int(0); +} + +/* + * Read next timing record. + * Exits the event loop on EOF, breaks out on error. + */ +static void +next_timing_record(struct replay_closure *closure) +{ + debug_decl(next_timing_record, SUDO_DEBUG_UTIL); + +again: + switch (get_timing_record(closure)) { + case 0: + /* success */ + if (closure->timing.event == IO_EVENT_SUSPEND && + closure->timing.u.signo == SIGCONT && !closure->suspend_wait) { + /* Ignore time spent suspended. */ + goto again; + } + break; + case 1: + /* EOF */ + sudo_ev_loopexit(closure->evbase); + break; + default: + /* error */ + sudo_ev_loopbreak(closure->evbase); + break; + } + debug_return; +} + +static bool +fill_iobuf(struct replay_closure *closure) +{ + const size_t space = sizeof(closure->iobuf.buf) - closure->iobuf.len; + const struct timing_closure *timing = &closure->timing; + const char *errstr; + debug_decl(fill_iobuf, SUDO_DEBUG_UTIL); + + if (closure->iobuf.toread != 0 && space != 0) { + const size_t len = + closure->iobuf.toread < space ? closure->iobuf.toread : space; + ssize_t nread = iolog_read(timing->iol, + closure->iobuf.buf + closure->iobuf.off, len, &errstr); + if (nread <= 0) { + if (nread == 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s/%s: premature EOF, expected %u bytes", + closure->iolog_dir, iolog_fd_to_name(timing->event), + closure->iobuf.toread); + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s/%s: read error: %s", closure->iolog_dir, + iolog_fd_to_name(timing->event), errstr); + } + sudo_warnx(U_("unable to read %s/%s: %s"), + closure->iolog_dir, iolog_fd_to_name(timing->event), errstr); + debug_return_bool(false); + } + closure->iobuf.toread -= nread; + closure->iobuf.len += nread; + } + + debug_return_bool(true); +} + +/* + * Called when the inter-record delay has expired. + * Depending on the record type, either reads the next + * record or changes window size. + */ +static void +delay_cb(int fd, int what, void *v) +{ + struct replay_closure *closure = v; + struct timing_closure *timing = &closure->timing; + debug_decl(delay_cb, SUDO_DEBUG_UTIL); + + switch (timing->event) { + case IO_EVENT_WINSIZE: + resize_terminal(timing->u.winsize.lines, timing->u.winsize.cols); + break; + case IO_EVENT_STDIN: + if (iolog_files[IOFD_STDIN].enabled) + timing->iol = &iolog_files[IOFD_STDIN]; + break; + case IO_EVENT_STDOUT: + if (iolog_files[IOFD_STDOUT].enabled) + timing->iol = &iolog_files[IOFD_STDOUT]; + break; + case IO_EVENT_STDERR: + if (iolog_files[IOFD_STDERR].enabled) + timing->iol = &iolog_files[IOFD_STDERR]; + break; + case IO_EVENT_TTYIN: + if (iolog_files[IOFD_TTYIN].enabled) + timing->iol = &iolog_files[IOFD_TTYIN]; + break; + case IO_EVENT_TTYOUT: + if (iolog_files[IOFD_TTYOUT].enabled) + timing->iol = &iolog_files[IOFD_TTYOUT]; + break; + } + + if (timing->iol != NULL) { + /* If the stream is open, enable the write event. */ + if (sudo_ev_add(closure->evbase, closure->output_ev, NULL, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + } else { + /* Not replaying, get the next timing record and continue. */ + next_timing_record(closure); + } + + debug_return; +} + +static void +replay_closure_free(struct replay_closure *closure) +{ + /* + * Free events and event base, then the closure itself. + */ + if (closure->iolog_dir_fd != -1) + close(closure->iolog_dir_fd); + sudo_ev_free(closure->delay_ev); + sudo_ev_free(closure->keyboard_ev); + sudo_ev_free(closure->output_ev); + sudo_ev_free(closure->sighup_ev); + sudo_ev_free(closure->sigint_ev); + sudo_ev_free(closure->sigquit_ev); + sudo_ev_free(closure->sigterm_ev); + sudo_ev_free(closure->sigtstp_ev); + sudo_ev_base_free(closure->evbase); + free(closure); +} + +static void +signal_cb(int signo, int what, void *v) +{ + struct replay_closure *closure = v; + debug_decl(signal_cb, SUDO_DEBUG_UTIL); + + switch (signo) { + case SIGHUP: + case SIGINT: + case SIGQUIT: + case SIGTERM: + /* Free the event base and restore signal handlers. */ + replay_closure_free(closure); + + /* Restore the terminal and die. */ + sudoreplay_cleanup(); + kill(getpid(), signo); + break; + case SIGTSTP: + /* Ignore ^Z since we have no way to restore the screen. */ + break; + } + + debug_return; +} + +static struct replay_closure * +replay_closure_alloc(int iolog_dir_fd, const char *iolog_dir, + struct timespec *max_delay, const char *decimal, bool interactive, + bool suspend_wait) +{ + struct replay_closure *closure; + debug_decl(replay_closure_alloc, SUDO_DEBUG_UTIL); + + if ((closure = calloc(1, sizeof(*closure))) == NULL) + debug_return_ptr(NULL); + + closure->iolog_dir_fd = iolog_dir_fd; + closure->iolog_dir = iolog_dir; + closure->interactive = interactive; + closure->suspend_wait = suspend_wait; + closure->max_delay = max_delay; + closure->timing.decimal = decimal; + + /* + * Setup event base and delay, input and output events. + * If interactive, take input from and write to /dev/tty. + * If not interactive there is no input event. + */ + closure->evbase = sudo_ev_base_alloc(); + if (closure->evbase == NULL) + goto bad; + closure->delay_ev = sudo_ev_alloc(-1, SUDO_EV_TIMEOUT, delay_cb, closure); + if (closure->delay_ev == NULL) + goto bad; + if (interactive) { + closure->keyboard_ev = sudo_ev_alloc(ttyfd, SUDO_EV_READ|SUDO_EV_PERSIST, + read_keyboard, closure); + if (closure->keyboard_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->keyboard_ev, NULL, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + } + closure->output_ev = sudo_ev_alloc(interactive ? ttyfd : STDOUT_FILENO, + SUDO_EV_WRITE, write_output, closure); + if (closure->output_ev == NULL) + goto bad; + + /* + * Setup signal events, we need to restore the terminal if killed. + */ + closure->sighup_ev = sudo_ev_alloc(SIGHUP, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sighup_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sighup_ev, NULL, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + + closure->sigint_ev = sudo_ev_alloc(SIGINT, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sigint_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sigint_ev, NULL, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + + closure->sigquit_ev = sudo_ev_alloc(SIGQUIT, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sigquit_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sigquit_ev, NULL, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + + closure->sigterm_ev = sudo_ev_alloc(SIGTERM, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sigterm_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sigterm_ev, NULL, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + + closure->sigtstp_ev = sudo_ev_alloc(SIGTSTP, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sigtstp_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sigtstp_ev, NULL, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + + debug_return_ptr(closure); +bad: + replay_closure_free(closure); + debug_return_ptr(NULL); +} + +static int +replay_session(int iolog_dir_fd, const char *iolog_dir, + struct timespec *max_delay, const char *decimal, bool interactive, + bool suspend_wait) +{ + struct replay_closure *closure; + int ret = 0; + debug_decl(replay_session, SUDO_DEBUG_UTIL); + + /* Allocate the delay closure and read the first timing record. */ + closure = replay_closure_alloc(iolog_dir_fd, iolog_dir, max_delay, decimal, + interactive, suspend_wait); + if (get_timing_record(closure) != 0) { + ret = 1; + goto done; + } + + /* Run event loop. */ + sudo_ev_dispatch(closure->evbase); + if (sudo_ev_got_break(closure->evbase)) + ret = 1; + +done: + /* Clean up and return. */ + replay_closure_free(closure); + debug_return_int(ret); +} + +/* + * Write the I/O buffer. + */ +static void +write_output(int fd, int what, void *v) +{ + struct replay_closure *closure = v; + const struct timing_closure *timing = &closure->timing; + struct io_buffer *iobuf = &closure->iobuf; + unsigned iovcnt = 1; + struct iovec iov[2]; + bool added_cr = false; + size_t nbytes, nwritten; + debug_decl(write_output, SUDO_DEBUG_UTIL); + + /* Refill iobuf if there is more to read and buf is empty. */ + if (!fill_iobuf(closure)) { + sudo_ev_loopbreak(closure->evbase); + debug_return; + } + + nbytes = iobuf->len - iobuf->off; + iov[0].iov_base = iobuf->buf + iobuf->off; + iov[0].iov_len = nbytes; + + if (closure->interactive && + (timing->event == IO_EVENT_STDOUT || timing->event == IO_EVENT_STDERR)) { + char *nl; + + /* + * We may need to insert a carriage return before the newline. + * Note that the carriage return may have already been written. + */ + nl = memchr(iov[0].iov_base, '\n', iov[0].iov_len); + if (nl != NULL) { + size_t len = (size_t)(nl - (char *)iov[0].iov_base); + if ((nl == iov[0].iov_base && iobuf->lastc != '\r') || + (nl != iov[0].iov_base && nl[-1] != '\r')) { + iov[0].iov_len = len; + iov[1].iov_base = "\r\n"; + iov[1].iov_len = 2; + iovcnt = 2; + nbytes = iov[0].iov_len + iov[1].iov_len; + added_cr = true; + } + } + } + + nwritten = writev(fd, iov, iovcnt); + switch ((ssize_t)nwritten) { + case -1: + if (errno != EINTR && errno != EAGAIN) + sudo_fatal(U_("unable to write to %s"), "stdout"); + break; + case 0: + /* Should not happen. */ + break; + default: + if (added_cr && nwritten >= nbytes - 1) { + /* The last char written was either '\r' or '\n'. */ + iobuf->lastc = nwritten == nbytes ? '\n' : '\r'; + } else { + /* Stash the last char written. */ + iobuf->lastc = *((char *)iov[0].iov_base + nwritten); + } + if (added_cr) { + /* Subtract one for the carriage return we added above. */ + nwritten--; + } + iobuf->off += nwritten; + break; + } + + if (iobuf->off == iobuf->len) { + /* Write complete, go to next timing entry if possible. */ + switch (get_timing_record(closure)) { + case 0: + /* success */ + break; + case 1: + /* EOF */ + sudo_ev_loopexit(closure->evbase); + break; + default: + /* error */ + sudo_ev_loopbreak(closure->evbase); + break; + } + } else { + /* Reschedule event to write remainder. */ + if (sudo_ev_add(NULL, closure->output_ev, NULL, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + } + debug_return; +} + +/* + * Build expression list from search args + */ +static int +parse_expr(struct search_node_list *head, char *argv[], bool sub_expr) +{ + bool or = false, not = false; + struct search_node *sn; + char type, **av; + debug_decl(parse_expr, SUDO_DEBUG_UTIL); + + for (av = argv; *av != NULL; av++) { + switch (av[0][0]) { + case 'a': /* and (ignore) */ + if (strncmp(*av, "and", strlen(*av)) != 0) + goto bad; + continue; + case 'o': /* or */ + if (strncmp(*av, "or", strlen(*av)) != 0) + goto bad; + or = true; + continue; + case '!': /* negate */ + if (av[0][1] != '\0') + goto bad; + not = true; + continue; + case 'c': /* cwd or command */ + if (av[0][1] == '\0') + sudo_fatalx(U_("ambiguous expression \"%s\""), *av); + if (strncmp(*av, "cwd", strlen(*av)) == 0) + type = ST_CWD; + else if (strncmp(*av, "command", strlen(*av)) == 0) + type = ST_PATTERN; + else + goto bad; + break; + case 'f': /* from date */ + if (strncmp(*av, "fromdate", strlen(*av)) != 0) + goto bad; + type = ST_FROMDATE; + break; + case 'g': /* runas group */ + if (strncmp(*av, "group", strlen(*av)) != 0) + goto bad; + type = ST_RUNASGROUP; + break; + case 'h': /* host */ + if (strncmp(*av, "host", strlen(*av)) != 0) + goto bad; + type = ST_HOST; + break; + case 'r': /* runas user */ + if (strncmp(*av, "runas", strlen(*av)) != 0) + goto bad; + type = ST_RUNASUSER; + break; + case 't': /* tty or to date */ + if (av[0][1] == '\0') + sudo_fatalx(U_("ambiguous expression \"%s\""), *av); + if (strncmp(*av, "todate", strlen(*av)) == 0) + type = ST_TODATE; + else if (strncmp(*av, "tty", strlen(*av)) == 0) + type = ST_TTY; + else + goto bad; + break; + case 'u': /* user */ + if (strncmp(*av, "user", strlen(*av)) != 0) + goto bad; + type = ST_USER; + break; + case '(': /* start sub-expression */ + if (av[0][1] != '\0') + goto bad; + type = ST_EXPR; + break; + case ')': /* end sub-expression */ + if (av[0][1] != '\0') + goto bad; + if (!sub_expr) + sudo_fatalx("%s", U_("unmatched ')' in expression")); + debug_return_int(av - argv + 1); + default: + bad: + sudo_fatalx(U_("unknown search term \"%s\""), *av); + /* NOTREACHED */ + } + + /* Allocate new search node */ + if ((sn = calloc(1, sizeof(*sn))) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sn->type = type; + sn->or = or; + sn->negated = not; + if (type == ST_EXPR) { + STAILQ_INIT(&sn->u.expr); + av += parse_expr(&sn->u.expr, av + 1, true); + } else { + if (*(++av) == NULL) + sudo_fatalx(U_("%s requires an argument"), av[-1]); + if (type == ST_PATTERN) { + if (regcomp(&sn->u.cmdre, *av, REG_EXTENDED|REG_NOSUB) != 0) + sudo_fatalx(U_("invalid regular expression: %s"), *av); + } else if (type == ST_TODATE || type == ST_FROMDATE) { + sn->u.tstamp.tv_sec = get_date(*av); + sn->u.tstamp.tv_nsec = 0; + if (sn->u.tstamp.tv_sec == -1) + sudo_fatalx(U_("could not parse date \"%s\""), *av); + } else { + sn->u.ptr = *av; + } + } + not = or = false; /* reset state */ + STAILQ_INSERT_TAIL(head, sn, entries); + } + if (sub_expr) + sudo_fatalx("%s", U_("unmatched '(' in expression")); + if (or) + sudo_fatalx("%s", U_("illegal trailing \"or\"")); + if (not) + sudo_fatalx("%s", U_("illegal trailing \"!\"")); + + debug_return_int(av - argv); +} + +static bool +match_expr(struct search_node_list *head, struct eventlog *evlog, bool last_match) +{ + struct search_node *sn; + bool res = false, matched = last_match; + int rc; + debug_decl(match_expr, SUDO_DEBUG_UTIL); + + STAILQ_FOREACH(sn, head, entries) { + switch (sn->type) { + case ST_EXPR: + res = match_expr(&sn->u.expr, evlog, matched); + break; + case ST_CWD: + if (evlog->cwd != NULL) + res = strcmp(sn->u.cwd, evlog->cwd) == 0; + break; + case ST_HOST: + if (evlog->submithost != NULL) + res = strcmp(sn->u.host, evlog->submithost) == 0; + break; + case ST_TTY: + if (evlog->ttyname != NULL) + res = strcmp(sn->u.tty, evlog->ttyname) == 0; + break; + case ST_RUNASGROUP: + if (evlog->rungroup != NULL) + res = strcmp(sn->u.runas_group, evlog->rungroup) == 0; + break; + case ST_RUNASUSER: + if (evlog->runuser != NULL) + res = strcmp(sn->u.runas_user, evlog->runuser) == 0; + break; + case ST_USER: + if (evlog->submituser != NULL) + res = strcmp(sn->u.user, evlog->submituser) == 0; + break; + case ST_PATTERN: + rc = regexec(&sn->u.cmdre, evlog->command, 0, NULL, 0); + if (rc && rc != REG_NOMATCH) { + char buf[BUFSIZ]; + regerror(rc, &sn->u.cmdre, buf, sizeof(buf)); + sudo_fatalx("%s", buf); + } + res = rc == REG_NOMATCH ? 0 : 1; + break; + case ST_FROMDATE: + res = sudo_timespeccmp(&evlog->submit_time, &sn->u.tstamp, >=); + break; + case ST_TODATE: + res = sudo_timespeccmp(&evlog->submit_time, &sn->u.tstamp, <=); + break; + default: + sudo_fatalx(U_("unknown search type %d"), sn->type); + /* NOTREACHED */ + } + if (sn->negated) + res = !res; + matched = sn->or ? (res || last_match) : (res && last_match); + last_match = matched; + } + debug_return_bool(matched); +} + +static int +list_session(char *log_dir, regex_t *re, const char *user, const char *tty) +{ + char idbuf[7], *idstr, *cp; + struct eventlog *evlog = NULL; + const char *timestr; + int ret = -1; + debug_decl(list_session, SUDO_DEBUG_UTIL); + + if ((evlog = iolog_parse_loginfo(-1, log_dir)) == NULL) + goto done; + + /* Match on search expression if there is one. */ + if (!STAILQ_EMPTY(&search_expr) && !match_expr(&search_expr, evlog, true)) + goto done; + + /* Convert from /var/log/sudo-sessions/00/00/01 to 000001 */ + cp = log_dir + strlen(session_dir) + 1; + if (IS_IDLOG(cp)) { + idbuf[0] = cp[0]; + idbuf[1] = cp[1]; + idbuf[2] = cp[3]; + idbuf[3] = cp[4]; + idbuf[4] = cp[6]; + idbuf[5] = cp[7]; + idbuf[6] = '\0'; + idstr = idbuf; + } else { + /* Not an id, use as-is. */ + idstr = cp; + } + /* XXX - print lines + cols? */ + timestr = get_timestr(evlog->submit_time.tv_sec, 1); + printf("%s : %s : TTY=%s ; CWD=%s ; USER=%s ; ", + timestr ? timestr : "invalid date", + evlog->submituser, evlog->ttyname, evlog->cwd, evlog->runuser); + if (evlog->rungroup) + printf("GROUP=%s ; ", evlog->rungroup); + if (evlog->submithost) + printf("HOST=%s ; ", evlog->submithost); + printf("TSID=%s ; COMMAND=%s\n", idstr, evlog->command); + + ret = 0; + +done: + eventlog_free(evlog); + debug_return_int(ret); +} + +static int +session_compare(const void *v1, const void *v2) +{ + const char *s1 = *(const char **)v1; + const char *s2 = *(const char **)v2; + return strcmp(s1, s2); +} + +/* XXX - always returns 0, calls sudo_fatal() on failure */ +static int +find_sessions(const char *dir, regex_t *re, const char *user, const char *tty) +{ + DIR *d; + struct dirent *dp; + struct stat sb; + size_t sdlen, sessions_len = 0, sessions_size = 0; + unsigned int i; + int len; + char pathbuf[PATH_MAX], **sessions = NULL; +#ifdef HAVE_STRUCT_DIRENT_D_TYPE + bool checked_type = true; +#else + const bool checked_type = false; +#endif + debug_decl(find_sessions, SUDO_DEBUG_UTIL); + + d = opendir(dir); + if (d == NULL) + sudo_fatal(U_("unable to open %s"), dir); + + /* XXX - would be faster to use openat() and relative names */ + sdlen = strlcpy(pathbuf, dir, sizeof(pathbuf)); + if (sdlen + 1 >= sizeof(pathbuf)) { + errno = ENAMETOOLONG; + sudo_fatal("%s/", dir); + } + pathbuf[sdlen++] = '/'; + pathbuf[sdlen] = '\0'; + + /* Store potential session dirs for sorting. */ + while ((dp = readdir(d)) != NULL) { + /* Skip "." and ".." */ + if (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || + (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) + continue; +#ifdef HAVE_STRUCT_DIRENT_D_TYPE + if (checked_type) { + if (dp->d_type != DT_DIR) { + /* Not all file systems support d_type. */ + if (dp->d_type != DT_UNKNOWN) + continue; + checked_type = false; + } + } +#endif + + /* Add name to session list. */ + if (sessions_len + 1 > sessions_size) { + if (sessions_size == 0) + sessions_size = 36 * 36 / 2; + sessions = reallocarray(sessions, sessions_size, 2 * sizeof(char *)); + if (sessions == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sessions_size *= 2; + } + if ((sessions[sessions_len] = strdup(dp->d_name)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sessions_len++; + } + closedir(d); + + /* Sort and list the sessions. */ + if (sessions != NULL) { + qsort(sessions, sessions_len, sizeof(char *), session_compare); + for (i = 0; i < sessions_len; i++) { + len = snprintf(&pathbuf[sdlen], sizeof(pathbuf) - sdlen, + "%s/log", sessions[i]); + if (len < 0 || (size_t)len >= sizeof(pathbuf) - sdlen) { + errno = ENAMETOOLONG; + sudo_fatal("%s/%s/log", dir, sessions[i]); + } + free(sessions[i]); + + /* Check for dir with a log file. */ + if (lstat(pathbuf, &sb) == 0 && S_ISREG(sb.st_mode)) { + pathbuf[sdlen + len - 4] = '\0'; + list_session(pathbuf, re, user, tty); + } else { + /* Strip off "/log" and recurse if a non-log dir. */ + pathbuf[sdlen + len - 4] = '\0'; + if (checked_type || + (lstat(pathbuf, &sb) == 0 && S_ISDIR(sb.st_mode))) + find_sessions(pathbuf, re, user, tty); + } + } + free(sessions); + } + + debug_return_int(0); +} + +/* XXX - always returns 0, calls sudo_fatal() on failure */ +static int +list_sessions(int argc, char **argv, const char *pattern, const char *user, + const char *tty) +{ + regex_t rebuf, *re = NULL; + debug_decl(list_sessions, SUDO_DEBUG_UTIL); + + /* Parse search expression if present */ + parse_expr(&search_expr, argv, false); + + /* optional regex */ + if (pattern) { + re = &rebuf; + if (regcomp(re, pattern, REG_EXTENDED|REG_NOSUB) != 0) + sudo_fatalx(U_("invalid regular expression: %s"), pattern); + } + + debug_return_int(find_sessions(session_dir, re, user, tty)); +} + +/* + * Check keyboard for ' ', '<', '>', return + * pause, slow, fast, next + */ +static void +read_keyboard(int fd, int what, void *v) +{ + struct replay_closure *closure = v; + static bool paused = false; + struct timespec ts; + ssize_t nread; + char ch; + debug_decl(read_keyboard, SUDO_DEBUG_UTIL); + + nread = read(fd, &ch, 1); + switch (nread) { + case -1: + if (errno != EINTR && errno != EAGAIN) + sudo_fatal(U_("unable to read %s"), "stdin"); + break; + case 0: + /* Ignore EOF. */ + break; + default: + if (paused) { + /* Any key will unpause, run the delay callback directly. */ + paused = false; + delay_cb(-1, SUDO_EV_TIMEOUT, closure); + debug_return; + } + switch (ch) { + case ' ': + paused = true; + /* Disable the delay event until we unpause. */ + sudo_ev_del(closure->evbase, closure->delay_ev); + break; + case '<': + speed_factor /= 2; + if (sudo_ev_pending(closure->delay_ev, SUDO_EV_TIMEOUT, &ts)) { + /* Double remaining timeout. */ + ts.tv_sec *= 2; + ts.tv_nsec *= 2; + if (ts.tv_nsec >= 1000000000) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000; + } + if (sudo_ev_add(NULL, closure->delay_ev, &ts, false) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "failed to double remaining delay timeout"); + } + } + break; + case '>': + speed_factor *= 2; + if (sudo_ev_pending(closure->delay_ev, SUDO_EV_TIMEOUT, &ts)) { + /* Halve remaining timeout. */ + if (ts.tv_sec & 1) + ts.tv_nsec += 500000000; + ts.tv_sec /= 2; + ts.tv_nsec /= 2; + if (sudo_ev_add(NULL, closure->delay_ev, &ts, false) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "failed to halve remaining delay timeout"); + } + } + break; + case '\r': + case '\n': + /* Cancel existing delay, run callback directly. */ + sudo_ev_del(closure->evbase, closure->delay_ev); + delay_cb(-1, SUDO_EV_TIMEOUT, closure); + break; + default: + /* Unknown key, nothing to do. */ + break; + } + break; + } + debug_return; +} + +static void +usage(int fatal) +{ + fprintf(fatal ? stderr : stdout, + _("usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n"), + getprogname()); + fprintf(fatal ? stderr : stdout, + _("usage: %s [-h] [-d dir] -l [search expression]\n"), + getprogname()); + if (fatal) + exit(EXIT_FAILURE); +} + +static void +help(void) +{ + (void) printf(_("%s - replay sudo session logs\n\n"), getprogname()); + usage(0); + (void) puts(_("\nOptions:\n" + " -d, --directory=dir specify directory for session logs\n" + " -f, --filter=filter specify which I/O type(s) to display\n" + " -h, --help display help message and exit\n" + " -l, --list list available session IDs, with optional expression\n" + " -m, --max-wait=num max number of seconds to wait between events\n" + " -n, --non-interactive no prompts, session is sent to the standard output\n" + " -R, --no-resize do not attempt to re-size the terminal\n" + " -S, --suspend-wait wait while the command was suspended\n" + " -s, --speed=num speed up or slow down output\n" + " -V, --version display version information and exit")); + exit(EXIT_SUCCESS); +} + +/* + * Cleanup hook for sudo_fatal()/sudo_fatalx() + */ +static void +sudoreplay_cleanup(void) +{ + restore_terminal_size(); + sudo_term_restore(ttyfd, false); +} diff --git a/plugins/sudoers/testsudoers.c b/plugins/sudoers/testsudoers.c new file mode 100644 index 0000000..1217da7 --- /dev/null +++ b/plugins/sudoers/testsudoers.c @@ -0,0 +1,610 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "tsgetgrpw.h" +#include "sudoers.h" +#include "interfaces.h" +#include "sudo_conf.h" +#include "sudo_lbuf.h" +#include + +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +enum sudoers_formats { + format_ldif, + format_sudoers +}; + +/* + * Function Prototypes + */ +static void dump_sudoers(struct sudo_lbuf *lbuf); +static void usage(void) __attribute__((__noreturn__)); +static void set_runaspw(const char *); +static void set_runasgr(const char *); +static bool cb_runas_default(const union sudo_defs_val *); +static int testsudoers_error(const char *msg); +static int testsudoers_output(const char *buf); + +/* tsgetgrpw.c */ +extern void setgrfile(const char *); +extern void setgrent(void); +extern void endgrent(void); +extern struct group *getgrent(void); +extern struct group *getgrnam(const char *); +extern struct group *getgrgid(gid_t); +extern void setpwfile(const char *); +extern void setpwent(void); +extern void endpwent(void); +extern struct passwd *getpwent(void); +extern struct passwd *getpwnam(const char *); +extern struct passwd *getpwuid(uid_t); + +/* gram.y */ +extern int (*trace_print)(const char *msg); + +/* + * Globals + */ +struct sudo_user sudo_user; +struct passwd *list_pw; +static char *runas_group, *runas_user; + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) +extern char *malloc_options; +#endif +#if YYDEBUG +extern int sudoersdebug; +#endif + +sudo_dso_public int main(int argc, char *argv[]); + +int +main(int argc, char *argv[]) +{ + enum sudoers_formats input_format = format_sudoers; + struct cmndspec *cs; + struct privilege *priv; + struct userspec *us; + char *p, *grfile, *pwfile; + const char *errstr; + int match, host_match, runas_match, cmnd_match; + int ch, dflag, exitcode = EXIT_FAILURE; + struct sudo_lbuf lbuf; + debug_decl(main, SUDOERS_DEBUG_MAIN); + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + malloc_options = "S"; +#endif +#if YYDEBUG + sudoersdebug = 1; +#endif + + initprogname(argc > 0 ? argv[0] : "testsudoers"); + + if (!sudoers_initlocale(setlocale(LC_ALL, ""), def_sudoers_locale)) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_warn_set_locale_func(sudoers_warn_setlocale); + bindtextdomain("sudoers", LOCALEDIR); /* XXX - should have own domain */ + textdomain("sudoers"); + + /* No word wrap on output. */ + sudo_lbuf_init(&lbuf, testsudoers_output, 0, NULL, 0); + + /* Initialize the debug subsystem. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG) == -1) + goto done; + if (!sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname()))) + goto done; + + dflag = 0; + grfile = pwfile = NULL; + while ((ch = getopt(argc, argv, "dg:G:h:i:P:p:tu:U:")) != -1) { + switch (ch) { + case 'd': + dflag = 1; + break; + case 'G': + sudoers_gid = (gid_t)sudo_strtoid(optarg, &errstr); + if (errstr != NULL) + sudo_fatalx("group-ID %s: %s", optarg, errstr); + break; + case 'g': + runas_group = optarg; + SET(sudo_user.flags, RUNAS_GROUP_SPECIFIED); + break; + case 'h': + user_host = optarg; + break; + case 'i': + if (strcasecmp(optarg, "ldif") == 0) { + input_format = format_ldif; + } else if (strcasecmp(optarg, "sudoers") == 0) { + input_format = format_sudoers; + } else { + sudo_warnx(U_("unsupported input format %s"), optarg); + usage(); + } + break; + case 'p': + pwfile = optarg; + break; + case 'P': + grfile = optarg; + break; + case 't': + trace_print = testsudoers_error; + break; + case 'U': + sudoers_uid = (uid_t)sudo_strtoid(optarg, &errstr); + if (errstr != NULL) + sudo_fatalx("user-ID %s: %s", optarg, errstr); + break; + case 'u': + runas_user = optarg; + SET(sudo_user.flags, RUNAS_USER_SPECIFIED); + break; + default: + usage(); + break; + } + } + argc -= optind; + argv += optind; + + /* Set group/passwd file and init the cache. */ + if (grfile) + setgrfile(grfile); + if (pwfile) + setpwfile(pwfile); + + if (argc < 2) { + if (!dflag) + usage(); + user_name = argc ? *argv++ : "root"; + user_cmnd = user_base = "true"; + argc = 0; + } else { + user_name = *argv++; + user_cmnd = *argv++; + if ((p = strrchr(user_cmnd, '/')) != NULL) + user_base = p + 1; + else + user_base = user_cmnd; + argc -= 2; + } + if ((sudo_user.pw = sudo_getpwnam(user_name)) == NULL) + sudo_fatalx(U_("unknown user: %s"), user_name); + + if (user_host == NULL) { + if ((user_host = sudo_gethostname()) == NULL) + sudo_fatal("gethostname"); + } + if ((p = strchr(user_host, '.'))) { + *p = '\0'; + if ((user_shost = strdup(user_host)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + *p = '.'; + } else { + user_shost = user_host; + } + user_runhost = user_host; + user_srunhost = user_shost; + + /* Fill in user_args from argv. */ + if (argc > 0) { + char *to, **from; + size_t size, n; + + for (size = 0, from = argv; *from; from++) + size += strlen(*from) + 1; + + if ((user_args = malloc(size)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + for (to = user_args, from = argv; *from; from++) { + n = strlcpy(to, *from, size - (to - user_args)); + if (n >= size - (to - user_args)) + sudo_fatalx(U_("internal error, %s overflow"), getprogname()); + to += n; + *to++ = ' '; + } + *--to = '\0'; + } + + /* Initialize default values. */ + if (!init_defaults()) + sudo_fatalx("%s", U_("unable to initialize sudoers default values")); + + /* Set group_plugin callback. */ + sudo_defs_table[I_GROUP_PLUGIN].callback = cb_group_plugin; + + /* Set runas callback. */ + sudo_defs_table[I_RUNAS_DEFAULT].callback = cb_runas_default; + + /* Set locale callback. */ + sudo_defs_table[I_SUDOERS_LOCALE].callback = sudoers_locale_callback; + + /* Load ip addr/mask for each interface. */ + if (get_net_ifs(&p) > 0) { + if (!set_interfaces(p)) + sudo_fatal("%s", U_("unable to parse network address list")); + } + + /* Allocate space for data structures in the parser. */ + init_parser("sudoers", false, true); + + /* + * Set runas passwd/group entries based on command line or sudoers. + * Note that if runas_group was specified without runas_user we + * run the command as the invoking user. + */ + if (runas_group != NULL) { + set_runasgr(runas_group); + set_runaspw(runas_user ? runas_user : user_name); + } else + set_runaspw(runas_user ? runas_user : def_runas_default); + + /* Parse the policy file. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, NULL); + switch (input_format) { + case format_ldif: + if (!sudoers_parse_ldif(&parsed_policy, stdin, NULL, true)) { + (void) puts("Parse error in LDIF"); + parse_error = true; + } + break; + case format_sudoers: + if (sudoersparse() != 0 || parse_error) + parse_error = true; + break; + default: + sudo_fatalx("error: unhandled input %d", input_format); + } + if (!parse_error) + (void) puts("Parses OK"); + + if (!update_defaults(&parsed_policy, NULL, SETDEF_ALL, false)) + (void) puts("Problem with defaults entries"); + + if (dflag) { + (void) putchar('\n'); + dump_sudoers(&lbuf); + if (argc < 2) { + exitcode = parse_error ? 1 : 0; + goto done; + } + } + + /* This loop must match the one in sudo_file_lookup() */ + printf("\nEntries for user %s:\n", user_name); + match = UNSPEC; + TAILQ_FOREACH_REVERSE(us, &parsed_policy.userspecs, userspec_list, entries) { + if (userlist_matches(&parsed_policy, sudo_user.pw, &us->users) != ALLOW) + continue; + TAILQ_FOREACH_REVERSE(priv, &us->privileges, privilege_list, entries) { + sudo_lbuf_append(&lbuf, "\n"); + sudoers_format_privilege(&lbuf, &parsed_policy, priv, false); + sudo_lbuf_print(&lbuf); + host_match = hostlist_matches(&parsed_policy, sudo_user.pw, + &priv->hostlist); + if (host_match == ALLOW) { + puts("\thost matched"); + TAILQ_FOREACH_REVERSE(cs, &priv->cmndlist, cmndspec_list, entries) { + runas_match = runaslist_matches(&parsed_policy, + cs->runasuserlist, cs->runasgrouplist, NULL, NULL); + if (runas_match == ALLOW) { + puts("\trunas matched"); + cmnd_match = cmnd_matches(&parsed_policy, cs->cmnd, + cs->runchroot, NULL); + if (cmnd_match != UNSPEC) + match = cmnd_match; + printf("\tcmnd %s\n", match == ALLOW ? "allowed" : + match == DENY ? "denied" : "unmatched"); + } + } + } else + puts(U_("\thost unmatched")); + } + } + puts(match == ALLOW ? U_("\nCommand allowed") : + match == DENY ? U_("\nCommand denied") : U_("\nCommand unmatched")); + + /* + * Exit codes: + * 0 - parsed OK and command matched. + * 1 - parse error + * 2 - command not matched + * 3 - command denied + */ + exitcode = parse_error ? 1 : (match == ALLOW ? 0 : match + 3); +done: + sudo_lbuf_destroy(&lbuf); + sudo_freepwcache(); + sudo_freegrcache(); + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); + exit(exitcode); +} + +static void +set_runaspw(const char *user) +{ + struct passwd *pw = NULL; + debug_decl(set_runaspw, SUDOERS_DEBUG_UTIL); + + if (*user == '#') { + const char *errstr; + uid_t uid = sudo_strtoid(user + 1, &errstr); + if (errstr == NULL) { + if ((pw = sudo_getpwuid(uid)) == NULL) + pw = sudo_fakepwnam(user, user_gid); + } + } + if (pw == NULL) { + if ((pw = sudo_getpwnam(user)) == NULL) + sudo_fatalx(U_("unknown user: %s"), user); + } + if (runas_pw != NULL) + sudo_pw_delref(runas_pw); + runas_pw = pw; + debug_return; +} + +static void +set_runasgr(const char *group) +{ + struct group *gr = NULL; + debug_decl(set_runasgr, SUDOERS_DEBUG_UTIL); + + if (*group == '#') { + const char *errstr; + gid_t gid = sudo_strtoid(group + 1, &errstr); + if (errstr == NULL) { + if ((gr = sudo_getgrgid(gid)) == NULL) + gr = sudo_fakegrnam(group); + } + } + if (gr == NULL) { + if ((gr = sudo_getgrnam(group)) == NULL) + sudo_fatalx(U_("unknown group: %s"), group); + } + if (runas_gr != NULL) + sudo_gr_delref(runas_gr); + runas_gr = gr; + debug_return; +} + +/* + * Callback for runas_default sudoers setting. + */ +static bool +cb_runas_default(const union sudo_defs_val *sd_un) +{ + /* Only reset runaspw if user didn't specify one. */ + if (!runas_user && !runas_group) + set_runaspw(sd_un->str); + return true; +} + +void +sudo_setspent(void) +{ + return; +} + +void +sudo_endspent(void) +{ + return; +} + +FILE * +open_sudoers(const char *file, bool doedit, bool *keepopen) +{ + struct stat sb; + FILE *fp = NULL; + const char *base; + debug_decl(open_sudoers, SUDOERS_DEBUG_UTIL); + + base = strrchr(file, '/'); + if (base != NULL) + base++; + else + base = file; + + switch (sudo_secure_file(file, sudoers_uid, sudoers_gid, &sb)) { + case SUDO_PATH_SECURE: + fp = fopen(file, "r"); + break; + case SUDO_PATH_MISSING: + sudo_warn("unable to stat %s", base); + break; + case SUDO_PATH_BAD_TYPE: + sudo_warnx("%s is not a regular file", base); + break; + case SUDO_PATH_WRONG_OWNER: + sudo_warnx("%s should be owned by uid %u", + base, (unsigned int) sudoers_uid); + break; + case SUDO_PATH_WORLD_WRITABLE: + sudo_warnx("%s is world writable", base); + break; + case SUDO_PATH_GROUP_WRITABLE: + sudo_warnx("%s should be owned by gid %u", + base, (unsigned int) sudoers_gid); + break; + default: + /* NOTREACHED */ + break; + } + + debug_return_ptr(fp); +} + +bool +init_envtables(void) +{ + return(true); +} + +bool +set_perms(int perm) +{ + return true; +} + +bool +restore_perms(void) +{ + return true; +} + +void +init_eventlog_config(void) +{ + return; +} + +int +set_cmnd_path(const char *runchroot) +{ + return FOUND; +} + +static bool +print_defaults(struct sudo_lbuf *lbuf) +{ + struct defaults *def, *next; + debug_decl(print_defaults, SUDOERS_DEBUG_UTIL); + + TAILQ_FOREACH_SAFE(def, &parsed_policy.defaults, entries, next) + sudoers_format_default_line(lbuf, &parsed_policy, def, &next, false); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +static int +print_alias(struct sudoers_parse_tree *parse_tree, struct alias *a, void *v) +{ + struct sudo_lbuf *lbuf = v; + struct member *m; + debug_decl(print_alias, SUDOERS_DEBUG_UTIL); + + sudo_lbuf_append(lbuf, "%s %s = ", alias_type_to_string(a->type), + a->name); + TAILQ_FOREACH(m, &a->members, entries) { + if (m != TAILQ_FIRST(&a->members)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, NULL, UNSPEC); + } + sudo_lbuf_append(lbuf, "\n"); + + debug_return_int(sudo_lbuf_error(lbuf) ? -1 : 0); +} + +static bool +print_aliases(struct sudo_lbuf *lbuf) +{ + debug_decl(print_aliases, SUDOERS_DEBUG_UTIL); + + alias_apply(&parsed_policy, print_alias, lbuf); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +static void +dump_sudoers(struct sudo_lbuf *lbuf) +{ + debug_decl(dump_sudoers, SUDOERS_DEBUG_UTIL); + + /* Print Defaults */ + if (!print_defaults(lbuf)) + goto done; + if (lbuf->len > 0) { + sudo_lbuf_print(lbuf); + sudo_lbuf_append(lbuf, "\n"); + } + + /* Print Aliases */ + if (!print_aliases(lbuf)) + goto done; + if (lbuf->len > 1) { + sudo_lbuf_print(lbuf); + sudo_lbuf_append(lbuf, "\n"); + } + + /* Print User_Specs */ + if (!sudoers_format_userspecs(lbuf, &parsed_policy, NULL, false, true)) + goto done; + if (lbuf->len > 1) { + sudo_lbuf_print(lbuf); + } + +done: + if (sudo_lbuf_error(lbuf)) { + if (errno == ENOMEM) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + + debug_return; +} + +static int +testsudoers_output(const char *buf) +{ + return fputs(buf, stdout); +} + +static int +testsudoers_error(const char *buf) +{ + return fputs(buf, stderr); +} + +static void +usage(void) +{ + (void) fprintf(stderr, "usage: %s [-dt] [-G sudoers_gid] [-g group] [-h host] [-i input_format] [-P grfile] [-p pwfile] [-U sudoers_uid] [-u user] [args]\n", getprogname()); + exit(EXIT_FAILURE); +} diff --git a/plugins/sudoers/timeout.c b/plugins/sudoers/timeout.c new file mode 100644 index 0000000..517db37 --- /dev/null +++ b/plugins/sudoers/timeout.c @@ -0,0 +1,109 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudoers_debug.h" +#include "parse.h" + +/* + * Parse a command timeout in sudoers in the format 1d2h3m4s + * (days, hours, minutes, seconds) or a number of seconds with no suffix. + * Returns the number of seconds or -1 on error. + */ +int +parse_timeout(const char *timestr) +{ + debug_decl(parse_timeout, SUDOERS_DEBUG_PARSER); + const char suffixes[] = "dhms"; + const char *cp = timestr; + int timeout = 0; + int idx = 0; + + do { + char *ep; + char ch; + long l; + + /* Parse number, must be present and positive. */ + errno = 0; + l = strtol(cp, &ep, 10); + if (ep == cp) { + /* missing timeout */ + errno = EINVAL; + debug_return_int(-1); + } + if (errno == ERANGE || l < 0 || l > INT_MAX) + goto overflow; + + /* Find a matching suffix or return an error. */ + if (*ep != '\0') { + ch = tolower((unsigned char)*ep++); + while (suffixes[idx] != ch) { + if (suffixes[idx] == '\0') { + /* parse error */ + errno = EINVAL; + debug_return_int(-1); + } + idx++; + } + + /* Apply suffix. */ + switch (ch) { + case 'd': + if (l > INT_MAX / (24 * 60 * 60)) + goto overflow; + l *= 24 * 60 * 60; + break; + case 'h': + if (l > INT_MAX / (60 * 60)) + goto overflow; + l *= 60 * 60; + break; + case 'm': + if (l > INT_MAX / 60) + goto overflow; + l *= 60; + break; + } + if (l > INT_MAX - timeout) + goto overflow; + } + cp = ep; + + timeout += l; + } while (*cp != '\0'); + + debug_return_int(timeout); +overflow: + errno = ERANGE; + debug_return_int(-1); +} diff --git a/plugins/sudoers/timestamp.c b/plugins/sudoers/timestamp.c new file mode 100644 index 0000000..dfc9bdf --- /dev/null +++ b/plugins/sudoers/timestamp.c @@ -0,0 +1,1084 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "check.h" + +#define TIMESTAMP_OPEN_ERROR -1 +#define TIMESTAMP_PERM_ERROR -2 + +/* + * Each user has a single time stamp file that contains multiple records. + * Records are locked to ensure that changes are serialized. + * + * The first record is of type TS_LOCKEXCL and is used to gain exclusive + * access to create new records. This is a short-term lock and sudo + * should not sleep while holding it (or the user will not be able to sudo). + * The TS_LOCKEXCL entry must be unlocked before locking the actual record. + */ + +struct ts_cookie { + char *fname; + int fd; + pid_t sid; + bool locked; + off_t pos; + struct timestamp_entry key; +}; + +/* + * Returns true if entry matches key, else false. + * We don't match on the sid or actual time stamp. + */ +static bool +ts_match_record(struct timestamp_entry *key, struct timestamp_entry *entry, + unsigned int recno) +{ + debug_decl(ts_match_record, SUDOERS_DEBUG_AUTH); + + if (entry->version != key->version) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record version mismatch (want %u, got %u)", __func__, recno, + key->version, entry->version); + debug_return_bool(false); + } + if (!ISSET(key->flags, TS_ANYUID) && entry->auth_uid != key->auth_uid) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record uid mismatch (want %u, got %u)", __func__, recno, + (unsigned int)key->auth_uid, (unsigned int)entry->auth_uid); + debug_return_bool(false); + } + if (entry->type != key->type) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record type mismatch (want %u, got %u)", __func__, recno, + key->type, entry->type); + debug_return_bool(false); + } + switch (entry->type) { + case TS_GLOBAL: + /* no ppid or tty to match */ + break; + case TS_PPID: + /* verify parent pid */ + if (entry->u.ppid != key->u.ppid) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record ppid mismatch (want %d, got %d)", __func__, recno, + (int)key->u.ppid, (int)entry->u.ppid); + debug_return_bool(false); + } + if (sudo_timespeccmp(&entry->start_time, &key->start_time, !=)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u ppid start time mismatch", __func__, recno); + debug_return_bool(false); + } + break; + case TS_TTY: + if (entry->u.ttydev != key->u.ttydev) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record tty mismatch (want 0x%x, got 0x%x)", __func__, + recno, (unsigned int)key->u.ttydev, (unsigned int)entry->u.ttydev); + debug_return_bool(false); + } + if (sudo_timespeccmp(&entry->start_time, &key->start_time, !=)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u session leader start time mismatch", __func__, recno); + debug_return_bool(false); + } + break; + default: + /* unknown record type, ignore it */ + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "%s:%u unknown time stamp record type %d", __func__, recno, + entry->type); + debug_return_bool(false); + } + debug_return_bool(true); +} + +/* + * Searches the time stamp file descriptor for a record that matches key. + * On success, fills in entry with the matching record and returns true. + * On failure, returns false. + * + * Note that records are searched starting at the current file offset, + * which may not be the beginning of the file. + */ +static bool +ts_find_record(int fd, struct timestamp_entry *key, struct timestamp_entry *entry) +{ + struct timestamp_entry cur; + unsigned int recno = 0; + debug_decl(ts_find_record, SUDOERS_DEBUG_AUTH); + + /* + * Find a matching record (does not match sid or time stamp value). + */ + while (read(fd, &cur, sizeof(cur)) == sizeof(cur)) { + recno++; + if (cur.size != sizeof(cur)) { + /* wrong size, seek to start of next record */ + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "wrong sized record, got %hu, expected %zu", + cur.size, sizeof(cur)); + if (lseek(fd, (off_t)cur.size - (off_t)sizeof(cur), SEEK_CUR) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek forward %d", + (int)cur.size - (int)sizeof(cur)); + break; + } + if (cur.size == 0) + break; /* size must be non-zero */ + continue; + } + if (ts_match_record(key, &cur, recno)) { + memcpy(entry, &cur, sizeof(struct timestamp_entry)); + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +/* + * Create a directory and any missing parent directories with the + * specified mode. + * Returns true on success. + * Returns false on failure and displays a warning to stderr. + */ +static bool +ts_mkdirs(char *path, uid_t owner, gid_t group, mode_t mode, + mode_t parent_mode, bool quiet) +{ + bool ret; + mode_t omask; + debug_decl(ts_mkdirs, SUDOERS_DEBUG_AUTH); + + /* umask must not be more restrictive than the file modes. */ + omask = umask(ACCESSPERMS & ~(mode|parent_mode)); + ret = sudo_mkdir_parents(path, owner, group, parent_mode, quiet); + if (ret) { + /* Create final path component. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "mkdir %s, mode 0%o, uid %d, gid %d", path, (unsigned int)mode, + (int)owner, (int)group); + if (mkdir(path, mode) != 0 && errno != EEXIST) { + if (!quiet) + sudo_warn(U_("unable to mkdir %s"), path); + ret = false; + } else { + if (chown(path, owner, group) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chown %d:%d %s", __func__, + (int)owner, (int)group, path); + } + } + } + umask(omask); + debug_return_bool(ret); +} + +/* + * Check that path is owned by timestamp_uid and not writable by + * group or other. If path is missing and make_it is true, create + * the directory and its parent dirs. + * Returns true on success or false on failure, setting errno. + */ +static bool +ts_secure_dir(char *path, bool make_it, bool quiet) +{ + struct stat sb; + bool ret = false; + debug_decl(ts_secure_dir, SUDOERS_DEBUG_AUTH); + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, "checking %s", path); + switch (sudo_secure_dir(path, timestamp_uid, -1, &sb)) { + case SUDO_PATH_SECURE: + ret = true; + break; + case SUDO_PATH_MISSING: + if (make_it && ts_mkdirs(path, timestamp_uid, timestamp_gid, S_IRWXU, + S_IRWXU|S_IXGRP|S_IXOTH, quiet)) { + ret = true; + break; + } + errno = ENOENT; + break; + case SUDO_PATH_BAD_TYPE: + errno = ENOTDIR; + if (!quiet) + sudo_warn("%s", path); + break; + case SUDO_PATH_WRONG_OWNER: + if (!quiet) { + sudo_warnx(U_("%s is owned by uid %u, should be %u"), + path, (unsigned int) sb.st_uid, + (unsigned int) timestamp_uid); + } + errno = EACCES; + break; + case SUDO_PATH_GROUP_WRITABLE: + if (!quiet) + sudo_warnx(U_("%s is group writable"), path); + errno = EACCES; + break; + } + debug_return_bool(ret); +} + +/* + * Open the specified timestamp or lecture file and set the + * close on exec flag. + * Returns open file descriptor on success. + * Returns TIMESTAMP_OPEN_ERROR or TIMESTAMP_PERM_ERROR on error. + */ +static int +ts_open(const char *path, int flags) +{ + bool uid_changed = false; + int fd; + debug_decl(ts_open, SUDOERS_DEBUG_AUTH); + + if (timestamp_uid != 0) + uid_changed = set_perms(PERM_TIMESTAMP); + fd = open(path, flags, S_IRUSR|S_IWUSR); + if (uid_changed && !restore_perms()) { + /* Unable to restore permissions, should not happen. */ + if (fd != -1) { + int serrno = errno; + close(fd); + errno = serrno; + fd = TIMESTAMP_PERM_ERROR; + } + } + if (fd >= 0) + (void)fcntl(fd, F_SETFD, FD_CLOEXEC); + + debug_return_int(fd); +} + +static ssize_t +ts_write(int fd, const char *fname, struct timestamp_entry *entry, off_t offset) +{ + ssize_t nwritten; + off_t old_eof; + debug_decl(ts_write, SUDOERS_DEBUG_AUTH); + + if (offset == -1) { + old_eof = lseek(fd, 0, SEEK_CUR); + nwritten = write(fd, entry, entry->size); + } else { + old_eof = offset; + nwritten = pwrite(fd, entry, entry->size, offset); + } + if ((size_t)nwritten != entry->size) { + if (nwritten == -1) { + log_warning(SLOG_SEND_MAIL, + N_("unable to write to %s"), fname); + } else { + log_warningx(SLOG_SEND_MAIL, + N_("unable to write to %s"), fname); + } + + /* Truncate on partial write to be safe (assumes end of file). */ + if (nwritten > 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "short write, truncating partial time stamp record"); + if (ftruncate(fd, old_eof) != 0) { + sudo_warn(U_("unable to truncate time stamp file to %lld bytes"), + (long long)old_eof); + } + } + debug_return_ssize_t(-1); + } + debug_return_ssize_t(nwritten); +} + +/* + * Full in struct timestamp_entry with the specified flags + * based on auth user pw. Does not set the time stamp. + */ +static void +ts_init_key(struct timestamp_entry *entry, struct passwd *pw, int flags, + enum def_tuple ticket_type) +{ + struct stat sb; + debug_decl(ts_init_key, SUDOERS_DEBUG_AUTH); + + memset(entry, 0, sizeof(*entry)); + entry->version = TS_VERSION; + entry->size = sizeof(*entry); + entry->flags = flags; + if (pw != NULL) { + entry->auth_uid = pw->pw_uid; + } else { + entry->flags |= TS_ANYUID; + } + entry->sid = user_sid; + switch (ticket_type) { + default: + /* Unknown time stamp ticket type, treat as tty (should not happen). */ + sudo_warnx("unknown time stamp ticket type %d", ticket_type); + FALLTHROUGH; + case tty: + if (user_ttypath != NULL && stat(user_ttypath, &sb) == 0) { + /* tty-based time stamp */ + entry->type = TS_TTY; + entry->u.ttydev = sb.st_rdev; + if (entry->sid != -1) + get_starttime(entry->sid, &entry->start_time); + break; + } + FALLTHROUGH; + case kernel: + case ppid: + /* ppid-based time stamp */ + entry->type = TS_PPID; + entry->u.ppid = getppid(); + get_starttime(entry->u.ppid, &entry->start_time); + break; + case global: + /* global time stamp */ + entry->type = TS_GLOBAL; + break; + } + + debug_return; +} + +static void +ts_init_key_nonglobal(struct timestamp_entry *entry, struct passwd *pw, int flags) +{ + /* + * Even if the timestamp type is global or kernel we still want to do + * per-tty or per-ppid locking so sudo works predictably in a pipeline. + */ + ts_init_key(entry, pw, flags, + def_timestamp_type == ppid ? ppid : tty); +} + +/* + * Open the user's time stamp file. + * Returns a cookie or NULL on error, does not lock the file. + */ +void * +timestamp_open(const char *user, pid_t sid) +{ + struct ts_cookie *cookie; + char *fname = NULL; + int tries, fd = -1; + debug_decl(timestamp_open, SUDOERS_DEBUG_AUTH); + + /* Zero timeout means don't use the time stamp file. */ + if (!sudo_timespecisset(&def_timestamp_timeout)) { + errno = ENOENT; + goto bad; + } + + /* Check the validity of timestamp dir and create if missing. */ + if (!ts_secure_dir(def_timestampdir, true, false)) + goto bad; + + /* Open time stamp file. */ + if (asprintf(&fname, "%s/%s", def_timestampdir, user) == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + for (tries = 1; ; tries++) { + struct stat sb; + + fd = ts_open(fname, O_RDWR|O_CREAT); + switch (fd) { + case TIMESTAMP_OPEN_ERROR: + log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), fname); + goto bad; + case TIMESTAMP_PERM_ERROR: + /* Already logged set_perms/restore_perms error. */ + goto bad; + } + + /* Remove time stamp file if its mtime predates boot time. */ + if (tries == 1 && fstat(fd, &sb) == 0) { + struct timespec boottime, mtime, now; + + if (sudo_gettime_real(&now) == 0 && get_boottime(&boottime)) { + /* Ignore a boot time that is in the future. */ + if (sudo_timespeccmp(&now, &boottime, <)) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "ignoring boot time that is in the future"); + } else { + mtim_get(&sb, mtime); + if (sudo_timespeccmp(&mtime, &boottime, <)) { + /* Time stamp file too old, remove it. */ + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "removing time stamp file that predates boot time"); + close(fd); + unlink(fname); + continue; + } + } + } + } + break; + } + + /* Allocate and fill in cookie to store state. */ + cookie = malloc(sizeof(*cookie)); + if (cookie == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + cookie->fd = fd; + cookie->fname = fname; + cookie->sid = sid; + cookie->pos = -1; + + debug_return_ptr(cookie); +bad: + if (fd != -1) + close(fd); + free(fname); + debug_return_ptr(NULL); +} + +static volatile sig_atomic_t got_signal; + +static void +timestamp_handler(int s) +{ + got_signal = s; +} + +/* + * Wrapper for sudo_lock_region() that is interruptible. + */ +static bool +timestamp_lock_record(int fd, off_t pos, off_t len) +{ + struct sigaction sa, saveint, savequit; + sigset_t mask, omask; + bool ret; + debug_decl(timestamp_lock_record, SUDOERS_DEBUG_AUTH); + + if (pos >= 0 && lseek(fd, pos, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek to %lld", (long long)pos); + debug_return_bool(false); + } + + /* Allow SIGINT and SIGQUIT to interrupt a lock. */ + got_signal = 0; + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; /* don't restart system calls */ + sa.sa_handler = timestamp_handler; + (void) sigaction(SIGINT, &sa, &saveint); + (void) sigaction(SIGQUIT, &sa, &savequit); + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + (void) sigprocmask(SIG_UNBLOCK, &mask, &omask); + + ret = sudo_lock_region(fd, SUDO_LOCK, len); + if (!ret) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "failed to lock fd %d [%lld, %lld]", fd, + (long long)pos, (long long)len); + } + + /* Restore the old mask (SIGINT and SIGQUIT blocked) and handlers. */ + (void) sigprocmask(SIG_SETMASK, &omask, NULL); + (void) sigaction(SIGINT, &saveint, NULL); + (void) sigaction(SIGQUIT, &savequit, NULL); + + /* Re-deliver the signal that interrupted the lock, if any. */ + if (!ret && got_signal) + kill(getpid(), got_signal); + + debug_return_bool(ret); +} + +static bool +timestamp_unlock_record(int fd, off_t pos, off_t len) +{ + debug_decl(timestamp_unlock_record, SUDOERS_DEBUG_AUTH); + + if (pos >= 0 && lseek(fd, pos, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek to %lld", (long long)pos); + debug_return_bool(false); + } + debug_return_bool(sudo_lock_region(fd, SUDO_UNLOCK, len)); +} + +/* + * Seek to the record's position and read it, locking as needed. + */ +static ssize_t +ts_read(struct ts_cookie *cookie, struct timestamp_entry *entry) +{ + ssize_t nread = -1; + bool should_unlock = false; + debug_decl(ts_read, SUDOERS_DEBUG_AUTH); + + /* If the record is not already locked, lock it now. */ + if (!cookie->locked) { + if (!timestamp_lock_record(cookie->fd, cookie->pos, sizeof(*entry))) + goto done; + should_unlock = true; + } + + /* Seek to the record position and read it. */ + nread = pread(cookie->fd, entry, sizeof(*entry), cookie->pos); + if (nread != sizeof(*entry)) { + /* short read, should not happen */ + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "short read (%zd vs %zu), truncated time stamp file?", + nread, sizeof(*entry)); + goto done; + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "read %zd byte record at %lld", nread, (long long)cookie->pos); + +done: + /* If the record was not locked initially, unlock it. */ + if (should_unlock) + timestamp_unlock_record(cookie->fd, cookie->pos, sizeof(*entry)); + + debug_return_ssize_t(nread); +} + +/* + * Write a TS_LOCKEXCL record at the beginning of the time stamp file. + */ +bool +timestamp_lock_write(struct ts_cookie *cookie) +{ + struct timestamp_entry entry; + bool ret = true; + debug_decl(timestamp_lock_write, SUDOERS_DEBUG_AUTH); + + memset(&entry, 0, sizeof(entry)); + entry.version = TS_VERSION; + entry.size = sizeof(entry); + entry.type = TS_LOCKEXCL; + if (ts_write(cookie->fd, cookie->fname, &entry, -1) == -1) + ret = false; + debug_return_bool(ret); +} + +/* + * Lock a record in the time stamp file for exclusive access. + * If the record does not exist, it is created (as disabled). + */ +bool +timestamp_lock(void *vcookie, struct passwd *pw) +{ + struct ts_cookie *cookie = vcookie; + struct timestamp_entry entry; + bool overwrite = false; + off_t lock_pos; + ssize_t nread; + debug_decl(timestamp_lock, SUDOERS_DEBUG_AUTH); + + if (cookie == NULL) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "called with a NULL cookie!"); + debug_return_bool(false); + } + + /* + * Take a lock on the "write" record (the first record in the file). + * This will let us seek for the record or extend as needed + * without colliding with anyone else. + */ + if (!timestamp_lock_record(cookie->fd, 0, sizeof(struct timestamp_entry))) + debug_return_bool(false); + + /* Make sure the first record is of type TS_LOCKEXCL. */ + memset(&entry, 0, sizeof(entry)); + nread = read(cookie->fd, &entry, sizeof(entry)); + if (nread < ssizeof(struct timestamp_entry_v1)) { + /* New or invalid time stamp file. */ + overwrite = true; + } else if (entry.type != TS_LOCKEXCL) { + if (entry.size == sizeof(struct timestamp_entry_v1)) { + /* Old sudo record, convert it to TS_LOCKEXCL. */ + entry.type = TS_LOCKEXCL; + memset((char *)&entry + offsetof(struct timestamp_entry, flags), 0, + nread - offsetof(struct timestamp_entry, flags)); + if (ts_write(cookie->fd, cookie->fname, &entry, 0) == -1) + debug_return_bool(false); + } else { + /* Corrupted time stamp file? Just overwrite it. */ + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "corrupt initial record, type: %hu, size: %hu (expected %zu)", + entry.type, entry.size, sizeof(struct timestamp_entry_v1)); + overwrite = true; + } + } + if (overwrite) { + /* Rewrite existing time stamp file or create new one. */ + if (ftruncate(cookie->fd, 0) != 0) { + sudo_warn(U_("unable to truncate time stamp file to %lld bytes"), + 0LL); + debug_return_bool(false); + } + if (!timestamp_lock_write(cookie)) + debug_return_bool(false); + } else if (entry.size != sizeof(entry)) { + /* Reset position if the lock record has an unexpected size. */ + if (lseek(cookie->fd, entry.size, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek to %hu", entry.size); + debug_return_bool(false); + } + } + + /* Search for a tty/ppid-based record or append a new one. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "searching for %s time stamp record", + def_timestamp_type == ppid ? "ppid" : "tty"); + ts_init_key_nonglobal(&cookie->key, pw, TS_DISABLED); + if (ts_find_record(cookie->fd, &cookie->key, &entry)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "found existing %s time stamp record", + def_timestamp_type == ppid ? "ppid" : "tty"); + lock_pos = lseek(cookie->fd, 0, SEEK_CUR) - (off_t)entry.size; + } else { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "appending new %s time stamp record", + def_timestamp_type == ppid ? "ppid" : "tty"); + lock_pos = lseek(cookie->fd, 0, SEEK_CUR); + if (ts_write(cookie->fd, cookie->fname, &cookie->key, -1) == -1) + debug_return_bool(false); + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "%s time stamp position is %lld", + def_timestamp_type == ppid ? "ppid" : "tty", (long long)lock_pos); + + if (def_timestamp_type == global) { + /* + * For global tickets we use a separate record lock that we + * cannot hold long-term since it is shared between all ttys. + */ + cookie->locked = false; + cookie->key.type = TS_GLOBAL; /* find a global record */ + + if (lseek(cookie->fd, 0, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to rewind fd"); + debug_return_bool(false); + } + if (ts_find_record(cookie->fd, &cookie->key, &entry)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "found existing global record"); + cookie->pos = lseek(cookie->fd, 0, SEEK_CUR) - (off_t)entry.size; + } else { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "appending new global record"); + cookie->pos = lseek(cookie->fd, 0, SEEK_CUR); + if (ts_write(cookie->fd, cookie->fname, &cookie->key, -1) == -1) + debug_return_bool(false); + } + } else { + /* For tty/ppid tickets the tty lock is the same as the record lock. */ + cookie->pos = lock_pos; + cookie->locked = true; + } + + /* Unlock the TS_LOCKEXCL record. */ + timestamp_unlock_record(cookie->fd, 0, sizeof(struct timestamp_entry)); + + /* Lock the per-tty record (may sleep). */ + if (!timestamp_lock_record(cookie->fd, lock_pos, sizeof(struct timestamp_entry))) + debug_return_bool(false); + + debug_return_bool(true); +} + +void +timestamp_close(void *vcookie) +{ + struct ts_cookie *cookie = vcookie; + debug_decl(timestamp_close, SUDOERS_DEBUG_AUTH); + + if (cookie != NULL) { + close(cookie->fd); + free(cookie->fname); + free(cookie); + } + + debug_return; +} + +/* + * Check the time stamp file and directory and return their status. + * Called with the file position before the locked record to read. + * Returns one of TS_CURRENT, TS_OLD, TS_MISSING, TS_ERROR, TS_FATAL. + * Fills in fdp with an open file descriptor positioned at the + * appropriate (and locked) record. + */ +int +timestamp_status(void *vcookie, struct passwd *pw) +{ + struct ts_cookie *cookie = vcookie; + struct timestamp_entry entry; + struct timespec diff, now; + int status = TS_ERROR; /* assume the worst */ + ssize_t nread; + debug_decl(timestamp_status, SUDOERS_DEBUG_AUTH); + + /* Zero timeout means don't use time stamp files. */ + if (!sudo_timespecisset(&def_timestamp_timeout)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "timestamps disabled"); + status = TS_OLD; + goto done; + } + if (cookie == NULL || cookie->pos < 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "NULL cookie or invalid position"); + status = TS_OLD; + goto done; + } + +#ifdef TIOCCHKVERAUTH + if (def_timestamp_type == kernel) { + int fd = open(_PATH_TTY, O_RDWR); + if (fd != -1) { + if (ioctl(fd, TIOCCHKVERAUTH) == 0) + status = TS_CURRENT; + else + status = TS_OLD; + close(fd); + goto done; + } + } +#endif + + /* Read the record at the correct position. */ + if ((nread = ts_read(cookie, &entry)) != sizeof(entry)) + goto done; + + /* Make sure what we read matched the expected record. */ + if (entry.version != TS_VERSION || entry.size != nread) { + /* do something else? */ + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "invalid time stamp file @ %lld", (long long)cookie->pos); + status = TS_OLD; + goto done; + } + + if (ISSET(entry.flags, TS_DISABLED)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "time stamp record disabled"); + status = TS_OLD; /* disabled via sudo -k */ + goto done; + } + + if (entry.type != TS_GLOBAL && entry.sid != cookie->sid) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "time stamp record sid mismatch"); + status = TS_OLD; /* belongs to different session */ + goto done; + } + + /* Negative timeouts only expire manually (sudo -k). */ + sudo_timespecclear(&diff); + if (sudo_timespeccmp(&def_timestamp_timeout, &diff, <)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "time stamp record does not expire"); + status = TS_CURRENT; + goto done; + } + + /* Compare stored time stamp with current time. */ + if (sudo_gettime_mono(&now) == -1) { + log_warning(0, N_("unable to read the clock")); + status = TS_ERROR; + goto done; + } + sudo_timespecsub(&now, &entry.ts, &diff); + if (sudo_timespeccmp(&diff, &def_timestamp_timeout, <)) { + status = TS_CURRENT; +#if defined(CLOCK_MONOTONIC) || defined(__MACH__) + /* A monotonic clock should never run backwards. */ + if (diff.tv_sec < 0) { + log_warningx(SLOG_SEND_MAIL, + N_("ignoring time stamp from the future")); + status = TS_OLD; + SET(entry.flags, TS_DISABLED); + (void)ts_write(cookie->fd, cookie->fname, &entry, cookie->pos); + } +#else + /* + * Check for bogus (future) time in the stampfile. + * If diff / 2 > timeout, someone has been fooling with the clock. + */ + sudo_timespecsub(&entry.ts, &now, &diff); + diff.tv_nsec /= 2; + if (diff.tv_sec & 1) + diff.tv_nsec += 500000000; + diff.tv_sec /= 2; + while (diff.tv_nsec >= 1000000000) { + diff.tv_sec++; + diff.tv_nsec -= 1000000000; + } + + if (sudo_timespeccmp(&diff, &def_timestamp_timeout, >)) { + time_t tv_sec = (time_t)entry.ts.tv_sec; + log_warningx(SLOG_SEND_MAIL, + N_("time stamp too far in the future: %20.20s"), + 4 + ctime(&tv_sec)); + status = TS_OLD; + SET(entry.flags, TS_DISABLED); + (void)ts_write(cookie->fd, cookie->fname, &entry, cookie->pos); + } +#endif /* CLOCK_MONOTONIC */ + } else { + status = TS_OLD; + } + +done: + debug_return_int(status); +} + +/* + * Update the time on the time stamp file/dir or create it if necessary. + * Returns true on success, false on failure or -1 on setuid failure. + */ +bool +timestamp_update(void *vcookie, struct passwd *pw) +{ + struct ts_cookie *cookie = vcookie; + int ret = false; + debug_decl(timestamp_update, SUDOERS_DEBUG_AUTH); + + /* Zero timeout means don't use time stamp files. */ + if (!sudo_timespecisset(&def_timestamp_timeout)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "timestamps disabled"); + goto done; + } + if (cookie == NULL || cookie->pos < 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "NULL cookie or invalid position"); + goto done; + } + +#ifdef TIOCSETVERAUTH + if (def_timestamp_type == kernel) { + int fd = open(_PATH_TTY, O_RDWR); + if (fd != -1) { + int secs = def_timestamp_timeout.tv_sec; + if (secs > 0) { + if (secs > 3600) + secs = 3600; /* OpenBSD limitation */ + if (ioctl(fd, TIOCSETVERAUTH, &secs) != 0) + sudo_warn("TIOCSETVERAUTH"); + } + close(fd); + goto done; + } + } +#endif + + /* Update timestamp in key and enable it. */ + CLR(cookie->key.flags, TS_DISABLED); + if (sudo_gettime_mono(&cookie->key.ts) == -1) { + log_warning(0, N_("unable to read the clock")); + goto done; + } + + /* Write out the locked record. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "writing %zu byte record at %lld", sizeof(cookie->key), + (long long)cookie->pos); + if (ts_write(cookie->fd, cookie->fname, &cookie->key, cookie->pos) != -1) + ret = true; + +done: + debug_return_int(ret); +} + +/* + * Remove the timestamp entry or file if unlink_it is set. + * Returns true on success, false on failure or -1 on setuid failure. + * A missing timestamp entry is not considered an error. + */ +int +timestamp_remove(bool unlink_it) +{ + struct timestamp_entry key, entry; + int fd = -1, ret = true; + char *fname = NULL; + debug_decl(timestamp_remove, SUDOERS_DEBUG_AUTH); + +#ifdef TIOCCLRVERAUTH + if (def_timestamp_type == kernel) { + fd = open(_PATH_TTY, O_RDWR); + if (fd != -1) { + ioctl(fd, TIOCCLRVERAUTH); + goto done; + } + } +#endif + + if (asprintf(&fname, "%s/%s", def_timestampdir, user_name) == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = -1; + goto done; + } + + /* For "sudo -K" simply unlink the time stamp file. */ + if (unlink_it) { + ret = unlink(fname) ? -1 : true; + goto done; + } + + /* Open time stamp file and lock it for exclusive access. */ + fd = ts_open(fname, O_RDWR); + switch (fd) { + case TIMESTAMP_OPEN_ERROR: + if (errno != ENOENT) + ret = false; + goto done; + case TIMESTAMP_PERM_ERROR: + /* Already logged set_perms/restore_perms error. */ + ret = -1; + goto done; + } + /* Lock first record to gain exclusive access. */ + if (!timestamp_lock_record(fd, -1, sizeof(struct timestamp_entry))) { + sudo_warn(U_("unable to lock time stamp file %s"), fname); + ret = -1; + goto done; + } + + /* + * Find matching entries and invalidate them. + */ + ts_init_key(&key, NULL, 0, def_timestamp_type); + while (ts_find_record(fd, &key, &entry)) { + /* Back up and disable the entry. */ + if (!ISSET(entry.flags, TS_DISABLED)) { + SET(entry.flags, TS_DISABLED); + if (lseek(fd, 0 - (off_t)sizeof(entry), SEEK_CUR) != -1) { + if (ts_write(fd, fname, &entry, -1) == -1) + ret = false; + } + } + } + +done: + if (fd != -1) + close(fd); + free(fname); + debug_return_int(ret); +} + +/* + * Returns true if the user has already been lectured. + */ +bool +already_lectured(int unused) +{ + char status_file[PATH_MAX]; + struct stat sb; + int len; + debug_decl(already_lectured, SUDOERS_DEBUG_AUTH); + + if (ts_secure_dir(def_lecture_status_dir, false, true)) { + len = snprintf(status_file, sizeof(status_file), "%s/%s", + def_lecture_status_dir, user_name); + if (len > 0 && len < ssizeof(status_file)) { + debug_return_bool(stat(status_file, &sb) == 0); + } + log_warningx(SLOG_SEND_MAIL, N_("lecture status path too long: %s/%s"), + def_lecture_status_dir, user_name); + } + debug_return_bool(false); +} + +/* + * Create the lecture status file. + * Returns true on success, false on failure or -1 on setuid failure. + */ +int +set_lectured(void) +{ + char lecture_status[PATH_MAX]; + int len, fd, ret = false; + debug_decl(set_lectured, SUDOERS_DEBUG_AUTH); + + len = snprintf(lecture_status, sizeof(lecture_status), "%s/%s", + def_lecture_status_dir, user_name); + if (len < 0 || len >= ssizeof(lecture_status)) { + log_warningx(SLOG_SEND_MAIL, N_("lecture status path too long: %s/%s"), + def_lecture_status_dir, user_name); + goto done; + } + + /* Check the validity of lecture dir and create if missing. */ + if (!ts_secure_dir(def_lecture_status_dir, true, false)) + goto done; + + /* Create lecture file. */ + fd = ts_open(lecture_status, O_WRONLY|O_CREAT|O_EXCL); + switch (fd) { + case TIMESTAMP_OPEN_ERROR: + /* Failed to open, not a fatal error. */ + break; + case TIMESTAMP_PERM_ERROR: + /* Already logged set_perms/restore_perms error. */ + ret = -1; + break; + default: + /* Success. */ + close(fd); + ret = true; + break; + } + +done: + debug_return_int(ret); +} diff --git a/plugins/sudoers/timestr.c b/plugins/sudoers/timestr.c new file mode 100644 index 0000000..3398405 --- /dev/null +++ b/plugins/sudoers/timestr.c @@ -0,0 +1,50 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999, 2009-2011, 2013-2015, 2017 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#include "sudo_compat.h" +#include "sudo_debug.h" +#include "parse.h" + +/* + * Return a static buffer with the current date + time. + */ +char * +get_timestr(time_t tstamp, int log_year) +{ + static char buf[128]; + struct tm *timeptr; + + if ((timeptr = localtime(&tstamp)) != NULL) { + /* strftime() does not guarantee to NUL-terminate so we must check. */ + buf[sizeof(buf) - 1] = '\0'; + if (strftime(buf, sizeof(buf), log_year ? "%h %e %T %Y" : "%h %e %T", + timeptr) != 0 && buf[sizeof(buf) - 1] == '\0') + return buf; + } + return NULL; +} diff --git a/plugins/sudoers/toke.c b/plugins/sudoers/toke.c new file mode 100644 index 0000000..366f805 --- /dev/null +++ b/plugins/sudoers/toke.c @@ -0,0 +1,5491 @@ +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#line 3 "toke.c" + +#define YY_INT_ALIGNED short int + +/* $OpenBSD: flex.skl,v 1.17 2020/08/06 17:23:29 deraadt Exp $ */ + +/* A lexical scanner generated by flex */ + +#define yy_create_buffer sudoers_create_buffer +#define yy_delete_buffer sudoers_delete_buffer +#define yy_flex_debug sudoers_flex_debug +#define yy_init_buffer sudoers_init_buffer +#define yy_flush_buffer sudoers_flush_buffer +#define yy_load_buffer_state sudoers_load_buffer_state +#define yy_switch_to_buffer sudoers_switch_to_buffer +#define yyin sudoersin +#define yyleng sudoersleng +#define yylex sudoerslex +#define yylineno sudoerslineno +#define yyout sudoersout +#define yyrestart sudoersrestart +#define yytext sudoerstext +#define yywrap sudoerswrap +#define yyalloc sudoersalloc +#define yyrealloc sudoersrealloc +#define yyfree sudoersfree + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 39 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* $OpenBSD: flexint.h,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE sudoersrestart(sudoersin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +extern yy_size_t sudoersleng; + +extern FILE *sudoersin, *sudoersout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up sudoerstext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up sudoerstext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + yy_size_t yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via sudoersrestart()), so that the user can continue scanning by + * just pointing sudoersin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when sudoerstext is formed. */ +static char yy_hold_char; +static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +yy_size_t sudoersleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow sudoerswrap()'s to do buffer switches + * instead of setting up a fresh sudoersin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void sudoersrestart (FILE *input_file ); +void sudoers_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE sudoers_create_buffer (FILE *file,int size ); +void sudoers_delete_buffer (YY_BUFFER_STATE b ); +void sudoers_flush_buffer (YY_BUFFER_STATE b ); +void sudoerspush_buffer_state (YY_BUFFER_STATE new_buffer ); +void sudoerspop_buffer_state (void ); + +static void sudoersensure_buffer_stack (void ); +static void sudoers_load_buffer_state (void ); +static void sudoers_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER sudoers_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE sudoers_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE sudoers_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE sudoers_scan_bytes (yyconst char *bytes,yy_size_t len ); + +void *sudoersalloc (yy_size_t ); +void *sudoersrealloc (void *,yy_size_t ); +void sudoersfree (void * ); + +#define yy_new_buffer sudoers_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + sudoersensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + sudoers_create_buffer(sudoersin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + sudoersensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + sudoers_create_buffer(sudoersin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define sudoerswrap() 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +FILE *sudoersin = (FILE *) 0, *sudoersout = (FILE *) 0; + +typedef int yy_state_type; + +extern int sudoerslineno; + +int sudoerslineno = 1; + +extern char *sudoerstext; +#define yytext_ptr sudoerstext + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up sudoerstext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + sudoersleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 81 +#define YY_END_OF_BUFFER 82 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[1126] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 67, + 77, 76, 80, 75, 66, 79, 40, 70, 71, 40, + 72, 67, 67, 67, 67, 74, 73, 80, 67, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 80, 67, 67, 77, 79, 57, 57, 57, + 57, 57, 2, 80, 1, 67, 57, 57, 57, 67, + 17, 16, 16, 17, 16, 16, 80, 79, 80, 3, + 9, 8, 9, 4, 9, 5, 80, 13, 13, 13, + 11, 12, 80, 19, 19, 18, 18, 18, 19, 18, + + 18, 18, 18, 19, 19, 19, 19, 19, 19, 18, + 19, 19, 68, 68, 69, 68, 64, 64, 64, 64, + 64, 64, 64, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 80, 64, 64, 67, 0, 77, 76, + 75, 79, 79, 0, 0, 67, 42, 0, 40, 0, + 41, 0, 65, 65, 0, 67, 67, 0, 67, 67, + 67, 67, 0, 45, 67, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 0, 78, 67, 67, 67, 67, 77, 0, + 0, 0, 0, 0, 79, 67, 67, 67, 67, 67, + + 2, 1, 0, 1, 58, 58, 0, 57, 67, 17, + 17, 15, 0, 14, 15, 0, 3, 9, 0, 6, + 7, 9, 9, 13, 0, 13, 13, 0, 10, 0, + 42, 0, 0, 41, 19, 19, 0, 19, 0, 0, + 18, 18, 18, 18, 18, 18, 19, 19, 57, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 68, 68, + 68, 64, 0, 42, 0, 41, 0, 64, 64, 0, + 64, 64, 64, 64, 64, 64, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 64, 64, 64, 64, + 79, 79, 79, 0, 42, 67, 67, 67, 67, 67, + + 0, 0, 45, 45, 67, 57, 47, 57, 51, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 67, 67, 0, + 0, 0, 0, 0, 79, 67, 67, 67, 67, 67, + 67, 0, 67, 10, 0, 0, 0, 18, 18, 18, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 0, 64, 64, 64, 64, + 64, 57, 47, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 64, 64, 79, 79, 79, + 67, 67, 67, 67, 67, 67, 0, 46, 46, 46, + + 0, 0, 45, 45, 45, 45, 45, 45, 45, 67, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 53, 57, 57, + 54, 67, 67, 67, 67, 0, 0, 0, 0, 0, + 0, 79, 67, 67, 67, 67, 0, 0, 0, 0, + 0, 18, 18, 19, 19, 57, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 64, + 64, 64, 64, 64, 64, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 64, 64, + 64, 64, 67, 67, 67, 0, 0, 46, 46, 46, + + 0, 45, 45, 0, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 67, 57, 0, 29, 57, + 57, 57, 57, 0, 36, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 55, 57, 57, 67, 67, 67, + 67, 67, 0, 0, 0, 79, 67, 67, 67, 0, + 0, 0, 18, 18, 19, 57, 57, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 64, 64, 64, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 64, 64, 64, 64, 64, 67, + 67, 67, 67, 67, 0, 46, 0, 45, 45, 45, + + 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 67, 52, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 59, 60, 61, 62, 67, 0, 0, + 79, 67, 67, 67, 0, 0, 0, 0, 0, 19, + 57, 57, 19, 19, 57, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 64, 64, 64, 64, 64, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 59, 60, 61, 62, 64, 43, 43, 43, 0, + 0, 45, 45, 45, 45, 45, 45, 45, 0, 0, + + 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 67, 0, 38, + 57, 57, 57, 0, 28, 57, 57, 57, 0, 37, + 57, 57, 57, 57, 0, 27, 0, 30, 48, 67, + 0, 0, 79, 67, 67, 67, 43, 43, 43, 57, + 57, 19, 57, 57, 19, 19, 19, 43, 43, 43, + 57, 57, 57, 57, 57, 57, 57, 64, 67, 43, + 43, 43, 43, 0, 45, 0, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + + 45, 45, 45, 20, 57, 57, 57, 57, 57, 57, + 57, 57, 50, 57, 63, 0, 0, 79, 67, 24, + 58, 0, 43, 43, 43, 43, 57, 57, 19, 57, + 57, 19, 19, 19, 64, 43, 43, 43, 43, 57, + 57, 57, 57, 57, 57, 57, 63, 44, 44, 44, + 44, 45, 0, 0, 0, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, + 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 67, 57, 57, 57, 0, 39, 57, 57, 0, + 26, 0, 31, 49, 0, 24, 22, 79, 25, 0, + + 67, 44, 44, 44, 44, 57, 57, 57, 57, 44, + 44, 44, 44, 57, 57, 57, 57, 67, 67, 44, + 44, 44, 44, 0, 0, 0, 0, 0, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 67, 56, + 0, 34, 57, 57, 57, 25, 22, 22, 22, 22, + 79, 24, 0, 0, 0, 0, 0, 24, 0, 0, + 0, 44, 44, 44, 44, 57, 57, 57, 64, 64, + 44, 44, 44, 44, 57, 57, 57, 67, 67, 67, + 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, + + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 21, 0, 32, 57, 57, 22, 79, 0, 24, + 0, 0, 0, 57, 57, 64, 64, 64, 57, 57, + 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 0, 35, + 57, 23, 0, 0, 0, 0, 0, 57, 64, 64, + 64, 64, 64, 57, 67, 67, 67, 45, 45, 45, + 45, 45, 45, 0, 33, 23, 23, 23, 23, 0, + 0, 0, 64, 64, 64, 67, 67, 67, 67, 67, + 45, 45, 45, 45, 45, 23, 0, 0, 0, 0, + + 0, 64, 64, 64, 64, 64, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 6, 7, 8, 9, 1, 10, 1, 1, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 1, 1, + 30, 31, 13, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, + 42, 48, 49, 50, 51, 52, 53, 54, 55, 42, + 13, 56, 13, 1, 57, 1, 58, 59, 60, 61, + + 62, 63, 64, 65, 66, 64, 64, 67, 68, 69, + 70, 64, 64, 71, 72, 73, 74, 64, 64, 64, + 64, 64, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[75] = + { 0, + 1, 2, 3, 4, 3, 2, 5, 6, 7, 1, + 8, 8, 1, 9, 10, 1, 11, 12, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 14, 15, + 8, 1, 13, 13, 13, 13, 13, 13, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 17, 18, 19, 19, 19, + 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20 + } ; + +static yyconst flex_int16_t yy_base[1228] = + { 0, + 0, 73, 123, 194, 81, 97, 265, 338, 411, 466, + 128, 137, 522, 0, 157, 172, 596, 0, 6501, 6444, + 74, 8253, 6486, 6460, 8253, 668, 72, 8253, 8253, 6408, + 8253, 174, 680, 195, 95, 6434, 8253, 8253, 29, 743, + 6419, 54, 35, 77, 799, 52, 6428, 6381, 44, 6378, + 6386, 50, 861, 226, 127, 225, 890, 216, 105, 6344, + 76, 6341, 192, 266, 145, 359, 6365, 6364, 6376, 132, + 0, 8253, 6405, 6400, 8253, 0, 427, 954, 230, 0, + 6344, 8253, 116, 8253, 169, 8253, 275, 6342, 202, 182, + 8253, 293, 246, 434, 982, 1026, 284, 294, 1084, 1134, + + 6332, 148, 106, 1190, 6328, 6329, 6293, 6303, 6298, 329, + 0, 294, 6278, 227, 8253, 372, 6269, 333, 6268, 447, + 1237, 360, 465, 1300, 6268, 315, 111, 1356, 6250, 6261, + 6237, 6238, 6208, 1418, 485, 387, 6188, 719, 358, 8253, + 6235, 259, 8253, 6238, 655, 824, 6183, 858, 436, 892, + 6179, 919, 929, 6177, 1448, 981, 1463, 6202, 6213, 996, + 1006, 495, 6187, 343, 100, 1526, 1582, 6172, 6160, 6159, + 6157, 6150, 6147, 6151, 6126, 895, 6106, 6100, 6087, 6072, + 6077, 6073, 492, 8253, 184, 717, 307, 392, 1241, 6051, + 6046, 6025, 6017, 6016, 836, 676, 194, 207, 368, 414, + + 949, 727, 1104, 749, 1224, 5999, 1644, 1241, 833, 0, + 6045, 960, 6048, 8253, 8253, 1381, 0, 5994, 1300, 8253, + 8253, 5985, 1134, 5984, 6029, 941, 366, 966, 752, 6009, + 846, 879, 1431, 5954, 1653, 0, 1502, 1710, 1662, 1445, + 1751, 5992, 1602, 1674, 1218, 1801, 1857, 5944, 0, 5935, + 5928, 5918, 5915, 1687, 5905, 5897, 5873, 5846, 5839, 985, + 665, 5831, 1787, 5814, 1892, 5806, 1919, 1750, 5805, 1949, + 1726, 1964, 5843, 1916, 1946, 1612, 2027, 2083, 5816, 5805, + 5782, 5778, 5775, 1966, 5738, 5736, 390, 1500, 365, 897, + 457, 474, 496, 2103, 2128, 2140, 2180, 2220, 2258, 5760, + + 5736, 2303, 717, 2349, 928, 2412, 2468, 5718, 0, 5728, + 5719, 5720, 5690, 5703, 5683, 5660, 5659, 5667, 5662, 5656, + 286, 5633, 5618, 5630, 5628, 5620, 5617, 1389, 154, 370, + 5580, 5570, 5558, 5560, 1392, 335, 1077, 5556, 798, 654, + 782, 2180, 393, 1228, 2152, 2194, 2206, 2513, 5596, 2558, + 0, 5576, 5567, 5545, 5547, 5533, 5526, 5517, 5496, 5493, + 5467, 5454, 5448, 1410, 5409, 2259, 2605, 2645, 2685, 2725, + 5443, 2770, 0, 5424, 5415, 5389, 5387, 5375, 5359, 5344, + 5356, 5342, 5337, 5324, 5335, 1657, 940, 8253, 826, 949, + 2278, 1085, 2817, 2857, 1889, 464, 5336, 5321, 2230, 1095, + + 5320, 5297, 1265, 2323, 2897, 2369, 1684, 2943, 2490, 1331, + 3006, 900, 1659, 1105, 471, 1643, 1710, 1192, 1106, 801, + 657, 1238, 1007, 827, 1274, 867, 1445, 5284, 1013, 1240, + 5281, 1420, 1395, 1226, 905, 5252, 5237, 5228, 5212, 5226, + 5202, 1490, 1189, 1709, 1094, 1419, 2533, 5211, 2580, 2617, + 2115, 3062, 3107, 1726, 5166, 1266, 1727, 5144, 5137, 5140, + 5130, 5108, 5106, 5102, 5099, 3152, 1491, 1514, 1739, 2627, + 1379, 3199, 3239, 2658, 1583, 5103, 2005, 5055, 1621, 2006, + 5040, 5033, 5023, 5020, 5011, 5008, 4996, 5003, 1776, 1620, + 1749, 1624, 3279, 3319, 3359, 4952, 4950, 2665, 4921, 4912, + + 4911, 4910, 1619, 2696, 1977, 2706, 2000, 3399, 0, 2747, + 3446, 2790, 2288, 3492, 2829, 1384, 1487, 2261, 8253, 982, + 1690, 1383, 723, 2350, 8253, 1867, 1262, 1658, 1761, 1609, + 1491, 1714, 1706, 1917, 4909, 1900, 1631, 1891, 1832, 1940, + 2137, 1747, 4861, 4819, 4820, 2110, 1949, 1963, 1921, 2841, + 2869, 2881, 4826, 4797, 4772, 4772, 4751, 4766, 4757, 4731, + 4732, 4723, 4722, 4711, 4679, 2015, 2166, 2248, 276, 2214, + 3539, 3579, 3619, 4598, 4591, 4582, 4591, 4580, 4523, 4499, + 4492, 4480, 4450, 4410, 2358, 2156, 2542, 2359, 2127, 2917, + 1958, 3659, 3699, 2803, 4432, 4417, 4416, 4371, 3737, 2003, + + 2965, 3084, 3129, 2244, 2388, 2594, 3172, 2979, 3784, 0, + 3211, 3831, 3222, 2379, 3877, 3251, 2297, 4355, 2560, 2085, + 1858, 2304, 2561, 1930, 2479, 2771, 1191, 1762, 2390, 2375, + 2772, 2773, 2469, 4289, 4282, 4281, 4261, 2204, 4249, 4225, + 2693, 2716, 2514, 2943, 3261, 4274, 3291, 3303, 2929, 2992, + 4223, 4219, 3331, 4222, 2314, 3348, 4170, 4174, 3359, 3360, + 2399, 2500, 2589, 2635, 2714, 3373, 2168, 3924, 3964, 3350, + 3362, 4130, 4103, 3401, 4080, 2523, 3402, 4069, 4052, 3447, + 3448, 4026, 4025, 3977, 3878, 3036, 4003, 4042, 4081, 3904, + 3900, 3896, 3419, 4121, 3466, 3094, 4166, 3514, 3549, 3871, + + 3561, 3591, 3184, 2645, 2881, 3334, 3528, 3601, 3631, 4213, + 0, 3633, 4260, 3644, 3139, 4306, 3671, 2136, 3449, 8253, + 4369, 3096, 2377, 3493, 8253, 1488, 2654, 3307, 3494, 8253, + 2573, 2959, 2695, 2906, 3495, 8253, 3671, 8253, 3842, 2683, + 3758, 3743, 2867, 1330, 1986, 2684, 3683, 3710, 3721, 3743, + 3705, 4430, 3672, 3638, 2875, 1030, 3564, 4487, 4526, 4565, + 4621, 2824, 2213, 2652, 3579, 2876, 1562, 2939, 3758, 2763, + 4678, 4717, 3769, 3568, 3565, 3807, 2818, 3851, 3222, 4757, + 0, 3899, 4770, 3934, 3390, 4815, 3946, 3976, 3988, 4015, + 3303, 3514, 3913, 4027, 4027, 4054, 4862, 0, 4056, 4909, + + 4067, 3817, 4093, 2957, 4972, 2263, 1881, 3880, 3205, 2307, + 4122, 4123, 3497, 3165, 3488, 3444, 3384, 3288, 2604, 3602, + 3396, 4141, 3430, 4187, 4234, 4112, 3355, 3305, 5045, 3287, + 3219, 3878, 3879, 0, 4280, 3236, 5102, 5141, 4291, 5197, + 2392, 4214, 2967, 3159, 4215, 4216, 3127, 5255, 5295, 5335, + 5375, 3135, 4329, 4499, 4511, 3109, 3280, 3373, 4536, 3562, + 5415, 0, 4548, 5428, 4575, 4339, 5473, 4587, 4688, 3102, + 4700, 4729, 4741, 3946, 3988, 4599, 2482, 2505, 5520, 0, + 4792, 3861, 3042, 4816, 2493, 4261, 8253, 2606, 3451, 4369, + 8253, 4370, 8253, 3041, 2943, 4598, 3748, 3858, 2927, 4852, + + 4863, 4890, 4931, 5114, 5126, 4817, 2837, 2770, 2752, 5532, + 5572, 5612, 5652, 5176, 2705, 2924, 3089, 5268, 3576, 5692, + 5732, 5153, 3657, 5164, 2720, 5280, 5308, 5033, 2671, 2606, + 3965, 4067, 5318, 4094, 5772, 0, 5347, 5785, 5358, 4747, + 5830, 5387, 5398, 5449, 5494, 4511, 2597, 3019, 3182, 2536, + 4818, 8253, 5476, 3132, 3185, 8253, 3350, 4375, 8253, 3354, + 4647, 5559, 5567, 5599, 5610, 5625, 4972, 5654, 5692, 5558, + 2551, 5664, 5707, 5719, 2527, 5198, 2285, 2143, 5747, 3759, + 5877, 5917, 5759, 3806, 5521, 2120, 3497, 5957, 5997, 6037, + 5807, 5852, 5889, 2111, 2028, 4110, 4430, 5899, 4549, 6077, + + 0, 5929, 6090, 5940, 4882, 5969, 2015, 5980, 6008, 4942, + 1944, 1833, 5696, 8253, 6037, 3540, 8253, 4727, 6048, 6058, + 6112, 6137, 6149, 5926, 1783, 6161, 6201, 6241, 6190, 1709, + 6178, 3870, 6281, 6321, 6190, 6228, 1673, 6253, 6265, 6025, + 1475, 1302, 4603, 1251, 1148, 6293, 0, 3951, 6009, 8253, + 6321, 4861, 6332, 902, 6344, 6359, 6309, 6230, 6369, 4001, + 6409, 6449, 6382, 6410, 6489, 6529, 6569, 6421, 6431, 6459, + 858, 0, 694, 6293, 8253, 3656, 5478, 8253, 3709, 6471, + 6501, 6513, 6609, 6649, 6689, 6542, 4002, 6729, 6769, 6554, + 8253, 6580, 6592, 5817, 8253, 8253, 6619, 668, 6631, 6661, + + 6398, 6671, 4318, 6809, 6849, 6702, 6709, 6747, 6785, 6795, + 6823, 6833, 6859, 6869, 6907, 320, 6917, 6123, 8253, 6927, + 5862, 134, 6955, 6720, 8253, 7011, 7031, 7051, 7071, 7091, + 7111, 7131, 7151, 7171, 7191, 4157, 7211, 7231, 3749, 7251, + 7271, 7291, 7311, 7331, 7351, 7371, 7391, 7411, 7431, 7451, + 7471, 7491, 7511, 7531, 7551, 7571, 4159, 4560, 7580, 7599, + 7619, 7639, 4178, 7659, 7679, 7699, 7719, 7731, 7751, 4962, + 7771, 7791, 7811, 7831, 7851, 7871, 7891, 7911, 4562, 7920, + 4605, 4843, 5180, 7928, 7947, 5190, 5334, 5374, 5414, 7956, + 7965, 5511, 5590, 5607, 7973, 7982, 5611, 5645, 7990, 7999, + + 8018, 5683, 8030, 5731, 8040, 8048, 8057, 8076, 6074, 8088, + 8108, 5771, 8118, 8126, 8135, 8154, 8174, 8194, 5916, 8204, + 5183, 5956, 8213, 6224, 5551, 8232, 4808 + } ; + +static yyconst flex_int16_t yy_def[1228] = + { 0, + 1125, 1, 1, 1, 1126, 1126, 1127, 1127, 1128, 1128, + 1129, 1129, 1125, 13, 1130, 1130, 1125, 17, 1125, 1131, + 1125, 1125, 1125, 1125, 1125, 1132, 1133, 1125, 1125, 1134, + 1125, 1135, 1131, 33, 33, 1136, 1125, 1125, 1131, 1125, + 40, 40, 40, 40, 40, 45, 45, 45, 45, 45, + 45, 45, 1131, 33, 1131, 1125, 1132, 40, 40, 45, + 45, 45, 1125, 1125, 1125, 1137, 45, 45, 45, 1131, + 1138, 1125, 1125, 1138, 1125, 1138, 1125, 1132, 1125, 1139, + 1140, 1125, 1140, 1125, 1140, 1125, 1141, 1142, 1142, 1142, + 1125, 1125, 1143, 1144, 1145, 1125, 96, 96, 96, 1125, + + 100, 100, 100, 100, 104, 104, 104, 104, 104, 96, + 99, 99, 1146, 1146, 1125, 1146, 1147, 1148, 1149, 1150, + 1147, 121, 121, 1125, 124, 124, 124, 124, 128, 128, + 128, 128, 128, 1147, 121, 1147, 1131, 1131, 1125, 1125, + 1125, 1151, 1125, 1125, 1152, 1125, 1153, 1125, 1143, 1153, + 1154, 1154, 1155, 1156, 1131, 1131, 1131, 1157, 157, 157, + 157, 157, 1158, 1159, 1131, 1125, 166, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 1125, 1125, 1131, 1131, 1131, 1131, 1125, 1125, + 1125, 1125, 1125, 1125, 1151, 1131, 157, 1131, 1131, 1131, + + 1125, 1125, 1125, 1125, 1160, 1161, 1131, 167, 1131, 1162, + 1162, 1125, 1125, 1125, 1125, 1152, 1163, 1164, 1164, 1125, + 1125, 1164, 1164, 1165, 1125, 1165, 1165, 1125, 1125, 1125, + 1143, 1143, 1143, 1166, 1167, 1168, 1166, 1169, 1125, 1125, + 1168, 241, 241, 241, 241, 1125, 246, 247, 1170, 247, + 247, 247, 247, 247, 247, 247, 1168, 1168, 1171, 1171, + 1171, 1172, 1172, 1173, 1173, 1174, 1174, 1175, 1176, 1172, + 1172, 1172, 272, 272, 272, 272, 1125, 277, 278, 278, + 278, 278, 278, 278, 278, 278, 1172, 1172, 1172, 1172, + 1177, 1177, 1178, 1125, 1125, 1131, 1131, 1131, 1131, 299, + + 1179, 1125, 1180, 1125, 1131, 1125, 306, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 1131, 1131, 1125, + 1125, 1125, 1125, 1125, 1177, 1131, 1131, 299, 1131, 1131, + 1131, 1125, 1131, 1125, 1125, 1125, 1125, 1168, 348, 246, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 1168, 1168, 1125, 1172, 1172, 1172, 272, + 370, 277, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 1172, 1172, 1125, 1178, 1178, + 1131, 1131, 1131, 1131, 1131, 1131, 1181, 1182, 1182, 399, + + 1183, 1182, 1184, 304, 1125, 405, 405, 1125, 405, 1131, + 1125, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 411, 1131, 1131, 1131, 1131, 1125, 1125, 1125, 1125, 1125, + 1125, 1185, 1131, 1131, 1131, 1131, 1125, 1125, 1125, 1125, + 1125, 348, 246, 247, 247, 1186, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 452, 466, 466, 466, 1172, + 1172, 1172, 1172, 1172, 1172, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 1172, 1172, + 1172, 1172, 1131, 1131, 1131, 1125, 1187, 1187, 498, 1187, + + 1188, 1189, 1190, 1125, 1191, 408, 1191, 1125, 508, 1191, + 1125, 511, 511, 1125, 511, 1131, 411, 1125, 1125, 411, + 411, 411, 411, 1125, 1125, 411, 411, 411, 411, 411, + 411, 411, 411, 411, 411, 411, 411, 1131, 1131, 1131, + 1131, 1131, 1125, 1125, 1125, 1185, 1131, 1131, 1131, 1125, + 1125, 1125, 452, 453, 247, 1186, 1186, 247, 247, 247, + 247, 247, 247, 247, 247, 466, 466, 466, 466, 466, + 1172, 1172, 1172, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 1172, 1172, 1172, 1172, 1172, 1131, + 1131, 1131, 1131, 1131, 1192, 1192, 1193, 1194, 1125, 1125, + + 1125, 1125, 1125, 1195, 1195, 1196, 514, 1196, 1125, 609, + 1196, 1125, 612, 612, 1125, 612, 1131, 411, 411, 411, + 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 411, 411, 411, 1131, 1131, 1131, 1131, 1131, 1125, 1125, + 1185, 1131, 1131, 1131, 1125, 1125, 1125, 1125, 1125, 247, + 1186, 1186, 247, 247, 1186, 247, 247, 247, 247, 247, + 466, 466, 466, 466, 466, 1172, 1172, 1172, 1172, 1172, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 1172, 1172, 1172, 1172, 1172, 1131, 1131, 1131, 1125, + 1197, 1198, 599, 1125, 694, 694, 1125, 694, 1125, 1125, + + 1125, 1125, 1125, 1125, 1199, 1199, 1200, 615, 1200, 1125, + 710, 1200, 1125, 713, 713, 1125, 713, 1131, 1125, 1125, + 1125, 721, 721, 1125, 1125, 721, 721, 721, 1125, 1125, + 721, 721, 721, 721, 1125, 1125, 1125, 1125, 721, 1131, + 1125, 1125, 1201, 1131, 1131, 1131, 1125, 1125, 1125, 1202, + 1202, 1125, 1202, 1202, 752, 752, 1203, 1172, 1172, 1172, + 1125, 761, 761, 761, 761, 761, 761, 1172, 1131, 1131, + 1131, 1131, 1131, 1125, 1204, 1125, 1205, 697, 1205, 1205, + 780, 1205, 1125, 783, 783, 1125, 783, 1125, 1125, 1125, + 1125, 1206, 1206, 1207, 716, 1207, 1125, 797, 1207, 1125, + + 800, 800, 800, 1131, 1125, 805, 805, 805, 805, 805, + 805, 805, 805, 805, 1131, 1125, 1125, 1208, 1131, 1131, + 1131, 1125, 1125, 1125, 1125, 1125, 1209, 1209, 1125, 1209, + 1209, 829, 829, 1210, 1211, 1211, 1211, 1211, 1211, 1125, + 840, 840, 840, 840, 840, 840, 1211, 1131, 1131, 1131, + 1131, 1125, 1125, 1125, 1125, 1212, 1212, 1213, 786, 1213, + 1213, 861, 1213, 1125, 864, 864, 1125, 864, 1125, 1125, + 1125, 1125, 1125, 1125, 1214, 1214, 1215, 1215, 1215, 879, + 1215, 1131, 805, 805, 805, 1125, 1125, 805, 805, 1125, + 1125, 1125, 1125, 805, 1125, 1125, 1216, 1208, 1131, 1217, + + 1218, 1125, 1125, 1125, 1125, 1209, 1209, 1209, 1209, 1211, + 1211, 1211, 1211, 840, 840, 840, 840, 1131, 1131, 1131, + 1131, 1131, 1131, 1125, 1125, 1125, 1125, 1125, 1125, 1219, + 1219, 1220, 867, 1220, 1220, 935, 1220, 1125, 938, 938, + 1125, 938, 1125, 1125, 1125, 1125, 1221, 1221, 1131, 805, + 1125, 1125, 805, 805, 805, 1125, 1216, 1216, 1125, 1216, + 1208, 1217, 1217, 1217, 1217, 1125, 1217, 1218, 1218, 1125, + 1125, 1125, 1125, 1125, 1125, 1209, 1209, 1209, 1211, 1211, + 1211, 1211, 1211, 1211, 840, 840, 840, 1131, 1131, 1131, + 1125, 1125, 1125, 1125, 1222, 1222, 1223, 941, 1223, 1223, + + 1000, 1223, 1125, 1003, 1003, 1003, 1125, 1125, 1125, 1125, + 1125, 1131, 1125, 1125, 805, 805, 1125, 1208, 1125, 1125, + 1125, 1125, 1125, 1209, 1209, 1211, 1211, 1211, 840, 840, + 1131, 1131, 1131, 1131, 1131, 1125, 1125, 1125, 1125, 1125, + 1125, 1224, 1224, 1225, 1225, 1225, 1046, 1046, 1125, 1125, + 805, 1226, 1125, 1125, 1125, 1125, 1125, 1209, 1211, 1211, + 1211, 1211, 1211, 840, 1131, 1131, 1131, 1125, 1125, 1125, + 1125, 1227, 1227, 1125, 1125, 1226, 1226, 1125, 1226, 1125, + 1125, 1125, 1211, 1211, 1211, 1131, 1131, 1131, 1131, 1131, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + + 1125, 1211, 1211, 1211, 1211, 1211, 1131, 1131, 1131, 1125, + 1125, 1125, 1211, 1211, 1211, 1131, 1131, 1131, 1125, 1125, + 1125, 1211, 1211, 1211, 0, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125 + } ; + +static yyconst flex_int16_t yy_nxt[8328] = + { 0, + 20, 21, 22, 20, 23, 21, 24, 25, 26, 27, + 28, 29, 20, 30, 31, 20, 20, 32, 33, 34, + 35, 33, 33, 33, 33, 33, 33, 33, 36, 37, + 38, 39, 40, 41, 42, 41, 43, 44, 45, 45, + 45, 45, 46, 47, 48, 45, 49, 50, 51, 52, + 45, 45, 45, 45, 45, 53, 20, 54, 54, 54, + 54, 54, 54, 20, 20, 20, 20, 20, 20, 20, + 20, 55, 20, 20, 56, 139, 177, 167, 56, 139, + 148, 57, 21, 72, 138, 73, 21, 74, 171, 75, + 181, 178, 173, 169, 165, 75, 167, 174, 21, 72, + + 149, 73, 21, 74, 182, 75, 170, 58, 59, 75, + 76, 75, 60, 161, 161, 161, 161, 161, 162, 167, + 61, 179, 172, 62, 63, 75, 76, 150, 63, 89, + 22, 64, 23, 89, 90, 91, 77, 65, 89, 22, + 66, 23, 89, 90, 91, 220, 204, 167, 247, 199, + 204, 251, 77, 278, 20, 138, 281, 41, 21, 22, + 38, 23, 21, 114, 115, 67, 197, 68, 305, 69, + 45, 219, 45, 21, 22, 38, 23, 21, 114, 115, + 154, 154, 138, 92, 154, 154, 184, 138, 227, 263, + 247, 187, 92, 201, 70, 63, 187, 201, 221, 63, + + 188, 250, 64, 226, 154, 209, 202, 226, 65, 138, + 137, 66, 116, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 435, 219, 20, 189, 116, 41, 155, + 189, 183, 184, 261, 213, 183, 67, 225, 68, 138, + 69, 45, 137, 45, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 148, 169, 338, 225, 167, 190, + 191, 143, 138, 292, 192, 70, 21, 22, 170, 23, + 21, 24, 193, 78, 232, 194, 223, 184, 339, 213, + 223, 203, 260, 196, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 228, 229, 664, 230, 228, 236, + + 224, 233, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 244, 244, 244, 244, 244, 245, 424, 425, + 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 21, + 22, 148, 23, 21, 24, 1125, 78, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 278, 257, 139, + 302, 232, 138, 139, 328, 206, 206, 258, 280, 206, + 206, 304, 227, 183, 184, 138, 213, 183, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 265, 206, + 138, 443, 184, 79, 80, 80, 80, 80, 80, 80, + + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 21, 22, 207, 23, 21, 24, 82, 78, + 263, 225, 386, 138, 83, 84, 85, 260, 212, 184, + 436, 213, 212, 214, 234, 215, 340, 234, 437, 214, + 86, 215, 263, 234, 148, 263, 234, 138, 138, 234, + 234, 289, 329, 269, 269, 215, 215, 269, 269, 143, + 290, 292, 446, 236, 1125, 234, 87, 21, 22, 138, + 23, 21, 24, 82, 78, 341, 388, 269, 292, 83, + 84, 85, 215, 275, 275, 275, 275, 275, 276, 237, + 234, 233, 158, 183, 184, 86, 213, 183, 143, 1125, + + 390, 262, 270, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 300, 300, 300, 300, 300, 300, 138, + 521, 87, 38, 21, 22, 38, 23, 21, 24, 38, + 38, 93, 28, 29, 38, 94, 31, 38, 38, 95, + 96, 97, 98, 96, 96, 96, 96, 96, 96, 96, + 36, 99, 38, 38, 100, 101, 101, 101, 102, 103, + 104, 104, 104, 104, 105, 106, 107, 104, 108, 104, + 109, 104, 104, 104, 104, 104, 104, 79, 38, 110, + 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, + 111, 111, 111, 112, 111, 111, 117, 21, 22, 117, + + 23, 21, 24, 38, 38, 118, 28, 29, 117, 119, + 31, 117, 117, 120, 121, 122, 123, 121, 121, 121, + 121, 121, 121, 121, 36, 37, 38, 117, 124, 125, + 125, 125, 126, 127, 128, 128, 128, 128, 129, 130, + 131, 128, 132, 128, 133, 128, 128, 128, 128, 128, + 128, 134, 117, 135, 135, 135, 135, 135, 135, 117, + 117, 117, 117, 117, 117, 117, 117, 136, 117, 117, + 143, 261, 144, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 145, 1097, 1125, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 156, 529, 157, 157, + + 157, 157, 157, 157, 157, 157, 157, 157, 158, 138, + 776, 445, 159, 159, 159, 159, 159, 159, 183, 184, + 260, 213, 183, 137, 137, 137, 137, 137, 204, 137, + 137, 138, 204, 137, 302, 138, 336, 159, 159, 159, + 159, 159, 159, 137, 337, 404, 137, 137, 137, 137, + 204, 1125, 137, 344, 204, 137, 137, 344, 137, 137, + 137, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 158, 138, 622, 137, 166, 166, 166, 166, 166, + 166, 167, 167, 167, 167, 168, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 138, 167, + + 159, 159, 159, 159, 159, 159, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 1125, 143, 1125, + 390, 167, 167, 167, 167, 167, 167, 138, 143, 528, + 292, 167, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 336, 138, 1125, 1125, 137, 137, 137, 137, + 137, 137, 183, 184, 532, 185, 186, 137, 137, 137, + 336, 137, 137, 294, 1125, 137, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 998, 148, 138, 137, + 137, 137, 143, 343, 144, 1125, 147, 147, 147, 147, + + 147, 233, 147, 147, 335, 145, 147, 1125, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 1053, 534, + 147, 147, 147, 151, 151, 151, 151, 151, 1125, 151, + 151, 315, 316, 151, 233, 154, 154, 317, 318, 154, + 154, 319, 226, 320, 321, 517, 226, 151, 151, 151, + 201, 388, 263, 390, 201, 195, 143, 387, 144, 154, + 138, 183, 184, 202, 213, 183, 542, 228, 229, 216, + 230, 228, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 154, 138, 155, 154, 259, 410, 154, 154, + 259, 154, 154, 154, 154, 263, 225, 154, 154, 296, + + 297, 298, 296, 296, 296, 296, 296, 296, 296, 492, + 1125, 236, 154, 154, 300, 300, 300, 300, 300, 300, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 300, 300, 300, 300, 619, 1125, 138, 239, 154, 236, + 260, 1125, 240, 236, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 158, 236, 531, 536, 242, 242, + 242, 242, 242, 242, 236, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 236, 833, 247, 242, 242, 242, 242, 242, 242, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + + 1125, 391, 236, 236, 236, 236, 236, 236, 236, 236, + 236, 236, 1125, 500, 500, 500, 236, 236, 236, 236, + 236, 236, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 138, 1125, 1125, 183, 184, 336, 213, 183, + 138, 236, 236, 236, 236, 236, 236, 236, 527, 138, + 520, 236, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 158, 236, 1125, 336, 246, 246, 246, 246, + 246, 246, 247, 247, 247, 247, 248, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 219, + 249, 242, 242, 242, 242, 242, 242, 236, 236, 236, + + 236, 236, 236, 236, 236, 236, 236, 236, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 1125, 1125, + 1125, 547, 247, 247, 247, 247, 247, 247, 526, 344, + 206, 206, 247, 344, 206, 206, 349, 349, 349, 349, + 349, 349, 189, 731, 138, 541, 189, 236, 236, 236, + 236, 236, 236, 271, 206, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 158, 1125, 776, 1125, 273, + 273, 273, 273, 273, 273, 190, 191, 315, 316, 207, + 192, 138, 302, 317, 318, 537, 530, 319, 193, 320, + 1125, 194, 263, 404, 273, 273, 273, 273, 273, 273, + + 262, 218, 1125, 262, 624, 218, 556, 218, 218, 262, + 533, 557, 262, 262, 218, 262, 262, 262, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 158, 218, + 998, 262, 277, 277, 277, 277, 277, 277, 278, 278, + 278, 278, 279, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 263, 278, 273, 273, 273, + 273, 273, 273, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 1125, 138, 138, 819, 278, 278, + 278, 278, 278, 278, 143, 470, 292, 516, 278, 1125, + + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 432, + 433, 1125, 434, 262, 262, 262, 262, 262, 262, 183, + 184, 540, 287, 288, 262, 262, 262, 621, 262, 262, + 466, 467, 262, 468, 263, 231, 231, 231, 231, 138, + 538, 231, 231, 539, 138, 231, 262, 262, 262, 154, + 138, 442, 137, 153, 137, 137, 153, 617, 137, 137, + 231, 231, 153, 345, 346, 347, 345, 345, 345, 345, + 345, 345, 345, 1125, 138, 138, 153, 153, 137, 156, + 549, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 158, 143, 535, 292, 299, 299, 299, 299, 299, + + 299, 183, 184, 933, 213, 183, 234, 234, 234, 234, + 234, 236, 234, 234, 236, 1125, 234, 568, 138, 1125, + 299, 299, 299, 299, 299, 299, 137, 628, 167, 137, + 234, 234, 234, 569, 236, 137, 618, 236, 137, 137, + 808, 137, 137, 137, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 158, 263, 546, 137, 306, 306, + 306, 306, 306, 306, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 138, 167, 299, 299, 299, 299, 299, 299, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 1125, 158, 278, 846, 167, 167, 167, 167, 167, 167, + 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, + 371, 371, 371, 371, 371, 371, 302, 1125, 263, 137, + 137, 137, 137, 137, 137, 206, 587, 404, 137, 205, + 137, 137, 205, 234, 137, 137, 234, 627, 205, 1125, + 518, 575, 234, 154, 518, 234, 576, 154, 234, 234, + 154, 1125, 205, 205, 137, 263, 154, 489, 490, 263, + 491, 633, 236, 522, 234, 589, 1125, 519, 523, 1036, + 154, 154, 349, 349, 349, 349, 349, 349, 349, 349, + + 349, 349, 509, 509, 509, 509, 509, 510, 237, 234, + 154, 524, 263, 154, 625, 524, 154, 154, 1125, 154, + 154, 154, 154, 356, 357, 154, 154, 518, 524, 358, + 359, 518, 524, 360, 1125, 361, 620, 158, 525, 236, + 154, 154, 1125, 630, 367, 368, 369, 367, 367, 367, + 367, 367, 367, 367, 519, 525, 269, 269, 1064, 236, + 269, 269, 236, 629, 138, 239, 154, 240, 588, 348, + 348, 348, 348, 348, 348, 348, 348, 348, 348, 158, + 269, 263, 548, 348, 348, 348, 348, 348, 348, 1125, + 1125, 262, 262, 262, 262, 262, 585, 262, 262, 586, + + 570, 262, 138, 626, 263, 270, 732, 638, 348, 348, + 348, 348, 348, 348, 236, 262, 262, 262, 236, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 158, + 236, 263, 1058, 350, 350, 350, 350, 350, 350, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 635, 249, 348, 348, + 348, 348, 348, 348, 236, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 236, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 1125, 1125, 138, 138, 247, + 247, 247, 247, 247, 247, 1125, 264, 264, 264, 264, + + 264, 623, 264, 264, 722, 391, 264, 392, 392, 392, + 392, 392, 392, 634, 236, 236, 236, 236, 236, 236, + 264, 264, 264, 266, 266, 266, 266, 266, 1125, 266, + 266, 885, 167, 266, 371, 371, 371, 371, 371, 371, + 371, 371, 371, 371, 138, 1125, 138, 266, 266, 266, + 269, 632, 631, 262, 268, 262, 262, 268, 1125, 262, + 262, 302, 636, 268, 371, 371, 371, 371, 371, 371, + 371, 371, 371, 371, 590, 726, 138, 268, 268, 262, + 271, 644, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 158, 504, 302, 138, 370, 370, 370, 370, + + 370, 370, 378, 379, 138, 506, 518, 524, 380, 381, + 518, 524, 382, 138, 383, 642, 1125, 302, 138, 263, + 302, 370, 370, 370, 370, 370, 370, 262, 506, 643, + 262, 404, 302, 519, 525, 236, 262, 661, 236, 262, + 262, 138, 262, 262, 262, 372, 372, 372, 372, 372, + 372, 372, 372, 372, 372, 158, 933, 820, 262, 372, + 372, 372, 372, 372, 372, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 263, 278, 370, 370, 370, 370, 370, 370, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + + 262, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 1125, 143, 1125, 292, 278, 278, 278, 278, 278, + 278, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 447, 721, 448, 448, 448, 448, 448, 448, 859, + 262, 262, 262, 262, 262, 262, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 391, 637, 392, 392, + 392, 392, 392, 392, 392, 392, 392, 392, 447, 1029, + 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, + 683, 206, 263, 641, 666, 206, 236, 686, 206, 236, + 662, 138, 138, 1025, 206, 138, 391, 804, 393, 393, + + 393, 393, 393, 393, 393, 393, 393, 393, 206, 206, + 447, 263, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 447, 263, 450, 450, 450, 450, 450, 451, + 448, 448, 448, 448, 236, 138, 391, 236, 394, 394, + 394, 394, 394, 395, 392, 392, 392, 392, 498, 498, + 499, 500, 500, 500, 500, 500, 500, 500, 401, 138, + 269, 302, 518, 278, 269, 842, 518, 269, 236, 740, + 663, 236, 506, 269, 665, 138, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 158, 269, 269, 519, + 396, 396, 396, 396, 396, 396, 493, 494, 495, 493, + + 493, 493, 493, 493, 493, 493, 610, 610, 610, 610, + 610, 611, 884, 138, 167, 396, 396, 396, 396, 396, + 396, 398, 399, 400, 400, 400, 400, 400, 400, 400, + 400, 401, 1125, 138, 1024, 402, 402, 402, 402, 402, + 402, 409, 409, 409, 409, 409, 409, 409, 409, 409, + 409, 524, 138, 723, 753, 524, 889, 718, 167, 754, + 402, 402, 402, 402, 402, 402, 302, 405, 406, 407, + 405, 405, 405, 405, 405, 405, 405, 408, 525, 685, + 682, 409, 409, 409, 409, 409, 409, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 711, 711, 711, + + 711, 711, 712, 1125, 504, 302, 409, 409, 409, 409, + 409, 409, 137, 263, 263, 137, 506, 167, 1125, 236, + 734, 137, 236, 807, 137, 137, 733, 137, 137, 137, + 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 158, 278, 915, 137, 411, 411, 411, 411, 411, 411, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 138, 167, 396, + 396, 396, 396, 396, 396, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 1125, 1125, 504, 302, + + 167, 167, 167, 167, 167, 167, 1125, 1125, 507, 507, + 507, 507, 507, 507, 507, 507, 507, 507, 739, 727, + 236, 1125, 302, 236, 728, 137, 137, 137, 137, 137, + 137, 452, 452, 452, 452, 452, 452, 452, 452, 452, + 452, 158, 953, 970, 167, 452, 452, 452, 452, 452, + 452, 550, 551, 552, 550, 550, 550, 550, 550, 550, + 550, 719, 724, 764, 684, 719, 724, 970, 765, 138, + 452, 452, 452, 452, 452, 452, 453, 453, 453, 453, + 453, 453, 453, 453, 453, 453, 745, 167, 720, 725, + 453, 453, 453, 453, 453, 453, 447, 263, 448, 448, + + 448, 448, 448, 448, 448, 448, 448, 448, 811, 236, + 504, 302, 236, 167, 302, 452, 452, 452, 452, 452, + 452, 470, 607, 471, 471, 471, 471, 471, 471, 471, + 471, 471, 471, 447, 859, 448, 448, 448, 448, 448, + 448, 448, 448, 448, 448, 571, 572, 573, 571, 571, + 571, 571, 571, 571, 571, 236, 954, 167, 236, 138, + 263, 470, 302, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 506, 470, 899, 471, 471, 471, 471, + 471, 471, 263, 596, 596, 596, 596, 596, 596, 596, + 596, 596, 596, 401, 167, 143, 843, 292, 809, 778, + + 263, 470, 278, 473, 473, 473, 473, 473, 474, 471, + 471, 471, 471, 263, 601, 602, 603, 601, 601, 601, + 601, 601, 601, 601, 515, 515, 515, 515, 515, 515, + 515, 515, 515, 515, 236, 167, 924, 236, 138, 138, + 263, 262, 813, 475, 475, 475, 475, 475, 475, 475, + 475, 475, 475, 743, 985, 815, 821, 475, 475, 475, + 475, 475, 475, 504, 302, 605, 605, 605, 605, 605, + 605, 138, 729, 735, 737, 506, 729, 735, 737, 757, + 769, 744, 475, 475, 475, 475, 475, 475, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 978, 730, + + 736, 738, 476, 476, 476, 476, 476, 476, 609, 609, + 609, 609, 609, 609, 609, 609, 609, 609, 138, 590, + 977, 591, 591, 591, 591, 591, 591, 475, 475, 475, + 475, 475, 475, 391, 776, 392, 392, 392, 392, 392, + 392, 392, 392, 392, 392, 1125, 778, 608, 608, 608, + 608, 608, 608, 608, 608, 608, 608, 645, 138, 646, + 646, 646, 646, 646, 646, 646, 646, 646, 646, 143, + 841, 292, 138, 391, 278, 392, 392, 392, 392, 392, + 392, 392, 392, 392, 392, 645, 976, 647, 647, 647, + 647, 647, 647, 647, 647, 647, 647, 645, 302, 648, + + 648, 648, 648, 648, 649, 646, 646, 646, 646, 607, + 832, 845, 138, 504, 302, 505, 505, 505, 505, 505, + 505, 505, 505, 505, 505, 506, 278, 247, 818, 507, + 507, 507, 507, 507, 507, 687, 688, 689, 687, 687, + 687, 687, 687, 687, 687, 645, 167, 646, 646, 646, + 646, 646, 646, 814, 507, 507, 507, 507, 507, 507, + 302, 511, 512, 513, 511, 511, 511, 511, 511, 511, + 511, 514, 138, 278, 986, 515, 515, 515, 515, 515, + 515, 699, 138, 700, 700, 700, 700, 700, 700, 700, + 700, 700, 700, 719, 263, 1125, 302, 719, 138, 167, + + 515, 515, 515, 515, 515, 515, 137, 607, 746, 137, + 812, 847, 138, 916, 956, 137, 278, 882, 137, 137, + 720, 137, 137, 137, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 158, 504, 302, 137, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 138, 167, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, + 950, 263, 167, 167, 553, 553, 553, 553, 553, 553, + + 699, 768, 701, 701, 701, 701, 701, 701, 701, 701, + 701, 701, 781, 781, 781, 781, 781, 782, 869, 553, + 553, 553, 553, 553, 553, 554, 554, 554, 554, 554, + 554, 554, 554, 554, 554, 987, 167, 778, 278, 554, + 554, 554, 554, 554, 554, 699, 806, 702, 702, 702, + 702, 702, 703, 700, 700, 700, 700, 798, 798, 798, + 798, 798, 799, 693, 553, 553, 553, 553, 553, 553, + 236, 236, 566, 236, 236, 567, 236, 236, 236, 236, + 1125, 1015, 263, 167, 236, 236, 236, 236, 236, 236, + 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, + + 699, 894, 700, 700, 700, 700, 700, 700, 917, 236, + 236, 236, 236, 236, 236, 470, 167, 471, 471, 471, + 471, 471, 471, 471, 471, 471, 471, 504, 302, 706, + 706, 706, 706, 706, 706, 1016, 167, 138, 1125, 607, + 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, + 778, 888, 1012, 835, 263, 470, 167, 471, 471, 471, + 471, 471, 471, 471, 471, 471, 471, 1125, 909, 709, + 709, 709, 709, 709, 709, 709, 709, 709, 709, 747, + 748, 749, 747, 747, 747, 747, 747, 747, 747, 897, + 143, 263, 292, 897, 263, 590, 776, 591, 591, 591, + + 591, 591, 591, 591, 591, 591, 591, 645, 778, 646, + 646, 646, 646, 646, 646, 646, 646, 646, 646, 645, + 302, 646, 646, 646, 646, 646, 646, 646, 646, 646, + 646, 607, 724, 908, 138, 590, 724, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 167, 898, 729, + 504, 302, 959, 729, 960, 907, 1017, 810, 960, 725, + 735, 737, 607, 719, 735, 737, 666, 719, 667, 667, + 667, 667, 667, 667, 138, 590, 730, 593, 593, 593, + 593, 593, 594, 591, 591, 591, 591, 736, 738, 776, + 720, 758, 759, 760, 758, 758, 758, 758, 758, 758, + + 758, 859, 724, 729, 906, 263, 724, 729, 862, 862, + 862, 862, 862, 863, 138, 504, 302, 605, 605, 605, + 605, 605, 605, 605, 605, 605, 605, 506, 263, 725, + 730, 604, 604, 604, 604, 604, 604, 698, 698, 698, + 698, 698, 698, 698, 698, 698, 698, 822, 735, 737, + 719, 138, 735, 737, 719, 896, 604, 604, 604, 604, + 604, 604, 504, 302, 606, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 607, 736, 738, 720, 608, 608, + 608, 608, 608, 608, 780, 780, 780, 780, 780, 780, + 780, 780, 780, 780, 724, 729, 735, 955, 724, 729, + + 735, 895, 167, 608, 608, 608, 608, 608, 608, 302, + 612, 613, 614, 612, 612, 612, 612, 612, 612, 612, + 615, 725, 730, 736, 616, 616, 616, 616, 616, 616, + 1125, 302, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 779, 708, 138, 504, 302, 278, 1030, 167, 616, + 616, 616, 616, 616, 616, 666, 708, 667, 667, 667, + 667, 667, 667, 667, 667, 667, 667, 788, 789, 790, + 788, 788, 788, 788, 788, 788, 788, 699, 1125, 700, + 700, 700, 700, 700, 700, 700, 700, 700, 700, 1051, + 859, 167, 918, 693, 263, 666, 502, 668, 668, 668, + + 668, 668, 668, 668, 668, 668, 668, 699, 900, 700, + 700, 700, 700, 700, 700, 700, 700, 700, 700, 717, + 717, 717, 717, 717, 717, 717, 717, 717, 717, 844, + 900, 138, 900, 901, 263, 666, 834, 669, 669, 669, + 669, 669, 670, 667, 667, 667, 667, 1125, 302, 504, + 302, 793, 793, 793, 793, 793, 793, 138, 1078, 708, + 1079, 708, 797, 797, 797, 797, 797, 797, 797, 797, + 797, 797, 737, 918, 263, 590, 737, 591, 591, 591, + 591, 591, 591, 591, 591, 591, 591, 1125, 831, 796, + 796, 796, 796, 796, 796, 796, 796, 796, 796, 738, + + 822, 823, 823, 823, 823, 823, 823, 823, 823, 823, + 823, 1096, 138, 1079, 138, 590, 830, 591, 591, 591, + 591, 591, 591, 591, 591, 591, 591, 822, 824, 824, + 824, 824, 824, 824, 824, 824, 824, 824, 822, 825, + 825, 825, 825, 825, 826, 823, 823, 823, 823, 958, + 959, 828, 960, 958, 138, 694, 695, 696, 694, 694, + 694, 694, 694, 694, 694, 697, 217, 217, 217, 698, + 698, 698, 698, 698, 698, 979, 848, 849, 850, 851, + 848, 848, 848, 848, 848, 848, 769, 770, 770, 770, + 770, 770, 770, 827, 698, 698, 698, 698, 698, 698, + + 504, 302, 706, 706, 706, 706, 706, 706, 706, 706, + 706, 706, 607, 138, 263, 817, 705, 705, 705, 705, + 705, 705, 979, 816, 138, 853, 854, 855, 853, 853, + 853, 853, 853, 853, 853, 880, 880, 880, 880, 880, + 881, 705, 705, 705, 705, 705, 705, 504, 302, 707, + 707, 707, 707, 707, 707, 707, 707, 707, 707, 708, + 143, 263, 292, 709, 709, 709, 709, 709, 709, 787, + 787, 787, 787, 787, 787, 787, 787, 787, 787, 890, + 892, 886, 167, 890, 892, 886, 1031, 699, 709, 709, + 709, 709, 709, 709, 302, 713, 714, 715, 713, 713, + + 713, 713, 713, 713, 713, 716, 891, 893, 887, 717, + 717, 717, 717, 717, 717, 776, 138, 857, 857, 857, + 857, 857, 857, 961, 693, 138, 949, 778, 502, 504, + 302, 167, 401, 263, 717, 717, 717, 717, 717, 717, + 666, 708, 667, 667, 667, 667, 667, 667, 667, 667, + 667, 667, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 1125, 302, 860, 860, 860, 860, 860, 860, + 860, 860, 860, 860, 708, 1072, 1072, 1072, 1072, 263, + 666, 776, 667, 667, 667, 667, 667, 667, 667, 667, + 667, 667, 869, 859, 870, 870, 870, 870, 870, 870, + + 870, 870, 870, 870, 869, 302, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 795, 1059, 1086, 263, + 769, 770, 770, 770, 770, 770, 770, 770, 770, 770, + 770, 869, 263, 872, 872, 872, 872, 872, 873, 870, + 870, 870, 870, 504, 302, 803, 803, 803, 803, 803, + 803, 803, 803, 803, 803, 795, 263, 138, 138, 769, + 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 1125, 302, 504, 302, 876, 876, 876, 876, 876, 876, + 263, 263, 795, 776, 795, 879, 879, 879, 879, 879, + 879, 879, 879, 879, 879, 933, 767, 138, 769, 772, + + 772, 772, 772, 772, 773, 770, 770, 770, 770, 1125, + 1125, 878, 878, 878, 878, 878, 878, 878, 878, 878, + 878, 766, 933, 890, 892, 763, 776, 890, 892, 822, + 823, 823, 823, 823, 823, 823, 138, 776, 933, 777, + 777, 777, 777, 777, 777, 777, 777, 777, 777, 778, + 891, 893, 762, 779, 779, 779, 779, 779, 779, 902, + 903, 904, 905, 902, 902, 902, 902, 902, 902, 163, + 163, 163, 163, 167, 167, 163, 761, 163, 779, 779, + 779, 779, 779, 779, 783, 784, 785, 783, 783, 783, + 783, 783, 783, 783, 786, 217, 217, 217, 787, 787, + + 787, 787, 787, 787, 822, 823, 823, 823, 823, 823, + 823, 823, 823, 823, 823, 886, 890, 892, 756, 886, + 890, 892, 755, 787, 787, 787, 787, 787, 787, 504, + 302, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 708, 887, 891, 893, 792, 792, 792, 792, 792, + 792, 822, 823, 823, 823, 823, 823, 823, 823, 823, + 823, 823, 886, 278, 278, 278, 886, 752, 751, 750, + 792, 792, 792, 792, 792, 792, 504, 302, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 795, 887, + 645, 742, 796, 796, 796, 796, 796, 796, 910, 911, + + 912, 913, 910, 910, 910, 910, 910, 910, 835, 836, + 836, 836, 836, 836, 836, 741, 138, 796, 796, 796, + 796, 796, 796, 302, 800, 801, 802, 800, 800, 800, + 800, 800, 800, 800, 1102, 263, 138, 138, 803, 803, + 803, 803, 803, 803, 138, 924, 263, 925, 925, 925, + 925, 925, 925, 925, 925, 925, 925, 936, 936, 936, + 936, 936, 937, 803, 803, 803, 803, 803, 803, 137, + 890, 892, 137, 263, 890, 892, 958, 959, 137, 960, + 958, 137, 137, 1125, 137, 137, 137, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 891, 893, 693, + + 137, 167, 167, 167, 167, 167, 167, 167, 167, 805, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 138, 167, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 236, 502, 401, 776, 236, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 998, 236, + 401, 681, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 829, 247, 247, 680, 249, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + + 236, 236, 236, 236, 835, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 924, 679, 926, 926, 926, + 926, 926, 926, 926, 926, 926, 926, 924, 302, 927, + 927, 927, 927, 927, 928, 925, 925, 925, 925, 795, + 678, 677, 263, 835, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 776, 1125, 931, 931, 931, 931, + 931, 931, 301, 301, 397, 397, 859, 998, 301, 676, + 397, 263, 835, 838, 838, 838, 838, 838, 839, 836, + 836, 836, 836, 935, 935, 935, 935, 935, 935, 935, + + 935, 935, 935, 1125, 900, 934, 934, 934, 934, 934, + 934, 934, 934, 934, 934, 504, 302, 496, 496, 776, + 263, 262, 675, 496, 262, 674, 900, 795, 900, 900, + 262, 998, 673, 262, 262, 672, 262, 262, 262, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 143, + 671, 292, 262, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 840, 278, 278, 278, 278, 263, 278, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 769, 770, 770, 770, 770, + + 770, 770, 770, 770, 770, 770, 943, 944, 945, 943, + 943, 943, 943, 943, 943, 943, 869, 1018, 870, 870, + 870, 870, 870, 870, 870, 870, 870, 870, 1052, 143, + 660, 292, 1052, 138, 769, 770, 770, 770, 770, 770, + 770, 770, 770, 770, 770, 869, 659, 870, 870, 870, + 870, 870, 870, 870, 870, 870, 870, 869, 658, 870, + 870, 870, 870, 870, 870, 1001, 1001, 1001, 1001, 1001, + 1002, 657, 138, 776, 656, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 778, 776, 655, 858, 858, + 858, 858, 858, 858, 858, 858, 858, 858, 859, 654, + + 653, 652, 860, 860, 860, 860, 860, 860, 504, 302, + 948, 948, 948, 948, 948, 948, 651, 951, 951, 951, + 1095, 951, 951, 951, 650, 1125, 1095, 860, 860, 860, + 860, 860, 860, 864, 865, 866, 864, 864, 864, 864, + 864, 864, 864, 867, 952, 952, 952, 868, 868, 868, + 868, 868, 868, 963, 1125, 497, 497, 963, 964, 965, + 966, 497, 1077, 1078, 963, 1079, 1077, 167, 963, 964, + 965, 966, 868, 868, 868, 868, 868, 868, 504, 302, + 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, + 795, 436, 640, 639, 875, 875, 875, 875, 875, 875, + + 1047, 1047, 1047, 1047, 1047, 1048, 970, 967, 971, 971, + 971, 971, 971, 971, 971, 971, 971, 971, 969, 875, + 875, 875, 875, 875, 875, 504, 302, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 1125, 599, 502, + 401, 878, 878, 878, 878, 878, 878, 970, 595, 972, + 972, 972, 972, 972, 972, 972, 972, 972, 972, 302, + 1007, 1007, 1007, 1007, 1007, 1007, 878, 878, 878, 878, + 878, 878, 137, 1125, 249, 137, 962, 249, 401, 249, + 164, 137, 962, 962, 137, 137, 962, 137, 137, 137, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + + 962, 962, 962, 137, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 883, 167, 167, 167, 138, 167, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 886, 584, 583, 924, + 886, 925, 925, 925, 925, 925, 925, 582, 236, 581, + 580, 579, 236, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 887, 236, 578, 577, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + + 574, 249, 236, 236, 236, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 835, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 970, 158, 973, 973, 973, 973, 973, 974, 975, 975, + 975, 975, 970, 565, 975, 975, 975, 971, 971, 971, + 971, 971, 971, 971, 564, 563, 562, 263, 835, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 918, + 561, 919, 919, 919, 919, 919, 919, 951, 560, 559, + 558, 951, 991, 992, 993, 991, 991, 991, 991, 991, + 991, 991, 501, 501, 1011, 1011, 263, 262, 501, 1013, + + 262, 1011, 249, 1013, 952, 249, 262, 249, 138, 262, + 262, 555, 262, 262, 262, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 1014, 447, 262, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 914, 278, 278, 278, + 278, 278, 263, 278, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 918, 436, 919, 919, 919, 919, 919, 919, 919, + 919, 919, 919, 545, 436, 544, 988, 989, 990, 988, + 988, 988, 988, 988, 988, 988, 924, 436, 925, 925, + + 925, 925, 925, 925, 925, 925, 925, 925, 543, 1125, + 138, 918, 1125, 920, 920, 920, 920, 920, 920, 920, + 920, 920, 920, 138, 924, 401, 925, 925, 925, 925, + 925, 925, 925, 925, 925, 925, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 595, 595, 502, 401, + 138, 918, 595, 921, 921, 921, 921, 921, 922, 923, + 923, 923, 923, 776, 164, 996, 996, 996, 996, 996, + 996, 488, 487, 486, 485, 933, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 597, 597, 484, 483, + 138, 918, 597, 923, 923, 923, 919, 919, 919, 919, + + 919, 919, 919, 1125, 482, 999, 999, 999, 999, 999, + 999, 999, 999, 999, 999, 302, 1007, 1007, 1007, 1007, + 1007, 1007, 1007, 1007, 1007, 1007, 598, 598, 481, 480, + 138, 776, 598, 931, 931, 931, 931, 931, 931, 931, + 931, 931, 931, 859, 776, 479, 932, 932, 932, 932, + 932, 932, 932, 932, 932, 932, 933, 478, 477, 271, + 934, 934, 934, 934, 934, 934, 302, 1008, 1008, 1008, + 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1013, 469, 1077, + 1078, 1013, 1079, 1077, 465, 934, 934, 934, 934, 934, + 934, 938, 939, 940, 938, 938, 938, 938, 938, 938, + + 938, 941, 464, 463, 1014, 942, 942, 942, 942, 942, + 942, 302, 1009, 1009, 1009, 1009, 1009, 1010, 1007, 1007, + 1007, 1007, 1013, 690, 690, 462, 1013, 167, 461, 690, + 942, 942, 942, 942, 942, 942, 504, 302, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, 979, 1014, + 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, + 1125, 1072, 460, 1072, 1125, 1125, 1125, 1125, 963, 1072, + 278, 459, 963, 964, 965, 966, 1021, 1022, 1023, 1021, + 1021, 1021, 1021, 1021, 1021, 1021, 458, 263, 979, 457, + 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, + + 1125, 456, 691, 691, 1125, 964, 965, 966, 691, 455, + 454, 1125, 240, 444, 967, 1125, 1125, 1125, 966, 692, + 692, 441, 967, 774, 774, 692, 440, 263, 979, 774, + 982, 982, 982, 982, 982, 983, 984, 984, 984, 984, + 1019, 439, 438, 1020, 1020, 1020, 1020, 1020, 1020, 1020, + 1020, 1020, 1020, 431, 967, 1125, 430, 775, 775, 1125, + 1125, 1125, 1125, 775, 429, 967, 428, 263, 979, 427, + 984, 984, 984, 980, 980, 980, 980, 980, 980, 980, + 970, 426, 971, 971, 971, 971, 971, 971, 971, 971, + 971, 971, 423, 1125, 422, 249, 968, 1013, 249, 421, + + 249, 1013, 968, 968, 420, 419, 968, 263, 918, 969, + 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, + 968, 968, 968, 970, 1014, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 970, 418, 971, 971, 971, + 971, 971, 971, 852, 852, 417, 416, 138, 918, 852, + 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, + 415, 414, 413, 412, 164, 1026, 1027, 1028, 1026, 1026, + 1026, 1026, 1026, 1026, 1026, 979, 156, 980, 980, 980, + 980, 980, 980, 929, 929, 385, 384, 138, 776, 929, + 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, + + 933, 776, 263, 997, 997, 997, 997, 997, 997, 997, + 997, 997, 997, 998, 263, 377, 376, 999, 999, 999, + 999, 999, 999, 1036, 375, 1037, 1037, 1037, 1037, 1037, + 1037, 1037, 1037, 1037, 1037, 1091, 1091, 1091, 1091, 1091, + 1091, 374, 999, 999, 999, 999, 999, 999, 1003, 1004, + 1005, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 373, 262, + 366, 267, 1006, 1006, 1006, 1006, 1006, 1006, 1036, 265, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, + 1119, 1119, 1119, 1119, 1119, 1119, 263, 1006, 1006, 1006, + 1006, 1006, 1006, 979, 260, 980, 980, 980, 980, 980, + + 980, 980, 980, 980, 980, 1036, 365, 1039, 1039, 1039, + 1039, 1039, 1040, 1037, 1037, 1037, 1037, 1006, 1006, 1006, + 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1049, 994, 994, + 364, 1049, 263, 979, 994, 980, 980, 980, 980, 980, + 980, 980, 980, 980, 980, 776, 363, 1043, 1043, 1043, + 1043, 1043, 1043, 362, 1050, 355, 354, 998, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1041, 1041, + 353, 352, 263, 1031, 1041, 1032, 1032, 1032, 1032, 1032, + 1032, 1032, 1032, 1032, 1032, 1125, 351, 1045, 1045, 1045, + 1045, 1045, 1045, 1045, 1045, 1045, 1045, 302, 1007, 1007, + + 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1125, 237, + 1049, 229, 138, 1031, 1049, 1033, 1033, 1033, 1033, 1033, + 1033, 1033, 1033, 1033, 1033, 302, 1007, 1007, 1007, 1007, + 1007, 1007, 1007, 1007, 1007, 1007, 224, 1050, 1049, 225, + 219, 1036, 1049, 1037, 1037, 1037, 1037, 1037, 1037, 219, + 184, 211, 138, 1031, 342, 1034, 1034, 1034, 1034, 1034, + 1035, 1032, 1032, 1032, 1032, 1050, 1020, 1020, 1020, 1020, + 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, + 1020, 1020, 1020, 1020, 1020, 1020, 249, 334, 167, 249, + 333, 249, 138, 776, 332, 1043, 1043, 1043, 1043, 1043, + + 1043, 1043, 1043, 1043, 1043, 998, 776, 331, 1044, 1044, + 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 330, 327, + 326, 325, 1045, 1045, 1045, 1045, 1045, 1045, 1053, 324, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 323, 1116, 1116, 1116, 1116, 1116, 1116, 1045, 1045, 1045, + 1045, 1045, 1045, 1053, 322, 1055, 1055, 1055, 1055, 1055, + 1055, 1055, 1055, 1055, 1055, 1053, 314, 1056, 1056, 1056, + 1056, 1056, 1057, 1054, 1054, 1054, 1054, 1059, 138, 1060, + 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 313, + 312, 1049, 311, 310, 309, 1049, 1065, 1066, 1067, 1065, + + 1065, 1065, 1065, 1065, 1065, 1065, 1031, 308, 1032, 1032, + 1032, 1032, 1032, 1032, 307, 164, 263, 1059, 1050, 1061, + 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 137, + 164, 1074, 239, 138, 152, 1074, 1071, 1071, 150, 278, + 143, 141, 1071, 138, 286, 138, 1068, 1069, 1070, 1068, + 1068, 1068, 1068, 1068, 1068, 1068, 263, 1059, 1075, 1062, + 1062, 1062, 1062, 1062, 1063, 1060, 1060, 1060, 1060, 1036, + 285, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, + 1037, 1036, 284, 1037, 1037, 1037, 1037, 1037, 1037, 1037, + 1037, 1037, 1037, 283, 1074, 282, 263, 1031, 1074, 1032, + + 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 776, + 278, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1075, 1074, 267, 263, 1053, 1074, 1054, 1054, 1054, + 1054, 1054, 1054, 260, 256, 255, 138, 1031, 254, 1032, + 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1075, + 1080, 1081, 1082, 1080, 1080, 1080, 1080, 1080, 1080, 1080, + 1053, 253, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 167, 252, 247, 1053, 138, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1083, 1084, 1085, + 1083, 1083, 1083, 1083, 1083, 1083, 1083, 225, 1059, 219, + + 1060, 1060, 1060, 1060, 1060, 1060, 211, 140, 177, 208, + 174, 1074, 200, 198, 1097, 1074, 1098, 1098, 1098, 1098, + 1098, 1098, 180, 179, 263, 1059, 176, 1060, 1060, 1060, + 1060, 1060, 1060, 1060, 1060, 1060, 1060, 263, 1075, 1091, + 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1092, + 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 278, + 175, 167, 164, 152, 263, 1059, 141, 1060, 1060, 1060, + 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1093, 1093, 1093, + 1093, 1093, 1094, 1091, 1091, 1091, 1091, 1097, 140, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 138, + + 1125, 1125, 1125, 1125, 263, 1086, 1125, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1097, 1125, 1099, + 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1097, + 1125, 1100, 1100, 1100, 1100, 1100, 1101, 1098, 1098, 1098, + 1098, 1125, 1125, 1125, 138, 1086, 1125, 1088, 1088, 1088, + 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1125, 1125, 1125, + 1107, 1108, 1109, 1107, 1107, 1107, 1107, 1107, 1107, 1107, + 1086, 1125, 1087, 1087, 1087, 1087, 1087, 1087, 1125, 1125, + 1125, 1125, 1125, 1125, 138, 1086, 1125, 1089, 1089, 1089, + 1089, 1089, 1090, 1087, 1087, 1087, 1087, 138, 1091, 1091, + + 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1125, 138, + 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, + 1125, 1125, 1125, 1125, 138, 1102, 1125, 1103, 1103, 1103, + 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1110, 1111, 1112, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1097, 1125, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1125, + 1125, 1125, 1125, 1125, 263, 1102, 1125, 1104, 1104, 1104, + 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1097, 1125, 1098, + 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1113, + 1114, 1115, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1125, + + 1125, 1125, 1125, 1125, 263, 1102, 1125, 1105, 1105, 1105, + 1105, 1105, 1106, 1103, 1103, 1103, 1103, 1125, 1102, 1125, + 1103, 1103, 1103, 1103, 1103, 1103, 263, 1116, 1116, 1116, + 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1125, 1122, 1122, + 1122, 1122, 1122, 1122, 263, 1086, 1125, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 263, 1125, 1125, + 1125, 1125, 1125, 1125, 138, 1107, 1107, 1107, 1107, 1107, + 1107, 1107, 1107, 1107, 1107, 263, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 138, 1086, 1125, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1125, 1125, 1125, + + 1125, 1125, 138, 1117, 1117, 1117, 1117, 1117, 1118, 1116, + 1116, 1116, 1116, 1119, 1119, 1119, 1119, 1119, 1119, 1119, + 1119, 1119, 1119, 1125, 138, 1102, 1125, 1103, 1103, 1103, + 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1125, 1125, 1125, + 138, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1120, 1120, 1120, 1120, 1120, 1121, 1119, 1119, 1119, + 1119, 1125, 1125, 1125, 263, 1102, 1125, 1103, 1103, 1103, + 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1122, 1122, 1122, + 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1113, 1113, 1113, + 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1125, 1125, 1125, + + 1125, 1125, 1125, 1125, 263, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 263, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 263, 1123, 1123, 1123, 1123, 1123, + 1124, 1122, 1122, 1122, 1122, 1116, 1116, 1116, 1116, 1116, + 1116, 1116, 1116, 1116, 1116, 1119, 1119, 1119, 1119, 1119, + 1119, 1119, 1119, 1119, 1119, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 263, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 138, 1122, 1122, 1122, 1122, 1122, 1122, 1122, + 1122, 1122, 1122, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 263, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 113, 113, 113, 113, 113, 113, 113, 113, 113, + + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 137, 1125, 1125, 137, 1125, 1125, 1125, 1125, 137, + 1125, 137, 137, 137, 1125, 1125, 137, 137, 137, 137, + 137, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 147, 1125, 1125, 147, 1125, 1125, 147, 1125, 147, + 1125, 147, 147, 147, 147, 1125, 147, 147, 147, 147, + 147, 151, 1125, 1125, 151, 1125, 1125, 1125, 1125, 151, + 1125, 151, 151, 151, 1125, 1125, 151, 151, 151, 151, + 151, 153, 1125, 1125, 153, 153, 153, 1125, 153, 153, + + 1125, 153, 153, 153, 1125, 1125, 153, 153, 153, 153, + 153, 205, 1125, 1125, 205, 205, 205, 1125, 205, 205, + 1125, 205, 205, 205, 1125, 1125, 205, 205, 205, 205, + 205, 210, 1125, 1125, 210, 210, 210, 1125, 210, 210, + 1125, 210, 210, 210, 1125, 210, 210, 1125, 210, 210, + 210, 218, 1125, 1125, 218, 218, 1125, 1125, 218, 218, + 1125, 218, 218, 218, 218, 1125, 218, 218, 218, 218, + 218, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 224, 224, 1125, 224, 224, 1125, 224, 224, 224, + + 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, + 224, 231, 1125, 1125, 231, 1125, 1125, 231, 1125, 231, + 1125, 231, 231, 231, 231, 1125, 231, 231, 231, 231, + 231, 235, 1125, 1125, 235, 1125, 1125, 1125, 1125, 235, + 1125, 235, 235, 235, 1125, 235, 235, 235, 235, 235, + 235, 238, 1125, 1125, 238, 238, 238, 1125, 238, 238, + 1125, 238, 238, 238, 1125, 238, 238, 238, 238, 238, + 238, 259, 1125, 1125, 1125, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 262, 1125, 1125, 262, 1125, 1125, 1125, 1125, 262, + + 1125, 262, 262, 262, 1125, 1125, 262, 262, 262, 262, + 262, 264, 1125, 1125, 264, 1125, 1125, 264, 1125, 264, + 1125, 264, 264, 264, 264, 1125, 264, 264, 264, 264, + 264, 266, 1125, 1125, 266, 1125, 1125, 1125, 1125, 266, + 1125, 266, 266, 266, 1125, 1125, 266, 266, 266, 266, + 266, 268, 1125, 1125, 268, 268, 268, 1125, 268, 268, + 1125, 268, 268, 268, 1125, 1125, 268, 268, 268, 268, + 268, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 293, 293, 1125, 293, 293, 293, 293, 293, 293, + + 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, + 293, 147, 1125, 1125, 147, 1125, 1125, 1125, 1125, 147, + 1125, 147, 147, 147, 1125, 1125, 147, 147, 147, 147, + 147, 151, 1125, 1125, 151, 1125, 1125, 1125, 1125, 151, + 1125, 151, 151, 151, 1125, 1125, 151, 151, 151, 151, + 151, 153, 1125, 1125, 153, 153, 153, 1125, 153, 153, + 1125, 153, 153, 153, 1125, 1125, 153, 153, 153, 153, + 153, 154, 1125, 1125, 154, 154, 154, 1125, 154, 154, + 1125, 154, 154, 154, 1125, 1125, 154, 154, 154, 154, + 154, 303, 303, 303, 1125, 1125, 1125, 1125, 303, 205, + + 1125, 1125, 205, 205, 205, 1125, 205, 205, 1125, 205, + 205, 205, 1125, 1125, 205, 205, 205, 205, 205, 206, + 1125, 1125, 206, 206, 206, 1125, 206, 206, 1125, 206, + 206, 206, 1125, 1125, 206, 206, 206, 206, 206, 210, + 1125, 1125, 210, 210, 210, 1125, 210, 210, 1125, 210, + 210, 210, 1125, 210, 210, 1125, 210, 210, 210, 218, + 1125, 1125, 218, 218, 1125, 1125, 218, 218, 1125, 218, + 218, 218, 218, 1125, 218, 218, 218, 218, 218, 224, + 224, 1125, 224, 224, 1125, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, 224, 234, + + 1125, 1125, 234, 1125, 1125, 1125, 1125, 234, 1125, 234, + 234, 234, 1125, 1125, 234, 234, 234, 234, 234, 235, + 1125, 1125, 235, 1125, 1125, 1125, 1125, 235, 1125, 235, + 235, 235, 1125, 235, 235, 235, 235, 235, 235, 236, + 1125, 1125, 236, 236, 1125, 236, 236, 1125, 1125, 236, + 236, 238, 1125, 1125, 238, 238, 238, 1125, 238, 238, + 1125, 238, 238, 238, 1125, 238, 238, 238, 238, 238, + 238, 259, 1125, 1125, 1125, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 262, 1125, 1125, 262, 1125, 1125, 1125, 1125, 262, + + 1125, 262, 262, 262, 1125, 1125, 262, 262, 262, 262, + 262, 264, 1125, 1125, 264, 1125, 1125, 1125, 1125, 264, + 1125, 264, 264, 264, 1125, 1125, 264, 264, 264, 264, + 264, 266, 1125, 1125, 266, 1125, 1125, 1125, 1125, 266, + 1125, 266, 266, 266, 1125, 1125, 266, 266, 266, 266, + 266, 268, 1125, 1125, 268, 268, 268, 1125, 268, 268, + 1125, 268, 268, 268, 1125, 1125, 268, 268, 268, 268, + 268, 269, 1125, 1125, 269, 269, 269, 1125, 269, 269, + 1125, 269, 269, 269, 1125, 1125, 269, 269, 269, 269, + 269, 291, 291, 291, 291, 291, 291, 291, 291, 291, + + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 403, 403, 403, 1125, 1125, 1125, 1125, 403, 503, + 503, 503, 1125, 1125, 1125, 1125, 503, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 600, 600, 600, + 1125, 1125, 1125, 1125, 600, 604, 604, 604, 604, 1125, + 1125, 1125, 1125, 604, 704, 704, 704, 1125, 1125, 1125, + 1125, 704, 705, 705, 705, 705, 1125, 1125, 1125, 1125, + + 705, 791, 791, 791, 1125, 1125, 1125, 1125, 791, 792, + 792, 792, 792, 1125, 1125, 1125, 1125, 792, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 236, 1125, + 1125, 236, 236, 1125, 236, 236, 1125, 1125, 236, 236, + 856, 1125, 856, 856, 1125, 1125, 1125, 1125, 856, 874, + 874, 874, 1125, 1125, 1125, 1125, 874, 875, 875, 875, + 875, 1125, 1125, 1125, 1125, 875, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 236, 1125, 1125, 236, + + 236, 1125, 236, 236, 1125, 1125, 236, 236, 262, 1125, + 1125, 262, 1125, 1125, 1125, 1125, 262, 1125, 262, 262, + 262, 1125, 1125, 262, 262, 262, 262, 262, 930, 1125, + 930, 930, 1125, 1125, 1125, 1125, 930, 946, 946, 946, + 1125, 1125, 1125, 1125, 946, 947, 947, 947, 1125, 1125, + 1125, 1125, 1125, 947, 957, 957, 957, 957, 957, 957, + 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, + 957, 957, 957, 957, 962, 962, 1125, 962, 962, 962, + 962, 1125, 962, 1125, 962, 962, 962, 1125, 1125, 962, + 962, 962, 962, 962, 968, 968, 1125, 968, 968, 968, + + 968, 1125, 968, 1125, 968, 968, 968, 1125, 1125, 968, + 968, 968, 968, 968, 995, 1125, 995, 995, 1125, 1125, + 1125, 1125, 995, 1042, 1125, 1042, 1042, 1125, 1125, 1125, + 1125, 1042, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, + 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, + 1076, 1076, 19, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125 + } ; + +static yyconst flex_int16_t yy_chk[8328] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 21, 49, 43, 2, 21, + 27, 2, 5, 5, 39, 5, 5, 5, 43, 5, + 52, 49, 46, 42, 39, 5, 42, 46, 6, 6, + + 27, 6, 6, 6, 52, 6, 42, 2, 2, 5, + 5, 6, 2, 35, 35, 35, 35, 35, 35, 44, + 2, 61, 44, 2, 3, 6, 6, 27, 3, 11, + 11, 3, 11, 11, 11, 11, 5, 3, 12, 12, + 3, 12, 12, 12, 12, 83, 65, 59, 103, 61, + 65, 103, 6, 127, 3, 165, 127, 3, 15, 15, + 15, 15, 15, 15, 15, 3, 59, 3, 165, 3, + 3, 83, 3, 16, 16, 16, 16, 16, 16, 16, + 32, 32, 55, 11, 32, 32, 185, 70, 90, 1122, + 102, 55, 12, 63, 3, 4, 70, 63, 85, 4, + + 55, 102, 4, 89, 32, 70, 63, 89, 4, 329, + 197, 4, 15, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 329, 85, 4, 56, 16, 4, 32, + 56, 79, 79, 114, 79, 79, 4, 90, 4, 185, + 4, 4, 54, 4, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 93, 58, 197, 89, 58, 56, + 56, 142, 198, 142, 56, 4, 7, 7, 58, 7, + 7, 7, 56, 7, 93, 56, 87, 87, 198, 87, + 87, 64, 114, 58, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 92, 92, 569, 92, 92, 569, + + 92, 93, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 98, 98, 98, 98, 98, 98, 321, 321, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, + 8, 118, 8, 8, 8, 110, 8, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 126, 112, 139, + 164, 118, 187, 139, 187, 66, 66, 112, 126, 66, + 66, 164, 227, 116, 116, 1116, 116, 116, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 118, 66, + 336, 336, 287, 8, 8, 8, 8, 8, 8, 8, + + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 9, 9, 66, 9, 9, 9, 9, 9, + 289, 227, 289, 199, 9, 9, 9, 116, 77, 77, + 330, 77, 77, 77, 94, 77, 199, 94, 330, 77, + 9, 77, 136, 94, 149, 287, 94, 188, 343, 94, + 94, 136, 188, 120, 120, 77, 77, 120, 120, 291, + 136, 291, 343, 94, 149, 94, 9, 10, 10, 200, + 10, 10, 10, 10, 10, 200, 292, 120, 292, 10, + 10, 10, 77, 123, 123, 123, 123, 123, 123, 94, + 94, 149, 396, 183, 183, 10, 183, 183, 293, 415, + + 293, 135, 120, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 162, 162, 162, 162, 162, 162, 396, + 415, 10, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 17, 17, 17, 17, + + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 26, 261, 26, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 26, 1098, 421, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 33, 421, 33, 33, + + 33, 33, 33, 33, 33, 33, 33, 33, 33, 340, + 1073, 340, 33, 33, 33, 33, 33, 33, 186, 186, + 261, 186, 186, 138, 138, 138, 138, 138, 202, 138, + 138, 196, 202, 138, 303, 33, 196, 33, 33, 33, + 33, 33, 33, 40, 196, 303, 40, 138, 138, 138, + 204, 523, 40, 229, 204, 40, 40, 229, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 186, 523, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 389, 420, + 389, 45, 45, 45, 45, 45, 45, 341, 195, 420, + 195, 45, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 341, 339, 231, 424, 45, 45, 45, 45, + 45, 45, 53, 53, 424, 53, 53, 53, 53, 53, + 339, 53, 53, 148, 231, 53, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 1071, 232, 209, 53, + 53, 53, 57, 209, 57, 426, 150, 150, 150, 150, + + 150, 231, 150, 150, 195, 57, 150, 232, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 1054, 426, + 150, 150, 150, 152, 152, 152, 152, 152, 412, 152, + 152, 176, 176, 152, 232, 153, 153, 176, 176, 153, + 153, 176, 226, 176, 176, 412, 226, 152, 152, 152, + 201, 390, 290, 390, 201, 57, 78, 290, 78, 153, + 435, 212, 212, 201, 212, 212, 435, 228, 228, 78, + 228, 228, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 95, 305, 153, 95, 260, 305, 95, 95, + 260, 95, 95, 95, 95, 387, 226, 95, 95, 156, + + 156, 156, 156, 156, 156, 156, 156, 156, 156, 387, + 520, 95, 95, 95, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 520, 423, 156, 95, 95, 96, + 260, 429, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 423, 429, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 756, 756, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + + 99, 392, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 400, 400, 400, 99, 99, 99, 99, + 99, 99, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 337, 414, 419, 223, 223, 337, 223, 223, + 392, 99, 99, 99, 99, 99, 99, 100, 419, 445, + 414, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 1045, 445, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 223, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + + 100, 100, 100, 100, 100, 100, 100, 100, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 627, + 418, 443, 104, 104, 104, 104, 104, 104, 418, 344, + 205, 205, 104, 344, 205, 205, 245, 245, 245, 245, + 245, 245, 189, 627, 443, 434, 189, 104, 104, 104, + 104, 104, 104, 121, 205, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 422, 1044, 430, 121, + 121, 121, 121, 121, 121, 189, 189, 208, 208, 205, + 189, 434, 403, 208, 208, 430, 422, 208, 189, 208, + 527, 189, 121, 403, 121, 121, 121, 121, 121, 121, + + 124, 219, 425, 124, 527, 219, 456, 219, 219, 124, + 425, 456, 124, 124, 219, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 219, + 1042, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 744, 410, 744, 128, 128, + 128, 128, 128, 128, 335, 471, 335, 410, 128, 216, + + 216, 216, 216, 216, 216, 216, 216, 216, 216, 328, + 328, 522, 328, 128, 128, 128, 128, 128, 128, 134, + 134, 433, 134, 134, 134, 134, 134, 522, 134, 134, + 364, 364, 134, 364, 471, 233, 233, 233, 233, 516, + 432, 233, 233, 432, 328, 233, 134, 134, 134, 155, + 433, 335, 155, 155, 155, 155, 155, 516, 155, 155, + 233, 233, 155, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 427, 446, 432, 155, 155, 155, 157, + 446, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 442, 427, 442, 157, 157, 157, 157, 157, + + 157, 288, 288, 1041, 288, 288, 237, 237, 237, 237, + 237, 467, 237, 237, 467, 517, 237, 467, 157, 531, + 157, 157, 157, 157, 157, 157, 166, 531, 726, 166, + 237, 237, 237, 468, 468, 166, 517, 468, 166, 166, + 726, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 288, 442, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 475, 767, 767, 167, 167, 167, 167, 167, 167, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 276, 276, 276, 276, 276, 276, 503, 530, 475, 167, + 167, 167, 167, 167, 167, 207, 490, 503, 207, 207, + 207, 207, 207, 235, 207, 207, 235, 530, 207, 537, + 413, 479, 235, 239, 413, 235, 479, 239, 235, 235, + 239, 416, 207, 207, 207, 490, 239, 386, 386, 492, + 386, 537, 235, 416, 235, 492, 528, 413, 416, 1037, + 239, 239, 244, 244, 244, 244, 244, 244, 244, 244, + + 244, 244, 407, 407, 407, 407, 407, 407, 235, 235, + 238, 417, 386, 238, 528, 417, 238, 238, 521, 238, + 238, 238, 238, 254, 254, 238, 238, 454, 457, 254, + 254, 454, 457, 254, 533, 254, 521, 444, 417, 238, + 238, 238, 532, 533, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 454, 457, 268, 268, 1030, 469, + 268, 268, 469, 532, 444, 238, 238, 241, 491, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 268, 271, 444, 241, 241, 241, 241, 241, 241, 529, + 628, 263, 263, 263, 263, 263, 489, 263, 263, 489, + + 469, 263, 542, 529, 491, 268, 628, 542, 241, 241, + 241, 241, 241, 241, 246, 263, 263, 263, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 489, 1025, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 539, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 621, 539, 1012, 247, + 247, 247, 247, 247, 247, 526, 265, 265, 265, 265, + + 265, 526, 265, 265, 621, 395, 265, 395, 395, 395, + 395, 395, 395, 538, 247, 247, 247, 247, 247, 247, + 265, 265, 265, 267, 267, 267, 267, 267, 536, 267, + 267, 807, 807, 267, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 395, 534, 538, 267, 267, 267, + 270, 536, 534, 270, 270, 270, 270, 270, 624, 270, + 270, 1011, 540, 270, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 275, 591, 624, 549, 270, 270, 270, + 272, 549, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 505, 505, 540, 272, 272, 272, 272, + + 272, 272, 284, 284, 547, 505, 477, 480, 284, 284, + 477, 480, 284, 591, 284, 547, 507, 507, 548, 272, + 600, 272, 272, 272, 272, 272, 272, 277, 507, 548, + 277, 600, 1007, 477, 480, 566, 277, 566, 566, 277, + 277, 745, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 995, 745, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + + 277, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 546, 620, 546, 278, 278, 278, 278, 278, + 278, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 451, 620, 451, 451, 451, 451, 451, 451, 994, + 278, 278, 278, 278, 278, 278, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 296, 541, 296, 296, + 296, 296, 296, 296, 296, 296, 296, 296, 345, 986, + 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + 586, 342, 589, 546, 667, 342, 567, 589, 342, 567, + 567, 718, 541, 978, 342, 296, 297, 718, 297, 297, + + 297, 297, 297, 297, 297, 297, 297, 297, 342, 342, + 346, 586, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 347, 667, 347, 347, 347, 347, 347, 347, + 347, 347, 347, 347, 570, 297, 298, 570, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 399, 399, + 399, 399, 399, 399, 399, 399, 399, 399, 399, 638, + 366, 604, 518, 763, 366, 763, 518, 366, 568, 638, + 568, 568, 604, 366, 570, 298, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 366, 366, 518, + 299, 299, 299, 299, 299, 299, 391, 391, 391, 391, + + 391, 391, 391, 391, 391, 391, 513, 513, 513, 513, + 513, 513, 806, 299, 806, 299, 299, 299, 299, 299, + 299, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 622, 391, 977, 302, 302, 302, 302, 302, + 302, 404, 404, 404, 404, 404, 404, 404, 404, 404, + 404, 524, 617, 622, 655, 524, 810, 617, 810, 655, + 302, 302, 302, 302, 302, 302, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 524, 588, + 585, 304, 304, 304, 304, 304, 304, 406, 406, 406, + 406, 406, 406, 406, 406, 406, 406, 614, 614, 614, + + 614, 614, 614, 630, 605, 605, 304, 304, 304, 304, + 304, 304, 306, 585, 588, 306, 605, 723, 629, 661, + 630, 306, 661, 723, 306, 306, 629, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 841, 841, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 633, 877, 877, + + 307, 307, 307, 307, 307, 307, 409, 625, 409, 409, + 409, 409, 409, 409, 409, 409, 409, 409, 633, 625, + 662, 878, 878, 662, 625, 307, 307, 307, 307, 307, + 307, 348, 348, 348, 348, 348, 348, 348, 348, 348, + 348, 348, 885, 975, 885, 348, 348, 348, 348, 348, + 348, 447, 447, 447, 447, 447, 447, 447, 447, 447, + 447, 619, 623, 676, 587, 619, 623, 971, 676, 643, + 348, 348, 348, 348, 348, 348, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 643, 950, 619, 623, + 350, 350, 350, 350, 350, 350, 449, 587, 449, 449, + + 449, 449, 449, 449, 449, 449, 449, 449, 731, 663, + 606, 606, 663, 731, 947, 350, 350, 350, 350, 350, + 350, 367, 606, 367, 367, 367, 367, 367, 367, 367, + 367, 367, 367, 450, 930, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 470, 470, 470, 470, 470, + 470, 470, 470, 470, 470, 664, 888, 888, 664, 819, + 367, 368, 704, 368, 368, 368, 368, 368, 368, 368, + 368, 368, 368, 704, 474, 819, 474, 474, 474, 474, + 474, 474, 470, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 727, 641, 764, 641, 727, 929, + + 368, 369, 764, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 474, 504, 504, 504, 504, 504, 504, + 504, 504, 504, 504, 506, 506, 506, 506, 506, 506, + 506, 506, 506, 506, 665, 733, 925, 665, 740, 746, + 369, 370, 733, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 641, 915, 740, 746, 370, 370, 370, + 370, 370, 370, 510, 510, 510, 510, 510, 510, 510, + 510, 642, 626, 631, 632, 510, 626, 631, 632, 665, + 770, 642, 370, 370, 370, 370, 370, 370, 372, 372, + 372, 372, 372, 372, 372, 372, 372, 372, 909, 626, + + 631, 632, 372, 372, 372, 372, 372, 372, 512, 512, + 512, 512, 512, 512, 512, 512, 512, 512, 770, 594, + 908, 594, 594, 594, 594, 594, 594, 372, 372, 372, + 372, 372, 372, 393, 777, 393, 393, 393, 393, 393, + 393, 393, 393, 393, 393, 515, 777, 515, 515, 515, + 515, 515, 515, 515, 515, 515, 515, 550, 594, 550, + 550, 550, 550, 550, 550, 550, 550, 550, 550, 743, + 762, 743, 393, 394, 762, 394, 394, 394, 394, 394, + 394, 394, 394, 394, 394, 551, 907, 551, 551, 551, + 551, 551, 551, 551, 551, 551, 551, 552, 705, 552, + + 552, 552, 552, 552, 552, 552, 552, 552, 552, 705, + 755, 766, 394, 405, 405, 405, 405, 405, 405, 405, + 405, 405, 405, 405, 405, 405, 766, 755, 743, 405, + 405, 405, 405, 405, 405, 590, 590, 590, 590, 590, + 590, 590, 590, 590, 590, 649, 734, 649, 649, 649, + 649, 649, 649, 734, 405, 405, 405, 405, 405, 405, + 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, + 408, 408, 590, 916, 916, 408, 408, 408, 408, 408, + 408, 601, 899, 601, 601, 601, 601, 601, 601, 601, + 601, 601, 601, 650, 768, 608, 608, 650, 644, 732, + + 408, 408, 408, 408, 408, 408, 411, 608, 644, 411, + 732, 768, 804, 843, 895, 411, 843, 804, 411, 411, + 650, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 411, 411, 411, 411, 411, 948, 948, 411, 411, 411, + 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, + 883, 686, 894, 883, 452, 452, 452, 452, 452, 452, + + 602, 686, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 696, 696, 696, 696, 696, 696, 870, 452, + 452, 452, 452, 452, 452, 453, 453, 453, 453, 453, + 453, 453, 453, 453, 453, 917, 722, 856, 917, 453, + 453, 453, 453, 453, 453, 603, 722, 603, 603, 603, + 603, 603, 603, 603, 603, 603, 603, 715, 715, 715, + 715, 715, 715, 852, 453, 453, 453, 453, 453, 453, + 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, + 466, 954, 847, 954, 466, 466, 466, 466, 466, 466, + 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, + + 703, 814, 703, 703, 703, 703, 703, 703, 844, 466, + 466, 466, 466, 466, 466, 472, 814, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 611, 611, 611, + 611, 611, 611, 611, 611, 955, 955, 949, 779, 611, + 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, + 779, 809, 949, 836, 472, 473, 809, 473, 473, 473, + 473, 473, 473, 473, 473, 473, 473, 616, 831, 616, + 616, 616, 616, 616, 616, 616, 616, 616, 616, 645, + 645, 645, 645, 645, 645, 645, 645, 645, 645, 818, + 818, 836, 818, 818, 473, 493, 857, 493, 493, 493, + + 493, 493, 493, 493, 493, 493, 493, 647, 857, 647, + 647, 647, 647, 647, 647, 647, 647, 647, 647, 648, + 791, 648, 648, 648, 648, 648, 648, 648, 648, 648, + 648, 791, 653, 830, 493, 494, 653, 494, 494, 494, + 494, 494, 494, 494, 494, 494, 494, 728, 818, 656, + 706, 706, 957, 656, 957, 828, 960, 728, 960, 653, + 659, 660, 706, 671, 659, 660, 670, 671, 670, 670, + 670, 670, 670, 670, 494, 495, 656, 495, 495, 495, + 495, 495, 495, 495, 495, 495, 495, 659, 660, 858, + 671, 666, 666, 666, 666, 666, 666, 666, 666, 666, + + 666, 858, 674, 677, 827, 670, 674, 677, 785, 785, + 785, 785, 785, 785, 495, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 666, 674, + 677, 508, 508, 508, 508, 508, 508, 693, 693, 693, + 693, 693, 693, 693, 693, 693, 693, 823, 680, 681, + 719, 821, 680, 681, 719, 817, 508, 508, 508, 508, + 508, 508, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 680, 681, 719, 511, 511, + 511, 511, 511, 511, 695, 695, 695, 695, 695, 695, + 695, 695, 695, 695, 724, 729, 735, 889, 724, 729, + + 735, 816, 889, 511, 511, 511, 511, 511, 511, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 724, 729, 735, 514, 514, 514, 514, 514, 514, + 698, 792, 698, 698, 698, 698, 698, 698, 698, 698, + 698, 698, 792, 815, 707, 707, 987, 987, 813, 514, + 514, 514, 514, 514, 514, 571, 707, 571, 571, 571, + 571, 571, 571, 571, 571, 571, 571, 699, 699, 699, + 699, 699, 699, 699, 699, 699, 699, 701, 860, 701, + 701, 701, 701, 701, 701, 701, 701, 701, 701, 1016, + 860, 1016, 919, 775, 571, 572, 774, 572, 572, 572, + + 572, 572, 572, 572, 572, 572, 572, 702, 820, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 765, + 820, 919, 820, 820, 572, 573, 757, 573, 573, 573, + 573, 573, 573, 573, 573, 573, 573, 709, 709, 712, + 712, 712, 712, 712, 712, 712, 712, 820, 1076, 709, + 1076, 712, 714, 714, 714, 714, 714, 714, 714, 714, + 714, 714, 737, 923, 573, 592, 737, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 717, 754, 717, + 717, 717, 717, 717, 717, 717, 717, 717, 717, 737, + + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 1079, 923, 1079, 592, 593, 753, 593, 593, 593, + 593, 593, 593, 593, 593, 593, 593, 748, 748, 748, + 748, 748, 748, 748, 748, 748, 748, 748, 749, 749, + 749, 749, 749, 749, 749, 749, 749, 749, 749, 897, + 897, 751, 897, 897, 593, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 1139, 1139, 1139, 599, + 599, 599, 599, 599, 599, 980, 769, 769, 769, 769, + 769, 769, 769, 769, 769, 769, 773, 773, 773, 773, + 773, 773, 773, 750, 599, 599, 599, 599, 599, 599, + + 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, + 609, 609, 609, 769, 980, 742, 609, 609, 609, 609, + 609, 609, 984, 741, 773, 776, 776, 776, 776, 776, + 776, 776, 776, 776, 776, 802, 802, 802, 802, 802, + 802, 609, 609, 609, 609, 609, 609, 612, 612, 612, + 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, + 898, 984, 898, 612, 612, 612, 612, 612, 612, 778, + 778, 778, 778, 778, 778, 778, 778, 778, 778, 832, + 833, 808, 739, 832, 833, 808, 1032, 700, 612, 612, + 612, 612, 612, 612, 615, 615, 615, 615, 615, 615, + + 615, 615, 615, 615, 615, 615, 832, 833, 808, 615, + 615, 615, 615, 615, 615, 782, 882, 782, 782, 782, + 782, 782, 782, 898, 692, 1032, 882, 782, 691, 793, + 793, 808, 690, 685, 615, 615, 615, 615, 615, 615, + 668, 793, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 668, 784, 784, 784, 784, 784, 784, 784, 784, + 784, 784, 787, 874, 787, 787, 787, 787, 787, 787, + 787, 787, 787, 787, 874, 1048, 1048, 1048, 1048, 668, + 669, 931, 669, 669, 669, 669, 669, 669, 669, 669, + 669, 669, 788, 931, 788, 788, 788, 788, 788, 788, + + 788, 788, 788, 788, 789, 875, 789, 789, 789, 789, + 789, 789, 789, 789, 789, 789, 875, 1060, 1087, 669, + 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, + 687, 790, 684, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 794, 794, 795, 795, 795, 795, 795, + 795, 795, 795, 795, 795, 794, 1060, 1087, 687, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 796, 796, 799, 799, 799, 799, 799, 799, 799, 799, + 683, 682, 796, 932, 799, 801, 801, 801, 801, 801, + 801, 801, 801, 801, 801, 932, 679, 688, 689, 689, + + 689, 689, 689, 689, 689, 689, 689, 689, 689, 803, + 934, 803, 803, 803, 803, 803, 803, 803, 803, 803, + 803, 678, 934, 811, 812, 675, 996, 811, 812, 826, + 826, 826, 826, 826, 826, 826, 689, 694, 996, 694, + 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, + 811, 812, 673, 694, 694, 694, 694, 694, 694, 822, + 822, 822, 822, 822, 822, 822, 822, 822, 822, 1136, + 1136, 1157, 1157, 811, 812, 1136, 672, 1157, 694, 694, + 694, 694, 694, 694, 697, 697, 697, 697, 697, 697, + 697, 697, 697, 697, 697, 1163, 1163, 1163, 697, 697, + + 697, 697, 697, 697, 824, 824, 824, 824, 824, 824, + 824, 824, 824, 824, 824, 842, 845, 846, 658, 842, + 845, 846, 657, 697, 697, 697, 697, 697, 697, 710, + 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, + 710, 710, 842, 845, 846, 710, 710, 710, 710, 710, + 710, 825, 825, 825, 825, 825, 825, 825, 825, 825, + 825, 825, 886, 842, 845, 846, 886, 654, 652, 651, + 710, 710, 710, 710, 710, 710, 713, 713, 713, 713, + 713, 713, 713, 713, 713, 713, 713, 713, 713, 886, + 646, 640, 713, 713, 713, 713, 713, 713, 835, 835, + + 835, 835, 835, 835, 835, 835, 835, 835, 839, 839, + 839, 839, 839, 839, 839, 639, 637, 713, 713, 713, + 713, 713, 713, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 716, 716, 1103, 835, 636, 635, 716, 716, + 716, 716, 716, 716, 634, 853, 839, 853, 853, 853, + 853, 853, 853, 853, 853, 853, 853, 866, 866, 866, + 866, 866, 866, 716, 716, 716, 716, 716, 716, 721, + 890, 892, 721, 1103, 890, 892, 958, 958, 721, 958, + 958, 721, 721, 618, 721, 721, 721, 721, 721, 721, + 721, 721, 721, 721, 721, 721, 721, 890, 892, 598, + + 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, + 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, + 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, + 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, + 721, 721, 721, 752, 597, 596, 997, 752, 752, 752, + 752, 752, 752, 752, 752, 752, 752, 752, 997, 752, + 595, 584, 752, 752, 752, 752, 752, 752, 752, 752, + 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, + 752, 752, 752, 752, 752, 583, 752, 752, 752, 752, + 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, + + 752, 752, 752, 752, 758, 758, 758, 758, 758, 758, + 758, 758, 758, 758, 758, 854, 582, 854, 854, 854, + 854, 854, 854, 854, 854, 854, 854, 855, 946, 855, + 855, 855, 855, 855, 855, 855, 855, 855, 855, 946, + 581, 580, 758, 759, 759, 759, 759, 759, 759, 759, + 759, 759, 759, 759, 859, 859, 859, 859, 859, 859, + 859, 859, 859, 859, 863, 999, 863, 863, 863, 863, + 863, 863, 1158, 1158, 1179, 1179, 863, 999, 1158, 579, + 1179, 759, 760, 760, 760, 760, 760, 760, 760, 760, + 760, 760, 760, 865, 865, 865, 865, 865, 865, 865, + + 865, 865, 865, 868, 896, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 876, 876, 1181, 1181, 1043, + 760, 761, 578, 1181, 761, 577, 896, 876, 896, 896, + 761, 1043, 576, 761, 761, 575, 761, 761, 761, 761, + 761, 761, 761, 761, 761, 761, 761, 761, 761, 961, + 574, 961, 761, 761, 761, 761, 761, 761, 761, 761, + 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, + 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, + 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, + 761, 761, 761, 761, 761, 771, 771, 771, 771, 771, + + 771, 771, 771, 771, 771, 771, 869, 869, 869, 869, + 869, 869, 869, 869, 869, 869, 871, 961, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, 1018, 1018, + 565, 1018, 1018, 771, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 872, 564, 872, 872, 872, + 872, 872, 872, 872, 872, 872, 872, 873, 563, 873, + 873, 873, 873, 873, 873, 940, 940, 940, 940, 940, + 940, 562, 772, 780, 561, 780, 780, 780, 780, 780, + 780, 780, 780, 780, 780, 780, 783, 560, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, 783, 559, + + 558, 557, 783, 783, 783, 783, 783, 783, 881, 881, + 881, 881, 881, 881, 881, 881, 556, 884, 906, 951, + 1227, 884, 906, 951, 555, 554, 1227, 783, 783, 783, + 783, 783, 783, 786, 786, 786, 786, 786, 786, 786, + 786, 786, 786, 786, 884, 906, 951, 786, 786, 786, + 786, 786, 786, 900, 553, 1182, 1182, 900, 900, 900, + 900, 1182, 1052, 1052, 901, 1052, 1052, 884, 901, 901, + 901, 901, 786, 786, 786, 786, 786, 786, 797, 797, + 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, + 797, 545, 544, 543, 797, 797, 797, 797, 797, 797, + + 1005, 1005, 1005, 1005, 1005, 1005, 902, 900, 902, 902, + 902, 902, 902, 902, 902, 902, 902, 902, 901, 797, + 797, 797, 797, 797, 797, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 535, 502, 501, + 500, 800, 800, 800, 800, 800, 800, 903, 499, 903, + 903, 903, 903, 903, 903, 903, 903, 903, 903, 1010, + 1010, 1010, 1010, 1010, 1010, 1010, 800, 800, 800, 800, + 800, 800, 805, 967, 1170, 805, 967, 1170, 497, 1170, + 496, 805, 967, 967, 805, 805, 967, 805, 805, 805, + 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, + + 967, 967, 967, 805, 805, 805, 805, 805, 805, 805, + 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, + 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, + 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, + 805, 805, 805, 805, 805, 805, 829, 488, 487, 928, + 829, 928, 928, 928, 928, 928, 928, 486, 829, 485, + 484, 483, 829, 829, 829, 829, 829, 829, 829, 829, + 829, 829, 829, 829, 829, 482, 481, 829, 829, 829, + 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, + 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, + + 478, 829, 829, 829, 829, 829, 829, 829, 829, 829, + 829, 829, 829, 829, 829, 829, 829, 829, 829, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 904, 476, 904, 904, 904, 904, 904, 904, 904, 904, + 904, 904, 905, 465, 905, 905, 905, 905, 905, 905, + 905, 905, 905, 905, 464, 463, 462, 837, 838, 838, + 838, 838, 838, 838, 838, 838, 838, 838, 838, 922, + 461, 922, 922, 922, 922, 922, 922, 914, 460, 459, + 458, 914, 924, 924, 924, 924, 924, 924, 924, 924, + 924, 924, 1183, 1183, 1221, 1221, 838, 840, 1183, 976, + + 840, 1221, 1186, 976, 914, 1186, 840, 1186, 922, 840, + 840, 455, 840, 840, 840, 840, 840, 840, 840, 840, + 840, 840, 840, 840, 840, 914, 976, 448, 840, 840, + 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, + 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, + 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, + 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, + 840, 848, 441, 848, 848, 848, 848, 848, 848, 848, + 848, 848, 848, 440, 439, 438, 918, 918, 918, 918, + 918, 918, 918, 918, 918, 918, 926, 437, 926, 926, + + 926, 926, 926, 926, 926, 926, 926, 926, 436, 431, + 848, 849, 428, 849, 849, 849, 849, 849, 849, 849, + 849, 849, 849, 918, 927, 402, 927, 927, 927, 927, + 927, 927, 927, 927, 927, 927, 933, 933, 933, 933, + 933, 933, 933, 933, 933, 933, 1187, 1187, 401, 398, + 849, 850, 1187, 850, 850, 850, 850, 850, 850, 850, + 850, 850, 850, 937, 397, 937, 937, 937, 937, 937, + 937, 385, 384, 383, 382, 937, 939, 939, 939, 939, + 939, 939, 939, 939, 939, 939, 1188, 1188, 381, 380, + 850, 851, 1188, 851, 851, 851, 851, 851, 851, 851, + + 851, 851, 851, 942, 379, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 943, 943, 943, 943, 943, + 943, 943, 943, 943, 943, 943, 1189, 1189, 378, 377, + 851, 861, 1189, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 864, 376, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 375, 374, 371, + 864, 864, 864, 864, 864, 864, 944, 944, 944, 944, + 944, 944, 944, 944, 944, 944, 944, 953, 365, 1077, + 1077, 953, 1077, 1077, 363, 864, 864, 864, 864, 864, + 864, 867, 867, 867, 867, 867, 867, 867, 867, 867, + + 867, 867, 362, 361, 953, 867, 867, 867, 867, 867, + 867, 945, 945, 945, 945, 945, 945, 945, 945, 945, + 945, 945, 985, 1192, 1192, 360, 985, 953, 359, 1192, + 867, 867, 867, 867, 867, 867, 879, 879, 879, 879, + 879, 879, 879, 879, 879, 879, 879, 879, 910, 985, + 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, + 962, 1225, 358, 1225, 962, 962, 962, 962, 963, 1225, + 985, 357, 963, 963, 963, 963, 970, 970, 970, 970, + 970, 970, 970, 970, 970, 970, 356, 910, 911, 355, + 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, + + 964, 354, 1193, 1193, 964, 964, 964, 964, 1193, 353, + 352, 965, 349, 338, 962, 965, 965, 965, 965, 1194, + 1194, 334, 963, 1197, 1197, 1194, 333, 911, 912, 1197, + 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, + 966, 332, 331, 966, 966, 966, 966, 966, 966, 966, + 966, 966, 966, 327, 964, 968, 326, 1198, 1198, 968, + 968, 968, 968, 1198, 325, 965, 324, 912, 913, 323, + 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, + 972, 322, 972, 972, 972, 972, 972, 972, 972, 972, + 972, 972, 320, 969, 319, 1202, 969, 1013, 1202, 318, + + 1202, 1013, 969, 969, 317, 316, 969, 913, 920, 968, + 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, + 969, 969, 969, 973, 1013, 973, 973, 973, 973, 973, + 973, 973, 973, 973, 973, 974, 315, 974, 974, 974, + 974, 974, 974, 1204, 1204, 314, 313, 920, 921, 1204, + 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, + 312, 311, 310, 308, 301, 979, 979, 979, 979, 979, + 979, 979, 979, 979, 979, 983, 300, 983, 983, 983, + 983, 983, 983, 1212, 1212, 286, 285, 921, 935, 1212, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + + 935, 938, 979, 938, 938, 938, 938, 938, 938, 938, + 938, 938, 938, 938, 983, 283, 282, 938, 938, 938, + 938, 938, 938, 991, 281, 991, 991, 991, 991, 991, + 991, 991, 991, 991, 991, 1094, 1094, 1094, 1094, 1094, + 1094, 280, 938, 938, 938, 938, 938, 938, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 279, 273, + 269, 266, 941, 941, 941, 941, 941, 941, 992, 264, + 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, + 1121, 1121, 1121, 1121, 1121, 1121, 262, 941, 941, 941, + 941, 941, 941, 981, 259, 981, 981, 981, 981, 981, + + 981, 981, 981, 981, 981, 993, 258, 993, 993, 993, + 993, 993, 993, 993, 993, 993, 993, 998, 998, 998, + 998, 998, 998, 998, 998, 998, 998, 1024, 1219, 1219, + 257, 1024, 981, 982, 1219, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 1002, 256, 1002, 1002, 1002, + 1002, 1002, 1002, 255, 1024, 253, 252, 1002, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1222, 1222, + 251, 250, 982, 988, 1222, 988, 988, 988, 988, 988, + 988, 988, 988, 988, 988, 1006, 248, 1006, 1006, 1006, + 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1008, 1008, 1008, + + 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 242, 234, + 1049, 230, 988, 989, 1049, 989, 989, 989, 989, 989, + 989, 989, 989, 989, 989, 1009, 1009, 1009, 1009, 1009, + 1009, 1009, 1009, 1009, 1009, 1009, 225, 1049, 1015, 224, + 222, 1040, 1015, 1040, 1040, 1040, 1040, 1040, 1040, 218, + 213, 211, 989, 990, 206, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 1015, 1019, 1019, 1019, 1019, + 1019, 1019, 1019, 1019, 1019, 1019, 1020, 1020, 1020, 1020, + 1020, 1020, 1020, 1020, 1020, 1020, 1209, 194, 1015, 1209, + 193, 1209, 990, 1000, 192, 1000, 1000, 1000, 1000, 1000, + + 1000, 1000, 1000, 1000, 1000, 1000, 1003, 191, 1003, 1003, + 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 190, 182, + 181, 180, 1003, 1003, 1003, 1003, 1003, 1003, 1021, 179, + 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, + 178, 1118, 1118, 1118, 1118, 1118, 1118, 1003, 1003, 1003, + 1003, 1003, 1003, 1022, 177, 1022, 1022, 1022, 1022, 1022, + 1022, 1022, 1022, 1022, 1022, 1023, 175, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1026, 1118, 1026, + 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 174, + 173, 1029, 172, 171, 170, 1029, 1031, 1031, 1031, 1031, + + 1031, 1031, 1031, 1031, 1031, 1031, 1035, 169, 1035, 1035, + 1035, 1035, 1035, 1035, 168, 163, 1026, 1027, 1029, 1027, + 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 159, + 158, 1058, 154, 1031, 151, 1058, 1224, 1224, 147, 1029, + 144, 141, 1224, 137, 133, 1035, 1036, 1036, 1036, 1036, + 1036, 1036, 1036, 1036, 1036, 1036, 1027, 1028, 1058, 1028, + 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1038, + 132, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1039, 131, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 130, 1074, 129, 1028, 1033, 1074, 1033, + + 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1046, + 125, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1074, 1051, 119, 117, 1057, 1051, 1057, 1057, 1057, + 1057, 1057, 1057, 113, 109, 108, 1033, 1034, 107, 1034, + 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1051, + 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, + 1055, 106, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, + 1055, 1055, 1051, 105, 101, 1056, 1034, 1056, 1056, 1056, + 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1059, 1059, 1059, + 1059, 1059, 1059, 1059, 1059, 1059, 1059, 88, 1063, 81, + + 1063, 1063, 1063, 1063, 1063, 1063, 74, 73, 69, 68, + 67, 1064, 62, 60, 1101, 1064, 1101, 1101, 1101, 1101, + 1101, 1101, 51, 50, 1059, 1061, 48, 1061, 1061, 1061, + 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1063, 1064, 1068, + 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1069, + 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1064, + 47, 41, 36, 30, 1061, 1062, 24, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1070, 1070, 1070, + 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1080, 23, 1080, + 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 20, + + 19, 0, 0, 0, 1062, 1065, 0, 1065, 1065, 1065, + 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1081, 0, 1081, + 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1082, + 0, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 0, 0, 0, 1065, 1066, 0, 1066, 1066, 1066, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 0, 0, 0, + 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, + 1090, 0, 1090, 1090, 1090, 1090, 1090, 1090, 0, 0, + 0, 0, 0, 0, 1066, 1067, 0, 1067, 1067, 1067, + 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1086, 1092, 1092, + + 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 0, 1090, + 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, + 0, 0, 0, 0, 1067, 1083, 0, 1083, 1083, 1083, + 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1097, 1097, 1097, + 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1099, 0, 1099, + 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 0, + 0, 0, 0, 0, 1083, 1084, 0, 1084, 1084, 1084, + 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1100, 0, 1100, + 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1102, + 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 0, + + 0, 0, 0, 0, 1084, 1085, 0, 1085, 1085, 1085, + 1085, 1085, 1085, 1085, 1085, 1085, 1085, 0, 1106, 0, + 1106, 1106, 1106, 1106, 1106, 1106, 1102, 1107, 1107, 1107, + 1107, 1107, 1107, 1107, 1107, 1107, 1107, 0, 1124, 1124, + 1124, 1124, 1124, 1124, 1085, 1088, 0, 1088, 1088, 1088, + 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1106, 0, 0, + 0, 0, 0, 0, 1107, 1108, 1108, 1108, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1124, 0, 0, 0, 0, + 0, 0, 0, 0, 1088, 1089, 0, 1089, 1089, 1089, + 1089, 1089, 1089, 1089, 1089, 1089, 1089, 0, 0, 0, + + 0, 0, 1108, 1109, 1109, 1109, 1109, 1109, 1109, 1109, + 1109, 1109, 1109, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 0, 1089, 1104, 0, 1104, 1104, 1104, + 1104, 1104, 1104, 1104, 1104, 1104, 1104, 0, 0, 0, + 1109, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, + 1111, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + 1112, 0, 0, 0, 1104, 1105, 0, 1105, 1105, 1105, + 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1113, 1113, 1113, + 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1114, 1114, 1114, + 1114, 1114, 1114, 1114, 1114, 1114, 1114, 0, 0, 0, + + 0, 0, 0, 0, 1105, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1113, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1114, 1115, 1115, 1115, 1115, 1115, + 1115, 1115, 1115, 1115, 1115, 1117, 1117, 1117, 1117, 1117, + 1117, 1117, 1117, 1117, 1117, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 0, 0, 0, 0, 0, + 0, 0, 1115, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1117, 1123, 1123, 1123, 1123, 1123, 1123, 1123, + 1123, 1123, 1123, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1123, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, + 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, + 1126, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, + 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, + 1127, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, + 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, + 1128, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, + 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, + 1129, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, + + 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, + 1130, 1131, 0, 0, 1131, 0, 0, 0, 0, 1131, + 0, 1131, 1131, 1131, 0, 0, 1131, 1131, 1131, 1131, + 1131, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, + 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, + 1132, 1133, 0, 0, 1133, 0, 0, 1133, 0, 1133, + 0, 1133, 1133, 1133, 1133, 0, 1133, 1133, 1133, 1133, + 1133, 1134, 0, 0, 1134, 0, 0, 0, 0, 1134, + 0, 1134, 1134, 1134, 0, 0, 1134, 1134, 1134, 1134, + 1134, 1135, 0, 0, 1135, 1135, 1135, 0, 1135, 1135, + + 0, 1135, 1135, 1135, 0, 0, 1135, 1135, 1135, 1135, + 1135, 1137, 0, 0, 1137, 1137, 1137, 0, 1137, 1137, + 0, 1137, 1137, 1137, 0, 0, 1137, 1137, 1137, 1137, + 1137, 1138, 0, 0, 1138, 1138, 1138, 0, 1138, 1138, + 0, 1138, 1138, 1138, 0, 1138, 1138, 0, 1138, 1138, + 1138, 1140, 0, 0, 1140, 1140, 0, 0, 1140, 1140, + 0, 1140, 1140, 1140, 1140, 0, 1140, 1140, 1140, 1140, + 1140, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, + 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, + 1141, 1142, 1142, 0, 1142, 1142, 0, 1142, 1142, 1142, + + 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, + 1142, 1143, 0, 0, 1143, 0, 0, 1143, 0, 1143, + 0, 1143, 1143, 1143, 1143, 0, 1143, 1143, 1143, 1143, + 1143, 1144, 0, 0, 1144, 0, 0, 0, 0, 1144, + 0, 1144, 1144, 1144, 0, 1144, 1144, 1144, 1144, 1144, + 1144, 1145, 0, 0, 1145, 1145, 1145, 0, 1145, 1145, + 0, 1145, 1145, 1145, 0, 1145, 1145, 1145, 1145, 1145, + 1145, 1146, 0, 0, 0, 1146, 1146, 1146, 1146, 1146, + 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, + 1146, 1147, 0, 0, 1147, 0, 0, 0, 0, 1147, + + 0, 1147, 1147, 1147, 0, 0, 1147, 1147, 1147, 1147, + 1147, 1148, 0, 0, 1148, 0, 0, 1148, 0, 1148, + 0, 1148, 1148, 1148, 1148, 0, 1148, 1148, 1148, 1148, + 1148, 1149, 0, 0, 1149, 0, 0, 0, 0, 1149, + 0, 1149, 1149, 1149, 0, 0, 1149, 1149, 1149, 1149, + 1149, 1150, 0, 0, 1150, 1150, 1150, 0, 1150, 1150, + 0, 1150, 1150, 1150, 0, 0, 1150, 1150, 1150, 1150, + 1150, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, + 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, + 1151, 1152, 1152, 0, 1152, 1152, 1152, 1152, 1152, 1152, + + 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, + 1152, 1153, 0, 0, 1153, 0, 0, 0, 0, 1153, + 0, 1153, 1153, 1153, 0, 0, 1153, 1153, 1153, 1153, + 1153, 1154, 0, 0, 1154, 0, 0, 0, 0, 1154, + 0, 1154, 1154, 1154, 0, 0, 1154, 1154, 1154, 1154, + 1154, 1155, 0, 0, 1155, 1155, 1155, 0, 1155, 1155, + 0, 1155, 1155, 1155, 0, 0, 1155, 1155, 1155, 1155, + 1155, 1156, 0, 0, 1156, 1156, 1156, 0, 1156, 1156, + 0, 1156, 1156, 1156, 0, 0, 1156, 1156, 1156, 1156, + 1156, 1159, 1159, 1159, 0, 0, 0, 0, 1159, 1160, + + 0, 0, 1160, 1160, 1160, 0, 1160, 1160, 0, 1160, + 1160, 1160, 0, 0, 1160, 1160, 1160, 1160, 1160, 1161, + 0, 0, 1161, 1161, 1161, 0, 1161, 1161, 0, 1161, + 1161, 1161, 0, 0, 1161, 1161, 1161, 1161, 1161, 1162, + 0, 0, 1162, 1162, 1162, 0, 1162, 1162, 0, 1162, + 1162, 1162, 0, 1162, 1162, 0, 1162, 1162, 1162, 1164, + 0, 0, 1164, 1164, 0, 0, 1164, 1164, 0, 1164, + 1164, 1164, 1164, 0, 1164, 1164, 1164, 1164, 1164, 1165, + 1165, 0, 1165, 1165, 0, 1165, 1165, 1165, 1165, 1165, + 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1166, + + 0, 0, 1166, 0, 0, 0, 0, 1166, 0, 1166, + 1166, 1166, 0, 0, 1166, 1166, 1166, 1166, 1166, 1167, + 0, 0, 1167, 0, 0, 0, 0, 1167, 0, 1167, + 1167, 1167, 0, 1167, 1167, 1167, 1167, 1167, 1167, 1168, + 0, 0, 1168, 1168, 0, 1168, 1168, 0, 0, 1168, + 1168, 1169, 0, 0, 1169, 1169, 1169, 0, 1169, 1169, + 0, 1169, 1169, 1169, 0, 1169, 1169, 1169, 1169, 1169, + 1169, 1171, 0, 0, 0, 1171, 1171, 1171, 1171, 1171, + 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, + 1171, 1172, 0, 0, 1172, 0, 0, 0, 0, 1172, + + 0, 1172, 1172, 1172, 0, 0, 1172, 1172, 1172, 1172, + 1172, 1173, 0, 0, 1173, 0, 0, 0, 0, 1173, + 0, 1173, 1173, 1173, 0, 0, 1173, 1173, 1173, 1173, + 1173, 1174, 0, 0, 1174, 0, 0, 0, 0, 1174, + 0, 1174, 1174, 1174, 0, 0, 1174, 1174, 1174, 1174, + 1174, 1175, 0, 0, 1175, 1175, 1175, 0, 1175, 1175, + 0, 1175, 1175, 1175, 0, 0, 1175, 1175, 1175, 1175, + 1175, 1176, 0, 0, 1176, 1176, 1176, 0, 1176, 1176, + 0, 1176, 1176, 1176, 0, 0, 1176, 1176, 1176, 1176, + 1176, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, + + 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, + 1177, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1180, 1180, 1180, 0, 0, 0, 0, 1180, 1184, + 1184, 1184, 0, 0, 0, 0, 1184, 1185, 1185, 1185, + 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, + 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1190, 1190, 1190, + 0, 0, 0, 0, 1190, 1191, 1191, 1191, 1191, 0, + 0, 0, 0, 1191, 1195, 1195, 1195, 0, 0, 0, + 0, 1195, 1196, 1196, 1196, 1196, 0, 0, 0, 0, + + 1196, 1199, 1199, 1199, 0, 0, 0, 0, 1199, 1200, + 1200, 1200, 1200, 0, 0, 0, 0, 1200, 1201, 1201, + 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, + 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1203, 0, + 0, 1203, 1203, 0, 1203, 1203, 0, 0, 1203, 1203, + 1205, 0, 1205, 1205, 0, 0, 0, 0, 1205, 1206, + 1206, 1206, 0, 0, 0, 0, 1206, 1207, 1207, 1207, + 1207, 0, 0, 0, 0, 1207, 1208, 1208, 1208, 1208, + 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, + 1208, 1208, 1208, 1208, 1208, 1208, 1210, 0, 0, 1210, + + 1210, 0, 1210, 1210, 0, 0, 1210, 1210, 1211, 0, + 0, 1211, 0, 0, 0, 0, 1211, 0, 1211, 1211, + 1211, 0, 0, 1211, 1211, 1211, 1211, 1211, 1213, 0, + 1213, 1213, 0, 0, 0, 0, 1213, 1214, 1214, 1214, + 0, 0, 0, 0, 1214, 1215, 1215, 1215, 0, 0, + 0, 0, 0, 1215, 1216, 1216, 1216, 1216, 1216, 1216, + 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, + 1216, 1216, 1216, 1216, 1217, 1217, 0, 1217, 1217, 1217, + 1217, 0, 1217, 0, 1217, 1217, 1217, 0, 0, 1217, + 1217, 1217, 1217, 1217, 1218, 1218, 0, 1218, 1218, 1218, + + 1218, 0, 1218, 0, 1218, 1218, 1218, 0, 0, 1218, + 1218, 1218, 1218, 1218, 1220, 0, 1220, 1220, 0, 0, + 0, 0, 1220, 1223, 0, 1223, 1223, 0, 0, 0, + 0, 1223, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, + 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, + 1226, 1226, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int sudoers_flex_debug; +int sudoers_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *sudoerstext; +#line 1 "toke.l" +#line 2 "toke.l" +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#include + +#include +#include +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include +#include +#include "sudoers.h" +#include "toke.h" +#include +#include "sudo_digest.h" +#include "sudo_lbuf.h" + +#if defined(HAVE_STRUCT_DIRENT_D_NAMLEN) && HAVE_STRUCT_DIRENT_D_NAMLEN +# define NAMLEN(dirent) (dirent)->d_namlen +#else +# define NAMLEN(dirent) strlen((dirent)->d_name) +#endif + +// PVS Studio suppression +// -V::519, 1004, 1037 + +int sudolineno; /* current sudoers line number. */ +char *sudoers; /* sudoers file being parsed. */ +struct sudolinebuf sudolinebuf; /* sudoers line being parsed. */ + +/* Default sudoers path, mode and owner (may be set via sudo.conf) */ +const char *sudoers_file = _PATH_SUDOERS; +mode_t sudoers_mode = SUDOERS_MODE; +uid_t sudoers_uid = SUDOERS_UID; +gid_t sudoers_gid = SUDOERS_GID; + +static bool continued, sawspace; +static int prev_state; +static int digest_type = -1; + +static bool pop_include(void); +static yy_size_t sudoers_input(char *buf, yy_size_t max_size); + +int (*trace_print)(const char *msg) = sudoers_trace_print; + +#define ECHO ignore_result(fwrite(sudoerstext, sudoersleng, 1, sudoersout)) + +#define YY_INPUT(buf, result, max_size) (result) = sudoers_input(buf, max_size) + +#define YY_USER_ACTION do { \ + sudolinebuf.toke_start = sudolinebuf.toke_end; \ + sudolinebuf.toke_end += sudoersleng; \ +} while (0); + +#define sudoersless(n) do { \ + sudolinebuf.toke_end = sudolinebuf.toke_start + (n); \ + yyless(n); \ +} while (0); + +#define YY_NO_INPUT 1 + + + + + + + + +#line 2802 "toke.c" + +#define INITIAL 0 +#define GOTDEFS 1 +#define GOTCMND 2 +#define STARTDEFS 3 +#define INDEFS 4 +#define INSTR 5 +#define WANTDIGEST 6 +#define GOTINC 7 +#define EXPECTPATH 8 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int sudoerslex_destroy (void ); + +int sudoersget_debug (void ); + +void sudoersset_debug (int debug_flag ); + +YY_EXTRA_TYPE sudoersget_extra (void ); + +void sudoersset_extra (YY_EXTRA_TYPE user_defined ); + +FILE *sudoersget_in (void ); + +void sudoersset_in (FILE * in_str ); + +FILE *sudoersget_out (void ); + +void sudoersset_out (FILE * out_str ); + +yy_size_t sudoersget_leng (void ); + +char *sudoersget_text (void ); + +int sudoersget_lineno (void ); + +void sudoersset_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int sudoerswrap (void ); +#else +extern int sudoerswrap (void ); +#endif +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( sudoerstext, sudoersleng, 1, sudoersout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( sudoersin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( sudoersin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, sudoersin))==0 && ferror(sudoersin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(sudoersin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int sudoerslex (void); + +#define YY_DECL int sudoerslex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after sudoerstext and sudoersleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( sudoersleng > 0 ) \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ + (sudoerstext[sudoersleng - 1] == '\n'); \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! sudoersin ) { + sudoersin = stdin; + } + + if ( ! sudoersout ) { + sudoersout = stdout; + } + + if ( ! YY_CURRENT_BUFFER ) { + sudoersensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + sudoers_create_buffer(sudoersin,YY_BUF_SIZE ); + } + + sudoers_load_buffer_state( ); + } + + { +#line 117 "toke.l" + +#line 3024 "toke.c" + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of sudoerstext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); +yy_match: + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 1126 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 8253 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 118 "toke.l" +{ + LEXTRACE(", "); + return ','; + } /* return ',' */ + YY_BREAK +case 2: +YY_RULE_SETUP +#line 123 "toke.l" +BEGIN STARTDEFS; + YY_BREAK +case 3: +YY_RULE_SETUP +#line 125 "toke.l" +{ + BEGIN INDEFS; + LEXTRACE("DEFVAR "); + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + return DEFVAR; + } + YY_BREAK + +case 4: +YY_RULE_SETUP +#line 134 "toke.l" +{ + BEGIN STARTDEFS; + LEXTRACE(", "); + return ','; + } /* return ',' */ + YY_BREAK +case 5: +YY_RULE_SETUP +#line 140 "toke.l" +{ + LEXTRACE("= "); + return '='; + } /* return '=' */ + YY_BREAK +case 6: +YY_RULE_SETUP +#line 145 "toke.l" +{ + LEXTRACE("+= "); + return '+'; + } /* return '+' */ + YY_BREAK +case 7: +YY_RULE_SETUP +#line 150 "toke.l" +{ + LEXTRACE("-= "); + return '-'; + } /* return '-' */ + YY_BREAK +case 8: +YY_RULE_SETUP +#line 155 "toke.l" +{ + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = YY_START; + BEGIN INSTR; + } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 162 "toke.l" +{ + LEXTRACE("WORD(2) "); + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + return WORD; + } + YY_BREAK + + +case 10: +/* rule 10 can match eol */ +YY_RULE_SETUP +#line 171 "toke.l" +{ + /* Line continuation char followed by newline. */ + sudolineno++; + continued = true; + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 177 "toke.l" +{ + LEXTRACE("ENDSTR "); + BEGIN prev_state; + + if (sudoerslval.string == NULL) { + sudoerserror(N_("empty string")); + LEXTRACE("ERROR "); + return ERROR; + } + if (prev_state == INITIAL || prev_state == GOTDEFS) { + switch (sudoerslval.string[0]) { + case '%': + if (sudoerslval.string[1] == '\0' || + (sudoerslval.string[1] == ':' && + sudoerslval.string[2] == '\0')) { + sudoerserror(N_("empty group")); + LEXTRACE("ERROR "); + return ERROR; + } + LEXTRACE("USERGROUP "); + return USERGROUP; + case '+': + if (sudoerslval.string[1] == '\0') { + sudoerserror(N_("empty netgroup")); + LEXTRACE("ERROR "); + return ERROR; + } + LEXTRACE("NETGROUP "); + return NETGROUP; + } + } + LEXTRACE("WORD(4) "); + return WORD; + } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 212 "toke.l" +{ + LEXTRACE("BACKSLASH "); + if (!append(sudoerstext, sudoersleng)) + yyterminate(); + } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 218 "toke.l" +{ + LEXTRACE("STRBODY "); + if (!append(sudoerstext, sudoersleng)) + yyterminate(); + } + YY_BREAK + + +case 14: +YY_RULE_SETUP +#line 226 "toke.l" +{ + /* quoted fnmatch glob char, pass verbatim */ + LEXTRACE("QUOTEDCHAR "); + if (!fill_args(sudoerstext, 2, sawspace)) + yyterminate(); + sawspace = false; + } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 234 "toke.l" +{ + /* quoted sudoers special char, strip backslash */ + LEXTRACE("QUOTEDCHAR "); + if (!fill_args(sudoerstext + 1, 1, sawspace)) + yyterminate(); + sawspace = false; + } + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 242 "toke.l" +{ + BEGIN INITIAL; + sudoersless(0); + yy_set_bol(0); + return COMMAND; + } /* end of command line args */ + YY_BREAK +case 17: +YY_RULE_SETUP +#line 249 "toke.l" +{ + LEXTRACE("ARG "); + if (!fill_args(sudoerstext, sudoersleng, sawspace)) + yyterminate(); + sawspace = false; + } /* a command line arg */ + YY_BREAK + +case 18: +YY_RULE_SETUP +#line 257 "toke.l" +{ + /* Only return DIGEST if the length is correct. */ + yy_size_t digest_len = + sudo_digest_getlen(digest_type); + if ((yy_size_t)sudoersleng == digest_len * 2) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("DIGEST "); + return DIGEST; + } + BEGIN INITIAL; + sudoersless(sudoersleng); + } /* hex digest */ + YY_BREAK +case 19: +YY_RULE_SETUP +#line 272 "toke.l" +{ + /* Only return DIGEST if the length is correct. */ + yy_size_t len, digest_len = + sudo_digest_getlen(digest_type); + if (sudoerstext[sudoersleng - 1] == '=') { + /* use padding */ + len = 4 * ((digest_len + 2) / 3); + } else { + /* no padding */ + len = (4 * digest_len + 2) / 3; + } + if ((yy_size_t)sudoersleng == len) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("DIGEST "); + return DIGEST; + } + BEGIN INITIAL; + sudoersless(sudoersleng); + } /* base64 digest */ + YY_BREAK +case 20: +YY_RULE_SETUP +#line 294 "toke.l" +{ + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + BEGIN GOTINC; + LEXTRACE("INCLUDE "); + return INCLUDE; + } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 306 "toke.l" +{ + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + BEGIN GOTINC; + LEXTRACE("INCLUDEDIR "); + return INCLUDEDIR; + } + YY_BREAK +case 22: +/* rule 22 can match eol */ +YY_RULE_SETUP +#line 318 "toke.l" +{ + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + /* only consume #include */ + sudoersless(sizeof("#include") - 1); + yy_set_bol(0); + + BEGIN GOTINC; + LEXTRACE("INCLUDE "); + return INCLUDE; + } + YY_BREAK +case 23: +/* rule 23 can match eol */ +YY_RULE_SETUP +#line 334 "toke.l" +{ + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + /* only consume #includedir */ + sudoersless(sizeof("#includedir") - 1); + yy_set_bol(0); + + BEGIN GOTINC; + LEXTRACE("INCLUDEDIR "); + return INCLUDEDIR; + } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 350 "toke.l" +{ + char deftype; + int n; + + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + for (n = 0; isblank((unsigned char)sudoerstext[n]); n++) + continue; + n += sizeof("Defaults") - 1; + if ((deftype = sudoerstext[n++]) != '\0') { + while (isblank((unsigned char)sudoerstext[n])) + n++; + } + BEGIN GOTDEFS; + switch (deftype) { + case ':': + sudoersless(n); + LEXTRACE("DEFAULTS_USER "); + return DEFAULTS_USER; + case '>': + sudoersless(n); + LEXTRACE("DEFAULTS_RUNAS "); + return DEFAULTS_RUNAS; + case '@': + sudoersless(n); + LEXTRACE("DEFAULTS_HOST "); + return DEFAULTS_HOST; + case '!': + sudoersless(n); + LEXTRACE("DEFAULTS_CMND "); + return DEFAULTS_CMND; + default: + LEXTRACE("DEFAULTS "); + return DEFAULTS; + } + } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 391 "toke.l" +{ + int n; + + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + for (n = 0; isblank((unsigned char)sudoerstext[n]); n++) + continue; + switch (sudoerstext[n]) { + case 'H': + LEXTRACE("HOSTALIAS "); + return HOSTALIAS; + case 'C': + LEXTRACE("CMNDALIAS "); + return CMNDALIAS; + case 'U': + LEXTRACE("USERALIAS "); + return USERALIAS; + case 'R': + LEXTRACE("RUNASALIAS "); + return RUNASALIAS; + } + } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 418 "toke.l" +{ + /* cmnd does not require passwd for this user */ + LEXTRACE("NOPASSWD "); + return NOPASSWD; + } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 424 "toke.l" +{ + /* cmnd requires passwd for this user */ + LEXTRACE("PASSWD "); + return PASSWD; + } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 430 "toke.l" +{ + LEXTRACE("NOEXEC "); + return NOEXEC; + } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 435 "toke.l" +{ + LEXTRACE("EXEC "); + return EXEC; + } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 440 "toke.l" +{ + LEXTRACE("SETENV "); + return SETENV; + } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 445 "toke.l" +{ + LEXTRACE("NOSETENV "); + return NOSETENV; + } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 450 "toke.l" +{ + LEXTRACE("LOG_OUTPUT "); + return LOG_OUTPUT; + } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 455 "toke.l" +{ + LEXTRACE("NOLOG_OUTPUT "); + return NOLOG_OUTPUT; + } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 460 "toke.l" +{ + LEXTRACE("LOG_INPUT "); + return LOG_INPUT; + } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 465 "toke.l" +{ + LEXTRACE("NOLOG_INPUT "); + return NOLOG_INPUT; + } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 470 "toke.l" +{ + LEXTRACE("MAIL "); + return MAIL; + } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 475 "toke.l" +{ + LEXTRACE("NOMAIL "); + return NOMAIL; + } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 480 "toke.l" +{ + LEXTRACE("FOLLOW "); + return FOLLOWLNK; + } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 485 "toke.l" +{ + LEXTRACE("NOFOLLOW "); + return NOFOLLOWLNK; + } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 490 "toke.l" +{ + if (sudoerstext[0] == '+') + sudoerserror(N_("empty netgroup")); + else + sudoerserror(N_("empty group")); + LEXTRACE("ERROR "); + return ERROR; + } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 499 "toke.l" +{ + /* netgroup */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NETGROUP "); + return NETGROUP; + } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 507 "toke.l" +{ + /* group */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("USERGROUP "); + return USERGROUP; + } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 515 "toke.l" +{ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + return NTWKADDR; + } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 522 "toke.l" +{ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + return NTWKADDR; + } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 529 "toke.l" +{ + if (!ipv6_valid(sudoerstext)) { + sudoerserror(N_("invalid IPv6 address")); + LEXTRACE("ERROR "); + return ERROR; + } + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + return NTWKADDR; + } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 541 "toke.l" +{ + if (!ipv6_valid(sudoerstext)) { + sudoerserror(N_("invalid IPv6 address")); + LEXTRACE("ERROR "); + return ERROR; + } + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + return NTWKADDR; + } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 553 "toke.l" +{ + LEXTRACE("ALL "); + return ALL; + + } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 559 "toke.l" +{ + LEXTRACE("CMND_TIMEOUT "); + return CMND_TIMEOUT; + } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 564 "toke.l" +{ + LEXTRACE("NOTBEFORE "); + return NOTBEFORE; + } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 569 "toke.l" +{ + LEXTRACE("NOTAFTER "); + return NOTAFTER; + } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 574 "toke.l" +{ + LEXTRACE("CWD "); + prev_state = YY_START; + BEGIN EXPECTPATH; + return CWD; + } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 581 "toke.l" +{ + LEXTRACE("CHROOT "); + prev_state = YY_START; + BEGIN EXPECTPATH; + return CHROOT; + } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 588 "toke.l" +{ +#ifdef HAVE_SELINUX + LEXTRACE("ROLE "); + return ROLE; +#else + goto got_alias; +#endif + } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 597 "toke.l" +{ +#ifdef HAVE_SELINUX + LEXTRACE("TYPE "); + return TYPE; +#else + goto got_alias; +#endif + } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 605 "toke.l" +{ +#ifdef HAVE_PRIV_SET + LEXTRACE("PRIVS "); + return PRIVS; +#else + goto got_alias; +#endif + } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 614 "toke.l" +{ +#ifdef HAVE_PRIV_SET + LEXTRACE("LIMITPRIVS "); + return LIMITPRIVS; +#else + goto got_alias; +#endif + } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 623 "toke.l" +{ + got_alias: + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("ALIAS "); + return ALIAS; + } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 631 "toke.l" +{ + /* XXX - no way to specify digest for command */ + /* no command args allowed for Defaults!/path */ + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("COMMAND "); + return COMMAND; + } + YY_BREAK +case 59: +YY_RULE_SETUP +#line 640 "toke.l" +{ + digest_type = SUDO_DIGEST_SHA224; + BEGIN WANTDIGEST; + LEXTRACE("SHA224_TOK "); + return SHA224_TOK; + } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 647 "toke.l" +{ + digest_type = SUDO_DIGEST_SHA256; + BEGIN WANTDIGEST; + LEXTRACE("SHA256_TOK "); + return SHA256_TOK; + } + YY_BREAK +case 61: +YY_RULE_SETUP +#line 654 "toke.l" +{ + digest_type = SUDO_DIGEST_SHA384; + BEGIN WANTDIGEST; + LEXTRACE("SHA384_TOK "); + return SHA384_TOK; + } + YY_BREAK +case 62: +YY_RULE_SETUP +#line 661 "toke.l" +{ + digest_type = SUDO_DIGEST_SHA512; + BEGIN WANTDIGEST; + LEXTRACE("SHA512_TOK "); + return SHA512_TOK; + } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 668 "toke.l" +{ + BEGIN GOTCMND; + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + } /* sudo -e */ + YY_BREAK +case 64: +YY_RULE_SETUP +#line 675 "toke.l" +{ + BEGIN prev_state; + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("WORD(5) "); + return WORD; + } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 683 "toke.l" +{ + /* directories can't have args... */ + if (sudoerstext[sudoersleng - 1] == '/') { + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + return COMMAND; + } + BEGIN GOTCMND; + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + } /* a pathname */ + YY_BREAK +case 66: +YY_RULE_SETUP +#line 697 "toke.l" +{ + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = YY_START; + BEGIN INSTR; + } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 704 "toke.l" +{ + /* a word */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("WORD(6) "); + return WORD; + } + YY_BREAK + +case 68: +YY_RULE_SETUP +#line 713 "toke.l" +{ + /* include file/directory */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("WORD(7) "); + return WORD; + } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 722 "toke.l" +{ + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = INITIAL; + BEGIN INSTR; + } + YY_BREAK + +case 70: +YY_RULE_SETUP +#line 730 "toke.l" +{ + LEXTRACE("( "); + return '('; + } + YY_BREAK +case 71: +YY_RULE_SETUP +#line 735 "toke.l" +{ + LEXTRACE(") "); + return ')'; + } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 740 "toke.l" +{ + LEXTRACE(", "); + return ','; + } /* return ',' */ + YY_BREAK +case 73: +YY_RULE_SETUP +#line 745 "toke.l" +{ + LEXTRACE("= "); + return '='; + } /* return '=' */ + YY_BREAK +case 74: +YY_RULE_SETUP +#line 750 "toke.l" +{ + LEXTRACE(": "); + return ':'; + } /* return ':' */ + YY_BREAK +case 75: +YY_RULE_SETUP +#line 755 "toke.l" +{ + if (sudoersleng & 1) { + LEXTRACE("!"); + return '!'; /* return '!' */ + } + } + YY_BREAK +case 76: +/* rule 76 can match eol */ +YY_RULE_SETUP +#line 762 "toke.l" +{ + if (YY_START == INSTR) { + /* re-scan after changing state */ + BEGIN INITIAL; + sudoersless(0); + sudoerserror(N_("unexpected line break in string")); + LEXTRACE("ERROR "); + return ERROR; + } + BEGIN INITIAL; + sudolineno++; + continued = false; + LEXTRACE("\n"); + return '\n'; + } /* return newline */ + YY_BREAK +case 77: +YY_RULE_SETUP +#line 778 "toke.l" +{ /* throw away space/tabs */ + sawspace = true; /* but remember for fill_args */ + } + YY_BREAK +case 78: +/* rule 78 can match eol */ +YY_RULE_SETUP +#line 782 "toke.l" +{ + sawspace = true; /* remember for fill_args */ + sudolineno++; + continued = true; + } /* throw away EOL after \ */ + YY_BREAK +case 79: +/* rule 79 can match eol */ +YY_RULE_SETUP +#line 788 "toke.l" +{ + if (sudoerstext[sudoersleng - 1] == '\n') { + /* comment ending in a newline */ + BEGIN INITIAL; + sudolineno++; + continued = false; + } else if (!feof(sudoersin)) { + sudoerserror(strerror(errno)); + LEXTRACE("ERROR "); + return ERROR; + } + LEXTRACE("#\n"); + return '\n'; + } /* comment, not uid/gid */ + YY_BREAK +case 80: +YY_RULE_SETUP +#line 803 "toke.l" +{ + LEXTRACE("NOMATCH "); + return NOMATCH; + } /* parse error, no matching token */ + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(GOTDEFS): +case YY_STATE_EOF(GOTCMND): +case YY_STATE_EOF(STARTDEFS): +case YY_STATE_EOF(INDEFS): +case YY_STATE_EOF(INSTR): +case YY_STATE_EOF(WANTDIGEST): +case YY_STATE_EOF(GOTINC): +case YY_STATE_EOF(EXPECTPATH): +#line 808 "toke.l" +{ + if (!pop_include()) + yyterminate(); + } + YY_BREAK +case 81: +YY_RULE_SETUP +#line 813 "toke.l" +ECHO; + YY_BREAK +#line 4040 "toke.c" + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed sudoersin at a new source and called + * sudoerslex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = sudoersin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( sudoerswrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * sudoerstext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of sudoerslex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + yy_size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + yy_size_t new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + sudoersrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + sudoersrestart(sudoersin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) sudoersrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + yy_state_type yy_current_state; + char *yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 1126 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); + + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 1126 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 1125); + + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + sudoersrestart(sudoersin ); + + FALLTHROUGH; + + case EOB_ACT_END_OF_FILE: + { + if ( sudoerswrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve sudoerstext */ + (yy_hold_char) = *++(yy_c_buf_p); + + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void sudoersrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + sudoersensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + sudoers_create_buffer(sudoersin,YY_BUF_SIZE ); + } + + sudoers_init_buffer(YY_CURRENT_BUFFER,input_file ); + sudoers_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void sudoers_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * sudoerspop_buffer_state(); + * sudoerspush_buffer_state(new_buffer); + */ + sudoersensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + sudoers_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (sudoerswrap()) processing, but the only time this flag + * is looked at is after sudoerswrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void sudoers_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + sudoersin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE sudoers_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) sudoersalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in sudoers_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) sudoersalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in sudoers_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + sudoers_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with sudoers_create_buffer() + * + */ + void sudoers_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + sudoersfree((void *) b->yy_ch_buf ); + + sudoersfree((void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a sudoersrestart() or at EOF. + */ + static void sudoers_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + sudoers_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then sudoers_init_buffer was _probably_ + * called from sudoersrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void sudoers_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + sudoers_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void sudoerspush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + sudoersensure_buffer_stack(); + + /* This block is copied from sudoers_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from sudoers_switch_to_buffer. */ + sudoers_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void sudoerspop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + sudoers_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + sudoers_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void sudoersensure_buffer_stack (void) +{ + yy_size_t num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)sudoersalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in sudoersensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)sudoersrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in sudoersensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE sudoers_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) sudoersalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in sudoers_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + sudoers_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to sudoerslex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * sudoers_scan_bytes() instead. + */ +YY_BUFFER_STATE sudoers_scan_string (yyconst char * yystr ) +{ + + return sudoers_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to sudoerslex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE sudoers_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + yy_size_t i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) sudoersalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in sudoers_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = sudoers_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in sudoers_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up sudoerstext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + sudoerstext[sudoersleng] = (yy_hold_char); \ + (yy_c_buf_p) = sudoerstext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + sudoersleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int sudoersget_lineno (void) +{ + + return sudoerslineno; +} + +/** Get the input stream. + * + */ +FILE *sudoersget_in (void) +{ + return sudoersin; +} + +/** Get the output stream. + * + */ +FILE *sudoersget_out (void) +{ + return sudoersout; +} + +/** Get the length of the current token. + * + */ +yy_size_t sudoersget_leng (void) +{ + return sudoersleng; +} + +/** Get the current token. + * + */ + +char *sudoersget_text (void) +{ + return sudoerstext; +} + +/** Set the current line number. + * @param line_number + * + */ +void sudoersset_lineno (int line_number ) +{ + + sudoerslineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see sudoers_switch_to_buffer + */ +void sudoersset_in (FILE * in_str ) +{ + sudoersin = in_str ; +} + +void sudoersset_out (FILE * out_str ) +{ + sudoersout = out_str ; +} + +int sudoersget_debug (void) +{ + return sudoers_flex_debug; +} + +void sudoersset_debug (int bdebug ) +{ + sudoers_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from sudoerslex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + sudoersin = stdin; + sudoersout = stdout; +#else + sudoersin = (FILE *) 0; + sudoersout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * sudoerslex_init() + */ + return 0; +} + +/* sudoerslex_destroy is for both reentrant and non-reentrant scanners. */ +int sudoerslex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + sudoers_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + sudoerspop_buffer_state(); + } + + /* Destroy the stack itself. */ + sudoersfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * sudoerslex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *sudoersalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *sudoersrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void sudoersfree (void * ptr ) +{ + free( (char *) ptr ); /* see sudoersrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 813 "toke.l" + + +struct path_list { + SLIST_ENTRY(path_list) entries; + char *path; +}; + +SLIST_HEAD(path_list_head, path_list); + +struct include_stack { + struct sudolinebuf line; + YY_BUFFER_STATE bs; + char *path; + struct path_list_head more; /* more files in case of includedir */ + int lineno; + bool keepopen; +}; + +/* + * Compare two struct path_list structs in reverse order. + */ +static int +pl_compare(const void *v1, const void *v2) +{ + const struct path_list * const *p1 = v1; + const struct path_list * const *p2 = v2; + + return strcmp((*p2)->path, (*p1)->path); +} + +/* + * Open dirpath and fill in pathsp with an array of regular files + * that do not end in '~' or contain a '.'. + * Returns the number of files or -1 on error. + * If zero files are found, NULL is stored in pathsp. + */ +static int +read_dir_files(const char *dirpath, struct path_list ***pathsp) +{ + DIR *dir; + int i, count = 0; + int max_paths = 32; + struct dirent *dent; + struct path_list **paths = NULL; + debug_decl(read_dir_files, SUDOERS_DEBUG_PARSER); + + dir = opendir(dirpath); + if (dir == NULL) { + if (errno == ENOENT) + goto done; + sudo_warn("%s", dirpath); + goto bad; + } + paths = reallocarray(NULL, max_paths, sizeof(*paths)); + if (paths == NULL) + goto oom; + while ((dent = readdir(dir)) != NULL) { + struct path_list *pl; + struct stat sb; + size_t len; + char *path; + + /* Ignore files that end in '~' or have a '.' in them. */ + if (dent->d_name[0] == '\0' || dent->d_name[NAMLEN(dent) - 1] == '~' + || strchr(dent->d_name, '.') != NULL) { + continue; + } + len = strlen(dirpath) + 1 + NAMLEN(dent); + if ((path = rcstr_alloc(len)) == NULL) + goto oom; + (void)snprintf(path, len + 1, "%s/%s", dirpath, dent->d_name); + if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) { + rcstr_delref(path); + continue; + } + pl = malloc(sizeof(*pl)); + if (pl == NULL) { + rcstr_delref(path); + goto oom; + } + pl->path = path; + if (count >= max_paths) { + struct path_list **tmp; + max_paths <<= 1; + tmp = reallocarray(paths, max_paths, sizeof(*paths)); + if (tmp == NULL) { + rcstr_delref(path); + free(pl); + goto oom; + } + paths = tmp; + } + paths[count++] = pl; + } + closedir(dir); + if (count == 0) { + free(paths); + paths = NULL; + } +done: + *pathsp = paths; + debug_return_int(count); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +bad: + sudoerserror(NULL); + if (dir != NULL) + closedir(dir); + for (i = 0; i < count; i++) { + rcstr_delref(paths[i]->path); + free(paths[i]); + } + free(paths); + debug_return_int(-1); +} + +/* + * Push a list of all files in dirpath onto stack. + * Returns the number of files or -1 on error. + */ +static int +switch_dir(struct include_stack *stack, char *dirpath) +{ + struct path_list **paths = NULL; + int count, i; + debug_decl(switch_dir, SUDOERS_DEBUG_PARSER); + + count = read_dir_files(dirpath, &paths); + if (count > 0) { + /* Sort the list as an array in reverse order. */ + qsort(paths, count, sizeof(*paths), pl_compare); + + /* Build up the list in sorted order. */ + for (i = 0; i < count; i++) { + SLIST_INSERT_HEAD(&stack->more, paths[i], entries); + } + free(paths); + } + + debug_return_int(count); +} + +#define MAX_SUDOERS_DEPTH 128 +#define SUDOERS_STACK_INCREMENT 16 + +static size_t istacksize, idepth; +static struct include_stack *istack; +static bool keepopen; + +void +init_lexer(void) +{ + struct path_list *pl; + debug_decl(init_lexer, SUDOERS_DEBUG_PARSER); + + while (idepth) { + idepth--; + while ((pl = SLIST_FIRST(&istack[idepth].more)) != NULL) { + SLIST_REMOVE_HEAD(&istack[idepth].more, entries); + rcstr_delref(pl->path); + free(pl); + } + rcstr_delref(istack[idepth].path); + if (idepth && !istack[idepth].keepopen) + fclose(istack[idepth].bs->yy_input_file); + sudoers_delete_buffer(istack[idepth].bs); + free(istack[idepth].line.buf); + } + free(istack); + istack = NULL; + istacksize = idepth = 0; + free(sudolinebuf.buf); + memset(&sudolinebuf, 0, sizeof(sudolinebuf)); + sudolineno = 1; + keepopen = false; + sawspace = false; + continued = false; + digest_type = -1; + prev_state = INITIAL; + + debug_return; +} + +/* + * Expand any embedded %h (host) escapes in the given path and makes + * a relative path fully-qualified based on the current sudoers file. + * Returns a reference-counted string. + */ +static char * +expand_include(const char *opath, size_t olen) +{ + const char *cp, *ep; + char *path, *pp; + int dirlen = 0, len; + size_t shost_len = 0; + bool subst = false; + debug_decl(expand_include, SUDOERS_DEBUG_PARSER); + + /* Strip double quotes if present. */ + if (*opath == '"') { + opath++; + olen -= 2; + } + + /* Relative paths are located in the same dir as the sudoers file. */ + if (*opath != '/') { + char *dirend = strrchr(sudoers, '/'); + if (dirend != NULL) + dirlen = (int)(dirend - sudoers) + 1; + } + + len = olen; + for (cp = opath, ep = opath + olen; cp < ep; cp++) { + if (cp[0] == '%' && cp[1] == 'h') { + shost_len = strlen(user_shost); + len += shost_len - 2; + subst = true; + } + } + + /* Make a copy of the fully-qualified path and return it. */ + path = pp = rcstr_alloc(len + dirlen); + if (path == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_str(NULL); + } + if (dirlen) { + memcpy(path, sudoers, dirlen); + pp += dirlen; + } + if (subst) { + /* substitute for %h */ + cp = opath; + while (cp < ep) { + if (cp[0] == '%' && cp[1] == 'h') { + memcpy(pp, user_shost, shost_len); + pp += shost_len; + cp += 2; + continue; + } + *pp++ = *cp++; + } + *pp = '\0'; + } else { + memcpy(pp, opath, len); + pp[len] = '\0'; + } + + debug_return_str(path); +} + +/* + * Open an include file (or file from a directory), push the old + * sudoers file buffer and switch to the new one. + * A missing or insecure include dir is simply ignored. + * Returns false on error, else true. + */ +bool +push_include(const char *opath, bool isdir) +{ + struct path_list *pl; + char *path; + FILE *fp; + debug_decl(push_include, SUDOERS_DEBUG_PARSER); + + if ((path = expand_include(opath, strlen(opath))) == NULL) + debug_return_bool(false); + + /* push current state onto stack */ + if (idepth >= istacksize) { + struct include_stack *new_istack; + + if (idepth > MAX_SUDOERS_DEPTH) { + sudoerserror(N_("too many levels of includes")); + rcstr_delref(path); + debug_return_bool(false); + } + istacksize += SUDOERS_STACK_INCREMENT; + new_istack = reallocarray(istack, istacksize, sizeof(*istack)); + if (new_istack == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + rcstr_delref(path); + debug_return_bool(false); + } + istack = new_istack; + } + SLIST_INIT(&istack[idepth].more); + if (isdir) { + struct stat sb; + int count, status; + + status = sudo_secure_dir(path, sudoers_uid, sudoers_gid, &sb); + if (status != SUDO_PATH_SECURE) { + if (sudoers_warnings) { + switch (status) { + case SUDO_PATH_BAD_TYPE: + errno = ENOTDIR; + sudo_warn("%s", path); + break; + case SUDO_PATH_WRONG_OWNER: + sudo_warnx(U_("%s is owned by uid %u, should be %u"), + path, (unsigned int) sb.st_uid, + (unsigned int) sudoers_uid); + break; + case SUDO_PATH_WORLD_WRITABLE: + sudo_warnx(U_("%s is world writable"), path); + break; + case SUDO_PATH_GROUP_WRITABLE: + sudo_warnx(U_("%s is owned by gid %u, should be %u"), + path, (unsigned int) sb.st_gid, + (unsigned int) sudoers_gid); + break; + default: + break; + } + } + /* A missing or insecure include dir is not a fatal error. */ + rcstr_delref(path); + debug_return_bool(true); + } + count = switch_dir(&istack[idepth], path); + if (count <= 0) { + /* switch_dir() called sudoerserror() for us */ + rcstr_delref(path); + debug_return_bool(count ? false : true); + } + + /* Parse the first dir entry we can open, leave the rest for later. */ + do { + rcstr_delref(path); + if ((pl = SLIST_FIRST(&istack[idepth].more)) == NULL) { + /* Unable to open any files in include dir, not an error. */ + debug_return_bool(true); + } + SLIST_REMOVE_HEAD(&istack[idepth].more, entries); + path = pl->path; + free(pl); + } while ((fp = open_sudoers(path, false, &keepopen)) == NULL); + } else { + if ((fp = open_sudoers(path, true, &keepopen)) == NULL) { + /* The error was already printed by open_sudoers() */ + sudoerserror(NULL); + rcstr_delref(path); + debug_return_bool(false); + } + } + /* Push the old (current) file and open the new one. */ + istack[idepth].path = sudoers; /* push old path (and its ref) */ + istack[idepth].line = sudolinebuf; + istack[idepth].bs = YY_CURRENT_BUFFER; + istack[idepth].lineno = sudolineno; + istack[idepth].keepopen = keepopen; + idepth++; + sudolineno = 1; + sudoers = path; + sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); + memset(&sudolinebuf, 0, sizeof(sudolinebuf)); + + debug_return_bool(true); +} + +/* + * Restore the previous sudoers file and buffer, or, in the case + * of an includedir, switch to the next file in the dir. + * Returns false if there is nothing to pop, else true. + */ +static bool +pop_include(void) +{ + struct path_list *pl; + FILE *fp; + debug_decl(pop_include, SUDOERS_DEBUG_PARSER); + + if (idepth == 0 || YY_CURRENT_BUFFER == NULL) + debug_return_bool(false); + + if (!keepopen) + fclose(YY_CURRENT_BUFFER->yy_input_file); + sudoers_delete_buffer(YY_CURRENT_BUFFER); + /* If we are in an include dir, move to the next file. */ + while ((pl = SLIST_FIRST(&istack[idepth - 1].more)) != NULL) { + SLIST_REMOVE_HEAD(&istack[idepth - 1].more, entries); + fp = open_sudoers(pl->path, false, &keepopen); + if (fp != NULL) { + sudolinebuf.len = sudolinebuf.off = 0; + sudolinebuf.toke_start = sudolinebuf.toke_end = 0; + rcstr_delref(sudoers); + sudoers = pl->path; + sudolineno = 1; + sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); + free(pl); + break; + } + /* Unable to open path in include dir, go to next one. */ + rcstr_delref(pl->path); + free(pl); + } + /* If no path list, just pop the last dir on the stack. */ + if (pl == NULL) { + idepth--; + sudoers_switch_to_buffer(istack[idepth].bs); + free(sudolinebuf.buf); + sudolinebuf = istack[idepth].line; + rcstr_delref(sudoers); + sudoers = istack[idepth].path; + sudolineno = istack[idepth].lineno; + keepopen = istack[idepth].keepopen; + } + debug_return_bool(true); +} + +#ifdef TRACELEXER +int +sudoers_trace_print(const char *msg) +{ + return fputs(msg, stderr); +} +#else +int +sudoers_trace_print(const char *msg) +{ + static bool initialized; + static struct sudo_lbuf lbuf; + + if (!initialized) { + initialized = true; + sudo_lbuf_init(&lbuf, NULL, 0, NULL, 0); + } + + sudo_lbuf_append(&lbuf, "%s", msg); + /* XXX - assumes a final newline */ + if (strchr(msg, '\n') != NULL) + { + sudo_debug_printf2(NULL, NULL, 0, SUDOERS_DEBUG_PARSER|SUDO_DEBUG_DEBUG, + "%s:%d: %s", sudoers, sudolineno, lbuf.buf); + lbuf.len = 0; + } + return 0; +} +#endif /* TRACELEXER */ + +static yy_size_t +sudoers_input(char *buf, yy_size_t max_size) +{ + size_t avail = sudolinebuf.len - sudolinebuf.off; + + /* Refill line buffer if needed. */ + if (avail == 0) { + avail = getdelim(&sudolinebuf.buf, &sudolinebuf.size, '\n', sudoersin); + if (avail == (size_t)-1) { + /* EOF or error. */ + if (ferror(sudoersin) && errno != EINTR) + YY_FATAL_ERROR("input in flex scanner failed"); + return 0; + } + + /* Add trailing newline if it is missing. */ + if (sudolinebuf.buf[avail - 1] != '\n') { + if (avail == sudolinebuf.size) { + char *cp = realloc(sudolinebuf.buf, avail + 1); + if (cp == NULL) { + YY_FATAL_ERROR("unable to allocate memory"); + return 0; + } + sudolinebuf.buf = cp; + sudolinebuf.size++; + } + sudolinebuf.buf[avail++] = '\n'; + } + + sudolinebuf.len = avail; + sudolinebuf.off = 0; + sudolinebuf.toke_start = sudolinebuf.toke_end = 0; + } + + if (avail > max_size) + avail = max_size; + memcpy(buf, sudolinebuf.buf + sudolinebuf.off, avail); + sudolinebuf.off += avail; + + return avail; +} + diff --git a/plugins/sudoers/toke.h b/plugins/sudoers/toke.h new file mode 100644 index 0000000..476fb95 --- /dev/null +++ b/plugins/sudoers/toke.h @@ -0,0 +1,53 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2013, 2015-2016, 2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_TOKE_H +#define SUDOERS_TOKE_H + +struct sudolinebuf { + char *buf; /* line buffer */ + size_t size; /* size of buffer */ + size_t len; /* used length */ + size_t off; /* consumed length */ + size_t toke_start; /* starting column of current token */ + size_t toke_end; /* ending column of current token */ +}; +extern struct sudolinebuf sudolinebuf; + +bool append(const char *, size_t); +bool fill_args(const char *, size_t, int); +bool fill_cmnd(const char *, size_t); +bool fill_txt(const char *, size_t, size_t); +bool ipv6_valid(const char *s); +int sudoers_trace_print(const char *); +void sudoerserrorf(const char *, ...) __printf0like(1, 2); +void sudoerserror(const char *); +bool push_include(const char *, bool); + +#ifndef FLEX_SCANNER +extern int (*trace_print)(const char *msg); +#endif + +#define fill(a, b) fill_txt(a, b, 0) + +#define LEXTRACE(msg) do { \ + if (trace_print != NULL) \ + (*trace_print)(msg); \ +} while (0); + +#endif /* SUDOERS_TOKE_H */ diff --git a/plugins/sudoers/toke.l b/plugins/sudoers/toke.l new file mode 100644 index 0000000..cf5a7d4 --- /dev/null +++ b/plugins/sudoers/toke.l @@ -0,0 +1,1295 @@ +%{ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2020 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#include + +#include +#include +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include +#include +#include "sudoers.h" +#include "toke.h" +#include +#include "sudo_digest.h" +#include "sudo_lbuf.h" + +#if defined(HAVE_STRUCT_DIRENT_D_NAMLEN) && HAVE_STRUCT_DIRENT_D_NAMLEN +# define NAMLEN(dirent) (dirent)->d_namlen +#else +# define NAMLEN(dirent) strlen((dirent)->d_name) +#endif + +// PVS Studio suppression +// -V::519, 1004, 1037 + +int sudolineno; /* current sudoers line number. */ +char *sudoers; /* sudoers file being parsed. */ +struct sudolinebuf sudolinebuf; /* sudoers line being parsed. */ + +/* Default sudoers path, mode and owner (may be set via sudo.conf) */ +const char *sudoers_file = _PATH_SUDOERS; +mode_t sudoers_mode = SUDOERS_MODE; +uid_t sudoers_uid = SUDOERS_UID; +gid_t sudoers_gid = SUDOERS_GID; + +static bool continued, sawspace; +static int prev_state; +static int digest_type = -1; + +static bool pop_include(void); +static yy_size_t sudoers_input(char *buf, yy_size_t max_size); + +int (*trace_print)(const char *msg) = sudoers_trace_print; + +#define ECHO ignore_result(fwrite(sudoerstext, sudoersleng, 1, sudoersout)) + +#define YY_INPUT(buf, result, max_size) (result) = sudoers_input(buf, max_size) + +#define YY_USER_ACTION do { \ + sudolinebuf.toke_start = sudolinebuf.toke_end; \ + sudolinebuf.toke_end += sudoersleng; \ +} while (0); + +#define sudoersless(n) do { \ + sudolinebuf.toke_end = sudolinebuf.toke_start + (n); \ + yyless(n); \ +} while (0); + +%} + +HEX16 [0-9A-Fa-f]{1,4} +OCTET (1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]) +IPV4ADDR {OCTET}(\.{OCTET}){3} +IPV6ADDR ({HEX16}?:){2,7}{HEX16}?|({HEX16}?:){2,6}:{IPV4ADDR} + +HOSTNAME [[:alnum:]_-]+ +WORD ([^#>!=:,\(\) \t\r\n\\\"]|\\[^\t\n])+ +ID #-?[0-9]+ +PATH \/(\\[\,:= \t#]|[^\,:=\\ \t\r\n#])+ +ENVAR ([^#!=, \t\r\n\\\"]|\\[^\r\n])([^#=, \t\r\n\\\"]|\\[^\r\n])* +DEFVAR [a-z_]+ + +%option noinput +%option nounput +%option noyywrap +%option prefix="sudoers" + +%s GOTDEFS +%x GOTCMND +%x STARTDEFS +%x INDEFS +%x INSTR +%s WANTDIGEST +%x GOTINC +%s EXPECTPATH + +%% +[[:blank:]]*,[[:blank:]]* { + LEXTRACE(", "); + return ','; + } /* return ',' */ + +[[:blank:]]+ BEGIN STARTDEFS; + +{DEFVAR} { + BEGIN INDEFS; + LEXTRACE("DEFVAR "); + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + return DEFVAR; + } + +{ + , { + BEGIN STARTDEFS; + LEXTRACE(", "); + return ','; + } /* return ',' */ + + = { + LEXTRACE("= "); + return '='; + } /* return '=' */ + + \+= { + LEXTRACE("+= "); + return '+'; + } /* return '+' */ + + -= { + LEXTRACE("-= "); + return '-'; + } /* return '-' */ + + \" { + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = YY_START; + BEGIN INSTR; + } + + {ENVAR} { + LEXTRACE("WORD(2) "); + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + return WORD; + } +} + +{ + \\[[:blank:]]*\r?\n[[:blank:]]* { + /* Line continuation char followed by newline. */ + sudolineno++; + continued = true; + } + + \" { + LEXTRACE("ENDSTR "); + BEGIN prev_state; + + if (sudoerslval.string == NULL) { + sudoerserror(N_("empty string")); + LEXTRACE("ERROR "); + return ERROR; + } + if (prev_state == INITIAL || prev_state == GOTDEFS) { + switch (sudoerslval.string[0]) { + case '%': + if (sudoerslval.string[1] == '\0' || + (sudoerslval.string[1] == ':' && + sudoerslval.string[2] == '\0')) { + sudoerserror(N_("empty group")); + LEXTRACE("ERROR "); + return ERROR; + } + LEXTRACE("USERGROUP "); + return USERGROUP; + case '+': + if (sudoerslval.string[1] == '\0') { + sudoerserror(N_("empty netgroup")); + LEXTRACE("ERROR "); + return ERROR; + } + LEXTRACE("NETGROUP "); + return NETGROUP; + } + } + LEXTRACE("WORD(4) "); + return WORD; + } + + \\ { + LEXTRACE("BACKSLASH "); + if (!append(sudoerstext, sudoersleng)) + yyterminate(); + } + + ([^\"\r\n\\]|\\\")+ { + LEXTRACE("STRBODY "); + if (!append(sudoerstext, sudoersleng)) + yyterminate(); + } +} + +{ + \\[\*\?\[\]\!] { + /* quoted fnmatch glob char, pass verbatim */ + LEXTRACE("QUOTEDCHAR "); + if (!fill_args(sudoerstext, 2, sawspace)) + yyterminate(); + sawspace = false; + } + + \\[:\\,= \t#] { + /* quoted sudoers special char, strip backslash */ + LEXTRACE("QUOTEDCHAR "); + if (!fill_args(sudoerstext + 1, 1, sawspace)) + yyterminate(); + sawspace = false; + } + + [#:\,=\r\n] { + BEGIN INITIAL; + sudoersless(0); + yy_set_bol(0); + return COMMAND; + } /* end of command line args */ + + [^#\\:, \t\r\n]+ { + LEXTRACE("ARG "); + if (!fill_args(sudoerstext, sudoersleng, sawspace)) + yyterminate(); + sawspace = false; + } /* a command line arg */ +} + +[[:xdigit:]]+ { + /* Only return DIGEST if the length is correct. */ + yy_size_t digest_len = + sudo_digest_getlen(digest_type); + if ((yy_size_t)sudoersleng == digest_len * 2) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("DIGEST "); + return DIGEST; + } + BEGIN INITIAL; + sudoersless(sudoersleng); + } /* hex digest */ + +[A-Za-z0-9\+/=]+ { + /* Only return DIGEST if the length is correct. */ + yy_size_t len, digest_len = + sudo_digest_getlen(digest_type); + if (sudoerstext[sudoersleng - 1] == '=') { + /* use padding */ + len = 4 * ((digest_len + 2) / 3); + } else { + /* no padding */ + len = (4 * digest_len + 2) / 3; + } + if ((yy_size_t)sudoersleng == len) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("DIGEST "); + return DIGEST; + } + BEGIN INITIAL; + sudoersless(sudoersleng); + } /* base64 digest */ + +@include { + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + BEGIN GOTINC; + LEXTRACE("INCLUDE "); + return INCLUDE; + } + +@includedir { + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + BEGIN GOTINC; + LEXTRACE("INCLUDEDIR "); + return INCLUDEDIR; + } + +^#include[[:blank:]]+.*(\r\n|\n)? { + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + /* only consume #include */ + sudoersless(sizeof("#include") - 1); + yy_set_bol(0); + + BEGIN GOTINC; + LEXTRACE("INCLUDE "); + return INCLUDE; + } + +^#includedir[[:blank:]]+.*(\r\n|\n)? { + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + /* only consume #includedir */ + sudoersless(sizeof("#includedir") - 1); + yy_set_bol(0); + + BEGIN GOTINC; + LEXTRACE("INCLUDEDIR "); + return INCLUDEDIR; + } + +^[[:blank:]]*Defaults([:@>\!][[:blank:]]*\!*\"?({ID}|{WORD}))? { + char deftype; + int n; + + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + for (n = 0; isblank((unsigned char)sudoerstext[n]); n++) + continue; + n += sizeof("Defaults") - 1; + if ((deftype = sudoerstext[n++]) != '\0') { + while (isblank((unsigned char)sudoerstext[n])) + n++; + } + BEGIN GOTDEFS; + switch (deftype) { + case ':': + sudoersless(n); + LEXTRACE("DEFAULTS_USER "); + return DEFAULTS_USER; + case '>': + sudoersless(n); + LEXTRACE("DEFAULTS_RUNAS "); + return DEFAULTS_RUNAS; + case '@': + sudoersless(n); + LEXTRACE("DEFAULTS_HOST "); + return DEFAULTS_HOST; + case '!': + sudoersless(n); + LEXTRACE("DEFAULTS_CMND "); + return DEFAULTS_CMND; + default: + LEXTRACE("DEFAULTS "); + return DEFAULTS; + } + } + +^[[:blank:]]*(Host|Cmnd|Cmd|User|Runas)_Alias { + int n; + + if (continued) { + sudoerserror(N_("invalid line continuation")); + LEXTRACE("ERROR "); + return ERROR; + } + + for (n = 0; isblank((unsigned char)sudoerstext[n]); n++) + continue; + switch (sudoerstext[n]) { + case 'H': + LEXTRACE("HOSTALIAS "); + return HOSTALIAS; + case 'C': + LEXTRACE("CMNDALIAS "); + return CMNDALIAS; + case 'U': + LEXTRACE("USERALIAS "); + return USERALIAS; + case 'R': + LEXTRACE("RUNASALIAS "); + return RUNASALIAS; + } + } + +NOPASSWD[[:blank:]]*: { + /* cmnd does not require passwd for this user */ + LEXTRACE("NOPASSWD "); + return NOPASSWD; + } + +PASSWD[[:blank:]]*: { + /* cmnd requires passwd for this user */ + LEXTRACE("PASSWD "); + return PASSWD; + } + +NOEXEC[[:blank:]]*: { + LEXTRACE("NOEXEC "); + return NOEXEC; + } + +EXEC[[:blank:]]*: { + LEXTRACE("EXEC "); + return EXEC; + } + +SETENV[[:blank:]]*: { + LEXTRACE("SETENV "); + return SETENV; + } + +NOSETENV[[:blank:]]*: { + LEXTRACE("NOSETENV "); + return NOSETENV; + } + +LOG_OUTPUT[[:blank:]]*: { + LEXTRACE("LOG_OUTPUT "); + return LOG_OUTPUT; + } + +NOLOG_OUTPUT[[:blank:]]*: { + LEXTRACE("NOLOG_OUTPUT "); + return NOLOG_OUTPUT; + } + +LOG_INPUT[[:blank:]]*: { + LEXTRACE("LOG_INPUT "); + return LOG_INPUT; + } + +NOLOG_INPUT[[:blank:]]*: { + LEXTRACE("NOLOG_INPUT "); + return NOLOG_INPUT; + } + +MAIL[[:blank:]]*: { + LEXTRACE("MAIL "); + return MAIL; + } + +NOMAIL[[:blank:]]*: { + LEXTRACE("NOMAIL "); + return NOMAIL; + } + +FOLLOW[[:blank:]]*: { + LEXTRACE("FOLLOW "); + return FOLLOWLNK; + } + +NOFOLLOW[[:blank:]]*: { + LEXTRACE("NOFOLLOW "); + return NOFOLLOWLNK; + } + +(\+|\%|\%:) { + if (sudoerstext[0] == '+') + sudoerserror(N_("empty netgroup")); + else + sudoerserror(N_("empty group")); + LEXTRACE("ERROR "); + return ERROR; + } + +\+{WORD} { + /* netgroup */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NETGROUP "); + return NETGROUP; + } + +\%:?({WORD}|{ID}) { + /* group */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("USERGROUP "); + return USERGROUP; + } + +{IPV4ADDR}(\/{IPV4ADDR})? { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + return NTWKADDR; + } + +{IPV4ADDR}\/([12]?[0-9]|3[0-2]) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + return NTWKADDR; + } + +{IPV6ADDR}(\/{IPV6ADDR})? { + if (!ipv6_valid(sudoerstext)) { + sudoerserror(N_("invalid IPv6 address")); + LEXTRACE("ERROR "); + return ERROR; + } + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + return NTWKADDR; + } + +{IPV6ADDR}\/([0-9]|[1-9][0-9]|1[01][0-9]|12[0-8]) { + if (!ipv6_valid(sudoerstext)) { + sudoerserror(N_("invalid IPv6 address")); + LEXTRACE("ERROR "); + return ERROR; + } + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + return NTWKADDR; + } + +ALL { + LEXTRACE("ALL "); + return ALL; + + } + +TIMEOUT { + LEXTRACE("CMND_TIMEOUT "); + return CMND_TIMEOUT; + } + +NOTBEFORE { + LEXTRACE("NOTBEFORE "); + return NOTBEFORE; + } + +NOTAFTER { + LEXTRACE("NOTAFTER "); + return NOTAFTER; + } + +CWD { + LEXTRACE("CWD "); + prev_state = YY_START; + BEGIN EXPECTPATH; + return CWD; + } + +CHROOT { + LEXTRACE("CHROOT "); + prev_state = YY_START; + BEGIN EXPECTPATH; + return CHROOT; + } + +ROLE { +#ifdef HAVE_SELINUX + LEXTRACE("ROLE "); + return ROLE; +#else + goto got_alias; +#endif + } + +TYPE { +#ifdef HAVE_SELINUX + LEXTRACE("TYPE "); + return TYPE; +#else + goto got_alias; +#endif + } +PRIVS { +#ifdef HAVE_PRIV_SET + LEXTRACE("PRIVS "); + return PRIVS; +#else + goto got_alias; +#endif + } + +LIMITPRIVS { +#ifdef HAVE_PRIV_SET + LEXTRACE("LIMITPRIVS "); + return LIMITPRIVS; +#else + goto got_alias; +#endif + } + +[[:upper:]][[:upper:][:digit:]_]* { + got_alias: + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("ALIAS "); + return ALIAS; + } + +({PATH}|sudoedit) { + /* XXX - no way to specify digest for command */ + /* no command args allowed for Defaults!/path */ + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("COMMAND "); + return COMMAND; + } + +sha224 { + digest_type = SUDO_DIGEST_SHA224; + BEGIN WANTDIGEST; + LEXTRACE("SHA224_TOK "); + return SHA224_TOK; + } + +sha256 { + digest_type = SUDO_DIGEST_SHA256; + BEGIN WANTDIGEST; + LEXTRACE("SHA256_TOK "); + return SHA256_TOK; + } + +sha384 { + digest_type = SUDO_DIGEST_SHA384; + BEGIN WANTDIGEST; + LEXTRACE("SHA384_TOK "); + return SHA384_TOK; + } + +sha512 { + digest_type = SUDO_DIGEST_SHA512; + BEGIN WANTDIGEST; + LEXTRACE("SHA512_TOK "); + return SHA512_TOK; + } + +sudoedit { + BEGIN GOTCMND; + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + } /* sudo -e */ + +({PATH}|{WORD}) { + BEGIN prev_state; + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("WORD(5) "); + return WORD; + } + +{PATH} { + /* directories can't have args... */ + if (sudoerstext[sudoersleng - 1] == '/') { + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + return COMMAND; + } + BEGIN GOTCMND; + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + } /* a pathname */ + +\" { + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = YY_START; + BEGIN INSTR; + } + +({ID}|{WORD}) { + /* a word */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("WORD(6) "); + return WORD; + } + +{ + [^\"[:space:]]([^[:space:]]|\\[[:blank:]])* { + /* include file/directory */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("WORD(7) "); + return WORD; + } + + \" { + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = INITIAL; + BEGIN INSTR; + } +} + +\( { + LEXTRACE("( "); + return '('; + } + +\) { + LEXTRACE(") "); + return ')'; + } + +, { + LEXTRACE(", "); + return ','; + } /* return ',' */ + += { + LEXTRACE("= "); + return '='; + } /* return '=' */ + +: { + LEXTRACE(": "); + return ':'; + } /* return ':' */ + +<*>!+ { + if (sudoersleng & 1) { + LEXTRACE("!"); + return '!'; /* return '!' */ + } + } + +<*>\r?\n { + if (YY_START == INSTR) { + /* re-scan after changing state */ + BEGIN INITIAL; + sudoersless(0); + sudoerserror(N_("unexpected line break in string")); + LEXTRACE("ERROR "); + return ERROR; + } + BEGIN INITIAL; + sudolineno++; + continued = false; + LEXTRACE("\n"); + return '\n'; + } /* return newline */ + +<*>[[:blank:]]+ { /* throw away space/tabs */ + sawspace = true; /* but remember for fill_args */ + } + +<*>\\[[:blank:]]*\r?\n { + sawspace = true; /* remember for fill_args */ + sudolineno++; + continued = true; + } /* throw away EOL after \ */ + +#(-[^\r\n0-9].*|[^\r\n0-9-].*)?(\r\n|\n)? { + if (sudoerstext[sudoersleng - 1] == '\n') { + /* comment ending in a newline */ + BEGIN INITIAL; + sudolineno++; + continued = false; + } else if (!feof(sudoersin)) { + sudoerserror(strerror(errno)); + LEXTRACE("ERROR "); + return ERROR; + } + LEXTRACE("#\n"); + return '\n'; + } /* comment, not uid/gid */ + +<*>. { + LEXTRACE("NOMATCH "); + return NOMATCH; + } /* parse error, no matching token */ + +<*><> { + if (!pop_include()) + yyterminate(); + } + +%% +struct path_list { + SLIST_ENTRY(path_list) entries; + char *path; +}; + +SLIST_HEAD(path_list_head, path_list); + +struct include_stack { + struct sudolinebuf line; + YY_BUFFER_STATE bs; + char *path; + struct path_list_head more; /* more files in case of includedir */ + int lineno; + bool keepopen; +}; + +/* + * Compare two struct path_list structs in reverse order. + */ +static int +pl_compare(const void *v1, const void *v2) +{ + const struct path_list * const *p1 = v1; + const struct path_list * const *p2 = v2; + + return strcmp((*p2)->path, (*p1)->path); +} + +/* + * Open dirpath and fill in pathsp with an array of regular files + * that do not end in '~' or contain a '.'. + * Returns the number of files or -1 on error. + * If zero files are found, NULL is stored in pathsp. + */ +static int +read_dir_files(const char *dirpath, struct path_list ***pathsp) +{ + DIR *dir; + int i, count = 0; + int max_paths = 32; + struct dirent *dent; + struct path_list **paths = NULL; + debug_decl(read_dir_files, SUDOERS_DEBUG_PARSER); + + dir = opendir(dirpath); + if (dir == NULL) { + if (errno == ENOENT) + goto done; + sudo_warn("%s", dirpath); + goto bad; + } + paths = reallocarray(NULL, max_paths, sizeof(*paths)); + if (paths == NULL) + goto oom; + while ((dent = readdir(dir)) != NULL) { + struct path_list *pl; + struct stat sb; + size_t len; + char *path; + + /* Ignore files that end in '~' or have a '.' in them. */ + if (dent->d_name[0] == '\0' || dent->d_name[NAMLEN(dent) - 1] == '~' + || strchr(dent->d_name, '.') != NULL) { + continue; + } + len = strlen(dirpath) + 1 + NAMLEN(dent); + if ((path = rcstr_alloc(len)) == NULL) + goto oom; + (void)snprintf(path, len + 1, "%s/%s", dirpath, dent->d_name); + if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) { + rcstr_delref(path); + continue; + } + pl = malloc(sizeof(*pl)); + if (pl == NULL) { + rcstr_delref(path); + goto oom; + } + pl->path = path; + if (count >= max_paths) { + struct path_list **tmp; + max_paths <<= 1; + tmp = reallocarray(paths, max_paths, sizeof(*paths)); + if (tmp == NULL) { + rcstr_delref(path); + free(pl); + goto oom; + } + paths = tmp; + } + paths[count++] = pl; + } + closedir(dir); + if (count == 0) { + free(paths); + paths = NULL; + } +done: + *pathsp = paths; + debug_return_int(count); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +bad: + sudoerserror(NULL); + if (dir != NULL) + closedir(dir); + for (i = 0; i < count; i++) { + rcstr_delref(paths[i]->path); + free(paths[i]); + } + free(paths); + debug_return_int(-1); +} + +/* + * Push a list of all files in dirpath onto stack. + * Returns the number of files or -1 on error. + */ +static int +switch_dir(struct include_stack *stack, char *dirpath) +{ + struct path_list **paths = NULL; + int count, i; + debug_decl(switch_dir, SUDOERS_DEBUG_PARSER); + + count = read_dir_files(dirpath, &paths); + if (count > 0) { + /* Sort the list as an array in reverse order. */ + qsort(paths, count, sizeof(*paths), pl_compare); + + /* Build up the list in sorted order. */ + for (i = 0; i < count; i++) { + SLIST_INSERT_HEAD(&stack->more, paths[i], entries); + } + free(paths); + } + + debug_return_int(count); +} + +#define MAX_SUDOERS_DEPTH 128 +#define SUDOERS_STACK_INCREMENT 16 + +static size_t istacksize, idepth; +static struct include_stack *istack; +static bool keepopen; + +void +init_lexer(void) +{ + struct path_list *pl; + debug_decl(init_lexer, SUDOERS_DEBUG_PARSER); + + while (idepth) { + idepth--; + while ((pl = SLIST_FIRST(&istack[idepth].more)) != NULL) { + SLIST_REMOVE_HEAD(&istack[idepth].more, entries); + rcstr_delref(pl->path); + free(pl); + } + rcstr_delref(istack[idepth].path); + if (idepth && !istack[idepth].keepopen) + fclose(istack[idepth].bs->yy_input_file); + sudoers_delete_buffer(istack[idepth].bs); + free(istack[idepth].line.buf); + } + free(istack); + istack = NULL; + istacksize = idepth = 0; + free(sudolinebuf.buf); + memset(&sudolinebuf, 0, sizeof(sudolinebuf)); + sudolineno = 1; + keepopen = false; + sawspace = false; + continued = false; + digest_type = -1; + prev_state = INITIAL; + + debug_return; +} + +/* + * Expand any embedded %h (host) escapes in the given path and makes + * a relative path fully-qualified based on the current sudoers file. + * Returns a reference-counted string. + */ +static char * +expand_include(const char *opath, size_t olen) +{ + const char *cp, *ep; + char *path, *pp; + int dirlen = 0, len; + size_t shost_len = 0; + bool subst = false; + debug_decl(expand_include, SUDOERS_DEBUG_PARSER); + + /* Strip double quotes if present. */ + if (*opath == '"') { + opath++; + olen -= 2; + } + + /* Relative paths are located in the same dir as the sudoers file. */ + if (*opath != '/') { + char *dirend = strrchr(sudoers, '/'); + if (dirend != NULL) + dirlen = (int)(dirend - sudoers) + 1; + } + + len = olen; + for (cp = opath, ep = opath + olen; cp < ep; cp++) { + if (cp[0] == '%' && cp[1] == 'h') { + shost_len = strlen(user_shost); + len += shost_len - 2; + subst = true; + } + } + + /* Make a copy of the fully-qualified path and return it. */ + path = pp = rcstr_alloc(len + dirlen); + if (path == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_str(NULL); + } + if (dirlen) { + memcpy(path, sudoers, dirlen); + pp += dirlen; + } + if (subst) { + /* substitute for %h */ + cp = opath; + while (cp < ep) { + if (cp[0] == '%' && cp[1] == 'h') { + memcpy(pp, user_shost, shost_len); + pp += shost_len; + cp += 2; + continue; + } + *pp++ = *cp++; + } + *pp = '\0'; + } else { + memcpy(pp, opath, len); + pp[len] = '\0'; + } + + debug_return_str(path); +} + +/* + * Open an include file (or file from a directory), push the old + * sudoers file buffer and switch to the new one. + * A missing or insecure include dir is simply ignored. + * Returns false on error, else true. + */ +bool +push_include(const char *opath, bool isdir) +{ + struct path_list *pl; + char *path; + FILE *fp; + debug_decl(push_include, SUDOERS_DEBUG_PARSER); + + if ((path = expand_include(opath, strlen(opath))) == NULL) + debug_return_bool(false); + + /* push current state onto stack */ + if (idepth >= istacksize) { + struct include_stack *new_istack; + + if (idepth > MAX_SUDOERS_DEPTH) { + sudoerserror(N_("too many levels of includes")); + rcstr_delref(path); + debug_return_bool(false); + } + istacksize += SUDOERS_STACK_INCREMENT; + new_istack = reallocarray(istack, istacksize, sizeof(*istack)); + if (new_istack == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + rcstr_delref(path); + debug_return_bool(false); + } + istack = new_istack; + } + SLIST_INIT(&istack[idepth].more); + if (isdir) { + struct stat sb; + int count, status; + + status = sudo_secure_dir(path, sudoers_uid, sudoers_gid, &sb); + if (status != SUDO_PATH_SECURE) { + if (sudoers_warnings) { + switch (status) { + case SUDO_PATH_BAD_TYPE: + errno = ENOTDIR; + sudo_warn("%s", path); + break; + case SUDO_PATH_WRONG_OWNER: + sudo_warnx(U_("%s is owned by uid %u, should be %u"), + path, (unsigned int) sb.st_uid, + (unsigned int) sudoers_uid); + break; + case SUDO_PATH_WORLD_WRITABLE: + sudo_warnx(U_("%s is world writable"), path); + break; + case SUDO_PATH_GROUP_WRITABLE: + sudo_warnx(U_("%s is owned by gid %u, should be %u"), + path, (unsigned int) sb.st_gid, + (unsigned int) sudoers_gid); + break; + default: + break; + } + } + /* A missing or insecure include dir is not a fatal error. */ + rcstr_delref(path); + debug_return_bool(true); + } + count = switch_dir(&istack[idepth], path); + if (count <= 0) { + /* switch_dir() called sudoerserror() for us */ + rcstr_delref(path); + debug_return_bool(count ? false : true); + } + + /* Parse the first dir entry we can open, leave the rest for later. */ + do { + rcstr_delref(path); + if ((pl = SLIST_FIRST(&istack[idepth].more)) == NULL) { + /* Unable to open any files in include dir, not an error. */ + debug_return_bool(true); + } + SLIST_REMOVE_HEAD(&istack[idepth].more, entries); + path = pl->path; + free(pl); + } while ((fp = open_sudoers(path, false, &keepopen)) == NULL); + } else { + if ((fp = open_sudoers(path, true, &keepopen)) == NULL) { + /* The error was already printed by open_sudoers() */ + sudoerserror(NULL); + rcstr_delref(path); + debug_return_bool(false); + } + } + /* Push the old (current) file and open the new one. */ + istack[idepth].path = sudoers; /* push old path (and its ref) */ + istack[idepth].line = sudolinebuf; + istack[idepth].bs = YY_CURRENT_BUFFER; + istack[idepth].lineno = sudolineno; + istack[idepth].keepopen = keepopen; + idepth++; + sudolineno = 1; + sudoers = path; + sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); + memset(&sudolinebuf, 0, sizeof(sudolinebuf)); + + debug_return_bool(true); +} + +/* + * Restore the previous sudoers file and buffer, or, in the case + * of an includedir, switch to the next file in the dir. + * Returns false if there is nothing to pop, else true. + */ +static bool +pop_include(void) +{ + struct path_list *pl; + FILE *fp; + debug_decl(pop_include, SUDOERS_DEBUG_PARSER); + + if (idepth == 0 || YY_CURRENT_BUFFER == NULL) + debug_return_bool(false); + + if (!keepopen) + fclose(YY_CURRENT_BUFFER->yy_input_file); + sudoers_delete_buffer(YY_CURRENT_BUFFER); + /* If we are in an include dir, move to the next file. */ + while ((pl = SLIST_FIRST(&istack[idepth - 1].more)) != NULL) { + SLIST_REMOVE_HEAD(&istack[idepth - 1].more, entries); + fp = open_sudoers(pl->path, false, &keepopen); + if (fp != NULL) { + sudolinebuf.len = sudolinebuf.off = 0; + sudolinebuf.toke_start = sudolinebuf.toke_end = 0; + rcstr_delref(sudoers); + sudoers = pl->path; + sudolineno = 1; + sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); + free(pl); + break; + } + /* Unable to open path in include dir, go to next one. */ + rcstr_delref(pl->path); + free(pl); + } + /* If no path list, just pop the last dir on the stack. */ + if (pl == NULL) { + idepth--; + sudoers_switch_to_buffer(istack[idepth].bs); + free(sudolinebuf.buf); + sudolinebuf = istack[idepth].line; + rcstr_delref(sudoers); + sudoers = istack[idepth].path; + sudolineno = istack[idepth].lineno; + keepopen = istack[idepth].keepopen; + } + debug_return_bool(true); +} + +#ifdef TRACELEXER +int +sudoers_trace_print(const char *msg) +{ + return fputs(msg, stderr); +} +#else +int +sudoers_trace_print(const char *msg) +{ + static bool initialized; + static struct sudo_lbuf lbuf; + + if (!initialized) { + initialized = true; + sudo_lbuf_init(&lbuf, NULL, 0, NULL, 0); + } + + sudo_lbuf_append(&lbuf, "%s", msg); + /* XXX - assumes a final newline */ + if (strchr(msg, '\n') != NULL) + { + sudo_debug_printf2(NULL, NULL, 0, SUDOERS_DEBUG_PARSER|SUDO_DEBUG_DEBUG, + "%s:%d: %s", sudoers, sudolineno, lbuf.buf); + lbuf.len = 0; + } + return 0; +} +#endif /* TRACELEXER */ + +static yy_size_t +sudoers_input(char *buf, yy_size_t max_size) +{ + size_t avail = sudolinebuf.len - sudolinebuf.off; + + /* Refill line buffer if needed. */ + if (avail == 0) { + avail = getdelim(&sudolinebuf.buf, &sudolinebuf.size, '\n', sudoersin); + if (avail == (size_t)-1) { + /* EOF or error. */ + if (ferror(sudoersin) && errno != EINTR) + YY_FATAL_ERROR("input in flex scanner failed"); + return 0; + } + + /* Add trailing newline if it is missing. */ + if (sudolinebuf.buf[avail - 1] != '\n') { + if (avail == sudolinebuf.size) { + char *cp = realloc(sudolinebuf.buf, avail + 1); + if (cp == NULL) { + YY_FATAL_ERROR("unable to allocate memory"); + return 0; + } + sudolinebuf.buf = cp; + sudolinebuf.size++; + } + sudolinebuf.buf[avail++] = '\n'; + } + + sudolinebuf.len = avail; + sudolinebuf.off = 0; + sudolinebuf.toke_start = sudolinebuf.toke_end = 0; + } + + if (avail > max_size) + avail = max_size; + memcpy(buf, sudolinebuf.buf + sudolinebuf.off, avail); + sudolinebuf.off += avail; + + return avail; +} diff --git a/plugins/sudoers/toke_util.c b/plugins/sudoers/toke_util.c new file mode 100644 index 0000000..5307666 --- /dev/null +++ b/plugins/sudoers/toke_util.c @@ -0,0 +1,203 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2016 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include + +#include "sudoers.h" +#include "toke.h" +#include + +static unsigned int arg_len = 0; +static unsigned int arg_size = 0; + +bool +fill_txt(const char *src, size_t len, size_t olen) +{ + char *dst; + int h; + debug_decl(fill_txt, SUDOERS_DEBUG_PARSER); + + dst = olen ? realloc(sudoerslval.string, olen + len + 1) : malloc(len + 1); + if (dst == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_bool(false); + } + sudoerslval.string = dst; + + /* Copy the string and collapse any escaped characters. */ + dst += olen; + while (len--) { + if (*src == '\\' && len) { + if (src[1] == 'x' && len >= 3 && (h = hexchar(src + 2)) != -1) { + *dst++ = h; + src += 4; + len -= 3; + } else { + src++; + len--; + *dst++ = *src++; + } + } else { + *dst++ = *src++; + } + } + *dst = '\0'; + debug_return_bool(true); +} + +bool +append(const char *src, size_t len) +{ + int olen = 0; + debug_decl(append, SUDOERS_DEBUG_PARSER); + + if (sudoerslval.string != NULL) + olen = strlen(sudoerslval.string); + + debug_return_bool(fill_txt(src, len, olen)); +} + +#define SPECIAL(c) \ + ((c) == ',' || (c) == ':' || (c) == '=' || (c) == ' ' || (c) == '\t' || (c) == '#') + +bool +fill_cmnd(const char *src, size_t len) +{ + char *dst; + size_t i; + debug_decl(fill_cmnd, SUDOERS_DEBUG_PARSER); + + arg_len = arg_size = 0; + + dst = sudoerslval.command.cmnd = malloc(len + 1); + if (dst == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_bool(false); + } + sudoerslval.command.args = NULL; + + /* Copy the string and collapse any escaped sudo-specific characters. */ + for (i = 0; i < len; i++) { + if (src[i] == '\\' && i != len - 1 && SPECIAL(src[i + 1])) + *dst++ = src[++i]; + else + *dst++ = src[i]; + } + *dst = '\0'; + + /* Check for sudoedit specified as a fully-qualified path. */ + if ((dst = strrchr(sudoerslval.command.cmnd, '/')) != NULL) { // -V575 + if (strcmp(dst, "/sudoedit") == 0) { + if (sudoers_strict) { + sudoerserror( + N_("sudoedit should not be specified with a path")); + } + free(sudoerslval.command.cmnd); + if ((sudoerslval.command.cmnd = strdup("sudoedit")) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } + } + + debug_return_bool(true); +} + +bool +fill_args(const char *s, size_t len, int addspace) +{ + unsigned int new_len; + char *p; + debug_decl(fill_args, SUDOERS_DEBUG_PARSER); + + if (arg_size == 0) { + addspace = 0; + new_len = len; + } else + new_len = arg_len + len + addspace; + + if (new_len >= arg_size) { + /* Allocate in increments of 128 bytes to avoid excessive realloc(). */ + arg_size = (new_len + 1 + 127) & ~127; + + p = realloc(sudoerslval.command.args, arg_size); + if (p == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } else + sudoerslval.command.args = p; + } + + /* Efficiently append the arg (with a leading space if needed). */ + p = sudoerslval.command.args + arg_len; + if (addspace) + *p++ = ' '; + len = arg_size - (p - sudoerslval.command.args); + if (strlcpy(p, s, len) >= len) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto bad; + } + arg_len = new_len; + debug_return_bool(true); +bad: + sudoerserror(NULL); + free(sudoerslval.command.args); + sudoerslval.command.args = NULL; + arg_len = arg_size = 0; + debug_return_bool(false); +} + +/* + * Check to make sure an IPv6 address does not contain multiple instances + * of the string "::". Assumes strlen(s) >= 1. + * Returns true if address is valid else false. + */ +bool +ipv6_valid(const char *s) +{ + int nmatch = 0; + debug_decl(ipv6_valid, SUDOERS_DEBUG_PARSER); + + for (; *s != '\0'; s++) { + if (s[0] == ':' && s[1] == ':') { + if (++nmatch > 1) + break; + } + if (s[0] == '/') + nmatch = 0; /* reset if we hit netmask */ + } + + debug_return_bool(nmatch <= 1); +} diff --git a/plugins/sudoers/tsdump.c b/plugins/sudoers/tsdump.c new file mode 100644 index 0000000..a46a27c --- /dev/null +++ b/plugins/sudoers/tsdump.c @@ -0,0 +1,311 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "check.h" + +struct timestamp_entry_common { + unsigned short version; /* version number */ + unsigned short size; /* entry size */ + unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */ + unsigned short flags; /* TS_DISABLED, TS_ANYUID */ +}; + +union timestamp_entry_storage { + struct timestamp_entry_common common; + struct timestamp_entry_v1 v1; + struct timestamp_entry v2; +}; + +sudo_dso_public int main(int argc, char *argv[]); + +static void usage(void) __attribute__((__noreturn__)); +static void dump_entry(struct timestamp_entry *entry, off_t pos); +static bool valid_entry(union timestamp_entry_storage *u, off_t pos); +static bool convert_entry(union timestamp_entry_storage *record, struct timespec *off); + +/* + * tsdump: a simple utility to dump the contents of a time stamp file. + * Unlock sudo, does not perform any locking of the time stamp file. + */ + +int +main(int argc, char *argv[]) +{ + int ch, fd; + const char *user = NULL; + char *fname = NULL; + union timestamp_entry_storage cur; + struct timespec now, timediff; + debug_decl(main, SUDOERS_DEBUG_MAIN); + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + malloc_options = "S"; +#endif + + initprogname(argc > 0 ? argv[0] : "tsdump"); + + bindtextdomain("sudoers", LOCALEDIR); + textdomain("sudoers"); + + /* Initialize the debug subsystem. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG) == -1) + exit(EXIT_FAILURE); + sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname())); + + while ((ch = getopt(argc, argv, "f:u:")) != -1) { + switch (ch) { + case 'f': + fname = optarg; + break; + case 'u': + user = optarg; + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (fname != NULL && user != NULL) { + sudo_warnx("the -f and -u flags are mutually exclusive"); + usage(); + } + + /* Calculate the difference between real time and mono time. */ + if (sudo_gettime_real(&now) == -1) + sudo_fatal("unable to get current time"); + if (sudo_gettime_mono(&timediff) == -1) + sudo_fatal("unable to read the clock"); + sudo_timespecsub(&now, &timediff, &timediff); + + if (fname == NULL) { + struct passwd *pw; + + if (user == NULL) { + if ((pw = getpwuid(geteuid())) == NULL) + sudo_fatalx(U_("unknown uid: %u"), (unsigned int)geteuid()); + user = pw->pw_name; + } + if (asprintf(&fname, "%s/%s", _PATH_SUDO_TIMEDIR, user) == -1) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + + fd = open(fname, O_RDONLY); + if (fd == -1) + sudo_fatal(U_("unable to open %s"), fname); + + for (;;) { + off_t pos = lseek(fd, 0, SEEK_CUR); + ssize_t nread; + bool valid; + + if ((nread = read(fd, &cur, sizeof(cur))) == 0) + break; + if (nread == -1) + sudo_fatal(U_("unable to read %s"), fname); + + valid = valid_entry(&cur, pos); + if (cur.common.size != 0 && cur.common.size != sizeof(cur)) { + off_t offset = (off_t)cur.common.size - (off_t)sizeof(cur); + if (lseek(fd, offset, SEEK_CUR) == -1) + sudo_fatal("unable to seek %d bytes", (int)offset); + } + if (valid) { + /* Convert entry to latest version as needed. */ + if (!convert_entry(&cur, &timediff)) + continue; + dump_entry(&cur.v2, pos); + } + } + + return 0; +} + +static bool +valid_entry(union timestamp_entry_storage *u, off_t pos) +{ + struct timestamp_entry *entry = (struct timestamp_entry *)u; + debug_decl(valid_entry, SUDOERS_DEBUG_UTIL); + + switch (entry->version) { + case 1: + if (entry->size != sizeof(struct timestamp_entry_v1)) { + printf("wrong sized v1 record @ %lld, got %hu, expected %zu\n", + (long long)pos, entry->size, sizeof(struct timestamp_entry_v1)); + debug_return_bool(false); + } + break; + case 2: + if (entry->size != sizeof(struct timestamp_entry)) { + printf("wrong sized v2 record @ %lld, got %hu, expected %zu\n", + (long long)pos, entry->size, sizeof(struct timestamp_entry)); + debug_return_bool(false); + } + break; + default: + printf("unknown time stamp entry version %d @ %lld\n", + (int)entry->version, (long long)pos); + debug_return_bool(false); + break; + } + debug_return_bool(true); +} + +static char * +type2string(int type) +{ + static char name[64]; + debug_decl(type2string, SUDOERS_DEBUG_UTIL); + + switch (type) { + case TS_LOCKEXCL: + debug_return_str("TS_LOCKEXCL"); + case TS_GLOBAL: + debug_return_str("TS_GLOBAL"); + case TS_TTY: + debug_return_str("TS_TTY"); + case TS_PPID: + debug_return_str("TS_PPID"); + } + (void)snprintf(name, sizeof(name), "UNKNOWN (0x%x)", type); + debug_return_str(name); +} + +static void +print_flags(int flags) +{ + bool first = true; + debug_decl(print_flags, SUDOERS_DEBUG_UTIL); + + printf("flags: "); + if (ISSET(flags, TS_DISABLED)) { + printf("%sTS_DISABLED", first ? "" : ", "); + CLR(flags, TS_DISABLED); + first = false; + } + if (ISSET(flags, TS_ANYUID)) { + /* TS_ANYUID should never appear on disk. */ + printf("%sTS_ANYUID", first ? "" : ", "); + CLR(flags, TS_ANYUID); + first = false; + } + if (flags != 0) + printf("%s0x%x", first ? "" : ", ", flags); + putchar('\n'); + + debug_return; +} + +/* + * Convert an older entry to current. + * Also adjusts time stamps on Linux to be wallclock time. + */ +static bool +convert_entry(union timestamp_entry_storage *record, struct timespec *off) +{ + union timestamp_entry_storage orig; + debug_decl(convert_entry, SUDOERS_DEBUG_UTIL); + + if (record->common.version != TS_VERSION) { + if (record->common.version != 1) { + sudo_warnx("unexpected record version %hu", record->common.version); + debug_return_bool(false); + } + + /* The first four fields are the same regardless of version. */ + memcpy(&orig, record, sizeof(union timestamp_entry_storage)); + record->v2.auth_uid = orig.v1.auth_uid; + record->v2.sid = orig.v1.sid; + sudo_timespecclear(&record->v2.start_time); + record->v2.ts = orig.v1.ts; + if (record->common.type == TS_TTY) + record->v2.u.ttydev = orig.v1.u.ttydev; + else if (record->common.type == TS_PPID) + record->v2.u.ppid = orig.v1.u.ppid; + else + memset(&record->v2.u, 0, sizeof(record->v2.u)); + } + + /* On Linux, start time is relative to boot time, adjust to real time. */ +#ifdef __linux__ + if (sudo_timespecisset(&record->v2.start_time)) + sudo_timespecadd(&record->v2.start_time, off, &record->v2.start_time); +#endif + + /* Adjust time stamp from mono time to real time. */ + if (sudo_timespecisset(&record->v2.ts)) + sudo_timespecadd(&record->v2.ts, off, &record->v2.ts); + + debug_return_bool(true); +} + +static void +dump_entry(struct timestamp_entry *entry, off_t pos) +{ + debug_decl(dump_entry, SUDOERS_DEBUG_UTIL); + + printf("position: %lld\n", (long long)pos); + printf("version: %hu\n", entry->version); + printf("size: %hu\n", entry->size); + printf("type: %s\n", type2string(entry->type)); + print_flags(entry->flags); + printf("auth uid: %d\n", (int)entry->auth_uid); + printf("session ID: %d\n", (int)entry->sid); + if (sudo_timespecisset(&entry->start_time)) + printf("start time: %s", ctime(&entry->start_time.tv_sec)); + if (sudo_timespecisset(&entry->ts)) + printf("time stamp: %s", ctime(&entry->ts.tv_sec)); + if (entry->type == TS_TTY) { + char tty[PATH_MAX]; + if (sudo_ttyname_dev(entry->u.ttydev, tty, sizeof(tty)) == NULL) + printf("terminal: %d\n", (int)entry->u.ttydev); + else + printf("terminal: %s\n", tty); + } else if (entry->type == TS_PPID) { + printf("parent pid: %d\n", (int)entry->u.ppid); + } + printf("\n"); + + debug_return; +} + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [-f timestamp_file] | [-u username]\n", + getprogname()); + exit(EXIT_FAILURE); +} diff --git a/plugins/sudoers/tsgetgrpw.c b/plugins/sudoers/tsgetgrpw.c new file mode 100644 index 0000000..2b6d3cb --- /dev/null +++ b/plugins/sudoers/tsgetgrpw.c @@ -0,0 +1,427 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2005, 2008, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Trivial replacements for the libc get{gr,pw}{uid,nam}() routines + * for use by testsudoers in the sudo test harness. + * We need our own since many platforms don't provide set{pw,gr}file(). + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "tsgetgrpw.h" +#include "sudoers.h" + +#undef GRMEM_MAX +#define GRMEM_MAX 200 + +#ifndef UID_MAX +# define UID_MAX 0xffffffffU +#endif + +#ifndef GID_MAX +# define GID_MAX UID_MAX +#endif + +static FILE *pwf; +static const char *pwfile = "/etc/passwd"; +static int pw_stayopen; + +static FILE *grf; +static const char *grfile = "/etc/group"; +static int gr_stayopen; + +void setgrfile(const char *); +void setgrent(void); +void endgrent(void); +struct group *getgrent(void); +struct group *getgrnam(const char *); +struct group *getgrgid(gid_t); + +void setpwfile(const char *); +void setpwent(void); +void endpwent(void); +struct passwd *getpwent(void); +struct passwd *getpwnam(const char *); +struct passwd *getpwuid(uid_t); + +void +setpwfile(const char *file) +{ + pwfile = file; + if (pwf != NULL) + endpwent(); +} + +void +setpwent(void) +{ + if (pwf == NULL) { + pwf = fopen(pwfile, "r"); + if (pwf != NULL) { + if (fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC) == -1) { + fclose(pwf); + pwf = NULL; + } + } + } else { + rewind(pwf); + } + pw_stayopen = 1; +} + +void +endpwent(void) +{ + if (pwf != NULL) { + fclose(pwf); + pwf = NULL; + } + pw_stayopen = 0; +} + +struct passwd * +getpwent(void) +{ + static struct passwd pw; + static char pwbuf[LINE_MAX]; + size_t len; + id_t id; + char *cp, *colon; + const char *errstr; + +next_entry: + if ((colon = fgets(pwbuf, sizeof(pwbuf), pwf)) == NULL) + return NULL; + + memset(&pw, 0, sizeof(pw)); + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + pw.pw_name = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + pw.pw_passwd = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + goto next_entry; + pw.pw_uid = (uid_t)id; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + goto next_entry; + pw.pw_gid = (gid_t)id; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + pw.pw_gecos = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + pw.pw_dir = cp; + pw.pw_shell = colon; + len = strlen(colon); + if (len > 0 && colon[len - 1] == '\n') + colon[len - 1] = '\0'; + return &pw; +} + +struct passwd * +getpwnam(const char *name) +{ + struct passwd *pw; + + if (pwf == NULL) { + if ((pwf = fopen(pwfile, "r")) == NULL) + return NULL; + if (fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC) == -1) { + fclose(pwf); + return NULL; + } + } else { + rewind(pwf); + } + while ((pw = getpwent()) != NULL) { + if (strcmp(pw->pw_name, name) == 0) + break; + } + if (!pw_stayopen) { + fclose(pwf); + pwf = NULL; + } + return pw; +} + +struct passwd * +getpwuid(uid_t uid) +{ + struct passwd *pw; + + if (pwf == NULL) { + if ((pwf = fopen(pwfile, "r")) == NULL) + return NULL; + if (fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC) == -1) { + fclose(pwf); + return NULL; + } + } else { + rewind(pwf); + } + while ((pw = getpwent()) != NULL) { + if (pw->pw_uid == uid) + break; + } + if (!pw_stayopen) { + fclose(pwf); + pwf = NULL; + } + return pw; +} + +void +setgrfile(const char *file) +{ + grfile = file; + if (grf != NULL) + endgrent(); +} + +void +setgrent(void) +{ + if (grf == NULL) { + grf = fopen(grfile, "r"); + if (grf != NULL) { + if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) { + fclose(grf); + grf = NULL; + } + } + } else { + rewind(grf); + } + gr_stayopen = 1; +} + +void +endgrent(void) +{ + if (grf != NULL) { + fclose(grf); + grf = NULL; + } + gr_stayopen = 0; +} + +struct group * +getgrent(void) +{ + static struct group gr; + static char grbuf[LINE_MAX], *gr_mem[GRMEM_MAX+1]; + size_t len; + id_t id; + char *cp, *colon; + const char *errstr; + int n; + +next_entry: + if ((colon = fgets(grbuf, sizeof(grbuf), grf)) == NULL) + return NULL; + + memset(&gr, 0, sizeof(gr)); + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + gr.gr_name = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + gr.gr_passwd = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + goto next_entry; + gr.gr_gid = (gid_t)id; + len = strlen(colon); + if (len > 0 && colon[len - 1] == '\n') + colon[len - 1] = '\0'; + if (*colon != '\0') { + char *last; + + gr.gr_mem = gr_mem; + cp = strtok_r(colon, ",", &last); + for (n = 0; cp != NULL && n < GRMEM_MAX; n++) { + gr.gr_mem[n] = cp; + cp = strtok_r(NULL, ",", &last); + } + gr.gr_mem[n++] = NULL; + } else + gr.gr_mem = NULL; + return &gr; +} + +struct group * +getgrnam(const char *name) +{ + struct group *gr; + + if (grf == NULL) { + if ((grf = fopen(grfile, "r")) == NULL) + return NULL; + if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) { + fclose(grf); + grf = NULL; + } + } else { + rewind(grf); + } + while ((gr = getgrent()) != NULL) { + if (strcmp(gr->gr_name, name) == 0) + break; + } + if (!gr_stayopen) { + fclose(grf); + grf = NULL; + } + return gr; +} + +struct group * +getgrgid(gid_t gid) +{ + struct group *gr; + + if (grf == NULL) { + if ((grf = fopen(grfile, "r")) == NULL) + return NULL; + if (fcntl(fileno(grf), F_SETFD, FD_CLOEXEC) == -1) { + fclose(grf); + grf = NULL; + } + } else { + rewind(grf); + } + while ((gr = getgrent()) != NULL) { + if (gr->gr_gid == gid) + break; + } + if (!gr_stayopen) { + fclose(grf); + grf = NULL; + } + return gr; +} + +/* + * Copied from getgrouplist.c + */ +int +sudo_getgrouplist2_v1(const char *name, GETGROUPS_T basegid, + GETGROUPS_T **groupsp, int *ngroupsp) +{ + GETGROUPS_T *groups = *groupsp; + int i, grpsize, ngroups = 1; + int ret = -1; + struct group *grp; + + if (groups == NULL) { + /* Dynamically-sized group vector. */ + grpsize = (int)sysconf(_SC_NGROUPS_MAX); + if (grpsize < 0) + grpsize = NGROUPS_MAX; + groups = reallocarray(NULL, grpsize, 4 * sizeof(*groups)); + if (groups == NULL) + return -1; + grpsize <<= 2; + } else { + /* Static group vector. */ + if ((grpsize = *ngroupsp) < 1) + return -1; + } + + /* We support BSD semantics where the first element is the base gid */ + groups[0] = basegid; + + setgrent(); + while ((grp = getgrent()) != NULL) { + if (grp->gr_gid == basegid || grp->gr_mem == NULL) + continue; + + for (i = 0; grp->gr_mem[i] != NULL; i++) { + if (strcmp(name, grp->gr_mem[i]) == 0) + break; + } + if (grp->gr_mem[i] == NULL) + continue; /* user not found */ + + /* Only add if it is not the same as an existing gid */ + for (i = 0; i < ngroups; i++) { + if (grp->gr_gid == groups[i]) + break; + } + if (i == ngroups) { + if (ngroups == grpsize) { + GETGROUPS_T *tmp; + + if (*groupsp != NULL) { + /* Static group vector. */ + goto done; + } + tmp = reallocarray(groups, grpsize, 2 * sizeof(*groups)); + if (tmp == NULL) { + free(groups); + groups = NULL; + ngroups = 0; + goto done; + } + groups = tmp; + grpsize <<= 1; + } + groups[ngroups++] = grp->gr_gid; + } + } + ret = 0; + +done: + endgrent(); + *groupsp = groups; + *ngroupsp = ngroups; + + return ret; +} diff --git a/plugins/sudoers/tsgetgrpw.h b/plugins/sudoers/tsgetgrpw.h new file mode 100644 index 0000000..a2d6e10 --- /dev/null +++ b/plugins/sudoers/tsgetgrpw.h @@ -0,0 +1,74 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Trivial replacements for the libc get{gr,pw}{uid,nam}() routines + * for use by testsudoers in the sudo test harness. + * We need our own since many platforms don't provide set{pw,gr}file(). + */ + +#include + +/* + * Define away the system prototypes so we don't have any conflicts. + */ + +#define setgrfile sys_setgrfile +#define setgrent sys_setgrent +#define endgrent sys_endgrent +#define getgrent sys_getgrent +#define getgrnam sys_getgrnam +#define getgrgid sys_getgrgid + +#define setpwfile sys_setpwfile +#define setpwent sys_setpwent +#define endpwent sys_endpwent +#define getpwent sys_getpwent +#define getpwnam sys_getpwnam +#define getpwuid sys_getpwuid + +#include +#include + +#undef setgrfile +#undef setgrent +#undef endgrent +#undef getgrent +#undef getgrnam +#undef getgrgid + +void setgrfile(const char *); +void setgrent(void); +void endgrent(void); +struct group *getgrent(void); +struct group *getgrnam(const char *); +struct group *getgrgid(gid_t); + +#undef setpwfile +#undef setpwent +#undef endpwent +#undef getpwent +#undef getpwnam +#undef getpwuid + +void setpwfile(const char *); +void setpwent(void); +void endpwent(void); +struct passwd *getpwent(void); +struct passwd *getpwnam(const char *); +struct passwd *getpwuid(uid_t); diff --git a/plugins/sudoers/visudo.c b/plugins/sudoers/visudo.c new file mode 100644 index 0000000..6fd3c83 --- /dev/null +++ b/plugins/sudoers/visudo.c @@ -0,0 +1,1313 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Lock the sudoers file for safe editing (ala vipw) and check for parse errors. + */ + +#ifdef __TANDEM +# include +#endif + +#include + +#include +#include +#include +#ifndef __TANDEM +# include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_GETOPT_LONG +# include +# else +# include "compat/getopt.h" +#endif /* HAVE_GETOPT_LONG */ + +#include "sudoers.h" +#include "interfaces.h" +#include "redblack.h" +#include "sudoers_version.h" +#include "sudo_conf.h" +#include + +struct sudoersfile { + TAILQ_ENTRY(sudoersfile) entries; + char *path; + char *tpath; + bool modified; + bool doedit; + int fd; +}; +TAILQ_HEAD(sudoersfile_list, sudoersfile); + +/* + * Function prototypes + */ +static void quit(int); +static int whatnow(void); +static int check_aliases(bool strict, bool quiet); +static char *get_editor(int *editor_argc, char ***editor_argv); +static bool check_syntax(const char *, bool, bool, bool); +static bool edit_sudoers(struct sudoersfile *, char *, int, char **, int); +static bool install_sudoers(struct sudoersfile *, bool); +static int print_unused(struct sudoers_parse_tree *, struct alias *, void *); +static bool reparse_sudoers(char *, int, char **, bool, bool); +static int run_command(char *, char **); +static void parse_sudoers_options(void); +static void setup_signals(void); +static void help(void) __attribute__((__noreturn__)); +static void usage(int); +static void visudo_cleanup(void); + +extern void get_hostname(void); +extern void sudoersrestart(FILE *); + +/* + * Globals + */ +struct sudo_user sudo_user; +struct passwd *list_pw; +static struct sudoersfile_list sudoerslist = TAILQ_HEAD_INITIALIZER(sudoerslist); +static bool checkonly; +static const char short_opts[] = "cf:hqsVx:"; +static struct option long_opts[] = { + { "check", no_argument, NULL, 'c' }, + { "export", required_argument, NULL, 'x' }, + { "file", required_argument, NULL, 'f' }, + { "help", no_argument, NULL, 'h' }, + { "quiet", no_argument, NULL, 'q' }, + { "strict", no_argument, NULL, 's' }, + { "version", no_argument, NULL, 'V' }, + { NULL, no_argument, NULL, '\0' }, +}; + +sudo_dso_public int main(int argc, char *argv[]); + +int +main(int argc, char *argv[]) +{ + struct sudoersfile *sp; + char *editor, **editor_argv; + const char *export_path = NULL; + int ch, oldlocale, editor_argc, exitcode = 0; + bool quiet, strict, fflag; + debug_decl(main, SUDOERS_DEBUG_MAIN); + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + { + extern char *malloc_options; + malloc_options = "S"; + } +#endif + + initprogname(argc > 0 ? argv[0] : "visudo"); + if (!sudoers_initlocale(setlocale(LC_ALL, ""), def_sudoers_locale)) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_warn_set_locale_func(sudoers_warn_setlocale); + bindtextdomain("sudoers", LOCALEDIR); /* XXX - should have visudo domain */ + textdomain("sudoers"); + + if (argc < 1) + usage(1); + + /* Register fatal/fatalx callback. */ + sudo_fatal_callback_register(visudo_cleanup); + + /* Set sudoers locale callback. */ + sudo_defs_table[I_SUDOERS_LOCALE].callback = sudoers_locale_callback; + + /* Read debug and plugin sections of sudo.conf. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG|SUDO_CONF_PLUGINS) == -1) + exit(EXIT_FAILURE); + + /* Initialize the debug subsystem. */ + if (!sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname()))) + exit(EXIT_FAILURE); + + /* Parse sudoers plugin options, if any. */ + parse_sudoers_options(); + + /* + * Arg handling. + */ + checkonly = fflag = quiet = strict = false; + while ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch (ch) { + case 'V': + (void) printf(_("%s version %s\n"), getprogname(), + PACKAGE_VERSION); + (void) printf(_("%s grammar version %d\n"), getprogname(), + SUDOERS_GRAMMAR_VERSION); + goto done; + case 'c': + checkonly = true; /* check mode */ + break; + case 'f': + sudoers_file = optarg; /* sudoers file path */ + fflag = true; + break; + case 'h': + help(); + break; + case 's': + strict = true; /* strict mode */ + break; + case 'q': + quiet = true; /* quiet mode */ + break; + case 'x': + export_path = optarg; + break; + default: + usage(1); + } + } + argc -= optind; + argv += optind; + + /* Check for optional sudoers file argument. */ + switch (argc) { + case 0: + break; + case 1: + /* Only accept sudoers file if no -f was specified. */ + if (!fflag) { + sudoers_file = *argv; + fflag = true; + } + break; + default: + usage(1); + } + + if (export_path != NULL) { + /* Backward compatibility for the time being. */ + sudo_warnx("%s", + U_("the -x option will be removed in a future release")); + sudo_warnx("%s", + U_("please consider using the cvtsudoers utility instead")); + execlp("cvtsudoers", "cvtsudoers", "-f", "json", "-o", export_path, + sudoers_file, (char *)0); + sudo_fatal(U_("unable to execute %s"), "cvtsudoers"); + } + + /* Mock up a fake sudo_user struct. */ + user_cmnd = user_base = ""; + if (geteuid() == 0) { + const char *user = getenv("SUDO_USER"); + if (user != NULL && *user != '\0') + sudo_user.pw = sudo_getpwnam(user); + } + if (sudo_user.pw == NULL) { + if ((sudo_user.pw = sudo_getpwuid(getuid())) == NULL) + sudo_fatalx(U_("you do not exist in the %s database"), "passwd"); + } + get_hostname(); + + /* Setup defaults data structures. */ + if (!init_defaults()) + sudo_fatalx("%s", U_("unable to initialize sudoers default values")); + + if (checkonly) { + exitcode = check_syntax(sudoers_file, quiet, strict, fflag) ? 0 : 1; + goto done; + } + + /* + * Parse the existing sudoers file(s) to highlight any existing + * errors and to pull in editor and env_editor conf values. + */ + if ((sudoersin = open_sudoers(sudoers_file, true, NULL)) == NULL) + exit(EXIT_FAILURE); + init_parser(sudoers_file, quiet, true); + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + (void) sudoersparse(); + (void) update_defaults(&parsed_policy, NULL, + SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, quiet); + sudoers_setlocale(oldlocale, NULL); + + editor = get_editor(&editor_argc, &editor_argv); + + /* Install signal handlers to clean up temp files if we are killed. */ + setup_signals(); + + /* Edit the sudoers file(s) */ + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (!sp->doedit) + continue; + if (sp != TAILQ_FIRST(&sudoerslist)) { + printf(_("press return to edit %s: "), sp->path); + while ((ch = getchar()) != EOF && ch != '\n') + continue; + } + edit_sudoers(sp, editor, editor_argc, editor_argv, -1); + } + + /* + * Check edited files for a parse error, re-edit any that fail + * and install the edited files as needed. + */ + if (reparse_sudoers(editor, editor_argc, editor_argv, strict, quiet)) { + TAILQ_FOREACH(sp, &sudoerslist, entries) { + (void) install_sudoers(sp, fflag); + } + } + free(editor); + +done: + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); + exit(exitcode); +} + +static char * +get_editor(int *editor_argc, char ***editor_argv) +{ + char *editor_path = NULL, **allowlist = NULL; + const char *env_editor; + static char *files[] = { "+1", "sudoers" }; + unsigned int allowlist_len = 0; + debug_decl(get_editor, SUDOERS_DEBUG_UTIL); + + /* Build up editor allowlist from def_editor unless env_editor is set. */ + if (!def_env_editor) { + const char *cp, *ep; + const char *def_editor_end = def_editor + strlen(def_editor); + + /* Count number of entries in allowlist and split into a list. */ + for (cp = sudo_strsplit(def_editor, def_editor_end, ":", &ep); + cp != NULL; cp = sudo_strsplit(NULL, def_editor_end, ":", &ep)) { + allowlist_len++; + } + allowlist = reallocarray(NULL, allowlist_len + 1, sizeof(char *)); + if (allowlist == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + allowlist_len = 0; + for (cp = sudo_strsplit(def_editor, def_editor_end, ":", &ep); + cp != NULL; cp = sudo_strsplit(NULL, def_editor_end, ":", &ep)) { + allowlist[allowlist_len] = strndup(cp, (size_t)(ep - cp)); + if (allowlist[allowlist_len] == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + allowlist_len++; + } + allowlist[allowlist_len] = NULL; + } + + editor_path = find_editor(2, files, editor_argc, editor_argv, allowlist, + &env_editor, true); + if (editor_path == NULL) { + if (def_env_editor && env_editor != NULL) { + /* We are honoring $EDITOR so this is a fatal error. */ + sudo_fatalx(U_("specified editor (%s) doesn't exist"), env_editor); + } + sudo_fatalx(U_("no editor found (editor path = %s)"), def_editor); + } + + if (allowlist != NULL) { + while (allowlist_len--) + free(allowlist[allowlist_len]); + free(allowlist); + } + + debug_return_str(editor_path); +} + +/* + * List of editors that support the "+lineno" command line syntax. + * If an entry starts with '*' the tail end of the string is matched. + * No other wild cards are supported. + */ +static char *lineno_editors[] = { + "ex", + "nex", + "vi", + "nvi", + "vim", + "elvis", + "*macs", + "mg", + "vile", + "jove", + "pico", + "nano", + "ee", + "joe", + "zile", + NULL +}; + +/* + * Check whether or not the specified editor matched lineno_editors[]. + * Returns true if yes, false if no. + */ +static bool +editor_supports_plus(const char *editor) +{ + const char *editor_base = strrchr(editor, '/'); + const char *cp; + char **av; + debug_decl(editor_supports_plus, SUDOERS_DEBUG_UTIL); + + if (editor_base != NULL) + editor_base++; + else + editor_base = editor; + if (*editor_base == 'r') + editor_base++; + + for (av = lineno_editors; (cp = *av) != NULL; av++) { + /* We only handle a leading '*' wildcard. */ + if (*cp == '*') { + size_t blen = strlen(editor_base); + size_t clen = strlen(++cp); + if (blen >= clen) { + if (strcmp(cp, editor_base + blen - clen) == 0) + break; + } + } else if (strcmp(cp, editor_base) == 0) + break; + } + debug_return_bool(cp != NULL); +} + +/* + * Edit each sudoers file. + * Returns true on success, else false. + */ +static bool +edit_sudoers(struct sudoersfile *sp, char *editor, int editor_argc, + char **editor_argv, int lineno) +{ + int tfd; /* sudoers temp file descriptor */ + bool modified; /* was the file modified? */ + int ac; /* argument count */ + char linestr[64]; /* string version of lineno */ + struct timespec ts, times[2]; /* time before and after edit */ + struct timespec orig_mtim; /* starting mtime of sudoers file */ + off_t orig_size; /* starting size of sudoers file */ + struct stat sb; /* stat buffer */ + bool ret = false; /* return value */ + debug_decl(edit_sudoers, SUDOERS_DEBUG_UTIL); + + if (fstat(sp->fd, &sb) == -1) + sudo_fatal(U_("unable to stat %s"), sp->path); + orig_size = sb.st_size; + mtim_get(&sb, orig_mtim); + + /* Create the temp file if needed and set timestamp. */ + if (sp->tpath == NULL) { + if (asprintf(&sp->tpath, "%s.tmp", sp->path) == -1) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + tfd = open(sp->tpath, O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU|S_IRUSR); + if (tfd < 0) + sudo_fatal("%s", sp->tpath); + + /* Copy sp->path -> sp->tpath and reset the mtime. */ + if (orig_size != 0) { + char buf[4096], lastch = '\0'; + ssize_t nread; + + (void) lseek(sp->fd, (off_t)0, SEEK_SET); + while ((nread = read(sp->fd, buf, sizeof(buf))) > 0) { + if (write(tfd, buf, nread) != nread) + sudo_fatal("%s", U_("write error")); + lastch = buf[nread - 1]; + } + + /* Add missing newline at EOF if needed. */ + if (lastch != '\n') { + lastch = '\n'; + if (write(tfd, &lastch, 1) != 1) + sudo_fatal("%s", U_("write error")); + } + } + (void) close(tfd); + } + times[0].tv_sec = times[1].tv_sec = orig_mtim.tv_sec; + times[0].tv_nsec = times[1].tv_nsec = orig_mtim.tv_nsec; + (void) utimensat(AT_FDCWD, sp->tpath, times, 0); + + /* Disable +lineno if editor doesn't support it. */ + if (lineno > 0 && !editor_supports_plus(editor)) + lineno = -1; + + /* + * The last 3 slots in the editor argv are: "-- +1 sudoers" + * Replace those placeholders with the real values. + */ + ac = editor_argc - 3; + if (lineno > 0) { + (void)snprintf(linestr, sizeof(linestr), "+%d", lineno); + editor_argv[ac++] = linestr; // -V507 + } + editor_argv[ac++] = "--"; + editor_argv[ac++] = sp->tpath; + editor_argv[ac++] = NULL; + + /* + * Do the edit: + * We cannot check the editor's exit value against 0 since + * XPG4 specifies that vi's exit value is a function of the + * number of errors during editing (?!?!). + */ + if (sudo_gettime_real(×[0]) == -1) { + sudo_warn("%s", U_("unable to read the clock")); + goto done; + } + + if (run_command(editor, editor_argv) != -1) { + if (sudo_gettime_real(×[1]) == -1) { + sudo_warn("%s", U_("unable to read the clock")); + goto done; + } + /* + * Check for zero length sudoers file. + */ + if (stat(sp->tpath, &sb) < 0) { + sudo_warnx(U_("unable to stat temporary file (%s), %s unchanged"), + sp->tpath, sp->path); + goto done; + } + if (sb.st_size == 0 && orig_size != 0) { + /* Avoid accidental zeroing of main sudoers file. */ + if (sp == TAILQ_FIRST(&sudoerslist)) { + sudo_warnx(U_("zero length temporary file (%s), %s unchanged"), + sp->tpath, sp->path); + goto done; + } + } + } else { + sudo_warnx(U_("editor (%s) failed, %s unchanged"), editor, sp->path); + goto done; + } + + /* Set modified bit if the user changed the file. */ + modified = true; + mtim_get(&sb, ts); + if (orig_size == sb.st_size && sudo_timespeccmp(&orig_mtim, &ts, ==)) { + /* + * If mtime and size match but the user spent no measurable + * time in the editor we can't tell if the file was changed. + */ + if (sudo_timespeccmp(×[0], ×[1], !=)) + modified = false; + } + + /* + * If modified in this edit session, mark as modified. + */ + if (modified) + sp->modified = modified; + else + sudo_warnx(U_("%s unchanged"), sp->tpath); + + ret = true; +done: + debug_return_bool(ret); +} + +/* + * Check Defaults and Alias entries. + * Sets parse_error on error and errorfile/errorlineno if possible. + */ +static void +check_defaults_and_aliases(bool strict, bool quiet) +{ + debug_decl(check_defaults_and_aliases, SUDOERS_DEBUG_UTIL); + + if (!check_defaults(&parsed_policy, quiet)) { + struct defaults *d; + rcstr_delref(errorfile); + errorfile = NULL; + errorlineno = -1; + /* XXX - should edit all files with errors */ + TAILQ_FOREACH(d, &parsed_policy.defaults, entries) { + if (d->error) { + /* Defaults parse error, set errorfile/errorlineno. */ + errorfile = rcstr_addref(d->file); + errorlineno = d->line; + break; + } + } + parse_error = true; + } + if (check_aliases(strict, quiet) != 0) { + parse_error = true; + } + debug_return; +} + +/* + * Parse sudoers after editing and re-edit any ones that caused a parse error. + */ +static bool +reparse_sudoers(char *editor, int editor_argc, char **editor_argv, + bool strict, bool quiet) +{ + struct sudoersfile *sp, *last; + FILE *fp; + int ch, oldlocale; + debug_decl(reparse_sudoers, SUDOERS_DEBUG_UTIL); + + /* + * Parse the edited sudoers files. + */ + while ((sp = TAILQ_FIRST(&sudoerslist)) != NULL) { + last = TAILQ_LAST(&sudoerslist, sudoersfile_list); + fp = fopen(sp->tpath, "r+"); + if (fp == NULL) + sudo_fatalx(U_("unable to re-open temporary file (%s), %s unchanged."), + sp->tpath, sp->path); + + /* Clean slate for each parse */ + if (!init_defaults()) + sudo_fatalx("%s", U_("unable to initialize sudoers default values")); + init_parser(sp->path, quiet, true); + + /* Parse the sudoers temp file(s) */ + sudoersrestart(fp); + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + if (sudoersparse() && !parse_error) { + sudo_warnx(U_("unable to parse temporary file (%s), unknown error"), + sp->tpath); + parse_error = true; + rcstr_delref(errorfile); + if ((errorfile = rcstr_dup(sp->path)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + fclose(sudoersin); + if (!parse_error) { + (void) update_defaults(&parsed_policy, NULL, + SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, true); + check_defaults_and_aliases(strict, quiet); + } + sudoers_setlocale(oldlocale, NULL); + + /* + * Got an error, prompt the user for what to do now. + */ + if (parse_error) { + switch (whatnow()) { + case 'Q': + parse_error = false; /* ignore parse error */ + break; + case 'x': + visudo_cleanup(); /* discard changes */ + debug_return_bool(false); + case 'e': + default: + /* Edit file with the parse error */ + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (errorfile == NULL || strcmp(sp->path, errorfile) == 0) { + edit_sudoers(sp, editor, editor_argc, editor_argv, + errorlineno); + if (errorfile != NULL) + break; + } + } + if (errorfile != NULL && sp == NULL) { + sudo_fatalx(U_("internal error, unable to find %s in list!"), + sudoers); + } + break; + } + } + + /* If any new #include directives were added, edit them too. */ + if ((sp = TAILQ_NEXT(last, entries)) != NULL) { + bool modified = false; + do { + printf(_("press return to edit %s: "), sp->path); + while ((ch = getchar()) != EOF && ch != '\n') + continue; + edit_sudoers(sp, editor, editor_argc, editor_argv, -1); + if (sp->modified) + modified = true; + } while ((sp = TAILQ_NEXT(sp, entries)) != NULL); + + /* Reparse sudoers if newly added includes were modified. */ + if (modified) + continue; + } + + /* If all sudoers files parsed OK we are done. */ + if (!parse_error) + break; + } + + debug_return_bool(true); +} + +/* + * Set the owner and mode on a sudoers temp file and + * move it into place. Returns true on success, else false. + */ +static bool +install_sudoers(struct sudoersfile *sp, bool oldperms) +{ + struct stat sb; + bool ret = false; + debug_decl(install_sudoers, SUDOERS_DEBUG_UTIL); + + if (sp->tpath == NULL) + goto done; + + if (!sp->modified) { + /* + * No changes but fix owner/mode if needed. + */ + (void) unlink(sp->tpath); + if (!oldperms && fstat(sp->fd, &sb) != -1) { + if (sb.st_uid != sudoers_uid || sb.st_gid != sudoers_gid) { + if (chown(sp->path, sudoers_uid, sudoers_gid) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chown %d:%d %s", __func__, + (int)sudoers_uid, (int)sudoers_gid, sp->path); + } + } + if ((sb.st_mode & ACCESSPERMS) != sudoers_mode) { + if (chmod(sp->path, sudoers_mode) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chmod 0%o %s", __func__, + (int)sudoers_mode, sp->path); + } + } + } + ret = true; + goto done; + } + + /* + * Change mode and ownership of temp file so when + * we move it to sp->path things are kosher. + */ + if (oldperms) { + /* Use perms of the existing file. */ + if (fstat(sp->fd, &sb) == -1) + sudo_fatal(U_("unable to stat %s"), sp->path); + if (chown(sp->tpath, sb.st_uid, sb.st_gid) != 0) { + sudo_warn(U_("unable to set (uid, gid) of %s to (%u, %u)"), + sp->tpath, (unsigned int)sb.st_uid, (unsigned int)sb.st_gid); + } + if (chmod(sp->tpath, sb.st_mode & ACCESSPERMS) != 0) { + sudo_warn(U_("unable to change mode of %s to 0%o"), sp->tpath, + (unsigned int)(sb.st_mode & ACCESSPERMS)); + } + } else { + if (chown(sp->tpath, sudoers_uid, sudoers_gid) != 0) { + sudo_warn(U_("unable to set (uid, gid) of %s to (%u, %u)"), + sp->tpath, (unsigned int)sudoers_uid, + (unsigned int)sudoers_gid); + goto done; + } + if (chmod(sp->tpath, sudoers_mode) != 0) { + sudo_warn(U_("unable to change mode of %s to 0%o"), sp->tpath, + (unsigned int)sudoers_mode); + goto done; + } + } + + /* + * Now that we know sp->tpath parses correctly, it needs to be + * rename(2)'d to sp->path. If the rename(2) fails we try using + * mv(1) in case sp->tpath and sp->path are on different file systems. + */ + if (rename(sp->tpath, sp->path) == 0) { + free(sp->tpath); + sp->tpath = NULL; + } else { + if (errno == EXDEV) { + char *av[4]; + sudo_warnx(U_("%s and %s not on the same file system, using mv to rename"), + sp->tpath, sp->path); + + /* Build up argument vector for the command */ + if ((av[0] = strrchr(_PATH_MV, '/')) != NULL) + av[0]++; + else + av[0] = _PATH_MV; + av[1] = sp->tpath; + av[2] = sp->path; + av[3] = NULL; + + /* And run it... */ + if (run_command(_PATH_MV, av)) { + sudo_warnx(U_("command failed: '%s %s %s', %s unchanged"), + _PATH_MV, sp->tpath, sp->path, sp->path); + (void) unlink(sp->tpath); + free(sp->tpath); + sp->tpath = NULL; + goto done; + } + free(sp->tpath); + sp->tpath = NULL; + } else { + sudo_warn(U_("error renaming %s, %s unchanged"), sp->tpath, sp->path); + (void) unlink(sp->tpath); + goto done; + } + } + ret = true; +done: + debug_return_bool(ret); +} + +/* + * Assuming a parse error occurred, prompt the user for what they want + * to do now. Returns the first letter of their choice. + */ +static int +whatnow(void) +{ + int choice, c; + debug_decl(whatnow, SUDOERS_DEBUG_UTIL); + + for (;;) { + (void) fputs(_("What now? "), stdout); + choice = getchar(); + for (c = choice; c != '\n' && c != EOF;) + c = getchar(); + + switch (choice) { + case EOF: + choice = 'x'; + FALLTHROUGH; + case 'e': + case 'x': + case 'Q': + debug_return_int(choice); + default: + (void) puts(_("Options are:\n" + " (e)dit sudoers file again\n" + " e(x)it without saving changes to sudoers file\n" + " (Q)uit and save changes to sudoers file (DANGER!)\n")); + } + } +} + +/* + * Install signal handlers for visudo. + */ +static void +setup_signals(void) +{ + struct sigaction sa; + debug_decl(setup_signals, SUDOERS_DEBUG_UTIL); + + /* + * Setup signal handlers to cleanup nicely. + */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = quit; + (void) sigaction(SIGTERM, &sa, NULL); + (void) sigaction(SIGHUP, &sa, NULL); + (void) sigaction(SIGINT, &sa, NULL); + (void) sigaction(SIGQUIT, &sa, NULL); + + debug_return; +} + +static int +run_command(char *path, char **argv) +{ + int status; + pid_t pid, rv; + debug_decl(run_command, SUDOERS_DEBUG_UTIL); + + switch (pid = sudo_debug_fork()) { + case -1: + sudo_fatal(U_("unable to execute %s"), path); + break; /* NOTREACHED */ + case 0: + closefrom(STDERR_FILENO + 1); + execv(path, argv); + sudo_warn(U_("unable to run %s"), path); + _exit(127); + break; /* NOTREACHED */ + } + + for (;;) { + rv = waitpid(pid, &status, 0); + if (rv == -1 && errno != EINTR) + break; + if (rv != -1 && !WIFSTOPPED(status)) + break; + } + + if (rv != -1) + rv = WIFEXITED(status) ? WEXITSTATUS(status) : -1; + debug_return_int(rv); +} + +static bool +check_owner(const char *path, bool quiet) +{ + struct stat sb; + bool ok = true; + debug_decl(check_owner, SUDOERS_DEBUG_UTIL); + + if (stat(path, &sb) == 0) { + if (sb.st_uid != sudoers_uid || sb.st_gid != sudoers_gid) { + ok = false; + if (!quiet) { + fprintf(stderr, + _("%s: wrong owner (uid, gid) should be (%u, %u)\n"), + path, (unsigned int)sudoers_uid, (unsigned int)sudoers_gid); + } + } + if ((sb.st_mode & ALLPERMS) != sudoers_mode) { + ok = false; + if (!quiet) { + fprintf(stderr, _("%s: bad permissions, should be mode 0%o\n"), + path, (unsigned int)sudoers_mode); + } + } + } + debug_return_bool(ok); +} + +static bool +check_syntax(const char *file, bool quiet, bool strict, bool oldperms) +{ + bool ok = false; + int oldlocale; + debug_decl(check_syntax, SUDOERS_DEBUG_UTIL); + + if (strcmp(file, "-") == 0) { + sudoersin = stdin; + file = "stdin"; + } else if ((sudoersin = fopen(file, "r")) == NULL) { + if (!quiet) + sudo_warn(U_("unable to open %s"), file); + goto done; + } + if (!init_defaults()) + sudo_fatalx("%s", U_("unable to initialize sudoers default values")); + init_parser(file, quiet, true); + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + if (sudoersparse() && !parse_error) { + if (!quiet) + sudo_warnx(U_("failed to parse %s file, unknown error"), file); + parse_error = true; + rcstr_delref(errorfile); + if ((errorfile = rcstr_dup(file)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + if (!parse_error) { + (void) update_defaults(&parsed_policy, NULL, + SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, true); + check_defaults_and_aliases(strict, quiet); + } + sudoers_setlocale(oldlocale, NULL); + ok = !parse_error; + + if (!parse_error) { + struct sudoersfile *sp; + + /* Parsed OK, check mode and owner. */ + if (oldperms || check_owner(file, quiet)) { + if (!quiet) + (void) printf(_("%s: parsed OK\n"), file); + } else { + ok = false; + } + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (oldperms || check_owner(sp->path, quiet)) { + if (!quiet) + (void) printf(_("%s: parsed OK\n"), sp->path); + } else { + ok = false; + } + } + } + +done: + debug_return_bool(ok); +} + +static bool +lock_sudoers(struct sudoersfile *entry) +{ + int ch; + debug_decl(lock_sudoers, SUDOERS_DEBUG_UTIL); + + if (!sudo_lock_file(entry->fd, SUDO_TLOCK)) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + sudo_warnx(U_("%s busy, try again later"), entry->path); + debug_return_bool(false); + } + sudo_warn(U_("unable to lock %s"), entry->path); + (void) fputs(_("Edit anyway? [y/N]"), stdout); + ch = getchar(); + if (tolower(ch) != 'y') + debug_return_bool(false); + } + debug_return_bool(true); +} + +/* + * Open (and lock) a new sudoers file. + * Returns a new struct sudoersfile on success or NULL on failure. + */ +static struct sudoersfile * +new_sudoers(const char *path, bool doedit) +{ + struct sudoersfile *entry; + struct stat sb; + int open_flags; + debug_decl(new_sudoersfile, SUDOERS_DEBUG_UTIL); + + if (checkonly) + open_flags = O_RDONLY; + else + open_flags = O_RDWR | O_CREAT; + + entry = calloc(1, sizeof(*entry)); + if (entry == NULL || (entry->path = strdup(path)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + /* entry->tpath = NULL; */ + /* entry->modified = false; */ + entry->doedit = doedit; + entry->fd = open(entry->path, open_flags, sudoers_mode); + if (entry->fd == -1 || fstat(entry->fd, &sb) == -1) { + sudo_warn("%s", entry->path); + goto bad; + } + if (!S_ISREG(sb.st_mode)) { + sudo_warnx(U_("%s is not a regular file"), entry->path); + goto bad; + } + if (!checkonly && !lock_sudoers(entry)) + goto bad; + debug_return_ptr(entry); +bad: + if (entry->fd != -1) + close(entry->fd); + free(entry); + debug_return_ptr(NULL); +} + +/* + * Used to open (and lock) the initial sudoers file and to also open + * any subsequent files #included via a callback from the parser. + */ +FILE * +open_sudoers(const char *path, bool doedit, bool *keepopen) +{ + struct sudoersfile *entry; + FILE *fp; + debug_decl(open_sudoers, SUDOERS_DEBUG_UTIL); + + /* Check for existing entry */ + TAILQ_FOREACH(entry, &sudoerslist, entries) { + if (strcmp(path, entry->path) == 0) + break; + } + if (entry == NULL) { + if ((entry = new_sudoers(path, doedit)) == NULL) + debug_return_ptr(NULL); + if ((fp = fdopen(entry->fd, "r")) == NULL) + sudo_fatal("%s", entry->path); + TAILQ_INSERT_TAIL(&sudoerslist, entry, entries); + } else { + /* Already exists, open .tmp version if there is one. */ + if (entry->tpath != NULL) { + if ((fp = fopen(entry->tpath, "r")) == NULL) + sudo_fatal("%s", entry->tpath); + } else { + if ((fp = fdopen(entry->fd, "r")) == NULL) + sudo_fatal("%s", entry->path); + rewind(fp); + } + } + if (keepopen != NULL) + *keepopen = true; + debug_return_ptr(fp); +} + +static int +check_alias(char *name, int type, char *file, int line, int column, + bool strict, bool quiet) +{ + struct member *m; + struct alias *a; + int errors = 0; + debug_decl(check_alias, SUDOERS_DEBUG_ALIAS); + + if ((a = alias_get(&parsed_policy, name, type)) != NULL) { + /* check alias contents */ + TAILQ_FOREACH(m, &a->members, entries) { + if (m->type != ALIAS) + continue; + errors += check_alias(m->name, type, a->file, a->line, a->column, + strict, quiet); + } + alias_put(a); + } else { + if (!quiet) { + if (errno == ELOOP) { + fprintf(stderr, strict ? + U_("Error: %s:%d:%d: cycle in %s \"%s\"") : + U_("Warning: %s:%d:%d: cycle in %s \"%s\""), + file, line, column, alias_type_to_string(type), name); + } else { + fprintf(stderr, strict ? + U_("Error: %s:%d:%d: %s \"%s\" referenced but not defined") : + U_("Warning: %s:%d:%d: %s \"%s\" referenced but not defined"), + file, line, column, alias_type_to_string(type), name); + } + fputc('\n', stderr); + if (strict && errorfile == NULL) { + errorfile = rcstr_addref(file); + errorlineno = line; + } + } + errors++; + } + + debug_return_int(errors); +} + +/* + * Iterate through the sudoers datastructures looking for undefined + * aliases or unused aliases. + */ +static int +check_aliases(bool strict, bool quiet) +{ + struct rbtree *used_aliases; + struct cmndspec *cs; + struct member *m; + struct privilege *priv; + struct userspec *us; + int errors = 0; + debug_decl(check_aliases, SUDOERS_DEBUG_ALIAS); + + used_aliases = alloc_aliases(); + if (used_aliases == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + + /* Forward check. */ + TAILQ_FOREACH(us, &parsed_policy.userspecs, entries) { + TAILQ_FOREACH(m, &us->users, entries) { + if (m->type == ALIAS) { + errors += check_alias(m->name, USERALIAS, + us->file, us->line, us->column, strict, quiet); + } + } + TAILQ_FOREACH(priv, &us->privileges, entries) { + TAILQ_FOREACH(m, &priv->hostlist, entries) { + if (m->type == ALIAS) { + errors += check_alias(m->name, HOSTALIAS, + us->file, us->line, us->column, strict, quiet); + } + } + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + if (m->type == ALIAS) { + errors += check_alias(m->name, RUNASALIAS, + us->file, us->line, us->column, strict, quiet); + } + } + } + if (cs->runasgrouplist != NULL) { + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + if (m->type == ALIAS) { + errors += check_alias(m->name, RUNASALIAS, + us->file, us->line, us->column, strict, quiet); + } + } + } + if ((m = cs->cmnd)->type == ALIAS) { + errors += check_alias(m->name, CMNDALIAS, + us->file, us->line, us->column, strict, quiet); + } + } + } + } + + /* Reverse check (destructive) */ + if (!alias_find_used(&parsed_policy, used_aliases)) + errors++; + free_aliases(used_aliases); + + /* If all aliases were referenced we will have an empty tree. */ + if (!no_aliases(&parsed_policy) && !quiet) + alias_apply(&parsed_policy, print_unused, NULL); + + debug_return_int(strict ? errors : 0); +} + +static int +print_unused(struct sudoers_parse_tree *parse_tree, struct alias *a, void *v) +{ + fprintf(stderr, U_("Warning: %s:%d:%d: unused %s \"%s\""), + a->file, a->line, a->column, alias_type_to_string(a->type), a->name); + fputc('\n', stderr); + return 0; +} + +static void +parse_sudoers_options(void) +{ + struct plugin_info_list *plugins; + debug_decl(parse_sudoers_options, SUDOERS_DEBUG_UTIL); + + plugins = sudo_conf_plugins(); + if (plugins) { + struct plugin_info *info; + + TAILQ_FOREACH(info, plugins, entries) { + if (strcmp(info->symbol_name, "sudoers_policy") == 0) + break; + } + if (info != NULL && info->options != NULL) { + char * const *cur; + +#define MATCHES(s, v) \ + (strncmp((s), (v), sizeof(v) - 1) == 0 && (s)[sizeof(v) - 1] != '\0') + + for (cur = info->options; *cur != NULL; cur++) { + const char *errstr, *p; + id_t id; + + if (MATCHES(*cur, "sudoers_file=")) { + sudoers_file = *cur + sizeof("sudoers_file=") - 1; + continue; + } + if (MATCHES(*cur, "sudoers_uid=")) { + p = *cur + sizeof("sudoers_uid=") - 1; + id = sudo_strtoid(p, &errstr); + if (errstr == NULL) + sudoers_uid = (uid_t) id; + continue; + } + if (MATCHES(*cur, "sudoers_gid=")) { + p = *cur + sizeof("sudoers_gid=") - 1; + id = sudo_strtoid(p, &errstr); + if (errstr == NULL) + sudoers_gid = (gid_t) id; + continue; + } + if (MATCHES(*cur, "sudoers_mode=")) { + p = *cur + sizeof("sudoers_mode=") - 1; + id = (id_t) sudo_strtomode(p, &errstr); + if (errstr == NULL) + sudoers_mode = (mode_t) id; + continue; + } + } +#undef MATCHES + } + } + debug_return; +} + +/* + * Unlink any sudoers temp files that remain. + */ +static void +visudo_cleanup(void) +{ + struct sudoersfile *sp; + + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (sp->tpath != NULL) + (void) unlink(sp->tpath); + } +} + +/* + * Unlink sudoers temp files (if any) and exit. + */ +static void +quit(int signo) +{ + struct sudoersfile *sp; + struct iovec iov[4]; + + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (sp->tpath != NULL) + (void) unlink(sp->tpath); + } + +#define emsg " exiting due to signal: " + iov[0].iov_base = (char *)getprogname(); + iov[0].iov_len = strlen(iov[0].iov_base); + iov[1].iov_base = emsg; + iov[1].iov_len = sizeof(emsg) - 1; + iov[2].iov_base = strsignal(signo); + iov[2].iov_len = strlen(iov[2].iov_base); + iov[3].iov_base = "\n"; + iov[3].iov_len = 1; + ignore_result(writev(STDERR_FILENO, iov, 4)); + _exit(signo); +} + +static void +usage(int fatal) +{ + (void) fprintf(fatal ? stderr : stdout, + "usage: %s [-chqsV] [[-f] sudoers ]\n", getprogname()); + if (fatal) + exit(EXIT_FAILURE); +} + +static void +help(void) +{ + (void) printf(_("%s - safely edit the sudoers file\n\n"), getprogname()); + usage(0); + (void) puts(_("\nOptions:\n" + " -c, --check check-only mode\n" + " -f, --file=sudoers specify sudoers file location\n" + " -h, --help display help message and exit\n" + " -q, --quiet less verbose (quiet) syntax error messages\n" + " -s, --strict strict syntax checking\n" + " -V, --version display version information and exit\n")); + exit(EXIT_SUCCESS); +} diff --git a/plugins/system_group/Makefile.in b/plugins/system_group/Makefile.in new file mode 100644 index 0000000..99159b2 --- /dev/null +++ b/plugins/system_group/Makefile.in @@ -0,0 +1,215 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2011-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +abs_srcdir = @abs_srcdir@ +top_srcdir = @top_srcdir@ +abs_top_srcdir = @abs_top_srcdir@ +top_builddir = @top_builddir@ +abs_top_builddir = @abs_top_builddir@ +devdir = @devdir@ +scriptdir = $(top_srcdir)/scripts +incdir = $(top_srcdir)/include +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LT_LIBS = $(top_builddir)/lib/util/libsudo_util.la +LIBS = $(LT_LIBS) + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ +plugindir = @plugindir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/system_group.exp +shlib_map = system_group.map +shlib_opt = system_group.opt + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +OBJS = system_group.lo + +IOBJS = system_group.i + +POBJS = system_group.plog + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +all: system_group.la + +depend: + $(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \ + --builddir=$(abs_top_builddir) plugins/system_group/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/system_group/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/system_group/Makefile + +.SUFFIXES: .c .h .i .lo .plog + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +system_group.la: $(OBJS) $(LT_LIBS) @LT_LDDEP@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(OBJS) $(LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so + +pre-install: + +install: install-plugin + +install-dirs: + $(SHELL) $(scriptdir)/mkinstalldirs $(DESTDIR)$(plugindir) + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: install-dirs system_group.la + if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) system_group.la $(DESTDIR)$(plugindir); \ + fi + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/system_group.la + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(plugindir)/system_group.so$(INSTALL_BACKUP) + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la + -rm -f *.i *.plog stamp-* core *.core core.* + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs $(shlib_map) $(shlib_opt) + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +system_group.lo: $(srcdir)/system_group.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/system_group.c +system_group.i: $(srcdir)/system_group.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +system_group.plog: system_group.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/system_group.c --i-file $< --output-file $@ diff --git a/plugins/system_group/system_group.c b/plugins/system_group/system_group.c new file mode 100644 index 0000000..c43fc0c --- /dev/null +++ b/plugins/system_group/system_group.c @@ -0,0 +1,144 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#include "sudo_compat.h" +#include "sudo_dso.h" +#include "sudo_plugin.h" +#include "sudo_util.h" + +/* + * Sudoers group plugin that does group name-based lookups using the system + * group database functions, similar to how sudo behaved prior to 1.7.3. + * This can be used on systems where lookups by group ID are problematic. + */ + +typedef struct group * (*sysgroup_getgrnam_t)(const char *); +typedef struct group * (*sysgroup_getgrgid_t)(gid_t); +typedef void (*sysgroup_gr_delref_t)(struct group *); + +static sysgroup_getgrnam_t sysgroup_getgrnam; +static sysgroup_getgrgid_t sysgroup_getgrgid; +static sysgroup_gr_delref_t sysgroup_gr_delref; +static bool need_setent; + +static int +sysgroup_init(int version, sudo_printf_t plugin_printf, char *const argv[]) +{ + void *handle; + + if (SUDO_API_VERSION_GET_MAJOR(version) != GROUP_API_VERSION_MAJOR) { + plugin_printf(SUDO_CONV_ERROR_MSG, + "sysgroup_group: incompatible major version %d, expected %d\n", + SUDO_API_VERSION_GET_MAJOR(version), + GROUP_API_VERSION_MAJOR); + return -1; + } + + /* Share group cache with sudo if possible. */ + handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_getgrnam"); + if (handle != NULL) { + sysgroup_getgrnam = (sysgroup_getgrnam_t)handle; + } else { + sysgroup_getgrnam = (sysgroup_getgrnam_t)getgrnam; + need_setent = true; + } + + handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_getgrgid"); + if (handle != NULL) { + sysgroup_getgrgid = (sysgroup_getgrgid_t)handle; + } else { + sysgroup_getgrgid = (sysgroup_getgrgid_t)getgrgid; + need_setent = true; + } + + handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_gr_delref"); + if (handle != NULL) + sysgroup_gr_delref = (sysgroup_gr_delref_t)handle; + + if (need_setent) + setgrent(); + + return true; +} + +static void +sysgroup_cleanup(void) +{ + if (need_setent) + endgrent(); +} + +/* + * Returns true if "user" is a member of "group", else false. + */ +static int +sysgroup_query(const char *user, const char *group, const struct passwd *pwd) +{ + char **member; + struct group *grp; + + grp = sysgroup_getgrnam(group); + if (grp == NULL && group[0] == '#' && group[1] != '\0') { + const char *errstr; + gid_t gid = sudo_strtoid(group + 1, &errstr); + if (errstr == NULL) + grp = sysgroup_getgrgid(gid); + } + if (grp != NULL) { + if (grp->gr_mem != NULL) { + for (member = grp->gr_mem; *member != NULL; member++) { + if (strcasecmp(user, *member) == 0) { + if (sysgroup_gr_delref) + sysgroup_gr_delref(grp); + return true; + } + } + } + if (sysgroup_gr_delref) + sysgroup_gr_delref(grp); + } + + return false; +} + +sudo_dso_public struct sudoers_group_plugin group_plugin = { + GROUP_API_VERSION, + sysgroup_init, + sysgroup_cleanup, + sysgroup_query +}; diff --git a/plugins/system_group/system_group.exp b/plugins/system_group/system_group.exp new file mode 100644 index 0000000..a859d6c --- /dev/null +++ b/plugins/system_group/system_group.exp @@ -0,0 +1 @@ +group_plugin -- cgit v1.2.3