ROOT logo
// @(#)root/auth:$Id: THostAuth.cxx 24778 2008-07-10 22:59:38Z rdm $
// Author: G. Ganis   19/03/2003

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// THostAuth                                                            //
//                                                                      //
// Contains details about host-specific authentication methods and the  //
// result of their application.                                         //
// Used by TAuthenticate.                                               //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "RConfigure.h"
#include "TSystem.h"
#include "THostAuth.h"
#include "TRootSecContext.h"
#include "TAuthenticate.h"
#include "TSocket.h"
#include "TUrl.h"
#include <stdlib.h>


ClassImp(THostAuth)

//______________________________________________________________________________
   THostAuth::THostAuth() : TObject()
{
   // Deafult constructor.

   Create(0, 0);
}

//______________________________________________________________________________
THostAuth::THostAuth(const char *host, const char *user, Int_t nmeth,
                     Int_t *authmeth, char **details) : TObject()
{
   // Create hostauth object.
   // 'host' may contain also the server for whicb these directives
   // are valid in the form 'host:server' or 'server://host'
   // with server either "sock[d]", "root[d]", "proof[d]" or
   // 0, 1, 2, respectively.

   Create(host, user, nmeth, authmeth, details);
}

//______________________________________________________________________________
THostAuth::THostAuth(const char *host, Int_t server, const char *user,
                     Int_t nmeth, Int_t *authmeth, char **details) : TObject()
{
   // Create hostauth object.
   // 'host' may contain also the server for whicb these directives
   // are valid in the form 'host:server' or 'server://host'
   // with server either "sock[d]", "root[d]", "proof[d]" or
   // 0, 1, 2, respectively.

   Create(host, user, nmeth, authmeth, details);

   fServer = server;
}

//______________________________________________________________________________
THostAuth::THostAuth(const char *host, const char *user, Int_t authmeth,
                     const char *details) : TObject()
{
   // Create hostauth object with one method only.
   // 'host' may contain also the server for whicb these directives
   // are valid in the form 'host:server' or 'server://host'

   Create(host, user, 1, &authmeth, (char **)&details);
}

//______________________________________________________________________________
THostAuth::THostAuth(const char *host, Int_t server, const char *user,
                     Int_t authmeth, const char *details) : TObject()
{
   // Create hostauth object with one method only.
   // 'host' may contain also the server for whicb these directives
   // are valid in the form 'host:server' or 'server://host'

   Create(host, user, 1, &authmeth, (char **)&details);
   fServer = server;
}

//______________________________________________________________________________
void THostAuth::Create(const char *host, const char *user, Int_t nmeth,
                       Int_t *authmeth, char **details)
{
   // Create hostauth object.
   // 'host' may contain also the server for whicb these directives
   // are valid in the form 'host:server' or 'server://host'
   // with server either "sock[d]", "root[d]", "proof[d]" or
   // 0, 1, 2, respectively.

   int i;

   // Host
   fHost = host;

   fServer = -1;
   // Extract server, if given
   TString srv("");
   if (fHost.Contains(":")) {
      // .rootauthrc form: host:server
      srv = fHost;
      fHost.Remove(fHost.Index(":"));
      srv.Remove(0,srv.Index(":")+1);
   } else if (fHost.Contains("://")) {
      // Url form: server://host
      srv = TUrl(fHost).GetProtocol();
      fHost.Remove(0,fHost.Index("://")+3);
   }
   if (srv.Length()) {
      if (srv == "0" || srv.BeginsWith("sock"))
         fServer = TSocket::kSOCKD;
      else if (srv == "1" || srv.BeginsWith("root"))
         fServer = TSocket::kROOTD;
      else if (srv == "2" || srv.BeginsWith("proof"))
         fServer = TSocket::kPROOFD;
   }

   // Check and save the host FQDN ...
   if (fHost != "default" && !fHost.Contains("*")) {
      TInetAddress addr = gSystem->GetHostByName(fHost);
      if (addr.IsValid())
         fHost = addr.GetHostName();
   }

   // User
   fUser = user;
   if (fUser == "")
      fUser = gSystem->Getenv("USER");
   if (fUser == "") {
      UserGroup_t *u = gSystem->GetUserInfo();
      if (u)
         fUser = u->fUser;
      delete u;
   }

   // Methods indexes
   fNumMethods = nmeth;
   if (fNumMethods > 0) {
      if (!authmeth)
         fNumMethods = 0;
      for (i = 0; i < kMAXSEC; i++) {
         if (i < fNumMethods) {
            fMethods[i] = authmeth[i];
            fSuccess[i] = 0;
            fFailure[i] = 0;
         } else {
            fMethods[i] = -1;
            fSuccess[i] = -1;
            fFailure[i] = -1;
         }
      }
   }

   // Method details
   if (fNumMethods > 0) {
      for (i = 0; i < fNumMethods; i++) {
         if (details && details[i] && strlen(details[i]) > 0) {
            fDetails[i] = details[i];
         } else {
            // Use default instead
            char *tmp = TAuthenticate::GetDefaultDetails(fMethods[i],0,fUser);
            fDetails[i] = (const char *)tmp;
            delete[] tmp;
         }
      }
   }

   // List of TSecContext
   fSecContexts = new TList;

   // Active when created
   fActive = kTRUE;
}


