33 SrvAuth_t TServerSocket::fgSrvAuthHook = 0;
34 SrvClup_t TServerSocket::fgSrvAuthClupHook = 0;
37 UChar_t TServerSocket::fgAcceptOpt = kSrvNoAuth;
39 TVirtualMutex *gSrvAuthenticateMutex = 0;
41 ClassImp(TServerSocket);
47 static void SetAuthOpt(UChar_t &opt, UChar_t mod)
49 R__LOCKGUARD2(gSrvAuthenticateMutex);
53 if ((mod & kSrvAuth)) opt |= kSrvAuth;
54 if ((mod & kSrvNoAuth)) opt &= ~kSrvAuth;
76 TServerSocket::TServerSocket(
const char *service, Bool_t reuse, Int_t backlog,
82 SetName(
"ServerSocket");
85 fSecContexts =
new TList;
88 ResetBit(TSocket::kIsUnix);
89 if (service && (!gSystem->AccessPathName(service) ||
93 service[0] ==
'/' || (service[1] ==
':' && service[2] ==
'/'))) {
95 SetBit(TSocket::kIsUnix);
98 fSocket = gSystem->AnnounceUnixService(service, backlog);
100 R__LOCKGUARD(gROOTMutex);
101 gROOT->GetListOfSockets()->Add(
this);
106 int port = gSystem->GetServiceByName(service);
108 fSocket = gSystem->AnnounceTcpService(port, reuse, backlog, tcpwindowsize);
110 R__LOCKGUARD(gROOTMutex);
111 gROOT->GetListOfSockets()->Add(
this);
139 TServerSocket::TServerSocket(Int_t port, Bool_t reuse, Int_t backlog,
145 SetName(
"ServerSocket");
148 fSecContexts =
new TList;
149 fService = gSystem->GetServiceByPort(port);
152 fSocket = gSystem->AnnounceTcpService(port, reuse, backlog, tcpwindowsize);
154 R__LOCKGUARD(gROOTMutex);
155 gROOT->GetListOfSockets()->Add(
this);
162 TServerSocket::~TServerSocket()
164 R__LOCKGUARD2(gSrvAuthenticateMutex);
166 if (fgSrvAuthClupHook) {
168 (*fgSrvAuthClupHook)(fSecContexts);
171 fSecContexts->Delete();
172 SafeDelete(fSecContexts);
204 TSocket *TServerSocket::Accept(UChar_t opt)
206 if (fSocket == -1) {
return 0; }
208 TSocket *socket =
new TSocket;
210 Int_t soc = gSystem->AcceptConnection(fSocket);
211 if (soc == -1) {
delete socket;
return 0; }
212 if (soc == -2) {
delete socket;
return (TSocket*) -1; }
215 UChar_t acceptOpt = fgAcceptOpt;
216 SetAuthOpt(acceptOpt, opt);
217 Bool_t auth = (Bool_t)(acceptOpt & kSrvAuth);
219 socket->fSocket = soc;
220 socket->fSecContext = 0;
221 socket->fService = fService;
222 if (!TestBit(TSocket::kIsUnix))
223 socket->fAddress = gSystem->GetPeerName(socket->fSocket);
224 if (socket->fSocket >= 0) {
225 R__LOCKGUARD(gROOTMutex);
226 gROOT->GetListOfSockets()->Add(socket);
231 if (!Authenticate(socket)) {
245 TInetAddress TServerSocket::GetLocalInetAddress()
248 if (fAddress.GetPort() == -1)
249 fAddress = gSystem->GetSockName(fSocket);
252 return TInetAddress();
258 Int_t TServerSocket::GetLocalPort()
261 if (fAddress.GetPort() == -1)
262 fAddress = GetLocalInetAddress();
263 return fAddress.GetPort();
272 UChar_t TServerSocket::GetAcceptOptions()
283 void TServerSocket::SetAcceptOptions(UChar_t mod)
285 SetAuthOpt(fgAcceptOpt, mod);
291 void TServerSocket::ShowAcceptOptions()
293 ::Info(
"ShowAcceptOptions",
"Use authentication: %s", (fgAcceptOpt & kSrvAuth) ?
"yes" :
"no");
300 Bool_t TServerSocket::Authenticate(TSocket *sock)
302 if (!fgSrvAuthHook) {
303 R__LOCKGUARD2(gSrvAuthenticateMutex);
306 TString srvlib =
"libSrvAuth";
309 if ((p = gSystem->DynamicPathName(srvlib, kTRUE))) {
311 if (gSystem->Load(srvlib) == -1) {
312 Error(
"Authenticate",
"can't load %s",srvlib.Data());
316 Error(
"Authenticate",
"can't locate %s",srvlib.Data());
321 Func_t f = gSystem->DynFindSymbol(srvlib,
"SrvAuthenticate");
323 fgSrvAuthHook = (SrvAuth_t)(f);
325 Error(
"Authenticate",
"can't find SrvAuthenticate");
330 f = gSystem->DynFindSymbol(srvlib,
"SrvAuthCleanup");
332 fgSrvAuthClupHook = (SrvClup_t)(f);
334 Warning(
"Authenticate",
"can't find SrvAuthCleanup");
338 TString confdir = TROOT::GetRootSys();
339 if (!confdir.Length()) {
340 Error(
"Authenticate",
"config dir undefined");
345 TString tmpdir = TString(gSystem->TempDirectory());
346 if (gSystem->AccessPathName(tmpdir, kWritePermission))
347 tmpdir = TString(
"/tmp");
350 TString openhost(sock->GetInetAddress().GetHostName());
352 Info(
"Authenticate",
"OpenHost = %s", openhost.Data());
359 std::string ctkn =
"";
361 auth = (*fgSrvAuthHook)(sock, confdir, tmpdir, user,
362 meth, type, ctkn, fSecContexts);
365 Info(
"Authenticate",
"auth = %d, type= %d, ctkn= %s",
366 auth, type, ctkn.c_str());