00001 #ifndef __SecsssKT__
00002 #define __SecsssKT__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <string.h>
00034 #include <time.h>
00035 #include "XrdSys/XrdSysPthread.hh"
00036
00037 class XrdOucErrInfo;
00038 class XrdOucStream;
00039
00040 class XrdSecsssKT
00041 {
00042 public:
00043
00044 class ktEnt
00045 {
00046 public:
00047
00048 static const int maxKLen = 128;
00049 static const int NameSZ = 192;
00050 static const int UserSZ = 128;
00051 static const int GrupSZ = 64;
00052
00053 struct ktData
00054 {long long ID;
00055 long long Flags;
00056 time_t Crt;
00057 time_t Exp;
00058 int Opts;
00059 int Len;
00060 char Val[maxKLen];
00061 char Name[NameSZ];
00062 char User[UserSZ];
00063 char Grup[GrupSZ];
00064 } Data;
00065
00066 static const int anyUSR = 2;
00067 static const int anyGRP = 4;
00068 static const int usrGRP = 8;
00069 static const int noIPCK =16;
00070
00071 void NUG(ktEnt *ktP) {strcpy(Data.Name, ktP->Data.Name);
00072 strcpy(Data.User, ktP->Data.User);
00073 strcpy(Data.Grup, ktP->Data.Grup);
00074 }
00075 void Set(ktEnt &rhs) {Data.ID=rhs.Data.ID; Data.Len = rhs.Data.Len;
00076 memcpy(Data.Val, rhs.Data.Val, Data.Len);
00077 Data.Crt=rhs.Data.Crt; Data.Exp=rhs.Data.Exp;
00078 }
00079 ktEnt *Next;
00080
00081 ktEnt() : Next(0) { Data.ID = -1; Data.Flags= 0; Data.Opts = 0;
00082 *Data.Val = '\0'; *Data.Name = '\0';
00083 *Data.User= '\0'; *Data.Grup = '\0';
00084 }
00085 ~ktEnt() {}
00086 };
00087
00088 void addKey(ktEnt &ktNew);
00089
00090 int delKey(ktEnt &ktDel);
00091
00092 static
00093 char *genFN();
00094
00095 static
00096 void genKey(char *Buff, int blen);
00097
00098 int getKey(ktEnt &ktEql);
00099
00100 ktEnt *keyList() {return ktList;}
00101
00102 void Refresh();
00103
00104 time_t RefrTime() {return ktRefT;}
00105
00106 int Rewrite(int Keep, int &numKeys, int &numTot, int &numExp);
00107
00108 int Same(const char *path) {return (ktPath && !strcmp(ktPath, path));}
00109
00110 void setPath(const char *Path)
00111 {if (ktPath) free(ktPath); ktPath = strdup(Path);}
00112
00113 enum xMode {isAdmin = 0, isClient, isServer};
00114
00115 XrdSecsssKT(XrdOucErrInfo *, const char *, xMode, int refr=60*60);
00116 ~XrdSecsssKT();
00117
00118 private:
00119 int eMsg(const char *epn, int rc, const char *txt1,
00120 const char *txt2=0, const char *txt3=0, const char *txt4=0);
00121 ktEnt *getKeyTab(XrdOucErrInfo *eInfo, time_t Mtime, mode_t Amode);
00122 mode_t fileMode(const char *Path);
00123 int isKey(ktEnt &ktRef, ktEnt *ktP, int Full=1);
00124 void keyB2X(ktEnt *theKT, char *buff);
00125 void keyX2B(ktEnt *theKT, char *xKey);
00126 ktEnt *ktDecode0(XrdOucStream &kTab, XrdOucErrInfo *eInfo);
00127
00128 XrdSysMutex myMutex;
00129 char *ktPath;
00130 ktEnt *ktList;
00131 time_t ktMtime;
00132 xMode ktMode;
00133 time_t ktRefT;
00134 int kthiID;
00135 pthread_t ktRefID;
00136 static int randFD;
00137 };
00138 #endif