09991c38383d1654888770ec5458dae9c36e0d73
[platform/upstream/krb5.git] / src / windows / cns / kpasswd.c
1 /*
2  * Copyright (c) 1997 Cygnus Solutions.
3  *
4  * Author:  Michael Graff
5  */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10
11 #include "krb5.h"
12 #include "com_err.h"
13
14 #include "cns.h"
15
16 #include "../lib/gic.h"
17
18 /*
19  * k5_change_password
20  *
21  * Use the new functions to change the password.
22  */
23 krb5_error_code
24 k5_change_password(HWND hwnd, krb5_context context, char *user, char *realm,
25                    char *opasswd, char *npasswd, char **text)
26 {
27         krb5_error_code            ret;
28         krb5_data                  result_string;
29         krb5_data                  result_code_string;
30         int                        result_code;
31         krb5_get_init_creds_opt    opts;
32         krb5_creds                 creds;
33         krb5_principal             princ;
34         char                      *name;
35         gic_data                   gd;
36
37         *text = NULL;
38
39         name = malloc(strlen(user) + strlen(realm) + 2);
40         if (name == NULL) {
41                 *text = "Failed to allocate memory while changing password";
42                 return 1;
43         }
44         sprintf(name, "%s@%s", user, realm);
45
46         ret = krb5_parse_name(context, name, &princ);
47         free(name);
48         if (ret) {
49                 *text = "while parsing name";
50                 return ret;
51         }
52
53         krb5_get_init_creds_opt_init(&opts);
54         krb5_get_init_creds_opt_set_tkt_life(&opts, 5*60);
55         krb5_get_init_creds_opt_set_renew_life(&opts, 0);
56         krb5_get_init_creds_opt_set_forwardable(&opts, 0);
57         krb5_get_init_creds_opt_set_proxiable(&opts, 0);
58
59         gd.hinstance = hinstance;
60         gd.hwnd = hwnd;
61         gd.id = ID_VARDLG;
62
63         ret = krb5_get_init_creds_password(context, &creds, princ, opasswd, gic_prompter,
64                 &gd, 0, "kadmin/changepw", &opts);
65         if (ret) {
66                 *text = "while getting creds";
67                 return ret;
68         }
69
70         ret = krb5_change_password(context, &creds, npasswd, &result_code, &result_code_string,
71                 &result_string);
72         if (ret) {
73                 *text = "while changing password";
74                 return ret;
75         }
76
77         if (result_code) {
78                 *text = malloc(result_code_string.length + result_string.length + 3);
79                 if (*text == NULL)
80                         return -1;
81
82                 sprintf(*text, "%.*s%s%.*s",
83                         result_code_string.length, result_code_string.data,
84                         (result_string.length ? ": " : ""),
85                         result_string.length,
86                         result_string.data ? result_string.data : "");
87         }
88
89         return 0;
90 }