mirror of
https://git.openafs.org/openafs.git
synced 2025-01-18 15:00:12 +00:00
dcf8af0b22
Change afstest_BuildTestConfig to add the local keys into the generated config dir, unless the info->skipkeys is set. This just makes afstest_BuildTestConfig a little easier to use for the common case of generating a fully-usable config dir with usable keys (only some callers want to skip generating keys in order to test key-populating functionality). Change-Id: I1ce9d062ea30c391a93562fc90bc18997de75383 Reviewed-on: https://gerrit.openafs.org/14835 Tested-by: BuildBot <buildbot@rampaginggeek.com> Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
374 lines
9.6 KiB
C
374 lines
9.6 KiB
C
/*
|
|
* Copyright 2010, Sine Nomine Associates and others.
|
|
* All Rights Reserved.
|
|
*
|
|
* This software has been released under the terms of the IBM Public
|
|
* License. For details, see the LICENSE file in the top-level source
|
|
* directory or online at http://www.openafs.org/dl/license10.html
|
|
*/
|
|
|
|
#include <afsconfig.h>
|
|
#include <afs/param.h>
|
|
|
|
#include <roken.h>
|
|
|
|
#include <rx/rx.h>
|
|
#include <rx/rxkad.h>
|
|
#include <afs/cellconfig.h>
|
|
|
|
#include <tests/tap/basic.h>
|
|
#include "common.h"
|
|
|
|
extern int _afsconf_Touch(struct afsconf_dir *adir);
|
|
|
|
int verbose = 0;
|
|
|
|
#define LOCAL 1
|
|
#define FOREIGN 0
|
|
struct testcase {
|
|
char *name;
|
|
char *inst;
|
|
char *cell;
|
|
int expectedLocal;
|
|
};
|
|
|
|
/*
|
|
* test set 0
|
|
* cell: example.org
|
|
*/
|
|
struct testcase testset0[] = {
|
|
{"jdoe", NULL, NULL, LOCAL},
|
|
{"jdoe", NULL, "example.org", LOCAL},
|
|
{"jdoe", NULL, "EXAMPLE.ORG", LOCAL},
|
|
{"jdoe", NULL, NULL, LOCAL},
|
|
{"jdoe", NULL, "my.realm.org", FOREIGN},
|
|
{"jdoe", NULL, "MY.REALM.ORG", FOREIGN},
|
|
{"jdoe", NULL, "MY.OTHER.REALM.ORG", FOREIGN},
|
|
{"jdoe", "admin", NULL, LOCAL},
|
|
{"jdoe", "admin", "my.realm.org", FOREIGN},
|
|
{"jdoe", "admin", "MY.REALM.ORG", FOREIGN},
|
|
{"jdoe", "admin", "your.realm.org", FOREIGN},
|
|
{"jdoe", "admin", "YOUR.REALM.ORG", FOREIGN},
|
|
{"admin", NULL, "example.org", LOCAL},
|
|
{"admin", NULL, "my.realm.org", FOREIGN},
|
|
{"admin", NULL, "MY.REALM.ORG", FOREIGN},
|
|
{"admin", NULL, "MY.OTHER.REALM.ORG", FOREIGN},
|
|
{NULL},
|
|
};
|
|
|
|
/*
|
|
* test set 1
|
|
* cell: example.org
|
|
* local realms: MY.REALM.ORG, MY.OTHER.REALM.ORG
|
|
*/
|
|
struct testcase testset1[] = {
|
|
{"jdoe", NULL, NULL, LOCAL},
|
|
{"jdoe", NULL, "example.org", LOCAL},
|
|
{"jdoe", NULL, "EXAMPLE.ORG", LOCAL},
|
|
{"jdoe", NULL, NULL, LOCAL},
|
|
{"jdoe", NULL, "my.realm.org", LOCAL},
|
|
{"jdoe", NULL, "MY.REALM.ORG", LOCAL},
|
|
{"jdoe", NULL, "MY.OTHER.REALM.ORG", LOCAL},
|
|
{"jdoe", NULL, "SOME.REALM.ORG", FOREIGN},
|
|
{"jdoe", "admin", NULL, LOCAL},
|
|
{"jdoe", "admin", "my.realm.org", LOCAL},
|
|
{"jdoe", "admin", "MY.REALM.ORG", LOCAL},
|
|
{"jdoe", "admin", "MY.OTHER.REALM.ORG", LOCAL},
|
|
{"jdoe", "admin", "your.realm.org", FOREIGN},
|
|
{"jdoe", "admin", "YOUR.REALM.ORG", FOREIGN},
|
|
{"admin", NULL, "example.org", LOCAL},
|
|
{"admin", NULL, "my.realm.org", LOCAL},
|
|
{"admin", NULL, "MY.REALM.ORG", LOCAL},
|
|
{"admin", NULL, "MY.OTHER.REALM.ORG", LOCAL},
|
|
{NULL},
|
|
};
|
|
|
|
/*
|
|
* test set 2
|
|
* cell: example.org
|
|
* local realms: MY.REALM.ORG, MY.OTHER.REALM.ORG
|
|
* exclude: admin@MY.REALM.ORG
|
|
*/
|
|
struct testcase testset2[] = {
|
|
{"jdoe", NULL, NULL, LOCAL},
|
|
{"jdoe", NULL, "example.org", LOCAL},
|
|
{"jdoe", NULL, "EXAMPLE.ORG", LOCAL},
|
|
{"jdoe", NULL, NULL, LOCAL},
|
|
{"jdoe", NULL, "my.realm.org", LOCAL},
|
|
{"jdoe", NULL, "MY.REALM.ORG", LOCAL},
|
|
{"jdoe", NULL, "MY.OTHER.REALM.ORG", LOCAL},
|
|
{"jdoe", "admin", NULL, LOCAL},
|
|
{"jdoe", "admin", "my.realm.org", LOCAL},
|
|
{"jdoe", "admin", "MY.REALM.ORG", LOCAL},
|
|
{"jdoe", "admin", "MY.OTHER.REALM.ORG", LOCAL},
|
|
{"jdoe", "admin", "your.realm.org", FOREIGN},
|
|
{"jdoe", "admin", "YOUR.REALM.ORG", FOREIGN},
|
|
{"admin", NULL, "example.org", LOCAL},
|
|
{"admin", NULL, "my.realm.org", LOCAL},
|
|
{"admin", NULL, "MY.REALM.ORG", FOREIGN},
|
|
{"admin", NULL, "MY.OTHER.REALM.ORG", LOCAL},
|
|
{NULL},
|
|
};
|
|
|
|
struct testcase* testset[] = { testset0, testset1, testset2 };
|
|
|
|
char *
|
|
make_string(int len)
|
|
{
|
|
char *s = malloc(len + 1);
|
|
if (!s) {
|
|
fprintf(stderr, "Failed to allocate string buffer.\n");
|
|
exit(1);
|
|
}
|
|
memset(s, 'x', len);
|
|
s[len] = '\0';
|
|
return s;
|
|
}
|
|
|
|
void
|
|
run_tests(struct afsconf_dir *dir, int setnum, char *setname)
|
|
{
|
|
struct testcase *t;
|
|
int code;
|
|
|
|
for (t = testset[setnum]; t->name; t++) {
|
|
afs_int32 local = -1;
|
|
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, t->name, t->inst, t->cell);
|
|
ok(code == 0, "%s: test case %s/%s/%s",
|
|
setname,
|
|
t->name ? t->name : "(null)",
|
|
t->inst ? t->inst : "(null)",
|
|
t->cell ? t->cell : "(null)");
|
|
if (code==0) {
|
|
ok(local == t->expectedLocal, "... expected %d, got %d", t->expectedLocal, local);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
run_edge_tests(struct afsconf_dir *dir)
|
|
{
|
|
afs_int32 local = -1;
|
|
int code = 0;
|
|
char *name = "jdoe";
|
|
char *inst = "";
|
|
char *cell = "";
|
|
|
|
/* null argument checks */
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, NULL, inst, cell);
|
|
ok(code == EINVAL, "null name: code=%d", code);
|
|
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, name, NULL, cell);
|
|
ok(code == 0, "null inst: code=%d", code);
|
|
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, name, inst, NULL);
|
|
ok(code == 0, "null cell: code=%d", code);
|
|
|
|
/* large ticket test */
|
|
name = make_string(64);
|
|
inst = make_string(64);
|
|
cell = make_string(64);
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, name, inst, cell);
|
|
ok(code == 0, "name size 64: code=%d", code);
|
|
free(name);
|
|
free(inst);
|
|
free(cell);
|
|
|
|
name = make_string(255);
|
|
inst = NULL;
|
|
cell = "my.realm.org";
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, name, inst, cell);
|
|
ok(code == 0, "name size 255: code=%d", code);
|
|
free(name);
|
|
}
|
|
|
|
void
|
|
write_krb_conf(char *dirname, char *data)
|
|
{
|
|
char *filename = NULL;
|
|
FILE *fp;
|
|
|
|
asnprintf(&filename, 256, "%s/%s", dirname, "krb.conf");
|
|
if ((fp = fopen(filename, "w")) == NULL) {
|
|
fprintf(stderr, "Unable to create test file %s\n", filename);
|
|
exit(1);
|
|
}
|
|
if (verbose) {
|
|
diag("writing to %s: %s", filename, data);
|
|
}
|
|
fprintf(fp, "%s\n", data);
|
|
fclose(fp);
|
|
free(filename);
|
|
}
|
|
|
|
void
|
|
write_krb_excl(char *dirname)
|
|
{
|
|
char *filename = NULL;
|
|
FILE *fp;
|
|
char *data;
|
|
|
|
asnprintf(&filename, 256, "%s/%s", dirname, "krb.excl");
|
|
if ((fp = fopen(filename, "w")) == NULL) {
|
|
fprintf(stderr, "Unable to create test file %s\n", filename);
|
|
exit(1);
|
|
}
|
|
data = "admin@MY.REALM.ORG";
|
|
if (verbose) {
|
|
diag("writing to %s: %s", filename, data);
|
|
}
|
|
fprintf(fp, "%s\n", data);
|
|
data = "admin@EXAMPLE.ORG";
|
|
if (verbose) {
|
|
diag("writing to %s: %s", filename, data);
|
|
}
|
|
fprintf(fp, "%s\n", data);
|
|
fclose(fp);
|
|
free(filename);
|
|
}
|
|
|
|
void
|
|
update_csdb(char *dirname)
|
|
{
|
|
char *filename = NULL;
|
|
FILE *fp;
|
|
|
|
asnprintf(&filename, 256, "%s/%s", dirname, "CellServDB");
|
|
if ((fp = fopen(filename, "a")) == NULL) {
|
|
fprintf(stderr, "Unable to create test file %s\n", filename);
|
|
exit(1);
|
|
}
|
|
fprintf(fp, "10.0.0.1 #bogus.example.org\n");
|
|
fclose(fp);
|
|
free(filename);
|
|
}
|
|
|
|
void
|
|
test_edges(void)
|
|
{
|
|
struct afsconf_dir *dir;
|
|
char *dirname;
|
|
|
|
/* run edge case tests */
|
|
dirname = afstest_BuildTestConfig(NULL);
|
|
dir = afsconf_Open(dirname);
|
|
if (dir == NULL) {
|
|
fprintf(stderr, "Unable to configure directory.\n");
|
|
exit(1);
|
|
}
|
|
run_edge_tests(dir);
|
|
afstest_rmdtemp(dirname);
|
|
}
|
|
|
|
void
|
|
test_no_config_files(void)
|
|
{
|
|
struct afsconf_dir *dir;
|
|
char *dirname;
|
|
|
|
/* run tests without config files */
|
|
dirname = afstest_BuildTestConfig(NULL);
|
|
dir = afsconf_Open(dirname);
|
|
if (dir == NULL) {
|
|
fprintf(stderr, "Unable to configure directory.\n");
|
|
exit(1);
|
|
}
|
|
run_tests(dir, 0, "no config");
|
|
afstest_rmdtemp(dirname);
|
|
}
|
|
|
|
void
|
|
test_with_config_files(void)
|
|
{
|
|
struct afsconf_dir *dir;
|
|
char *dirname;
|
|
|
|
/* run tests with config files */
|
|
dirname = afstest_BuildTestConfig(NULL);
|
|
write_krb_conf(dirname, "MY.REALM.ORG MY.OTHER.REALM.ORG");
|
|
write_krb_excl(dirname);
|
|
dir = afsconf_Open(dirname);
|
|
if (dir == NULL) {
|
|
fprintf(stderr, "Unable to configure directory.\n");
|
|
exit(1);
|
|
}
|
|
run_tests(dir, 2, "config");
|
|
afstest_rmdtemp(dirname);
|
|
}
|
|
|
|
void
|
|
test_set_local_realms(void)
|
|
{
|
|
struct afsconf_dir *dir;
|
|
char *dirname;
|
|
|
|
/* Simulate command line -realm option; overrides config file, if one.
|
|
* Multiple realms can be added. */
|
|
ok(afsconf_SetLocalRealm("MY.REALM.ORG") == 0, "set local realm MY.REALM.ORG");
|
|
ok(afsconf_SetLocalRealm("MY.OTHER.REALM.ORG") == 0, "set local realm MY.OTHER.REALM.ORG");
|
|
|
|
/* run tests without config files */
|
|
dirname = afstest_BuildTestConfig(NULL);
|
|
dir = afsconf_Open(dirname);
|
|
if (dir == NULL) {
|
|
fprintf(stderr, "Unable to configure directory.\n");
|
|
exit(1);
|
|
}
|
|
write_krb_conf(dirname, "SOME.REALM.ORG");
|
|
run_tests(dir, 1, "set realm test");
|
|
afstest_rmdtemp(dirname);
|
|
}
|
|
|
|
void
|
|
test_update_config_files(void)
|
|
{
|
|
int code;
|
|
struct afsconf_dir *dir;
|
|
char *dirname;
|
|
afs_int32 local = -1;
|
|
|
|
dirname = afstest_BuildTestConfig(NULL);
|
|
write_krb_conf(dirname, "SOME.REALM.ORG");
|
|
dir = afsconf_Open(dirname);
|
|
if (dir == NULL) {
|
|
fprintf(stderr, "Unable to configure directory.\n");
|
|
exit(1);
|
|
}
|
|
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, "jdoe", NULL, "SOME.REALM.ORG");
|
|
ok(code == 0 && local == 1, "before update: jdoe@SOME.REALM.ORG");
|
|
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, "jdoe", NULL, "MY.REALM.ORG");
|
|
ok(code == 0 && local == 0, "before update: admin@MY.REALM.ORG");
|
|
|
|
write_krb_conf(dirname, "MY.REALM.ORG MY.OTHER.REALM.ORG");
|
|
write_krb_excl(dirname);
|
|
update_csdb(dirname);
|
|
_afsconf_Touch(dir); /* forces reopen */
|
|
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, "jdoe", NULL, "MY.REALM.ORG");
|
|
ok(code == 0 && local == 1, "after update: jdoe@MY.REALM.ORG");
|
|
|
|
code = afsconf_IsLocalRealmMatch(dir, &local, "admin", NULL, "MY.REALM.ORG");
|
|
ok(code == 0 && local == 0, "after update: admin@MY.REALM.ORG");
|
|
|
|
afstest_rmdtemp(dirname);
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
afstest_SkipTestsIfBadHostname();
|
|
|
|
plan(113);
|
|
|
|
test_edges();
|
|
test_no_config_files();
|
|
test_with_config_files();
|
|
test_update_config_files();
|
|
test_set_local_realms(); /* must be the last test */
|
|
|
|
return 0;
|
|
}
|