156 #define STR(s) vstring_str(s)
172 msg_panic(
"smtpd_sasl_initialize: repeated call");
179 msg_fatal(
"SASL per-process initialization failed");
186 const char *sasl_opts_val)
188 const char *mechanism_list;
196 msg_panic(
"smtpd_sasl_activate: already active");
205 state->sasl_mechanism_list = 0;
211 tls_flag = state->tls_context != 0;
215 #define ADDR_OR_EMPTY(addr, unknown) (strcmp(addr, unknown) ? addr : "")
216 #define REALM_OR_NULL(realm) (*(realm) ? (realm) : (char *) 0)
218 if ((state->sasl_server =
222 server_addr = ADDR_OR_EMPTY(state->
dest_addr,
224 server_port = ADDR_OR_EMPTY(state->
dest_port,
226 client_addr = ADDR_OR_EMPTY(state->
addr,
228 client_port = ADDR_OR_EMPTY(state->
port,
232 security_options = sasl_opts_val,
233 tls_flag = tls_flag)) == 0)
234 msg_fatal(
"SASL per-connection initialization failed");
239 if ((mechanism_list =
241 msg_fatal(
"no SASL authentication mechanisms");
242 state->sasl_mechanism_list =
mystrdup(mechanism_list);
250 state->sasl_username = 0;
251 state->sasl_method = 0;
252 state->sasl_sender = 0;
259 if (state->sasl_reply) {
261 state->sasl_reply = 0;
263 if (state->sasl_mechanism_list) {
264 myfree(state->sasl_mechanism_list);
265 state->sasl_mechanism_list = 0;
267 if (state->sasl_username) {
268 myfree(state->sasl_username);
269 state->sasl_username = 0;
271 if (state->sasl_method) {
272 myfree(state->sasl_method);
273 state->sasl_method = 0;
275 if (state->sasl_sender) {
276 myfree(state->sasl_sender);
277 state->sasl_sender = 0;
279 if (state->sasl_server) {
281 state->sasl_server = 0;
288 const char *sasl_method,
289 const char *init_response)
292 const char *sasl_username;
299 init_response, state->sasl_reply);
302 state->sasl_reply)) {
317 if (strcmp(
STR(state->
buffer),
"*") == 0) {
318 msg_warn(
"%s: SASL %s authentication aborted",
325 msg_warn(
"%s: SASL %s authentication failed: %s",
327 STR(state->sasl_reply));
331 STR(state->sasl_reply));
334 STR(state->sasl_reply));
340 msg_panic(
"cannot look up the authenticated SASL username");
341 state->sasl_username =
mystrdup(sasl_username);
343 state->sasl_method =
mystrdup(sasl_method);
353 if (state->sasl_username) {
354 myfree(state->sasl_username);
355 state->sasl_username = 0;
357 if (state->sasl_method) {
358 myfree(state->sasl_method);
359 state->sasl_method = 0;
366 const char *sasl_method)
368 if (state->sasl_username)
369 myfree(state->sasl_username);
370 state->sasl_username =
mystrdup(sasl_username);
371 if (state->sasl_method)
372 myfree(state->sasl_method);
373 state->sasl_method =
mystrdup(sasl_method);
char * var_smtpd_sasl_path
#define xsasl_server_get_username(server)
void smtpd_sasl_initialize(void)
char * mystrdup(const char *str)
NORETURN msg_panic(const char *fmt,...)
#define xsasl_server_free(server)
#define smtpd_sasl_is_active(s)
#define SERVER_PORT_UNKNOWN
#define SERVER_ADDR_UNKNOWN
#define xsasl_server_get_mechanism_list(server)
void smtpd_sasl_deactivate(SMTPD_STATE *)
void smtpd_sasl_state_init(SMTPD_STATE *)
int smtpd_sasl_authenticate(SMTPD_STATE *, const char *, const char *)
void smtpd_sasl_logout(SMTPD_STATE *)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
XSASL_SERVER_IMPL * xsasl_server_init(const char *, const char *)
void smtpd_chat_reply(SMTPD_STATE *state, const char *format,...)
#define xsasl_server_next(server, request, reply)
NORETURN msg_fatal(const char *fmt,...)
void smtpd_chat_query(SMTPD_STATE *state)
#define CLIENT_ADDR_UNKNOWN
char * var_smtpd_sasl_type
VSTRING * vstring_free(VSTRING *vp)
#define XSASL_SERVER_CREATE(impl, args, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
char * printable(char *string, int replacement)
void smtpd_sasl_activate(SMTPD_STATE *, const char *, const char *)
#define CLIENT_PORT_UNKNOWN
#define xsasl_server_first(server, method, init_resp, reply)
void smtpd_sasl_login(SMTPD_STATE *, const char *, const char *)
char * var_smtpd_sasl_realm
char * var_smtpd_sasl_service