1178825Sdfr/*
2233294Sstas * Copyright (c) 2004 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
5178825Sdfr *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
9178825Sdfr *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
12178825Sdfr *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
16178825Sdfr *
17178825Sdfr * 3. Neither the name of KTH nor the names of its contributors may be
18178825Sdfr *    used to endorse or promote products derived from this software without
19178825Sdfr *    specific prior written permission.
20178825Sdfr *
21178825Sdfr * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
22178825Sdfr * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23178825Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24178825Sdfr * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
25178825Sdfr * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26178825Sdfr * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27178825Sdfr * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28178825Sdfr * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29178825Sdfr * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30178825Sdfr * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31178825Sdfr * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32178825Sdfr
33178825Sdfr#include "krb5_locl.h"
34178825Sdfr#include <err.h>
35178825Sdfr
36178825Sdfr#define RETVAL(c, r, e, s) \
37178825Sdfr	do { if (r != e) krb5_errx(c, 1, "%s", s); } while (0)
38178825Sdfr#define STRINGMATCH(c, s, _s1, _s2) \
39178825Sdfr	do {							\
40178825Sdfr		if (_s1 == NULL || _s2 == NULL) 		\
41178825Sdfr			krb5_errx(c, 1, "s1 or s2 is NULL");	\
42178825Sdfr		if (strcmp(_s1,_s2) != 0) 			\
43178825Sdfr			krb5_errx(c, 1, "%s", s);		\
44178825Sdfr	} while (0)
45178825Sdfr
46178825Sdfrstatic void
47178825Sdfrtest_match_string(krb5_context context)
48178825Sdfr{
49178825Sdfr    krb5_error_code ret;
50178825Sdfr    char *s1, *s2;
51178825Sdfr
52178825Sdfr    ret = krb5_acl_match_string(context, "foo", "s", "foo");
53178825Sdfr    RETVAL(context, ret, 0, "single s");
54178825Sdfr    ret = krb5_acl_match_string(context, "foo foo", "s", "foo");
55178825Sdfr    RETVAL(context, ret, EACCES, "too many strings");
56178825Sdfr    ret = krb5_acl_match_string(context, "foo bar", "ss", "foo", "bar");
57178825Sdfr    RETVAL(context, ret, 0, "two strings");
58178825Sdfr    ret = krb5_acl_match_string(context, "foo  bar", "ss", "foo", "bar");
59178825Sdfr    RETVAL(context, ret, 0, "two strings double space");
60178825Sdfr    ret = krb5_acl_match_string(context, "foo \tbar", "ss", "foo", "bar");
61178825Sdfr    RETVAL(context, ret, 0, "two strings space + tab");
62178825Sdfr    ret = krb5_acl_match_string(context, "foo", "ss", "foo", "bar");
63178825Sdfr    RETVAL(context, ret, EACCES, "one string, two format strings");
64178825Sdfr    ret = krb5_acl_match_string(context, "foo", "ss", "foo", "foo");
65178825Sdfr    RETVAL(context, ret, EACCES, "one string, two format strings (same)");
66178825Sdfr    ret = krb5_acl_match_string(context, "foo  \t", "s", "foo");
67178825Sdfr    RETVAL(context, ret, 0, "ending space");
68178825Sdfr
69178825Sdfr    ret = krb5_acl_match_string(context, "foo/bar", "f", "foo/bar");
70178825Sdfr    RETVAL(context, ret, 0, "liternal fnmatch");
71178825Sdfr    ret = krb5_acl_match_string(context, "foo/bar", "f", "foo/*");
72178825Sdfr    RETVAL(context, ret, 0, "foo/*");
73233294Sstas    ret = krb5_acl_match_string(context, "foo/bar.example.org", "f",
74233294Sstas				"foo/*.example.org");
75233294Sstas    RETVAL(context, ret, 0, "foo/*.example.org");
76233294Sstas    ret = krb5_acl_match_string(context, "foo/bar.example.com", "f",
77233294Sstas				"foo/*.example.org");
78233294Sstas    RETVAL(context, ret, EACCES, "foo/*.example.com");
79233294Sstas
80178825Sdfr    ret = krb5_acl_match_string(context, "foo/bar/baz", "f", "foo/*/baz");
81178825Sdfr    RETVAL(context, ret, 0, "foo/*/baz");
82178825Sdfr
83178825Sdfr    ret = krb5_acl_match_string(context, "foo", "r", &s1);
84178825Sdfr    RETVAL(context, ret, 0, "ret 1");
85178825Sdfr    STRINGMATCH(context, "ret 1 match", s1, "foo"); free(s1);
86178825Sdfr
87178825Sdfr    ret = krb5_acl_match_string(context, "foo bar", "rr", &s1, &s2);
88178825Sdfr    RETVAL(context, ret, 0, "ret 2");
89178825Sdfr    STRINGMATCH(context, "ret 2 match 1", s1, "foo"); free(s1);
90178825Sdfr    STRINGMATCH(context, "ret 2 match 2", s2, "bar"); free(s2);
91178825Sdfr
92178825Sdfr    ret = krb5_acl_match_string(context, "foo bar", "sr", "bar", &s1);
93178825Sdfr    RETVAL(context, ret, EACCES, "ret mismatch");
94178825Sdfr    if (s1 != NULL) krb5_errx(context, 1, "s1 not NULL");
95178825Sdfr
96178825Sdfr    ret = krb5_acl_match_string(context, "foo", "l", "foo");
97178825Sdfr    RETVAL(context, ret, EINVAL, "unknown letter");
98178825Sdfr}
99178825Sdfr
100178825Sdfr
101178825Sdfrint
102178825Sdfrmain(int argc, char **argv)
103178825Sdfr{
104178825Sdfr    krb5_context context;
105178825Sdfr    krb5_error_code ret;
106178825Sdfr
107178825Sdfr    setprogname(argv[0]);
108178825Sdfr
109178825Sdfr    ret = krb5_init_context(&context);
110178825Sdfr    if (ret)
111178825Sdfr	errx (1, "krb5_init_context failed: %d", ret);
112178825Sdfr
113178825Sdfr    test_match_string(context);
114178825Sdfr
115178825Sdfr    krb5_free_context(context);
116178825Sdfr
117178825Sdfr    return 0;
118178825Sdfr}
119