// If that doesn't work, guess externally visible hostname
fprintf(stderr, "Trying to discover externally visible hostname...\n");
- struct addrinfo *ai = str2addrinfo("ifconfig.me", "80", SOCK_STREAM);
- static const char request[] = "GET /host HTTP/1.0\r\n\r\n";
- if(ai) {
- int s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ struct addrinfo *ai = str2addrinfo("tinc-vpn.org", "80", SOCK_STREAM);
+ struct addrinfo *aip = ai;
+ static const char request[] = "GET http://tinc-vpn.org/host.cgi HTTP/1.0\r\n\r\n";
+
+ while(aip) {
+ int s = socket(aip->ai_family, aip->ai_socktype, aip->ai_protocol);
if(s >= 0) {
- if(connect(s, ai->ai_addr, ai->ai_addrlen)) {
+ if(connect(s, aip->ai_addr, aip->ai_addrlen)) {
closesocket(s);
s = -1;
}
hostname = xstrdup(p + 1);
}
closesocket(s);
+ if(hostname)
+ break;
}
- freeaddrinfo(ai);
+ aip = aip->ai_next;
+ continue;
}
+ if(ai)
+ freeaddrinfo(ai);
+
// Check that the hostname is reasonable
if(hostname) {
for(char *p = hostname; *p; p++) {
- if(isalnum(*p) || *p == '-' || *p == '.')
+ if(isalnum(*p) || *p == '-' || *p == '.' || *p == ':')
continue;
// If not, forget it.
free(hostname);
// 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));
if(!f)
abort();
+ // Get the local address
+ char *address = get_my_hostname();
+
// Fill in the details.
fprintf(f, "Name = %s\n", argv[1]);
if(netname)
fclose(f);
// Create an URL from the local address, key hash and cookie
- char *address = get_my_hostname();
printf("%s/%s%s\n", address, hash, cookie);
free(filename);
free(address);
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: ");
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);
case 1:
return finalize_join();
+ case 2:
+ fprintf(stderr, "Invitation succesfully accepted.\n");
+ shutdown(sock, SHUT_RDWR);
+ success = true;
+ break;
+
default:
return false;
}