#include "XrdUser.h"
#include "XrdServer.h"
#include "XrdUser.c7"
#include "XrdFile.h"
#include "TPRegexp.h"
ClassImp(XrdUser);
void XrdUser::_init()
{
m_dict_id = 0;
bTraceMon = false;
}
XrdUser::XrdUser(const TString& n, const TString& t) :
ZList(n, t),
bNumericHost(false),
mLoginTime(GTime::I_Never), mDisconnectTime(GTime::I_Never), mLastMsgTime(GTime::I_Never)
{
_init();
}
XrdUser::XrdUser(const TString& n, const TString& t,
const TString& dn, const TString& vo, const TString& ro, const TString& gr,
const TString& su, const TString& fh, const TString& fd, Bool_t num_host,
const GTime& st) :
ZList(n, t),
mDN(dn), mVO(vo), mRole(ro), mGroup(gr),
mServerUsername(su), mFromHost(fh), mFromDomain(fd), bNumericHost(num_host),
mLoginTime(st), mDisconnectTime(GTime::I_Never), mLastMsgTime(GTime::I_Never)
{
_init();
mRealName = ParseHumanName(mDN);
}
XrdUser::~XrdUser()
{}
TString XrdUser::GetFromFqhn() const
{
if (bNumericHost)
return mFromHost + "@" + mFromDomain;
else
return mFromHost + "." + mFromDomain;
}
void XrdUser::AddFile(XrdFile* file)
{
Add(file);
}
void XrdUser::AppendAppInfo(const TString& app_info)
{
mAppInfo += app_info;
Stamp(FID());
}
TString XrdUser::ParseHumanName(const TString& dn)
{
static TPMERegexp re("/CN=(.*?)(?=(?:/CN=)|$)", "g");
static TPMERegexp numex("(.*) (\\d+)");
static TPMERegexp mail1("(.*) \\(?[\\w\\.]+@[\\w\\.]+\\(?");
static TPMERegexp mail2("(.*)/Email=[\\w\\.]+@[\\w\\.]+");
static GMutex re_mutex;
GMutexHolder _lck(re_mutex);
TString user;
while (re.Match(dn))
{
if (re.NMatches() == 2)
{
if (strncmp( "UID:", re[1].Data(), 4))
user = re[1].Data();
}
else
{
user = dn;
}
}
if (numex.Match(user))
user = numex[1].Data();
if (mail1.Match(user))
user = mail1[1].Data();
else if (mail2.Match(user))
user = mail2[1].Data();
return user;
}