#include "xalloc.h"
#include "random.h"
#include "pidfile.h"
+#include "fs.h"
#include "ed25519/sha512.h"
}
}
+ memzero(line, sizeof(line));
fclose(in);
return true;
}
return 1;
}
+ if(argc > 2) {
+ fprintf(stderr, "Too many arguments!\n");
+ return 1;
+ }
+
// Check validity of the new node's name
if(!check_id(argv[1])) {
fprintf(stderr, "Invalid name for node.\n");
}
}
- snprintf(filename, sizeof(filename), "%s" SLASH "invitations", confbase);
-
- if(mkdir(filename, 0700) && errno != EEXIST) {
- fprintf(stderr, "Could not create directory %s: %s\n", filename, strerror(errno));
- return 1;
+ if(!makedirs(DIR_INVITATIONS)) {
+ return false;
}
+ snprintf(filename, sizeof(filename), "%s" SLASH "invitations", confbase);
+
// Count the number of valid invitations, clean up old ones
DIR *dir = opendir(filename);
int ifd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600);
if(!ifd) {
+ memzero(cookie, sizeof(cookie));
fprintf(stderr, "Could not create invitation file %s: %s\n", filename, strerror(errno));
return 1;
}
char *port = NULL;
if(!get_my_hostname(&address, &port)) {
+ memzero(cookie, sizeof(cookie));
return 1;
}
+ // Create an URL from the local address, key hash and cookie
+ char *url;
+ xasprintf(&url, "%s/%s%s", address, hash, cookie);
+
+ memzero(cookie, sizeof(cookie));
+ free(address);
+
// Fill in the details.
fprintf(f, "Name = %s\n", argv[1]);
if(!appended) {
fprintf(stderr, "Could not append my config to invitation file: %s.\n", strerror(errno));
- free(address);
+ free_string(url);
return 1;
}
- // Create an URL from the local address, key hash and cookie
- char *url;
- xasprintf(&url, "%s/%s%s", address, hash, cookie);
-
// Call the inviation-created script
environment_t env;
environment_init(&env);
environment_exit(&env);
puts(url);
- free(url);
- free(address);
+ free_string(url);
return 0;
}
}
static char *grep(const char *data, const char *var) {
- static char value[1024];
+ char value[1024];
const char *p = data;
size_t varlen = strlen(var);
memcpy(value, p, e - p);
value[e - p] = 0;
- return value;
+ return xstrdup(value);
}
static bool finalize_join(void) {
}
if(!netname) {
- const char *net = grep(data, "NetName");
+ char *net = grep(data, "NetName");
if(net) {
- netname = xstrdup(net);
+ netname = net;
if(!check_netname(netname, true)) {
fprintf(stderr, "Unsafe NetName found in invitation!\n");
goto make_names;
}
- if(mkdir(confbase, 0777) && errno != EEXIST) {
- fprintf(stderr, "Could not create directory %s: %s\n", confbase, strerror(errno));
- return false;
- }
-
- if(mkdir(hosts_dir, 0777) && errno != EEXIST) {
- fprintf(stderr, "Could not create directory %s: %s\n", hosts_dir, strerror(errno));
+ if(!makedirs(DIR_HOSTS | DIR_CONFBASE | DIR_CACHE)) {
return false;
}
return false;
}
- char *b64key = ecdsa_get_base64_public_key(key);
+ char *b64_pubkey = ecdsa_get_base64_public_key(key);
- if(!b64key) {
+ if(!b64_pubkey) {
return false;
}
fclose(f);
- fprintf(fh, "Ed25519PublicKey = %s\n", b64key);
+ fprintf(fh, "Ed25519PublicKey = %s\n", b64_pubkey);
- sptps_send_record(&sptps, 1, b64key, strlen(b64key));
- free(b64key);
+ sptps_send_record(&sptps, 1, b64_pubkey, strlen(b64_pubkey));
+ free(b64_pubkey);
ecdsa_free(key);
#ifndef DISABLE_LEGACY
}
// Make sure confbase exists and is accessible.
- if(!confbase_given && mkdir(confdir, 0755) && errno != EEXIST) {
- fprintf(stderr, "Could not create directory %s: %s\n", confdir, strerror(errno));
- return 1;
- }
-
- if(mkdir(confbase, 0777) && errno != EEXIST) {
- fprintf(stderr, "Could not create directory %s: %s\n", confbase, strerror(errno));
- return 1;
+ if(!makedirs(DIR_CONFDIR | DIR_CONFBASE)) {
+ return false;
}
if(access(confbase, R_OK | W_OK | X_OK)) {
if(!fgets(line, sizeof(line), stdin)) {
fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
- return false;
+ return 1;
}
invitation = line;
return 1;
}
- char *b64key = ecdsa_get_base64_public_key(key);
+ char *b64_pubkey = ecdsa_get_base64_public_key(key);
// Connect to the tinc daemon mentioned in the URL.
struct addrinfo *ai = str2addrinfo(address, port, SOCK_STREAM);
if(!ai) {
- free(b64key);
+ free(b64_pubkey);
ecdsa_free(key);
return 1;
}
if(!aip) {
freeaddrinfo(ai);
- free(b64key);
+ free(b64_pubkey);
ecdsa_free(key);
return 1;
}
fprintf(stderr, "Connected to %s port %s...\n", address, port);
// Tell him we have an invitation, and give him our throw-away key.
- ssize_t len = snprintf(line, sizeof(line), "0 ?%s %d.%d\n", b64key, PROT_MAJOR, PROT_MINOR);
+ ssize_t len = snprintf(line, sizeof(line), "0 ?%s %d.%d\n", b64_pubkey, PROT_MAJOR, PROT_MINOR);
if(len <= 0 || (size_t)len >= sizeof(line)) {
abort();
}
- if(!sendline(sock, "0 ?%s %d.%d", b64key, PROT_MAJOR, 1)) {
+ if(!sendline(sock, "0 ?%s %d.%d", b64_pubkey, PROT_MAJOR, 1)) {
fprintf(stderr, "Error sending request to %s port %s: %s\n", address, port, strerror(errno));
closesocket(sock);
goto next;
ai = NULL;
aip = NULL;
- free(b64key);
- b64key = NULL;
+ free(b64_pubkey);
+ b64_pubkey = NULL;
// Check if the hash of the key he gave us matches the hash in the URL.
char *fingerprint = line + 2;
}
// Start an SPTPS session
- if(!sptps_start(&sptps, NULL, true, false, key, hiskey, "tinc invitation", 15, invitation_send, invitation_receive)) {
+ sptps_params_t params = {
+ .initiator = true,
+ .mykey = key,
+ .hiskey = hiskey,
+ .label = "tinc invitation",
+ .send_data = invitation_send,
+ .receive_record = invitation_receive,
+ };
+
+ if(!sptps_start(&sptps, ¶ms)) {
ecdsa_free(hiskey);
ecdsa_free(key);
return 1;