//______________________________________________________________________________
THostAuth::THostAuth(const char *asstring) : TObject()
{
   // Create hostauth object from directives given as a compact string
   // See THostAuth::AsString().
   // Used in proof context only; fServer not set; to be set by hand
   // with SetServer() method if really needed

   fServer = -1;

   TString strtmp(asstring);
   char *tmp = new char[strlen(asstring)+1];
   strcpy(tmp,asstring);

   fHost = TString((const char *)strtok(tmp," "));
   strtmp.ReplaceAll(fHost,"");
   fHost.Remove(0,fHost.Index(":")+1);

   fUser = TString((const char *)strtok(0," "));
   strtmp.ReplaceAll(fUser,"");
   fUser.Remove(0,fUser.Index(":")+1);

   TString fNmet;
   fNmet = TString((const char *)strtok(0," "));
   strtmp.ReplaceAll(fNmet,"");
   fNmet.Remove(0,fNmet.Index(":")+1);

   if (tmp) delete[] tmp;

   fNumMethods = atoi(fNmet.Data());
   Int_t i = 0;
   for (; i < fNumMethods; i++) {
      TString det = strtmp;
      det.Remove(0,det.Index("'")+1);
      det.Resize(det.Index("'"));
      // Remove leading spaces, if
      char cmet[2];
      sscanf(det.Data(),"%s",cmet);
      Int_t met = atoi(cmet);
      if (met > -1 && met < kMAXSEC) {
         det.ReplaceAll(cmet,"");
         while (det.First(' ') == 0)
            det.Remove(0,1);
         while (det.Last(' ') == (det.Length() - 1))
            det.Resize(det.Length() - 1);
         fMethods[i] = met;
         fSuccess[i] = 0;
         fFailure[i] = 0;
         fDetails[i] = det;
      }
      strtmp.Remove(0,strtmp.Index("'",strtmp.Index("'")+1)+1);
   }
   for (i = fNumMethods; i < kMAXSEC ; i++) {
      fMethods[i] = -1;
      fSuccess[i] = -1;
      fFailure[i] = -1;
   }

   // List of TSecContext
   fSecContexts = new TList;

   // Active when created
   fActive = kTRUE;
}


//______________________________________________________________________________
THostAuth::THostAuth(THostAuth &ha) : TObject()
{
   // Copy ctor ...

   fHost = ha.fHost;
   fServer = ha.fServer;
   fUser = ha.fUser;
   fNumMethods  = ha.fNumMethods;
   Int_t i = 0;
   for (; i < kMAXSEC; i++) {
      fMethods[i] = ha.fMethods[i];
      fSuccess[i] = ha.fSuccess[i];
      fFailure[i] = ha.fFailure[i];
      fDetails[i] = ha.fDetails[i];
   }
   fSecContexts = ha.Established();
   fActive = ha.fActive;
}

//______________________________________________________________________________
void  THostAuth::AddMethod(Int_t meth, const char *details)
{
   // Add method to the list. If already there, change its
   // details to 'details'

   // Check 'meth'
   if (meth < 0 || meth >= kMAXSEC) return;

   // If already there, set details and return
   if (HasMethod(meth)) {
      SetDetails(meth,details);
      return;
   }

   // This is a new method
   fMethods[fNumMethods] = meth;
   fSuccess[fNumMethods] = 0;
   fFailure[fNumMethods] = 0;
   if (details && strlen(details) > 0) {
      fDetails[fNumMethods] = details;
   } else {
      // Use default instead
      char *tmp = TAuthenticate::GetDefaultDetails(meth,0,fUser);
      fDetails[fNumMethods] = (const char *)tmp;
      delete[] tmp;
   }

   // Increment total number
   fNumMethods++;

   if (gDebug > 3) Print();
}

//______________________________________________________________________________
void  THostAuth::RemoveMethod(Int_t meth)
{
   // Remove method 'meth' from the list, if there ...

   // If we don't have it, nothing to do
   Int_t pos = -1;
   if (!HasMethod(meth,&pos)) return;

   // Now rescale info
   Int_t i = 0, k = 0;
   for (; i < fNumMethods; i++) {
      if (i != pos) {
         fMethods[k] = fMethods[i];
         fSuccess[k] = fSuccess[i];
         fFailure[k] = fFailure[i];
         fDetails[k] = fDetails[i];
         k++;
      }
   }

   // Decrement total number
   fNumMethods--;

   // Free last position
   fMethods[fNumMethods] = -1;
   fSuccess[fNumMethods] = -1;
   fFailure[fNumMethods] = -1;
   fDetails[fNumMethods].Resize(0);

   if (gDebug > 3) Print();
}

//______________________________________________________________________________
void  THostAuth::Reset()
{
   // Remove all methods, leaving Active status and
   // list of associted TSceContexts unchanged

   // Free all filled positions
   Int_t i = 0;
   for (; i < fNumMethods; i++) {
      fMethods[i] = -1;
      fSuccess[i] = -1;
      fFailure[i] = -1;
      fDetails[i].Resize(0);
   }

   // Set total number to 0
   fNumMethods = 0;
}

//______________________________________________________________________________
THostAuth::~THostAuth()
{
   // The dtor.

   delete    fSecContexts;
}

//______________________________________________________________________________
const char *THostAuth::GetDetails(Int_t level)
{
   // Return authentication details for specified level
   // or "" if the specified level does not exist for this host.

   Int_t i = -1;
   if (HasMethod(level,&i)) {
      if (gDebug > 3)
         Info("GetDetails"," %d: returning fDetails[%d]: %s",
              level,i,fDetails[i].Data());
      return fDetails[i];
   }
   static const char *empty = " ";
   return empty;
}

//______________________________________________________________________________
Bool_t THostAuth::HasMethod(Int_t level, Int_t *pos)
{
   // Return kTRUE if method 'level' is in the list

   int i;
   for (i = 0; i < fNumMethods; i++) {
      if (fMethods[i] == level) {
         if (pos) *pos = i;
         return kTRUE;
      }
   }
   if (pos) *pos = -1;
   return kFALSE;
}

