/* Commande l'archivage d'un fichier. Le fichier est transmis au serveur d'archivage */ #include #include #include #include #include #include #include #include "multiserveur.h" #include "multiserveur.m" static int fire_answer ( const char *id, const char *challenge, const char *secretfile, SSTRING &answer) { glocal const char *id = id; // Key in the secrets file glocal SSTRING secret; int ret = -1; (secretfile,true); int ret = 0; if (line[0] != '#'){ SSTRINGS tb; int nb = str_splitline (line,':',tb); if (nb == 2 && tb.getitem(0)->cmp(glocal.id)==0){ glocal.secret.setfrom(tb.getitem(1)->get()); ret = -1; } } return ret; if (glocal.secret.is_filled()){ // Ok we have the challenge answer.setfrom (challenge); answer.strip_end(); answer.append (glocal.secret); misc_sha (answer.get(),answer); ret = 0; }else{ tlmp_error ("No secret for id %s",id); } return ret; } int main (int argc, char *argv[]) { glocal const char *port = NULL; glocal const char *host = NULL; glocal const char *user = NULL; glocal const char *sfile = NULL; glocal const char *id = NULL; glocal bool pipein = false; int ret; ret = (argc,argv,"multiserveur"); extern const char *version; setproginfo ("archive",version ,MSG_U(I_ARCHIVE,"Transmet un fichier ŕ l'archiveur\n")); setarg ('h',"host","Serveur archiveur",glocal.host,true); setarg ('i',"id","Identifiant pour localiser le secret",glocal.id,true); setarg ('p',"port","Port TCP",glocal.port,true); setarg ('s',"secretfile","Fichier contenant les secrets",glocal.sfile,true); setarg ('t',"stdin","Le contenu du fichier provient de stdin",glocal.pipein,false); setarg ('u',"user","Archive au nom de qui",glocal.user,true); fprintf (stderr,"%s\n",msg); syslog (LOG_ERR,"%s",msg); glocal int ret = -1; struct stat st; glocal const char *file = argv[0]; glocal FILE *fin = stdin; if (argc != 1){ usage(); }else if (!glocal.pipein && stat(argv[0],&st)==-1){ tlmp_error ("Le fichier %s n'existe pas (%s)\n" ,argv[0],strerror(errno)); }else if (!glocal.pipein && (glocal.fin = fopen(glocal.file,"r"))==NULL){ tlmp_error ("Ne peut ouvrit le fichier %s (%s)\n" ,argv[0],strerror(errno)); }else{ glocal int state = 0; (glocal.host,glocal.port,10); if (glocal.state == 0){ // C'est le challenge glocal.state++; SSTRING answer; if (fire_answer (glocal.id,line,glocal.sfile,answer)!=-1){ sendf ("%s %s\n",glocal.id,answer.get()); const char *file = strrchr(glocal.file,'/'); if (file != NULL){ file++; }else{ file = glocal.file; } sendf ("archive %s %s\n",glocal.user,file); }else{ end = true; } }else if (strcmp(line,"go")==0){ char buf[8192]; int n; while ((n=fread(buf,1,8192,glocal.fin))>0){ send (buf,n); } fclose (glocal.fin); glocal.fin = NULL; end = true; glocal.ret = 0; }else{ tlmp_error ("Reponse inconnue: %s",line); } if (glocal.fin != NULL){ fclose (glocal.fin); tlmp_error ("Fichier non transmis, probablement rejeté par le serveur"); } } return glocal.ret; return ret; }