Path: blob/main/crypto/krb5/src/plugins/hostrealm/test/main.c
34890 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/* plugins/hostrealm/test/main.c - test module for host-realm interface */2/*3* Copyright (C) 2010,2013 by the Massachusetts Institute of Technology.4* All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9*10* * Redistributions of source code must retain the above copyright11* notice, this list of conditions and the following disclaimer.12*13* * Redistributions in binary form must reproduce the above copyright14* notice, this list of conditions and the following disclaimer in15* the documentation and/or other materials provided with the16* distribution.17*18* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS19* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT20* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS21* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE22* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,23* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES24* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR25* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)26* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,27* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)28* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED29* OF THE POSSIBILITY OF SUCH DAMAGE.30*/3132/*33* This file implements two hostrealm modules named "test1" and "test2".34*35* The first module returns multi-element lists. For host_realm and36* fallback_realm, it returns a list of the host's components in order. For37* default_realm, it returns a list containing "one" and "two".38*39* The second module tests error handling. For host_realm and fallback_realm,40* it returns a fatal error on hosts beginning with 'z', a list containing "a"41* for hosts beginning with 'a', and passes control to later modules otherwise.42* For default_realm, it returns a fatal error.43*/4445#include <k5-int.h>46#include <krb5/hostrealm_plugin.h>47#include <sys/types.h>48#include <sys/stat.h>49#include <fcntl.h>50#include <unistd.h>5152static krb5_error_code53split_comps(krb5_context context, krb5_hostrealm_moddata data,54const char *host, char ***realms_out)55{56krb5_error_code ret;57const char *p, *q;58char *word = NULL, **list = NULL, **newptr;59size_t count = 0;6061*realms_out = NULL;62if (*host == '\0')63return KRB5_PLUGIN_NO_HANDLE;64p = host;65while (TRUE) {66q = strchr(p, '.');67word = (q == NULL) ? strdup(p) : k5memdup0(p, q - p, &ret);68if (word == NULL)69goto oom;70newptr = realloc(list, (count + 2) * sizeof(*list));71if (newptr == NULL)72goto oom;73list = newptr;74list[count++] = word;75list[count] = NULL;76word = NULL;77if (q == NULL)78break;79p = q + 1;80}81*realms_out = list;82return 0;8384oom:85krb5_free_host_realm(context, list);86free(word);87return ENOMEM;88}8990static krb5_error_code91multi_defrealm(krb5_context context, krb5_hostrealm_moddata data,92char ***realms_out)93{94char **list = NULL, *one = NULL, *two = NULL;9596*realms_out = NULL;97one = strdup("one");98if (one == NULL)99goto oom;100two = strdup("two");101if (two == NULL)102goto oom;103list = calloc(3, sizeof(*list));104if (list == NULL)105goto oom;106list[0] = one;107list[1] = two;108list[2] = NULL;109*realms_out = list;110return 0;111112oom:113free(one);114free(two);115free(list);116return ENOMEM;117}118119static krb5_error_code120maybe_realm(krb5_context context, krb5_hostrealm_moddata data,121const char *host, char ***realms_out)122{123char **list, *a;124125*realms_out = NULL;126if (*host == 'z')127return KRB5_ERR_NO_SERVICE;128if (*host != 'a')129return KRB5_PLUGIN_NO_HANDLE;130a = strdup("a");131if (a == NULL)132return ENOMEM;133list = calloc(2, sizeof(*list));134if (list == NULL) {135free(a);136return ENOMEM;137}138list[0] = a;139list[1] = NULL;140*realms_out = list;141return 0;142}143144static krb5_error_code145error(krb5_context context, krb5_hostrealm_moddata data, char ***realms_out)146{147*realms_out = NULL;148return KRB5_ERR_NO_SERVICE;149}150151static void152free_realmlist(krb5_context context, krb5_hostrealm_moddata data,153char **list)154{155krb5_free_host_realm(context, list);156}157158krb5_error_code159hostrealm_test1_initvt(krb5_context context, int maj_ver, int min_ver,160krb5_plugin_vtable vtable);161krb5_error_code162hostrealm_test2_initvt(krb5_context context, int maj_ver, int min_ver,163krb5_plugin_vtable vtable);164165krb5_error_code166hostrealm_test1_initvt(krb5_context context, int maj_ver, int min_ver,167krb5_plugin_vtable vtable)168{169krb5_hostrealm_vtable vt;170171if (maj_ver != 1)172return KRB5_PLUGIN_VER_NOTSUPP;173vt = (krb5_hostrealm_vtable)vtable;174vt->name = "test1";175vt->host_realm = split_comps;176vt->fallback_realm = split_comps;177vt->default_realm = multi_defrealm;178vt->free_list = free_realmlist;179return 0;180}181182krb5_error_code183hostrealm_test2_initvt(krb5_context context, int maj_ver, int min_ver,184krb5_plugin_vtable vtable)185{186krb5_hostrealm_vtable vt;187188if (maj_ver != 1)189return KRB5_PLUGIN_VER_NOTSUPP;190vt = (krb5_hostrealm_vtable)vtable;191vt->name = "test2";192vt->host_realm = maybe_realm;193vt->default_realm = error;194vt->free_list = free_realmlist;195return 0;196}197198199