47 const char *TraceID =
"Security";
56 bool XrdHttpProtocol::InitSecurity() {
60 eDest.
Say(
"Error instantiating crypto factory ssl",
"");
71 eDest.
Say(
"Error loading grid map file:", gridmap);
74 TRACE(ALL,
"using grid map file: "<< gridmap);
94 XrdHttpProtocol::HandleAuthentication(
XrdLink* lp)
96 EPNAME(
"HandleAuthentication");
97 int rc_ssl = SSL_get_verify_result(ssl);
100 TRACEI(
DEBUG,
" SSL_get_verify_result returned :" << rc_ssl);
104 XrdTlsPeerCerts pc(SSL_get_peer_certificate(ssl),SSL_get_peer_cert_chain(ssl));
107 if ((!pc.hasCert()) ||
108 (myCryptoFactory && !myCryptoFactory->X509ParseStack()(&pc, &chain))) {
109 TRACEI(
DEBUG,
"No certificate found in peer chain.");
116 const char * dn = chain.
EECname();
117 const char * eechash = chain.
EEChash();
119 if (!dn || !eechash) {
122 TRACEI(
DEBUG,
"Failed to extract DN information.");
127 if (SecEntity.moninfo) {
128 free(SecEntity.moninfo);
131 SecEntity.moninfo = strdup(dn);
132 TRACEI(
DEBUG,
" Subject name is : '" << SecEntity.moninfo <<
"'; hash is " << eechash);
136 if (GetVOMSData(lp)) {
137 TRACEI(
DEBUG,
" No VOMS information for DN: " << SecEntity.moninfo);
139 if (isRequiredXtractor) {
140 eDest.
Emsg(epname,
"Failed extracting required VOMS info for DN: ",
147 auto retval = HandleGridMap(lp, eechash);
158 XrdHttpProtocol::HandleGridMap(
XrdLink* lp,
const char * eechash)
164 int mape = servGMap->dn2user(SecEntity.moninfo, bufname,
sizeof(bufname), 0);
165 if ( !mape && SecEntity.moninfo[0] ) {
166 TRACEI(
DEBUG,
" Mapping name: '" << SecEntity.moninfo <<
"' --> " << bufname);
167 if (SecEntity.name) free(SecEntity.name);
168 SecEntity.name = strdup(bufname);
169 SecEntity.eaAPI->Add(
"gridmap.name",
"1",
true);
172 TRACEI(ALL,
" Mapping name: " << SecEntity.moninfo <<
" Failed. err: " << mape);
174 if (isRequiredGridmap) {
175 eDest.
Emsg(epname,
"Required gridmap mapping failed for DN:",
182 if (!SecEntity.name && !compatNameGeneration) {
183 TRACEI(
DEBUG,
" Will fallback name to subject hash: " << eechash);
184 SecEntity.name = strdup(eechash);
188 if (!SecEntity.name) {
190 if (SecEntity.name) free(SecEntity.name);
194 char *lnpos = strstr(SecEntity.moninfo,
"/CN=");
200 char *lnpos2 = index(lnpos,
'/');
202 int l = ( lnpos2-lnpos < (int)
sizeof(bufname) ? lnpos2-lnpos : (int)
sizeof(bufname)-1 );
203 strncpy(bufname, lnpos, l);
208 strcpy(bufname2,
"unknown-");
209 for (
int i = (
int)strlen(bufname)-1; i >= 0; i--) {
210 if (isalnum(bufname[i])) {
212 bufname2[j] = bufname[i];
218 SecEntity.name = strdup(bufname);
219 TRACEI(
DEBUG,
" Setting link name: '" << bufname2+j <<
"'");
220 lp->
setID(bufname2+j, 0);
226 if (!SecEntity.name) {
228 SecEntity.name = strdup(
"unknown-\0");
229 for (
int i = (
int)strlen(SecEntity.moninfo)-1; i >= 0; i--) {
230 if (isalnum(SecEntity.moninfo[i])) {
232 SecEntity.name[j] = SecEntity.moninfo[i];
246 int XrdHttpProtocol::GetVOMSData(
XrdLink *lp)
258 if (servGMap && SecEntity.name) {
259 savestr = strdup(SecEntity.name);
262 int r = secxtractor->GetSecData(lp, SecEntity, ssl);
264 if (servGMap && savestr) {
265 if (SecEntity.name) free(SecEntity.name);
266 SecEntity.name = savestr;
270 TRACEI(ALL,
" Certificate data extraction failed: " << SecEntity.moninfo
271 <<
" Failed. err: " << r);
XrdSysError eDest(0, "HttpMon")
XrdSysTrace XrdHttpTrace("http")
A pragmatic implementation of the HTTP/DAV protocol for the Xrd framework.
XrdOucGMap * XrdOucgetGMap(XrdOucGMapArgs)
static XrdCryptoFactory * GetCryptoFactory(const char *factoryname)
void Cleanup(bool keepCA=0)
static XrdOucGMap * servGMap
The instance of the DN mapper. Created only when a valid path is given.
void setID(const char *userid, int procid)
const char * c_str() const
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
void Say(const char *text1, const char *text2=0, const char *txt3=0, const char *text4=0, const char *text5=0, const char *txt6=0)