31 #include <netinet/in.h>
57 const char *sid,
const char *
envP)
61 const char *eText, *Token;
67 return Emsg(Link, eText, 0);
77 memset(&myData, 0,
sizeof(myData));
85 return Emsg(Link,
"invalid login data", 0);
90 {
static const int rbsz = 1024;
91 char *rbP, rbuff[rbsz];
95 if (rc > 0)
return SendErrorBL(Link, rbuff, rc);
96 else if (rc < 0)
return SendErrorBL(Link);
108 return (sendData(Link, myData) ? 0 : 1);
115 int XrdCmsLogin::Emsg(
XrdLink *Link,
const char *msg,
int ecode)
117 Say.
Emsg(
"Login", Link->
Name(),
"login failed;", msg);
128 char WorkBuff[4096], *hList, *wP = WorkBuff;
137 n = sendData(Link, Data);
143 if ((n = Link->
RecvAll((
char *)&LIHdr,
sizeof(LIHdr), timeout)) < 0)
144 return Emsg(Link, (n == -ETIMEDOUT ?
"timed out" :
"rejected"));
148 if ((dataLen =
static_cast<int>(ntohs(LIHdr.
datalen))))
149 {
if (dataLen > (
int)
sizeof(WorkBuff))
150 return Emsg(Link,
"login reply too long");
151 if (Link->
RecvAll(WorkBuff, dataLen, timeout) < 0)
152 return Emsg(Link,
"login receive error");
160 dataLen =
static_cast<int>(ntohs(LIHdr.
datalen));
161 if (dataLen > (
int)
sizeof(WorkBuff))
162 return Emsg(Link,
"login reply too long");
170 return Emsg(Link,
"malformed try host data");
182 return Emsg(Link,
"invalid error reply");
184 memcpy(&eRC, WorkBuff,
sizeof(eRC));
192 || !
Parser.
Parse(&Data, WorkBuff, WorkBuff+dataLen))
193 return Emsg(Link,
"invalid login response");
208 static const int xNum = 20;
210 int n, iovcnt, iovnum;
212 struct iovec Liov[xNum];
219 return Emsg(Link,
"too much login data");
223 Resp.datalen = Data.Size;
224 Liov[0].iov_base = (
char *)&Resp;
225 Liov[0].iov_len =
sizeof(Resp);
230 if (iovcnt <= iovmax) Link->
Send(Liov, iovcnt);
231 else while(iovcnt > 0)
232 {iovnum = (iovcnt > iovmax ? iovmax : iovcnt);
233 Link->
Send(&Liov[n], iovnum);
234 n += iovmax; iovcnt -= iovmax;
246 int XrdCmsLogin::SendErrorBL(
XrdLink *Link)
256 n = snprintf(rData.rText,
sizeof(rData.rText),
"%s is blacklisted.", hName)
257 +
sizeof(rData.rInfo.Val) + 1;
261 rData.rInfo.Hdr.streamid = 0;
263 rData.rInfo.Hdr.modifier = 0;
264 rData.rInfo.Hdr.datalen = htons(n);
265 rData.rInfo.Val = htonl(
static_cast<unsigned int>(
kYR_EPERM));
270 return Emsg(Link,
"blacklisted", 0);
275 int XrdCmsLogin::SendErrorBL(
XrdLink *Link,
char *rbuff,
int rblen)
278 struct iovec
iov[2] = {{(
char *)&Rsp,
sizeof(Rsp)},
279 {rbuff,
static_cast<size_t>(rblen)}};
284 Link->
Send(
iov, 2,
sizeof(Rsp) + rblen);
288 snprintf(msgbuff,
sizeof(msgbuff),
"blacklisted; redirected to %s",
289 rbuff+
sizeof(
short));
290 return Emsg(Link, msgbuff, 0);
static int Present(const char *hName, XrdOucTList *bList=0, char *rbuff=0, int rblen=0)
int Admit(XrdLink *Link, XrdCms::CmsLoginData &Data, const char *sid, const char *envP)
static int Login(XrdLink *Link, XrdCms::CmsLoginData &Data, int timeout=-1)
static int Pack(int rnum, struct iovec *iovP, struct iovec *iovE, char *Base, char *Work)
int Parse(XrdCms::CmsLoginData *Data, const char *Aps, const char *Apt)
static const char * getToken(int &size, XrdNetAddrInfo *endPoint)
static int Authenticate(XrdLink *Link, const char *Token, int tlen)
static int Identify(XrdLink *Link, XrdCms::CmsRRHdr &inHdr, char *authBuff, int abLen)
static const char * Attend(XrdLink *Link, XrdCms::CmsRRHdr &Hdr, char *buff, int blen, int &rlen, int tmo=5000)
const char * Host() const
int RecvAll(char *buff, int blen, int timeout=-1)
XrdNetAddrInfo * AddrInfo()
int Send(const char *buff, int blen)
const char * Name() const
const char * Name(const char *eName=0, const char **eText=0)
static int Unpack(char **buff, const char *bend, char **data, int &dlen)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
static const unsigned char kYR_Version