Exemplo n.º 1
0
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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
}