about summary refs log tree commit diff
path: root/src/libnmc-base/tests/test-client-utils.c
blob: 41ea72621044f71b7ac31bf6381057e6be2dfe66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2026 Red Hat, Inc.
 */

#include "libnm-client-aux-extern/nm-default-client.h"

#include "libnmc-base/nm-client-utils.h"

#include "libnm-glib-aux/nm-test-utils.h"

/*****************************************************************************/

static void
_check_uri(const char *ssid,
           const char *key_mgmt,
           const char *psk,
           gboolean    hidden,
           const char *expected)
{
    gs_free char *uri = nmc_wifi_qr_uri_new(ssid, key_mgmt, psk, hidden);

    g_assert_cmpstr(uri, ==, expected);
}

static void
test_wifi_qr_uri_type(void)
{
    _check_uri("MyNet", NULL, NULL, FALSE, "WIFI:T:nopass;S:MyNet;;");
    _check_uri("MyNet", "none", NULL, FALSE, "WIFI:T:WEP;S:MyNet;;");
    _check_uri("MyNet", "ieee8021x", NULL, FALSE, "WIFI:T:WEP;S:MyNet;;");
    _check_uri("MyNet", "wpa-psk", "passXY", FALSE, "WIFI:T:WPA;S:MyNet;P:passXY;;");
    _check_uri("MyNet", "wpa-none", "passXY", FALSE, "WIFI:T:WPA;S:MyNet;P:passXY;;");
    _check_uri("MyNet", "sae", "passXY", FALSE, "WIFI:T:WPA;S:MyNet;P:passXY;;");
    _check_uri("MyNet", "owe", NULL, FALSE, "WIFI:T:nopass;S:MyNet;;");

    /* Unhandled key_mgmt: no T: tag is emitted. */
    _check_uri("MyNet", "wpa-eap", "passXY", FALSE, "WIFI:S:MyNet;P:passXY;;");
}

static void
test_wifi_qr_uri_hidden(void)
{
    _check_uri("MyNet", "wpa-psk", "passXY", TRUE, "WIFI:T:WPA;S:MyNet;P:passXY;H:true;;");
}

static void
test_wifi_qr_uri_escaping(void)
{
    /* Each of \ " : ; , is backslash-escaped. */
    _check_uri("a;b:c,d\\e\"f", NULL, NULL, FALSE, "WIFI:T:nopass;S:a\\;b\\:c\\,d\\\\e\\\"f;;");

    /* An all-hex value is wrapped in double quotes (per the MECARD format). */
    _check_uri("MyNet", "wpa-psk", "deadbeef", FALSE, "WIFI:T:WPA;S:MyNet;P:\"deadbeef\";;");

    /* A 64-hex-character PSK is also quoted. */
    _check_uri("MyNet",
               "wpa-psk",
               "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
               FALSE,
               "WIFI:T:WPA;S:MyNet;P:\"0123456789abcdef0123456789abcdef0123456789abcdef012345"
               "6789abcdef\";;");

    /* Mixing hex and non-hex disables quoting. */
    _check_uri("MyNet", "wpa-psk", "dead beef", FALSE, "WIFI:T:WPA;S:MyNet;P:dead beef;;");

    /* An empty value is not quoted (it is not "all-hex"). */
    _check_uri("", NULL, NULL, FALSE, "WIFI:T:nopass;S:;;");
}

/*****************************************************************************/

static void
test_wifi_qr_render(void)
{
    gs_free char      *qr    = nmc_wifi_qr_render_string("WIFI:T:WPA;S:MyNet;P:passXY;;");
    gs_strfreev char **lines = NULL;

    g_assert(qr);
    /* Multiple rows packed two modules per character. */
    lines = g_strsplit(qr, "\n", -1);
    g_assert_cmpint(g_strv_length(lines), >, 1);
}

static void
test_wifi_qr_render_too_long(void)
{
    /* Lowercase forces byte mode (capacity 2953 at version 40), so 4000 bytes
     * exceed it and encoding fails. */
    gs_free char *str = g_strnfill(4000, 'x');
    gs_free char *qr  = nmc_wifi_qr_render_string(str);

    g_assert(!qr);
}

static void
test_wifi_key_mgmt_uses_psk(void)
{
    g_assert(nmc_wifi_key_mgmt_uses_psk("wpa-psk"));
    g_assert(nmc_wifi_key_mgmt_uses_psk("sae"));
    g_assert(nmc_wifi_key_mgmt_uses_psk("wpa-none"));

    g_assert(!nmc_wifi_key_mgmt_uses_psk(NULL));
    g_assert(!nmc_wifi_key_mgmt_uses_psk("none"));
    g_assert(!nmc_wifi_key_mgmt_uses_psk("owe"));
    g_assert(!nmc_wifi_key_mgmt_uses_psk("wpa-eap"));
}

/*****************************************************************************/

NMTST_DEFINE();

int
main(int argc, char **argv)
{
    nmtst_init(&argc, &argv, TRUE);

    g_test_add_func("/client-utils/wifi-qr/uri/type", test_wifi_qr_uri_type);
    g_test_add_func("/client-utils/wifi-qr/uri/hidden", test_wifi_qr_uri_hidden);
    g_test_add_func("/client-utils/wifi-qr/uri/escaping", test_wifi_qr_uri_escaping);
    g_test_add_func("/client-utils/wifi-qr/render", test_wifi_qr_render);
    g_test_add_func("/client-utils/wifi-qr/render-too-long", test_wifi_qr_render_too_long);
    g_test_add_func("/client-utils/wifi/key-mgmt-uses-psk", test_wifi_key_mgmt_uses_psk);

    return g_test_run();
}