annotate src/auth/auth-request.c @ 11466:5ae4a5c14f5b HEAD

auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
author Timo Sirainen <tss@iki.fi>
date Wed, 02 Jun 2010 19:52:32 +0100
parents 1e890076c4e9
children 48ac56ad4768
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10582
615eef3139c2 Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 10542
diff changeset
1 /* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
9219
97cdfeb57129 Renamed headers to prevent collision if they were flattened on an install.
Mark Washenberger
parents: 9015
diff changeset
3 #include "auth-common.h"
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "buffer.h"
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "hash.h"
10585
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
7 #include "sha1.h"
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
8 #include "hex-binary.h"
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "str.h"
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "safe-memset.h"
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "str-sanitize.h"
4168
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
12 #include "strescape.h"
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "var-expand.h"
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
14 #include "auth-cache.h"
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "auth-request.h"
11441
3ef582c3fb72 auth: Aborting pending async requests on deinit caused crashes.
Timo Sirainen <tss@iki.fi>
parents: 11255
diff changeset
16 #include "auth-request-handler.h"
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include "auth-client-connection.h"
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include "auth-master-connection.h"
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include "passdb.h"
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
20 #include "passdb-blocking.h"
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
21 #include "userdb-blocking.h"
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #include "passdb-cache.h"
3918
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
23 #include "password-scheme.h"
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
4078
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
25 #include <stdlib.h>
5879
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
26 #include <sys/stat.h>
4078
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
27
10689
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
28 #define CACHED_PASSWORD_SCHEME "SHA1"
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
29
11255
90410a8f3786 auth: Minor code fix/cleanup.
Timo Sirainen <tss@iki.fi>
parents: 11251
diff changeset
30 unsigned int auth_request_state_count[AUTH_REQUEST_STATE_MAX];
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
31
10585
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
32 static void get_log_prefix(string_t *str, struct auth_request *auth_request,
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
33 const char *subsystem);
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
34
3072
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
35 struct auth_request *
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
36 auth_request_new(const struct mech_module *mech,
3074
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3072
diff changeset
37 mech_callback_t *callback, void *context)
3072
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
38 {
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
39 struct auth_request *request;
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
40
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
41 request = mech->auth_new();
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
42
3171
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
43 request->state = AUTH_REQUEST_STATE_NEW;
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
44 auth_request_state_count[AUTH_REQUEST_STATE_NEW]++;
3072
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
45
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
46 request->refcount = 1;
5586
dad0e22b735a Changed auth_request->created to last_access and update it a bit more often.
Timo Sirainen <tss@iki.fi>
parents: 5585
diff changeset
47 request->last_access = ioloop_time;
3074
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3072
diff changeset
48
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
49 request->set = global_auth_settings;
3072
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
50 request->mech = mech;
8111
d49bdda63506 auth: %m variable didn't work with blocking passdbs
Timo Sirainen <tss@iki.fi>
parents: 7919
diff changeset
51 request->mech_name = mech == NULL ? NULL : mech->mech_name;
3072
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
52 request->callback = callback;
3074
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3072
diff changeset
53 request->context = context;
3072
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
54 return request;
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
55 }
289a98ba5d95 Another try with API cleanup.
Timo Sirainen <tss@iki.fi>
parents: 3071
diff changeset
56
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
57 struct auth_request *auth_request_new_dummy(void)
3185
3089083e1d47 Handle USER requests from master connections.
Timo Sirainen <tss@iki.fi>
parents: 3183
diff changeset
58 {
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
59 struct auth_request *request;
3185
3089083e1d47 Handle USER requests from master connections.
Timo Sirainen <tss@iki.fi>
parents: 3183
diff changeset
60 pool_t pool;
3089083e1d47 Handle USER requests from master connections.
Timo Sirainen <tss@iki.fi>
parents: 3183
diff changeset
61
3695
4f8598b0ca62 Use a bit larger initial pool sizes
Timo Sirainen <tss@iki.fi>
parents: 3687
diff changeset
62 pool = pool_alloconly_create("auth_request", 1024);
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
63 request = p_new(pool, struct auth_request, 1);
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
64 request->pool = pool;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
65
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
66 request->state = AUTH_REQUEST_STATE_NEW;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
67 auth_request_state_count[AUTH_REQUEST_STATE_NEW]++;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
68
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
69 request->refcount = 1;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
70 request->last_access = ioloop_time;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
71 request->set = global_auth_settings;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
72 return request;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
73 }
3185
3089083e1d47 Handle USER requests from master connections.
Timo Sirainen <tss@iki.fi>
parents: 3183
diff changeset
74
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
75 void auth_request_set_state(struct auth_request *request,
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
76 enum auth_request_state state)
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
77 {
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
78 if (request->state == state)
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
79 return;
3185
3089083e1d47 Handle USER requests from master connections.
Timo Sirainen <tss@iki.fi>
parents: 3183
diff changeset
80
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
81 i_assert(auth_request_state_count[request->state] > 0);
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
82 auth_request_state_count[request->state]--;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
83 auth_request_state_count[state]++;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
84
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
85 request->state = state;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
86 auth_refresh_proctitle();
3185
3089083e1d47 Handle USER requests from master connections.
Timo Sirainen <tss@iki.fi>
parents: 3183
diff changeset
87 }
3089083e1d47 Handle USER requests from master connections.
Timo Sirainen <tss@iki.fi>
parents: 3183
diff changeset
88
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
89 void auth_request_init(struct auth_request *request)
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
90 {
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
91 struct auth *auth;
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
92
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
93 auth = auth_request_get_auth(request);
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
94 request->set = auth->set;
10961
5050e2eb1bfe auth: Previous change broke non-master logins..
Timo Sirainen <tss@iki.fi>
parents: 10960
diff changeset
95 request->passdb = auth->passdbs;
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
96 request->userdb = auth->userdbs;
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
97 }
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
98
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
99 struct auth *auth_request_get_auth(struct auth_request *request)
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
100 {
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
101 return auth_find_service(request->service);
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
102 }
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
103
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 void auth_request_success(struct auth_request *request,
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 const void *data, size_t data_size)
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 {
3171
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
107 i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108
4078
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
109 if (request->passdb_failure) {
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
110 /* password was valid, but some other check failed. */
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
111 auth_request_fail(request);
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
112 return;
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
113 }
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
114
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
115 auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
3074
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3072
diff changeset
116 request->successful = TRUE;
10757
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
117 auth_request_refresh_last_access(request);
3074
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3072
diff changeset
118 request->callback(request, AUTH_CLIENT_RESULT_SUCCESS,
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3072
diff changeset
119 data, data_size);
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 void auth_request_fail(struct auth_request *request)
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 {
3171
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
124 i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
126 auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
10757
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
127 auth_request_refresh_last_access(request);
3074
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3072
diff changeset
128 request->callback(request, AUTH_CLIENT_RESULT_FAILURE, NULL, 0);
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 void auth_request_internal_failure(struct auth_request *request)
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 {
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 request->internal_failure = TRUE;
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 auth_request_fail(request);
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 void auth_request_ref(struct auth_request *request)
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 {
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 request->refcount++;
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
142 void auth_request_unref(struct auth_request **_request)
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
144 struct auth_request *request = *_request;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
145
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
146 *_request = NULL;
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 i_assert(request->refcount > 0);
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 if (--request->refcount > 0)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
149 return;
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
151 auth_request_state_count[request->state]--;
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
152 auth_refresh_proctitle();
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
153
10757
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
154 if (request->to_abort != NULL)
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
155 timeout_remove(&request->to_abort);
10301
fbff8ca77d2e auth: Added auth failure penalty tracking based on remote IP address.
Timo Sirainen <tss@iki.fi>
parents: 10082
diff changeset
156 if (request->to_penalty != NULL)
fbff8ca77d2e auth: Added auth failure penalty tracking based on remote IP address.
Timo Sirainen <tss@iki.fi>
parents: 10082
diff changeset
157 timeout_remove(&request->to_penalty);
fbff8ca77d2e auth: Added auth failure penalty tracking based on remote IP address.
Timo Sirainen <tss@iki.fi>
parents: 10082
diff changeset
158
3386
e4b84d82c685 Master connection's USER command was leaking memory (with deliver binary).
Timo Sirainen <tss@iki.fi>
parents: 3338
diff changeset
159 if (request->mech != NULL)
e4b84d82c685 Master connection's USER command was leaking memory (with deliver binary).
Timo Sirainen <tss@iki.fi>
parents: 3338
diff changeset
160 request->mech->auth_free(request);
e4b84d82c685 Master connection's USER command was leaking memory (with deliver binary).
Timo Sirainen <tss@iki.fi>
parents: 3338
diff changeset
161 else
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
162 pool_unref(&request->pool);
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
165 void auth_request_export(struct auth_request *request,
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
166 struct auth_stream_reply *reply)
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
167 {
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
168 auth_stream_reply_add(reply, "user", request->user);
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
169 auth_stream_reply_add(reply, "service", request->service);
3338
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
170
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
171 if (request->master_user != NULL) {
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
172 auth_stream_reply_add(reply, "master_user",
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
173 request->master_user);
8346
9f66028a1089 Pass original_username to auth-workers.
Timo Sirainen <tss@iki.fi>
parents: 8320
diff changeset
174 }
8347
fc5683975951 auth: original_username should never be NULL, removed all code that checks for it.
Timo Sirainen <tss@iki.fi>
parents: 8346
diff changeset
175 auth_stream_reply_add(reply, "original_username",
fc5683975951 auth: original_username should never be NULL, removed all code that checks for it.
Timo Sirainen <tss@iki.fi>
parents: 8346
diff changeset
176 request->original_username);
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
177
3338
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
178 if (request->local_ip.family != 0) {
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
179 auth_stream_reply_add(reply, "lip",
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
180 net_ip2addr(&request->local_ip));
3338
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
181 }
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
182 if (request->remote_ip.family != 0) {
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
183 auth_stream_reply_add(reply, "rip",
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
184 net_ip2addr(&request->remote_ip));
3338
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
185 }
5882
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
186 if (request->local_port != 0) {
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
187 auth_stream_reply_add(reply, "lport",
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
188 dec2str(request->local_port));
5882
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
189 }
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
190 if (request->remote_port != 0) {
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
191 auth_stream_reply_add(reply, "rport",
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
192 dec2str(request->remote_port));
5882
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
193 }
5585
e33158bc72b0 %c wasn't exported to auth worker processes. Patch by Andrey Panin
Timo Sirainen <tss@iki.fi>
parents: 5475
diff changeset
194 if (request->secured)
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
195 auth_stream_reply_add(reply, "secured", "1");
7318
be991f857c70 Fixed pass=yes with blocking passdbs. Also master_user wasn't exported
Timo Sirainen <tss@iki.fi>
parents: 7278
diff changeset
196 if (request->skip_password_check)
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
197 auth_stream_reply_add(reply, "skip_password_check", "1");
8320
d49aa6720fb2 Added %k variable to display valid-client-cert status. It expands to "valid" or empty.
Timo Sirainen <tss@iki.fi>
parents: 8163
diff changeset
198 if (request->valid_client_cert)
d49aa6720fb2 Added %k variable to display valid-client-cert status. It expands to "valid" or empty.
Timo Sirainen <tss@iki.fi>
parents: 8163
diff changeset
199 auth_stream_reply_add(reply, "valid-client-cert", "1");
8111
d49bdda63506 auth: %m variable didn't work with blocking passdbs
Timo Sirainen <tss@iki.fi>
parents: 7919
diff changeset
200 if (request->mech_name != NULL)
d49bdda63506 auth: %m variable didn't work with blocking passdbs
Timo Sirainen <tss@iki.fi>
parents: 7919
diff changeset
201 auth_stream_reply_add(reply, "mech", request->mech_name);
3338
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
202 }
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
203
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3771
diff changeset
204 bool auth_request_import(struct auth_request *request,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3771
diff changeset
205 const char *key, const char *value)
3338
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
206 {
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
207 if (strcmp(key, "user") == 0)
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
208 request->user = p_strdup(request->pool, value);
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
209 else if (strcmp(key, "master_user") == 0)
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
210 request->master_user = p_strdup(request->pool, value);
8346
9f66028a1089 Pass original_username to auth-workers.
Timo Sirainen <tss@iki.fi>
parents: 8320
diff changeset
211 else if (strcmp(key, "original_username") == 0)
9f66028a1089 Pass original_username to auth-workers.
Timo Sirainen <tss@iki.fi>
parents: 8320
diff changeset
212 request->original_username = p_strdup(request->pool, value);
3635
c12df370e1b2 Added ssl_username_from_cert setting. Not actually tested yet..
Timo Sirainen <tss@iki.fi>
parents: 3609
diff changeset
213 else if (strcmp(key, "cert_username") == 0) {
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
214 if (request->set->ssl_username_from_cert) {
3635
c12df370e1b2 Added ssl_username_from_cert setting. Not actually tested yet..
Timo Sirainen <tss@iki.fi>
parents: 3609
diff changeset
215 /* get username from SSL certificate. it overrides
c12df370e1b2 Added ssl_username_from_cert setting. Not actually tested yet..
Timo Sirainen <tss@iki.fi>
parents: 3609
diff changeset
216 the username given by the auth mechanism. */
c12df370e1b2 Added ssl_username_from_cert setting. Not actually tested yet..
Timo Sirainen <tss@iki.fi>
parents: 3609
diff changeset
217 request->user = p_strdup(request->pool, value);
c12df370e1b2 Added ssl_username_from_cert setting. Not actually tested yet..
Timo Sirainen <tss@iki.fi>
parents: 3609
diff changeset
218 request->cert_username = TRUE;
c12df370e1b2 Added ssl_username_from_cert setting. Not actually tested yet..
Timo Sirainen <tss@iki.fi>
parents: 3609
diff changeset
219 }
c12df370e1b2 Added ssl_username_from_cert setting. Not actually tested yet..
Timo Sirainen <tss@iki.fi>
parents: 3609
diff changeset
220 } else if (strcmp(key, "service") == 0)
3338
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
221 request->service = p_strdup(request->pool, value);
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
222 else if (strcmp(key, "lip") == 0)
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
223 net_addr2ip(value, &request->local_ip);
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
224 else if (strcmp(key, "rip") == 0)
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
225 net_addr2ip(value, &request->remote_ip);
5882
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
226 else if (strcmp(key, "lport") == 0)
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
227 request->local_port = atoi(value);
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
228 else if (strcmp(key, "rport") == 0)
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
229 request->remote_port = atoi(value);
5260
0d72eb2ed8af Added %c variable which expands to "secured" with SSL/TLS/localhost.
Timo Sirainen <tss@iki.fi>
parents: 5251
diff changeset
230 else if (strcmp(key, "secured") == 0)
0d72eb2ed8af Added %c variable which expands to "secured" with SSL/TLS/localhost.
Timo Sirainen <tss@iki.fi>
parents: 5251
diff changeset
231 request->secured = TRUE;
7106
1bd8b17bfabe If AUTH has "nologin" parameter, the request is freed when authentication is
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
232 else if (strcmp(key, "nologin") == 0)
1bd8b17bfabe If AUTH has "nologin" parameter, the request is freed when authentication is
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
233 request->no_login = TRUE;
8320
d49aa6720fb2 Added %k variable to display valid-client-cert status. It expands to "valid" or empty.
Timo Sirainen <tss@iki.fi>
parents: 8163
diff changeset
234 else if (strcmp(key, "valid-client-cert") == 0)
d49aa6720fb2 Added %k variable to display valid-client-cert status. It expands to "valid" or empty.
Timo Sirainen <tss@iki.fi>
parents: 8163
diff changeset
235 request->valid_client_cert = TRUE;
7318
be991f857c70 Fixed pass=yes with blocking passdbs. Also master_user wasn't exported
Timo Sirainen <tss@iki.fi>
parents: 7278
diff changeset
236 else if (strcmp(key, "skip_password_check") == 0) {
be991f857c70 Fixed pass=yes with blocking passdbs. Also master_user wasn't exported
Timo Sirainen <tss@iki.fi>
parents: 7278
diff changeset
237 i_assert(request->master_user != NULL);
be991f857c70 Fixed pass=yes with blocking passdbs. Also master_user wasn't exported
Timo Sirainen <tss@iki.fi>
parents: 7278
diff changeset
238 request->skip_password_check = TRUE;
8111
d49bdda63506 auth: %m variable didn't work with blocking passdbs
Timo Sirainen <tss@iki.fi>
parents: 7919
diff changeset
239 } else if (strcmp(key, "mech") == 0)
d49bdda63506 auth: %m variable didn't work with blocking passdbs
Timo Sirainen <tss@iki.fi>
parents: 7919
diff changeset
240 request->mech_name = p_strdup(request->pool, value);
d49bdda63506 auth: %m variable didn't work with blocking passdbs
Timo Sirainen <tss@iki.fi>
parents: 7919
diff changeset
241 else
3338
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
242 return FALSE;
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
243
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3318
diff changeset
244 return TRUE;
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
245 }
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
246
10301
fbff8ca77d2e auth: Added auth failure penalty tracking based on remote IP address.
Timo Sirainen <tss@iki.fi>
parents: 10082
diff changeset
247 void auth_request_initial(struct auth_request *request)
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
248 {
3171
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
249 i_assert(request->state == AUTH_REQUEST_STATE_NEW);
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
250
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
251 auth_request_set_state(request, AUTH_REQUEST_STATE_MECH_CONTINUE);
10301
fbff8ca77d2e auth: Added auth failure penalty tracking based on remote IP address.
Timo Sirainen <tss@iki.fi>
parents: 10082
diff changeset
252 request->mech->auth_initial(request, request->initial_response,
fbff8ca77d2e auth: Added auth failure penalty tracking based on remote IP address.
Timo Sirainen <tss@iki.fi>
parents: 10082
diff changeset
253 request->initial_response_len);
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
254 }
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
255
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
256 void auth_request_continue(struct auth_request *request,
3071
c7db6b291daa API cleanup
Timo Sirainen <tss@iki.fi>
parents: 3069
diff changeset
257 const unsigned char *data, size_t data_size)
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
258 {
3171
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
259 i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
260
10757
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
261 auth_request_refresh_last_access(request);
3071
c7db6b291daa API cleanup
Timo Sirainen <tss@iki.fi>
parents: 3069
diff changeset
262 request->mech->auth_continue(request, data, data_size);
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
263 }
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
264
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
265 static void auth_request_save_cache(struct auth_request *request,
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
266 enum passdb_result result)
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
267 {
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
268 struct passdb_module *passdb = request->passdb->passdb;
10689
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
269 const char *extra_fields, *encoded_password;
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
270 string_t *str;
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
271
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
272 switch (result) {
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
273 case PASSDB_RESULT_USER_UNKNOWN:
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
274 case PASSDB_RESULT_PASSWORD_MISMATCH:
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
275 case PASSDB_RESULT_OK:
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
276 case PASSDB_RESULT_SCHEME_NOT_AVAILABLE:
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
277 /* can be cached */
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
278 break;
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
279 case PASSDB_RESULT_USER_DISABLED:
4374
96fd7a3f9bfe If password is expired, give "Password expired" error. Currently works only
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
280 case PASSDB_RESULT_PASS_EXPIRED:
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
281 /* FIXME: we can't cache this now, or cache lookup would
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
282 return success. */
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
283 return;
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
284 case PASSDB_RESULT_INTERNAL_FAILURE:
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
285 i_unreached();
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
286 }
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
287
3520
e2fe8222449d s/occured/occurred/
Timo Sirainen <tss@iki.fi>
parents: 3432
diff changeset
288 extra_fields = request->extra_fields == NULL ? NULL :
e2fe8222449d s/occured/occurred/
Timo Sirainen <tss@iki.fi>
parents: 3432
diff changeset
289 auth_stream_reply_export(request->extra_fields);
3432
079ec5c2d665 Last change caused user-given passwords to be cached, and later the password
Timo Sirainen <tss@iki.fi>
parents: 3431
diff changeset
290
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
291 if (passdb_cache == NULL)
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
292 return;
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
293
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
294 if (passdb->cache_key == NULL)
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
295 return;
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
296
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
297 if (result < 0) {
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
298 /* lookup failed. */
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
299 if (result == PASSDB_RESULT_USER_UNKNOWN) {
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
300 auth_cache_insert(passdb_cache, request,
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4575
diff changeset
301 passdb->cache_key, "", FALSE);
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
302 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
303 return;
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
304 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
305
3669
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
306 if (!request->no_password && request->passdb_password == NULL) {
3656
fda241fa5d77 Make auth caching work with non-sql/ldap passdbs too.
Timo Sirainen <tss@iki.fi>
parents: 3655
diff changeset
307 /* passdb didn't provide the correct password */
fda241fa5d77 Make auth caching work with non-sql/ldap passdbs too.
Timo Sirainen <tss@iki.fi>
parents: 3655
diff changeset
308 if (result != PASSDB_RESULT_OK ||
fda241fa5d77 Make auth caching work with non-sql/ldap passdbs too.
Timo Sirainen <tss@iki.fi>
parents: 3655
diff changeset
309 request->mech_password == NULL)
fda241fa5d77 Make auth caching work with non-sql/ldap passdbs too.
Timo Sirainen <tss@iki.fi>
parents: 3655
diff changeset
310 return;
fda241fa5d77 Make auth caching work with non-sql/ldap passdbs too.
Timo Sirainen <tss@iki.fi>
parents: 3655
diff changeset
311
3669
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
312 /* we can still cache valid password lookups though.
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
313 strdup() it so that mech_password doesn't get
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
314 cleared too early. */
10689
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
315 if (!password_generate_encoded(request->mech_password,
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
316 request->user,
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
317 CACHED_PASSWORD_SCHEME,
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
318 &encoded_password))
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
319 i_unreached();
3669
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
320 request->passdb_password =
10689
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
321 p_strconcat(request->pool, "{"CACHED_PASSWORD_SCHEME"}",
46ae2e53d688 auth: When caching user-given passwords, cache their SHA1, not the plaintext.
Timo Sirainen <tss@iki.fi>
parents: 10585
diff changeset
322 encoded_password, NULL);
3645
81180ca12997 We were caching failed blocking requests wrong.
Timo Sirainen <tss@iki.fi>
parents: 3635
diff changeset
323 }
81180ca12997 We were caching failed blocking requests wrong.
Timo Sirainen <tss@iki.fi>
parents: 3635
diff changeset
324
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
325 /* save all except the currently given password in cache */
3520
e2fe8222449d s/occured/occurred/
Timo Sirainen <tss@iki.fi>
parents: 3432
diff changeset
326 str = t_str_new(256);
3669
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
327 if (request->passdb_password != NULL) {
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
328 if (*request->passdb_password != '{') {
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
329 /* cached passwords must have a known scheme */
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
330 str_append_c(str, '{');
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
331 str_append(str, passdb->default_pass_scheme);
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
332 str_append_c(str, '}');
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
333 }
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
334 if (strchr(request->passdb_password, '\t') != NULL)
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
335 i_panic("%s: Password contains TAB", request->user);
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
336 if (strchr(request->passdb_password, '\n') != NULL)
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
337 i_panic("%s: Password contains LF", request->user);
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
338 str_append(str, request->passdb_password);
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
339 }
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
340
5129
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
341 if (extra_fields != NULL && *extra_fields != '\0') {
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
342 str_append_c(str, '\t');
3520
e2fe8222449d s/occured/occurred/
Timo Sirainen <tss@iki.fi>
parents: 3432
diff changeset
343 str_append(str, extra_fields);
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
344 }
5129
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
345 if (request->extra_cache_fields != NULL) {
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
346 extra_fields =
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
347 auth_stream_reply_export(request->extra_cache_fields);
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
348 if (*extra_fields != '\0') {
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
349 str_append_c(str, '\t');
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
350 str_append(str, extra_fields);
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
351 }
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
352 }
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4575
diff changeset
353 auth_cache_insert(passdb_cache, request, passdb->cache_key, str_c(str),
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4575
diff changeset
354 result == PASSDB_RESULT_OK);
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
355 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
356
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
357 static bool auth_request_master_lookup_finish(struct auth_request *request)
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
358 {
4534
dee19849654b If master login failed because of non-password failure (eg. allow_nets)
Timo Sirainen <tss@iki.fi>
parents: 4533
diff changeset
359 if (request->passdb_failure)
dee19849654b If master login failed because of non-password failure (eg. allow_nets)
Timo Sirainen <tss@iki.fi>
parents: 4533
diff changeset
360 return TRUE;
dee19849654b If master login failed because of non-password failure (eg. allow_nets)
Timo Sirainen <tss@iki.fi>
parents: 4533
diff changeset
361
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
362 /* master login successful. update user and master_user variables. */
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
363 auth_request_log_info(request, "passdb", "Master user logging in as %s",
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
364 request->requested_login_user);
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
365
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
366 request->master_user = request->user;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
367 request->user = request->requested_login_user;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
368 request->requested_login_user = NULL;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
369
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
370 request->skip_password_check = TRUE;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
371 request->passdb_password = NULL;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
372
10897
52eb8317514f auth: Cleaned up struct auth_passdb/auth_userdb.
Timo Sirainen <tss@iki.fi>
parents: 10893
diff changeset
373 if (!request->passdb->set->pass) {
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
374 /* skip the passdb lookup, we're authenticated now. */
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
375 return TRUE;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
376 }
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
377
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
378 /* the authentication continues with passdb lookup for the
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
379 requested_login_user. */
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
380 request->passdb = auth_request_get_auth(request)->passdbs;
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
381 return FALSE;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
382 }
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
383
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3771
diff changeset
384 static bool
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
385 auth_request_handle_passdb_callback(enum passdb_result *result,
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
386 struct auth_request *request)
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
387 {
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
388 if (request->passdb_password != NULL) {
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
389 safe_memset(request->passdb_password, 0,
3167
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3166
diff changeset
390 strlen(request->passdb_password));
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
391 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
392
11456
1e890076c4e9 auth: Fixes to destroying pending async userdb requests at deinit.
Timo Sirainen <tss@iki.fi>
parents: 11452
diff changeset
393 if (request->destroyed) {
11441
3ef582c3fb72 auth: Aborting pending async requests on deinit caused crashes.
Timo Sirainen <tss@iki.fi>
parents: 11255
diff changeset
394 /* the passdb may have been freed already. this request won't
3ef582c3fb72 auth: Aborting pending async requests on deinit caused crashes.
Timo Sirainen <tss@iki.fi>
parents: 11255
diff changeset
395 be sent anywhere anyway, so just fail it immediately. */
3ef582c3fb72 auth: Aborting pending async requests on deinit caused crashes.
Timo Sirainen <tss@iki.fi>
parents: 11255
diff changeset
396 *result = PASSDB_RESULT_INTERNAL_FAILURE;
3ef582c3fb72 auth: Aborting pending async requests on deinit caused crashes.
Timo Sirainen <tss@iki.fi>
parents: 11255
diff changeset
397 return TRUE;
3ef582c3fb72 auth: Aborting pending async requests on deinit caused crashes.
Timo Sirainen <tss@iki.fi>
parents: 11255
diff changeset
398 }
3ef582c3fb72 auth: Aborting pending async requests on deinit caused crashes.
Timo Sirainen <tss@iki.fi>
parents: 11255
diff changeset
399
10897
52eb8317514f auth: Cleaned up struct auth_passdb/auth_userdb.
Timo Sirainen <tss@iki.fi>
parents: 10893
diff changeset
400 if (request->passdb->set->deny &&
52eb8317514f auth: Cleaned up struct auth_passdb/auth_userdb.
Timo Sirainen <tss@iki.fi>
parents: 10893
diff changeset
401 *result != PASSDB_RESULT_USER_UNKNOWN) {
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
402 /* deny passdb. we can get through this step only if the
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
403 lookup returned that user doesn't exist in it. internal
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
404 errors are fatal here. */
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
405 if (*result != PASSDB_RESULT_INTERNAL_FAILURE) {
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
406 auth_request_log_info(request, "passdb",
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
407 "User found from deny passdb");
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
408 *result = PASSDB_RESULT_USER_DISABLED;
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
409 }
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
410 } else if (*result == PASSDB_RESULT_OK) {
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
411 /* success */
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
412 if (request->requested_login_user != NULL) {
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
413 /* this was a master user lookup. */
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
414 if (!auth_request_master_lookup_finish(request))
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
415 return FALSE;
4104
77e10f1d2cb2 Removed master_no_passdb setting. Added pass setting which can be used to do
Timo Sirainen <tss@iki.fi>
parents: 4078
diff changeset
416 } else {
10897
52eb8317514f auth: Cleaned up struct auth_passdb/auth_userdb.
Timo Sirainen <tss@iki.fi>
parents: 10893
diff changeset
417 if (request->passdb->set->pass) {
4104
77e10f1d2cb2 Removed master_no_passdb setting. Added pass setting which can be used to do
Timo Sirainen <tss@iki.fi>
parents: 4078
diff changeset
418 /* this wasn't the final passdb lookup,
77e10f1d2cb2 Removed master_no_passdb setting. Added pass setting which can be used to do
Timo Sirainen <tss@iki.fi>
parents: 4078
diff changeset
419 continue to next passdb */
77e10f1d2cb2 Removed master_no_passdb setting. Added pass setting which can be used to do
Timo Sirainen <tss@iki.fi>
parents: 4078
diff changeset
420 request->passdb = request->passdb->next;
4402
8846e6be0e02 If multiple passdbs were configured and we tried to authenticate as user
Timo Sirainen <tss@iki.fi>
parents: 4374
diff changeset
421 request->passdb_password = NULL;
4104
77e10f1d2cb2 Removed master_no_passdb setting. Added pass setting which can be used to do
Timo Sirainen <tss@iki.fi>
parents: 4078
diff changeset
422 return FALSE;
77e10f1d2cb2 Removed master_no_passdb setting. Added pass setting which can be used to do
Timo Sirainen <tss@iki.fi>
parents: 4078
diff changeset
423 }
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
424 }
4374
96fd7a3f9bfe If password is expired, give "Password expired" error. Currently works only
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
425 } else if (*result == PASSDB_RESULT_PASS_EXPIRED) {
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
426 if (request->extra_fields == NULL) {
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
427 request->extra_fields =
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
428 auth_stream_reply_init(request->pool);
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
429 }
4374
96fd7a3f9bfe If password is expired, give "Password expired" error. Currently works only
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
430 auth_stream_reply_add(request->extra_fields, "reason",
96fd7a3f9bfe If password is expired, give "Password expired" error. Currently works only
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
431 "Password expired");
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
432 } else if (request->passdb->next != NULL &&
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
433 *result != PASSDB_RESULT_USER_DISABLED) {
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
434 /* try next passdb. */
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
435 request->passdb = request->passdb->next;
5475
769aaaee6821 Reverted accidental commit. This code isn't ready yet.
Timo Sirainen <tss@iki.fi>
parents: 5462
diff changeset
436 request->passdb_password = NULL;
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
437
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
438 if (*result == PASSDB_RESULT_INTERNAL_FAILURE) {
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
439 /* remember that we have had an internal failure. at
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
440 the end return internal failure if we couldn't
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
441 successfully login. */
3606
8a8352cda514 If passdb lookup fails with internal error, try other passdbs anyway before
Timo Sirainen <tss@iki.fi>
parents: 3520
diff changeset
442 request->passdb_internal_failure = TRUE;
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
443 }
5475
769aaaee6821 Reverted accidental commit. This code isn't ready yet.
Timo Sirainen <tss@iki.fi>
parents: 5462
diff changeset
444 if (request->extra_fields != NULL)
769aaaee6821 Reverted accidental commit. This code isn't ready yet.
Timo Sirainen <tss@iki.fi>
parents: 5462
diff changeset
445 auth_stream_reply_reset(request->extra_fields);
769aaaee6821 Reverted accidental commit. This code isn't ready yet.
Timo Sirainen <tss@iki.fi>
parents: 5462
diff changeset
446
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
447 return FALSE;
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
448 } else if (request->passdb_internal_failure) {
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
449 /* last passdb lookup returned internal failure. it may have
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
450 had the correct password, so return internal failure
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
451 instead of plain failure. */
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
452 *result = PASSDB_RESULT_INTERNAL_FAILURE;
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
453 }
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
454
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
455 return TRUE;
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
456 }
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
457
4686
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
458 static void
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
459 auth_request_verify_plain_callback_finish(enum passdb_result result,
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
460 struct auth_request *request)
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
461 {
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
462 if (!auth_request_handle_passdb_callback(&result, request)) {
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
463 /* try next passdb */
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
464 auth_request_verify_plain(request, request->mech_password,
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
465 request->private_callback.verify_plain);
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
466 } else {
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
467 auth_request_ref(request);
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
468 request->private_callback.verify_plain(result, request);
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
469 safe_memset(request->mech_password, 0,
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
470 strlen(request->mech_password));
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
471 auth_request_unref(&request);
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
472 }
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
473 }
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
474
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
475 void auth_request_verify_plain_callback(enum passdb_result result,
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
476 struct auth_request *request)
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
477 {
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
478 i_assert(request->state == AUTH_REQUEST_STATE_PASSDB);
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
479
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
480 auth_request_set_state(request, AUTH_REQUEST_STATE_MECH_CONTINUE);
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
481
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
482 if (result != PASSDB_RESULT_INTERNAL_FAILURE)
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
483 auth_request_save_cache(request, result);
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
484 else {
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
485 /* lookup failed. if we're looking here only because the
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
486 request was expired in cache, fallback to using cached
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
487 expired record. */
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
488 const char *cache_key = request->passdb->passdb->cache_key;
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
489
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
490 if (passdb_cache_verify_plain(request, cache_key,
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
491 request->mech_password,
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
492 &result, TRUE)) {
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
493 auth_request_log_info(request, "passdb",
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
494 "Fallbacking to expired data from cache");
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
495 }
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
496 }
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
497
4686
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
498 auth_request_verify_plain_callback_finish(result, request);
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
499 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
500
7389
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
501 static bool password_has_illegal_chars(const char *password)
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
502 {
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
503 for (; *password != '\0'; password++) {
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
504 switch (*password) {
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
505 case '\001':
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
506 case '\t':
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
507 case '\r':
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
508 case '\n':
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
509 /* these characters have a special meaning in internal
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
510 protocols, make sure the password doesn't
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
511 accidentally get there unescaped. */
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
512 return TRUE;
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
513 }
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
514 }
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
515 return FALSE;
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
516 }
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
517
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
518 void auth_request_verify_plain(struct auth_request *request,
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
519 const char *password,
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
520 verify_plain_callback_t *callback)
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
521 {
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
522 struct passdb_module *passdb;
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
523 enum passdb_result result;
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
524 const char *cache_key;
3171
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
525
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
526 i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
527
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
528 if (request->passdb == NULL) {
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
529 /* no masterdbs, master logins not supported */
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
530 i_assert(request->requested_login_user != NULL);
4139
68c2ad5e4f85 Master login attempts weren't logged if no master passdbs were defined.
Timo Sirainen <tss@iki.fi>
parents: 4136
diff changeset
531 auth_request_log_info(request, "passdb",
8456
529034798b6b Add login username in "Attempted master login with no master passdbs" error.
Timo Sirainen <tss@iki.fi>
parents: 8402
diff changeset
532 "Attempted master login with no master passdbs "
529034798b6b Add login username in "Attempted master login with no master passdbs" error.
Timo Sirainen <tss@iki.fi>
parents: 8402
diff changeset
533 "(trying to log in as user: %s)",
529034798b6b Add login username in "Attempted master login with no master passdbs" error.
Timo Sirainen <tss@iki.fi>
parents: 8402
diff changeset
534 request->requested_login_user);
4139
68c2ad5e4f85 Master login attempts weren't logged if no master passdbs were defined.
Timo Sirainen <tss@iki.fi>
parents: 4136
diff changeset
535 callback(PASSDB_RESULT_USER_UNKNOWN, request);
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
536 return;
7389
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
537 }
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
538
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
539 if (password_has_illegal_chars(password)) {
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
540 auth_request_log_info(request, "passdb",
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
541 "Attempted login with password having illegal chars");
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
542 callback(PASSDB_RESULT_USER_UNKNOWN, request);
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
543 return;
1125d2d59e82 If trying to log in with password having illegal characters, make sure we
Timo Sirainen <tss@iki.fi>
parents: 7388
diff changeset
544 }
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
545
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
546 passdb = request->passdb->passdb;
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
547 if (request->mech_password == NULL)
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
548 request->mech_password = p_strdup(request->pool, password);
3656
fda241fa5d77 Make auth caching work with non-sql/ldap passdbs too.
Timo Sirainen <tss@iki.fi>
parents: 3655
diff changeset
549 else
fda241fa5d77 Make auth caching work with non-sql/ldap passdbs too.
Timo Sirainen <tss@iki.fi>
parents: 3655
diff changeset
550 i_assert(request->mech_password == password);
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
551 request->private_callback.verify_plain = callback;
3164
da9e4ffef09f Last changes broke proxying when user was in auth cache.
Timo Sirainen <tss@iki.fi>
parents: 3161
diff changeset
552
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
553 cache_key = passdb_cache == NULL ? NULL : passdb->cache_key;
3728
64ed35c97678 Don't crash if cache key isn't set but cache is enabled.
Timo Sirainen <tss@iki.fi>
parents: 3695
diff changeset
554 if (passdb_cache_verify_plain(request, cache_key, password,
64ed35c97678 Don't crash if cache key isn't set but cache is enabled.
Timo Sirainen <tss@iki.fi>
parents: 3695
diff changeset
555 &result, FALSE)) {
4686
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
556 auth_request_verify_plain_callback_finish(result, request);
3728
64ed35c97678 Don't crash if cache key isn't set but cache is enabled.
Timo Sirainen <tss@iki.fi>
parents: 3695
diff changeset
557 return;
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
558 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
559
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
560 auth_request_set_state(request, AUTH_REQUEST_STATE_PASSDB);
5593
f8dc0bdb06a7 Removed enum passdb_credentials. Use scheme strings directly instead. This
Timo Sirainen <tss@iki.fi>
parents: 5586
diff changeset
561 request->credentials_scheme = NULL;
3171
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
562
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
563 if (passdb->blocking)
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
564 passdb_blocking_verify_plain(request);
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
565 else {
3771
4b6d962485b9 Added authentication bind support. Patch by J.M. Maurer.
Timo Sirainen <tss@iki.fi>
parents: 3728
diff changeset
566 passdb->iface.verify_plain(request, password,
4b6d962485b9 Added authentication bind support. Patch by J.M. Maurer.
Timo Sirainen <tss@iki.fi>
parents: 3728
diff changeset
567 auth_request_verify_plain_callback);
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
568 }
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
569 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
570
5475
769aaaee6821 Reverted accidental commit. This code isn't ready yet.
Timo Sirainen <tss@iki.fi>
parents: 5462
diff changeset
571 static void
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
572 auth_request_lookup_credentials_finish(enum passdb_result result,
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
573 const unsigned char *credentials,
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
574 size_t size,
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
575 struct auth_request *request)
4686
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
576 {
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
577 if (!auth_request_handle_passdb_callback(&result, request)) {
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
578 /* try next passdb */
5593
f8dc0bdb06a7 Removed enum passdb_credentials. Use scheme strings directly instead. This
Timo Sirainen <tss@iki.fi>
parents: 5586
diff changeset
579 auth_request_lookup_credentials(request,
f8dc0bdb06a7 Removed enum passdb_credentials. Use scheme strings directly instead. This
Timo Sirainen <tss@iki.fi>
parents: 5586
diff changeset
580 request->credentials_scheme,
4686
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
581 request->private_callback.lookup_credentials);
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
582 } else {
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
583 if (request->set->debug_passwords &&
4686
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
584 result == PASSDB_RESULT_OK) {
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
585 auth_request_log_debug(request, "password",
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
586 "Credentials: %s",
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
587 binary_to_hex(credentials, size));
4686
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
588 }
5475
769aaaee6821 Reverted accidental commit. This code isn't ready yet.
Timo Sirainen <tss@iki.fi>
parents: 5462
diff changeset
589 request->private_callback.
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
590 lookup_credentials(result, credentials, size, request);
4686
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
591 }
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
592 }
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4685
diff changeset
593
5475
769aaaee6821 Reverted accidental commit. This code isn't ready yet.
Timo Sirainen <tss@iki.fi>
parents: 5462
diff changeset
594 void auth_request_lookup_credentials_callback(enum passdb_result result,
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
595 const unsigned char *credentials,
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
596 size_t size,
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
597 struct auth_request *request)
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
598 {
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
599 const char *cache_cred, *cache_scheme;
3167
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3166
diff changeset
600
3171
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
601 i_assert(request->state == AUTH_REQUEST_STATE_PASSDB);
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
602
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
603 auth_request_set_state(request, AUTH_REQUEST_STATE_MECH_CONTINUE);
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
604
5475
769aaaee6821 Reverted accidental commit. This code isn't ready yet.
Timo Sirainen <tss@iki.fi>
parents: 5462
diff changeset
605 if (result != PASSDB_RESULT_INTERNAL_FAILURE)
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
606 auth_request_save_cache(request, result);
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
607 else {
3167
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3166
diff changeset
608 /* lookup failed. if we're looking here only because the
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3166
diff changeset
609 request was expired in cache, fallback to using cached
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3166
diff changeset
610 expired record. */
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
611 const char *cache_key = request->passdb->passdb->cache_key;
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
612
3167
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3166
diff changeset
613 if (passdb_cache_lookup_credentials(request, cache_key,
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
614 &cache_cred, &cache_scheme,
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
615 &result, TRUE)) {
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
616 auth_request_log_info(request, "passdb",
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
617 "Fallbacking to expired data from cache");
8764
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
618 passdb_handle_credentials(
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
619 result, cache_cred, cache_scheme,
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
620 auth_request_lookup_credentials_finish,
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
621 request);
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
622 return;
3167
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3166
diff changeset
623 }
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
624 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
625
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
626 auth_request_lookup_credentials_finish(result, credentials, size,
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
627 request);
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
628 }
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
629
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
630 void auth_request_lookup_credentials(struct auth_request *request,
5593
f8dc0bdb06a7 Removed enum passdb_credentials. Use scheme strings directly instead. This
Timo Sirainen <tss@iki.fi>
parents: 5586
diff changeset
631 const char *scheme,
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
632 lookup_credentials_callback_t *callback)
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
633 {
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
634 struct passdb_module *passdb = request->passdb->passdb;
5593
f8dc0bdb06a7 Removed enum passdb_credentials. Use scheme strings directly instead. This
Timo Sirainen <tss@iki.fi>
parents: 5586
diff changeset
635 const char *cache_key, *cache_cred, *cache_scheme;
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
636 enum passdb_result result;
3171
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
637
8a3b57385eca Added state variable for auth_request and several assertions to make sure
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
638 i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
639
5593
f8dc0bdb06a7 Removed enum passdb_credentials. Use scheme strings directly instead. This
Timo Sirainen <tss@iki.fi>
parents: 5586
diff changeset
640 request->credentials_scheme = p_strdup(request->pool, scheme);
5233
359a8f31aa9b Fixed a crash when non-plaintext mechanism used auth_cache.
Timo Sirainen <tss@iki.fi>
parents: 5170
diff changeset
641 request->private_callback.lookup_credentials = callback;
3682
0207808033ad Non-plaintext authentication and passdb cache didn't work together. Patch by
Timo Sirainen <tss@iki.fi>
parents: 3669
diff changeset
642
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
643 cache_key = passdb_cache == NULL ? NULL : passdb->cache_key;
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
644 if (cache_key != NULL) {
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
645 if (passdb_cache_lookup_credentials(request, cache_key,
5593
f8dc0bdb06a7 Removed enum passdb_credentials. Use scheme strings directly instead. This
Timo Sirainen <tss@iki.fi>
parents: 5586
diff changeset
646 &cache_cred, &cache_scheme,
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
647 &result, FALSE)) {
8764
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
648 passdb_handle_credentials(
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
649 result, cache_cred, cache_scheme,
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
650 auth_request_lookup_credentials_finish,
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
651 request);
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
652 return;
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
653 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
654 }
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
655
11251
6243376eff60 auth: If verbose_proctitle=yes, show auth request counts in ps.
Timo Sirainen <tss@iki.fi>
parents: 11151
diff changeset
656 auth_request_set_state(request, AUTH_REQUEST_STATE_PASSDB);
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
657
6243
f4739631ce87 Don't crash if blocking passdb doesn't support credential lookups.
Timo Sirainen <tss@iki.fi>
parents: 5988
diff changeset
658 if (passdb->iface.lookup_credentials == NULL) {
3655
62fc6883faeb Fixes and cleanups to credentials handling. Also fixed auth caching to work
Timo Sirainen <tss@iki.fi>
parents: 3645
diff changeset
659 /* this passdb doesn't support credentials */
8764
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
660 auth_request_log_debug(request, "password",
90e2a21a4298 auth: Improved logging for "password scheme not available" failures.
Timo Sirainen <tss@iki.fi>
parents: 8696
diff changeset
661 "passdb doesn't support credential lookups");
5475
769aaaee6821 Reverted accidental commit. This code isn't ready yet.
Timo Sirainen <tss@iki.fi>
parents: 5462
diff changeset
662 auth_request_lookup_credentials_callback(
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
663 PASSDB_RESULT_SCHEME_NOT_AVAILABLE, NULL, 0, request);
6243
f4739631ce87 Don't crash if blocking passdb doesn't support credential lookups.
Timo Sirainen <tss@iki.fi>
parents: 5988
diff changeset
664 } else if (passdb->blocking) {
f4739631ce87 Don't crash if blocking passdb doesn't support credential lookups.
Timo Sirainen <tss@iki.fi>
parents: 5988
diff changeset
665 passdb_blocking_lookup_credentials(request);
f4739631ce87 Don't crash if blocking passdb doesn't support credential lookups.
Timo Sirainen <tss@iki.fi>
parents: 5988
diff changeset
666 } else {
f4739631ce87 Don't crash if blocking passdb doesn't support credential lookups.
Timo Sirainen <tss@iki.fi>
parents: 5988
diff changeset
667 passdb->iface.lookup_credentials(request,
f4739631ce87 Don't crash if blocking passdb doesn't support credential lookups.
Timo Sirainen <tss@iki.fi>
parents: 5988
diff changeset
668 auth_request_lookup_credentials_callback);
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
669 }
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
670 }
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
671
4782
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
672 void auth_request_set_credentials(struct auth_request *request,
5593
f8dc0bdb06a7 Removed enum passdb_credentials. Use scheme strings directly instead. This
Timo Sirainen <tss@iki.fi>
parents: 5586
diff changeset
673 const char *scheme, const char *data,
4782
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
674 set_credentials_callback_t *callback)
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
675 {
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
676 struct passdb_module *passdb = request->passdb->passdb;
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
677 const char *cache_key, *new_credentials;
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
678
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
679 cache_key = passdb_cache == NULL ? NULL : passdb->cache_key;
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
680 if (cache_key != NULL)
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
681 auth_cache_remove(passdb_cache, request, cache_key);
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
682
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
683 request->private_callback.set_credentials = callback;
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
684
5593
f8dc0bdb06a7 Removed enum passdb_credentials. Use scheme strings directly instead. This
Timo Sirainen <tss@iki.fi>
parents: 5586
diff changeset
685 new_credentials = t_strdup_printf("{%s}%s", scheme, data);
4782
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
686 if (passdb->blocking)
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
687 passdb_blocking_set_credentials(request, new_credentials);
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
688 else if (passdb->iface.set_credentials != NULL) {
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
689 passdb->iface.set_credentials(request, new_credentials,
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
690 callback);
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
691 } else {
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
692 /* this passdb doesn't support credentials update */
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
693 callback(PASSDB_RESULT_INTERNAL_FAILURE, request);
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
694 }
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
695 }
2c1cc5bbc260 Added auth_request_set_credentials() to modify credentials in passdb and
Timo Sirainen <tss@iki.fi>
parents: 4756
diff changeset
696
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
697 static void auth_request_userdb_save_cache(struct auth_request *request,
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
698 enum userdb_result result)
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
699 {
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
700 struct userdb_module *userdb = request->userdb->userdb;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
701 const char *str;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
702
4983
8089e7461519 We crashed if auth cache was disabled. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
703 if (passdb_cache == NULL || userdb->cache_key == NULL)
8089e7461519 We crashed if auth cache was disabled. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
704 return;
8089e7461519 We crashed if auth cache was disabled. Patch by Andrey Panin.
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
705
5069
005ad2165d08 If auth_cache was enabled and userdb returned "user unknown" (typically only
Timo Sirainen <tss@iki.fi>
parents: 5039
diff changeset
706 str = result == USERDB_RESULT_USER_UNKNOWN ? "" :
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
707 auth_stream_reply_export(request->userdb_reply);
5069
005ad2165d08 If auth_cache was enabled and userdb returned "user unknown" (typically only
Timo Sirainen <tss@iki.fi>
parents: 5039
diff changeset
708 /* last_success has no meaning with userdb */
005ad2165d08 If auth_cache was enabled and userdb returned "user unknown" (typically only
Timo Sirainen <tss@iki.fi>
parents: 5039
diff changeset
709 auth_cache_insert(passdb_cache, request, userdb->cache_key, str, FALSE);
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
710 }
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
711
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
712 static bool auth_request_lookup_user_cache(struct auth_request *request,
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
713 const char *key,
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
714 struct auth_stream_reply **reply_r,
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
715 enum userdb_result *result_r,
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
716 bool use_expired)
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
717 {
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
718 const char *value;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
719 struct auth_cache_node *node;
10836
81e085f9bd75 auth_cache_negative_ttl is now also used for password mismatches.
Timo Sirainen <tss@iki.fi>
parents: 10757
diff changeset
720 bool expired, neg_expired;
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
721
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
722 value = auth_cache_lookup(passdb_cache, request, key, &node,
10836
81e085f9bd75 auth_cache_negative_ttl is now also used for password mismatches.
Timo Sirainen <tss@iki.fi>
parents: 10757
diff changeset
723 &expired, &neg_expired);
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
724 if (value == NULL || (expired && !use_expired))
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
725 return FALSE;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
726
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
727 if (*value == '\0') {
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
728 /* negative cache entry */
5302
db232a079106 If unknown user was found from auth cache, we returned an invalid value
Timo Sirainen <tss@iki.fi>
parents: 5260
diff changeset
729 *result_r = USERDB_RESULT_USER_UNKNOWN;
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
730 *reply_r = auth_stream_reply_init(request->pool);
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
731 return TRUE;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
732 }
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
733
5302
db232a079106 If unknown user was found from auth cache, we returned an invalid value
Timo Sirainen <tss@iki.fi>
parents: 5260
diff changeset
734 *result_r = USERDB_RESULT_OK;
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
735 *reply_r = auth_stream_reply_init(request->pool);
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
736 auth_stream_reply_import(*reply_r, value);
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
737 return TRUE;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
738 }
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
739
4880
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
740 void auth_request_userdb_callback(enum userdb_result result,
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
741 struct auth_request *request)
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
742 {
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
743 struct userdb_module *userdb = request->userdb->userdb;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
744
11456
1e890076c4e9 auth: Fixes to destroying pending async userdb requests at deinit.
Timo Sirainen <tss@iki.fi>
parents: 11452
diff changeset
745 if (request->destroyed) {
1e890076c4e9 auth: Fixes to destroying pending async userdb requests at deinit.
Timo Sirainen <tss@iki.fi>
parents: 11452
diff changeset
746 /* the userdb may have been freed already. this request won't
1e890076c4e9 auth: Fixes to destroying pending async userdb requests at deinit.
Timo Sirainen <tss@iki.fi>
parents: 11452
diff changeset
747 be sent anywhere anyway, so just fail it immediately. */
1e890076c4e9 auth: Fixes to destroying pending async userdb requests at deinit.
Timo Sirainen <tss@iki.fi>
parents: 11452
diff changeset
748 request->private_callback.
1e890076c4e9 auth: Fixes to destroying pending async userdb requests at deinit.
Timo Sirainen <tss@iki.fi>
parents: 11452
diff changeset
749 userdb(USERDB_RESULT_INTERNAL_FAILURE, request);
1e890076c4e9 auth: Fixes to destroying pending async userdb requests at deinit.
Timo Sirainen <tss@iki.fi>
parents: 11452
diff changeset
750 return;
1e890076c4e9 auth: Fixes to destroying pending async userdb requests at deinit.
Timo Sirainen <tss@iki.fi>
parents: 11452
diff changeset
751 }
1e890076c4e9 auth: Fixes to destroying pending async userdb requests at deinit.
Timo Sirainen <tss@iki.fi>
parents: 11452
diff changeset
752
4880
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
753 if (result != USERDB_RESULT_OK && request->userdb->next != NULL) {
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
754 /* try next userdb. */
4880
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
755 if (result == USERDB_RESULT_INTERNAL_FAILURE)
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
756 request->userdb_internal_failure = TRUE;
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
757
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
758 request->userdb = request->userdb->next;
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
759 auth_request_lookup_user(request,
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
760 request->private_callback.userdb);
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
761 return;
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
762 }
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
763
4880
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
764 if (request->userdb_internal_failure && result != USERDB_RESULT_OK) {
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
765 /* one of the userdb lookups failed. the user might have been
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
766 in there, so this is an internal failure */
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
767 result = USERDB_RESULT_INTERNAL_FAILURE;
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
768 } else if (result == USERDB_RESULT_USER_UNKNOWN &&
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
769 request->client_pid != 0) {
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
770 /* this was an actual login attempt, the user should
4ec6a4def05b We treated internal userdb lookup errors as "user unknown" errors. In such
Timo Sirainen <tss@iki.fi>
parents: 4872
diff changeset
771 have been found. */
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
772 if (auth_request_get_auth(request)->userdbs->next == NULL) {
8402
244addad91a5 auth: Improved "user not found from userdb" error message.
Timo Sirainen <tss@iki.fi>
parents: 8347
diff changeset
773 auth_request_log_error(request, "userdb",
244addad91a5 auth: Improved "user not found from userdb" error message.
Timo Sirainen <tss@iki.fi>
parents: 8347
diff changeset
774 "user not found from userdb %s",
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
775 request->userdb->userdb->iface->name);
8402
244addad91a5 auth: Improved "user not found from userdb" error message.
Timo Sirainen <tss@iki.fi>
parents: 8347
diff changeset
776 } else {
244addad91a5 auth: Improved "user not found from userdb" error message.
Timo Sirainen <tss@iki.fi>
parents: 8347
diff changeset
777 auth_request_log_error(request, "userdb",
244addad91a5 auth: Improved "user not found from userdb" error message.
Timo Sirainen <tss@iki.fi>
parents: 8347
diff changeset
778 "user not found from any userdbs");
244addad91a5 auth: Improved "user not found from userdb" error message.
Timo Sirainen <tss@iki.fi>
parents: 8347
diff changeset
779 }
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
780 }
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
781
11017
ce7ed594d99e auth: If userdb lookup fails internally, don't cache the result.
Timo Sirainen <tss@iki.fi>
parents: 10989
diff changeset
782 if (request->userdb_lookup_failed) {
ce7ed594d99e auth: If userdb lookup fails internally, don't cache the result.
Timo Sirainen <tss@iki.fi>
parents: 10989
diff changeset
783 /* no caching */
ce7ed594d99e auth: If userdb lookup fails internally, don't cache the result.
Timo Sirainen <tss@iki.fi>
parents: 10989
diff changeset
784 } else if (result != USERDB_RESULT_INTERNAL_FAILURE)
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
785 auth_request_userdb_save_cache(request, result);
5036
df93cf66022a If request fails with internal failure, don't crash if auth cache is
Timo Sirainen <tss@iki.fi>
parents: 4983
diff changeset
786 else if (passdb_cache != NULL && userdb->cache_key != NULL) {
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
787 /* lookup failed. if we're looking here only because the
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
788 request was expired in cache, fallback to using cached
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
789 expired record. */
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
790 const char *cache_key = userdb->cache_key;
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
791 struct auth_stream_reply *reply;
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
792
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
793 if (auth_request_lookup_user_cache(request, cache_key, &reply,
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
794 &result, TRUE)) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
795 request->userdb_reply = reply;
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
796 auth_request_log_info(request, "userdb",
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
797 "Fallbacking to expired data from cache");
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
798 }
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
799 }
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
800
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
801 request->private_callback.userdb(result, request);
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
802 }
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
803
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
804 void auth_request_lookup_user(struct auth_request *request,
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
805 userdb_callback_t *callback)
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
806 {
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
807 struct userdb_module *userdb = request->userdb->userdb;
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
808 const char *cache_key;
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
809
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
810 request->private_callback.userdb = callback;
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
811 request->userdb_lookup = TRUE;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
812
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
813 /* (for now) auth_cache is shared between passdb and userdb */
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
814 cache_key = passdb_cache == NULL ? NULL : userdb->cache_key;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
815 if (cache_key != NULL) {
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
816 struct auth_stream_reply *reply;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
817 enum userdb_result result;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
818
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
819 if (auth_request_lookup_user_cache(request, cache_key, &reply,
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
820 &result, FALSE)) {
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
821 request->userdb_reply = reply;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
822 request->private_callback.userdb(result, request);
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
823 return;
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
824 }
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
825 }
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
826
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
827 if (userdb->blocking)
3183
16ea551957ed Replaced userdb/passdb settings with blocks so it's possible to give
Timo Sirainen <tss@iki.fi>
parents: 3171
diff changeset
828 userdb_blocking_lookup(request);
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3164
diff changeset
829 else
3658
fc4622b1c1ef Separated userdb_module's interface and the actual data struct.
Timo Sirainen <tss@iki.fi>
parents: 3657
diff changeset
830 userdb->iface->lookup(request, auth_request_userdb_callback);
3068
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
831 }
b01a8fa09f94 Cleanups.
Timo Sirainen <tss@iki.fi>
parents: 3065
diff changeset
832
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
833 static char *
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
834 auth_request_fix_username(struct auth_request *request, const char *username,
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
835 const char **error_r)
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
836 {
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
837 const struct auth_settings *set = request->set;
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
838 unsigned char *p;
10892
9675d9a54ac9 auth: Moved some variables generated from settings to struct auth_settings.
Timo Sirainen <tss@iki.fi>
parents: 10836
diff changeset
839 char *user;
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
840
10892
9675d9a54ac9 auth: Moved some variables generated from settings to struct auth_settings.
Timo Sirainen <tss@iki.fi>
parents: 10836
diff changeset
841 if (*set->default_realm != '\0' &&
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8599
diff changeset
842 strchr(username, '@') == NULL) {
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
843 user = p_strconcat(request->pool, username, "@",
10892
9675d9a54ac9 auth: Moved some variables generated from settings to struct auth_settings.
Timo Sirainen <tss@iki.fi>
parents: 10836
diff changeset
844 set->default_realm, NULL);
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
845 } else {
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
846 user = p_strdup(request->pool, username);
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
847 }
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
848
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
849 for (p = (unsigned char *)user; *p != '\0'; p++) {
10892
9675d9a54ac9 auth: Moved some variables generated from settings to struct auth_settings.
Timo Sirainen <tss@iki.fi>
parents: 10836
diff changeset
850 if (set->username_translation_map[*p & 0xff] != 0)
9675d9a54ac9 auth: Moved some variables generated from settings to struct auth_settings.
Timo Sirainen <tss@iki.fi>
parents: 10836
diff changeset
851 *p = set->username_translation_map[*p & 0xff];
9675d9a54ac9 auth: Moved some variables generated from settings to struct auth_settings.
Timo Sirainen <tss@iki.fi>
parents: 10836
diff changeset
852 if (set->username_chars_map[*p & 0xff] == 0) {
4834
679c9326741c When invalid character is found from username, say what character it is in
Timo Sirainen <tss@iki.fi>
parents: 4825
diff changeset
853 *error_r = t_strdup_printf(
679c9326741c When invalid character is found from username, say what character it is in
Timo Sirainen <tss@iki.fi>
parents: 4825
diff changeset
854 "Username contains disallowed character: "
679c9326741c When invalid character is found from username, say what character it is in
Timo Sirainen <tss@iki.fi>
parents: 4825
diff changeset
855 "0x%02x", *p);
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
856 return NULL;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
857 }
4168
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
858 }
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
859
10892
9675d9a54ac9 auth: Moved some variables generated from settings to struct auth_settings.
Timo Sirainen <tss@iki.fi>
parents: 10836
diff changeset
860 if (*set->username_format != '\0') {
4168
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
861 /* username format given, put it through variable expansion.
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
862 we'll have to temporarily replace request->user to get
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
863 %u to be the wanted username */
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
864 const struct var_expand_table *table;
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
865 char *old_username;
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
866 string_t *dest;
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
867
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
868 old_username = request->user;
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
869 request->user = user;
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
870
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
871 dest = t_str_new(256);
8597
9f885dbd8157 auth: Removed extra string escaping from places where it's not necessary (or is even harmful).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
872 table = auth_request_get_var_expand_table(request, NULL);
10892
9675d9a54ac9 auth: Moved some variables generated from settings to struct auth_settings.
Timo Sirainen <tss@iki.fi>
parents: 10836
diff changeset
873 var_expand(dest, set->username_format, table);
4168
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
874 user = p_strdup(request->pool, str_c(dest));
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
875
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
876 request->user = old_username;
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
877 }
3f27bf7832a2 Added auth_username_format setting.
Timo Sirainen <tss@iki.fi>
parents: 4164
diff changeset
878
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
879 return user;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
880 }
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
881
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3771
diff changeset
882 bool auth_request_set_username(struct auth_request *request,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3771
diff changeset
883 const char *username, const char **error_r)
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
884 {
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
885 const struct auth_settings *set = request->set;
4164
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
886 const char *p, *login_username = NULL;
4108
e1774d677536 Added auth_master_user_separator setting which allows giving the master username inside the normal username.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4104
diff changeset
887
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8599
diff changeset
888 if (*set->master_user_separator != '\0' && !request->userdb_lookup) {
4108
e1774d677536 Added auth_master_user_separator setting which allows giving the master username inside the normal username.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4104
diff changeset
889 /* check if the username contains a master user */
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8599
diff changeset
890 p = strchr(username, *set->master_user_separator);
4108
e1774d677536 Added auth_master_user_separator setting which allows giving the master username inside the normal username.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4104
diff changeset
891 if (p != NULL) {
e1774d677536 Added auth_master_user_separator setting which allows giving the master username inside the normal username.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4104
diff changeset
892 /* it does, set it. */
4140
52a2e6f35acf The login and master usernames were reversed when using
Timo Sirainen <tss@iki.fi>
parents: 4139
diff changeset
893 login_username = t_strdup_until(username, p);
52a2e6f35acf The login and master usernames were reversed when using
Timo Sirainen <tss@iki.fi>
parents: 4139
diff changeset
894
9477
6462ba85d751 auth: Don't assert-crash if trying to log in as master user but with empty login username.
Timo Sirainen <tss@iki.fi>
parents: 9383
diff changeset
895 if (*login_username == '\0') {
6462ba85d751 auth: Don't assert-crash if trying to log in as master user but with empty login username.
Timo Sirainen <tss@iki.fi>
parents: 9383
diff changeset
896 *error_r = "Empty login username";
6462ba85d751 auth: Don't assert-crash if trying to log in as master user but with empty login username.
Timo Sirainen <tss@iki.fi>
parents: 9383
diff changeset
897 return FALSE;
6462ba85d751 auth: Don't assert-crash if trying to log in as master user but with empty login username.
Timo Sirainen <tss@iki.fi>
parents: 9383
diff changeset
898 }
6462ba85d751 auth: Don't assert-crash if trying to log in as master user but with empty login username.
Timo Sirainen <tss@iki.fi>
parents: 9383
diff changeset
899
4140
52a2e6f35acf The login and master usernames were reversed when using
Timo Sirainen <tss@iki.fi>
parents: 4139
diff changeset
900 /* username is the master user */
52a2e6f35acf The login and master usernames were reversed when using
Timo Sirainen <tss@iki.fi>
parents: 4139
diff changeset
901 username = p + 1;
4108
e1774d677536 Added auth_master_user_separator setting which allows giving the master username inside the normal username.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4104
diff changeset
902 }
e1774d677536 Added auth_master_user_separator setting which allows giving the master username inside the normal username.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4104
diff changeset
903 }
e1774d677536 Added auth_master_user_separator setting which allows giving the master username inside the normal username.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4104
diff changeset
904
6619
2a36e7d9ddb6 Don't keep master username in original_username.
Timo Sirainen <tss@iki.fi>
parents: 6575
diff changeset
905 if (request->original_username == NULL) {
2a36e7d9ddb6 Don't keep master username in original_username.
Timo Sirainen <tss@iki.fi>
parents: 6575
diff changeset
906 /* the username may change later, but we need to use this
2a36e7d9ddb6 Don't keep master username in original_username.
Timo Sirainen <tss@iki.fi>
parents: 6575
diff changeset
907 username when verifying at least DIGEST-MD5 password. */
2a36e7d9ddb6 Don't keep master username in original_username.
Timo Sirainen <tss@iki.fi>
parents: 6575
diff changeset
908 request->original_username = p_strdup(request->pool, username);
2a36e7d9ddb6 Don't keep master username in original_username.
Timo Sirainen <tss@iki.fi>
parents: 6575
diff changeset
909 }
2a36e7d9ddb6 Don't keep master username in original_username.
Timo Sirainen <tss@iki.fi>
parents: 6575
diff changeset
910 if (request->cert_username) {
2a36e7d9ddb6 Don't keep master username in original_username.
Timo Sirainen <tss@iki.fi>
parents: 6575
diff changeset
911 /* cert_username overrides the username given by
10954
bcd43231f723 auth: Do username checks/translations even when ssl_username_from_cert=yes
Timo Sirainen <tss@iki.fi>
parents: 10903
diff changeset
912 authentication mechanism. but still do checks and
bcd43231f723 auth: Do username checks/translations even when ssl_username_from_cert=yes
Timo Sirainen <tss@iki.fi>
parents: 10903
diff changeset
913 translations to it. */
bcd43231f723 auth: Do username checks/translations even when ssl_username_from_cert=yes
Timo Sirainen <tss@iki.fi>
parents: 10903
diff changeset
914 username = request->user;
6619
2a36e7d9ddb6 Don't keep master username in original_username.
Timo Sirainen <tss@iki.fi>
parents: 6575
diff changeset
915 }
2a36e7d9ddb6 Don't keep master username in original_username.
Timo Sirainen <tss@iki.fi>
parents: 6575
diff changeset
916
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
917 if (*username == '\0') {
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
918 /* Some PAM plugins go nuts with empty usernames */
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
919 *error_r = "Empty username";
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
920 return FALSE;
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
921 }
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
922
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
923 request->user = auth_request_fix_username(request, username, error_r);
4834
679c9326741c When invalid character is found from username, say what character it is in
Timo Sirainen <tss@iki.fi>
parents: 4825
diff changeset
924 if (request->user == NULL) {
679c9326741c When invalid character is found from username, say what character it is in
Timo Sirainen <tss@iki.fi>
parents: 4825
diff changeset
925 auth_request_log_debug(request, "auth",
679c9326741c When invalid character is found from username, say what character it is in
Timo Sirainen <tss@iki.fi>
parents: 4825
diff changeset
926 "Invalid username: %s", str_sanitize(username, 128));
4164
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
927 return FALSE;
4834
679c9326741c When invalid character is found from username, say what character it is in
Timo Sirainen <tss@iki.fi>
parents: 4825
diff changeset
928 }
6658
d22888a77a1e Auth cache didn't work for usernames that got translated internally.
Timo Sirainen <tss@iki.fi>
parents: 6619
diff changeset
929 if (request->translated_username == NULL) {
d22888a77a1e Auth cache didn't work for usernames that got translated internally.
Timo Sirainen <tss@iki.fi>
parents: 6619
diff changeset
930 /* similar to original_username, but after translations */
d22888a77a1e Auth cache didn't work for usernames that got translated internally.
Timo Sirainen <tss@iki.fi>
parents: 6619
diff changeset
931 request->translated_username = request->user;
d22888a77a1e Auth cache didn't work for usernames that got translated internally.
Timo Sirainen <tss@iki.fi>
parents: 6619
diff changeset
932 }
4164
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
933
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
934 if (login_username != NULL) {
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
935 if (!auth_request_set_login_username(request,
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
936 login_username,
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
937 error_r))
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
938 return FALSE;
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
939 }
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
940 return TRUE;
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
941 }
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
942
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
943 bool auth_request_set_login_username(struct auth_request *request,
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
944 const char *username,
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
945 const char **error_r)
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
946 {
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
947 i_assert(*username != '\0');
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
948
4164
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
949 if (strcmp(username, request->user) == 0) {
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
950 /* The usernames are the same, we don't really wish to log
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
951 in as someone else */
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
952 return TRUE;
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
953 }
d38dd6312be1 Master login fixes, PLAIN authentication was still broken..
Timo Sirainen <tss@iki.fi>
parents: 4146
diff changeset
954
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
955 /* lookup request->user from masterdb first */
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
956 request->passdb = auth_request_get_auth(request)->masterdbs;
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
957
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
958 request->requested_login_user =
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
959 auth_request_fix_username(request, username, error_r);
4136
f7731e6eec7e If master login username is the same as the normal username, we don't want
Timo Sirainen <tss@iki.fi>
parents: 4108
diff changeset
960 return request->requested_login_user != NULL;
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
961 }
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
962
4078
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
963 static void auth_request_validate_networks(struct auth_request *request,
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
964 const char *networks)
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
965 {
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
966 const char *const *net;
7919
423b8e3fedbb Created net_parse_range() from auth code.
Timo Sirainen <tss@iki.fi>
parents: 7517
diff changeset
967 struct ip_addr net_ip;
423b8e3fedbb Created net_parse_range() from auth code.
Timo Sirainen <tss@iki.fi>
parents: 7517
diff changeset
968 unsigned int bits;
4078
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
969 bool found = FALSE;
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
970
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
971 if (request->remote_ip.family == 0) {
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
972 /* IP not known */
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
973 auth_request_log_info(request, "passdb",
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
974 "allow_nets check failed: Remote IP not known");
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
975 request->passdb_failure = TRUE;
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
976 return;
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
977 }
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
978
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
979 for (net = t_strsplit_spaces(networks, ", "); *net != NULL; net++) {
4420
1174e508593d auth_debug: If allow_nets is given, print debug messages when matching
Timo Sirainen <tss@iki.fi>
parents: 4402
diff changeset
980 auth_request_log_debug(request, "auth",
1174e508593d auth_debug: If allow_nets is given, print debug messages when matching
Timo Sirainen <tss@iki.fi>
parents: 4402
diff changeset
981 "allow_nets: Matching for network %s", *net);
7919
423b8e3fedbb Created net_parse_range() from auth code.
Timo Sirainen <tss@iki.fi>
parents: 7517
diff changeset
982
423b8e3fedbb Created net_parse_range() from auth code.
Timo Sirainen <tss@iki.fi>
parents: 7517
diff changeset
983 if (net_parse_range(*net, &net_ip, &bits) < 0) {
4078
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
984 auth_request_log_info(request, "passdb",
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
985 "allow_nets: Invalid network '%s'", *net);
7919
423b8e3fedbb Created net_parse_range() from auth code.
Timo Sirainen <tss@iki.fi>
parents: 7517
diff changeset
986 }
423b8e3fedbb Created net_parse_range() from auth code.
Timo Sirainen <tss@iki.fi>
parents: 7517
diff changeset
987
423b8e3fedbb Created net_parse_range() from auth code.
Timo Sirainen <tss@iki.fi>
parents: 7517
diff changeset
988 if (net_is_in_network(&request->remote_ip, &net_ip, bits)) {
423b8e3fedbb Created net_parse_range() from auth code.
Timo Sirainen <tss@iki.fi>
parents: 7517
diff changeset
989 found = TRUE;
4078
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
990 break;
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
991 }
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
992 }
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
993
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
994 if (!found) {
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
995 auth_request_log_info(request, "passdb",
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
996 "allow_nets check failed: IP not in allowed networks");
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
997 }
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
998 request->passdb_failure = !found;
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
999 }
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
1000
6855
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1001 static void
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1002 auth_request_set_password(struct auth_request *request, const char *value,
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1003 const char *default_scheme, bool noscheme)
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1004 {
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1005 if (request->passdb_password != NULL) {
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1006 auth_request_log_error(request,
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1007 request->passdb->passdb->iface.name,
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1008 "Multiple password values not supported");
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1009 return;
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1010 }
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1011
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1012 /* if the password starts with '{' it most likely contains
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1013 also '}'. check it anyway to make sure, because we
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1014 assert-crash later if it doesn't exist. this could happen
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1015 if plaintext passwords are used. */
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1016 if (*value == '{' && !noscheme && strchr(value, '}') != NULL)
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1017 request->passdb_password = p_strdup(request->pool, value);
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1018 else {
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1019 i_assert(default_scheme != NULL);
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1020 request->passdb_password =
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1021 p_strdup_printf(request->pool, "{%s}%s",
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1022 default_scheme, value);
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1023 }
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1024 }
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1025
7122
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1026 static void auth_request_set_reply_field(struct auth_request *request,
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1027 const char *name, const char *value)
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1028 {
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1029 if (strcmp(name, "nologin") == 0) {
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1030 /* user can't actually login - don't keep this
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1031 reply for master */
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1032 request->no_login = TRUE;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1033 value = NULL;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1034 } else if (strcmp(name, "proxy") == 0) {
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1035 /* we're proxying authentication for this user. send
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1036 password back if using plaintext authentication. */
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1037 request->proxy = TRUE;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1038 value = NULL;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1039 } else if (strcmp(name, "proxy_maybe") == 0) {
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1040 /* like "proxy", but log in normally if we're proxying to
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1041 ourself */
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1042 request->proxy = TRUE;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1043 request->proxy_maybe = TRUE;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1044 value = NULL;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1045 }
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1046
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1047 if (request->extra_fields == NULL)
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
1048 request->extra_fields = auth_stream_reply_init(request->pool);
7122
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1049 auth_stream_reply_add(request->extra_fields, name, value);
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1050 }
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1051
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
1052 void auth_request_set_field(struct auth_request *request,
3272
36db3285f4a7 Try to keep scheme always included in auth_request->passdb_password.
Timo Sirainen <tss@iki.fi>
parents: 3257
diff changeset
1053 const char *name, const char *value,
36db3285f4a7 Try to keep scheme always included in auth_request->passdb_password.
Timo Sirainen <tss@iki.fi>
parents: 3257
diff changeset
1054 const char *default_scheme)
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1055 {
8696
20345491824c auth: Using "username" or "domain" passdb fields caused problems with cache and blocking passdbs.
Timo Sirainen <tss@iki.fi>
parents: 8599
diff changeset
1056 const char *p, *orig_value;
6575
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1057
4017
e2d267e6f930 Check that we don't pass around key=value pairs with empty keys.
Timo Sirainen <tss@iki.fi>
parents: 3918
diff changeset
1058 i_assert(*name != '\0');
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1059 i_assert(value != NULL);
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1060
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1061 if (strcmp(name, "password") == 0) {
6855
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1062 auth_request_set_password(request, value,
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1063 default_scheme, FALSE);
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1064 return;
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1065 }
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1066 if (strcmp(name, "password_noscheme") == 0) {
5c514ebda66a Added "password_noscheme" field which assumes the password is in the default
Timo Sirainen <tss@iki.fi>
parents: 6854
diff changeset
1067 auth_request_set_password(request, value, default_scheme, TRUE);
3397
2db396230881 auth_request_set_field() shouldn't save password to extra_fields. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 3386
diff changeset
1068 return;
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1069 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1070
6575
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1071 if (strcmp(name, "user") == 0 ||
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1072 strcmp(name, "username") == 0 || strcmp(name, "domain") == 0) {
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1073 /* update username */
8696
20345491824c auth: Using "username" or "domain" passdb fields caused problems with cache and blocking passdbs.
Timo Sirainen <tss@iki.fi>
parents: 8599
diff changeset
1074 orig_value = value;
6575
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1075 if (strcmp(name, "username") == 0 &&
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1076 strchr(value, '@') == NULL &&
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1077 (p = strchr(request->user, '@')) != NULL) {
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1078 /* preserve the current @domain */
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1079 value = t_strconcat(value, p, NULL);
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1080 } else if (strcmp(name, "domain") == 0) {
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1081 p = strchr(request->user, '@');
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1082 if (p == NULL) {
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1083 /* add the domain */
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1084 value = t_strconcat(request->user, "@",
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1085 value, NULL);
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1086 } else {
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1087 /* replace the existing domain */
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1088 p = t_strdup_until(request->user, p + 1);
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1089 value = t_strconcat(p, value, NULL);
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1090 }
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1091 }
d573bc2a967d Added "username" and "domain" fields for modifying the username.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1092
3427
3f7575e43202 If username changes, log the change if debugging is enabled.
Timo Sirainen <tss@iki.fi>
parents: 3397
diff changeset
1093 if (strcmp(request->user, value) != 0) {
3f7575e43202 If username changes, log the change if debugging is enabled.
Timo Sirainen <tss@iki.fi>
parents: 3397
diff changeset
1094 auth_request_log_debug(request, "auth",
3f7575e43202 If username changes, log the change if debugging is enabled.
Timo Sirainen <tss@iki.fi>
parents: 3397
diff changeset
1095 "username changed %s -> %s",
3f7575e43202 If username changes, log the change if debugging is enabled.
Timo Sirainen <tss@iki.fi>
parents: 3397
diff changeset
1096 request->user, value);
3f7575e43202 If username changes, log the change if debugging is enabled.
Timo Sirainen <tss@iki.fi>
parents: 3397
diff changeset
1097 request->user = p_strdup(request->pool, value);
3f7575e43202 If username changes, log the change if debugging is enabled.
Timo Sirainen <tss@iki.fi>
parents: 3397
diff changeset
1098 }
8696
20345491824c auth: Using "username" or "domain" passdb fields caused problems with cache and blocking passdbs.
Timo Sirainen <tss@iki.fi>
parents: 8599
diff changeset
1099 /* restore the original value so it gets saved correctly to
20345491824c auth: Using "username" or "domain" passdb fields caused problems with cache and blocking passdbs.
Timo Sirainen <tss@iki.fi>
parents: 8599
diff changeset
1100 cache. */
20345491824c auth: Using "username" or "domain" passdb fields caused problems with cache and blocking passdbs.
Timo Sirainen <tss@iki.fi>
parents: 8599
diff changeset
1101 value = orig_value;
5129
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1102 } else if (strcmp(name, "nodelay") == 0) {
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1103 /* don't delay replying to client of the failure */
3161
6a3254e3c3de Moved cache handling from sql/ldap-specific code to generic auth-request
Timo Sirainen <tss@iki.fi>
parents: 3158
diff changeset
1104 request->no_failure_delay = TRUE;
5129
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1105 } else if (strcmp(name, "nopassword") == 0) {
3669
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
1106 /* NULL password - anything goes */
5619
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1107 const char *password = request->passdb_password;
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1108
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1109 if (password != NULL) {
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1110 (void)password_get_scheme(&password);
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1111 if (*password != '\0') {
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1112 auth_request_log_error(request,
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1113 request->passdb->passdb->iface.name,
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1114 "nopassword set but password is "
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1115 "non-empty");
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1116 return;
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1117 }
5412
79187982328f If "nopassword" is set, don't crash if password is non-NULL. However give an
Timo Sirainen <tss@iki.fi>
parents: 5302
diff changeset
1118 }
3669
09b5e002ad8a If passdb returned NULL password (ie. no password needed), it wasn't cached
Timo Sirainen <tss@iki.fi>
parents: 3668
diff changeset
1119 request->no_password = TRUE;
5412
79187982328f If "nopassword" is set, don't crash if password is non-NULL. However give an
Timo Sirainen <tss@iki.fi>
parents: 5302
diff changeset
1120 request->passdb_password = NULL;
5129
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1121 } else if (strcmp(name, "allow_nets") == 0) {
4078
265655f270df Added "allow_nets" extra field. If set, the user can log in only from
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4054
diff changeset
1122 auth_request_validate_networks(request, value);
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1123 } else if (strncmp(name, "userdb_", 7) == 0) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1124 /* for prefetch userdb */
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1125 if (request->userdb_reply == NULL)
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1126 auth_request_init_userdb_reply(request);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1127 auth_request_set_userdb_field(request, name + 7, value);
5129
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1128 } else {
7122
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1129 /* these fields are returned to client */
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1130 auth_request_set_reply_field(request, name, value);
5129
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1131 return;
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1132 }
3520
e2fe8222449d s/occured/occurred/
Timo Sirainen <tss@iki.fi>
parents: 3432
diff changeset
1133
8599
812a977d7c1a auth worker processes shouldn't duplicate the auth cache.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
1134 if ((passdb_cache != NULL &&
812a977d7c1a auth worker processes shouldn't duplicate the auth cache.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
1135 request->passdb->passdb->cache_key != NULL) || worker) {
812a977d7c1a auth worker processes shouldn't duplicate the auth cache.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
1136 /* we'll need to get this field stored into cache,
812a977d7c1a auth worker processes shouldn't duplicate the auth cache.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
1137 or we're a worker and we'll need to send this to the main
812a977d7c1a auth worker processes shouldn't duplicate the auth cache.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
1138 auth process that can store it in the cache. */
5129
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1139 if (request->extra_cache_fields == NULL) {
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1140 request->extra_cache_fields =
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
1141 auth_stream_reply_init(request->pool);
5129
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1142 }
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1143 auth_stream_reply_add(request->extra_cache_fields, name, value);
9b1a90eddfd0 Special extra_fields weren't saved to auth cache. This was especially
Timo Sirainen <tss@iki.fi>
parents: 5069
diff changeset
1144 }
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1145 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1146
5153
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1147 void auth_request_set_fields(struct auth_request *request,
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1148 const char *const *fields,
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1149 const char *default_scheme)
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1150 {
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1151 const char *key, *value;
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1152
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1153 for (; *fields != NULL; fields++) {
5163
39d3fca337a5 auth_request_set_fields(): Don't crash with empty fields.
Timo Sirainen <tss@iki.fi>
parents: 5153
diff changeset
1154 if (**fields == '\0')
39d3fca337a5 auth_request_set_fields(): Don't crash with empty fields.
Timo Sirainen <tss@iki.fi>
parents: 5153
diff changeset
1155 continue;
39d3fca337a5 auth_request_set_fields(): Don't crash with empty fields.
Timo Sirainen <tss@iki.fi>
parents: 5153
diff changeset
1156
5153
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1157 value = strchr(*fields, '=');
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1158 if (value == NULL) {
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1159 key = *fields;
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1160 value = "";
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1161 } else {
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1162 key = t_strdup_until(*fields, value);
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1163 value++;
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1164 }
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1165 auth_request_set_field(request, key, value, default_scheme);
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1166 }
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1167 }
83f361144a8a Added auth_request_set_fields() and used it instead of duplicating the code
Timo Sirainen <tss@iki.fi>
parents: 5134
diff changeset
1168
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1169 void auth_request_init_userdb_reply(struct auth_request *request)
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1170 {
7388
08d31d752893 Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents: 7318
diff changeset
1171 request->userdb_reply = auth_stream_reply_init(request->pool);
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1172 auth_stream_reply_add(request->userdb_reply, NULL, request->user);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1173 }
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1174
5879
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1175 static void
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1176 auth_request_change_userdb_user(struct auth_request *request, const char *user)
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1177 {
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1178 const char *str;
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1179
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1180 /* replace the username in userdb_reply if it changed */
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1181 if (strcmp(user, request->user) == 0)
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1182 return;
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1183
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1184 str = t_strdup(auth_stream_reply_export(request->userdb_reply));
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1185
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1186 /* reset the reply and add the new username */
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1187 auth_request_set_field(request, "user", user, NULL);
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1188 auth_stream_reply_reset(request->userdb_reply);
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1189 auth_stream_reply_add(request->userdb_reply,
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1190 NULL, request->user);
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1191
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1192 /* add the rest */
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1193 str = strchr(str, '\t');
7394
2d3b9a6d23f5 Changing "user" from userdb crashed.
Timo Sirainen <tss@iki.fi>
parents: 7389
diff changeset
1194 if (str != NULL)
2d3b9a6d23f5 Changing "user" from userdb crashed.
Timo Sirainen <tss@iki.fi>
parents: 7389
diff changeset
1195 auth_stream_reply_import(request->userdb_reply, str + 1);
5879
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1196 }
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1197
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1198 static void auth_request_set_uidgid_file(struct auth_request *request,
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1199 const char *path_template)
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1200 {
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1201 string_t *path;
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1202 struct stat st;
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1203
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1204 path = t_str_new(256);
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1205 var_expand(path, path_template,
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1206 auth_request_get_var_expand_table(request, NULL));
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1207 if (stat(str_c(path), &st) < 0) {
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1208 auth_request_log_error(request, "uidgid_file",
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1209 "stat(%s) failed: %m", str_c(path));
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1210 } else {
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1211 auth_stream_reply_add(request->userdb_reply,
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1212 "uid", dec2str(st.st_uid));
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1213 auth_stream_reply_add(request->userdb_reply,
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1214 "gid", dec2str(st.st_gid));
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1215 }
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1216 }
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1217
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1218 void auth_request_set_userdb_field(struct auth_request *request,
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1219 const char *name, const char *value)
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1220 {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1221 uid_t uid;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1222 gid_t gid;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1223
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1224 if (strcmp(name, "uid") == 0) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1225 uid = userdb_parse_uid(request, value);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1226 if (uid == (uid_t)-1) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1227 request->userdb_lookup_failed = TRUE;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1228 return;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1229 }
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1230 value = dec2str(uid);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1231 } else if (strcmp(name, "gid") == 0) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1232 gid = userdb_parse_gid(request, value);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1233 if (gid == (gid_t)-1) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1234 request->userdb_lookup_failed = TRUE;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1235 return;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1236 }
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1237 value = dec2str(gid);
10989
53f4e8e0166a auth: Added "tempfail" userdb field.
Timo Sirainen <tss@iki.fi>
parents: 10961
diff changeset
1238 } else if (strcmp(name, "tempfail") == 0) {
53f4e8e0166a auth: Added "tempfail" userdb field.
Timo Sirainen <tss@iki.fi>
parents: 10961
diff changeset
1239 request->userdb_lookup_failed = TRUE;
11151
093591e1110b auth: Fixed userdb tempfail to work with blocking userdbs.
Timo Sirainen <tss@iki.fi>
parents: 11086
diff changeset
1240 return;
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1241 } else if (strcmp(name, "user") == 0) {
5879
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1242 auth_request_change_userdb_user(request, value);
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1243 return;
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1244 } else if (strcmp(name, "uidgid_file") == 0) {
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1245 auth_request_set_uidgid_file(request, value);
f7cdede45a88 If uidgid_file=<template_path> is set, the uid and gid are looked up by
Timo Sirainen <tss@iki.fi>
parents: 5872
diff changeset
1246 return;
8163
498dd1ec2b93 Added a special userdb_import field to add TAB-separated fields to userdb reply.
Timo Sirainen <tss@iki.fi>
parents: 8111
diff changeset
1247 } else if (strcmp(name, "userdb_import") == 0) {
498dd1ec2b93 Added a special userdb_import field to add TAB-separated fields to userdb reply.
Timo Sirainen <tss@iki.fi>
parents: 8111
diff changeset
1248 auth_stream_reply_import(request->userdb_reply, value);
498dd1ec2b93 Added a special userdb_import field to add TAB-separated fields to userdb reply.
Timo Sirainen <tss@iki.fi>
parents: 8111
diff changeset
1249 return;
8768
91e880ae387a Authentication: system_user userdb extra field renamed to system_groups_user.
Timo Sirainen <tss@iki.fi>
parents: 8764
diff changeset
1250 } else if (strcmp(name, "system_user") == 0) {
91e880ae387a Authentication: system_user userdb extra field renamed to system_groups_user.
Timo Sirainen <tss@iki.fi>
parents: 8764
diff changeset
1251 /* FIXME: the system_user is for backwards compatibility */
91e880ae387a Authentication: system_user userdb extra field renamed to system_groups_user.
Timo Sirainen <tss@iki.fi>
parents: 8764
diff changeset
1252 name = "system_groups_user";
5872
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1253 }
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1254
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1255 auth_stream_reply_add(request->userdb_reply, name, value);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1256 }
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1257
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1258 void auth_request_set_userdb_field_values(struct auth_request *request,
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1259 const char *name,
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1260 const char *const *values)
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1261 {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1262 if (*values == NULL)
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1263 return;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1264
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1265 if (strcmp(name, "uid") == 0) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1266 /* there can be only one. use the first one. */
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1267 auth_request_set_userdb_field(request, name, *values);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1268 } else if (strcmp(name, "gid") == 0) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1269 /* convert gids to comma separated list */
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1270 string_t *value;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1271 gid_t gid;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1272
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1273 value = t_str_new(128);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1274 for (; *values != NULL; values++) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1275 gid = userdb_parse_gid(request, *values);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1276 if (gid == (gid_t)-1) {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1277 request->userdb_lookup_failed = TRUE;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1278 return;
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1279 }
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1280
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1281 if (str_len(value) > 0)
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1282 str_append_c(value, ',');
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1283 str_append(value, dec2str(gid));
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1284 }
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1285 auth_stream_reply_add(request->userdb_reply, name,
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1286 str_c(value));
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1287 } else {
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1288 /* add only one */
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1289 auth_request_set_userdb_field(request, name, *values);
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1290 }
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1291 }
93bd157917ca Changed userdb callback API. Don't require uid/gid to be returned by userdb.
Timo Sirainen <tss@iki.fi>
parents: 5788
diff changeset
1292
7122
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1293 static bool auth_request_proxy_is_self(struct auth_request *request)
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1294 {
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1295 const char *const *tmp, *host = NULL, *port = NULL, *destuser = NULL;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1296 struct ip_addr ip;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1297
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1298 tmp = auth_stream_split(request->extra_fields);
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1299 for (; *tmp != NULL; tmp++) {
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1300 if (strncmp(*tmp, "host=", 5) == 0)
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1301 host = *tmp + 5;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1302 else if (strncmp(*tmp, "port=", 5) == 0)
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1303 port = *tmp + 5;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1304 if (strncmp(*tmp, "destuser=", 9) == 0)
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1305 destuser = *tmp + 9;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1306 }
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1307
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1308 if (host == NULL || net_addr2ip(host, &ip) < 0) {
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1309 /* broken setup */
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1310 return FALSE;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1311 }
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1312 if (!net_ip_compare(&ip, &request->local_ip))
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1313 return FALSE;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1314
11086
260e190306b0 Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents: 11017
diff changeset
1315 if (port != NULL && !str_uint_equals(port, request->local_port))
7122
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1316 return FALSE;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1317 return destuser == NULL ||
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1318 strcmp(destuser, request->original_username) == 0;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1319 }
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1320
7123
25e7c37c7c10 If proxy user has a password and authentication fails, don't return the
Timo Sirainen <tss@iki.fi>
parents: 7122
diff changeset
1321 void auth_request_proxy_finish(struct auth_request *request, bool success)
7122
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1322 {
7123
25e7c37c7c10 If proxy user has a password and authentication fails, don't return the
Timo Sirainen <tss@iki.fi>
parents: 7122
diff changeset
1323 if (!request->proxy || request->no_login)
7122
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1324 return;
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1325
7123
25e7c37c7c10 If proxy user has a password and authentication fails, don't return the
Timo Sirainen <tss@iki.fi>
parents: 7122
diff changeset
1326 if (!success) {
25e7c37c7c10 If proxy user has a password and authentication fails, don't return the
Timo Sirainen <tss@iki.fi>
parents: 7122
diff changeset
1327 /* drop all proxy fields */
7278
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1328 } else if (!request->proxy_maybe) {
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1329 /* proxying */
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1330 request->no_login = TRUE;
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1331 return;
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1332 } else if (!auth_request_proxy_is_self(request)) {
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1333 /* proxy destination isn't ourself - proxy */
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1334 auth_stream_reply_remove(request->extra_fields, "proxy_maybe");
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1335 auth_stream_reply_add(request->extra_fields, "proxy", NULL);
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1336 request->no_login = TRUE;
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1337 return;
7123
25e7c37c7c10 If proxy user has a password and authentication fails, don't return the
Timo Sirainen <tss@iki.fi>
parents: 7122
diff changeset
1338 } else {
25e7c37c7c10 If proxy user has a password and authentication fails, don't return the
Timo Sirainen <tss@iki.fi>
parents: 7122
diff changeset
1339 /* proxying to ourself - log in without proxying by dropping
25e7c37c7c10 If proxy user has a password and authentication fails, don't return the
Timo Sirainen <tss@iki.fi>
parents: 7122
diff changeset
1340 all the proxying fields. */
7122
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1341 }
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1342 auth_stream_reply_remove(request->extra_fields, "proxy");
7278
27b7b6c34961 Fixed proxy_maybe handling.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
1343 auth_stream_reply_remove(request->extra_fields, "proxy_maybe");
7122
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1344 auth_stream_reply_remove(request->extra_fields, "host");
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1345 auth_stream_reply_remove(request->extra_fields, "port");
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1346 auth_stream_reply_remove(request->extra_fields, "destuser");
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1347 }
fb03422c0760 Added "proxy_maybe" field. If it's used instead of "proxy" and the
Timo Sirainen <tss@iki.fi>
parents: 7106
diff changeset
1348
10542
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1349 static void log_password_failure(struct auth_request *request,
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1350 const char *plain_password,
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1351 const char *crypted_password,
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1352 const char *scheme, const char *user,
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1353 const char *subsystem)
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1354 {
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1355 static bool scheme_ok = FALSE;
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1356 string_t *str = t_str_new(256);
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1357 const char *working_scheme;
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1358
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1359 str_printfa(str, "%s(%s) != '%s'", scheme,
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1360 plain_password, crypted_password);
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1361
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1362 if (!scheme_ok) {
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1363 /* perhaps the scheme is wrong - see if we can find
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1364 a working one */
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1365 working_scheme = password_scheme_detect(plain_password,
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1366 crypted_password, user);
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1367 if (working_scheme != NULL) {
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1368 str_printfa(str, ", try %s scheme instead",
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1369 working_scheme);
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1370 }
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1371 }
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1372
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1373 auth_request_log_debug(request, subsystem, "%s", str_c(str));
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1374 }
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1375
10585
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1376 void auth_request_log_password_mismatch(struct auth_request *request,
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1377 const char *subsystem)
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1378 {
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1379 string_t *str;
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
1380 const char *log_type = request->set->verbose_passwords;
10585
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1381
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1382 if (strcmp(log_type, "no") == 0) {
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1383 auth_request_log_info(request, subsystem, "Password mismatch");
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1384 return;
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1385 }
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1386
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1387 str = t_str_new(128);
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1388 get_log_prefix(str, request, subsystem);
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1389 str_append(str, "Password mismatch ");
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1390
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1391 if (strcmp(log_type, "plain") == 0) {
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1392 str_printfa(str, "(given password: %s)",
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1393 request->mech_password);
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1394 } else if (strcmp(log_type, "sha1") == 0) {
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1395 unsigned char sha1[SHA1_RESULTLEN];
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1396
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1397 sha1_get_digest(request->mech_password,
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1398 strlen(request->mech_password), sha1);
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1399 str_printfa(str, "(SHA1 of given password: %s)",
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1400 binary_to_hex(sha1, sizeof(sha1)));
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1401 } else {
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1402 i_unreached();
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1403 }
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1404
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1405 i_info("%s", str_c(str));
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1406 }
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1407
3918
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1408 int auth_request_password_verify(struct auth_request *request,
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1409 const char *plain_password,
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1410 const char *crypted_password,
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1411 const char *scheme, const char *subsystem)
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1412 {
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1413 const unsigned char *raw_password;
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1414 size_t raw_password_size;
3918
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1415 int ret;
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1416
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
1417 if (request->skip_password_check) {
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
1418 /* currently this can happen only with master logins */
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
1419 i_assert(request->master_user != NULL);
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
1420 return 1;
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
1421 }
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
1422
10897
52eb8317514f auth: Cleaned up struct auth_passdb/auth_userdb.
Timo Sirainen <tss@iki.fi>
parents: 10893
diff changeset
1423 if (request->passdb->set->deny) {
4689
80023f898ddd Don't even try to verify password with deny=yes passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
1424 /* this is a deny database, we don't care about the password */
80023f898ddd Don't even try to verify password with deny=yes passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
1425 return 0;
80023f898ddd Don't even try to verify password with deny=yes passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
1426 }
80023f898ddd Don't even try to verify password with deny=yes passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
1427
5619
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1428 if (request->no_password) {
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1429 auth_request_log_info(request, subsystem, "No password");
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1430 return 1;
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1431 }
121af23cfc65 Empty password doesn't anymore allow user to log in with any password,
Timo Sirainen <tss@iki.fi>
parents: 5598
diff changeset
1432
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1433 ret = password_decode(crypted_password, scheme,
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1434 &raw_password, &raw_password_size);
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1435 if (ret <= 0) {
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1436 if (ret < 0) {
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1437 auth_request_log_error(request, subsystem,
9383
513691dbe21c auth: Improved "Password not in expected scheme" error message.
Timo Sirainen <tss@iki.fi>
parents: 9219
diff changeset
1438 "Password in passdb is not in expected scheme %s",
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1439 scheme);
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1440 } else {
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1441 auth_request_log_error(request, subsystem,
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1442 "Unknown scheme %s", scheme);
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1443 }
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1444 return -1;
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1445 }
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1446
8347
fc5683975951 auth: original_username should never be NULL, removed all code that checks for it.
Timo Sirainen <tss@iki.fi>
parents: 8346
diff changeset
1447 /* Use original_username since it may be important for some
4872
07bdc78ce38e Don't crash if plain-md5, plain-md4 or sha1 password is invalid and we're
Timo Sirainen <tss@iki.fi>
parents: 4834
diff changeset
1448 password schemes (eg. digest-md5). Otherwise the username is used
07bdc78ce38e Don't crash if plain-md5, plain-md4 or sha1 password is invalid and we're
Timo Sirainen <tss@iki.fi>
parents: 4834
diff changeset
1449 only for logging purposes. */
8347
fc5683975951 auth: original_username should never be NULL, removed all code that checks for it.
Timo Sirainen <tss@iki.fi>
parents: 8346
diff changeset
1450 ret = password_verify(plain_password, request->original_username,
fc5683975951 auth: original_username should never be NULL, removed all code that checks for it.
Timo Sirainen <tss@iki.fi>
parents: 8346
diff changeset
1451 scheme, raw_password, raw_password_size);
5598
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1452 i_assert(ret >= 0);
971050640e3b All password schemes can now be encoded with base64 or hex. The encoding is
Timo Sirainen <tss@iki.fi>
parents: 5593
diff changeset
1453 if (ret == 0) {
10585
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1454 auth_request_log_password_mismatch(request, subsystem);
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
1455 if (request->set->debug_passwords) T_BEGIN {
10542
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1456 log_password_failure(request, plain_password,
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1457 crypted_password, scheme,
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1458 request->original_username,
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1459 subsystem);
de75c45e6765 auth_debug_passwords: If password is correct but scheme is wrong, try to detect and log it.
Timo Sirainen <tss@iki.fi>
parents: 10301
diff changeset
1460 } T_END;
3918
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1461 }
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1462 return ret;
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1463 }
40a461d554e6 Added auth_debug_passwords setting. If it's not enabled, hide all password
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1464
4295
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1465 static const char *
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1466 escape_none(const char *string,
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6243
diff changeset
1467 const struct auth_request *request ATTR_UNUSED)
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1468 {
4295
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1469 return string;
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1470 }
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1471
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1472 const char *
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1473 auth_request_str_escape(const char *string,
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6243
diff changeset
1474 const struct auth_request *request ATTR_UNUSED)
4295
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1475 {
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1476 return str_escape(string);
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1477 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1478
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1479 const struct var_expand_table *
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1480 auth_request_get_var_expand_table(const struct auth_request *auth_request,
4295
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1481 auth_request_escape_func_t *escape_func)
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1482 {
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1483 static struct var_expand_table static_tab[] = {
8544
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1484 { 'u', NULL, "user" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1485 { 'n', NULL, "username" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1486 { 'd', NULL, "domain" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1487 { 's', NULL, "service" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1488 { 'h', NULL, "home" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1489 { 'l', NULL, "lip" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1490 { 'r', NULL, "rip" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1491 { 'p', NULL, "pid" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1492 { 'w', NULL, "password" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1493 { '!', NULL, NULL },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1494 { 'm', NULL, "mech" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1495 { 'c', NULL, "secured" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1496 { 'a', NULL, "lport" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1497 { 'b', NULL, "rport" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1498 { 'k', NULL, "cert" },
11466
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1499 { '\0', NULL, "login_user" },
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1500 { '\0', NULL, "login_username" },
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1501 { '\0', NULL, "login_domain" },
8544
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8456
diff changeset
1502 { '\0', NULL, NULL }
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1503 };
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1504 struct var_expand_table *tab;
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1505
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1506 if (escape_func == NULL)
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1507 escape_func = escape_none;
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1508
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1509 tab = t_malloc(sizeof(static_tab));
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1510 memcpy(tab, static_tab, sizeof(static_tab));
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1511
4295
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1512 tab[0].value = escape_func(auth_request->user, auth_request);
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1513 tab[1].value = escape_func(t_strcut(auth_request->user, '@'),
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1514 auth_request);
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1515 tab[2].value = strchr(auth_request->user, '@');
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1516 if (tab[2].value != NULL)
4295
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1517 tab[2].value = escape_func(tab[2].value+1, auth_request);
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1518 tab[3].value = auth_request->service;
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1519 /* tab[4] = we have no home dir */
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1520 if (auth_request->local_ip.family != 0)
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1521 tab[5].value = net_ip2addr(&auth_request->local_ip);
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1522 if (auth_request->remote_ip.family != 0)
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1523 tab[6].value = net_ip2addr(&auth_request->remote_ip);
3074
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3072
diff changeset
1524 tab[7].value = dec2str(auth_request->client_pid);
4295
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1525 if (auth_request->mech_password != NULL) {
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1526 tab[8].value = escape_func(auth_request->mech_password,
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1527 auth_request);
4fc637010202 Escape SQL strings using sql_escape_string(). Fixes the problems with
Timo Sirainen <tss@iki.fi>
parents: 4168
diff changeset
1528 }
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
1529 if (auth_request->userdb_lookup) {
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
1530 tab[9].value = auth_request->userdb == NULL ? "" :
10897
52eb8317514f auth: Cleaned up struct auth_passdb/auth_userdb.
Timo Sirainen <tss@iki.fi>
parents: 10893
diff changeset
1531 dec2str(auth_request->userdb->userdb->id);
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
1532 } else {
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
1533 tab[9].value = auth_request->passdb == NULL ? "" :
10897
52eb8317514f auth: Cleaned up struct auth_passdb/auth_userdb.
Timo Sirainen <tss@iki.fi>
parents: 10893
diff changeset
1534 dec2str(auth_request->passdb->passdb->id);
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4914
diff changeset
1535 }
8111
d49bdda63506 auth: %m variable didn't work with blocking passdbs
Timo Sirainen <tss@iki.fi>
parents: 7919
diff changeset
1536 tab[10].value = auth_request->mech_name == NULL ? "" :
d49bdda63506 auth: %m variable didn't work with blocking passdbs
Timo Sirainen <tss@iki.fi>
parents: 7919
diff changeset
1537 auth_request->mech_name;
5260
0d72eb2ed8af Added %c variable which expands to "secured" with SSL/TLS/localhost.
Timo Sirainen <tss@iki.fi>
parents: 5251
diff changeset
1538 tab[11].value = auth_request->secured ? "secured" : "";
5882
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
1539 tab[12].value = dec2str(auth_request->local_port);
40ce533c88f9 Send local/remote ports to dovecot-auth. They're now in %a and %b variables.
Timo Sirainen <tss@iki.fi>
parents: 5879
diff changeset
1540 tab[13].value = dec2str(auth_request->remote_port);
8320
d49aa6720fb2 Added %k variable to display valid-client-cert status. It expands to "valid" or empty.
Timo Sirainen <tss@iki.fi>
parents: 8163
diff changeset
1541 tab[14].value = auth_request->valid_client_cert ? "valid" : "";
11466
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1542
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1543 if (auth_request->requested_login_user != NULL) {
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1544 const char *login_user = auth_request->requested_login_user;
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1545
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1546 tab[15].value = escape_func(login_user, auth_request);
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1547 tab[16].value = escape_func(t_strcut(login_user, '@'),
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1548 auth_request);
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1549 tab[17].value = strchr(login_user, '@');
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1550 if (tab[17].value != NULL) {
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1551 tab[17].value = escape_func(tab[17].value+1,
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1552 auth_request);
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1553 }
5ae4a5c14f5b auth: Added %{login_user}, %{login_username} and %{login_domain} variables that are set for master logins.
Timo Sirainen <tss@iki.fi>
parents: 11456
diff changeset
1554 }
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1555 return tab;
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1556 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1557
10585
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1558 static void get_log_prefix(string_t *str, struct auth_request *auth_request,
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1559 const char *subsystem)
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1560 {
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1561 #define MAX_LOG_USERNAME_LEN 64
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1562 const char *ip;
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1563
3069
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1564 str_append(str, subsystem);
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1565 str_append_c(str, '(');
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1566
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1567 if (auth_request->user == NULL)
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1568 str_append(str, "?");
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1569 else {
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1570 str_sanitize_append(str, auth_request->user,
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1571 MAX_LOG_USERNAME_LEN);
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1572 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1573
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1574 ip = net_ip2addr(&auth_request->remote_ip);
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1575 if (ip != NULL) {
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1576 str_append_c(str, ',');
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1577 str_append(str, ip);
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1578 }
4030
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
1579 if (auth_request->requested_login_user != NULL)
faf83f3e19b5 Added support for "master users" who can log in as other people. Currently works only with SASL PLAIN authentication by giving it authorization ID string.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4017
diff changeset
1580 str_append(str, ",master");
3069
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1581 str_append(str, "): ");
10585
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1582 }
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1583
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1584 static const char * ATTR_FORMAT(3, 0)
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1585 get_log_str(struct auth_request *auth_request, const char *subsystem,
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1586 const char *format, va_list va)
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1587 {
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1588 string_t *str;
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1589
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1590 str = t_str_new(128);
941511db13c3 Added auth_verbose_passwords = no|plain|sha1.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
1591 get_log_prefix(str, auth_request, subsystem);
3069
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1592 str_vprintfa(str, format, va);
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1593 return str_c(str);
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1594 }
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1595
3069
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1596 void auth_request_log_debug(struct auth_request *auth_request,
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1597 const char *subsystem,
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1598 const char *format, ...)
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1599 {
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1600 va_list va;
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1601
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
1602 if (!auth_request->set->debug)
3069
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1603 return;
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1604
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1605 va_start(va, format);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7123
diff changeset
1606 T_BEGIN {
10082
62b37dcf173e Log debug-level messages with i_debug().
Pascal Volk <user@localhost.localdomain.org>
parents: 9477
diff changeset
1607 i_debug("%s", get_log_str(auth_request, subsystem, format, va));
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7123
diff changeset
1608 } T_END;
3069
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1609 va_end(va);
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1610 }
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1611
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1612 void auth_request_log_info(struct auth_request *auth_request,
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1613 const char *subsystem,
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1614 const char *format, ...)
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1615 {
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1616 va_list va;
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1617
10903
6e639833c3fc auth: Initial support for per-protocol auth settings.
Timo Sirainen <tss@iki.fi>
parents: 10897
diff changeset
1618 if (!auth_request->set->verbose)
3069
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1619 return;
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1620
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1621 va_start(va, format);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7123
diff changeset
1622 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6855
diff changeset
1623 i_info("%s", get_log_str(auth_request, subsystem, format, va));
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7123
diff changeset
1624 } T_END;
3069
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1625 va_end(va);
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1626 }
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1627
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1628 void auth_request_log_error(struct auth_request *auth_request,
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1629 const char *subsystem,
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1630 const char *format, ...)
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1631 {
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1632 va_list va;
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1633
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1634 va_start(va, format);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7123
diff changeset
1635 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6855
diff changeset
1636 i_error("%s", get_log_str(auth_request, subsystem, format, va));
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7123
diff changeset
1637 } T_END;
3069
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1638 va_end(va);
131151e25e4b Added auth_request_log_*().
Timo Sirainen <tss@iki.fi>
parents: 3068
diff changeset
1639 }
10757
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
1640
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
1641 void auth_request_refresh_last_access(struct auth_request *request)
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
1642 {
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
1643 request->last_access = ioloop_time;
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
1644 if (request->to_abort != NULL)
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
1645 timeout_reset(request->to_abort);
d3697efd18f3 auth: Don't loop through active requests every 5 seconds, looking for timeouts.
Timo Sirainen <tss@iki.fi>
parents: 10689
diff changeset
1646 }