mirror of
https://gitlab.gnome.org/GNOME/libsecret.git
synced 2024-12-21 12:18:51 +00:00
pam: add tests for the ported PAM module
These changes add PAM tests based on pam_wrapper and libpamtest. Signed-off-by: Dhanuka Warusadura <dhanuka@gnome.org>
This commit is contained in:
parent
9a37dc839a
commit
b399f5f631
@ -17,3 +17,29 @@ pam_gnome_keyring = shared_library('pam_gnome_keyring',
|
||||
],
|
||||
name_prefix: '',
|
||||
)
|
||||
|
||||
# pam tests
|
||||
pam_wrapper = dependency('pam_wrapper', required: true)
|
||||
libpamtest = dependency('libpamtest', required: true)
|
||||
|
||||
subdir('servicedir')
|
||||
|
||||
test_bin = executable('pam_test',
|
||||
sources: [
|
||||
'test-pam.c',
|
||||
],
|
||||
dependencies: [
|
||||
libpamtest,
|
||||
glib_deps,
|
||||
],
|
||||
)
|
||||
|
||||
test('pam-test',
|
||||
test_bin,
|
||||
env: {
|
||||
'LD_PRELOAD': 'libpam_wrapper.so',
|
||||
'PAM_WRAPPER': '1',
|
||||
'PAM_WRAPPER_DEBUGLEVEL': '5',
|
||||
'PAM_WRAPPER_SERVICE_DIR': meson.current_build_dir() + '/servicedir',
|
||||
},
|
||||
)
|
||||
|
11
pam/servicedir/meson.build
Normal file
11
pam/servicedir/meson.build
Normal file
@ -0,0 +1,11 @@
|
||||
custom_target('pam-test-service',
|
||||
command: 'true',
|
||||
output: 'null',
|
||||
depend_files: configure_file(
|
||||
input: 'pam-test-service.in',
|
||||
output: 'pam-test-service',
|
||||
configuration: configuration_data({
|
||||
'KEYRING_PAM': pam_gnome_keyring.full_path(),
|
||||
}),
|
||||
),
|
||||
)
|
3
pam/servicedir/pam-test-service.in
Normal file
3
pam/servicedir/pam-test-service.in
Normal file
@ -0,0 +1,3 @@
|
||||
auth required @KEYRING_PAM@
|
||||
password required @KEYRING_PAM@
|
||||
session required @KEYRING_PAM@
|
173
pam/test-pam.c
Normal file
173
pam/test-pam.c
Normal file
@ -0,0 +1,173 @@
|
||||
/*
|
||||
* libsecret
|
||||
*
|
||||
* Copyright (C) 2023 GNOME Foundation Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received copies of the GNU General Public License and
|
||||
* the GNU Lesser General Public License along with this program. If
|
||||
* not, see http://www.gnu.org/licenses/.
|
||||
*
|
||||
* Author: Dhanuka Warusadura
|
||||
*/
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gstdio.h>
|
||||
#include <glib/gprintf.h>
|
||||
#include <gio/gio.h>
|
||||
#include <gio/gunixsocketaddress.h>
|
||||
|
||||
#include <libpamtest.h>
|
||||
|
||||
#define SERVICE "pam-test-service"
|
||||
#define BUFFER_SIZE 100
|
||||
|
||||
typedef struct {
|
||||
gchar *control_path;
|
||||
GSocketAddress *address;
|
||||
GSocketService *service;
|
||||
GThread *pam_test;
|
||||
gboolean success;
|
||||
} Test;
|
||||
|
||||
static gchar dir_path[] = "/tmp/pam_test_XXXXXX";
|
||||
|
||||
static gboolean
|
||||
is_bytes_exchanged (GSocketService *service,
|
||||
GSocketConnection *connection,
|
||||
GObject *source_object,
|
||||
gpointer data)
|
||||
{
|
||||
Test *test = data;
|
||||
GInputStream *input;
|
||||
GError *error = NULL;
|
||||
char buffer[BUFFER_SIZE + 1];
|
||||
|
||||
g_printf ("Incoming signal detected\n");
|
||||
|
||||
if (g_socket_service_is_active (service))
|
||||
test->success = TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
input = g_io_stream_get_input_stream (G_IO_STREAM(connection));
|
||||
|
||||
if (g_input_stream_read (input,
|
||||
buffer,
|
||||
BUFFER_SIZE,
|
||||
NULL,
|
||||
&error) > 0)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
teardown (Test *test)
|
||||
{
|
||||
g_assert_true (g_socket_service_is_active (test->service));
|
||||
g_thread_join (test->pam_test);
|
||||
g_socket_service_stop (test->service);
|
||||
g_assert_false (g_socket_service_is_active (test->service));
|
||||
|
||||
g_object_unref (test->address);
|
||||
g_unlink (test->control_path);
|
||||
g_free (test->control_path);
|
||||
g_free (test);
|
||||
g_rmdir (dir_path);
|
||||
|
||||
g_printf ("Teardown completed\n");
|
||||
}
|
||||
|
||||
static void *
|
||||
pam_auth_tests (gpointer data)
|
||||
{
|
||||
Test *test = data;
|
||||
enum pamtest_err ret;
|
||||
|
||||
g_printf ("Executing PAM auth tests\n");
|
||||
|
||||
const char *auth_tokens[] = {
|
||||
"password",
|
||||
NULL
|
||||
};
|
||||
|
||||
struct pamtest_conv_data conv_data = {
|
||||
.in_echo_off = auth_tokens
|
||||
};
|
||||
|
||||
struct pam_testcase tests[] = {
|
||||
pam_test (PAMTEST_AUTHENTICATE, PAM_SUCCESS)
|
||||
};
|
||||
|
||||
g_assert_true (g_socket_service_is_active (test->service));
|
||||
ret = run_pamtest (SERVICE, g_get_user_name (), &conv_data, tests, NULL);
|
||||
g_assert_cmpint (ret, ==, PAMTEST_ERR_OK);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
mock_service (void)
|
||||
{
|
||||
GError *error = NULL;
|
||||
Test *test;
|
||||
|
||||
g_printf ("Starting mock service\n");
|
||||
|
||||
test = g_malloc (sizeof (Test));
|
||||
test->success = FALSE;
|
||||
|
||||
g_mkdtemp (dir_path);
|
||||
g_setenv ("GNOME_KEYRING_CONTROL", dir_path, TRUE);
|
||||
test->control_path = g_strconcat (dir_path, "/control", NULL);
|
||||
|
||||
test->address = g_unix_socket_address_new (test->control_path);
|
||||
test->service = g_socket_service_new ();
|
||||
g_socket_service_stop (test->service);
|
||||
g_assert_false (g_socket_service_is_active (test->service));
|
||||
|
||||
g_signal_connect (test->service,
|
||||
"incoming",
|
||||
G_CALLBACK (is_bytes_exchanged),
|
||||
test);
|
||||
|
||||
g_socket_listener_add_address (G_SOCKET_LISTENER (test->service),
|
||||
test->address,
|
||||
G_SOCKET_TYPE_STREAM,
|
||||
G_SOCKET_PROTOCOL_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
&error);
|
||||
g_assert_no_error (error);
|
||||
|
||||
g_socket_service_start (test->service);
|
||||
g_assert_true (g_socket_service_is_active (test->service));
|
||||
|
||||
test->pam_test = g_thread_new ("pam_test", pam_auth_tests, test);
|
||||
|
||||
do
|
||||
g_main_context_iteration (NULL, TRUE);
|
||||
while (!test->success);
|
||||
|
||||
teardown (test);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc,
|
||||
char *argv[])
|
||||
{
|
||||
g_test_init (&argc, &argv, NULL);
|
||||
g_test_add_func ("/pam/test_pam_authtok", mock_service);
|
||||
|
||||
return g_test_run();
|
||||
}
|
Loading…
Reference in New Issue
Block a user