Annotation of embedaddon/strongswan/src/libpttls/sasl/sasl_mechanism.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2013 Martin Willi
! 3: * Copyright (C) 2013 revosec AG
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: #include "sasl_mechanism.h"
! 17:
! 18: #include "sasl_plain/sasl_plain.h"
! 19:
! 20: /**
! 21: * Available SASL mechanisms.
! 22: */
! 23: static struct {
! 24: char *name;
! 25: bool server;
! 26: sasl_mechanism_constructor_t create;
! 27: } mechs[] = {
! 28: { "PLAIN", TRUE, (sasl_mechanism_constructor_t)sasl_plain_create },
! 29: { "PLAIN", FALSE, (sasl_mechanism_constructor_t)sasl_plain_create },
! 30: };
! 31:
! 32: /**
! 33: * See header.
! 34: */
! 35: sasl_mechanism_t *sasl_mechanism_create(char *name, identification_t *client)
! 36: {
! 37: int i;
! 38:
! 39: for (i = 0; i < countof(mechs); i++)
! 40: {
! 41: if (streq(mechs[i].name, name) && mechs[i].server == (client == NULL))
! 42: {
! 43: return mechs[i].create(name, client);
! 44: }
! 45: }
! 46: return NULL;
! 47: }
! 48:
! 49: /**
! 50: * SASL mechanism enumerator
! 51: */
! 52: typedef struct {
! 53: /** implements enumerator_t */
! 54: enumerator_t public;
! 55: /** looking for client or server? */
! 56: bool server;
! 57: /** position in mechs[] */
! 58: int i;
! 59: } mech_enumerator_t;
! 60:
! 61: METHOD(enumerator_t, mech_enumerate, bool,
! 62: mech_enumerator_t *this, va_list args)
! 63: {
! 64: char **name;
! 65:
! 66: VA_ARGS_VGET(args, name);
! 67: while (this->i < countof(mechs))
! 68: {
! 69: if (mechs[this->i].server == this->server)
! 70: {
! 71: *name = mechs[this->i].name;
! 72: this->i++;
! 73: return TRUE;
! 74: }
! 75: this->i++;
! 76: }
! 77: return FALSE;
! 78: }
! 79:
! 80: /**
! 81: * See header.
! 82: */
! 83: enumerator_t* sasl_mechanism_create_enumerator(bool server)
! 84: {
! 85: mech_enumerator_t *enumerator;
! 86:
! 87: INIT(enumerator,
! 88: .public = {
! 89: .enumerate = enumerator_enumerate_default,
! 90: .venumerate = _mech_enumerate,
! 91: .destroy = (void*)free,
! 92: },
! 93: .server = server,
! 94: );
! 95: return &enumerator->public;
! 96: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>