00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 const char *XrdAccCapabilityCVSID = "$Id: XrdAccCapability.cc 24468 2008-06-22 16:47:03Z ganis $";
00014
00015 #include "XrdAcc/XrdAccCapability.hh"
00016
00017
00018
00019
00020
00021 extern unsigned long XrdOucHashVal2(const char *KeyVal, int KeyLen);
00022
00023
00024
00025
00026
00027 XrdAccCapability::XrdAccCapability(char *pathval, XrdAccPrivCaps &privval)
00028 {
00029 int i;
00030
00031
00032
00033 next = 0; ctmp = 0;
00034 priv.pprivs = privval.pprivs; priv.nprivs = privval.nprivs;
00035 plen = strlen(pathval); pins = 0; prem = 0;
00036 pkey = XrdOucHashVal2((const char *)pathval, plen);
00037 path = strdup(pathval);
00038
00039
00040
00041 for (i = 0; i < plen; i++)
00042 if (path[i] == '@' && path[i+1] == '=')
00043 {pins = i; prem = plen - i - 2; break;}
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053 XrdAccCapability::~XrdAccCapability()
00054 {
00055 XrdAccCapability *cp, *np = next;
00056
00057 if (path) {free(path); path = 0;}
00058
00059 while(np) {cp = np; np = np->next; cp->next = 0; delete cp;}
00060 next = 0;
00061 }
00062
00063
00064
00065
00066 int XrdAccCapability::Privs( XrdAccPrivCaps &pathpriv,
00067 const char *pathname,
00068 const int pathlen,
00069 const unsigned long pathhash,
00070 const char *pathsub)
00071 {XrdAccCapability *cp=this;
00072 const int psl = (pathsub ? strlen(pathsub) : 0);
00073
00074 do {if (cp->ctmp)
00075 {if (cp->ctmp->Privs(pathpriv,pathname,pathlen,pathhash,pathsub))
00076 return 1;
00077 }
00078 else if (pathlen >= cp->plen)
00079 if ((!pathsub && !strncmp(pathname, cp->path, cp->plen))
00080 || (pathsub && cp->Subcomp(pathname,pathlen,pathsub,psl)))
00081 {pathpriv.pprivs = (XrdAccPrivs)(pathpriv.pprivs |
00082 cp->priv.pprivs);
00083 pathpriv.nprivs = (XrdAccPrivs)(pathpriv.nprivs |
00084 cp->priv.nprivs);
00085 return 1;
00086 }
00087 } while ((cp = cp->next));
00088 return 0;
00089 }
00090
00091
00092
00093
00094
00095 int XrdAccCapability::Subcomp(const char *pathname, const int pathlen,
00096 const char *pathsub, const int sublen)
00097 { int ncmp;
00098
00099
00100
00101 if (strncmp(pathname, path, pins)) return 0;
00102
00103
00104
00105 if (strncmp(&pathname[pins], pathsub, sublen)) return 0;
00106
00107
00108
00109 ncmp = pins + sublen;
00110 if ((pathlen - ncmp) < prem) return 0;
00111
00112
00113
00114 if (prem) return !strncmp(&path[pins+2], &pathname[ncmp], prem);
00115 return 1;
00116 }
00117
00118
00119
00120
00121
00122
00123
00124
00125 XrdAccCapName::~XrdAccCapName()
00126 {
00127 XrdAccCapName *cp, *np = next;
00128
00129
00130
00131 next = 0;
00132 if (CapName) free(CapName);
00133 if (C_List) delete C_List;
00134
00135
00136
00137 while(np) {cp = np; np = np->next; cp->next = 0; delete cp;}
00138 }
00139
00140
00141
00142
00143
00144 XrdAccCapability *XrdAccCapName::Find(const char *name)
00145 {
00146 int nlen = strlen(name);
00147 XrdAccCapName *ncp = this;
00148
00149 do {if (ncp->CNlen <= nlen && !strcmp(ncp->CapName,name+(nlen - ncp->CNlen)))
00150 return ncp->C_List;
00151 ncp = ncp->next;
00152 } while(ncp);
00153 return (XrdAccCapability *)0;
00154 }