mech-external.c revision a669d351502e15802b121e1a0bd83f27d1d95f01
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include "lib.h"
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include "dsasl-client-private.h"
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstruct external_dsasl_client {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct dsasl_client client;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen bool output_sent;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen};
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic int
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenmech_external_input(struct dsasl_client *_client,
f7423cbbd9dea363a5df18ebb96da055a977ae79Timo Sirainen const unsigned char *input ATTR_UNUSED, size_t input_len,
2cd2518bab14292a67cf8a490b58ab9ef89879daTimo Sirainen const char **error_r)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct external_dsasl_client *client =
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen (struct external_dsasl_client *)_client;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
6ec925f52d04ec8700e47cb005bd7ddc65ac5614Timo Sirainen if (!client->output_sent) {
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen if (input_len > 0) {
4d4d6d4745682790c20d759ba93dbea46b812c5dTimo Sirainen *error_r = "Server sent non-empty initial response";
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return -1;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen } else {
cf2e6953d03a1c22f272ec19432fc03c136ac1bbTimo Sirainen *error_r = "Server didn't finish authentication";
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen return -1;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen return 0;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic int
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainenmech_external_output(struct dsasl_client *_client,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const unsigned char **output_r, size_t *output_len_r,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char **error_r ATTR_UNUSED)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct external_dsasl_client *client =
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen (struct external_dsasl_client *)_client;
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen const char *username;
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen if (_client->set.authzid != NULL)
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen username = _client->set.authzid;
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen else if (_client->set.authid != NULL)
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen username = _client->set.authid;
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen else
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen username = "";
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen *output_r = (const void *)username;
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen *output_len_r = strlen(username);
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen client->output_sent = TRUE;
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen return 0;
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen}
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainenconst struct dsasl_client_mech dsasl_client_mech_external = {
5d4c793b4e3dbc07f08daa4465594b1857f80725Timo Sirainen .name = "EXTERNAL",
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen .struct_size = sizeof(struct external_dsasl_client),
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen .input = mech_external_input,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen .output = mech_external_output
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen};
71056e0f5e1f68cb9ac002a7827eb98435c40d62Timo Sirainen