//--------------------------------------------------
#include "TPSocket.h"

//
// This macro should be run together with authserv.C to test
// authentication between two remote ROOT sessions. 
// Run first the authserv.C within a ROOT session on the server
// machine, eg. "srv.machi.ne"; authserv accepts as argument
// the port wher it starts listening (default 3000).
// You can then run authclient.c in a ROOT session on the client
// machine:
//          root[] .x tutorials.C("srv.machi.ne:3000")
//
// and you should get prompted for the credentials, if the case.
// To start a parallel socket of size, for example, 5, enter the
// size as second argument, ie
//
//          root[] .x tutorials.C("srv.machi.ne:3000",5)
//

int authclient(const char *host = "up://localhost:3000", int sz = 0)
{
   Int_t par = (sz > 1) ? 1 : 0;

   // Parse protocol, if any
   TString proto(TUrl(host).GetProtocol());
   TString protosave = proto;

   // Get rid of authentication suffix
   TString asfx = proto;
   if (proto.EndsWith("up") || proto.EndsWith("ug")) {
      asfx.Remove(0,proto.Length()-2);
      proto.Resize(proto.Length()-2);
   } else if (proto.EndsWith("s") || proto.EndsWith("k") ||
              proto.EndsWith("g") || proto.EndsWith("h")) {
      asfx.Remove(0,proto.Length()-1);
      proto.Resize(proto.Length()-1);
   }

   // Force parallel (even of size 1)
   TString newurl = "p" + asfx;
   newurl += "://";
   if (strlen(TUrl(host).GetUser())) {
      newurl += TUrl(host).GetUser();
      newurl += "@";
   }
   newurl += TUrl(host).GetHost();
   newurl += ":";
   newurl += TUrl(host).GetPort();

   cout << "authclient: starting a (parallel) authenticated socket at "
        << newurl.Data() << " (size: " << sz << ")" << endl;

   TSocket *s = TSocket::CreateAuthSocket(newurl.Data(),sz);

   // Print out;
   if (s) 
      if (s->IsAuthenticated()) 
         cout << "authclient: auth socket: OK" << endl;
      else
         cout << "authclient: auth socket: failed" << endl;

   // Cleanup
   if (s) {
      // Remove this authentication from the token list to avoid
      // later warnings
      s->GetSecContext()->DeActivate("R");
      delete s;
   }
}
//--------------------------------------------------

