chiark / gitweb /
site: Provide NAK reasons mentioning names and unpick failure
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 21 Sep 2019 15:41:12 +0000 (16:41 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 24 Oct 2019 18:16:17 +0000 (19:16 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
secnet.h
site.c

index 95bda9940ebec6b8981b74382f3dc9dca994d2c3..7da7c2d5a9935a7cd6bbb8285c8921faa7506594 100644 (file)
--- a/secnet.h
+++ b/secnet.h
@@ -467,6 +467,9 @@ typedef struct comm_clientinfo *comm_clientinfo_fn(void *state, dict_t*,
 
 enum {
     comm_notify_whynot_general,
+    comm_notify_whynot_unpick,
+    comm_notify_whynot_name_local,
+    comm_notify_whynot_name_remote,
 };
 
 /* Return True if the packet was processed, and shouldn't be passed to
diff --git a/site.c b/site.c
index 57ccb1dcdc4d0811a136c78a0cc229aa1ecd4778..37968896ccb50f1d07370a7ff582d1697a158327 100644 (file)
--- a/site.c
+++ b/site.c
@@ -1830,11 +1830,16 @@ static bool_t named_for_us(struct site *st, const struct buffer_if *buf_in,
     buffer_readonly_clone(buf,buf_in);
 
     if (!unpick_msg(st,type,buf,m)) {
+       priomsg_update_fixed(whynot, comm_notify_whynot_unpick, "malformed");
        return False;
     }
-#define NAME_MATCHES(lr)                       \
-    if (!name_matches(&m->lr, st->lr##name)) { \
-        return False;                          \
+#define NAME_MATCHES(lr)                                               \
+    if (!name_matches(&m->lr, st->lr##name)) {                         \
+       if (priomsg_update_fixed(whynot, comm_notify_whynot_name_##lr,  \
+                                 "unknown " #lr " name: ")) {          \
+            truncmsg_add_packet_string(&whynot->m, m->lr.len, m->lr.name); \
+        }                                                              \
+        return False;                                                  \
     }
     NAME_MATCHES(remote);
     NAME_MATCHES(local );