]> arthur.barton.de Git - netatalk.git/blobdiff - etc/uams/uams_guest.c
Initial patch for authenticated printing. Requires LaserWriter 8.5.1 or
[netatalk.git] / etc / uams / uams_guest.c
index 41e2d70b3875f6c47d8148a0ba2faad9cc247261..0fe9d5cb0e0e6ee7a0a9fd5f94893410ae2d9857 100644 (file)
@@ -42,13 +42,60 @@ static int noauth_login(void *obj, struct passwd **uam_pwd,
     return( AFP_OK );
 }
 
+
+/* Printer NoAuthUAM Login */
+int noauth_printer(start, stop, username, out)
+       char    *start, *stop, *username;
+       struct papfile  *out;
+{
+    char       *data, *p, *q;
+    static const char *loginok = "0\r";
+
+    data = (char *)malloc(stop - start + 1);
+    strncpy(data, start, stop - start + 1);
+
+    /* We are looking for the following format in data:
+     * (username)
+     *
+     * Hopefully username doesn't contain a ")"
+     */
+
+    if ((p = strchr(data, '(' )) == NULL) {
+       syslog(LOG_INFO,"Bad Login NoAuthUAM: username not found in string");
+       free(data);
+       return(-1);
+    }
+    p++;
+    if ((q = strchr(data, ')' )) == NULL) {
+       syslog(LOG_INFO,"Bad Login NoAuthUAM: username not found in string");
+       free(data);
+       return(-1);
+    }
+    strncpy(username, p, q - p);
+
+    /* Done copying username, clean up */
+    free(data);
+
+    if (getpwnam(username) == NULL) {
+       syslog(LOG_INFO, "Bad Login NoAuthUAM: %s: %m", username);
+       return(-1);
+    }
+
+    /* Login successful */
+    append(out, loginok, strlen(loginok));
+    syslog(LOG_INFO, "Login NoAuthUAM: %s", username);
+    return(0);
+}
+
+
 static int uam_setup(const char *path)
 {
   if (uam_register(UAM_SERVER_LOGIN, path, "No User Authent",
               noauth_login, NULL, NULL) < 0)
-    return -1;
-  /* uam_register(UAM_SERVER_PRINTAUTH, path,
-     "No User Authent", noauth_printer); */
+       return -1;
+  if (uam_register(UAM_SERVER_PRINTAUTH, path, "NoAuthUAM",
+               noauth_printer) < 0)
+       return -1;
 
   return 0;
 }
@@ -56,7 +103,7 @@ static int uam_setup(const char *path)
 static void uam_cleanup()
 {
   uam_unregister(UAM_SERVER_LOGIN, "No User Authent");
-  /* uam_unregister(UAM_SERVER_PRINTAUTH, "No User Authent"); */
+  uam_unregister(UAM_SERVER_PRINTAUTH, "NoAuthUAM");
 }
 
 UAM_MODULE_EXPORT struct uam_export uams_guest = {