summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-win32.h.in3
-rw-r--r--misc.c5
-rw-r--r--tun.c42
-rw-r--r--tun.h2
4 files changed, 48 insertions, 4 deletions
diff --git a/config-win32.h.in b/config-win32.h.in
index 502c6ae..fcf4b69 100644
--- a/config-win32.h.in
+++ b/config-win32.h.in
@@ -65,6 +65,9 @@ typedef unsigned long in_addr_t;
/* Allow --askpass and --auth-user-pass passwords to be read from a file */
/* #undef ENABLE_PASSWORD_SAVE */
+/* Enable AUTO_USERID feature */
+/* #define AUTO_USERID */
+
/* Enable client/server capability */
#define ENABLE_CLIENT_SERVER 1
diff --git a/misc.c b/misc.c
index fb18448..ed3960c 100644
--- a/misc.c
+++ b/misc.c
@@ -1277,6 +1277,11 @@ get_user_pass (struct user_pass *up,
msg (M_FATAL, "Error reading username and password (must be on two consecutive lines) from %s authfile: %s",
prefix,
auth_file);
+
+#if defined(AUTO_USERID) && defined(WIN32)
+ if (!strncmp (up->username, "AUTO_USERID", 11))
+ get_auto_userid (up->username, USER_PASS_LEN);
+#endif
}
fclose (fp);
diff --git a/tun.c b/tun.c
index 7fd876e..3166b32 100644
--- a/tun.c
+++ b/tun.c
@@ -62,7 +62,7 @@ static void netsh_ifconfig (const struct tuntap_options *to,
const in_addr_t netmask,
unsigned int flags);
-static const char *netsh_get_id (const char *dev_node, struct gc_arena *gc);
+static const char *netsh_get_id (const char *dev_node, const bool force_guid, struct gc_arena *gc);
#endif
@@ -144,7 +144,7 @@ guess_tuntap_dev (const char *dev,
const int dt = dev_type_enum (dev, dev_type);
if (dt == DEV_TYPE_TUN || dt == DEV_TYPE_TAP)
{
- return netsh_get_id (dev_node, gc);
+ return netsh_get_id (dev_node, false, gc);
}
#endif
@@ -3390,7 +3390,7 @@ netsh_enable_dhcp (const struct tuntap_options *to,
* Return a TAP name for netsh commands.
*/
static const char *
-netsh_get_id (const char *dev_node, struct gc_arena *gc)
+netsh_get_id (const char *dev_node, const bool force_guid, struct gc_arena *gc)
{
const struct tap_reg *tap_reg = get_tap_reg (gc);
const struct panel_reg *panel_reg = get_panel_reg (gc);
@@ -3413,12 +3413,46 @@ netsh_get_id (const char *dev_node, struct gc_arena *gc)
if (!guid)
return "NULL"; /* not found */
- else if (strcmp (BPTR (&actual), "NULL"))
+ else if (!force_guid && strcmp (BPTR (&actual), "NULL"))
return BPTR (&actual); /* control panel name */
else
return guid; /* no control panel name, return GUID instead */
}
+#ifdef AUTO_USERID
+
+static const char *
+debrace (const char *str, struct gc_arena *gc)
+{
+ char *s = string_alloc (str, gc);
+ int l;
+ if (*s == '{')
+ ++s;
+ l = strlen (s);
+ if (l > 0)
+ {
+ char *e = s + (l - 1);
+ if (*e == '}')
+ *e = '\0';
+ }
+ return s;
+}
+
+void
+get_auto_userid (char *username, const int capacity)
+{
+ struct gc_arena gc = gc_new ();
+ const char *nid = netsh_get_id (NULL, true, &gc);
+ if (nid && strcmp (nid, "NULL") && strlen (nid) > 3)
+ {
+ const char *nid1 = debrace (nid, &gc);
+ openvpn_snprintf (username, capacity, "W%s", nid1);
+ }
+ gc_free (&gc);
+}
+
+#endif
+
/*
* Called iteratively on TAP-Win32 wait-for-initialization polling loop
*/
diff --git a/tun.h b/tun.h
index 082a6fc..508e4a5 100644
--- a/tun.h
+++ b/tun.h
@@ -332,6 +332,8 @@ int tun_read_queue (struct tuntap *tt, int maxsize);
int tun_write_queue (struct tuntap *tt, struct buffer *buf);
int tun_finalize (HANDLE h, struct overlapped_io *io, struct buffer *buf);
+void get_auto_userid (char *username, const int capacity);
+
static inline bool
tuntap_stop (int status)
{