X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/80a1137431b5f1e52b1edd192a498669325d6ec2..4a3882945f605704ede113a9fe98cd19a92363a7:/server/admin.c diff --git a/server/admin.c b/server/admin.c index 8a3e62ca..87bb9053 100644 --- a/server/admin.c +++ b/server/admin.c @@ -560,7 +560,7 @@ void a_quit(void) { close(sock.fd); unlink(sockname); - FOREACH_PEER(p, { p_destroy(p); }); + FOREACH_PEER(p, { p_destroy(p, 1); }); ps_quit(); exit(0); } @@ -1421,6 +1421,7 @@ static void a_doadd(admin_resop *r, int rc) if (add->peer.tag) xfree(add->peer.tag); if (add->peer.privtag) xfree(add->peer.privtag); + if (add->peer.knock) xfree(add->peer.knock); xfree(add->peer.name); } @@ -1446,6 +1447,7 @@ static void acmd_add(admin *a, unsigned ac, char *av[]) add->peer.name = 0; add->peer.tag = 0; add->peer.privtag = 0; + add->peer.knock = 0; add->peer.t_ka = 0; add->peer.tops = tun_default; add->peer.f = 0; @@ -1469,15 +1471,21 @@ static void acmd_add(admin *a, unsigned ac, char *av[]) }) OPTTIME("-keepalive", t, { add->peer.t_ka = t; }) OPT("-cork", { add->peer.f |= KXF_CORK; }) + OPT("-ephemeral", { add->peer.f |= PSF_EPHEM; }) OPTARG("-key", arg, { if (add->peer.tag) xfree(add->peer.tag); add->peer.tag = xstrdup(arg); }) - OPT("-mobile", { add->peer.f |= PSF_MOBILE; }) + OPT("-mobile", { add->peer.f |= PSF_MOBILE | PSF_EPHEM; }) OPTARG("-priv", arg, { if (add->peer.privtag) xfree(add->peer.privtag); add->peer.privtag = xstrdup(arg); }) + OPTARG("-knock", arg, { + if (add->peer.knock) xfree(add->peer.knock); + add->peer.knock = xstrdup(arg); + add->peer.f |= PSF_EPHEM; + }) }); /* --- Make sure someone's not got there already --- */ @@ -1504,6 +1512,7 @@ fail: if (add->peer.name) xfree(add->peer.name); if (add->peer.tag) xfree(add->peer.tag); if (add->peer.privtag) xfree(add->peer.privtag); + if (add->peer.knock) xfree(add->peer.knock); xfree(add); return; } @@ -1982,7 +1991,7 @@ static void acmd_getchal(admin *a, unsigned ac, char *av[]) buf b; buf_init(&b, buf_i, PKBUFSZ); - c_new(&b); + c_new(0, 0, &b); a_info(a, "?B64", BBASE(&b), (size_t)BLEN(&b), A_END); a_ok(a); } @@ -1999,7 +2008,7 @@ static void acmd_checkchal(admin *a, unsigned ac, char *av[]) a_fail(a, "bad-base64", "%s", codec_strerror(err), A_END); else { buf_init(&b, d.buf, d.len); - if (c_check(&b) || BBAD(&b) || BLEFT(&b)) + if (c_check(0, 0, &b) || BBAD(&b) || BLEFT(&b)) a_fail(a, "invalid-challenge", A_END); else a_ok(a); @@ -2049,6 +2058,7 @@ static void acmd_peerinfo(admin *a, unsigned ac, char *av[]) if ((p = a_findpeer(a, av[0])) != 0) { ps = p_spec(p); a_info(a, "tunnel=%s", ps->tops->name, A_END); + if (ps->knock) a_info(a, "knock=%s", ps->knock, A_END); a_info(a, "key=%s", p_tag(p), "current-key=%s", p->kx.kpub->tag, A_END); if ((ptag = p_privtag(p)) == 0) ptag = "(default)"; @@ -2057,6 +2067,7 @@ static void acmd_peerinfo(admin *a, unsigned ac, char *av[]) a_info(a, "keepalive=%lu", ps->t_ka, A_END); a_info(a, "corked=%s", BOOL(p->kx.f&KXF_CORK), "mobile=%s", BOOL(ps->f&PSF_MOBILE), + "ephemeral=%s", BOOL(ps->f&PSF_EPHEM), A_END); a_ok(a); } @@ -2112,7 +2123,7 @@ static void acmd_kill(admin *a, unsigned ac, char *av[]) peer *p; if ((p = a_findpeer(a, av[0])) != 0) { - p_destroy(p); + p_destroy(p, 1); a_ok(a); } }