Windows: If SecurityLevel is configured use it for vos.exe and pts.exe
[openafs.git] / src / ptserver / pts.c
index 6614685..56cfc74 100644 (file)
@@ -10,8 +10,6 @@
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
 
 #include <stdio.h>
 #include <string.h>
@@ -25,6 +23,7 @@ RCSID
 #ifdef AFS_NT40_ENV
 #include <winsock2.h>
 #include <WINNT/afsevent.h>
+#include <WINNT/afsreg.h>
 #else
 #include <netinet/in.h>
 #endif
@@ -32,7 +31,9 @@ RCSID
 #include <rx/rx.h>
 #include <rx/xdr.h>
 #include "ptclient.h"
+#include "ptuser.h"
 #include "pterror.h"
+#include "ptprototypes.h"
 #include <afs/afsutil.h>
 #include <afs/com_err.h>
 
@@ -50,21 +51,30 @@ struct sourcestack {
     FILE *s_file;
 } *shead;
 
-int
+struct authstate {
+    int sec;
+    const char *confdir;
+    char cell[MAXCELLCHARS];
+};
+
+static int CleanUp(struct cmd_syndesc *as, void *arock);
+
+static int
 pts_Interactive(struct cmd_syndesc *as, void *arock)
 {
+    source = stdin;
     finished = 0;
     return 0;
 }
 
-int
+static int
 pts_Quit(struct cmd_syndesc *as, void *arock)
 {
     finished = 1;
     return 0;
 }
 
-int
+static int
 pts_Source(struct cmd_syndesc *as, void *arock)
 {
     FILE *fd;
@@ -92,7 +102,7 @@ pts_Source(struct cmd_syndesc *as, void *arock)
     return 0;
 }
 
-int
+static int
 pts_Sleep(struct cmd_syndesc *as, void *arock)
 {
     int delay;
@@ -101,12 +111,16 @@ pts_Sleep(struct cmd_syndesc *as, void *arock)
        return 1;
     }
     delay = atoi(as->parms[0].items->data);
+#ifdef AFS_PTHREAD_ENV
+    sleep(delay);
+#else
     IOMGR_Sleep(delay);
+#endif
     return 0;
 }
 
-int
-popsource()
+static int
+popsource(void)
 {
     register struct sourcestack *sp;
     if (!(sp = shead))
@@ -120,7 +134,7 @@ popsource()
 }
 
 int
