gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] 02/03: digest_auth_example: updated and fixed


From: gnunet
Subject: [libmicrohttpd] 02/03: digest_auth_example: updated and fixed
Date: Sun, 28 Jan 2024 23:15:05 +0100

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit f7969b87492f612dddad4d746725962f225b5de4
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Sun Jan 28 23:04:31 2024 +0100

    digest_auth_example: updated and fixed
    
    The example was updated to use the new digest auth API.
    Fixed run on W32.
---
 src/examples/digest_auth_example.c | 134 +++++++++++++++++++++++--------------
 1 file changed, 84 insertions(+), 50 deletions(-)

diff --git a/src/examples/digest_auth_example.c 
b/src/examples/digest_auth_example.c
index 8d5a4041..7eaf60f1 100644
--- a/src/examples/digest_auth_example.c
+++ b/src/examples/digest_auth_example.c
@@ -1,7 +1,7 @@
 /*
      This file is part of libmicrohttpd
      Copyright (C) 2010 Christian Grothoff (and other contributing authors)
-     Copyright (C) 2016-2022 Evgeny Grin (Karlson2k)
+     Copyright (C) 2016-2024 Evgeny Grin (Karlson2k)
 
      This library is free software; you can redistribute it and/or
      modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,12 @@
 #include "platform.h"
 #include <microhttpd.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <errno.h>
+#if defined(_WIN32) && ! defined(__CYGWIN__)
+#  include <wincrypt.h>
+#endif /* _WIN32 && ! __CYGWIN__ */
+
 
 #define PAGE \
   "<html><head><title>libmicrohttpd demo</title></head>" \
@@ -48,9 +53,10 @@ ahc_echo (void *cls,
           const char *upload_data, size_t *upload_data_size, void **req_cls)
 {
   struct MHD_Response *response;
-  char *username;
-  const char *password = "testpass";
-  const char *realm = "test@example.com";
+  /* Only one user has access to the page */
+  static const char *username = "testuser";
+  static const char *password = "testpass";
+  static const char *realm = "test@example.com";
   enum MHD_DigestAuthResult res_e;
   enum MHD_Result ret;
   static int already_called_marker;
@@ -68,26 +74,17 @@ ahc_echo (void *cls,
     return MHD_YES;
   }
 
-  username = MHD_digest_auth_get_username (connection);
-  if (NULL == username)
-  {
-    response =
-      MHD_create_response_from_buffer_static (strlen (DENIED),
-                                              DENIED);
-    ret = MHD_queue_auth_fail_response2 (connection, realm,
-                                         MY_OPAQUE_STR,
-                                         response,
-                                         MHD_NO,
-                                         MHD_DIGEST_ALG_MD5);
-    MHD_destroy_response (response);
-    return ret;
-  }
-  res_e = MHD_digest_auth_check3 (connection, realm,
-                                  username,
-                                  password,
-                                  300, 60, MHD_DIGEST_AUTH_MULT_QOP_AUTH,
-                                  MHD_DIGEST_AUTH_MULT_ALGO3_MD5);
-  MHD_free (username);
+  /* No need to call MHD_digest_auth_get_username3() as the only
+   * one user has an access. The username match is checked by
+   * MHD_digest_auth_check3() function. */
+  res_e = MHD_digest_auth_check3 (
+    connection,
+    realm,
+    username,
+    password,
+    0, 0,
+    MHD_DIGEST_AUTH_MULT_QOP_ANY_NON_INT,
+    MHD_DIGEST_AUTH_MULT_ALGO3_ANY_NON_SESSION);
   if (res_e != MHD_DAUTH_OK)
   {
     response =
@@ -95,12 +92,18 @@ ahc_echo (void *cls,
                                               DENIED);
     if (NULL == response)
       return MHD_NO;
-    ret = MHD_queue_auth_fail_response2 (connection, realm,
-                                         MY_OPAQUE_STR,
-                                         response,
-                                         (res_e == MHD_DAUTH_NONCE_STALE) ?
-                                         MHD_YES : MHD_NO,
-                                         MHD_DIGEST_ALG_MD5);
+    ret = MHD_queue_auth_required_response3 (
+      connection,
+      realm,
+      MY_OPAQUE_STR,
+      NULL,
+      response,
+      (res_e == MHD_DAUTH_NONCE_STALE) ? MHD_YES : MHD_NO,
+      MHD_DIGEST_AUTH_MULT_QOP_ANY_NON_INT,
+      MHD_DIGEST_AUTH_MULT_ALGO3_ANY_NON_SESSION,
+      MHD_NO,
+      MHD_YES);
+
     MHD_destroy_response (response);
     return ret;
   }
@@ -114,10 +117,7 @@ ahc_echo (void *cls,
 int
 main (int argc, char *const *argv)
 {
-  int fd;
   char rnd[8];
-  ssize_t len;
-  size_t off;
   struct MHD_Daemon *d;
   unsigned int port;
 
@@ -125,33 +125,67 @@ main (int argc, char *const *argv)
        (1 != sscanf (argv[1], "%u", &port)) ||
        (65535 < port) )
   {
-    printf ("%s PORT\n", argv[0]);
+    fprintf (stderr, "%s PORT\n", argv[0]);
     return 1;
   }
 
-  fd = open ("/dev/urandom", O_RDONLY);
-  if (-1 == fd)
-  {
-    fprintf (stderr, "Failed to open `%s': %s\n",
-             "/dev/urandom",
-             strerror (errno));
-    return 1;
-  }
-  off = 0;
-  while (off < 8)
+  if (1)
   {
-    len = read (fd, rnd, 8);
-    if (0 > len)
+#if ! defined(_WIN32) || defined(__CYGWIN__)
+    int fd;
+    ssize_t len;
+    size_t off;
+
+    fd = open ("/dev/urandom", O_RDONLY);
+    if (-1 == fd)
     {
-      fprintf (stderr, "Failed to read `%s': %s\n",
+      fprintf (stderr, "Failed to open `%s': %s\n",
                "/dev/urandom",
                strerror (errno));
-      (void) close (fd);
       return 1;
     }
-    off += (size_t) len;
+    for (off = 0; off < sizeof(rnd); off += (size_t) len)
+    {
+      len = read (fd, rnd, 8);
+      if (0 > len)
+      {
+        fprintf (stderr, "Failed to read `%s': %s\n",
+                 "/dev/urandom",
+                 strerror (errno));
+        (void) close (fd);
+        return 1;
+      }
+    }
+    (void) close (fd);
+#else  /* Native W32 */
+    HCRYPTPROV cc;
+    BOOL b;
+
+    b = CryptAcquireContext (&cc,
+                             NULL,
+                             NULL,
+                             PROV_RSA_FULL,
+                             CRYPT_VERIFYCONTEXT);
+    if (FALSE == b)
+    {
+      fprintf (stderr,
+               "Failed to acquire crypto provider context: %lu\n",
+               (unsigned long) GetLastError ());
+      return 1;
+    }
+    b = CryptGenRandom (cc, sizeof(rnd), (BYTE *) rnd);
+    if (FALSE == b)
+    {
+      fprintf (stderr,
+               "Failed to generate 8 random bytes: %lu\n",
+               GetLastError ());
+    }
+    CryptReleaseContext (cc, 0);
+    if (FALSE == b)
+      return 1;
+#endif /* Native W32 */
   }
-  (void) close (fd);
+
   d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION
                         | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_ERROR_LOG,
                         (uint16_t) port,

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]