GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/ldapd/matching.c Lines: 8 9 88.9 %
Date: 2017-11-07 Branches: 7 10 70.0 %

Line Branch Exec Source
1
/*	$OpenBSD: matching.c,v 1.2 2010/11/04 15:35:00 martinh Exp $ */
2
3
/*
4
 * Copyright (c) 2010 Martin Hedenfalk <martinh@openbsd.org>
5
 *
6
 * Permission to use, copy, modify, and distribute this software for any
7
 * purpose with or without fee is hereby granted, provided that the above
8
 * copyright notice and this permission notice appear in all copies.
9
 *
10
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 */
18
19
#include <sys/types.h>
20
#include <sys/queue.h>
21
#include <sys/tree.h>
22
23
#include <stdio.h>
24
#include <stdlib.h>
25
#include <string.h>
26
27
#include "schema.h"
28
29
#ifndef nitems
30
# define nitems(_a)	 (sizeof((_a)) / sizeof((_a)[0]))
31
#endif
32
33
static const char *ia5string_syntaxes[] = {
34
	"1.3.6.1.4.1.1466.115.121.1.26",
35
	NULL
36
};
37
38
static const char *dir_string_syntaxes[] = {
39
	"1.3.6.1.4.1.1466.115.121.1.15",
40
	"1.3.6.1.4.1.1466.115.121.1.44",
41
	"1.3.6.1.4.1.1466.115.121.1.11",
42
	"1.3.6.1.4.1.1466.115.121.1.50",
43
	"1.3.6.1.4.1.1466.115.121.1.26",
44
	NULL
45
};
46
47
static const char *num_string_syntaxes[] = {
48
	"1.3.6.1.4.1.1466.115.121.1.36",
49
	NULL
50
};
51
52
static const char *telephone_syntaxes[] = {
53
	"1.3.6.1.4.1.1466.115.121.1.50",
54
	NULL
55
};
56
57
static const char *dir_string_sequence_syntaxes[] = {
58
	"1.3.6.1.4.1.1466.115.121.1.41",
59
	NULL
60
};
61
62
static const char *int_first_component_syntaxes[] = {
63
	"1.3.6.1.4.1.1466.115.121.1.17",
64
	NULL
65
};
66
67
static const char *oid_first_component_syntaxes[] = {
68
	"1.3.6.1.4.1.1466.115.121.1.3",
69
	"1.3.6.1.4.1.1466.115.121.1.16",
70
	"1.3.6.1.4.1.1466.115.121.1.54",
71
	"1.3.6.1.4.1.1466.115.121.1.30",
72
	"1.3.6.1.4.1.1466.115.121.1.31",
73
	"1.3.6.1.4.1.1466.115.121.1.35",
74
	"1.3.6.1.4.1.1466.115.121.1.37",
75
	NULL
76
};
77
78
struct match_rule match_rules[] = {
79
80
	{ "1.3.6.1.1.16.2", "uuidMatch", MATCH_EQUALITY, NULL, "1.3.6.1.1.16.1", NULL },
81
	{ "1.3.6.1.1.16.3", "uuidOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.1.16.1", NULL },
82
	{ "1.3.6.1.4.1.1466.109.114.1", "caseExactIA5Match", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.26", ia5string_syntaxes },
83
	{ "1.3.6.1.4.1.1466.109.114.2", "caseIgnoreIA5Match", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.26", ia5string_syntaxes },
84
	{ "1.3.6.1.4.1.1466.109.114.3", "caseIgnoreIA5SubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", ia5string_syntaxes },
85
	{ "2.5.13.0", "objectIdentifierMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.38", NULL },
86
	{ "2.5.13.1", "distinguishedNameMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.12", NULL },
87
	{ "2.5.13.10", "numericStringSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", num_string_syntaxes },
88
	{ "2.5.13.11", "caseIgnoreListMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.41", NULL },
89
	{ "2.5.13.12", "caseIgnoreListSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", dir_string_sequence_syntaxes },
90
	{ "2.5.13.13", "booleanMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.7", NULL },
91
	{ "2.5.13.14", "integerMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.27", NULL },
92
	{ "2.5.13.15", "integerOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.27", NULL },
93
	{ "2.5.13.16", "bitStringMatch", MATCH_EQUALITY,  NULL, "1.3.6.1.4.1.1466.115.121.1.6", NULL },
94
	{ "2.5.13.17", "octetStringMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.40", NULL },
95
	{ "2.5.13.18", "octetStringOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.40", NULL },
96
	{ "2.5.13.2", "caseIgnoreMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.15", dir_string_syntaxes },
97
	{ "2.5.13.20", "telephoneNumberMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.50", NULL },
98
	{ "2.5.13.21", "telephoneNumberSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", telephone_syntaxes },
99
	{ "2.5.13.23", "uniqueMemberMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.34", NULL },
100
	{ "2.5.13.27", "generalizedTimeMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.24", NULL },
101
	{ "2.5.13.28", "generalizedTimeOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.24", NULL },
102
	{ "2.5.13.29", "integerFirstComponentMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.27", int_first_component_syntaxes },
103
	{ "2.5.13.3", "caseIgnoreOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.15", dir_string_syntaxes },
104
	{ "2.5.13.30", "objectIdentifierFirstComponentMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.38", oid_first_component_syntaxes },
105
	{ "2.5.13.31", "directoryStringFirstComponentMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.15", NULL },
106
	{ "2.5.13.4", "caseIgnoreSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", dir_string_syntaxes },
107
	{ "2.5.13.5", "caseExactMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.15", NULL },
108
	{ "2.5.13.6", "caseExactOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.15", NULL },
109
	{ "2.5.13.7", "caseExactSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", dir_string_syntaxes },
110
	{ "2.5.13.8", "numericStringMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.36", NULL },
111
	{ "2.5.13.9", "numericStringOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.36", NULL },
112
113
#if 0
114
	{ "2.5.13.32", "wordMatch", "1.3.6.1.4.1.1466.115.121.1.15", MATCH_EQUALITY, NULL },
115
	{ "2.5.13.33", "keywordMatch", "1.3.6.1.4.1.1466.115.121.1.15", MATCH_EQUALITY, NULL },
116
#endif
117
};
118
119
int num_match_rules = nitems(match_rules);
120
121
static struct match_rule_alias {
122
	char	*name;
123
	char	*oid;
124
} aliases[] = {
125
	{ "caseExactIA5SubstringsMatch", "caseExactSubstringsMatch" },
126
};
127
128
const struct match_rule *
129
match_rule_lookup(const char *oid_or_name)
130
{
131
	unsigned int		 i;
132
133
264384
	for (i = 0; i < nitems(match_rules); i++) {
134

249456
		if (strcasecmp(oid_or_name, match_rules[i].name) == 0 ||
135
121104
		    strcmp(oid_or_name, match_rules[i].oid) == 0)
136
7248
			return &match_rules[i];
137
	}
138
139
288
	for (i = 0; i < nitems(aliases); i++) {
140
144
		if (strcasecmp(oid_or_name, aliases[i].name) == 0)
141
144
			return match_rule_lookup(aliases[i].oid);
142
	}
143
144
	return NULL;
145
7392
}
146