#include "names.h"
#include "netutl.h"
#include "rsagen.h"
+#include "script.h"
#include "sptps.h"
#include "tincctl.h"
#include "utils.h"
// 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();
if(netname)
fprintf(f, "NetName = %s\n", netname);
fprintf(f, "ConnectTo = %s\n", myname);
- // TODO: copy Broadcast and Mode
+
+ // Copy Broadcast and Mode
+ FILE *tc = fopen(tinc_conf, "r");
+ if(tc) {
+ char buf[1024];
+ while(fgets(buf, sizeof buf, tc)) {
+ if((!strncasecmp(buf, "Mode", 4) && strchr(" \t=", buf[4]))
+ || (!strncasecmp(buf, "Broadcast", 9) && strchr(" \t=", buf[9])))
+ fputs(buf, f);
+ }
+ fclose(tc);
+ }
+
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
+ char *envp[6] = {};
+ xasprintf(&envp[0], "NAME=%s", myname);
+ xasprintf(&envp[1], "NETNAME=%s", netname);
+ xasprintf(&envp[2], "NODE=%s", argv[1]);
+ xasprintf(&envp[3], "INVITATION_FILE=%s", filename);
+ xasprintf(&envp[4], "INVITATION_URL=%s", url);
+ execute_script("invitation-created", envp);
+ for(int i = 0; i < 6 && envp[i]; i++)
+ free(envp[i]);
+
+ puts(url);
+ free(url);
free(filename);
free(address);