This repository was archived by the owner on Oct 8, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfnasso.c
More file actions
157 lines (141 loc) · 4.1 KB
/
Copy pathfnasso.c
File metadata and controls
157 lines (141 loc) · 4.1 KB
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <stdio.h>
#include <string.h>
#include "fnasso_defs.h"
#include "fnasso.h"
#include "debug.h"
#define FNASSO_VERSION 103
char version_string[110];
char *fnasso_version(int *v)
{
if (v) *v = 103;
sprintf(version_string, "libfnasso v1.03 (%s %s)\nContact: Alejandro Abad <alejandroprimitivo.abad@um.es>", __DATE__, __TIME__);
return version_string;
}
char *fnasso_strerror(fnasso_error errno)
{
switch (errno)
{
case FNASSO_ERR_NONE:
return "success";
case FNASSO_ERR_EXTERNAL:
return "in call to (%s): %s";
case FNASSO_ERR_NO_CONTEXT_SUPPLIED:
return "a NULL fnasso_context has been supplied";
case FNASSO_ERR_NO_ROAMING_REALM:
return "roaming realm supplied is NULL or empty";
case FNASSO_ERR_NO_CCACHE_NAME:
return "ccache name supplied is NULL or empty";
case FNASSO_ERR_NO_MSK:
return "no MSK has been supplied";
case FNASSO_ERR_CANT_GENERATE_MSK_HASH:
return "unable to generate a hash for the MSK";
case FNASSO_ERR_CANT_GENERATE_BASE64_PASSWORD:
return "unable to base64 encode the password";
case FNASSO_ERR_NO_USERNAME_SUPPLIED:
return "username supplied is empty";
case FNASSO_ERR_BADFORMED_KERBEROS_USERNAME:
return "supplied name (%s) is not a valid kerberos username";
case FNASSO_ERR_OUTPUT_PTR_NULL:
return "supplied pointer for output is NULL";
case FNASSO_ERR_USER_DATA_NOT_SET:
return "user data is not set";
case FNASSO_ERR_CHLD_EXIT_SIGNAL:
return "child exited due to signal (%d): (%s)";
case FNASSO_ERR_CHLD_EXIT:
return "child exited with status (%d)";
case FNASSO_ERR_KADMIN_DATA_NOT_SET:
return "kadmin data structure is not set";
case FNASSO_ERR_KADMIN_REALM_EMPTY:
return "supplied kadmin realm is empty";
case FNASSO_ERR_KADMIN_SERVER_EMPTY:
return "supplied kadmin server is empty";
case FNASSO_ERR_KADMIN_USER_EMPTY:
return "supplied kadmin username is empty";
default:
return "unknown error";
}
}
fnasso_error fnasso_context_init(fnasso_context **ctx)
{
F_BEGIN();
*ctx = (fnasso_context *) calloc(1, sizeof (fnasso_context));
RETURN(FNASSO_ERR_NONE);
}
fnasso_error fnasso_context_free(fnasso_context **ctx)
{
F_BEGIN();
if (ctx && *ctx)
{
fnasso_user_free(*ctx);
fnasso_kdc_free(*ctx);
fnasso_kadmin_free(*ctx);
if ((*ctx)->ccache_filename) free((*ctx)->ccache_filename);
if ((*ctx)->roaming_realm) free((*ctx)->roaming_realm);
free(*ctx);
*ctx = NULL;
ctx = NULL;
}
RETURN(FNASSO_ERR_NONE);
}
fnasso_error fnasso_context_set_cache_name(fnasso_context *ctx, const char* ccache_name)
{
F_BEGIN();
if (!ctx) E_RETURN(FNASSO_ERR_NO_CONTEXT_SUPPLIED);
if (!ccache_name)
{
if (ctx->ccache_filename) free(ctx->ccache_filename);
ctx->ccache_filename = NULL;
EVENT("Credentials cache filename has been set to OS default");
}
else
{
if (strlen(ccache_name))
{
ctx->ccache_filename = (char *) realloc(ctx->ccache_filename, strlen(ccache_name) + 1);
strcpy(ctx->ccache_filename, ccache_name);
EVENT("Credentials cache filename is now (%s)", ctx->ccache_filename);
}
else
{
E_RETURN(FNASSO_ERR_NO_CCACHE_NAME);
}
}
RETURN(FNASSO_ERR_NONE);
}
fnasso_error fnasso_context_set_roaming_realm(fnasso_context *ctx, const char* roaming_realm)
{
F_BEGIN();
krb5_error_code kerberos_error;
if (!ctx) E_RETURN(FNASSO_ERR_NO_CONTEXT_SUPPLIED);
if (!roaming_realm)
{
if (ctx->roaming_realm) free(ctx->roaming_realm);
ctx->roaming_realm = NULL;
EVENT("roaming realm restored to default realm in /etc/krb5.conf");
}
else
{
if (strlen(roaming_realm))
{
ctx->roaming_realm = (char *) realloc(ctx->roaming_realm, strlen(roaming_realm) + 1);
strcpy(ctx->roaming_realm, roaming_realm);
EVENT("roaming realm is now (%s)", ctx->roaming_realm);
}
else
{
E_RETURN(FNASSO_ERR_NO_ROAMING_REALM);
}
}
if (ctx->kdc && ctx->kdc->kctx)
{
EVENT("updating current KDC default realm");
kerberos_error = krb5_set_default_realm(*ctx->kdc->kctx, ctx->roaming_realm);
if (kerberos_error)
{
fnasso_kdc_free(ctx);
E_RETURN(FNASSO_ERR_EXTERNAL, "krb5_set_default_realm", error_message(kerberos_error));
}
DEBUG("krb5_set_default_realm OK");
}
RETURN(FNASSO_ERR_NONE);
}