00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <XrdOuc/XrdOucErrInfo.hh>
00012 #include <XrdSys/XrdSysPthread.hh>
00013 #include <XrdOuc/XrdOucString.hh>
00014 #include <XrdOuc/XrdOucTokenizer.hh>
00015
00016 #include <XrdSec/XrdSecInterface.hh>
00017 #include <XrdSec/XrdSecTrace.hh>
00018
00019 #include <XrdSut/XrdSutPFEntry.hh>
00020 #include <XrdSut/XrdSutPFile.hh>
00021 #include <XrdSut/XrdSutBuffer.hh>
00022 #include <XrdSut/XrdSutRndm.hh>
00023
00024 #include <XrdCrypto/XrdCryptoAux.hh>
00025 #include <XrdCrypto/XrdCryptoCipher.hh>
00026 #include <XrdCrypto/XrdCryptoFactory.hh>
00027
00028
00029
00030
00031
00032 typedef XrdOucString String;
00033
00034 #define XrdSecPROTOIDENT "pwd"
00035 #define XrdSecPROTOIDLEN sizeof(XrdSecPROTOIDENT)
00036 #define XrdSecpwdVERSION 10100
00037 #define XrdSecNOIPCHK 0x0001
00038 #define XrdSecDEBUG 0x1000
00039 #define XrdCryptoMax 10
00040
00041 #define kMAXBUFLEN 1024
00042 #define kMAXUSRLEN 9
00043 #define kMAXPWDLEN 64
00044
00045
00046
00047 enum kpwdStatus {
00048 kpST_error = -1,
00049 kpST_ok = 0,
00050 kpST_more = 1
00051 };
00052
00053
00054
00055 enum kpwdAutoreg {
00056 kpAR_none = 0,
00057 kpAR_users = 1,
00058 kpAR_all = 2
00059 };
00060
00061
00062
00063 enum kpwdUpdate {
00064 kpUP_none = 0,
00065 kpUP_remove = 1,
00066 kpUP_all = 2
00067 };
00068
00069
00070
00071 enum kpwdCredsInput {
00072 kpCI_undef = -1,
00073 kpCI_prompt = 0,
00074 kpCI_exact = 1,
00075 kpCI_wildcard = 2
00076 };
00077
00078
00079
00080 enum kpwdCredType {
00081 kpCT_undef = -1,
00082 kpCT_normal = 0,
00083 kpCT_onetime = 1,
00084 kpCT_old = 2,
00085 kpCT_new = 3,
00086 kpCT_newagain = 4,
00087 kpCT_autoreg = 5,
00088 kpCT_ar_again = 6,
00089 kpCT_crypt = 7,
00090 kpCT_afs = 8,
00091 kpCT_afsenc = 9
00092 };
00093
00094
00095
00096 enum kpwdCredsActions {
00097 kpCA_undef = -1,
00098 kpCA_check = 0,
00099 kpCA_checkold = 1,
00100 kpCA_cache = 2,
00101 kpCA_checkcache = 3
00102 };
00103
00104
00105 enum kpwdClientSteps {
00106 kXPC_none = 0,
00107 kXPC_normal = 1000,
00108 kXPC_verifysrv,
00109 kXPC_signedrtag,
00110 kXPC_creds,
00111 kXPC_autoreg,
00112 kXPC_failureack,
00113 kXPC_reserved
00114 };
00115
00116
00117 enum kpwdServerSteps {
00118 kXPS_none = 0,
00119 kXPS_init = 2000,
00120 kXPS_credsreq,
00121 kXPS_rtag,
00122 kXPS_signedrtag,
00123 kXPS_newpuk,
00124 kXPS_puk,
00125 kXPS_failure,
00126 kXPS_reserved
00127 };
00128
00129
00130 enum kpwdErrors {
00131 kPWErrParseBuffer = 10000,
00132 kPWErrDecodeBuffer,
00133 kPWErrLoadCrypto,
00134 kPWErrBadProtocol,
00135 kPWErrNoUserHost,
00136 kPWErrNoUser,
00137 kPWErrNoHost,
00138 kPWErrBadUser,
00139 kPWErrCreateBucket,
00140 kPWErrDuplicateBucket,
00141 kPWErrCreateBuffer,
00142 kPWErrSerialBuffer,
00143 kPWErrGenCipher,
00144 kPWErrExportPuK,
00145 kPWErrEncRndmTag,
00146 kPWErrBadRndmTag,
00147 kPWErrNoRndmTag,
00148 kPWErrNoCipher,
00149 kPWErrQueryCreds,
00150 kPWErrNoCreds,
00151 kPWErrBadPasswd,
00152 kPWErrBadCache,
00153 kPWErrNoCache,
00154 kPWErrNoSessID,
00155 kPWErrBadSessID,
00156 kPWErrBadOpt,
00157 kPWErrMarshal,
00158 kPWErrUnmarshal,
00159 kPWErrSaveCreds,
00160 kPWErrNoSalt,
00161 kPWErrNoBuffer,
00162 kPWErrRefCipher,
00163 kPWErrNoPublic,
00164 kPWErrAddBucket,
00165 kPWErrFinCipher,
00166 kPWErrInit,
00167 kPWErrBadCreds,
00168 kPWErrError
00169 };
00170
00171
00172 typedef struct {
00173 char ctype;
00174 char action;
00175 short options;
00176 } pwdStatus_t;
00177
00178 #define REL1(x) { if (x) delete x; }
00179 #define REL2(x,y) { if (x) delete x; if (y) delete y; }
00180 #define REL3(x,y,z) { if (x) delete x; if (y) delete y; if (z) delete z; }
00181
00182 #ifndef NODEBUG
00183 #define PRINT(y) {{SecTrace->Beg(epname); cerr <<y; SecTrace->End();}}
00184 #else
00185 #define PRINT(y) { }
00186 #endif
00187
00188 #define SafeDelete(x) { if (x) delete x ; x = 0; }
00189 #define SafeDelArray(x) { if (x) delete [] x ; x = 0; }
00190
00191
00192
00193
00194 class pwdOptions {
00195 public:
00196 short debug;
00197 short mode;
00198 short areg;
00199 short upwd;
00200 short alog;
00201 short verisrv;
00202 short vericlnt;
00203 short syspwd;
00204 int lifecreds;
00205 int maxprompts;
00206 int maxfailures;
00207 char *clist;
00208 char *dir;
00209 char *udir;
00210 char *cpass;
00211 char *alogfile;
00212 char *srvpuk;
00213 short keepcreds;
00214 char *expcreds;
00215
00216 pwdOptions() { debug = -1; mode = 's'; areg = -1; upwd = -1; alog = -1;
00217 verisrv = -1; vericlnt = -1;
00218 syspwd = -1; lifecreds = -1; maxprompts = -1; maxfailures = -1;
00219 clist = 0; dir = 0; udir = 0; cpass = 0;
00220 alogfile = 0; srvpuk = 0; keepcreds = 0; expcreds = 0;}
00221 virtual ~pwdOptions() { }
00222 };
00223
00224 class pwdHSVars {
00225 public:
00226 int Iter;
00227 int TimeStamp;
00228 String CryptoMod;
00229 String User;
00230 String Tag;
00231 int RemVers;
00232 XrdCryptoFactory *CF;
00233 XrdCryptoCipher *Hcip;
00234 XrdCryptoCipher *Rcip;
00235 String ID;
00236 XrdSutPFEntry *Cref;
00237 XrdSutPFEntry *Pent;
00238 bool RtagOK;
00239 pwdStatus_t Status;
00240 bool Tty;
00241 int Step;
00242 int LastStep;
00243 String ErrMsg;
00244 int SysPwd;
00245 String AFScell;
00246 XrdSutBuffer *Parms;
00247
00248 pwdHSVars() { Iter = 0; TimeStamp = -1; CryptoMod = ""; User = ""; Tag = "";
00249 RemVers = -1; CF = 0; Hcip = 0; Rcip = 0;
00250 ID = ""; Cref = 0; Pent = 0; RtagOK = 0; Tty = 0;
00251 Step = 0; LastStep = 0; ErrMsg = "";
00252 SysPwd = 0; AFScell = "";
00253 Status.ctype = 0; Status.action = 0; Status.options = 0; Parms = 0;}
00254
00255 ~pwdHSVars() { SafeDelete(Cref); SafeDelete(Hcip); SafeDelete(Parms); }
00256 };
00257
00258
00259
00260
00261
00262
00263 class XrdSecProtocolpwd : public XrdSecProtocol
00264 {
00265 public:
00266 int Authenticate (XrdSecCredentials *cred,
00267 XrdSecParameters **parms,
00268 XrdOucErrInfo *einfo=0);
00269
00270 XrdSecCredentials *getCredentials(XrdSecParameters *parm=0,
00271 XrdOucErrInfo *einfo=0);
00272
00273 XrdSecProtocolpwd(int opts, const char *hname,
00274 const struct sockaddr *ipadd,
00275 const char *parms = 0);
00276 virtual ~XrdSecProtocolpwd() {}
00277
00278
00279 static char *Init(pwdOptions o, XrdOucErrInfo *erp);
00280
00281 void Delete();
00282
00283 static void PrintTimeStat();
00284
00285 private:
00286
00287
00288 static XrdSysMutex pwdContext;
00289 static String FileAdmin;
00290 static String FileExpCreds;
00291 static String FileUser;
00292 static String FileCrypt;
00293 static String FileSrvPuk;
00294 static String SrvID;
00295 static String SrvEmail;
00296 static String DefCrypto;
00297 static String DefError;
00298 static XrdSutPFile PFAdmin;
00299 static XrdSutPFile PFAlog;
00300 static XrdSutPFile PFSrvPuk;
00301
00302
00303 static int ncrypt;
00304 static int cryptID[XrdCryptoMax];
00305 static String cryptName[XrdCryptoMax];
00306 static XrdCryptoCipher *loccip[XrdCryptoMax];
00307 static XrdCryptoCipher *refcip[XrdCryptoMax];
00308
00309
00310 static XrdSutCache cacheAdmin;
00311 static XrdSutCache cacheSrvPuk;
00312 static XrdSutCache cacheUser;
00313 static XrdSutCache cacheAlog;
00314
00315
00316 static int Debug;
00317 static bool Server;
00318 static int UserPwd;
00319 static bool SysPwd;
00320 static int VeriClnt;
00321 static int VeriSrv;
00322 static int AutoReg;
00323 static int LifeCreds;
00324 static int MaxPrompts;
00325 static int MaxFailures;
00326 static int AutoLogin;
00327 static int TimeSkew;
00328 static bool KeepCreds;
00329
00330
00331 static XrdSysLogger Logger;
00332 static XrdSysError eDest;
00333 static XrdOucTrace *SecTrace;
00334
00335
00336 int options;
00337 struct sockaddr hostaddr;
00338 char CName[256];
00339 bool srvMode;
00340
00341
00342 pwdHSVars *hs;
00343
00344
00345 XrdSecCredentials *clientCreds;
00346
00347
00348 int ParseClientInput(XrdSutBuffer *br, XrdSutBuffer **bm,
00349 String &emsg);
00350 int ParseServerInput(XrdSutBuffer *br, XrdSutBuffer **bm,
00351 String &cmsg);
00352 int ParseCrypto(XrdSutBuffer *buf);
00353
00354
00355 static void ErrF(XrdOucErrInfo *einfo, kXR_int32 ecode,
00356 const char *msg1, const char *msg2 = 0,
00357 const char *msg3 = 0);
00358 XrdSecCredentials *ErrC(XrdOucErrInfo *einfo, XrdSutBuffer *b1,
00359 XrdSutBuffer *b2,XrdSutBuffer *b3,
00360 kXR_int32 ecode, const char *msg1 = 0,
00361 const char *msg2 = 0, const char *msg3 = 0);
00362 int ErrS(String ID, XrdOucErrInfo *einfo, XrdSutBuffer *b1,
00363 XrdSutBuffer *b2, XrdSutBuffer *b3,
00364 kXR_int32 ecode, const char *msg1 = 0,
00365 const char *msg2 = 0, const char *msg3 = 0);
00366
00367
00368 XrdSutBucket *QueryCreds(XrdSutBuffer *bm, bool netrc, int &status);
00369 int QueryUser(int &status, String &cmsg);
00370 int QueryCrypt(String &fn, String &pwhash);
00371 int QueryNetRc(String host, String &passwd, int &status);
00372
00373
00374 bool CheckCreds(XrdSutBucket *creds, int credtype);
00375 bool CheckCredsAFS(XrdSutBucket *creds, int ctype);
00376
00377
00378 bool CheckTimeStamp(XrdSutBuffer *b, int skew, String &emsg);
00379
00380
00381 bool CheckRtag(XrdSutBuffer *bm, String &emsg);
00382
00383
00384 int ExportCreds(XrdSutBucket *creds);
00385 int SaveCreds(XrdSutBucket *creds);
00386 int UpdateAlog();
00387
00388
00389 int GetUserHost(String &usr, String &host);
00390 int AddSerialized(char opt, kXR_int32 step, String ID,
00391 XrdSutBuffer *bls, XrdSutBuffer *buf,
00392 kXR_int32 type, XrdCryptoCipher *cip);
00393 int DoubleHash(XrdCryptoFactory *cf, XrdSutBucket *bck,
00394 XrdSutBucket *s1, XrdSutBucket *s2 = 0,
00395 const char *tag = 0);
00396 };