//______________________________________________________________________________
void THostAuth::SetDetails(Int_t level, const char *details)
{
   // Set authentication details for specified level.

   Int_t i = -1;
   if (HasMethod(level,&i)) {
      if (details && strlen(details) > 0) {
         fDetails[i] = details;
      } else {
         // Use default instead
         char *tmp = TAuthenticate::GetDefaultDetails(level,0,fUser);
         fDetails[i] = (const char *)tmp;
         delete[] tmp;
      }
   } else {
      // Add new method ...
      AddMethod(level, details);
   }
}

//______________________________________________________________________________
void THostAuth::Print(Option_t *proc) const
{
   // Print object content.

   char srvnam[5][8] = { "any", "sockd", "rootd", "proofd", "???" };

   Int_t isrv = (fServer >= -1 && fServer <= TSocket::kPROOFD) ?
      fServer+1 : TSocket::kPROOFD+2;

   Info("Print",
        "%s +------------------------------------------------------------------+",proc);
   Info("Print","%s + Host:%s - srv:%s - User:%s - # of available methods:%d",
        proc, fHost.Data(), srvnam[isrv], fUser.Data(), fNumMethods);
   int i = 0;
   for (i = 0; i < fNumMethods; i++){
      Info("Print","%s + Method: %d (%s) Ok:%d Ko:%d Dets:%s", proc,
           fMethods[i],TAuthenticate::GetAuthMethod(fMethods[i]),
           fSuccess[i], fFailure[i], fDetails[i].Data());
   }
   Info("Print",
        "%s +------------------------------------------------------------------+",proc);
}

//______________________________________________________________________________
void THostAuth::PrintEstablished() const
{
   // Print info about established authentication vis-a-vis of this Host.

   Info("PrintEstablished",
        "+------------------------------------------------------------------------------+");
   Info("PrintEstablished","+ Host:%s - Number of active sec contexts: %d",
        fHost.Data(), fSecContexts->GetSize());

   // Check list
   if (fSecContexts->GetSize()>0) {
      TIter next(fSecContexts);
      TSecContext *ctx = 0;
      Int_t k = 1;
      while ((ctx = (TSecContext *) next())) {
         TString opt;
         opt += k++;
         ctx->Print(opt);
      }
   }
   Info("PrintEstablished",
        "+------------------------------------------------------------------------------+");
}

//______________________________________________________________________________
void  THostAuth::ReOrder(Int_t nmet, Int_t *fmet)
{
   // Reorder nmet methods according fmet[nmet]

   // Temporary arrays
   Int_t   tMethods[kMAXSEC];
   Int_t   tSuccess[kMAXSEC];
   Int_t   tFailure[kMAXSEC];
   TString tDetails[kMAXSEC];
   Int_t   flag[kMAXSEC] = {0};

   // Copy info in the new order
   Int_t j = 0;
   for ( ; j < nmet; j++) {
      Int_t i = -1;
      if (HasMethod(fmet[j],&i)) {
         tMethods[j] = fMethods[i];
         tSuccess[j] = fSuccess[i];
         tFailure[j] = fFailure[i];
         tDetails[j] = fDetails[i];
         flag[i]++;
      } else if (fmet[j] >= 0 && fmet[j] < kMAXSEC) {
         tMethods[j] = fmet[j];
         tSuccess[j] = 0;
         tFailure[j] = 0;
         char *tmp = TAuthenticate::GetDefaultDetails(fmet[j],0,fUser);
         tDetails[j] = (const char *)tmp;
         delete[] tmp;
      } else {
         Warning("ReOrder","Method id out of range (%d) - skipping",fmet[j]);
      }
   }

   // Add existing methods not listed ... if any
   Int_t k = nmet, i = 0;
   for(; i < fNumMethods; i++){
      if (flag[i] == 0) {
         tMethods[k] = fMethods[i];
         tSuccess[k] = fSuccess[i];
         tFailure[k] = fFailure[i];
         tDetails[k] = fDetails[i];
         k++;
         flag[i] = 1;
      }
   }

   // Restore from temporary
   fNumMethods = k;
   for (i = 0; i < fNumMethods; i++) {
      fMethods[i] = tMethods[i];
      fSuccess[i] = tSuccess[i];
      fFailure[i] = tFailure[i];
      fDetails[i] = tDetails[i];
   }

   if (gDebug > 3) Print();
}

//______________________________________________________________________________
void  THostAuth::Update(THostAuth *ha)
{
   // Update info with the one in ha
   // Remaining methods, if any, get lower priority

   // Temporary arrays
   Int_t   tNumMethods = fNumMethods;
   Int_t   tMethods[kMAXSEC];
   Int_t   tSuccess[kMAXSEC];
   Int_t   tFailure[kMAXSEC];
   TString tDetails[kMAXSEC];

   // Save existing info in temporary arrays
   Int_t i = 0;
   for ( ; i < fNumMethods; i++) {
      tMethods[i] = fMethods[i];
      tSuccess[i] = fSuccess[i];
      tFailure[i] = fFailure[i];
      tDetails[i] = fDetails[i];
   }

   // Reset
   Reset();

   // Get ha content in
   for(i = 0; i < ha->NumMethods(); i++){
      fMethods[i] = ha->GetMethod(i);
      fSuccess[i] = ha->GetSuccess(i);
      fFailure[i] = ha->GetFailure(i);
      fDetails[i] = ha->GetDetailsByIdx(i);
   }

   // Set new tmp size
   fNumMethods = ha->NumMethods();

   // Add remaining methods with low priority
   if (fNumMethods < kMAXSEC) {
      for (i = 0; i < tNumMethods; i++) {
         if (!HasMethod(tMethods[i]) && fNumMethods < kMAXSEC) {
            fMethods[fNumMethods] = tMethods[i];
            fSuccess[fNumMethods] = tSuccess[i];
            fFailure[fNumMethods] = tFailure[i];
            fDetails[fNumMethods] = tDetails[i];
            fNumMethods++;
         }
      }
   }
   if (gDebug > 3) Print();
}

