From d29dc4f57429fff278f67b29bc9ae76324500d24 Mon Sep 17 00:00:00 2001 From: nalin Date: Nov 17 2003 20:54:13 +0000 Subject: - merge from winbind-devel-branch --- diff --git a/authconfig.c b/authconfig.c index f0042f7..060b62a 100644 --- a/authconfig.c +++ b/authconfig.c @@ -110,6 +110,7 @@ overrideString(char **dest, const char *source) } } +#if 0 static void checkWarn(const char *path, const char *service, const char *package) { @@ -260,7 +261,548 @@ smbToggle(newtComponent cb, void *data) NEWT_FLAGS_SET); } } +#endif + +enum datatype {lvalue, tfvalue, svalue, rvalue}; +struct formdata { + enum datatype type; + const char *description; + size_t offset; + char **valid_values; +}; + +static gboolean +getGenericChoices(const char *dialogTitle, + int n_items, struct formdata *items, + struct authInfoType *authInfo, + const char *anotherText, + gboolean (*anotherCb)(struct authInfoType *), + const char *cancelText, const char *okText) +{ + newtComponent form, ok, cancel, another, comp, cb, result; + newtGrid mainGrid, questionGrid, buttonGrid, radioGrid; + GPtrArray **radios; + const char **strings; + char *booleans; + gboolean *b; + char **s; + int i, j, row, rows, def; + + radios = g_malloc(n_items * sizeof(GPtrArray *)); + for (i = 0; i < n_items; i++) { + radios[i] = NULL; + } + strings = g_malloc0(n_items * sizeof(char*)); + booleans = g_malloc0(n_items); + + /* Count up the number of rows we need in the grid. */ + rows = n_items; + + /* Create a grid for these questions. */ + questionGrid = newtCreateGrid(2, rows); + row = 0; + for (i = 0; i < n_items; i++) { + switch (items[i].type) { + case tfvalue: + b = G_STRUCT_MEMBER_P(authInfo, items[i].offset); + cb = newtCheckbox(-1, -1, items[i].description, + *b ? '*' : ' ', + NULL, &booleans[i]); + newtGridSetField(questionGrid, 1, row, NEWT_GRID_COMPONENT, cb, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); + row++; + break; + case svalue: + s = G_STRUCT_MEMBER_P(authInfo, items[i].offset); + comp = newtLabel(-1, -1, items[i].description); + newtGridSetField(questionGrid, 0, row, NEWT_GRID_COMPONENT, comp, + 0, 0, 1, 0, NEWT_ANCHOR_RIGHT, 0); + comp = newtEntry(-1, -1, *s ? *s : "", 40, &(strings[i]), + NEWT_ENTRY_SCROLL); + newtEntrySetFilter(comp, entryFilter, NULL); + newtGridSetField(questionGrid, 1, row, NEWT_GRID_COMPONENT, comp, + 0, 0, 0, 0, 0, NEWT_GRID_FLAG_GROWX); + row++; + break; + case rvalue: + s = G_STRUCT_MEMBER_P(authInfo, items[i].offset); + comp = newtLabel(-1, -1, items[i].description); + newtGridSetField(questionGrid, 0, row, NEWT_GRID_COMPONENT, comp, + 0, 0, 1, 0, NEWT_ANCHOR_TOP | NEWT_ANCHOR_RIGHT, 0); + for (j = 0; items[i].valid_values[j] != NULL; j++) /* nothing */; + radioGrid = newtCreateGrid(1, j); + radios[i] = g_ptr_array_new(); + def = 0; + for (j = 0; items[i].valid_values[j] != NULL; j++) { + if (strcmp(*s, items[i].valid_values[j]) == 0) { + def = j; + } + } + for (j = 0; items[i].valid_values[j] != NULL; j++) { + comp = newtRadiobutton(-1, -1, items[i].valid_values[j], + j == def, + j == 0 ? NULL : comp); + g_ptr_array_add(radios[i], comp); + g_ptr_array_add(radios[i], items[i].valid_values[j]); + newtGridSetField(radioGrid, 0, j, NEWT_GRID_COMPONENT, comp, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + } + newtGridSetField(questionGrid, 1, row, NEWT_GRID_SUBGRID, radioGrid, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); + row++; + break; + case lvalue: + comp = newtTextboxReflowed(0, 0, (char*) items[i].description, + 50, 1, 1, 0); + newtGridSetField(questionGrid, 0, row, NEWT_GRID_COMPONENT, comp, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); + row++; + break; + } + } + g_assert(row == rows); + + /* Buttons. */ + buttonGrid = newtCreateGrid(anotherText ? 3 : 2, 1); + cancel = newtButton(-1, -1, cancelText); + ok = newtButton(-1, -1, okText); + another = anotherText ? newtButton(-1, -1, anotherText) : NULL; + newtGridSetField(buttonGrid, 0, 0, NEWT_GRID_COMPONENT, cancel, + 0, 0, 0, 0, 0, 0); + if (anotherText) { + newtGridSetField(buttonGrid, 1, 0, NEWT_GRID_COMPONENT, another, + 0, 0, 0, 0, 0, 0); + } + newtGridSetField(buttonGrid, anotherText ? 2 : 1, 0, + NEWT_GRID_COMPONENT, ok, 0, 0, 0, 0, 0, 0); + + /* Top-level grid. */ + mainGrid = newtCreateGrid(1, 2); + newtGridSetField(mainGrid, 0, 0, NEWT_GRID_SUBGRID, questionGrid, + 0, 0, 0, 1, 0, NEWT_GRID_FLAG_GROWX); + newtGridSetField(mainGrid, 0, 1, NEWT_GRID_SUBGRID, buttonGrid, + 0, 0, 0, 0, 0, NEWT_GRID_FLAG_GROWX); + + /* Run the form and interpret the results. */ + form = newtForm(NULL, NULL, 0); + newtGridWrappedWindow(mainGrid, (char*) dialogTitle); + newtGridAddComponentsToForm(mainGrid, form, 1); + +runform: + result = newtRunForm(form); + + if (result != cancel) { + for (i = 0; i < n_items; i++) { + switch (items[i].type) { + case svalue: + s = G_STRUCT_MEMBER_P(authInfo, items[i].offset); + if (*s) { + g_free(*s); + } + *s = g_strdup(strings[i]); + break; + case tfvalue: + b = G_STRUCT_MEMBER_P(authInfo, items[i].offset); + *b = (booleans[i] == '*'); + break; + case rvalue: + s = G_STRUCT_MEMBER_P(authInfo, items[i].offset); + if (radios[i]->len > 0) { + comp = g_ptr_array_index(radios[i], 0); + comp = newtRadioGetCurrent(comp); + if (comp != NULL) { + for (j = 0; j < radios[i]->len; j += 2) { + if (comp == g_ptr_array_index(radios[i], j)) { + if (*s) { + g_free(*s); + } + *s = g_strdup(g_ptr_array_index(radios[i], j + 1)); + } + } + } + } + break; + case lvalue: + break; + } + } + } + + if (result == another) { + anotherCb(authInfo); + goto runform; + } + + newtFormDestroy(form); + newtPopWindow(); + + /* Newt frees any strings. */ + for (i = 0; i < n_items; i++) { + if (radios[i] != NULL) { + g_ptr_array_free(radios[i], TRUE); + radios[i] = NULL; + } + } + g_free(radios); + g_free(strings); + g_free(booleans); + + return (result != cancel) ? TRUE : FALSE; +} + +static gboolean +getHesiodSettings(struct authInfoType *authInfo, gboolean next) +{ + struct formdata questions[] = { + {svalue, _("LHS:"), + G_STRUCT_OFFSET(struct authInfoType, hesiodLHS)}, + {svalue, _("RHS:"), + G_STRUCT_OFFSET(struct authInfoType, hesiodRHS)}, + }; + return getGenericChoices(_("Hesiod Settings"), + G_N_ELEMENTS(questions), questions, authInfo, + NULL, NULL, _("Back"), next ? _("Next") : _("Ok")); +} + +static gboolean +getLDAPSettings(struct authInfoType *authInfo, gboolean next) +{ + struct formdata questions[] = { + {tfvalue, _("Use TLS"), + G_STRUCT_OFFSET(struct authInfoType, enableLDAPS)}, + {svalue, _("Server:"), + G_STRUCT_OFFSET(struct authInfoType, ldapServer)}, + {svalue, _("Base DN:"), + G_STRUCT_OFFSET(struct authInfoType, ldapBaseDN)}, + }; + return getGenericChoices(_("LDAP Settings"), + G_N_ELEMENTS(questions), questions, authInfo, + NULL, NULL, _("Back"), next ? _("Next") : _("Ok")); +} + +static gboolean +getNISSettings(struct authInfoType *authInfo, gboolean next) +{ + struct formdata questions[] = { + {svalue, _("Domain:"), + G_STRUCT_OFFSET(struct authInfoType, nisDomain)}, + {svalue, _("Server:"), + G_STRUCT_OFFSET(struct authInfoType, nisServer)}, + }; + return getGenericChoices(_("NIS Settings"), + G_N_ELEMENTS(questions), questions, authInfo, + NULL, NULL, _("Back"), next ? _("Next") : _("Ok")); +} + +static gboolean +getKerberosSettings(struct authInfoType *authInfo, gboolean next) +{ + struct formdata questions[] = { + {svalue, _("Realm:"), + G_STRUCT_OFFSET(struct authInfoType, kerberosRealm)}, + {svalue, _("KDC:"), + G_STRUCT_OFFSET(struct authInfoType, kerberosKDC)}, + {svalue, _("Admin Server:"), + G_STRUCT_OFFSET(struct authInfoType, kerberosAdminServer)}, + }; + return getGenericChoices(_("Kerberos Settings"), + G_N_ELEMENTS(questions), questions, authInfo, + NULL, NULL, _("Back"), next ? _("Next") : _("Ok")); +} + +static gboolean +getSMBSettings(struct authInfoType *authInfo, gboolean next) +{ + struct formdata questions[] = { + {svalue, _("Workgroup:"), + G_STRUCT_OFFSET(struct authInfoType, smbWorkgroup)}, + {svalue, _("Servers:"), + G_STRUCT_OFFSET(struct authInfoType, smbServers)}, + {svalue, _("Shell:"), + G_STRUCT_OFFSET(struct authInfoType, winbindTemplateShell)}, + }; + return getGenericChoices(_("SMB Settings"), + G_N_ELEMENTS(questions), questions, authInfo, + NULL, NULL, _("Back"), next ? _("Next") : _("Ok")); +} + +static gboolean +getJoinSettings(struct authInfoType *authInfo) +{ + gboolean ret; + struct formdata questions[] = { + {svalue, _("Domain Administrator:"), + G_STRUCT_OFFSET(struct authInfoType, joinUser)}, + {svalue, _("Password:"), + G_STRUCT_OFFSET(struct authInfoType, joinPassword)}, + }; + if (authInfo->joinUser) { + g_free(authInfo->joinUser); + } + authInfo->joinUser = g_strdup("Administrator"); + ret = getGenericChoices(_("Join Settings"), + G_N_ELEMENTS(questions), questions, authInfo, + NULL, NULL, _("Cancel"), _("Ok")); + if (ret == TRUE) { + newtSuspend(); + authInfoUpdate(authInfo); + authInfoWrite(authInfo); + authInfoJoin(authInfo, TRUE); + newtResume(); + } + return TRUE; +} + +static gboolean +maybeGetJoinSettings(struct authInfoType *authInfo) +{ + gboolean ret; + struct authInfoType *originalInfo; + struct formdata questions[] = { + {lvalue, _("Some of the configuration changes you've made should be saved to disk before continuing. If you do not save them, then your attempt to join the domain may fail. Save changes?"),}, + }; + originalInfo = authInfoRead(); + authInfoUpdate(originalInfo); + authInfoUpdate(authInfo); + if (authInfoDiffers(authInfo, originalInfo)) { + ret = getGenericChoices(_("Save Settings"), + G_N_ELEMENTS(questions), questions, authInfo, + NULL, NULL, _("No"), _("Yes")); + if (ret == TRUE) { + authInfoWrite(authInfo); + getJoinSettings(authInfo); + } + } else { + getJoinSettings(authInfo); + } + authInfoFree(originalInfo); + return TRUE; +} + + +static gboolean +getWinbindSettings(struct authInfoType *authInfo, gboolean next) +{ + const char *security[] = { + "ads", "domain", NULL, + }; + struct formdata questions[] = { + {rvalue, _("Security Model:"), + G_STRUCT_OFFSET(struct authInfoType, smbSecurity), (char**) security}, + {svalue, _("Domain:"), + G_STRUCT_OFFSET(struct authInfoType, smbWorkgroup)}, + {svalue, _("Domain Controllers:"), + G_STRUCT_OFFSET(struct authInfoType, smbServers)}, + {svalue, _("ADS Realm:"), + G_STRUCT_OFFSET(struct authInfoType, smbRealm)}, + }; + return getGenericChoices(_("Winbind Settings"), + G_N_ELEMENTS(questions), questions, authInfo, + _("Join Domain"), maybeGetJoinSettings, + _("Back"), next ? _("Next") : _("Ok")); +} + +struct warntype { + const char *path, *service, *package; +}; + +static void +warnCallback(newtComponent comp, void *warningp) +{ + struct warntype *warning; + char *p; + + warning = warningp; + + if (access(warning->path, R_OK) == 0) { + return; + } + + p = g_strdup_printf(AUTHCONFIG_PACKAGE_WARNING, + warning->path, + warning->service, + warning->package); + newtWinMessage(_("Warning"), _("Ok"), p, NULL); + g_free(p); + + newtRefresh(); +} + +static gboolean +getMainChoices(int back, gboolean nisAvail, gboolean ldapAvail, + gboolean kerberosAvail, gboolean smbAvail, gboolean cacheAvail, + struct authInfoType *authInfo) +{ + newtComponent form, ok, cancel, comp, cb; + newtGrid mainGrid, mechGrid, buttonGrid, infoGrid, authGrid; + char cache, hesiod, ldap, nis, krb5, ldapa, smb, winbind, shadow, md5; + struct warntype warnCache = {PATH_NSCD, + _("caching"), + "nscd"}; + struct warntype warnKerberos = {PATH_PAM_KRB5, + _("Kerberos"), + "pam_krb5"}; + struct warntype warnLDAPAuth = {PATH_PAM_LDAP, + _("LDAP authentication"), + "nss_ldap"}; + struct warntype warnLDAP = {PATH_LIBNSS_LDAP, + _("LDAP"), + "nss_ldap"}; + struct warntype warnNIS = {PATH_YPBIND, + _("NIS"), + "ypbind"}; + struct warntype warnShadow = {PATH_PWCONV, + _("shadow password"), + "shadow-utils"}; + struct warntype warnSMB = {PATH_PAM_SMB, + _("SMB authentication"), + "pam_smb"}; + struct warntype warnWinbindAuth = {PATH_PAM_WINBIND, + _("Winbind authentication"), + "samba-client"}; + struct warntype warnWinbind = {PATH_LIBNSS_WINBIND, + _("Winbind"), + "samba-client"}; + + /* Information. */ + infoGrid = newtCreateGrid(1, 6); + comp = newtLabel(-1, -1, _("User Information")); + newtGridSetField(infoGrid, 0, 0, NEWT_GRID_COMPONENT, comp, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + + cb = newtCheckbox(-1, -1, _("Cache Information"), + authInfo->enableCache ? '*' : ' ', + NULL, &cache); + newtGridSetField(infoGrid, 0, 1, NEWT_GRID_COMPONENT, cb, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + newtComponentAddCallback(cb, warnCallback, &warnCache); + + cb = newtCheckbox(-1, -1, _("Use Hesiod"), + authInfo->enableHesiod ? '*' : ' ', + NULL, &hesiod); + newtGridSetField(infoGrid, 0, 2, NEWT_GRID_COMPONENT, cb, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + + cb = newtCheckbox(-1, -1, _("Use LDAP"), + authInfo->enableLDAP ? '*' : ' ', + NULL, &ldap); + newtGridSetField(infoGrid, 0, 3, NEWT_GRID_COMPONENT, cb, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + newtComponentAddCallback(cb, warnCallback, &warnLDAP); + + cb = newtCheckbox(-1, -1, _("Use NIS"), + authInfo->enableNIS ? '*' : ' ', + NULL, &nis); + newtGridSetField(infoGrid, 0, 4, NEWT_GRID_COMPONENT, cb, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + newtComponentAddCallback(cb, warnCallback, &warnNIS); + + cb = newtCheckbox(-1, -1, _("Use Winbind"), + authInfo->enableWinbind ? '*' : ' ', + NULL, &winbind); + newtGridSetField(infoGrid, 0, 5, NEWT_GRID_COMPONENT, cb, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + newtComponentAddCallback(cb, warnCallback, &warnWinbind); + + /* Authentication. */ + authGrid = newtCreateGrid(1, 7); + + comp = newtLabel(-1, -1, _("Authentication")); + newtGridSetField(authGrid, 0, 0, NEWT_GRID_COMPONENT, comp, + 1, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + + cb = newtCheckbox(-1, -1, _("Use MD5 Passwords"), + authInfo->enableMD5 ? '*' : ' ', + NULL, &md5); + newtGridSetField(authGrid, 0, 1, NEWT_GRID_COMPONENT, cb, + 1, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + + cb = newtCheckbox(-1, -1, _("Use Shadow Passwords"), + authInfo->enableShadow ? '*' : ' ', + NULL, &shadow); + newtGridSetField(authGrid, 0, 2, NEWT_GRID_COMPONENT, cb, + 1, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + newtComponentAddCallback(cb, warnCallback, &warnShadow); + + cb = newtCheckbox(-1, -1, _("Use LDAP Authentication"), + authInfo->enableLDAP ? '*' : ' ', + NULL, &ldapa); + newtGridSetField(authGrid, 0, 3, NEWT_GRID_COMPONENT, cb, + 1, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + newtComponentAddCallback(cb, warnCallback, &warnLDAPAuth); + + cb = newtCheckbox(-1, -1, _("Use Kerberos"), + authInfo->enableKerberos ? '*' : ' ', + NULL, &krb5); + newtGridSetField(authGrid, 0, 4, NEWT_GRID_COMPONENT, cb, + 1, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + newtComponentAddCallback(cb, warnCallback, &warnKerberos); + + cb = newtCheckbox(-1, -1, _("Use SMB Authentication"), + authInfo->enableSMB ? '*' : ' ', + NULL, &smb); + newtGridSetField(authGrid, 0, 5, NEWT_GRID_COMPONENT, cb, + 1, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + newtComponentAddCallback(cb, warnCallback, &warnSMB); + + cb = newtCheckbox(-1, -1, _("Use Winbind Authentication"), + authInfo->enableWinbind ? '*' : ' ', + NULL, &winbind); + newtGridSetField(authGrid, 0, 6, NEWT_GRID_COMPONENT, cb, + 1, 0, 0, 0, NEWT_ANCHOR_LEFT, NEWT_GRID_FLAG_GROWX); + newtComponentAddCallback(cb, warnCallback, &warnWinbindAuth); + + /* Control grid. */ + mechGrid = newtCreateGrid(2, 1); + newtGridSetField(mechGrid, 0, 0, NEWT_GRID_SUBGRID, infoGrid, + 1, 0, 1, 1, NEWT_ANCHOR_LEFT, 0); + newtGridSetField(mechGrid, 1, 0, NEWT_GRID_SUBGRID, authGrid, + 1, 0, 1, 1, NEWT_ANCHOR_RIGHT, 0); + + /* Buttons. */ + buttonGrid = newtCreateGrid(2, 1); + cancel = newtButton(-1, -1, back ? _("Back") : _("Cancel")); + ok = newtButton(-1, -1, _("Next")); + newtGridSetField(buttonGrid, 0, 0, NEWT_GRID_COMPONENT, cancel, + 0, 0, 0, 0, 0, 0); + newtGridSetField(buttonGrid, 1, 0, NEWT_GRID_COMPONENT, ok, + 0, 0, 0, 0, 0, 0); + /* Top-level grid. */ + mainGrid = newtCreateGrid(1, 2); + newtGridSetField(mainGrid, 0, 0, NEWT_GRID_SUBGRID, mechGrid, + 0, 0, 0, 0, 0, NEWT_GRID_FLAG_GROWX); + newtGridSetField(mainGrid, 0, 1, NEWT_GRID_SUBGRID, buttonGrid, + 0, 0, 0, 0, 0, NEWT_GRID_FLAG_GROWX); + + /* Run the form and interpret the results. */ + form = newtForm(NULL, NULL, 0); + newtGridWrappedWindow(mainGrid, _("Authentication Configuration")); + newtGridAddComponentsToForm(mainGrid, form, 1); + + /* BEHOLD! AUTHCONFIG IN ALL ITS GORY GLORY! */ + comp = newtRunForm(form); + + if (comp != cancel) { + authInfo->enableCache = (cache == '*'); + authInfo->enableHesiod = (hesiod == '*'); + authInfo->enableLDAP = (ldap == '*'); + authInfo->enableNIS = (nis == '*'); + authInfo->enableWinbind = (winbind == '*'); + authInfo->enableShadow = (shadow == '*'); + authInfo->enableMD5 = (md5 == '*'); + authInfo->enableLDAPAuth = (ldapa == '*'); + authInfo->enableKerberos = (krb5 == '*'); + authInfo->enableSMB = (smb == '*'); + } + + newtFormDestroy(form); + newtPopWindow(); + + return (comp != cancel) ? TRUE : FALSE; +} + +#if 0 static int getNSSChoices(int back, gboolean nisAvail, gboolean ldapAvail, gboolean kerberosAvail, gboolean smbAvail, gboolean cacheAvail, @@ -675,6 +1217,9 @@ getChoices(int back, gboolean nisAvail, gboolean ldapAvail, { int rc = FALSE, next = 1, i; + getMainChoices(back, nisAvail, ldapAvail, kerberosAvail, smbAvail, cacheAvail, authInfo); + return 1; + /* State machine (couldn't come up with a cleaner way to express the logic): * 1: query for NSS setup. * 2: query for PAM setup. @@ -715,6 +1260,83 @@ getChoices(int back, gboolean nisAvail, gboolean ldapAvail, return rc; } +#endif + +static int +getChoices(int back, gboolean nisAvail, gboolean ldapAvail, + gboolean kerberosAvail, gboolean smbAvail, gboolean cacheAvail, + struct authInfoType *authInfo) +{ + int next = 1; + gboolean rc = FALSE, more; + while ((next >= 0) && (next <= 7)) { + authInfoUpdate(authInfo); + switch (next) { + case 1: + rc = getMainChoices(back, nisAvail, ldapAvail, kerberosAvail, + smbAvail, cacheAvail, authInfo); + break; + case 2: + if (authInfo->enableHesiod) { + more = authInfo->enableLDAP || + authInfo->enableLDAPAuth || + authInfo->enableKerberos || + authInfo->enableNIS || + authInfo->enableSMB || + authInfo->enableWinbind; + rc = getHesiodSettings(authInfo, more); + } + break; + case 3: + if (authInfo->enableLDAP || authInfo->enableLDAPAuth) { + more = authInfo->enableKerberos || + authInfo->enableNIS || + authInfo->enableSMB || + authInfo->enableWinbind; + rc = getLDAPSettings(authInfo, more); + } + break; + case 4: + if (authInfo->enableNIS) { + more = authInfo->enableKerberos || + authInfo->enableSMB || + authInfo->enableWinbind; + rc = getNISSettings(authInfo, more); + } + break; + case 5: + if (authInfo->enableKerberos) { + more = authInfo->enableSMB || + authInfo->enableWinbind; + rc = getKerberosSettings(authInfo, more); + } + break; + case 6: + if (authInfo->enableSMB && !authInfo->enableWinbind) { + more = authInfo->enableWinbind; + rc = getSMBSettings(authInfo, more); + } + break; + case 7: + if (authInfo->enableWinbind) { + more = FALSE; + rc = getWinbindSettings(authInfo, more); + } + break; + default: + g_assert_not_reached(); + break; + } + authInfoUpdate(authInfo); + if (rc) { + next++; + } else { + next--; + } + } + return (next == 8); +} + static gboolean fileInaccessible(const char *path, int perms) diff --git a/authconfig.spec b/authconfig.spec index 5e99a63..14c7eb8 100644 --- a/authconfig.spec +++ b/authconfig.spec @@ -8,7 +8,7 @@ Group: System Environment/Base BuildRoot: %{_tmppath}/%{name}-root Source: %{name}-%{version}-%{release}.tar.gz Requires: glibc >= 2.1, pam >= 0.73, glib2, pam >= 0.75-43 -Conflicts: pam_krb5 < 1.49 +Conflicts: pam_krb5 < 1.49, samba-common < 3.0, samba-client < 3.0 BuildPrereq: pam-devel >= 0.73, newt-devel, glib2-devel, python, python-devel BuildPrereq: desktop-file-utils @@ -71,7 +71,10 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/pixmaps/* %changelog -* Mon Nov 10 2003 Nalin Dahyabhai 4.4-1 +* Thu Nov 13 2003 Nalin Dahyabhai 4.4-1 +- conflict with older versions of samba which expect different configuration + +* Mon Nov 10 2003 Nalin Dahyabhai - initial support for configuring winbind * Tue Oct 28 2003 Nalin Dahyabhai diff --git a/authconfigmodule.c b/authconfigmodule.c index e03355a..cd6e8d8 100644 --- a/authconfigmodule.c +++ b/authconfigmodule.c @@ -415,17 +415,13 @@ authconfig_differs(PyObject *self, PyObject *args, PyObject *kwargs) { struct authInfoObject *info, *other; char *keywords[] = {"other", NULL}; - gboolean *b1, *b2, equal; - char **p1, **p2; - int i; + gboolean equal; if (!authInfoObject_Check(self)) { return NULL; } - info = (struct authInfoObject *)self; other = NULL; - if (PyTuple_Check(args)) { if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", keywords, &authInfoObjectType, &other)) { @@ -439,40 +435,8 @@ authconfig_differs(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } - equal = TRUE; - for (i = 0; i < G_N_ELEMENTS(map); i++) { - switch(map[i].type) { - case tfvalue: - b1 = G_STRUCT_MEMBER_P(info->info, - map[i].offset); - b2 = G_STRUCT_MEMBER_P(other->info, - map[i].offset); - if (*b1 != *b2) { - equal = FALSE; - } - break; - case svalue: - p1 = G_STRUCT_MEMBER_P(info->info, - map[i].offset); - p2 = G_STRUCT_MEMBER_P(other->info, - map[i].offset); - if (((*p1 == NULL) || (strlen(*p1) == 0)) && - ((*p2 == NULL) || (strlen(*p2) == 0))) { - continue; - } - if (((*p1 == NULL) || (strlen(*p1) == 0)) || - ((*p2 == NULL) || (strlen(*p2) == 0))) { - equal = FALSE; - } else - if (strcmp(*p1, *p2) != 0) { - equal = FALSE; - } - break; - default: - g_error("Ouch! What do you do?"); - break; - } - } + info = (struct authInfoObject *) self; + equal = authInfoDiffers(info->info, other->info); if (equal) { Py_INCREF(Py_None); return Py_None; diff --git a/authinfo.c b/authinfo.c index 31ea59c..06b6a53 100644 --- a/authinfo.c +++ b/authinfo.c @@ -1071,13 +1071,98 @@ authInfoReadNetwork(struct authInfoType *authInfo) return TRUE; } +/* Compare two authInfoType structures and return TRUE if they have any + * meaningful differences. */ +static gboolean +string_differs(const char *a, const char *b, gboolean case_sensitive) +{ + if (is_empty(a) && is_empty(b)) { + return FALSE; + } + if (is_empty(a) || is_empty(b)) { + return TRUE; + } + if (case_sensitive) { + return (strcmp(a, b) != 0) ? TRUE : FALSE; + } else { + return (g_ascii_strcasecmp(a, b) != 0) ? TRUE : FALSE; + } +} +gboolean +authInfoDiffers(struct authInfoType *a, struct authInfoType *b) +{ + return string_differs(a->hesiodLHS, b->hesiodLHS, FALSE) || + string_differs(a->hesiodRHS, b->hesiodRHS, FALSE) || + + string_differs(a->ldapServer, b->ldapServer, FALSE) || + string_differs(a->ldapBaseDN, b->ldapBaseDN, FALSE) || + + string_differs(a->kerberosRealm, b->kerberosRealm, TRUE) || + string_differs(a->kerberosKDC, b->kerberosKDC, FALSE) || + string_differs(a->kerberosAdminServer, + b->kerberosAdminServer, FALSE) || + string_differs(a->nisServer, b->nisServer, TRUE) || + string_differs(a->nisDomain, b->nisDomain, TRUE) || + + string_differs(a->smbWorkgroup, b->smbWorkgroup, FALSE) || + string_differs(a->smbRealm, b->smbRealm, TRUE) || + string_differs(a->smbServers, b->smbServers, FALSE) || + string_differs(a->smbSecurity, b->smbSecurity, FALSE) || + string_differs(a->smbIdmapUid, b->smbIdmapUid, FALSE) || + string_differs(a->smbIdmapGid, b->smbIdmapGid, FALSE) || + + string_differs(a->winbindSeparator, + b->winbindSeparator, TRUE) || + string_differs(a->winbindTemplateHomedir, + b->winbindTemplateHomedir, TRUE) || + string_differs(a->winbindTemplatePrimaryGroup, + b->winbindTemplatePrimaryGroup, TRUE) || + string_differs(a->winbindTemplateShell, + b->winbindTemplateShell, TRUE) || + + (a->winbindUseDefaultDomain != b->winbindUseDefaultDomain) || + /* (a->enableCache != b->enableCache) || */ + + (a->enableDB != b->enableDB) || + (a->enableDirectories != b->enableDirectories) || + (a->enableHesiod != b->enableHesiod) || + (a->enableLDAP != b->enableLDAP) || + (a->enableLDAPS != b->enableLDAPS) || + (a->enableNIS != b->enableNIS) || + (a->enableNIS3 != b->enableNIS3) || + (a->enableDBbind != b->enableDBbind) || + (a->enableDBIbind != b->enableDBIbind) || + (a->enableHesiodbind != b->enableHesiodbind) || + (a->enableLDAPbind != b->enableLDAPbind) || + (a->enableOdbcbind != b->enableOdbcbind) || + (a->enableWinbind != b->enableWinbind) || + (a->enableWINS != b->enableWINS) || + + (a->enableAFS != b->enableAFS) || + (a->enableAFSKerberos != b->enableAFSKerberos) || + (a->enableBigCrypt != b->enableBigCrypt) || + (a->enableEPS != b->enableEPS) || + (a->enableKerberos != b->enableKerberos) || + (a->enableLDAPAuth != b->enableLDAPAuth) || + (a->enableMD5 != b->enableMD5) || + (a->enableOTP != b->enableOTP) || + (a->enableShadow != b->enableShadow) || + (a->enableSMB != b->enableSMB) || +#ifdef LOCAL_POLICIES + (a->enableLocal != b->enableLocal) || +#endif + (a->brokenShadow != b->brokenShadow) || + + string_differs(a->joinUser, b->joinUser, TRUE) || + string_differs(a->joinPassword, b->joinPassword, TRUE); +} + /* There's some serious strangeness in here, because we get called in two * different-but-closely-related scenarios. The first case is when we're * initializing the authInfo structure and we want to fill in defaults with * suggestions we "know". The second case is when the user has just made a * change to one field and we need to update another field to somehow * compensate for the change. */ - void authInfoUpdate(struct authInfoType *info) { diff --git a/authinfo.h b/authinfo.h index 8c9e9fc..a42ad48 100644 --- a/authinfo.h +++ b/authinfo.h @@ -26,6 +26,7 @@ #define AUTH_MODULE_DIR "/lib/security/$ISA" #define PATH_PORTMAP "/sbin/portmap" +#define PATH_PWCONV "/usr/sbin/pwconv" #define PATH_NSCD "/usr/sbin/nscd" #define PATH_NSCD_PID "/var/run/nscd.pid" #define PATH_DBBIND "/usr/sbin/dbbind" @@ -147,6 +148,7 @@ struct authInfoType { struct authInfoType *authInfoRead(void); void authInfoFree(struct authInfoType *info); struct authInfoType *authInfoProbe(void); +gboolean authInfoDiffers(struct authInfoType *a, struct authInfoType *b); struct authInfoType *authInfoCopy(struct authInfoType *info); gboolean authInfoWrite(struct authInfoType *info); diff --git a/po/authconfig.pot b/po/authconfig.pot index d5f6a30..90d0f07 100644 --- a/po/authconfig.pot +++ b/po/authconfig.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2003-11-12 19:30-0500\n" +"POT-Creation-Date: 2003-11-17 15:32-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,113 +16,230 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: authconfig.c:125 +#: authconfig.c:126 authconfig.c:624 msgid "Warning" msgstr "" -#: authconfig.c:125 authconfig.c:601 authconfig.c:614 +#: authconfig.c:126 authconfig.c:368 authconfig.c:624 authconfig.c:1142 +#: authconfig.c:1155 msgid "Ok" msgstr "" -#: authconfig.c:143 +#: authconfig.c:144 authconfig.c:487 authconfig.c:592 msgid "Domain:" msgstr "" -#: authconfig.c:144 authconfig.c:184 +#: authconfig.c:145 authconfig.c:185 authconfig.c:473 authconfig.c:489 msgid "Server:" msgstr "" -#: authconfig.c:164 +#: authconfig.c:165 authconfig.c:457 msgid "LHS:" msgstr "" -#: authconfig.c:165 +#: authconfig.c:166 authconfig.c:459 msgid "RHS:" msgstr "" -#: authconfig.c:185 +#: authconfig.c:186 authconfig.c:475 msgid "Base DN:" msgstr "" -#: authconfig.c:218 +#: authconfig.c:219 authconfig.c:501 msgid "Realm:" msgstr "" -#: authconfig.c:219 +#: authconfig.c:220 authconfig.c:503 msgid "KDC:" msgstr "" -#: authconfig.c:220 +#: authconfig.c:221 authconfig.c:505 msgid "Admin Server:" msgstr "" -#: authconfig.c:244 +#: authconfig.c:245 authconfig.c:517 msgid "Workgroup:" msgstr "" -#: authconfig.c:245 +#: authconfig.c:246 authconfig.c:519 msgid "Servers:" msgstr "" -#. NSCD -#: authconfig.c:285 -msgid "Cache Information" +#: authconfig.c:367 authconfig.c:763 authconfig.c:934 authconfig.c:1144 +msgid "Cancel" msgstr "" -#. NSS modules: NIS. -#: authconfig.c:293 -msgid "Use NIS" +#: authconfig.c:367 authconfig.c:763 authconfig.c:934 authconfig.c:1143 +#: authconfig.c:1156 +msgid "Back" msgstr "" -#: authconfig.c:323 -msgid "Use LDAP" +#: authconfig.c:368 authconfig.c:764 authconfig.c:933 +msgid "Next" msgstr "" -#: authconfig.c:328 authconfig.c:491 +#: authconfig.c:462 glade.strings:50 +msgid "Hesiod Settings" +msgstr "" + +#: authconfig.c:471 authconfig.c:869 authconfig.c:1032 msgid "Use TLS" msgstr "" +#: authconfig.c:478 glade.strings:67 +msgid "LDAP Settings" +msgstr "" + +#: authconfig.c:492 glade.strings:45 +msgid "NIS Settings" +msgstr "" + +#: authconfig.c:508 glade.strings:55 +msgid "Kerberos Settings" +msgstr "" + +#: authconfig.c:521 +msgid "Shell:" +msgstr "" + +#: authconfig.c:524 glade.strings:62 +msgid "SMB Settings" +msgstr "" + +#: authconfig.c:534 +msgid "Domain Administrator:" +msgstr "" + +#: authconfig.c:536 +msgid "Password:" +msgstr "" + +#: authconfig.c:543 +msgid "Join Settings" +msgstr "" + +#: authconfig.c:562 glade.strings:92 +msgid "" +"Some of the configuration changes you've made should be saved to disk before " +"continuing. If you do not save them, then your attempt to join the domain " +"may fail. Save changes?" +msgstr "" + +#: authconfig.c:568 +msgid "Save Settings" +msgstr "" + +#: authconfig.c:590 +msgid "Security Model:" +msgstr "" + +#: authconfig.c:594 +msgid "Domain Controllers:" +msgstr "" + +#: authconfig.c:596 +msgid "ADS Realm:" +msgstr "" + +#: authconfig.c:599 glade.strings:73 +msgid "Winbind Settings" +msgstr "" + +#: authconfig.c:601 +msgid "Join Domain" +msgstr "" + +#: authconfig.c:639 +msgid "caching" +msgstr "" + +#: authconfig.c:642 glade.strings:35 +msgid "Kerberos" +msgstr "" + +#: authconfig.c:645 +msgid "LDAP authentication" +msgstr "" + +#: authconfig.c:648 glade.strings:16 glade.strings:31 +msgid "LDAP" +msgstr "" + +#: authconfig.c:651 glade.strings:12 +msgid "NIS" +msgstr "" + +#: authconfig.c:654 +msgid "shadow password" +msgstr "" + +#: authconfig.c:657 +msgid "SMB authentication" +msgstr "" + +#: authconfig.c:660 +msgid "Winbind authentication" +msgstr "" + +#: authconfig.c:663 glade.strings:24 glade.strings:43 +msgid "Winbind" +msgstr "" + +#: authconfig.c:668 glade.strings:25 +msgid "User Information" +msgstr "" + +#. NSCD +#: authconfig.c:672 authconfig.c:826 +msgid "Cache Information" +msgstr "" + #. NSS modules: hesiod. -#: authconfig.c:362 +#: authconfig.c:679 authconfig.c:903 msgid "Use Hesiod" msgstr "" -#: authconfig.c:392 -msgid "Next" +#: authconfig.c:685 authconfig.c:864 +msgid "Use LDAP" msgstr "" -#: authconfig.c:393 authconfig.c:602 authconfig.c:615 -msgid "Back" +#. NSS modules: NIS. +#: authconfig.c:692 authconfig.c:834 +msgid "Use NIS" msgstr "" -#: authconfig.c:393 authconfig.c:603 -msgid "Cancel" +#: authconfig.c:699 +msgid "Use Winbind" msgstr "" -#: authconfig.c:413 -msgid "User Information Configuration" +#: authconfig.c:709 authconfig.desktop.in.h:1 glade.strings:44 +msgid "Authentication" msgstr "" -#: authconfig.c:474 -msgid "Use Shadow Passwords" +#: authconfig.c:713 authconfig.c:1020 +msgid "Use MD5 Passwords" msgstr "" -#: authconfig.c:479 -msgid "Use MD5 Passwords" +#: authconfig.c:719 authconfig.c:1015 +msgid "Use Shadow Passwords" msgstr "" -#: authconfig.c:486 +#: authconfig.c:726 authconfig.c:1027 msgid "Use LDAP Authentication" msgstr "" -#: authconfig.c:524 -msgid "Use Kerberos 5" +#: authconfig.c:733 +msgid "Use Kerberos" msgstr "" -#: authconfig.c:562 +#: authconfig.c:740 authconfig.c:1103 msgid "Use SMB Authentication" msgstr "" +#: authconfig.c:747 +msgid "Use Winbind Authentication" +msgstr "" + #. !/usr/bin/python #. "checkbox/button name": authInfo field, file, generic name, #. package, names of widgets to disable if checkbox not active @@ -137,320 +254,324 @@ msgstr "" #. Toggle a boolean. #. Create a vbox or dialog using the file, and return it. */ #. Create a vbox with the right controls and return the vbox. */ -#: authconfig.c:632 authconfig-gtk.py:283 glade.strings:7 +#: authconfig.c:779 authconfig.c:1173 authconfig-gtk.py:285 glade.strings:7 msgid "Authentication Configuration" msgstr "" -#: authconfig.c:789 +#: authconfig.c:954 +msgid "User Information Configuration" +msgstr "" + +#: authconfig.c:1065 +msgid "Use Kerberos 5" +msgstr "" + +#: authconfig.c:1410 msgid "enable shadowed passwords by default" msgstr "" -#: authconfig.c:791 +#: authconfig.c:1412 msgid "disable shadowed passwords by default" msgstr "" -#: authconfig.c:795 +#: authconfig.c:1416 msgid "enable MD5 passwords by default" msgstr "" -#: authconfig.c:797 +#: authconfig.c:1418 msgid "disable MD5 passwords by default\n" msgstr "" -#: authconfig.c:800 +#: authconfig.c:1421 msgid "enable NIS" msgstr "" -#: authconfig.c:802 +#: authconfig.c:1423 msgid "disable NIS" msgstr "" -#: authconfig.c:804 +#: authconfig.c:1425 msgid "default NIS domain" msgstr "" -#: authconfig.c:804 +#: authconfig.c:1425 msgid "" msgstr "" -#: authconfig.c:806 +#: authconfig.c:1427 msgid "default NIS server\n" msgstr "" -#: authconfig.c:806 authconfig.c:821 authconfig.c:830 authconfig.c:832 -#: authconfig.c:843 +#: authconfig.c:1427 authconfig.c:1442 authconfig.c:1451 authconfig.c:1453 +#: authconfig.c:1464 msgid "" msgstr "" -#: authconfig.c:809 +#: authconfig.c:1430 msgid "enable LDAP for user information by default" msgstr "" -#: authconfig.c:811 +#: authconfig.c:1432 msgid "disable LDAP for user information by default" msgstr "" -#: authconfig.c:813 +#: authconfig.c:1434 msgid "enable use of TLS with LDAP" msgstr "" -#: authconfig.c:815 +#: authconfig.c:1436 msgid "disable use of TLS with LDAP" msgstr "" -#: authconfig.c:817 +#: authconfig.c:1438 msgid "enable LDAP for authentication by default" msgstr "" -#: authconfig.c:819 +#: authconfig.c:1440 msgid "disable LDAP for authentication by default" msgstr "" -#: authconfig.c:821 +#: authconfig.c:1442 msgid "default LDAP server" msgstr "" -#: authconfig.c:823 +#: authconfig.c:1444 msgid "default LDAP base DN\n" msgstr "" -#: authconfig.c:823 +#: authconfig.c:1444 msgid "" msgstr "" -#: authconfig.c:826 +#: authconfig.c:1447 msgid "enable kerberos authentication by default" msgstr "" -#: authconfig.c:828 +#: authconfig.c:1449 msgid "disable kerberos authentication by default" msgstr "" -#: authconfig.c:830 +#: authconfig.c:1451 msgid "default kerberos KDC" msgstr "" -#: authconfig.c:832 +#: authconfig.c:1453 msgid "default kerberos admin server" msgstr "" -#: authconfig.c:834 +#: authconfig.c:1455 msgid "default kerberos realm\n" msgstr "" -#: authconfig.c:834 +#: authconfig.c:1455 msgid "" msgstr "" -#: authconfig.c:837 +#: authconfig.c:1458 msgid "enable SMB authentication by default" msgstr "" -#: authconfig.c:839 +#: authconfig.c:1460 msgid "disable SMB authentication by default" msgstr "" -#: authconfig.c:841 +#: authconfig.c:1462 msgid "workgroup authentication servers are in" msgstr "" -#: authconfig.c:841 +#: authconfig.c:1462 msgid "" msgstr "" -#: authconfig.c:843 +#: authconfig.c:1464 msgid "names of servers to authenticate against\n" msgstr "" -#: authconfig.c:846 +#: authconfig.c:1467 msgid "enable winbind for user information and authentication by default" msgstr "" -#: authconfig.c:849 +#: authconfig.c:1470 msgid "disable winbind for user information and authentication by default" msgstr "" -#: authconfig.c:852 +#: authconfig.c:1473 msgid "security mode to use for samba and winbind" msgstr "" -#: authconfig.c:854 +#: authconfig.c:1475 msgid "default realm for samba and winbind when security=ads" msgstr "" -#: authconfig.c:856 +#: authconfig.c:1477 msgid "uid range winbind will assign to domain or ads users" msgstr "" -#: authconfig.c:857 authconfig.c:860 +#: authconfig.c:1478 authconfig.c:1481 msgid "" msgstr "" -#: authconfig.c:859 +#: authconfig.c:1480 msgid "gid range winbind will assign to domain or ads users" msgstr "" -#: authconfig.c:863 +#: authconfig.c:1484 msgid "" "the character which will be used to separate the domain and user part of " "winbind-created user names if winbindusedefaultdomain is not enabled" msgstr "" -#: authconfig.c:867 +#: authconfig.c:1488 msgid "the directory which winbind-created users will have as home directories" msgstr "" -#: authconfig.c:871 +#: authconfig.c:1492 msgid "the group which winbind-created users will have as their primary group" msgstr "" -#: authconfig.c:874 +#: authconfig.c:1495 msgid "the shell which winbind-created users will have as their login shell" msgstr "" -#: authconfig.c:878 +#: authconfig.c:1499 msgid "" "configures winbind to assume that users with no domain in their user names " "are domain users" msgstr "" -#: authconfig.c:882 +#: authconfig.c:1503 msgid "" "configures winbind to assume that users with no domain in their user names " "are not domain users" msgstr "" -#: authconfig.c:886 +#: authconfig.c:1507 msgid "join the winbind domain or ads realm now as this administrator\n" msgstr "" -#: authconfig.c:890 +#: authconfig.c:1511 msgid "enable wins for hostname resolution" msgstr "" -#: authconfig.c:892 +#: authconfig.c:1513 msgid "disable wins for hostname resolution\n" msgstr "" -#: authconfig.c:895 +#: authconfig.c:1516 msgid "enable hesiod for user information by default" msgstr "" -#: authconfig.c:897 +#: authconfig.c:1518 msgid "disable hesiod for user information by default" msgstr "" -#: authconfig.c:899 +#: authconfig.c:1520 msgid "default hesiod LHS" msgstr "" -#: authconfig.c:899 +#: authconfig.c:1520 msgid "" msgstr "" -#: authconfig.c:901 +#: authconfig.c:1522 msgid "default hesiod RHS\n" msgstr "" -#: authconfig.c:901 +#: authconfig.c:1522 msgid "" msgstr "" -#: authconfig.c:904 +#: authconfig.c:1525 msgid "enable caching of user information by default" msgstr "" -#: authconfig.c:906 +#: authconfig.c:1527 msgid "disable caching of user information by default\n" msgstr "" -#: authconfig.c:913 +#: authconfig.c:1534 msgid "do not start/stop portmap, ypbind, and nscd" msgstr "" -#: authconfig.c:915 +#: authconfig.c:1536 msgid "don't display user interface" msgstr "" -#: authconfig.c:917 +#: authconfig.c:1538 msgid "probe network for defaults and print them" msgstr "" -#: authconfig.c:920 +#: authconfig.c:1541 msgid "use locally-defined policies" msgstr "" -#: authconfig.c:922 +#: authconfig.c:1543 msgid "don't use locally-defined policies" msgstr "" -#: authconfig.c:933 +#: authconfig.c:1554 #, c-format msgid "%s: bad argument %s: %s\n" msgstr "" -#: authconfig.c:942 +#: authconfig.c:1563 #, c-format msgid "%s: attempting to continue\n" msgstr "" -#: authconfig.c:946 +#: authconfig.c:1567 #, c-format msgid "%s: unexpected argument\n" msgstr "" -#: authconfig.c:978 +#: authconfig.c:1599 #, c-format msgid "%s: can only be run as root\n" msgstr "" -#: authconfig.c:989 authconfig.c:997 authconfig.c:1005 authconfig.c:1013 -#: authconfig.c:1021 authconfig.c:1029 authconfig.c:1037 authconfig.c:1050 -#: authconfig.c:1058 +#: authconfig.c:1610 authconfig.c:1618 authconfig.c:1626 authconfig.c:1634 +#: authconfig.c:1642 authconfig.c:1650 authconfig.c:1658 authconfig.c:1671 +#: authconfig.c:1679 #, c-format msgid "%s: critical error reading %s/%s" msgstr "" -#: authconfig.c:1044 +#: authconfig.c:1665 #, c-format msgid "%s: unable to read caching configuration" msgstr "" -#: authconfig.c:1140 +#: authconfig.c:1761 msgid "" " / between elements | selects | next " "screen" msgstr "" -#: authconfig.c:1143 +#: authconfig.c:1764 msgid "(c) 1999-2003 Red Hat, Inc." msgstr "" -#: authconfig.c:1150 +#: authconfig.c:1771 msgid "dialog was cancelled\n" msgstr "" -#: authconfig.c:1165 +#: authconfig.c:1786 #, c-format msgid "%s: critical error recording caching setting" msgstr "" -#: authconfig.c:1171 authconfig.c:1177 authconfig.c:1183 authconfig.c:1189 -#: authconfig.c:1194 authconfig.c:1200 authconfig.c:1205 authconfig.c:1210 -#: authconfig.c:1215 authconfig.c:1221 +#: authconfig.c:1792 authconfig.c:1798 authconfig.c:1804 authconfig.c:1810 +#: authconfig.c:1815 authconfig.c:1821 authconfig.c:1826 authconfig.c:1831 +#: authconfig.c:1836 authconfig.c:1842 #, c-format msgid "%s: critical error writing %s/%s" msgstr "" -#: authconfig.desktop.in.h:1 glade.strings:44 -msgid "Authentication" -msgstr "" - #: authconfig.desktop.in.h:2 msgid "Control how the system verifies users who attempt to log in" msgstr "" -#: authinfo.h:65 +#: authinfo.h:66 #, c-format msgid "" "The %s file was not found, but it is required for %s support to work " @@ -475,10 +596,6 @@ msgid "" "medium networks." msgstr "" -#: glade.strings:12 -msgid "NIS" -msgstr "" - #: glade.strings:13 glade.strings:28 msgid "Enable _LDAP Support" msgstr "" @@ -494,10 +611,6 @@ msgid "" "increasingly being used in small to large networks." msgstr "" -#: glade.strings:16 glade.strings:31 -msgid "LDAP" -msgstr "" - #: glade.strings:17 msgid "Enable _Hesiod Support" msgstr "" @@ -531,14 +644,6 @@ msgid "" "It is used in small to large networks." msgstr "" -#: glade.strings:24 glade.strings:43 -msgid "Winbind" -msgstr "" - -#: glade.strings:25 -msgid "User Information" -msgstr "" - #: glade.strings:26 msgid "Use _Shadow Passwords" msgstr "" @@ -561,10 +666,6 @@ msgid "" "used in medium to large networks." msgstr "" -#: glade.strings:35 -msgid "Kerberos" -msgstr "" - #: glade.strings:36 msgid "Enable _SMB Support" msgstr "" @@ -583,14 +684,10 @@ msgstr "" msgid "SMB" msgstr "" -#: glade.strings:45 -msgid "NIS Settings" -msgstr "" - #: glade.strings:46 glade.strings:49 glade.strings:51 glade.strings:54 #: glade.strings:56 glade.strings:59 glade.strings:61 glade.strings:63 #: glade.strings:66 glade.strings:68 glade.strings:71 glade.strings:77 -#: glade.strings:79 glade.strings:82 glade.strings:85 glade.strings:89 +#: glade.strings:79 glade.strings:82 glade.strings:84 glade.strings:88 msgid "*" msgstr "" @@ -602,10 +699,6 @@ msgstr "" msgid "NIS _Domain" msgstr "" -#: glade.strings:50 -msgid "Hesiod Settings" -msgstr "" - #: glade.strings:52 msgid "Hesiod _RHS" msgstr "" @@ -614,10 +707,6 @@ msgstr "" msgid "Hesiod _LHS" msgstr "" -#: glade.strings:55 -msgid "Kerberos Settings" -msgstr "" - #: glade.strings:57 msgid "_Admin Servers" msgstr "" @@ -630,10 +719,6 @@ msgstr "" msgid "_KDCs" msgstr "" -#: glade.strings:62 -msgid "SMB Settings" -msgstr "" - #: glade.strings:64 msgid "_Domain Controllers" msgstr "" @@ -642,10 +727,6 @@ msgstr "" msgid "_Workgroup" msgstr "" -#: glade.strings:67 -msgid "LDAP Settings" -msgstr "" - #: glade.strings:69 msgid "LDAP _Server" msgstr "" @@ -658,10 +739,6 @@ msgstr "" msgid "Use _TLS to encrypt connections" msgstr "" -#: glade.strings:73 -msgid "Winbind Settings" -msgstr "" - #: glade.strings:74 msgid "_Join Domain" msgstr "" @@ -690,41 +767,30 @@ msgstr "" msgid "Joining Winbind Domain" msgstr "" -#: glade.strings:84 -msgid "Administrator" -msgstr "" - -#: glade.strings:86 +#: glade.strings:85 msgid "Domain _Administrator" msgstr "" -#: glade.strings:87 +#: glade.strings:86 msgid "Domain" msgstr "" -#: glade.strings:88 +#: glade.strings:87 msgid "_Password" msgstr "" -#: glade.strings:90 +#: glade.strings:89 msgid "EXAMPLE.COM" msgstr "" -#: glade.strings:91 +#: glade.strings:90 msgid "Alert" msgstr "" -#: glade.strings:92 +#: glade.strings:91 msgid "Do_n't Save" msgstr "" -#: glade.strings:93 -msgid "" -"Some of the configuration changes you've made should be saved to disk before " -"continuing. If you do not save them, then your attempt to join the domain " -"may fail. Save changes?" -msgstr "" - #: localpol.h:9 msgid "Use Local Policies" msgstr ""