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 allUSR = 1;
00067 static const int anyUSR = 2;
00068 static const int anyGRP = 4;
00069 static const int usrGRP = 8;
00070 static const int noIPCK =16;
00071
00072 void NUG(ktEnt *ktP) {strcpy(Data.Name, ktP->Data.Name);
00073 strcpy(Data.User, ktP->Data.User);
00074 strcpy(Data.Grup, ktP->Data.Grup);
00075 }
00076 void Set(ktEnt &rhs) {Data.ID=rhs.Data.ID; Data.Len = rhs.Data.Len;
00077 memcpy(Data.Val, rhs.Data.Val, Data.Len);
00078 Data.Crt=rhs.Data.Crt; Data.Exp=rhs.Data.Exp;
00079 }
00080 ktEnt *Next;
00081
00082 ktEnt() : Next(0) { Data.ID = -1; Data.Flags= 0; Data.Opts = 0;
00083 *Data.Val = '\0'; *Data.Name = '\0';
00084 *Data.User= '\0'; *Data.Grup = '\0';
00085 }
00086 ~ktEnt() {}
00087 };
00088
00089 void addKey(ktEnt &ktNew);
00090
00091 int delKey(ktEnt &ktDel);
00092
00093 static
00094 char *genFN();
00095
00096 static
00097 void genKey(char *Buff, int blen);
00098
00099 int getKey(ktEnt &ktEql, bool andKeyID=false);
00100
00101 ktEnt *keyList() {return ktList;}
00102
00103 void Refresh();
00104
00105 time_t RefrTime() {return ktRefT;}
00106
00107 int Rewrite(int Keep, int &numKeys, int &numTot, int &numExp);
00108
00109 int Same(const char *path) {return (ktPath && !strcmp(ktPath, path));}
00110
00111 void setPath(const char *Path)
00112 {if (ktPath) free(ktPath); ktPath = strdup(Path);}
00113
00114 enum xMode {isAdmin = 0, isClient, isServer};
00115
00116 XrdSecsssKT(XrdOucErrInfo *, const char *, xMode, int refr=60*60);
00117 ~XrdSecsssKT();
00118
00119 private:
00120 int eMsg(const char *epn, int rc, const char *txt1,
00121 const char *txt2=0, const char *txt3=0, const char *txt4=0);
00122 ktEnt *getKeyTab(XrdOucErrInfo *eInfo, time_t Mtime, mode_t Amode);
00123 mode_t fileMode(const char *Path);
00124 int isKey(ktEnt &ktRef, ktEnt *ktP, int Full=1);
00125 void keyB2X(ktEnt *theKT, char *buff);
00126 void keyX2B(ktEnt *theKT, char *xKey);
00127 ktEnt *ktDecode0(XrdOucStream &kTab, XrdOucErrInfo *eInfo);
00128
00129 XrdSysMutex myMutex;
00130 char *ktPath;
00131 ktEnt *ktList;
00132 time_t ktMtime;
00133 xMode ktMode;
00134 time_t ktRefT;
00135 int kthiID;
00136 pthread_t ktRefID;
00137 static int randFD;
00138 };
00139 #endif