/src/dovecot/src/lib-sasl/sasl-server.c
Line | Count | Source |
1 | | /* Copyright (c) Dovecot authors, see top-level COPYING file */ |
2 | | |
3 | | #include "lib.h" |
4 | | #include "llist.h" |
5 | | |
6 | | #include "sasl-server-private.h" |
7 | | |
8 | | struct event_category event_category_sasl_server = { |
9 | | .name = "sasl-server" |
10 | | }; |
11 | | |
12 | | /* |
13 | | * Instance |
14 | | */ |
15 | | |
16 | | struct sasl_server_instance * |
17 | | sasl_server_instance_create(struct sasl_server *server, |
18 | | const struct sasl_server_settings *set) |
19 | 7.09k | { |
20 | 7.09k | struct sasl_server_instance *sinst; |
21 | 7.09k | pool_t pool; |
22 | | |
23 | 7.09k | pool = pool_alloconly_create( |
24 | 7.09k | MEMPOOL_GROWING"sasl_server_instance", 2048); |
25 | 7.09k | sinst = p_new(pool, struct sasl_server_instance, 1); |
26 | 7.09k | sinst->pool = pool; |
27 | 7.09k | sinst->refcount = 1; |
28 | 7.09k | sinst->server = server; |
29 | | |
30 | 7.09k | sinst->set = *set; |
31 | 7.09k | if (set->realms != NULL) |
32 | 0 | sinst->set.realms = p_strarray_dup(pool, set->realms); |
33 | | |
34 | 7.09k | if (set->event_parent == NULL) |
35 | 7.09k | sinst->event = event_create(server->event); |
36 | 0 | else { |
37 | 0 | sinst->event = event_create(set->event_parent); |
38 | 0 | event_add_category(sinst->event, &event_category_sasl_server); |
39 | 0 | event_set_append_log_prefix(sinst->event, "sasl: "); |
40 | 0 | } |
41 | | |
42 | 7.09k | DLLIST_PREPEND(&server->instances, sinst); |
43 | | |
44 | 7.09k | return sinst; |
45 | 7.09k | } |
46 | | |
47 | | void sasl_server_instance_ref(struct sasl_server_instance *sinst) |
48 | 0 | { |
49 | 0 | i_assert(sinst->refcount > 0); |
50 | 0 | sinst->refcount++; |
51 | 0 | } |
52 | | |
53 | | void sasl_server_instance_unref(struct sasl_server_instance **_sinst) |
54 | 7.09k | { |
55 | 7.09k | struct sasl_server_instance *sinst = *_sinst; |
56 | | |
57 | 7.09k | if (sinst == NULL) |
58 | 0 | return; |
59 | 7.09k | *_sinst = NULL; |
60 | | |
61 | 7.09k | i_assert(sinst->refcount > 0); |
62 | 7.09k | if (--sinst->refcount > 0) |
63 | 0 | return; |
64 | | |
65 | 7.09k | struct sasl_server *server = sinst->server; |
66 | | |
67 | 7.09k | i_assert(sinst->requests == 0); |
68 | | |
69 | 7.09k | sasl_server_instance_mech_registry_free(sinst); |
70 | | |
71 | 7.09k | DLLIST_REMOVE(&server->instances, sinst); |
72 | | |
73 | 7.09k | event_unref(&sinst->event); |
74 | 7.09k | pool_unref(&sinst->pool); |
75 | 7.09k | } |
76 | | |
77 | | /* |
78 | | * Server |
79 | | */ |
80 | | |
81 | | struct sasl_server * |
82 | | sasl_server_init(struct event *event_parent, |
83 | | const struct sasl_server_request_funcs *funcs) |
84 | 7.09k | { |
85 | 7.09k | struct sasl_server *server; |
86 | 7.09k | pool_t pool; |
87 | | |
88 | 7.09k | pool = pool_alloconly_create(MEMPOOL_GROWING"sasl_server", 2048); |
89 | 7.09k | server = p_new(pool, struct sasl_server, 1); |
90 | 7.09k | server->pool = pool; |
91 | | |
92 | 7.09k | server->funcs = funcs; |
93 | | |
94 | 7.09k | server->event = event_create(event_parent); |
95 | 7.09k | event_add_category(server->event, &event_category_sasl_server); |
96 | 7.09k | event_set_append_log_prefix(server->event, "sasl: "); |
97 | | |
98 | 7.09k | return server; |
99 | 7.09k | } |
100 | | |
101 | | void sasl_server_deinit(struct sasl_server **_server) |
102 | 7.09k | { |
103 | 7.09k | struct sasl_server *server = *_server; |
104 | | |
105 | 7.09k | if (server == NULL) |
106 | 0 | return; |
107 | 7.09k | *_server = NULL; |
108 | | |
109 | 7.09k | i_assert(server->instances == NULL); |
110 | 7.09k | i_assert(server->requests == 0); |
111 | | |
112 | 7.09k | sasl_server_mech_registry_free(server); |
113 | | |
114 | 7.09k | event_unref(&server->event); |
115 | 7.09k | pool_unref(&server->pool); |
116 | 7.09k | } |