diff options
Diffstat (limited to 'src/windows/cns/password.c')
-rw-r--r-- | src/windows/cns/password.c | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/src/windows/cns/password.c b/src/windows/cns/password.c new file mode 100644 index 0000000000..c9aaa6574e --- /dev/null +++ b/src/windows/cns/password.c @@ -0,0 +1,328 @@ +/* + * Copyright 1994 by the Massachusetts Institute of Technology. + * + * For copying and distribution information, please see the file + * <mit-copyright.h>. + */ + +/* + * functions to tweak the options dialog + */ + +#include <windows.h> +#include <windowsx.h> + +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#include <string.h> +#include <malloc.h> +#include <ctype.h> +#include <time.h> + +#include "cns.h" + +/* + * Function: Changes the password. + * + * Parameters: + * hwnd - the current window from which command was invoked. + * + * name - name of user to change password for + * + * instance - instance of user to change password for + * + * realm - realm in which to change password + * + * oldpw - the old password + * + * newpw - the new password to change to + * + * Returns: TRUE if change took place, FALSE otherwise. + */ +BOOL +change_password(HWND hwnd, char *name, char *instance, char *realm, + char *oldpw, char *newpw) +{ +#ifdef KRB4 + des_cblock new_key; + char *ret_st; + int krc; + char *p; + CREDENTIALS *c; + int ncred; + char pname[ANAME_SZ]; + char pinstance[INST_SZ]; + + push_credentials(&c, pname, pinstance, &ncred); + krc = krb_get_pw_in_tkt(name, instance, realm, PWSERV_NAME, KADM_SINST, + 1, oldpw); + + if (krc != KSUCCESS) { + if (krc == INTK_BADPW) + p = "Old password is incorrect"; + else + p = krb_get_err_text(krc); + pop_credentials(c, pname, pinstance, ncred); + MessageBox(hwnd, p, "", MB_OK | MB_ICONEXCLAMATION); + + return FALSE; + } + + krc = kadm_init_link(PWSERV_NAME, KRB_MASTER, realm); + + if (krc != KSUCCESS) { + pop_credentials(c, pname, pinstance, ncred); + MessageBox(hwnd, kadm_get_err_text(krc), "", MB_OK | MB_ICONEXCLAMATION); + + return FALSE; + } + + des_string_to_key(newpw, new_key); + krc = kadm_change_pw2(new_key, newpw, &ret_st); + pop_credentials(c, pname, pinstance, ncred); + + if (ret_st != NULL) + free(ret_st); + + if (krc != KSUCCESS) { + MessageBox(hwnd, kadm_get_err_text(krc), "", MB_OK | MB_ICONEXCLAMATION); + + return FALSE; + } + + return TRUE; +#endif /* KRB4 */ + +#ifdef KRB5 + char *msg; /* Message string */ + krb5_error_code code; /* Return value */ + code = k5_change_password(k5_context, name, realm, oldpw, newpw, &msg); + + if (msg != NULL) { + MessageBox(NULL, msg, NULL, MB_ICONEXCLAMATION); + } else if (code) { + if (code == KRB5KRB_AP_ERR_BAD_INTEGRITY) + MessageBox(NULL, "Password incorrect", NULL, MB_ICONEXCLAMATION); + else if (code == ENOENT) + MessageBox(NULL, "Cannot connect to admin server", NULL, + MB_ICONEXCLAMATION); + else + com_err(NULL, code, "while changing password."); + } + + if (code == 0) + MessageBox(NULL, "Password changed.", "Kerberos", MB_OK | MB_APPLMODAL); + + return (code == 0); + +#endif /* KRB5 */ +} +/* + * Function: Process WM_COMMAND messages for the password dialog. + */ +void +password_command(HWND hwnd, int cid, HWND hwndCtl, UINT codeNotify) +{ + char name[ANAME_SZ]; + char instance[INST_SZ]; + char realm[REALM_SZ]; + char oldpw[MAX_KPW_LEN]; + char newpw1[MAX_KPW_LEN]; + char newpw2[MAX_KPW_LEN]; + HCURSOR hcursor; + BOOL b; + int id; + + if (codeNotify != BN_CLICKED) { + GetDlgItemText(hwnd, IDD_PASSWORD_NAME, name, sizeof(name)); + trim(name); + GetDlgItemText(hwnd, IDD_PASSWORD_REALM, realm, sizeof(realm)); + trim(realm); + GetDlgItemText(hwnd, IDD_OLD_PASSWORD, oldpw, sizeof(oldpw)); + GetDlgItemText(hwnd, IDD_NEW_PASSWORD1, newpw1, sizeof(newpw1)); + GetDlgItemText(hwnd, IDD_NEW_PASSWORD2, newpw2, sizeof(newpw2)); + b = strlen(name) && strlen(realm) && strlen(oldpw) && + strlen(newpw1) && strlen(newpw2); + EnableWindow(GetDlgItem(hwnd, IDOK), b); + id = (b) ? IDOK : IDD_PASSWORD_CR; + SendMessage(hwnd, DM_SETDEFID, id, 0); + + return; /* FALSE */ + } + + switch (cid) { + case IDOK: + if (isblocking) + return; /* TRUE */ + + GetDlgItemText(hwnd, IDD_PASSWORD_NAME, name, sizeof(name)); + trim(name); + GetDlgItemText(hwnd, IDD_PASSWORD_INSTANCE, instance, sizeof(instance)); + trim(instance); + GetDlgItemText(hwnd, IDD_PASSWORD_REALM, realm, sizeof(realm)); + trim(realm); + GetDlgItemText(hwnd, IDD_OLD_PASSWORD, oldpw, sizeof(oldpw)); + GetDlgItemText(hwnd, IDD_NEW_PASSWORD1, newpw1, sizeof(newpw1)); + GetDlgItemText(hwnd, IDD_NEW_PASSWORD2, newpw2, sizeof(newpw2)); + + if (strcmp(newpw1, newpw2) != 0) { + MessageBox(hwnd, "The two passwords you entered don't match!", "", + MB_OK | MB_ICONEXCLAMATION); + SetDlgItemText(hwnd, IDD_NEW_PASSWORD1, ""); + SetDlgItemText(hwnd, IDD_NEW_PASSWORD2, ""); + PostMessage(hwnd, WM_NEXTDLGCTL, + (WPARAM)GetDlgItem(hwnd, IDD_NEW_PASSWORD1), MAKELONG(1, 0)); + + return; /* TRUE */ + } + + hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); + start_blocking_hook(BLOCK_MAX_SEC); + + if (change_password(hwnd, name, instance, realm, oldpw, newpw1)) + EndDialog(hwnd, IDOK); + else + PostMessage(hwnd, WM_NEXTDLGCTL, + (WPARAM)GetDlgItem(hwnd, IDD_OLD_PASSWORD), MAKELONG(1, 0)); + + end_blocking_hook(); + SetCursor(hcursor); + + return; /* TRUE */ + + case IDCANCEL: + if (isblocking) + WSACancelBlockingCall(); + EndDialog(hwnd, IDCANCEL); + + return; /* TRUE */ + + case IDD_PASSWORD_CR: + id = GetDlgCtrlID(GetFocus()); + assert(id != 0); + + if (id == IDD_NEW_PASSWORD2) + PostMessage(hwnd, WM_NEXTDLGCTL, + (WPARAM)GetDlgItem(hwnd, IDD_PASSWORD_NAME), MAKELONG(1, 0)); + else + PostMessage(hwnd, WM_NEXTDLGCTL, 0, 0); + + return; /* TRUE */ + + } + + return; /* FALSE */ +} + + +/* + * Function: Process WM_INITDIALOG messages for the password dialog. + * Set up all initial dialog values from the parent dialog. + * + * Returns: TRUE if we didn't set the focus here, + * FALSE if we did. + */ +BOOL +password_initdialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) +{ + char name[ANAME_SZ]; + char realm[REALM_SZ]; + HWND hwndparent; + int id; +#ifdef KRB4 + char instance[INST_SZ]; +#endif + + center_dialog(hwnd); + set_dialog_font(hwnd, hfontdialog); + + hwndparent = GetParent(hwnd); + assert(hwndparent != NULL); + + GetDlgItemText(hwndparent, IDD_LOGIN_NAME, name, sizeof(name)); + trim(name); + SetDlgItemText(hwnd, IDD_PASSWORD_NAME, name); + +#ifdef KRB4 + GetDlgItemText(hwndparent, IDD_LOGIN_INSTANCE, instance, sizeof(instance)); + trim(instance); + SetDlgItemText(hwnd, IDD_PASSWORD_INSTANCE, instance); +#endif + + GetDlgItemText(hwndparent, IDD_LOGIN_REALM, realm, sizeof(realm)); + trim(realm); + SetDlgItemText(hwnd, IDD_PASSWORD_REALM, realm); + + if (strlen(name) == 0) + id = IDD_PASSWORD_NAME; + else if (strlen(realm) == 0) + id = IDD_PASSWORD_REALM; + else + id = IDD_OLD_PASSWORD; + + SetFocus(GetDlgItem(hwnd, id)); + + return FALSE; +} + + +/* + * Function: Process dialog specific messages for the password dialog. + */ +BOOL CALLBACK +password_dlg_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) { + + HANDLE_MSG(hwnd, WM_INITDIALOG, password_initdialog); + + HANDLE_MSG(hwnd, WM_COMMAND, password_command); + + case WM_SETCURSOR: + if (isblocking) { + SetCursor(LoadCursor(NULL, IDC_WAIT)); + SetWindowLong(hwnd, DWL_MSGRESULT, TRUE); + + return TRUE; + } + break; + } + + return FALSE; +} + + +/* + * Function: Display and process the password dialog. + * + * Parameters: + * hwnd - the parent window for the dialog + * + * Returns: TRUE if the dialog completed successfully, FALSE otherwise. + */ +BOOL +password_dialog(HWND hwnd) +{ + DLGPROC dlgproc; + int rc; + +#ifdef _WIN32 + dlgproc = password_dlg_proc; +#else + dlgproc = (FARPROC)MakeProcInstance(password_dlg_proc, hinstance); + assert(dlgproc != NULL); + + if (dlgproc == NULL) + return FALSE; +#endif + + rc = DialogBox(hinstance, MAKEINTRESOURCE(ID_PASSWORD), hwnd, dlgproc); + assert(rc != -1); + +#ifndef _WIN32 + FreeProcInstance((FARPROC)dlgproc); +#endif + + return rc == IDOK; +} |