chiark / gitweb /
--wide-open option; better login failure logging
authorrjk@greenend.org.uk <>
Sun, 16 Sep 2007 16:26:14 +0000 (17:26 +0100)
committerrjk@greenend.org.uk <>
Sun, 16 Sep 2007 16:26:14 +0000 (17:26 +0100)
server/disorderd.c
server/server.c
server/server.h

index 4a3915aa466e0896c7d329cb9d125b7244e95ce2..f2ebb9abf49241a571819ab67fe4baf7e4f977b2 100644 (file)
@@ -70,6 +70,7 @@ static const struct option options[] = {
   { "log", required_argument, 0, 'l' },
   { "pidfile", required_argument, 0, 'P' },
   { "no-initial-rescan", no_argument, 0, 'N' },
+  { "wide-open", no_argument, 0, 'w' },
   { "syslog", no_argument, 0, 's' },
   { 0, 0, 0, 0 }
 };
@@ -221,6 +222,7 @@ int main(int argc, char **argv) {
     case 'P': pidfile = optarg; break;
     case 'N': initial_rescan = 0; break;
     case 's': logsyslog = 1; break;
+    case 'w': wideopen = 1; break;
     default: fatal(0, "invalid option");
     }
   }
index 6e151157a9ebf5eb3f7ae798d3234bace3709124..5837e38628069775b6204c70d101387ab175bfbc 100644 (file)
 
 int volume_left, volume_right;         /* last known volume */
 
+/** @brief Accept all well-formed login attempts
+ *
+ * Used in debugging.
+ */
+int wideopen;
+
 struct listener {
   const char *name;
   int pf;
@@ -373,28 +379,29 @@ static int c_user(struct conn *c,
       sink_writes(ev_writer_sink(c->w), "530 authentication failure\n");
       return 1;
     }
-  }
+  } else
+    strcpy(host, "local");
   /* find the user */
   for(n = 0; n < config->allow.n
        && strcmp(config->allow.s[n].s[0], vec[0]); ++n)
     ;
   /* if it's a real user check whether the response is right */
-  if(n < config->allow.n) {
-    res = authhash(c->nonce, sizeof c->nonce, config->allow.s[n].s[1]);
-    if(res && !strcmp(res, vec[1])) {
-      c->who = vec[0];
-      /* currently we only bother logging remote connections */
-      if(c->l->pf != PF_UNIX)
-       info("S%x %s connected from %s", c->tag, vec[0], host);
-      sink_writes(ev_writer_sink(c->w), "230 OK\n");
-      return 1;
-    }
+  if(n >= config->allow.n) {
+    info("S%x unknown user '%s' from %s", c->tag, vec[0], host);
+    sink_writes(ev_writer_sink(c->w), "530 authentication failed\n");
+    return 1;
+  }
+  res = authhash(c->nonce, sizeof c->nonce, config->allow.s[n].s[1]);
+  if(wideopen || (res && !strcmp(res, vec[1]))) {
+    c->who = vec[0];
+    /* currently we only bother logging remote connections */
+    if(c->l->pf != PF_UNIX)
+      info("S%x %s connected from %s", c->tag, vec[0], host);
+    sink_writes(ev_writer_sink(c->w), "230 OK\n");
+    return 1;
   }
   /* oops, response was wrong */
-  if(c->l->pf != PF_UNIX)
-    info("S%x authentication failure for %s from %s", c->tag, vec[0], host);
-  else
-    info("S%x authentication failure for %s", c->tag, vec[0]);
+  info("S%x authentication failure for %s from %s", c->tag, vec[0], host);
   sink_writes(ev_writer_sink(c->w), "530 authentication failed\n");
   return 1;
 }
index f0441204046dfbc518fe87a034ddf7697d1b02c7..a3a5bebd49778ef27c42791b58039b28bfc43366 100644 (file)
@@ -36,6 +36,8 @@ int server_stop(ev_source *ev, int fd);
 
 extern int volume_left, volume_right;  /* last known volume */
 
+extern int wideopen;                   /* blindly accept all logins */
+
 #endif /* SERVER_H */
 
 /*