void sfsserv::sfs_login (svccb *sbp) { if (!authid_valid || ((!authc || authc->xi->ateof ()) && !(authc = getauthclnt ()))) { sbp->replyref (sfs_loginres (SFSLOGIN_ALLBAD)); return; } if (authc->rp.versno == 1) { sfsauth_loginres *resp = New sfsauth_loginres; authc->call (SFSAUTHPROC_LOGIN, sbp->Xtmpl getarg<sfs_loginarg> (), resp, wrap (sfs_login_cb, my_bundle_t (destroyed, this, sbp), resp)); return; } ref<sfsauth2_loginres> resp = New refcounted<sfsauth2_loginres> (); sfsauth2_loginarg arg; arg.arg = *sbp->Xtmpl getarg<sfs_loginarg> (); arg.authid = authid; arg.source = strbuf () << client_name << "!" << (progname ? progname : str ("???")); authc->call (SFSAUTH2_LOGIN, &arg, resp, wrap (sfs_login2_cb, my_bundle_t (destroyed, this, sbp), resp)); }
void authclnt::sfs_login (svccb *sbp) { if (!authid_valid) { sbp->replyref (sfs_loginres (SFSLOGIN_ALLBAD)); return; } sfsauth2_loginarg la; la.arg = *sbp->Xtmpl getarg<sfs_loginarg> (); la.authid = authid; la.source = client_name << "!" << progname; sfsauth_login (&la, wrap (this, &authclnt::sfs_login_2, sbp), true); }
static void sfs_login2_cb (my_bundle_t bundle, ref<sfsauth2_loginres> resp, clnt_stat stat) { ref<bool> destroyed = bundle.obj1 (); sfsserv *srv = bundle.obj2 (); svccb *sbp = bundle.obj3 (); if (stat || *destroyed) { if (stat) warn << "credential type not supported (v2)\n"; sbp->replyref (sfs_loginres (SFSLOGIN_ALLBAD)); return; } sfs_loginarg *argp = sbp->Xtmpl getarg<sfs_loginarg> (); sfs_loginres res (resp->status); switch (resp->status) { case SFSLOGIN_OK: { if (resp->resok->creds.size () < 1) { res.set_status (SFSLOGIN_BAD) ; break; } res.resok->authno = srv->authalloc (resp->resok->creds.base (), resp->resok->creds.size ()); if (!res.resok->authno) { //warn << "ran out of authnos (or bad cred type v2)\n"; res.set_status (SFSLOGIN_BAD); break; } else if (!srv->seqstate.check (argp->seqno)) res.set_status (SFSLOGIN_BAD); else { res.resok->resmore = resp->resok->resmore; res.resok->hello = resp->resok->hello; } break; } case SFSLOGIN_MORE: *res.resmore = *resp->resmore; break; default: break; } sbp->reply (&res); }
static void sfs_login_cb (my_bundle_t bundle, sfsauth_loginres *_resp, clnt_stat stat) { ref<bool> destroyed = bundle.obj1 (); sfsserv *srv = bundle.obj2 (); svccb *sbp = bundle.obj3(); auto_ptr<sfsauth_loginres> resp (_resp); if (stat || *destroyed) { if (stat) warn << "authserv: " << stat << "\n"; sbp->replyref (sfs_loginres (SFSLOGIN_ALLBAD)); return; } sfs_loginres res (resp->status); switch (resp->status) { case SFSLOGIN_OK: { if (resp->resok->authid != srv->authid || !srv->seqstate.check (resp->resok->seqno)) { res.set_status (SFSLOGIN_BAD); break; } res.resok->authno = srv->authalloc (&resp->resok->cred, 1); if (!res.resok->authno) { warn << "credential type not supported (v1)\n"; res.set_status (SFSLOGIN_BAD); } break; } case SFSLOGIN_MORE: *res.resmore = *resp->resmore; break; default: break; } sbp->reply (&res); }