//______________________________________________________________________________
void  THostAuth::SetFirst(Int_t method)
{
   // Set 'method' to be the first used (if in the list ...).

   Int_t i = -1;
   if (HasMethod(method,&i)) {

      Int_t tMe = fMethods[i];
      Int_t tSu = fSuccess[i];
      Int_t tFa = fFailure[i];
      TString tDe = fDetails[i];

      // Rescale methods
      Int_t j = i;
      for (; j > 0; j--) {
         fMethods[j] = fMethods[j-1];
         fSuccess[j] = fSuccess[j-1];
         fFailure[j] = fFailure[j-1];
         fDetails[j] = fDetails[j-1];
      }

      // The saved method first
      fMethods[0] = tMe;
      fSuccess[0] = tSu;
      fFailure[0] = tFa;
      fDetails[0] = tDe;
   }

   if (gDebug > 3) Print();
}

//______________________________________________________________________________
void THostAuth::SetLast(Int_t method)
{
   // Set 'method' to be the last used (if in the list ...).

   Int_t i = -1;
   if (HasMethod(method,&i)) {

      Int_t tMe = fMethods[i];
      Int_t tSu = fSuccess[i];
      Int_t tFa = fFailure[i];
      TString tDe = fDetails[i];

      // Rescale methods
      Int_t j = i;
      for (; j < (fNumMethods - 1); j++) {
         fMethods[j] = fMethods[j+1];
         fSuccess[j] = fSuccess[j+1];
         fFailure[j] = fFailure[j+1];
         fDetails[j] = fDetails[j+1];
      }

      // The saved method first
      Int_t lp = fNumMethods - 1;
      fMethods[lp] = tMe;
      fSuccess[lp] = tSu;
      fFailure[lp] = tFa;
      fDetails[lp] = tDe;
   }

   if (gDebug > 3) Print();
}

//______________________________________________________________________________
void THostAuth::AddFirst(Int_t level, const char *details)
{
   // Add new method in first position
   // If already in the list, set as first method 'level' with
   // authentication 'details'.
   // Faster then AddMethod(method,details)+SetFirst(method).

   Int_t i = -1;
   if (HasMethod(level,&i)) {
      if (i > 0) {
         SetDetails(level, details);
         SetFirst(level);
      }
      if (gDebug > 3) Print();
      return;
   }

   // Rescale methods
   for (i = fNumMethods; i > 0; i--) {
      fMethods[i] = fMethods[i-1];
      fSuccess[i] = fSuccess[i-1];
      fFailure[i] = fFailure[i-1];
      fDetails[i] = fDetails[i-1];
   }

   // This method first
   fMethods[0] = level;
   fSuccess[0] = 0;
   fFailure[0] = 0;
   if (details && strlen(details) > 0) {
      fDetails[0] = details;
   } else {
      // Use default instead
      char *tmp = TAuthenticate::GetDefaultDetails(level,0,fUser);
      fDetails[0] = (const char *)tmp;
      delete[] tmp;
   }

   // Increment total number
   fNumMethods++;

   if (gDebug > 3) Print();
}


//______________________________________________________________________________
void THostAuth::CountSuccess(Int_t method)
{
   // Count successes for 'method'

   int i;
   for (i = 0; i < fNumMethods; i++) {
      if (fMethods[i] == method) {
         fSuccess[i]++;
         break;
      }
   }
}

//______________________________________________________________________________
void THostAuth::CountFailure(Int_t method)
{
   // Count failures for 'method'

   int i;
   for (i = 0; i < fNumMethods; i++) {
      if (fMethods[i] == method) {
         fFailure[i]++;
         break;
      }
   }
}

//______________________________________________________________________________
TRootSecContext *THostAuth::CreateSecContext(const char *user, const char *host,
                                             Int_t meth, Int_t offset,
                                             const char *details, const char *token,
                                             TDatime expdate, void *sctx, Int_t key)
{
   // Create a Security context and add it to local list
   // Return pointer to it to be stored in TAuthenticate

   TRootSecContext *ctx = new TRootSecContext(user, host, meth, offset, details,
                                              token, expdate, sctx, key);
   // Add it also to the local list if active
   if (ctx->IsActive())
      fSecContexts->Add(ctx);

   return ctx;

}

