/* Tcl interface to Security Dynamics ACE/Server Client API Michael C. Riddell, April 22, 1998 make recipes Solaris: sdclient.o: sdclient.c gcc -c $^ -I/usr/local/ace/examples sdclient.so: sdclient.o ld -dy -G -o $@ $^ /usr/local/ace/examples/sdiclient.a Example: tcl>set env(VAR_ACE) /usr/local/ace/data tcl>set env(USR_ACE) /usr/local/ace/prog tcl>package require sdclient 2.3 tcl>sdinit tcl>sdcheck ACM_OK /usr/bin/ksh tcl>sdclose */ #include #include "sdi_defs.h" #include "sdi_athd.h" #include "sdi_size.h" #include "sdi_type.h" #include "sdacmvls.h" #include "sdconf.h" union config_record configure; int sdinitCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { struct SD_CLIENT *sd; sd = (struct SD_CLIENT*)clientData; memset(sd, 0, sizeof *sd); creadcfg(); if(sd_init(sd)) return TCL_ERROR; return TCL_OK; } int sdauthCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { struct SD_CLIENT *sd; int rc; sd = (struct SD_CLIENT*)clientData; if(argc == 2) { strncpy(sd->username, argv[1], LENACMNAME); } rc = sd_auth(sd); if(rc == ACM_OK) { Tcl_AppendElement(interp, "ACM_OK"); Tcl_AppendElement(interp, sd->shell); } else { Tcl_AppendElement(interp, "ACM_ACCESS_DENIED"); } return TCL_OK; } int sdcheckCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { struct SD_CLIENT *sd; char string[64]; int rc; if(argc != 3) { return TCL_ERROR; } sd = (struct SD_CLIENT*)clientData; rc = sd_check(argv[1], argv[2], sd); switch(rc) { case ACM_OK: Tcl_AppendElement(interp, "ACM_OK"); Tcl_AppendElement(interp, sd->shell); break; case ACM_ACCESS_DENIED: Tcl_AppendElement(interp, "ACM_ACCESS_DENIED"); break; case ACM_NEXT_CODE_REQUIRED: Tcl_AppendElement(interp, "ACM_NEXT_CODE_REQUIRED"); sprintf(string, "%d", sd->timeout); Tcl_AppendElement(interp, string); break; case ACM_NEW_PIN_REQUIRED: Tcl_AppendElement(interp, "ACM_NEW_PIN_REQUIRED"); sprintf(string, "%d", sd->system_pin); Tcl_AppendElement(interp, string); sprintf(string, "%d", sd->min_pin_len); Tcl_AppendElement(interp, string); sprintf(string, "%d", sd->max_pin_len); Tcl_AppendElement(interp, string); switch(sd->user_selectable) { case CANNOT_CHOOSE_PIN: Tcl_AppendElement(interp, "CANNOT_CHOOSE_PIN"); break; case MUST_CHOOSE_PIN: Tcl_AppendElement(interp, "MUST_CHOOSE_PIN"); break; case USER_SELECTABLE: Tcl_AppendElement(interp, "USER_SELECTABLE"); break; } sprintf(string, "%d", sd->alphanumeric); Tcl_AppendElement(interp, string); break; default: sprintf(interp->result, "sd_check unknown return code %d", rc); return TCL_ERROR; break; } return TCL_OK; } int sdpinCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { struct SD_CLIENT *sd; int rc; sd = (struct SD_CLIENT*)clientData; if(argc == 1) { rc = sd_pin("", 1, sd); } else { rc = sd_pin(argv[1], 0, sd); } if(rc == ACM_NEW_PIN_ACCEPTED) { Tcl_AppendElement(interp, "ACM_NEW_PIN_ACCEPTED"); } else { Tcl_AppendElement(interp, "ACM_NEW_PIN_REJECTED"); } return TCL_OK; } int sdnextCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { struct SD_CLIENT *sd; if(argc == 1) return TCL_ERROR; sd = (struct SD_CLIENT*)clientData; if(sd_next(argv[1], sd) == ACM_OK) { Tcl_AppendElement(interp, "ACM_OK"); Tcl_AppendElement(interp, sd->shell); } else { Tcl_AppendElement(interp, "ACM_ACCESS_DENIED"); } return TCL_OK; } int sdcloseCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { struct SD_CLIENT *sd; sd_close(); return TCL_OK; } int Sdclient_Init(Tcl_Interp *interp) { struct SD_CLIENT *sd; if(Tcl_PkgProvide(interp, "Sdclient", "2.3") != TCL_OK) { return TCL_ERROR; } sd = (struct SD_CLIENT*)ckalloc(sizeof *sd); Tcl_CreateCommand(interp, "sdinit", sdinitCmd, (ClientData) sd, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp, "sdauth", sdauthCmd, (ClientData) sd, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp, "sdcheck", sdcheckCmd, (ClientData) sd, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp, "sdpin", sdpinCmd, (ClientData) sd, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp, "sdnext", sdnextCmd, (ClientData) sd, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp, "sdclose", sdcloseCmd, (ClientData) sd, (Tcl_CmdDeleteProc *) NULL); if(Tcl_PkgProvide(interp, "sdclient", "2.3") != TCL_OK) { return TCL_ERROR; } return TCL_OK; }