#ifndef __SecsssKT__ #define __SecsssKT__ /******************************************************************************/ /* */ /* X r d S e c s s s K T . h h */ /* */ /* (c) 2008 by the Board of Trustees of the Leland Stanford, Jr., University */ /* All Rights Reserved */ /* Produced by Andrew Hanushevsky for Stanford University under contract */ /* DE-AC02-76-SFO0515 with the Department of Energy */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD is free software: you can redistribute it and/or modify it under */ /* the terms of the GNU Lesser General Public License as published by the */ /* Free Software Foundation, either version 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public License */ /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ #include #include #include "XrdSys/XrdSysPthread.hh" class XrdOucErrInfo; class XrdOucStream; class XrdSecsssKT { public: class ktEnt { public: static const int maxKLen = 128; static const int NameSZ = 192; static const int UserSZ = 128; static const int GrupSZ = 64; struct ktData {long long ID; long long Flags; // Future! time_t Crt; time_t Exp; int Opts; int Len; char Val[maxKLen];// Key strings are 1024 bits or less char Name[NameSZ];// Key names are null terminated char User[UserSZ];// Usr names are null terminated char Grup[GrupSZ];// Grp names are null terminated } Data; static const int anyUSR = 2; static const int anyGRP = 4; static const int usrGRP = 8; static const int noIPCK =16; void NUG(ktEnt *ktP) {strcpy(Data.Name, ktP->Data.Name); strcpy(Data.User, ktP->Data.User); strcpy(Data.Grup, ktP->Data.Grup); } void Set(ktEnt &rhs) {Data.ID=rhs.Data.ID; Data.Len = rhs.Data.Len; memcpy(Data.Val, rhs.Data.Val, Data.Len); Data.Crt=rhs.Data.Crt; Data.Exp=rhs.Data.Exp; } ktEnt *Next; ktEnt() : Next(0) { Data.ID = -1; Data.Flags= 0; Data.Opts = 0; *Data.Val = '\0'; *Data.Name = '\0'; *Data.User= '\0'; *Data.Grup = '\0'; } ~ktEnt() {} }; void addKey(ktEnt &ktNew); int delKey(ktEnt &ktDel); static char *genFN(); static void genKey(char *Buff, int blen); int getKey(ktEnt &ktEql); ktEnt *keyList() {return ktList;} void Refresh(); time_t RefrTime() {return ktRefT;} int Rewrite(int Keep, int &numKeys, int &numTot, int &numExp); int Same(const char *path) {return (ktPath && !strcmp(ktPath, path));} void setPath(const char *Path) {if (ktPath) free(ktPath); ktPath = strdup(Path);} enum xMode {isAdmin = 0, isClient, isServer}; XrdSecsssKT(XrdOucErrInfo *, const char *, xMode, int refr=60*60); ~XrdSecsssKT(); private: int eMsg(const char *epn, int rc, const char *txt1, const char *txt2=0, const char *txt3=0, const char *txt4=0); ktEnt *getKeyTab(XrdOucErrInfo *eInfo, time_t Mtime, mode_t Amode); mode_t fileMode(const char *Path); int isKey(ktEnt &ktRef, ktEnt *ktP, int Full=1); void keyB2X(ktEnt *theKT, char *buff); void keyX2B(ktEnt *theKT, char *xKey); ktEnt *ktDecode0(XrdOucStream &kTab, XrdOucErrInfo *eInfo); XrdSysMutex myMutex; char *ktPath; ktEnt *ktList; time_t ktMtime; xMode ktMode; time_t ktRefT; int kthiID; pthread_t ktRefID; static int randFD; }; #endif