/*************************************************************************\ * Copyright (c) 2018 Michael Davidsaver * SPDX-License-Identifier: EPICS * EPICS BASE is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. \*************************************************************************/ #include #include #include #include #include #include #include #include #include static char *asUser, *asHost; static int asAsl; static void setUser(const char *name) { free(asUser); asUser = epicsStrDup(name); } static void setHost(const char *name) { free(asHost); asHost = epicsStrDup(name); } static void testAccess(const char *asg, unsigned mask) { ASMEMBERPVT asp = 0; /* aka dbCommon::asp */ ASCLIENTPVT client = 0; long ret; ret = asAddMember(&asp, asg); if(ret) { testFail("testAccess(ASG:%s, USER:%s, HOST:%s, ASL:%d) -> asAddMember error: %s", asg, asUser, asHost, asAsl, errSymMsg(ret)); } else { ret = asAddClient(&client, asp, asAsl, asUser, asHost); } if(ret) { testFail("testAccess(ASG:%s, USER:%s, HOST:%s, ASL:%d) -> asAddClient error: %s", asg, asUser, asHost, asAsl, errSymMsg(ret)); } else { unsigned actual = 0; actual |= asCheckGet(client) ? 1 : 0; actual |= asCheckPut(client) ? 2 : 0; testOk(actual==mask, "testAccess(ASG:%s, USER:%s, HOST:%s, ASL:%d) -> %x == %x", asg, asUser, asHost, asAsl, actual, mask); } if(client) asRemoveClient(&client); if(asp) asRemoveMember(&asp); } static void testSyntaxErrors(void) { static const char empty[] = "\n#almost empty file\n\n"; long ret; testDiag("testSyntaxErrors()"); eltc(0); ret = asInitMem(empty, NULL); testOk(ret==S_asLib_badConfig, "load \"empty\" config -> %s", errSymMsg(ret)); eltc(1); } static const char hostname_config[] = "" "HAG(foo) {localhost}\n" "ASG(DEFAULT) {RULE(0, NONE)}\n" "ASG(ro) {RULE(0, NONE)RULE(1, READ) {HAG(foo)}}\n" "ASG(rw) {RULE(1, WRITE) {HAG(foo)}}\n" ; static void testHostNames(void) { testDiag("testHostNames()"); asCheckClientIP = 0; testOk1(asInitMem(hostname_config, NULL)==0); setUser("testing"); setHost("localhost"); asAsl = 0; testAccess("invalid", 0); testAccess("DEFAULT", 0); testAccess("ro", 1); testAccess("rw", 3); setHost("127.0.0.1"); testAccess("invalid", 0); testAccess("DEFAULT", 0); testAccess("ro", 0); testAccess("rw", 0); setHost("guaranteed.invalid."); testAccess("invalid", 0); testAccess("DEFAULT", 0); testAccess("ro", 0); testAccess("rw", 0); } static void testUseIP(void) { testDiag("testUseIP()"); asCheckClientIP = 1; /* still host names in .acf */ testOk1(asInitMem(hostname_config, NULL)==0); /* now resolved to IPs */ setUser("testing"); setHost("localhost"); /* will not match against resolved IP */ asAsl = 0; testAccess("invalid", 0); testAccess("DEFAULT", 0); testAccess("ro", 0); testAccess("rw", 0); setHost("127.0.0.1"); testAccess("invalid", 0); testAccess("DEFAULT", 0); testAccess("ro", 1); testAccess("rw", 3); setHost("guaranteed.invalid."); testAccess("invalid", 0); testAccess("DEFAULT", 0); testAccess("ro", 0); testAccess("rw", 0); } MAIN(aslibtest) { testPlan(27); testSyntaxErrors(); testHostNames(); testUseIP(); errlogFlush(); return testDone(); }