Execute scripts when invitations are created or accepted.
[tinc] / src / invitation.c
index 6ed17ca..e6567ba 100644 (file)
@@ -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;
        }