-osi_audit()
+osi_audit(void)
 {
 /* OK, this REALLY sucks bigtime, but I can't tell who is calling
  * afsconf_CheckAuth easily, and only *SERVERS* should be calling osi_audit
@@ -129,39 +143,109 @@ osi_audit()
     return 0;
 }
 
-int
+#ifdef AFS_NT40_ENV
+static DWORD
+win32_enableCrypt(void)
+{
+    HKEY parmKey;
+    DWORD dummyLen;
+    DWORD cryptall = 0;
+    DWORD code;
+
+    /* Look up configuration parameters in Registry */
+    code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
+                        0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
+    if (code != ERROR_SUCCESS) {
+        dummyLen = sizeof(cryptall);
+        RegQueryValueEx(parmKey, "SecurityLevel", NULL, NULL,
+                        (BYTE *) &cryptall, &dummyLen);
+    }
+    RegCloseKey (parmKey);
+
+    return cryptall;
+}
+#endif /* AFS_NT40_ENV */
+
+static int
 GetGlobals(struct cmd_syndesc *as, void *arock)
 {
-    register afs_int32 code;
-    char *cell;
-    afs_int32 sec = 1;
+    struct authstate *state = (struct authstate *) arock;
+    afs_int32 code;
+    char *cell = NULL;
+    afs_int32 sec;
+    int changed = 0;
+    const char* confdir;
 
     whoami = as->a0name;
 
     if (!strcmp(as->name, "help"))
        return 0;
-    if (as->parms[16].items)
+
+    if (*state->cell) {
+       cell = state->cell;
+    }
+    sec = state->sec;
+
+    if (state->confdir == NULL) {
+       changed = 1;
+    }
+
+    if (as->parms[16].items) {
+       changed = 1;
        cell = as->parms[16].items->data;
-    else
-       cell = 0;
-    if (as->parms[17].items)
+    }
+    if (as->parms[17].items) { /* -noauth */
+       changed = 1;
        sec = 0;
-
-    if (as->parms[18].items) { /* testing? */
-       code = pr_Initialize(sec, AFSDIR_SERVER_ETC_DIRPATH, cell);
+    }
+    if (as->parms[20].items) { /* -localauth */
+       changed = 1;
+       sec = 2;
+    }
+    if (as->parms[21].items) { /* -auth */
+       changed = 1;
+       sec = 1;
+    }
+    if (as->parms[22].items    /* -encrypt */
+#ifdef AFS_NT40_ENV
+        || win32_enableCrypt()
+#endif /* AFS_NT40_ENV */
+        ) {
+       changed = 1;
+       sec = 3;
+    }
+    if (as->parms[18].items || as->parms[20].items) { /* -test, -localauth */
+       changed = 1;
+       confdir = AFSDIR_SERVER_ETC_DIRPATH;
     } else {
-       code = pr_Initialize(sec, AFSDIR_CLIENT_ETC_DIRPATH, cell);
+       if (sec == 2)
+           confdir = AFSDIR_SERVER_ETC_DIRPATH;
+       else
+           confdir = AFSDIR_CLIENT_ETC_DIRPATH;
+    }
+    if (changed) {
+       CleanUp(as, arock);
+       code = pr_Initialize(sec, confdir, cell);
+    } else {
+       code = 0;
     }
     if (code) {
        afs_com_err(whoami, code, "while initializing");
        return code;
     }
+    state->sec = sec;
+    state->confdir = confdir;
+    if (cell && cell != state->cell)
+        strncpy(state->cell, cell, MAXCELLCHARS-1);
+
+    force = 0;
     if (as->parms[19].items)
        force = 1;
+
     return code;
 }
 
-int
+static int
 CleanUp(struct cmd_syndesc *as, void *arock)
 {
     if (as && !strcmp(as->name, "help"))
@@ -174,7 +258,7 @@ CleanUp(struct cmd_syndesc *as, void *arock)
     return 0;
 }
 
-int
+static int
 CreateGroup(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -234,7 +318,7 @@ CreateGroup(struct cmd_syndesc *as, void *arock)
     return 0;
 }
 
-int
+static int
 CreateUser(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -280,8 +364,8 @@ CreateUser(struct cmd_syndesc *as, void *arock)
 
 
 #ifdef notdef
-int
-GetNameOrId(register struct cmd_syndesc *as, struct idlist *lids, struct namelist *lnames)
+static int
+GetNameOrId(struct cmd_syndesc *as, struct idlist *lids, struct namelist *lnames)
 {
     register afs_int32 code = 0;
     int n = 0;
@@ -371,8 +455,9 @@ GetNameOrId(register struct cmd_syndesc *as, struct idlist *lids, struct namelis
 #endif
 
 
-int
-GetNameOrId(register struct cmd_syndesc *as, struct idlist *lids, struct namelist *lnames)
+static int
+GetNameOrId(struct cmd_syndesc *as, struct idlist *lids,
+           struct namelist *lnames)
 {
     register afs_int32 code = 0;
     int n = 0, nd = 0, nm = 0, id, x;
@@ -459,7 +544,7 @@ GetNameOrId(register struct cmd_syndesc *as, struct idlist *lids, struct namelis
 }
 
 
-int
+static int
 AddToGroup(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -480,7 +565,7 @@ AddToGroup(struct cmd_syndesc *as, void *arock)
     return 0;
 }
 
-int
+static int
 RemoveFromGroup(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -501,7 +586,7 @@ RemoveFromGroup(struct cmd_syndesc *as, void *arock)
     return 0;
 }
 
-int
+static int
 ListMembership(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -546,7 +631,7 @@ ListMembership(struct cmd_syndesc *as, void *arock)
     return 0;
 }
 
-int
+static int
 Delete(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -585,7 +670,7 @@ char *flags_upcase = "SOMA ";       /* legal all access values */
 char *flags_dncase = "s mar";  /* legal member acces values */
 int flags_shift[5] = { 2, 1, 2, 2, 1 };        /* bits for each */
 
-int
+static int
 CheckEntry(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -684,7 +769,7 @@ CheckEntry(struct cmd_syndesc *as, void *arock)
     return (rcode);
 }
 
-int
+static int
 ListEntries(struct cmd_syndesc *as, void *arock)
 {
     afs_int32 code = 0;
@@ -704,7 +789,7 @@ ListEntries(struct cmd_syndesc *as, void *arock)
            pr_ListEntries(flag, startindex, &nentries, &entriesp,
                           &nextstartindex);
        if (code) {
-           afs_com_err(whoami, code, "; unable to list entries\n");
+           afs_com_err(whoami, code, "; unable to list entries");
            if (entriesp)
                free(entriesp);
            break;
@@ -721,7 +806,7 @@ ListEntries(struct cmd_syndesc *as, void *arock)
     return code;
 }
 
-int
+static int
 ChownGroup(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -737,7 +822,7 @@ ChownGroup(struct cmd_syndesc *as, void *arock)
     return code;
 }
 
-int
+static int
 ChangeName(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -753,7 +838,7 @@ ChangeName(struct cmd_syndesc *as, void *arock)
     return code;
 }
 
-int
+static int
 ListMax(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -774,8 +859,8 @@ ListMax(struct cmd_syndesc *as, void *arock)
     return code;
 }
 
-int
-SetMax(struct cmd_syndesc *as, void *arock)
+static int
+SetMaxCommand(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
     afs_int32 maxid;
@@ -814,7 +899,7 @@ SetMax(struct cmd_syndesc *as, void *arock)
     return code;
 }
 
-int
+static int
 SetFields(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -835,7 +920,7 @@ SetFields(struct cmd_syndesc *as, void *arock)
        int new;
 
        if (strpbrk(access, "76543210") != 0) { /* all octal digits */
-           sscanf(access, "%lo", &flags);
+           sscanf(access, "%lo", (long unsigned int *) &flags);
        } else {                /* interpret flag bit names */
            if (strlen(access) != 5) {
              form_error:
@@ -909,7 +994,7 @@ SetFields(struct cmd_syndesc *as, void *arock)
     return 0;
 }
 
-int
+static int
 ListOwned(struct cmd_syndesc *as, void *arock)
 {
     register afs_int32 code;
@@ -960,7 +1045,7 @@ ListOwned(struct cmd_syndesc *as, void *arock)
 }
 
 static void
-add_std_args(register struct cmd_syndesc *ts)
+add_std_args(struct cmd_syndesc *ts)
 {
     char test_help[AFSDIR_PATH_MAX];
 
@@ -972,6 +1057,12 @@ add_std_args(register struct cmd_syndesc *ts)
     cmd_AddParm(ts, "-test", CMD_FLAG, CMD_OPTIONAL | CMD_HIDE, test_help);
     cmd_AddParm(ts, "-force", CMD_FLAG, CMD_OPTIONAL,
                "Continue oper despite reasonable errors");
+    cmd_AddParm(ts, "-localauth", CMD_FLAG, CMD_OPTIONAL,
+               "use local authentication");
+    cmd_AddParm(ts, "-auth", CMD_FLAG, CMD_OPTIONAL,
+               "use user's authentication (default)");
+    cmd_AddParm(ts, "-encrypt", CMD_FLAG, CMD_OPTIONAL,
+               "encrypt commands");
 }
 
 /*
@@ -996,6 +1087,7 @@ main(int argc, char **argv)
     int parsec;
     char *parsev[CMD_MAXPARMS];
     char *savec;
+    struct authstate state;
 
 #ifdef WIN32
     WSADATA WSAjunk;
@@ -1020,6 +1112,9 @@ main(int argc, char **argv)
     sigaction(SIGSEGV, &nsa, NULL);
 #endif
 
+    memset(&state, 0, sizeof(state));
+    state.sec = 1; /* default is auth */
+
     ts = cmd_CreateSyntax("creategroup", CreateGroup, NULL,
                          "create a new group");
     cmd_AddParm(ts, "-name", CMD_LIST, 0, "group name");
@@ -1077,7 +1172,7 @@ main(int argc, char **argv)
     ts = cmd_CreateSyntax("listmax", ListMax, NULL, "list max id");
     add_std_args(ts);
 
-    ts = cmd_CreateSyntax("setmax", SetMax, NULL, "set max id");
+    ts = cmd_CreateSyntax("setmax", SetMaxCommand, NULL, "set max id");
     cmd_AddParm(ts, "-group", CMD_SINGLE, CMD_OPTIONAL, "group max");
     cmd_AddParm(ts, "-user", CMD_SINGLE, CMD_OPTIONAL, "user max");
     add_std_args(ts);
@@ -1121,15 +1216,15 @@ main(int argc, char **argv)
     cmd_AddParm(ts, "-delay", CMD_SINGLE, 0, "seconds");
     add_std_args(ts);
 
-    cmd_SetBeforeProc(GetGlobals, 0);
+    cmd_SetBeforeProc(GetGlobals, &state);
 
     finished = 1;
-    source = stdin;
-    if (code = cmd_Dispatch(argc, argv)) {
+    source = NULL;
+    if ((code = cmd_Dispatch(argc, argv))) {
        CleanUp(NULL, NULL);
        exit(1);
     }
-    while (!finished) {
+    while (source && !finished) {
        if (isatty(fileno(source)))
            fprintf(stderr, "pts> ");
        if (!fgets(line, sizeof line, source)) {