//______________________________________________________________________________
void THostAuth::AsString(TString &Out) const
{
   // Return a static string with all info in a serialized form

   Out = Form("h:%s u:%s n:%d",GetHost(),GetUser(),fNumMethods);

   Int_t i = 0;
   for (; i < fNumMethods; i++) {
      Out += TString(Form(" '%d %s'",fMethods[i],fDetails[i].Data()));
   }

}
 THostAuth.cxx:1
 THostAuth.cxx:2
 THostAuth.cxx:3
 THostAuth.cxx:4
 THostAuth.cxx:5
 THostAuth.cxx:6
 THostAuth.cxx:7
 THostAuth.cxx:8
 THostAuth.cxx:9
 THostAuth.cxx:10
 THostAuth.cxx:11
 THostAuth.cxx:12
 THostAuth.cxx:13
 THostAuth.cxx:14
 THostAuth.cxx:15
 THostAuth.cxx:16
 THostAuth.cxx:17
 THostAuth.cxx:18
 THostAuth.cxx:19
 THostAuth.cxx:20
 THostAuth.cxx:21
 THostAuth.cxx:22
 THostAuth.cxx:23
 THostAuth.cxx:24
 THostAuth.cxx:25
 THostAuth.cxx:26
 THostAuth.cxx:27
 THostAuth.cxx:28
 THostAuth.cxx:29
 THostAuth.cxx:30
 THostAuth.cxx:31
 THostAuth.cxx:32
 THostAuth.cxx:33
 THostAuth.cxx:34
 THostAuth.cxx:35
 THostAuth.cxx:36
 THostAuth.cxx:37
 THostAuth.cxx:38
 THostAuth.cxx:39
 THostAuth.cxx:40
 THostAuth.cxx:41
 THostAuth.cxx:42
 THostAuth.cxx:43
 THostAuth.cxx:44
 THostAuth.cxx:45
 THostAuth.cxx:46
 THostAuth.cxx:47
 THostAuth.cxx:48
 THostAuth.cxx:49
 THostAuth.cxx:50
 THostAuth.cxx:51
 THostAuth.cxx:52
 THostAuth.cxx:53
 THostAuth.cxx:54
 THostAuth.cxx:55
 THostAuth.cxx:56
 THostAuth.cxx:57
 THostAuth.cxx:58
 THostAuth.cxx:59
 THostAuth.cxx:60
 THostAuth.cxx:61
 THostAuth.cxx:62
 THostAuth.cxx:63
 THostAuth.cxx:64
 THostAuth.cxx:65
 THostAuth.cxx:66
 THostAuth.cxx:67
 THostAuth.cxx:68
 THostAuth.cxx:69
 THostAuth.cxx:70
 THostAuth.cxx:71
 THostAuth.cxx:72
 THostAuth.cxx:73
 THostAuth.cxx:74
 THostAuth.cxx:75
 THostAuth.cxx:76
 THostAuth.cxx:77
 THostAuth.cxx:78
 THostAuth.cxx:79
 THostAuth.cxx:80
 THostAuth.cxx:81
 THostAuth.cxx:82
 THostAuth.cxx:83
 THostAuth.cxx:84
 THostAuth.cxx:85
 THostAuth.cxx:86
 THostAuth.cxx:87
 THostAuth.cxx:88
 THostAuth.cxx:89
 THostAuth.cxx:90
 THostAuth.cxx:91
 THostAuth.cxx:92
 THostAuth.cxx:93
 THostAuth.cxx:94
 THostAuth.cxx:95
 THostAuth.cxx:96
 THostAuth.cxx:97
 THostAuth.cxx:98
 THostAuth.cxx:99
 THostAuth.cxx:100
 THostAuth.cxx:101
 THostAuth.cxx:102
 THostAuth.cxx:103
 THostAuth.cxx:104
 THostAuth.cxx:105
 THostAuth.cxx:106
 THostAuth.cxx:107
 THostAuth.cxx:108
 THostAuth.cxx:109
 THostAuth.cxx:110
 THostAuth.cxx:111
 THostAuth.cxx:112
 THostAuth.cxx:113
 THostAuth.cxx:114
 THostAuth.cxx:115
 THostAuth.cxx:116
 THostAuth.cxx:117
 THostAuth.cxx:118
 THostAuth.cxx:119
 THostAuth.cxx:120
 THostAuth.cxx:121
 THostAuth.cxx:122
 THostAuth.cxx:123
 THostAuth.cxx:124
 THostAuth.cxx:125
 THostAuth.cxx:126
 THostAuth.cxx:127
 THostAuth.cxx:128
 THostAuth.cxx:129
 THostAuth.cxx:130
 THostAuth.cxx:131
 THostAuth.cxx:132
 THostAuth.cxx:133
 THostAuth.cxx:134
 THostAuth.cxx:135
 THostAuth.cxx:136
 THostAuth.cxx:137
 THostAuth.cxx:138
 THostAuth.cxx:139
 THostAuth.cxx:140
 THostAuth.cxx:141
 THostAuth.cxx:142
 THostAuth.cxx:143
 THostAuth.cxx:144
 THostAuth.cxx:145
 THostAuth.cxx:146
 THostAuth.cxx:147
 THostAuth.cxx:148
 THostAuth.cxx:149
 THostAuth.cxx:150
 THostAuth.cxx:151
 THostAuth.cxx:152
 THostAuth.cxx:153
 THostAuth.cxx:154
 THostAuth.cxx:155
 THostAuth.cxx:156
 THostAuth.cxx:157
 THostAuth.cxx:158
 THostAuth.cxx:159
 THostAuth.cxx:160
 THostAuth.cxx:161
 THostAuth.cxx:162
 THostAuth.cxx:163
 THostAuth.cxx:164
 THostAuth.cxx:165
 THostAuth.cxx:166
 THostAuth.cxx:167
 THostAuth.cxx:168
 THostAuth.cxx:169
 THostAuth.cxx:170
 THostAuth.cxx:171
 THostAuth.cxx:172
 THostAuth.cxx:173
 THostAuth.cxx:174
 THostAuth.cxx:175
 THostAuth.cxx:176
 THostAuth.cxx:177
 THostAuth.cxx:178
 THostAuth.cxx:179
 THostAuth.cxx:180
 THostAuth.cxx:181
 THostAuth.cxx:182
 THostAuth.cxx:183
 THostAuth.cxx:184
 THostAuth.cxx:185
 THostAuth.cxx:186
 THostAuth.cxx:187
 THostAuth.cxx:188
 THostAuth.cxx:189
 THostAuth.cxx:190
 THostAuth.cxx:191
 THostAuth.cxx:192
 THostAuth.cxx:193
 THostAuth.cxx:194
 THostAuth.cxx:195
 THostAuth.cxx:196
 THostAuth.cxx:197
 THostAuth.cxx:198
 THostAuth.cxx:199
 THostAuth.cxx:200
 THostAuth.cxx:201
 THostAuth.cxx:202
 THostAuth.cxx:203
 THostAuth.cxx:204
 THostAuth.cxx:205
 THostAuth.cxx:206
 THostAuth.cxx:207
 THostAuth.cxx:208
 THostAuth.cxx:209
 THostAuth.cxx:210
 THostAuth.cxx:211
 THostAuth.cxx:212
 THostAuth.cxx:213
 THostAuth.cxx:214
 THostAuth.cxx:215
 THostAuth.cxx:216
 THostAuth.cxx:217
 THostAuth.cxx:218
 THostAuth.cxx:219
 THostAuth.cxx:220
 THostAuth.cxx:221
 THostAuth.cxx:222
 THostAuth.cxx:223
 THostAuth.cxx:224
 THostAuth.cxx:225
 THostAuth.cxx:226
 THostAuth.cxx:227
 THostAuth.cxx:228
 THostAuth.cxx:229
 THostAuth.cxx:230
 THostAuth.cxx:231
 THostAuth.cxx:232
 THostAuth.cxx:233
 THostAuth.cxx:234
 THostAuth.cxx:235
 THostAuth.cxx:236
 THostAuth.cxx:237
 THostAuth.cxx:238
 THostAuth.cxx:239
 THostAuth.cxx:240
 THostAuth.cxx:241
 THostAuth.cxx:242
 THostAuth.cxx:243
 THostAuth.cxx:244
 THostAuth.cxx:245
 THostAuth.cxx:246
 THostAuth.cxx:247
 THostAuth.cxx:248
 THostAuth.cxx:249
 THostAuth.cxx:250
 THostAuth.cxx:251
 THostAuth.cxx:252
 THostAuth.cxx:253
 THostAuth.cxx:254
 THostAuth.cxx:255
 THostAuth.cxx:256
 THostAuth.cxx:257
 THostAuth.cxx:258
 THostAuth.cxx:259
 THostAuth.cxx:260
 THostAuth.cxx:261
 THostAuth.cxx:262
 THostAuth.cxx:263
 THostAuth.cxx:264
 THostAuth.cxx:265
 THostAuth.cxx:266
 THostAuth.cxx:267
 THostAuth.cxx:268
 THostAuth.cxx:269
 THostAuth.cxx:270
 THostAuth.cxx:271
 THostAuth.cxx:272
 THostAuth.cxx:273
 THostAuth.cxx:274
 THostAuth.cxx:275
 THostAuth.cxx:276
 THostAuth.cxx:277
 THostAuth.cxx:278
 THostAuth.cxx:279
 THostAuth.cxx:280
 THostAuth.cxx:281
 THostAuth.cxx:282
 THostAuth.cxx:283
 THostAuth.cxx:284
 THostAuth.cxx:285
 THostAuth.cxx:286
 THostAuth.cxx:287
 THostAuth.cxx:288
 THostAuth.cxx:289
 THostAuth.cxx:290
 THostAuth.cxx:291
 THostAuth.cxx:292
 THostAuth.cxx:293
 THostAuth.cxx:294
 THostAuth.cxx:295
 THostAuth.cxx:296
 THostAuth.cxx:297
 THostAuth.cxx:298
 THostAuth.cxx:299
 THostAuth.cxx:300
 THostAuth.cxx:301
 THostAuth.cxx:302
 THostAuth.cxx:303
 THostAuth.cxx:304
 THostAuth.cxx:305
 THostAuth.cxx:306
 THostAuth.cxx:307
 THostAuth.cxx:308
 THostAuth.cxx:309
 THostAuth.cxx:310
 THostAuth.cxx:311
 THostAuth.cxx:312
 THostAuth.cxx:313
 THostAuth.cxx:314
 THostAuth.cxx:315
 THostAuth.cxx:316
 THostAuth.cxx:317
 THostAuth.cxx:318
 THostAuth.cxx:319
 THostAuth.cxx:320
 THostAuth.cxx:321
 THostAuth.cxx:322
 THostAuth.cxx:323
 THostAuth.cxx:324
 THostAuth.cxx:325
 THostAuth.cxx:326
 THostAuth.cxx:327
 THostAuth.cxx:328
 THostAuth.cxx:329
 THostAuth.cxx:330
 THostAuth.cxx:331
 THostAuth.cxx:332
 THostAuth.cxx:333
 THostAuth.cxx:334
 THostAuth.cxx:335
 THostAuth.cxx:336
 THostAuth.cxx:337
 THostAuth.cxx:338
 THostAuth.cxx:339
 THostAuth.cxx:340
 THostAuth.cxx:341
 THostAuth.cxx:342
 THostAuth.cxx:343
 THostAuth.cxx:344
 THostAuth.cxx:345
 THostAuth.cxx:346
 THostAuth.cxx:347
 THostAuth.cxx:348
 THostAuth.cxx:349
 THostAuth.cxx:350
 THostAuth.cxx:351
 THostAuth.cxx:352
 THostAuth.cxx:353
 THostAuth.cxx:354
 THostAuth.cxx:355
 THostAuth.cxx:356
 THostAuth.cxx:357
 THostAuth.cxx:358
 THostAuth.cxx:359
 THostAuth.cxx:360
 THostAuth.cxx:361
 THostAuth.cxx:362
 THostAuth.cxx:363
 THostAuth.cxx:364
 THostAuth.cxx:365
 THostAuth.cxx:366
 THostAuth.cxx:367
 THostAuth.cxx:368
 THostAuth.cxx:369
 THostAuth.cxx:370
 THostAuth.cxx:371
 THostAuth.cxx:372
 THostAuth.cxx:373
 THostAuth.cxx:374
 THostAuth.cxx:375
 THostAuth.cxx:376
 THostAuth.cxx:377
 THostAuth.cxx:378
 THostAuth.cxx:379
 THostAuth.cxx:380
 THostAuth.cxx:381
 THostAuth.cxx:382
 THostAuth.cxx:383
 THostAuth.cxx:384
 THostAuth.cxx:385
 THostAuth.cxx:386
 THostAuth.cxx:387
 THostAuth.cxx:388
 THostAuth.cxx:389
 THostAuth.cxx:390
 THostAuth.cxx:391
 THostAuth.cxx:392
 THostAuth.cxx:393
 THostAuth.cxx:394
 THostAuth.cxx:395
 THostAuth.cxx:396
 THostAuth.cxx:397
 THostAuth.cxx:398
 THostAuth.cxx:399
 THostAuth.cxx:400
 THostAuth.cxx:401
 THostAuth.cxx:402
 THostAuth.cxx:403
 THostAuth.cxx:404
 THostAuth.cxx:405
 THostAuth.cxx:406
 THostAuth.cxx:407
 THostAuth.cxx:408
 THostAuth.cxx:409
 THostAuth.cxx:410
 THostAuth.cxx:411
 THostAuth.cxx:412
 THostAuth.cxx:413
 THostAuth.cxx:414
 THostAuth.cxx:415
 THostAuth.cxx:416
 THostAuth.cxx:417
 THostAuth.cxx:418
 THostAuth.cxx:419
 THostAuth.cxx:420
 THostAuth.cxx:421
 THostAuth.cxx:422
 THostAuth.cxx:423
 THostAuth.cxx:424
 THostAuth.cxx:425
 THostAuth.cxx:426
 THostAuth.cxx:427
 THostAuth.cxx:428
 THostAuth.cxx:429
 THostAuth.cxx:430
 THostAuth.cxx:431
 THostAuth.cxx:432
 THostAuth.cxx:433
 THostAuth.cxx:434
 THostAuth.cxx:435
 THostAuth.cxx:436
 THostAuth.cxx:437
 THostAuth.cxx:438
 THostAuth.cxx:439
 THostAuth.cxx:440
 THostAuth.cxx:441
 THostAuth.cxx:442
 THostAuth.cxx:443
 THostAuth.cxx:444
 THostAuth.cxx:445
 THostAuth.cxx:446
 THostAuth.cxx:447
 THostAuth.cxx:448
 THostAuth.cxx:449
 THostAuth.cxx:450
 THostAuth.cxx:451
 THostAuth.cxx:452
 THostAuth.cxx:453
 THostAuth.cxx:454
 THostAuth.cxx:455
 THostAuth.cxx:456
 THostAuth.cxx:457
 THostAuth.cxx:458
 THostAuth.cxx:459
 THostAuth.cxx:460
 THostAuth.cxx:461
 THostAuth.cxx:462
 THostAuth.cxx:463
 THostAuth.cxx:464
 THostAuth.cxx:465
 THostAuth.cxx:466
 THostAuth.cxx:467
 THostAuth.cxx:468
 THostAuth.cxx:469
 THostAuth.cxx:470
 THostAuth.cxx:471
 THostAuth.cxx:472
 THostAuth.cxx:473
 THostAuth.cxx:474
 THostAuth.cxx:475
 THostAuth.cxx:476
 THostAuth.cxx:477
 THostAuth.cxx:478
 THostAuth.cxx:479
 THostAuth.cxx:480
 THostAuth.cxx:481
 THostAuth.cxx:482
 THostAuth.cxx:483
 THostAuth.cxx:484
 THostAuth.cxx:485
 THostAuth.cxx:486
 THostAuth.cxx:487
 THostAuth.cxx:488
 THostAuth.cxx:489
 THostAuth.cxx:490
 THostAuth.cxx:491
 THostAuth.cxx:492
 THostAuth.cxx:493
 THostAuth.cxx:494
 THostAuth.cxx:495
 THostAuth.cxx:496
 THostAuth.cxx:497
 THostAuth.cxx:498
 THostAuth.cxx:499
 THostAuth.cxx:500
 THostAuth.cxx:501
 THostAuth.cxx:502
 THostAuth.cxx:503
 THostAuth.cxx:504
 THostAuth.cxx:505
 THostAuth.cxx:506
 THostAuth.cxx:507
 THostAuth.cxx:508
 THostAuth.cxx:509
 THostAuth.cxx:510
 THostAuth.cxx:511
 THostAuth.cxx:512
 THostAuth.cxx:513
 THostAuth.cxx:514
 THostAuth.cxx:515
 THostAuth.cxx:516
 THostAuth.cxx:517
 THostAuth.cxx:518
 THostAuth.cxx:519
 THostAuth.cxx:520
 THostAuth.cxx:521
 THostAuth.cxx:522
 THostAuth.cxx:523
 THostAuth.cxx:524
 THostAuth.cxx:525
 THostAuth.cxx:526
 THostAuth.cxx:527
 THostAuth.cxx:528
 THostAuth.cxx:529
 THostAuth.cxx:530
 THostAuth.cxx:531
 THostAuth.cxx:532
 THostAuth.cxx:533
 THostAuth.cxx:534
 THostAuth.cxx:535
 THostAuth.cxx:536
 THostAuth.cxx:537
 THostAuth.cxx:538
 THostAuth.cxx:539
 THostAuth.cxx:540
 THostAuth.cxx:541
 THostAuth.cxx:542
 THostAuth.cxx:543
 THostAuth.cxx:544
 THostAuth.cxx:545
 THostAuth.cxx:546
 THostAuth.cxx:547
 THostAuth.cxx:548
 THostAuth.cxx:549
 THostAuth.cxx:550
 THostAuth.cxx:551
 THostAuth.cxx:552
 THostAuth.cxx:553
 THostAuth.cxx:554
 THostAuth.cxx:555
 THostAuth.cxx:556
 THostAuth.cxx:557
 THostAuth.cxx:558
 THostAuth.cxx:559
 THostAuth.cxx:560
 THostAuth.cxx:561
 THostAuth.cxx:562
 THostAuth.cxx:563
 THostAuth.cxx:564
 THostAuth.cxx:565
 THostAuth.cxx:566
 THostAuth.cxx:567
 THostAuth.cxx:568
 THostAuth.cxx:569
 THostAuth.cxx:570
 THostAuth.cxx:571
 THostAuth.cxx:572
 THostAuth.cxx:573
 THostAuth.cxx:574
 THostAuth.cxx:575
 THostAuth.cxx:576
 THostAuth.cxx:577
 THostAuth.cxx:578
 THostAuth.cxx:579
 THostAuth.cxx:580
 THostAuth.cxx:581
 THostAuth.cxx:582
 THostAuth.cxx:583
 THostAuth.cxx:584
 THostAuth.cxx:585
 THostAuth.cxx:586
 THostAuth.cxx:587
 THostAuth.cxx:588
 THostAuth.cxx:589
 THostAuth.cxx:590
 THostAuth.cxx:591
 THostAuth.cxx:592
 THostAuth.cxx:593
 THostAuth.cxx:594
 THostAuth.cxx:595
 THostAuth.cxx:596
 THostAuth.cxx:597
 THostAuth.cxx:598
 THostAuth.cxx:599
 THostAuth.cxx:600
 THostAuth.cxx:601
 THostAuth.cxx:602
 THostAuth.cxx:603
 THostAuth.cxx:604
 THostAuth.cxx:605
 THostAuth.cxx:606
 THostAuth.cxx:607
 THostAuth.cxx:608
 THostAuth.cxx:609
 THostAuth.cxx:610
 THostAuth.cxx:611
 THostAuth.cxx:612
 THostAuth.cxx:613
 THostAuth.cxx:614
 THostAuth.cxx:615
 THostAuth.cxx:616
 THostAuth.cxx:617
 THostAuth.cxx:618
 THostAuth.cxx:619
 THostAuth.cxx:620
 THostAuth.cxx:621
 THostAuth.cxx:622
 THostAuth.cxx:623
 THostAuth.cxx:624
 THostAuth.cxx:625
 THostAuth.cxx:626
 THostAuth.cxx:627
 THostAuth.cxx:628
 THostAuth.cxx:629
 THostAuth.cxx:630
 THostAuth.cxx:631
 THostAuth.cxx:632
 THostAuth.cxx:633
 THostAuth.cxx:634
 THostAuth.cxx:635
 THostAuth.cxx:636
 THostAuth.cxx:637
 THostAuth.cxx:638
 THostAuth.cxx:639
 THostAuth.cxx:640
 THostAuth.cxx:641
 THostAuth.cxx:642
 THostAuth.cxx:643
 THostAuth.cxx:644
 THostAuth.cxx:645
 THostAuth.cxx:646
 THostAuth.cxx:647
 THostAuth.cxx:648
 THostAuth.cxx:649
 THostAuth.cxx:650
 THostAuth.cxx:651
 THostAuth.cxx:652
 THostAuth.cxx:653
 THostAuth.cxx:654
 THostAuth.cxx:655
 THostAuth.cxx:656
 THostAuth.cxx:657
 THostAuth.cxx:658
 THostAuth.cxx:659
 THostAuth.cxx:660
 THostAuth.cxx:661
 THostAuth.cxx:662
 THostAuth.cxx:663
 THostAuth.cxx:664
 THostAuth.cxx:665
 THostAuth.cxx:666
 THostAuth.cxx:667
 THostAuth.cxx:668
 THostAuth.cxx:669
 THostAuth.cxx:670
 THostAuth.cxx:671
 THostAuth.cxx:672
 THostAuth.cxx:673
 THostAuth.cxx:674
 THostAuth.cxx:675
 THostAuth.cxx:676
 THostAuth.cxx:677
 THostAuth.cxx:678
 THostAuth.cxx:679
 THostAuth.cxx:680
 THostAuth.cxx:681
 THostAuth.cxx:682
 THostAuth.cxx:683
 THostAuth.cxx:684
 THostAuth.cxx:685
 THostAuth.cxx:686
 THostAuth.cxx:687
 THostAuth.cxx:688
 THostAuth.cxx:689
 THostAuth.cxx:690
 THostAuth.cxx:691
 THostAuth.cxx:692
 THostAuth.cxx:693
 THostAuth.cxx:694
 THostAuth.cxx:695
 THostAuth.cxx:696
 THostAuth.cxx:697
 THostAuth.cxx:698
 THostAuth.cxx:699
 THostAuth.cxx:700
 THostAuth.cxx:701
 THostAuth.cxx:702
 THostAuth.cxx:703
 THostAuth.cxx:704
 THostAuth.cxx:705
 THostAuth.cxx:706
 THostAuth.cxx:707
 THostAuth.cxx:708
 THostAuth.cxx:709
 THostAuth.cxx:710
 THostAuth.cxx:711
 THostAuth.cxx:712
 THostAuth.cxx:713
 THostAuth.cxx:714
 THostAuth.cxx:715
 THostAuth.cxx:716
 THostAuth.cxx:717
 THostAuth.cxx:718
 THostAuth.cxx:719
 THostAuth.cxx:720
 THostAuth.cxx:721
 THostAuth.cxx:722
 THostAuth.cxx:723
 THostAuth.cxx:724
 THostAuth.cxx:725
 THostAuth.cxx:726
 THostAuth.cxx:727
 THostAuth.cxx:728
 THostAuth.cxx:729
 THostAuth.cxx:730
 THostAuth.cxx:731
 THostAuth.cxx:732
 THostAuth.cxx:733
 THostAuth.cxx:734
 THostAuth.cxx:735
 THostAuth.cxx:736
 THostAuth.cxx:737
 THostAuth.cxx:738
 THostAuth.cxx:739
 THostAuth.cxx:740
 THostAuth.cxx:741
 THostAuth.cxx:742
 THostAuth.cxx:743
 THostAuth.cxx:744
 THostAuth.cxx:745
 THostAuth.cxx:746
 THostAuth.cxx:747
 THostAuth.cxx:748
 THostAuth.cxx:749
 THostAuth.cxx:750
 THostAuth.cxx:751