X-Git-Url: http://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Finvitation.c;h=e6567bae4960b779841ff1d676576d6aed439d4b;hb=21184674b38ea1da87588de97dab076c9b9e4a81;hp=6ed17ca16c655f24c5751eceb24becf17a1667cd;hpb=c798f7309337fc4c6dec7fd99d45cd76f809ab02;p=tinc diff --git a/src/invitation.c b/src/invitation.c index 6ed17ca1..e6567bae 100644 --- a/src/invitation.c +++ b/src/invitation.c @@ -349,17 +349,25 @@ int cmd_invite(int argc, char *argv[]) { // Create a random cookie for this invitation. char cookie[25]; randomize(cookie, 18); + + // Create a filename that doesn't reveal the cookie itself + char buf[18 + strlen(fingerprint)]; + char cookiehash[25]; + memcpy(buf, cookie, 18); + memcpy(buf + 18, fingerprint, sizeof buf - 18); + digest_create(digest, buf, sizeof buf, cookiehash); + b64encode_urlsafe(cookiehash, cookiehash, 18); + b64encode_urlsafe(cookie, cookie, 18); // Create a file containing the details of the invitation. - xasprintf(&filename, "%s" SLASH "invitations" SLASH "%s", confbase, cookie); + xasprintf(&filename, "%s" SLASH "invitations" SLASH "%s", confbase, cookiehash); int ifd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600); if(!ifd) { fprintf(stderr, "Could not create invitation file %s: %s\n", filename, strerror(errno)); free(filename); return 1; } - free(filename); f = fdopen(ifd, "w"); if(!f) abort(); @@ -376,12 +384,31 @@ int cmd_invite(int argc, char *argv[]) { fprintf(f, "#---------------------------------------------------------------#\n"); fprintf(f, "Name = %s\n", myname); - xasprintf(&filename, "%s" SLASH "hosts" SLASH "%s", confbase, myname); - fcopy(f, filename); + char *filename2; + xasprintf(&filename2, "%s" SLASH "hosts" SLASH "%s", confbase, myname); + fcopy(f, filename2); fclose(f); + free(filename2); // Create an URL from the local address, key hash and cookie - printf("%s/%s%s\n", address, hash, cookie); + char *url; + xasprintf(&url, "%s/%s%s", address, hash, cookie); + + // Call the inviation-created script + setenv("NAME", myname, true); + setenv("NETNAME", netname, true); + setenv("NODE", argv[1], true); + setenv("INVITATION_FILE", filename, true); + setenv("INVITATION_URL", url, true); + char *scriptname; + xasprintf(&scriptname, "\"%s" SLASH "invitation-created\"", confbase); + system(scriptname); + free(scriptname); + unsetenv("NODE"); + unsetenv("INVITATION"); + + puts(url); + free(url); free(filename); free(address); @@ -688,10 +715,6 @@ make_names: check_port(name); - fprintf(stderr, "Invitation succesfully accepted.\n"); - shutdown(sock, SHUT_RDWR); - success = true; - ask_netname: if(ask_netname) { fprintf(stderr, "Enter a new netname: "); @@ -720,6 +743,7 @@ ask_netname: return true; } + static bool invitation_send(void *handle, uint8_t type, const char *data, size_t len) { while(len) { int result = send(sock, data, len, 0); @@ -748,6 +772,12 @@ static bool invitation_receive(void *handle, uint8_t type, const char *msg, uint case 1: return finalize_join(); + case 2: + fprintf(stderr, "Invitation succesfully accepted.\n"); + shutdown(sock, SHUT_RDWR); + success = true; + break; + default: return false; }