15e96a66cSDavid du Colombier #include "stdinc.h" 25e96a66cSDavid du Colombier 35e96a66cSDavid du Colombier #include "9.h" 45e96a66cSDavid du Colombier 55e96a66cSDavid du Colombier int 65e96a66cSDavid du Colombier authRead(Fid* afid, void* data, int count) 75e96a66cSDavid du Colombier { 85e96a66cSDavid du Colombier AuthInfo *ai; 95e96a66cSDavid du Colombier AuthRpc *rpc; 105e96a66cSDavid du Colombier 115e96a66cSDavid du Colombier if((rpc = afid->rpc) == nil) 125e96a66cSDavid du Colombier return -1; 135e96a66cSDavid du Colombier 145e96a66cSDavid du Colombier switch(auth_rpc(rpc, "read", nil, 0)){ 155e96a66cSDavid du Colombier default: 165e96a66cSDavid du Colombier return -1; 175e96a66cSDavid du Colombier case ARdone: 185e96a66cSDavid du Colombier if((ai = auth_getinfo(rpc)) == nil) 195e96a66cSDavid du Colombier break; 205e96a66cSDavid du Colombier if(ai->cuid == nil || *ai->cuid == '\0'){ 215e96a66cSDavid du Colombier auth_freeAI(ai); 225e96a66cSDavid du Colombier break; 235e96a66cSDavid du Colombier } 245e96a66cSDavid du Colombier assert(afid->cuname == nil); 255e96a66cSDavid du Colombier afid->cuname = vtStrDup(ai->cuid); 265e96a66cSDavid du Colombier auth_freeAI(ai); 275e96a66cSDavid du Colombier if(Dflag) 285e96a66cSDavid du Colombier fprint(2, "authRead cuname %s\n", afid->cuname); 295e96a66cSDavid du Colombier assert(afid->uid == nil); 305e96a66cSDavid du Colombier if((afid->uid = uidByUname(afid->cuname)) == nil) 315e96a66cSDavid du Colombier break; 325e96a66cSDavid du Colombier return 0; 335e96a66cSDavid du Colombier case ARok: 345e96a66cSDavid du Colombier if(count < rpc->narg) 355e96a66cSDavid du Colombier break; 365e96a66cSDavid du Colombier memmove(data, rpc->arg, rpc->narg); 375e96a66cSDavid du Colombier return rpc->narg; 385e96a66cSDavid du Colombier case ARphase: 395e96a66cSDavid du Colombier break; 405e96a66cSDavid du Colombier } 415e96a66cSDavid du Colombier return -1; 425e96a66cSDavid du Colombier } 435e96a66cSDavid du Colombier 445e96a66cSDavid du Colombier int 455e96a66cSDavid du Colombier authWrite(Fid* afid, void* data, int count) 465e96a66cSDavid du Colombier { 475e96a66cSDavid du Colombier assert(afid->rpc != nil); 485e96a66cSDavid du Colombier if(auth_rpc(afid->rpc, "write", data, count) != ARok) 495e96a66cSDavid du Colombier return -1; 505e96a66cSDavid du Colombier return count; 515e96a66cSDavid du Colombier } 525e96a66cSDavid du Colombier 535e96a66cSDavid du Colombier int 545e96a66cSDavid du Colombier authCheck(Fcall* t, Fid* fid, Fs* fsys) 555e96a66cSDavid du Colombier { 565e96a66cSDavid du Colombier Fid *afid; 575e96a66cSDavid du Colombier uchar buf[1]; 585e96a66cSDavid du Colombier 595e96a66cSDavid du Colombier /* 605e96a66cSDavid du Colombier * Can't lookup with FidWlock here as there may be 615e96a66cSDavid du Colombier * protocol to do. Use a separate lock to protect altering 625e96a66cSDavid du Colombier * the auth information inside afid. 635e96a66cSDavid du Colombier */ 64*61201b97SDavid du Colombier if(t->afid == NOFID){ 655e96a66cSDavid du Colombier /* 665e96a66cSDavid du Colombier * If no authentication is asked for, allow 675e96a66cSDavid du Colombier * "none" provided the connection has already 685e96a66cSDavid du Colombier * been authenticatated. 69*61201b97SDavid du Colombier * 705e96a66cSDavid du Colombier * The console is allowed to attach without 715e96a66cSDavid du Colombier * authentication. 725e96a66cSDavid du Colombier */ 73*61201b97SDavid du Colombier if(!fid->con->isconsole && 74*61201b97SDavid du Colombier (strcmp(fid->uname, unamenone) != 0 || !fid->con->aok)){ 75*61201b97SDavid du Colombier consPrint("attach %s as %s: connection not authenticated, not console\n", fsysGetName(fsys), fid->uname); 765e96a66cSDavid du Colombier return 0; 77*61201b97SDavid du Colombier } 78*61201b97SDavid du Colombier 79*61201b97SDavid du Colombier if((fid->uid = uidByUname(fid->uname)) == nil){ 80*61201b97SDavid du Colombier consPrint("attach %s as %s: unknown uname\n", fsysGetName(fsys), fid->uname); 815e96a66cSDavid du Colombier return 0; 82*61201b97SDavid du Colombier } 835e96a66cSDavid du Colombier return 1; 845e96a66cSDavid du Colombier } 855e96a66cSDavid du Colombier 86*61201b97SDavid du Colombier if((afid = fidGet(fid->con, t->afid, 0)) == nil){ 87*61201b97SDavid du Colombier consPrint("attach %s as %s: bad afid\n", fsysGetName(fsys), fid->uname); 88*61201b97SDavid du Colombier return 0; 89*61201b97SDavid du Colombier } 90*61201b97SDavid du Colombier 915e96a66cSDavid du Colombier /* 925e96a66cSDavid du Colombier * Check valid afid; 935e96a66cSDavid du Colombier * check uname and aname match. 945e96a66cSDavid du Colombier */ 955e96a66cSDavid du Colombier if(!(afid->qid.type & QTAUTH)){ 96*61201b97SDavid du Colombier consPrint("attach %s as %s: afid not an auth file\n", fsysGetName(fsys), fid->uname); 975e96a66cSDavid du Colombier fidPut(afid); 985e96a66cSDavid du Colombier return 0; 995e96a66cSDavid du Colombier } 1005e96a66cSDavid du Colombier if(strcmp(afid->uname, fid->uname) != 0 || afid->fsys != fsys){ 101*61201b97SDavid du Colombier consPrint("attach %s as %s: afid is for %s as %s\n", fsysGetName(fsys), fid->uname, fsysGetName(afid->fsys), afid->uname); 1025e96a66cSDavid du Colombier fidPut(afid); 1035e96a66cSDavid du Colombier return 0; 1045e96a66cSDavid du Colombier } 1055e96a66cSDavid du Colombier 1065e96a66cSDavid du Colombier vtLock(afid->alock); 1075e96a66cSDavid du Colombier if(afid->cuname == nil){ 1085e96a66cSDavid du Colombier if(authRead(afid, buf, 0) != 0 || afid->cuname == nil){ 1095e96a66cSDavid du Colombier vtUnlock(afid->alock); 110*61201b97SDavid du Colombier consPrint("attach %s as %s: auth protocol not finished\n", fsysGetName(fsys), fid->uname); 1115e96a66cSDavid du Colombier fidPut(afid); 1125e96a66cSDavid du Colombier return 0; 1135e96a66cSDavid du Colombier } 1145e96a66cSDavid du Colombier } 1155e96a66cSDavid du Colombier vtUnlock(afid->alock); 1165e96a66cSDavid du Colombier 1175e96a66cSDavid du Colombier assert(fid->uid == nil); 1185e96a66cSDavid du Colombier if((fid->uid = uidByUname(afid->cuname)) == nil){ 119*61201b97SDavid du Colombier consPrint("attach %s as %s: unknown cuname %s\n", fsysGetName(fsys), fid->uname, afid->cuname); 1205e96a66cSDavid du Colombier fidPut(afid); 1215e96a66cSDavid du Colombier return 0; 1225e96a66cSDavid du Colombier } 1235e96a66cSDavid du Colombier 1245e96a66cSDavid du Colombier vtMemFree(fid->uname); 1255e96a66cSDavid du Colombier fid->uname = vtStrDup(afid->cuname); 1265e96a66cSDavid du Colombier fidPut(afid); 1275e96a66cSDavid du Colombier 1285e96a66cSDavid du Colombier /* 1295e96a66cSDavid du Colombier * Allow "none" once the connection has been authenticated. 1305e96a66cSDavid du Colombier */ 1315e96a66cSDavid du Colombier fid->con->aok = 1; 1325e96a66cSDavid du Colombier 1335e96a66cSDavid du Colombier return 1; 1345e96a66cSDavid du Colombier } 135