From d8a7734a9764fa02aac782bdebcf44663dad72a7 Mon Sep 17 00:00:00 2001 From: nalin Date: Jul 13 2000 17:03:24 +0000 Subject: also modify the services, protocols, and automount in nsswitch.conf local policy support --- diff --git a/Makefile b/Makefile index fd882c5..7d899ef 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ VERSION=$(shell awk '/Version:/ { print $$2 }' authconfig.spec) CVSTAG = r$(subst .,-,$(VERSION)) PROGNAME = authconfig -CFLAGS += -Wall -DVERSION=\"$(VERSION)\" `glib-config --cflags` -ggdb $(RPM_OPT_FLAGS) +CFLAGS += -Wall -DVERSION=\"$(VERSION)\" `glib-config --cflags` -ggdb $(RPM_OPT_FLAGS) $(EXTRA_CFLAGS) LOADLIBES = `glib-config --libs` -lnewt -lpopt SUBDIRS = po man diff --git a/authconfig.c b/authconfig.c index d1bca07..b85ed73 100644 --- a/authconfig.c +++ b/authconfig.c @@ -1,6 +1,6 @@ /* * Authconfig - authentication configuration program - * Author: Preston Brown + * Author: Nalin Dahyabhai * Copyright (c) 1999, 2000 Red Hat, Inc. * * This program is licensed under the terms of the GPL. @@ -21,6 +21,9 @@ #include #include #include "authinfo.h" +#ifdef LOCAL_POLICIES +#include "localpol.h" +#endif static char *progName; @@ -418,7 +421,7 @@ int getPAMChoices(int back, struct authInfoType *authInfo) { newtComponent form, ok, backb = NULL, cancel = NULL, comp, cb; - int rc = 0; + int rc = 0, window_height = 16; struct ldap_cb ldap; struct krb5_cb krb5; @@ -429,8 +432,13 @@ int getPAMChoices(int back, char *kerberosRealm = NULL, *kerberosKDC = NULL, *kerberosAdmin = NULL; char *winBindDomain = NULL; +#ifdef LOCAL_POLICIES + char local = ' '; + window_height += 2; +#endif + /* Create the window and a form to put into it. */ - newtCenteredWindow(72, 16, i18n("Authentication Configuration")); + newtCenteredWindow(72, window_height, i18n("Authentication Configuration")); form = newtForm(NULL, NULL, 0); /* PAM setup. */ @@ -504,15 +512,21 @@ int getPAMChoices(int back, krb5.kadminEntry, NULL); +#ifdef LOCAL_POLICIES + cb = newtCheckbox(1, 12, i18n(LOCAL_POLICY_COMMENT), + authInfo->enableLocal ? '*' : ' ', NULL, &local); + newtFormAddComponent(form, cb); +#endif + /* Create the buttons. */ if (back == FALSE) { - ok = newtButton(14, 12, i18n("Ok")); - backb = newtButton(44, 12, i18n("Back")); - cancel = newtButton(27, 12, i18n("Cancel")); + ok = newtButton(14, window_height - 4, i18n("Ok")); + backb = newtButton(44, window_height - 4, i18n("Back")); + cancel = newtButton(27, window_height - 4, i18n("Cancel")); newtFormAddComponents(form, ok, cancel, backb, NULL); } else { - ok = newtButton(20, 12, i18n("Ok")); - backb = newtButton(38, 12, i18n("Back")); + ok = newtButton(20, window_height - 4, i18n("Ok")); + backb = newtButton(38, window_height - 4, i18n("Back")); newtFormAddComponents(form, ok, backb, NULL); } @@ -537,6 +551,9 @@ int getPAMChoices(int back, setString(&authInfo->winBindDomain, winBindDomain); #endif authInfo->enableKerberos = (krb5.pam_krb5 == '*'); +#ifdef LOCAL_POLICIES + authInfo->enableLocal = (local == '*'); +#endif setString(&authInfo->kerberosRealm, kerberosRealm); setString(&authInfo->kerberosKDC, kerberosKDC); setString(&authInfo->kerberosAdminServer, kerberosAdmin); @@ -600,43 +617,48 @@ int getChoices(int back, } void usage(void) { - fprintf(stderr, i18n("Usage: %s [options]\n\n" - " --useshadow\n" - " --enableshadow enable shadow passwords by default\n" - " --disableshadow disable shadow passwords by default\n" - " --enablemd5 enable MD5 passwords by default\n" - " --disablemd5 disable MD5 passwords by default\n" - "\n" - " --enablenis enable NIS\n" - " --disablenis disable NIS\n" - " --nisdomain default NIS domain\n" - " --nisserver default NIS server\n" - "\n" - - " --enableldap enable ldap for user information by default\n" - " --disableldap disable ldap for user information by default\n" - " --enableldapauth enable ldap for authentication by default\n" - " --disableldapauth disable ldap for authentication by default\n" - " --ldapserver default LDAP server\n" - " --ldapbasedn default LDAP base DN\n" - "\n" - - " --enablekrb5 enable kerberos authentication by default\n" - " --disablekrb5 disable kerberos authentication by default\n" - " --krb5kdc default kerberos KDC\n" - " --krb5adminserver default kerberos admin server\n" - " --krb5realm default kerberos realm\n" - "\n" - - " --enablehesiod enable hesiod for user information by default\n" - " --disablehesiod disable hesiod for user information by default\n" - " --hesiodlhs default hesiod LHS\n" - " --hesiodrhs default hesiod RHS\n" - "\n" - - " --nostart do not start/stop ypbind\n" - " --kickstart don't display user interface\n" - " --help show this screen\n"), + fprintf(stderr, gettext("Usage: %s [options]\n\n" + " --useshadow\n" + " --enableshadow enable shadow passwords by default\n" + " --disableshadow disable shadow passwords by default\n" + " --enablemd5 enable MD5 passwords by default\n" + " --disablemd5 disable MD5 passwords by default\n" + "\n" + " --enablenis enable NIS\n" + " --disablenis disable NIS\n" + " --nisdomain default NIS domain\n" + " --nisserver default NIS server\n" + "\n" + + " --enableldap enable ldap for user information by default\n" + " --disableldap disable ldap for user information by default\n" + " --enableldapauth enable ldap for authentication by default\n" + " --disableldapauth disable ldap for authentication by default\n" + " --ldapserver default LDAP server\n" + " --ldapbasedn default LDAP base DN\n" + "\n" + + " --enablekrb5 enable kerberos authentication by default\n" + " --disablekrb5 disable kerberos authentication by default\n" + " --krb5kdc default kerberos KDC\n" + " --krb5adminserver default kerberos admin server\n" + " --krb5realm default kerberos realm\n" + "\n" + + " --enablehesiod enable hesiod for user information by default\n" + " --disablehesiod disable hesiod for user information by default\n" + " --hesiodlhs default hesiod LHS\n" + " --hesiodrhs default hesiod RHS\n" +#ifdef LOCAL_POLICIES + "\n" + " --enablelocal use locally-defined policy " LOCAL_POLICY_NAME "\n" + " --disablelocal don't use locally-defined policy " LOCAL_POLICY_NAME "\n" +#endif + "\n" + + " --nostart do not start/stop ypbind\n" + " --kickstart don't display user interface\n" + " --help show this screen\n"), progName); exit(0); @@ -678,12 +700,20 @@ int main(int argc, const char **argv) int enableKrb5 = 0, disableKrb5 = 0; char *krb5Realm = NULL, *krb5KDC = NULL, *krb5AdminServer = NULL; +#ifdef LOCAL_POLICIES + int enableLocal = 0, disableLocal = 0; +#endif + poptContext optCon; const struct poptOption options[] = { { "back", '\0', POPT_ARG_NONE, &back, 0, NULL, NULL}, { "test", '\0', POPT_ARG_NONE, &test, 0, NULL, NULL}, { "nostart", '\0', POPT_ARG_NONE, &nostart, 0, NULL, NULL}, { "kickstart", '\0', POPT_ARG_NONE, &kickstart, 0, NULL, NULL}, +#ifdef LOCAL_POLICIES + { "enablelocal", '\0', POPT_ARG_NONE, &enableLocal, 0, NULL, NULL}, + { "disablelocal", '\0', POPT_ARG_NONE, &disableLocal, 0, NULL, NULL}, +#endif { "useshadow", '\0', POPT_ARG_NONE, &enableShadow, 0, NULL, NULL}, { "enableshadow", '\0', POPT_ARG_NONE, &enableShadow, 0, NULL, NULL}, @@ -840,6 +870,10 @@ int main(int argc, const char **argv) winBindAvail = TRUE; } +#ifdef LOCAL_POLICIES + overrideBoolean(&authInfo->enableLocal, enableLocal, disableLocal); +#endif + overrideBoolean(&authInfo->enableShadow, enableShadow, disableShadow); overrideBoolean(&authInfo->enableMD5, enableMD5, disableMD5); @@ -915,6 +949,10 @@ int main(int argc, const char **argv) printf(" winbind domain = \"%s\"\n", authInfo->winBindDomain ? authInfo->winBindDomain : ""); #endif +#ifdef LOCAL_POLICIES + printf("local policies are %s\n", + authInfo->enableLocal ? "enabled" : "disabled"); +#endif printf("pam_unix is always enabled\n"); printf(" shadow passwords are %s\n", authInfo->enableShadow ? "enabled" : "disabled"); diff --git a/authconfig.spec b/authconfig.spec index b40acdd..3e4db08 100644 --- a/authconfig.spec +++ b/authconfig.spec @@ -1,6 +1,6 @@ Summary: Text-mode tool for setting up NIS and shadow passwords. Name: authconfig -Version: 4.0.8 +Version: 4.0.9 Release: 1 License: GPL ExclusiveOS: Linux @@ -34,6 +34,9 @@ rm -rf $RPM_BUILD_ROOT #%attr(-,root,root)%{_datadir}/locale/*/LC_MESSAGES/authconfig.mo %changelog +* Thu Jul 13 2000 Nalin Dahyabhai +- also modify the services, protocols, and automount in nsswitch.conf + * Tue Jun 27 2000 Nalin Dahyabhai - add --disable options - try to not mess with ypbind if it isn't installed diff --git a/authinfo.c b/authinfo.c index e208eb8..d167cbb 100644 --- a/authinfo.c +++ b/authinfo.c @@ -22,6 +22,10 @@ #include "shvar.h" #include "authinfo.h" +#ifdef LOCAL_POLICIES +#include "localpol.h" +#endif + /* Read hesiod setup. Luckily, /etc/hesiod.conf is simple enough that shvar * can read it just fine. */ gboolean authInfoReadHesiod(struct authInfoType *info) @@ -449,6 +453,12 @@ gboolean authInfoReadPAM(struct authInfoType *authInfo) authInfo->enableLDAPAuth = TRUE; continue; } +#ifdef LOCAL_POLICIES + if(strstr(module, "pam_stack")) { + authInfo->enableLocal = TRUE; + continue; + } +#endif } for(p = q; isspace(*p) && (*p != '\0'); p++); @@ -1079,7 +1089,9 @@ gboolean authInfoWriteNSS(struct authInfoType *info) struct stat st; struct flock lock; char buf[LINE_MAX] = ""; - gboolean wrotepasswd = FALSE, wrotegroup = FALSE, wroteshadow = FALSE; + gboolean wrotepasswd = FALSE, wrotegroup = FALSE, wroteshadow = FALSE, + wroteservices = FALSE, wroteprotocols = FALSE, + wroteautomount = FALSE; fd = open(SYSCONFDIR "/nsswitch.conf", O_RDWR|O_CREAT, 0644); if(fd == -1) { @@ -1103,13 +1115,17 @@ gboolean authInfoWriteNSS(struct authInfoType *info) /* Determine the maximum length of the new file. */ l = strlen("passwd: \n") + strlen("shadow: \n") + - strlen("group: \n"); - l += strlen(NSS_DEFAULT) * 3; - l += strlen(" files") * 3; - l += strlen(" hesiod") * 3; - l += strlen(" ldap") * 3; - l += strlen(" nis") * 3; - l += strlen(" winbind") * 3; + strlen("group: \n") + + strlen("services: \n") + + strlen("protocols: \n") + + strlen("automount: \n"); + l += strlen(NSS_DEFAULT) * 6; + l += strlen(" files") * 6; + l += strlen(" hesiod") * 6; + l += strlen(" ldap") * 6; + l += strlen(" nis") * 6; + l += strlen(" dns"); + l += strlen(" winbind") * 6; obuf = g_malloc0(st.st_size + 1 + l); /* Determine what we want in that file. */ @@ -1165,6 +1181,36 @@ gboolean authInfoWriteNSS(struct authInfoType *info) } } else + /* If it's a 'services' line, insert ours instead. */ + if(strncmp("services:", p, 9) == 0) { + if(!wroteservices) { + strcat(obuf, "services: "); + strcat(obuf, buf); + strcat(obuf, "\n"); + wroteservices = TRUE; + } + } else + + /* If it's a 'protocols' line, insert ours instead. */ + if(strncmp("protocols:", p, 10) == 0) { + if(!wroteprotocols) { + strcat(obuf, "protocols: "); + strcat(obuf, buf); + strcat(obuf, "\n"); + wroteprotocols = TRUE; + } + } else + + /* If it's a 'automount' line, insert ours instead. */ + if(strncmp("automount:", p, 10) == 0) { + if(!wroteautomount) { + strcat(obuf, "automount: "); + strcat(obuf, buf); + strcat(obuf, "\n"); + wroteautomount = TRUE; + } + } else + /* Otherwise, just copy the current line out. */ strncat(obuf, p, q - p); p = q; @@ -1186,6 +1232,21 @@ gboolean authInfoWriteNSS(struct authInfoType *info) strcat(obuf, buf); strcat(obuf, "\n"); } + if(!wroteprotocols) { + strcat(obuf, "protocols: "); + strcat(obuf, buf); + strcat(obuf, "\n"); + } + if(!wroteservices) { + strcat(obuf, "services: "); + strcat(obuf, buf); + strcat(obuf, "\n"); + } + if(!wroteautomount) { + strcat(obuf, "automount: "); + strcat(obuf, buf); + strcat(obuf, "\n"); + } /* Write it out and close it. */ ftruncate(fd, 0); @@ -1200,6 +1261,13 @@ gboolean authInfoWriteNSS(struct authInfoType *info) } /* Mandatory arguments for the various modules. */ +#ifdef LOCAL_POLICIES +static const char *argv_local_all[] = { + "service=" LOCAL_POLICY_NAME, + NULL, +}; +#endif + static const char *argv_unix_auth[] = { "likeauth", "nullok", @@ -1274,6 +1342,9 @@ static struct { const char *name; const char **argv; } standard_pam_modules[] = { +#ifdef LOCAL_POLICIES + {FALSE, auth, required, "stack", argv_local_all}, +#endif {TRUE, auth, sufficient, "unix", argv_unix_auth}, {FALSE, auth, sufficient, "krb5", argv_krb5_auth}, {FALSE, auth, sufficient, "krb5afs", argv_krb5afs_auth}, @@ -1281,10 +1352,16 @@ static struct { {FALSE, auth, sufficient, "winbind", argv_winbind_auth}, {TRUE, auth, required, "deny", NULL}, +#ifdef LOCAL_POLICIES + {FALSE, account, required, "stack", argv_local_all}, +#endif {TRUE, account, sufficient, "unix", NULL}, {FALSE, account, sufficient, "ldap", NULL}, {TRUE, account, required, "deny", NULL}, +#ifdef LOCAL_POLICIES + {FALSE, password, required, "stack", argv_local_all}, +#endif {TRUE, password, required, "cracklib", argv_cracklib_password}, {TRUE, password, sufficient, "unix", @@ -1298,6 +1375,9 @@ static struct { {FALSE, password, sufficient, "winbind", argv_winbind_password}, {TRUE, password, required, "deny", NULL}, +#ifdef LOCAL_POLICIES + {FALSE, session, required, "stack", argv_local_all}, +#endif {TRUE, session, required, "limits", NULL}, {TRUE, session, required, "unix", NULL}, {FALSE, session, optional, "krb5", NULL}, @@ -1423,6 +1503,10 @@ gboolean authInfoWritePAM(struct authInfoType *authInfo) (authInfo->enableWinBindAuth && (strcmp("winbind", standard_pam_modules[i].name) == 0)) || #endif +#ifdef LOCAL_POLICIES + (authInfo->enableLocal && + (strcmp("stack", standard_pam_modules[i].name) == 0)) || +#endif (authInfo->enableLDAPAuth && (strcmp("ldap", standard_pam_modules[i].name) == 0))) { fmt_standard_pam_module(i, obuf, authInfo); diff --git a/authinfo.h b/authinfo.h index f852586..a3c6f4f 100644 --- a/authinfo.h +++ b/authinfo.h @@ -66,6 +66,9 @@ struct authInfoType { gboolean enableShadow; gboolean enableKerberos; gboolean enableLDAPAuth; +#ifdef LOCAL_POLICIES + gboolean enableLocal; +#endif }; struct authInfoType *authInfoRead(); diff --git a/localpol.h b/localpol.h new file mode 100644 index 0000000..0a69df3 --- /dev/null +++ b/localpol.h @@ -0,0 +1,10 @@ +/* In order to present the option to use a local policy in the system-auth + configuration file, you must build with + make EXTRA_CFLAGS=-DLOCAL_POLICIES + and change these strings if you want... */ +#ifndef LOCAL_POLICY_NAME +#define LOCAL_POLICY_NAME "local-policy" +#endif +#ifndef LOCAL_POLICY_COMMENT +#define LOCAL_POLICY_COMMENT "Use Local Policies to Restrict Access" +#endif diff --git a/po/authconfig.pot b/po/authconfig.pot index 492f36f..3162455 100644 --- a/po/authconfig.pot +++ b/po/authconfig.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2000-06-30 14:51-0400\n" +"POT-Creation-Date: 2000-07-13 13:00-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -14,115 +14,115 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n" -#: ../authconfig.c:144 +#: ../authconfig.c:147 #, c-format msgid "" "The %s file was not found, but it is required for %s support to work " "properly. Install the %s package, which provides this file." msgstr "" -#: ../authconfig.c:148 +#: ../authconfig.c:151 msgid "Warning" msgstr "" -#: ../authconfig.c:148 ../authconfig.c:509 ../authconfig.c:514 +#: ../authconfig.c:151 ../authconfig.c:523 ../authconfig.c:528 msgid "Ok" msgstr "" -#: ../authconfig.c:158 ../authconfig.c:232 +#: ../authconfig.c:161 ../authconfig.c:235 msgid " Domain:" msgstr "" -#: ../authconfig.c:159 ../authconfig.c:205 +#: ../authconfig.c:162 ../authconfig.c:208 msgid " Server:" msgstr "" -#: ../authconfig.c:179 +#: ../authconfig.c:182 msgid " LHS:" msgstr "" -#: ../authconfig.c:180 +#: ../authconfig.c:183 msgid " RHS:" msgstr "" -#: ../authconfig.c:206 +#: ../authconfig.c:209 msgid " Base DN:" msgstr "" -#: ../authconfig.c:249 +#: ../authconfig.c:252 msgid " Realm:" msgstr "" -#: ../authconfig.c:250 +#: ../authconfig.c:253 msgid " KDC:" msgstr "" -#: ../authconfig.c:251 +#: ../authconfig.c:254 msgid " Admin Server:" msgstr "" #. Create the window and a form to put into it. -#: ../authconfig.c:291 +#: ../authconfig.c:294 msgid "User Information Configuration" msgstr "" #. NSS modules: NIS. -#: ../authconfig.c:295 +#: ../authconfig.c:298 msgid "Use NIS" msgstr "" -#: ../authconfig.c:318 +#: ../authconfig.c:321 msgid "Use LDAP" msgstr "" -#: ../authconfig.c:337 +#: ../authconfig.c:340 msgid "Use WinBind" msgstr "" -#: ../authconfig.c:351 +#: ../authconfig.c:354 msgid "Use Hesiod" msgstr "" #. Create the buttons. -#: ../authconfig.c:372 +#: ../authconfig.c:375 msgid "Next" msgstr "" -#: ../authconfig.c:373 ../authconfig.c:510 ../authconfig.c:515 +#: ../authconfig.c:376 ../authconfig.c:524 ../authconfig.c:529 msgid "Back" msgstr "" -#: ../authconfig.c:373 ../authconfig.c:511 +#: ../authconfig.c:376 ../authconfig.c:525 msgid "Cancel" msgstr "" #. Create the window and a form to put into it. -#: ../authconfig.c:433 +#: ../authconfig.c:441 msgid "Authentication Configuration" msgstr "" #. PAM setup. -#: ../authconfig.c:437 +#: ../authconfig.c:445 msgid "Use Shadow Passwords" msgstr "" -#: ../authconfig.c:441 +#: ../authconfig.c:449 msgid "Use MD5 Passwords" msgstr "" -#: ../authconfig.c:446 +#: ../authconfig.c:454 msgid "Use LDAP Authentication" msgstr "" -#: ../authconfig.c:467 +#: ../authconfig.c:475 msgid "Use WinBind Authentication" msgstr "" -#: ../authconfig.c:482 +#: ../authconfig.c:490 msgid "Use Kerberos 5" msgstr "" -#: ../authconfig.c:603 +#: ../authconfig.c:620 #, c-format msgid "" "Usage: %s [options]\n" @@ -159,112 +159,110 @@ msgid "" " --hesiodlhs default hesiod LHS\n" " --hesiodrhs default hesiod RHS\n" "\n" -" --nostart do not start/stop ypbind\n" -" --kickstart don't display user interface\n" -" --help show this screen\n" +" --enablelocal use locally-defined policy " msgstr "" -#: ../authconfig.c:740 +#: ../authconfig.c:770 #, c-format msgid "%s: bad argument %s: %s\n" msgstr "" -#: ../authconfig.c:747 +#: ../authconfig.c:777 #, c-format msgid "%s: unexpected argument\n" msgstr "" -#: ../authconfig.c:759 +#: ../authconfig.c:789 #, c-format msgid "%s: can only be run as root\n" msgstr "" -#: ../authconfig.c:770 +#: ../authconfig.c:800 #, c-format msgid "%s: critical error reading %s/hesiod.conf" msgstr "" -#: ../authconfig.c:777 +#: ../authconfig.c:807 #, c-format msgid "%s: critical error reading %s/krb5.conf" msgstr "" -#: ../authconfig.c:784 +#: ../authconfig.c:814 #, c-format msgid "%s: critical error reading %s/ldap.conf" msgstr "" -#: ../authconfig.c:792 +#: ../authconfig.c:822 #, c-format msgid "%s: critical error reading %s/smb.conf" msgstr "" -#: ../authconfig.c:800 +#: ../authconfig.c:830 #, c-format msgid "%s: critical error reading %s/yp.conf" msgstr "" -#: ../authconfig.c:807 +#: ../authconfig.c:837 #, c-format msgid "%s: critical error reading %s/nsswitch.conf" msgstr "" -#: ../authconfig.c:814 +#: ../authconfig.c:844 #, c-format msgid "%s: critical error reading %s/sysconfig/network" msgstr "" -#: ../authconfig.c:821 +#: ../authconfig.c:851 #, c-format msgid "%s: critical error reading %s/pam.d/%s" msgstr "" -#: ../authconfig.c:874 +#: ../authconfig.c:908 msgid "" " / between elements | selects | next " "screen" msgstr "" -#: ../authconfig.c:882 +#: ../authconfig.c:916 msgid "dialog was cancelled\n" msgstr "" -#: ../authconfig.c:946 +#: ../authconfig.c:984 #, c-format msgid "%s: critical error writing %s/hesiod.conf" msgstr "" -#: ../authconfig.c:951 +#: ../authconfig.c:989 #, c-format msgid "%s: critical error writing %s/krb5.conf" msgstr "" -#: ../authconfig.c:956 +#: ../authconfig.c:994 #, c-format msgid "%s: critical error writing %s/ldap.conf" msgstr "" -#: ../authconfig.c:961 +#: ../authconfig.c:999 #, c-format msgid "%s: critical error writing %s/yp.conf" msgstr "" -#: ../authconfig.c:967 +#: ../authconfig.c:1005 #, c-format msgid "%s: critical error writing %s/smb.conf" msgstr "" -#: ../authconfig.c:973 +#: ../authconfig.c:1011 #, c-format msgid "%s: critical error writing %s/nsswitch.conf" msgstr "" -#: ../authconfig.c:977 +#: ../authconfig.c:1015 #, c-format msgid "%s: critical error writing %s/sysconfig/network" msgstr "" -#: ../authconfig.c:982 +#: ../authconfig.c:1020 #, c-format msgid "%s: critical error writing %s/pam.d/%s" msgstr ""