test_pam_srv.c revision c8fe1d922b254aa92e74f428135ada3c8bde87a1
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/*
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen Authors:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen Sumit Bose <sbose@redhat.com>
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen Copyright (C) 2015 Red Hat
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen SSSD tests: PAM responder tests
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen This program is free software; you can redistribute it and/or modify
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen it under the terms of the GNU General Public License as published by
463e82bdf0e990f4f2252d2b53ea23a5abe5883cTimo Sirainen the Free Software Foundation; either version 3 of the License, or
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (at your option) any later version.
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen This program is distributed in the hope that it will be useful,
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen GNU General Public License for more details.
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen You should have received a copy of the GNU General Public License
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen*/
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen#include <security/pam_modules.h>
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen#include <popt.h>
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen
20c892309312df8f4f73cfcaf8acd2ededda8b05Timo Sirainen#include "tests/cmocka/common_mock.h"
20c892309312df8f4f73cfcaf8acd2ededda8b05Timo Sirainen#include "tests/cmocka/common_mock_resp.h"
20c892309312df8f4f73cfcaf8acd2ededda8b05Timo Sirainen#include "responder/common/responder_packet.h"
20c892309312df8f4f73cfcaf8acd2ededda8b05Timo Sirainen#include "responder/common/negcache.h"
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen#include "responder/pam/pamsrv.h"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#include "responder/pam/pam_helpers.h"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#include "sss_client/pam_message.h"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#include "sss_client/sss_cli.h"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#include "confdb/confdb.h"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#include "util/crypto/sss_crypto.h"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#ifdef HAVE_NSS
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#include "util/crypto/nss/nss_util.h"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#endif
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#define TESTS_PATH "tp_" BASE_FILE_STEM
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#define TEST_CONF_DB "test_pam_conf.ldb"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#define TEST_DOM_NAME "pam_test"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#define TEST_SUBDOM_NAME "test.subdomain"
c21c33a8c98972c45349066fc76ac9e2c05013c1Timo Sirainen#define TEST_ID_PROVIDER "ldap"
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen#define NSS_DB_PATH TESTS_PATH
7bd3f5614e0dd2324dd1015f084de72c0b069a1aTimo Sirainen#define NSS_DB "sql:"NSS_DB_PATH
7bd3f5614e0dd2324dd1015f084de72c0b069a1aTimo Sirainen
7bd3f5614e0dd2324dd1015f084de72c0b069a1aTimo Sirainen#define TEST_TOKEN_NAME "SSSD Test Token"
7bd3f5614e0dd2324dd1015f084de72c0b069a1aTimo Sirainen#define TEST_TOKEN_CERT \
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen"MIIECTCCAvGgAwIBAgIBCDANBgkqhkiG9w0BAQsFADA0MRIwEAYDVQQKDAlJUEEu" \
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen"REVWRUwxHjAcBgNVBAMMFUNlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0xNTA2MjMx" \
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen"NjMyMDdaFw0xNzA2MjMxNjMyMDdaMDIxEjAQBgNVBAoMCUlQQS5ERVZFTDEcMBoG" \
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen"A1UEAwwTaXBhLWRldmVsLmlwYS5kZXZlbDCCASIwDQYJKoZIhvcNAQEBBQADggEP" \
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen"ADCCAQoCggEBALXUq56VlY+Z0aWLLpFAjFfbElPBXGQsbZb85J3cGyPjaMHC9wS+" \
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen"wjB6Ve4HmQyPLx8hbINdDmbawMHYQvTScLYfsqLtj0Lqw20sUUmedk+Es5Oh9VHo" \
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen"nd8MavYx25Du2u+T0iSgNIDikXguiwCmtAj8VC49ebbgITcjJGzMmiiuJkV3o93Y" \
e6d7d19c328e7043ad35d5a52c1617bde915a16fTimo Sirainen"vvYF0VjLGDQbQWOy7IxzYJeNVJnZWKo67CHdok6qOrm9rxQt81rzwV/mGLbCMUbr" \
d7095f3a4466fbb78b2d5eb3d322bc15a5b0ab1fTimo Sirainen"+N4M8URtd7EmzaYZQmNm//s2owFrCYMxpLiURPj+URZVuB72504/Ix7X0HCbA/AV" \
153de7823e64c67678b3fc95719c41a8ec5b864dTimo Sirainen"26J27fPY5nc8DMwfhUDCbTqPH/JEjd3mvY8CAwEAAaOCASYwggEiMB8GA1UdIwQY" \
153de7823e64c67678b3fc95719c41a8ec5b864dTimo Sirainen"MBaAFJOq+KAQmPEnNp8Wok23eGTdE7aDMDsGCCsGAQUFBwEBBC8wLTArBggrBgEF" \
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen"BQcwAYYfaHR0cDovL2lwYS1jYS5pcGEuZGV2ZWwvY2Evb2NzcDAOBgNVHQ8BAf8E" \
b0be0bead3d6963149f7f2a9504b8ab5aced9af5Timo Sirainen"BAMCBPAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMHQGA1UdHwRtMGsw" \
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen"aaAxoC+GLWh0dHA6Ly9pcGEtY2EuaXBhLmRldmVsL2lwYS9jcmwvTWFzdGVyQ1JM" \
e6d7d19c328e7043ad35d5a52c1617bde915a16fTimo Sirainen"LmJpbqI0pDIwMDEOMAwGA1UECgwFaXBhY2ExHjAcBgNVBAMMFUNlcnRpZmljYXRl" \
8d131435ba4648c8821160ec38d508c97177c715Timo Sirainen"IEF1dGhvcml0eTAdBgNVHQ4EFgQUFaDNd5a53QGpaw5m63hnwXicMQ8wDQYJKoZI" \
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen"hvcNAQELBQADggEBADH7Nj00qqGhGJeXJQAsepqSskz/wooqXh8vgVyb8SS4N0/c" \
7de1c472fd23ddac6b4dc5cbeee6fa6a8418b071Timo Sirainen"0aQtVmY81xamlXE12ZFpwDX43d+EufBkwCUKFX/+8JFDd2doAyeJxv1xM22kKRpc" \
7de1c472fd23ddac6b4dc5cbeee6fa6a8418b071Timo Sirainen"AqITPgMsa9ToGMWxjbVpc/X/5YfZixWPF0/eZUTotBj9oaR039UrhGfyN7OguF/G" \
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen"rzmxtB5y4ZrMpcD/Oe90mkd9HY7sA/fB8OWOUgeRfQoh97HNS0UiDWsPtfxmjQG5" \
538c58fc95200fcc5e91abdda8b912b574a2f968Timo Sirainen"zotpoBIZmdH+ipYsu58HohHVlM9Wi5H4QmiiXl+Soldkq7eXYlafcmT7wv8+cKwz" \
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen"Nz0Tm3+eYpFqRo3skr6QzXi525Jkg3r6r+kkhxU=" \
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenstatic char CACHED_AUTH_TIMEOUT_STR[] = "4";
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenstatic const int CACHED_AUTH_TIMEOUT = 4;
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainenstruct pam_test_ctx {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen struct sss_test_ctx *tctx;
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen struct sss_domain_info *subdom;
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct resp_ctx *rctx;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct cli_ctx *cctx;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct sss_cmd_table *pam_cmds;
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen struct pam_ctx *pctx;
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen int ncache_hits;
7de1c472fd23ddac6b4dc5cbeee6fa6a8418b071Timo Sirainen int exp_pam_status;
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen bool provider_contacted;
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen const char *pam_user_fqdn;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen const char *wrong_user_fqdn;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen};
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen/* Must be global because it is needed in some wrappers */
7de1c472fd23ddac6b4dc5cbeee6fa6a8418b071Timo Sirainenstruct pam_test_ctx *pam_test_ctx;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenstatic errno_t setup_nss_db(void)
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen{
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen int ret;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen FILE *fp;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen int status;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen pid_t child_pid;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ret = mkdir(NSS_DB_PATH, 0775);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ret != EOK) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, "Failed to create " NSS_DB_PATH ".\n");
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen return ret;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen }
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen child_pid = fork();
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen if (child_pid == 0) { /* child */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ret = execlp("certutil", "certutil", "-N", "--empty-password", "-d",
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen NSS_DB, NULL);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen if (ret == -1) {
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, "execl() failed.\n");
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen exit(-1);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen }
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen } else if (child_pid > 0) {
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen wait(&status);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen } else {
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen ret = errno;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, "fork() failed\n");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return ret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen fp = fopen(NSS_DB_PATH"/pkcs11.txt", "w");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (fp == NULL) {
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, "fopen() failed.\n");
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen return ret;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen }
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen ret = fprintf(fp, "library=libsoftokn3.so\nname=soft\n");
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen if (ret < 0) {
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, "fprintf() failed.\n");
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen return ret;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen }
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen ret = fprintf(fp, "parameters=configdir='sql:%s/src/tests/cmocka/p11_nssdb' dbSlotDescription='SSSD Test Slot' dbTokenDescription='SSSD Test Token' secmod='secmod.db' flags=readOnly \n\n", ABS_SRC_DIR);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen if (ret < 0) {
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, "fprintf() failed.\n");
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen return ret;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen }
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen ret = fclose(fp);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ret != 0) {
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, "fclose() failed.\n");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return ret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen return EOK;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen}
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainenstatic void cleanup_nss_db(void)
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen{
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen int ret;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ret = unlink(NSS_DB_PATH"/cert9.db");
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen if (ret != EOK) {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, "Failed to remove cert9.db.\n");
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen }
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen ret = unlink(NSS_DB_PATH"/key4.db");
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen if (ret != EOK) {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, "Failed to remove key4.db.\n");
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen }
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ret = unlink(NSS_DB_PATH"/pkcs11.txt");
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen if (ret != EOK) {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, "Failed to remove pkcs11.db.\n");
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen }
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen ret = rmdir(NSS_DB_PATH);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen if (ret != EOK) {
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, "Failed to remove " NSS_DB_PATH "\n");
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen }
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainenstruct pam_ctx *mock_pctx(TALLOC_CTX *mem_ctx)
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen{
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen struct pam_ctx *pctx;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen errno_t ret;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen pctx = talloc_zero(mem_ctx, struct pam_ctx);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen assert_non_null(pctx);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ret = sss_hash_create(pctx, 10, &pctx->id_table);
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen assert_int_equal(ret, EOK);
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen return pctx;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen}
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int add_confdb_params(struct sss_test_conf_param params[],
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen struct confdb_ctx *cdb, const char *section)
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen{
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen const char *val[2];
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen int ret;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen val[1] = NULL;
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen for (int i = 0; params[i].key; i++) {
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen val[0] = params[i].value;
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen ret = confdb_add_param(cdb, true, section, params[i].key, val);
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen assert_int_equal(ret, EOK);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return EOK;
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen}
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenstatic int add_pam_params(struct sss_test_conf_param pam_params[],
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct confdb_ctx *cdb)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return add_confdb_params(pam_params, cdb, CONFDB_PAM_CONF_ENTRY);
68b3667c9ee95951d7c3e03b19b2d37abbaa5736Timo Sirainen}
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainenstatic int add_monitor_params(struct sss_test_conf_param monitor_params[],
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct confdb_ctx *cdb)
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen{
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen return add_confdb_params(monitor_params, cdb, CONFDB_MONITOR_CONF_ENTRY);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
7889c9f65e23c83fc31cecf304cab4ab070d6aa1Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenvoid test_pam_setup(struct sss_test_conf_param dom_params[],
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct sss_test_conf_param pam_params[],
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen struct sss_test_conf_param monitor_params[],
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen void **state)
e20e638805c4bd54e039891a3e92760b1dfa189aTimo Sirainen{
68b3667c9ee95951d7c3e03b19b2d37abbaa5736Timo Sirainen struct cli_protocol *prctx;
68b3667c9ee95951d7c3e03b19b2d37abbaa5736Timo Sirainen errno_t ret;
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen pam_test_ctx = talloc_zero(NULL, struct pam_test_ctx);
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen assert_non_null(pam_test_ctx);
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen
68b3667c9ee95951d7c3e03b19b2d37abbaa5736Timo Sirainen pam_test_ctx->tctx = create_dom_test_ctx(pam_test_ctx, TESTS_PATH,
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen TEST_CONF_DB, TEST_DOM_NAME,
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen TEST_ID_PROVIDER, dom_params);
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen assert_non_null(pam_test_ctx->tctx);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen pam_test_ctx->pam_cmds = get_pam_cmds();
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen assert_non_null(pam_test_ctx->pam_cmds);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen /* FIXME - perhaps this should be folded into sssd_domain_init or stricty
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen * used together
8bb360f9e5de1c25e4f875205bb06e8bf15dae14Timo Sirainen */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ret = sss_names_init(pam_test_ctx, pam_test_ctx->tctx->confdb,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen TEST_DOM_NAME, &pam_test_ctx->tctx->dom->names);
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen assert_int_equal(ret, EOK);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen /* Initialize the PAM responder */
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pam_test_ctx->pctx = mock_pctx(pam_test_ctx);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen assert_non_null(pam_test_ctx->pctx);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pam_test_ctx->rctx = mock_rctx(pam_test_ctx, pam_test_ctx->tctx->ev,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen pam_test_ctx->tctx->dom, pam_test_ctx->pctx);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen assert_non_null(pam_test_ctx->rctx);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pam_test_ctx->rctx->cdb = pam_test_ctx->tctx->confdb;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pam_test_ctx->pctx->rctx = pam_test_ctx->rctx;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen ret = add_pam_params(pam_params, pam_test_ctx->rctx->cdb);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen assert_int_equal(ret, EOK);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen ret = add_monitor_params(monitor_params, pam_test_ctx->rctx->cdb);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen assert_int_equal(ret, EOK);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen /* Create client context */
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pam_test_ctx->cctx = mock_cctx(pam_test_ctx, pam_test_ctx->rctx);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen assert_non_null(pam_test_ctx->cctx);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pam_test_ctx->cctx->ev = pam_test_ctx->tctx->ev;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen prctx = mock_prctx(pam_test_ctx->cctx);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen assert_non_null(prctx);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen pam_test_ctx->cctx->protocol_ctx = prctx;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen prctx->cli_protocol_version = register_cli_protocol_version();
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen}
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainenstatic void pam_test_setup_common(void)
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen{
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen errno_t ret;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen pam_test_ctx->pam_user_fqdn = \
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen sss_create_internal_fqname(pam_test_ctx,
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen "pamuser",
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen pam_test_ctx->tctx->dom->name);
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen assert_non_null(pam_test_ctx->pam_user_fqdn);
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen pam_test_ctx->wrong_user_fqdn = \
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen sss_create_internal_fqname(pam_test_ctx,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen "wronguser",
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen pam_test_ctx->tctx->dom->name);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen assert_non_null(pam_test_ctx->wrong_user_fqdn);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen /* Prime the cache with a valid user */
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen ret = sysdb_add_user(pam_test_ctx->tctx->dom,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen pam_test_ctx->pam_user_fqdn,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen 123, 456, "pam user",
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen "/home/pamuser", "/bin/sh", NULL,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen NULL, 300, 0);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen assert_int_equal(ret, EOK);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen /* Add entry to the initgr cache to make sure no initgr request is sent to
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen * the backend */
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen ret = pam_initgr_cache_set(pam_test_ctx->pctx->rctx->ev,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen pam_test_ctx->pctx->id_table,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen discard_const("pamuser"),
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen pam_test_ctx->pctx->id_timeout);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen assert_int_equal(ret, EOK);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen /* Prime the cache with a user for wrong matches */
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen ret = sysdb_add_user(pam_test_ctx->tctx->dom,
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen pam_test_ctx->wrong_user_fqdn,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen 321, 654, "wrong user",
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen "/home/wronguser", "/bin/sh", NULL,
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen NULL, 300, 0);
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen assert_int_equal(ret, EOK);
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen /* Add entry to the initgr cache to make sure no initgr request is sent to
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen * the backend */
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen ret = pam_initgr_cache_set(pam_test_ctx->pctx->rctx->ev,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen pam_test_ctx->pctx->id_table,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen discard_const("wronguser"),
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen pam_test_ctx->pctx->id_timeout);
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen assert_int_equal(ret, EOK);
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen}
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainenstatic int pam_test_setup(void **state)
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen{
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen struct sss_test_conf_param dom_params[] = {
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen { "enumerate", "false" },
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen { "cache_credentials", "true" },
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen { NULL, NULL }, /* Sentinel */
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen };
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
d1baa8c6f97cdb1b3c2c44a73cc21f9dfc7a963fTimo Sirainen struct sss_test_conf_param pam_params[] = {
d1baa8c6f97cdb1b3c2c44a73cc21f9dfc7a963fTimo Sirainen { "p11_child_timeout", "30" },
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen { NULL, NULL }, /* Sentinel */
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen };
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen struct sss_test_conf_param monitor_params[] = {
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen { "certificate_verification", "no_ocsp"},
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen { NULL, NULL }, /* Sentinel */
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen };
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen test_pam_setup(dom_params, pam_params, monitor_params, state);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen pam_test_setup_common();
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen return 0;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen}
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen#ifdef HAVE_NSS
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainenstatic int pam_test_setup_no_verification(void **state)
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen{
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen struct sss_test_conf_param dom_params[] = {
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen { "enumerate", "false" },
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen { "cache_credentials", "true" },
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen { NULL, NULL }, /* Sentinel */
4b89231f4ec9cc69f4aea715e1d34f405c7e317dTimo Sirainen };
4b89231f4ec9cc69f4aea715e1d34f405c7e317dTimo Sirainen
4b89231f4ec9cc69f4aea715e1d34f405c7e317dTimo Sirainen struct sss_test_conf_param pam_params[] = {
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen { "p11_child_timeout", "30" },
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen { NULL, NULL }, /* Sentinel */
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen };
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen struct sss_test_conf_param monitor_params[] = {
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen { "certificate_verification", "no_verification" },
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen { NULL, NULL }, /* Sentinel */
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen };
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen test_pam_setup(dom_params, pam_params, monitor_params, state);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen pam_test_setup_common();
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen return 0;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen}
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen#endif /* HAVE_NSS */
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainenstatic int pam_cached_test_setup(void **state)
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen{
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen struct sss_test_conf_param dom_params[] = {
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen { "enumerate", "false" },
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen { "cache_credentials", "true" },
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen { "cached_auth_timeout", CACHED_AUTH_TIMEOUT_STR },
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen { NULL, NULL }, /* Sentinel */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen };
abfcd9f73b9ad1eeef4fe6e9940383defabf68c3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct sss_test_conf_param pam_params[] = {
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen { "p11_child_timeout", "30" },
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen { NULL, NULL }, /* Sentinel */
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen };
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen struct sss_test_conf_param monitor_params[] = {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen { "certificate_verification", "no_ocsp"},
abfcd9f73b9ad1eeef4fe6e9940383defabf68c3Timo Sirainen { NULL, NULL }, /* Sentinel */
abfcd9f73b9ad1eeef4fe6e9940383defabf68c3Timo Sirainen };
cd5ee8630497fdbd853ef588a858b4ef619a5e03Timo Sirainen
cd5ee8630497fdbd853ef588a858b4ef619a5e03Timo Sirainen test_pam_setup(dom_params, pam_params, monitor_params, state);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
7394389230750c45b105cdefb5850c81cae8cdc0Timo Sirainen pam_test_setup_common();
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen return 0;
1032e5427bf10566098f3b3bb9110e2bc1227e85Timo Sirainen}
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainenstatic int pam_test_teardown(void **state)
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen{
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen int ret;
9887c39c5ba429169389153ca99de49e084a73f0Timo Sirainen
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen ret = sysdb_delete_user(pam_test_ctx->tctx->dom,
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen pam_test_ctx->pam_user_fqdn, 0);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen assert_int_equal(ret, EOK);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen ret = sysdb_delete_user(pam_test_ctx->tctx->dom,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen pam_test_ctx->wrong_user_fqdn, 0);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen talloc_free(pam_test_ctx);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen return 0;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainentypedef int (*cmd_cb_fn_t)(uint32_t, uint8_t *, size_t);
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainenint __real_read_pipe_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
1032e5427bf10566098f3b3bb9110e2bc1227e85Timo Sirainen uint8_t **buf, ssize_t *len);
1032e5427bf10566098f3b3bb9110e2bc1227e85Timo Sirainen
1032e5427bf10566098f3b3bb9110e2bc1227e85Timo Sirainenvoid __real_sss_packet_get_body(struct sss_packet *packet,
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen uint8_t **body, size_t *blen);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainenvoid __wrap_sss_packet_get_body(struct sss_packet *packet,
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen uint8_t **body, size_t *blen)
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen{
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen enum sss_test_wrapper_call wtype = sss_mock_type(enum sss_test_wrapper_call);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen size_t len;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen if (wtype == WRAP_CALL_REAL) {
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen return __real_sss_packet_get_body(packet, body, blen);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen }
2ebfb5c0608e2323b73271208f4036a7ea7d7f3aTimo Sirainen
2ebfb5c0608e2323b73271208f4036a7ea7d7f3aTimo Sirainen *body = sss_mock_ptr_type(uint8_t *);
2ebfb5c0608e2323b73271208f4036a7ea7d7f3aTimo Sirainen len = sss_mock_type(size_t);
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen if (len == 0) {
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen len = strlen((const char *) *body) + 1;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen }
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen *blen = len;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen return;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen}
41bb0aa8e357876bc9a1916a37c9e3e78e5f8185Timo Sirainen
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainenvoid __real_sss_packet_get_body(struct sss_packet *packet,
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen uint8_t **body, size_t *blen);
dd8de60250511cc729b67249e61dfc6b4debff11Timo Sirainen
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainenvoid __wrap_sss_cmd_done(struct cli_ctx *cctx, void *freectx)
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen{
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen struct cli_protocol *prctx;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen struct sss_packet *packet;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint8_t *body;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen size_t blen;
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen cmd_cb_fn_t check_cb;
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen prctx = talloc_get_type(cctx->protocol_ctx, struct cli_protocol);
7394389230750c45b105cdefb5850c81cae8cdc0Timo Sirainen packet = prctx->creq->out;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen assert_non_null(packet);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen check_cb = sss_mock_ptr_type(cmd_cb_fn_t);
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen __real_sss_packet_get_body(packet, &body, &blen);
20b9283d4af31e45e588014da427fb2dbcd3227aTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen pam_test_ctx->tctx->error = check_cb(sss_packet_get_status(packet),
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen body, blen);
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen pam_test_ctx->tctx->done = true;
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen}
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainenenum sss_cli_command __wrap_sss_packet_get_cmd(struct sss_packet *packet)
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen{
41bb0aa8e357876bc9a1916a37c9e3e78e5f8185Timo Sirainen return sss_mock_type(enum sss_cli_command);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen}
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
b35f7104715edee0cfac6d46ab0b342033867eb7Timo Sirainenint __wrap_sss_cmd_send_empty(struct cli_ctx *cctx, TALLOC_CTX *freectx)
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen pam_test_ctx->tctx->done = true;
51920d00fa50edf7b2e9b1019288d64b7abee7f3Timo Sirainen pam_test_ctx->tctx->error = ENOENT;
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen return EOK;
51920d00fa50edf7b2e9b1019288d64b7abee7f3Timo Sirainen}
21ec6628c567eeff025af35d8027be01044b0b1aTimo Sirainen
21ec6628c567eeff025af35d8027be01044b0b1aTimo Sirainenstatic void set_cmd_cb(cmd_cb_fn_t fn)
21ec6628c567eeff025af35d8027be01044b0b1aTimo Sirainen{
21ec6628c567eeff025af35d8027be01044b0b1aTimo Sirainen will_return(__wrap_sss_cmd_done, fn);
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen}
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainenint __wrap_pam_dp_send_req(struct pam_auth_req *preq, int timeout)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen pam_test_ctx->provider_contacted = true;
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen /* Set expected status */
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen preq->pd->pam_status = pam_test_ctx->exp_pam_status;
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen preq->callback(preq);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen return EOK;
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenstatic void mock_input_pam(TALLOC_CTX *mem_ctx, const char *name,
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen const char *pwd, const char *fa2)
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen{
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen size_t buf_size;
cd5ee8630497fdbd853ef588a858b4ef619a5e03Timo Sirainen uint8_t *m_buf;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen uint8_t *buf;
fd2118e34f4d1d65cffdccc40d74dda931fae81eTimo Sirainen struct pam_items pi = { 0 };
fd2118e34f4d1d65cffdccc40d74dda931fae81eTimo Sirainen int ret;
fd2118e34f4d1d65cffdccc40d74dda931fae81eTimo Sirainen size_t needed_size;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen uint8_t *authtok;
5a7b52012bf77132bb8f466d07e0e88c63fdba42Timo Sirainen
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen if (name != NULL) {
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_user = name;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen pi.pam_user_size = strlen(pi.pam_user) + 1;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen } else {
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen pi.pam_user = "";
9887c39c5ba429169389153ca99de49e084a73f0Timo Sirainen pi.pam_user_size = 0;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen }
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen if (pwd != NULL) {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen if (fa2 != NULL) {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen ret = sss_auth_pack_2fa_blob(pwd, 0, fa2, 0, NULL, 0, &needed_size);
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen assert_int_equal(ret, EAGAIN);
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen authtok = talloc_size(mem_ctx, needed_size);
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen assert_non_null(authtok);
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen ret = sss_auth_pack_2fa_blob(pwd, 0, fa2, 0, authtok,
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen needed_size, &needed_size);
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen assert_int_equal(ret, EOK);
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen pi.pam_authtok = (char *) authtok;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen pi.pam_authtok_size = needed_size;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen pi.pam_authtok_type = SSS_AUTHTOK_TYPE_2FA;
5a7b52012bf77132bb8f466d07e0e88c63fdba42Timo Sirainen } else {
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_authtok = discard_const(pwd);
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_authtok_size = strlen(pi.pam_authtok) + 1;
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_authtok_type = SSS_AUTHTOK_TYPE_PASSWORD;
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen }
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen }
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_service = "pam_test_service";
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_service_size = strlen(pi.pam_service) + 1;
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_tty = "/dev/tty";
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_tty_size = strlen(pi.pam_tty) + 1;
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_ruser = "remuser";
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_ruser_size = strlen(pi.pam_ruser) + 1;
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_rhost = "remhost";
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.pam_rhost_size = strlen(pi.pam_rhost) + 1;
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.requested_domains = "";
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen pi.cli_pid = 12345;
d647e72663b52cb2301df5eaf93e67ee873a41f8Timo Sirainen
5a7b52012bf77132bb8f466d07e0e88c63fdba42Timo Sirainen ret = pack_message_v3(&pi, &buf_size, &m_buf);
5a7b52012bf77132bb8f466d07e0e88c63fdba42Timo Sirainen assert_int_equal(ret, 0);
5a7b52012bf77132bb8f466d07e0e88c63fdba42Timo Sirainen
5a7b52012bf77132bb8f466d07e0e88c63fdba42Timo Sirainen buf = talloc_memdup(mem_ctx, m_buf, buf_size);
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen free(m_buf);
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen assert_non_null(buf);
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_WRAPPER);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen will_return(__wrap_sss_packet_get_body, buf);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen will_return(__wrap_sss_packet_get_body, buf_size);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen}
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainenstatic void mock_input_pam_cert(TALLOC_CTX *mem_ctx, const char *name,
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen const char *pin, const char *service)
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen{
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen size_t buf_size;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen uint8_t *m_buf;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen uint8_t *buf;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen struct pam_items pi = { 0 };
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen int ret;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen if (name != NULL) {
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen pi.pam_user = name;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen pi.pam_user_size = strlen(pi.pam_user) + 1;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen } else {
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen pi.pam_user = "";
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen pi.pam_user_size = 0;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen }
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
e063aca6bc2f08bec516d4b631052ea9191f011dTimo Sirainen if (pin != NULL) {
e063aca6bc2f08bec516d4b631052ea9191f011dTimo Sirainen pi.pam_authtok = discard_const(pin);
e063aca6bc2f08bec516d4b631052ea9191f011dTimo Sirainen pi.pam_authtok_size = strlen(pi.pam_authtok) + 1;
e063aca6bc2f08bec516d4b631052ea9191f011dTimo Sirainen pi.pam_authtok_type = SSS_AUTHTOK_TYPE_SC_PIN;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen }
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.pam_service = service == NULL ? "login" : service;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.pam_service_size = strlen(pi.pam_service) + 1;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.pam_tty = "/dev/tty";
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.pam_tty_size = strlen(pi.pam_tty) + 1;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.pam_ruser = "remuser";
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.pam_ruser_size = strlen(pi.pam_ruser) + 1;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.pam_rhost = "remhost";
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.pam_rhost_size = strlen(pi.pam_rhost) + 1;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.requested_domains = "";
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen pi.cli_pid = 12345;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen ret = pack_message_v3(&pi, &buf_size, &m_buf);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen assert_int_equal(ret, 0);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen buf = talloc_memdup(mem_ctx, m_buf, buf_size);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen free(m_buf);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_non_null(buf);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_WRAPPER);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen will_return(__wrap_sss_packet_get_body, buf);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen will_return(__wrap_sss_packet_get_body, buf_size);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen}
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainenstatic int test_pam_simple_check(uint32_t status, uint8_t *body, size_t blen)
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen{
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen size_t rp = 0;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen uint32_t val;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(status, 0);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(val, pam_test_ctx->exp_pam_status);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(val, 1);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(val, SSS_PAM_DOMAIN_NAME);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(val, 9);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(*(body + rp + val - 1), 0);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_string_equal(body + rp, TEST_DOM_NAME);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen return EOK;
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen}
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen#define PKCS11_LOGIN_TOKEN_ENV_NAME "PKCS11_LOGIN_TOKEN_NAME"
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainenstatic int test_pam_cert_check_gdm_smartcard(uint32_t status, uint8_t *body,
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen size_t blen)
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen{
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen size_t rp = 0;
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen uint32_t val;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(status, 0);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(val, pam_test_ctx->exp_pam_status);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(val, 3);
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen assert_int_equal(val, SSS_PAM_DOMAIN_NAME);
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen assert_int_equal(val, 9);
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen
a0d34d3982507f513a9d800082481e9faeb9a943Timo Sirainen assert_int_equal(*(body + rp + val - 1), 0);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_string_equal(body + rp, TEST_DOM_NAME);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen rp += val;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(val, SSS_PAM_ENV_ITEM);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(val, (strlen(PKCS11_LOGIN_TOKEN_ENV_NAME "=")
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen + sizeof(TEST_TOKEN_NAME)));
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen assert_string_equal(body + rp,
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen PKCS11_LOGIN_TOKEN_ENV_NAME "=" TEST_TOKEN_NAME);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen rp += val;
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen assert_int_equal(val, SSS_PAM_CERT_INFO);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen assert_int_equal(val, (sizeof("pamuser@"TEST_DOM_NAME) + sizeof(TEST_TOKEN_NAME)));
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
ec922832ddc917e48d98fdb409051b9c162b90a3Timo Sirainen assert_int_equal(*(body + rp + sizeof("pamuser@"TEST_DOM_NAME) - 1), 0);
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen assert_string_equal(body + rp, "pamuser@"TEST_DOM_NAME);
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen rp += sizeof("pamuser@"TEST_DOM_NAME);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen assert_int_equal(*(body + rp + sizeof(TEST_TOKEN_NAME) - 1), 0);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_string_equal(body + rp, TEST_TOKEN_NAME);
8bb360f9e5de1c25e4f875205bb06e8bf15dae14Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen return EOK;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen}
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainenstatic int test_pam_cert_check(uint32_t status, uint8_t *body, size_t blen)
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen{
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen size_t rp = 0;
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen uint32_t val;
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen assert_int_equal(status, 0);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen assert_int_equal(val, pam_test_ctx->exp_pam_status);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_int_equal(val, 2);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_int_equal(val, SSS_PAM_DOMAIN_NAME);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_int_equal(val, 9);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_int_equal(*(body + rp + val - 1), 0);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_string_equal(body + rp, TEST_DOM_NAME);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen rp += val;
8bb360f9e5de1c25e4f875205bb06e8bf15dae14Timo Sirainen
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_int_equal(val, SSS_PAM_CERT_INFO);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_int_equal(val, (sizeof("pamuser@"TEST_DOM_NAME) + sizeof(TEST_TOKEN_NAME)));
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_int_equal(*(body + rp + sizeof("pamuser@"TEST_DOM_NAME) - 1), 0);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_string_equal(body + rp, "pamuser@"TEST_DOM_NAME);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen rp += sizeof("pamuser@"TEST_DOM_NAME);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_int_equal(*(body + rp + sizeof(TEST_TOKEN_NAME) - 1), 0);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen assert_string_equal(body + rp, TEST_TOKEN_NAME);
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen return EOK;
e76f5e07be5bec4e5ca99c3e093ff7f11edbe1b7Timo Sirainen}
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainenstatic int test_pam_offline_chauthtok_check(uint32_t status,
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen uint8_t *body, size_t blen)
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen{
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen size_t rp = 0;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen uint32_t val;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen pam_test_ctx->exp_pam_status = PAM_AUTHTOK_ERR;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(status, 0);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen assert_int_equal(val, pam_test_ctx->exp_pam_status);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
2d79e603e20a32bdae4c2b516ead5c5c9169545aTimo Sirainen assert_int_equal(val, 2);
86d52f310fe939090c66b780a3b6ffe5d10dc8faTimo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen assert_int_equal(val, SSS_PAM_DOMAIN_NAME);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen assert_int_equal(val, 9);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen assert_int_equal(*(body + rp + val - 1), 0);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen assert_string_equal(body + rp, TEST_DOM_NAME);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen rp += val;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen assert_int_equal(val, SSS_PAM_USER_INFO);
2d79e603e20a32bdae4c2b516ead5c5c9169545aTimo Sirainen
2d79e603e20a32bdae4c2b516ead5c5c9169545aTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(val, 4);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen assert_int_equal(val, SSS_PAM_USER_INFO_OFFLINE_CHPASS);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen return EOK;
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen}
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainenstatic int test_pam_failed_offline_auth_check(uint32_t status, uint8_t *body,
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen size_t blen)
a0d34d3982507f513a9d800082481e9faeb9a943Timo Sirainen{
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen pam_test_ctx->exp_pam_status = PAM_PERM_DENIED;
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen return test_pam_simple_check(status, body, blen);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen}
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainenstatic int test_pam_successful_offline_auth_check(uint32_t status,
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen uint8_t *body, size_t blen)
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen{
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen pam_test_ctx->exp_pam_status = PAM_SUCCESS;
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen return test_pam_simple_check(status, body, blen);
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen}
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainenstatic int test_pam_successful_cached_auth_check(uint32_t status,
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen uint8_t *body, size_t blen)
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen{
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen pam_test_ctx->exp_pam_status = PAM_SUCCESS;
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen return test_pam_simple_check(status, body, blen);
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen}
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainenstatic int test_pam_wrong_pw_offline_auth_check(uint32_t status,
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen uint8_t *body, size_t blen)
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen{
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen pam_test_ctx->exp_pam_status = PAM_AUTH_ERR;
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen return test_pam_simple_check(status, body, blen);
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen}
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainenstatic int test_pam_creds_insufficient_check(uint32_t status,
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen uint8_t *body, size_t blen)
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen{
c5794838af9995f50bfecb06a3cd4f9a0ac77858Timo Sirainen size_t rp = 0;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen uint32_t val;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen assert_int_equal(status, 0);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen assert_int_equal(val, PAM_CRED_INSUFFICIENT);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen assert_int_equal(val, 0);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen return EOK;
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen}
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
8bb360f9e5de1c25e4f875205bb06e8bf15dae14Timo Sirainenstatic int test_pam_user_unknown_check(uint32_t status,
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen uint8_t *body, size_t blen)
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen{
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen size_t rp = 0;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen uint32_t val;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen assert_int_equal(status, 0);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen assert_int_equal(val, PAM_USER_UNKNOWN);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen assert_int_equal(val, 0);
651fc0f1e43fef3e02e0e7b5f498973b05f641d7Timo Sirainen
d041ddb437ee7000174161405581ab85c0ba314aTimo Sirainen return EOK;
d041ddb437ee7000174161405581ab85c0ba314aTimo Sirainen}
d041ddb437ee7000174161405581ab85c0ba314aTimo Sirainen
d041ddb437ee7000174161405581ab85c0ba314aTimo Sirainenvoid test_pam_authenticate(void **state)
8872e5c991430f96138a46e36b7f3c2c40d8e5c2Timo Sirainen{
d041ddb437ee7000174161405581ab85c0ba314aTimo Sirainen int ret;
651fc0f1e43fef3e02e0e7b5f498973b05f641d7Timo Sirainen
8872e5c991430f96138a46e36b7f3c2c40d8e5c2Timo Sirainen mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
8872e5c991430f96138a46e36b7f3c2c40d8e5c2Timo Sirainen
8872e5c991430f96138a46e36b7f3c2c40d8e5c2Timo Sirainen will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
20261d71760e4199cb8d906ab9704a4561d954d7Timo Sirainen
20261d71760e4199cb8d906ab9704a4561d954d7Timo Sirainen set_cmd_cb(test_pam_simple_check);
20261d71760e4199cb8d906ab9704a4561d954d7Timo Sirainen ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
20261d71760e4199cb8d906ab9704a4561d954d7Timo Sirainen pam_test_ctx->pam_cmds);
20261d71760e4199cb8d906ab9704a4561d954d7Timo Sirainen assert_int_equal(ret, EOK);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen /* Wait until the test finishes with EOK */
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen ret = test_ev_loop(pam_test_ctx->tctx);
d143077bd518de129b8d446fb58e003903e50867Timo Sirainen assert_int_equal(ret, EOK);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen}
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainenvoid test_pam_setcreds(void **state)
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen{
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen int ret;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen will_return(__wrap_sss_packet_get_cmd, SSS_PAM_SETCRED);
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen set_cmd_cb(test_pam_simple_check);
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_SETCRED,
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen pam_test_ctx->pam_cmds);
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen assert_int_equal(ret, EOK);
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen /* Wait until the test finishes with EOK */
91d4c7b37580b031ed7b0154ae10c643521803f3Timo Sirainen ret = test_ev_loop(pam_test_ctx->tctx);
0f66f12eb4cdbf47670975044c88d8f388bf92dfTimo Sirainen assert_int_equal(ret, EOK);
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen}
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainenvoid test_pam_acct_mgmt(void **state)
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen{
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen int ret;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
ccffbed92cb02c24fd717808a84138240bf1885bTimo Sirainen mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen will_return(__wrap_sss_packet_get_cmd, SSS_PAM_ACCT_MGMT);
ccffbed92cb02c24fd717808a84138240bf1885bTimo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen set_cmd_cb(test_pam_simple_check);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_ACCT_MGMT,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen pam_test_ctx->pam_cmds);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* Wait until the test finishes with EOK */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ret = test_ev_loop(pam_test_ctx->tctx);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
ccffbed92cb02c24fd717808a84138240bf1885bTimo Sirainenvoid test_pam_open_session(void **state)
ccffbed92cb02c24fd717808a84138240bf1885bTimo Sirainen{
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen int ret;
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen will_return(__wrap_sss_packet_get_cmd, SSS_PAM_OPEN_SESSION);
68f4cc25b3a5627b9de42bb0f12b570ee0e56e9cTimo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen
d12f05c7c391786d0d9795ec3aa4377280bbfaeaTimo Sirainen pam_test_ctx->exp_pam_status = PAM_NO_MODULE_DATA;
d12f05c7c391786d0d9795ec3aa4377280bbfaeaTimo Sirainen set_cmd_cb(test_pam_simple_check);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_OPEN_SESSION,
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen pam_test_ctx->pam_cmds);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen assert_int_equal(ret, EOK);
68f4cc25b3a5627b9de42bb0f12b570ee0e56e9cTimo Sirainen
68f4cc25b3a5627b9de42bb0f12b570ee0e56e9cTimo Sirainen /* Wait until the test finishes with EOK */
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen ret = test_ev_loop(pam_test_ctx->tctx);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen assert_int_equal(ret, EOK);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen}
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainenvoid test_pam_close_session(void **state)
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen{
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen int ret;
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen will_return(__wrap_sss_packet_get_cmd, SSS_PAM_CLOSE_SESSION);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen set_cmd_cb(test_pam_simple_check);
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_CLOSE_SESSION,
b0be0bead3d6963149f7f2a9504b8ab5aced9af5Timo Sirainen pam_test_ctx->pam_cmds);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_int_equal(ret, EOK);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* Wait until the test finishes with EOK */
b0be0bead3d6963149f7f2a9504b8ab5aced9af5Timo Sirainen ret = test_ev_loop(pam_test_ctx->tctx);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenvoid test_pam_chauthtok(void **state)
c3248869ddd406a7a46b8c05633f0cccc72fcb77Timo Sirainen{
c3248869ddd406a7a46b8c05633f0cccc72fcb77Timo Sirainen int ret;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
5c7aa03f959b8b9cab3eba8a585a90f4b50a4cdfTimo Sirainen will_return(__wrap_sss_packet_get_cmd, SSS_PAM_CHAUTHTOK);
5c7aa03f959b8b9cab3eba8a585a90f4b50a4cdfTimo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
32339680e0197f50f1f5b40a28099a9e0f19ab23Timo Sirainen
32339680e0197f50f1f5b40a28099a9e0f19ab23Timo Sirainen set_cmd_cb(test_pam_simple_check);
32339680e0197f50f1f5b40a28099a9e0f19ab23Timo Sirainen ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_CHAUTHTOK,
32339680e0197f50f1f5b40a28099a9e0f19ab23Timo Sirainen pam_test_ctx->pam_cmds);
32339680e0197f50f1f5b40a28099a9e0f19ab23Timo Sirainen assert_int_equal(ret, EOK);
cff21b6a2e9e54086544dfdc0e33fe8321e6bf02Timo Sirainen
cff21b6a2e9e54086544dfdc0e33fe8321e6bf02Timo Sirainen /* Wait until the test finishes with EOK */
66ecc94150cbce23aad3240135e0782e0a74d479Timo Sirainen ret = test_ev_loop(pam_test_ctx->tctx);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_int_equal(ret, EOK);
32339680e0197f50f1f5b40a28099a9e0f19ab23Timo Sirainen}
32339680e0197f50f1f5b40a28099a9e0f19ab23Timo Sirainen
32339680e0197f50f1f5b40a28099a9e0f19ab23Timo Sirainenvoid test_pam_chauthtok_prelim(void **state)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen{
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen int ret;
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen will_return(__wrap_sss_packet_get_cmd, SSS_PAM_CHAUTHTOK_PRELIM);
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen set_cmd_cb(test_pam_simple_check);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_CHAUTHTOK_PRELIM,
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen pam_test_ctx->pam_cmds);
d41573018e85896ec836d897fd554e87126147f5Timo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* Wait until the test finishes with EOK */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ret = test_ev_loop(pam_test_ctx->tctx);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_int_equal(ret, EOK);
cff21b6a2e9e54086544dfdc0e33fe8321e6bf02Timo Sirainen}
cff21b6a2e9e54086544dfdc0e33fe8321e6bf02Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenvoid test_pam_preauth(void **state)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen{
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen int ret;
14c474d9f4591c397ed0b5206af6537c7b52c924Timo Sirainen
1dec807061d7d428dba5c5a92cd2a5ff843a2039Timo Sirainen mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
1dec807061d7d428dba5c5a92cd2a5ff843a2039Timo Sirainen
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
1dec807061d7d428dba5c5a92cd2a5ff843a2039Timo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
f7caa64a7bb2360893fa2b703311acd8a529569aTimo Sirainen
1dec807061d7d428dba5c5a92cd2a5ff843a2039Timo Sirainen set_cmd_cb(test_pam_simple_check);
1dec807061d7d428dba5c5a92cd2a5ff843a2039Timo Sirainen ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
db95d1a82dc3ddd93a09ef4720f5855c5a1f34c9Timo Sirainen pam_test_ctx->pam_cmds);
db95d1a82dc3ddd93a09ef4720f5855c5a1f34c9Timo Sirainen assert_int_equal(ret, EOK);
db95d1a82dc3ddd93a09ef4720f5855c5a1f34c9Timo Sirainen
1dec807061d7d428dba5c5a92cd2a5ff843a2039Timo Sirainen /* Wait until the test finishes with EOK */
1dec807061d7d428dba5c5a92cd2a5ff843a2039Timo Sirainen ret = test_ev_loop(pam_test_ctx->tctx);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen/* Cached on-line authentication */
686c00553a7cea22272548d9fb8c888170965ec9Timo Sirainen
686c00553a7cea22272548d9fb8c888170965ec9Timo Sirainenstatic void common_test_pam_cached_auth(const char *pwd)
686c00553a7cea22272548d9fb8c888170965ec9Timo Sirainen{
686c00553a7cea22272548d9fb8c888170965ec9Timo Sirainen int ret;
686c00553a7cea22272548d9fb8c888170965ec9Timo Sirainen
686c00553a7cea22272548d9fb8c888170965ec9Timo Sirainen mock_input_pam(pam_test_ctx, "pamuser", pwd, NULL);
686c00553a7cea22272548d9fb8c888170965ec9Timo Sirainen
686c00553a7cea22272548d9fb8c888170965ec9Timo Sirainen will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
686c00553a7cea22272548d9fb8c888170965ec9Timo Sirainen will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen pam_test_ctx->exp_pam_status = PAM_SUCCESS;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen set_cmd_cb(test_pam_successful_cached_auth_check);
5c1a8aee989af87bddefd71e2aa83aa2bd695155Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen pam_test_ctx->pam_cmds);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* Wait until the test finishes with EOK */
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen ret = test_ev_loop(pam_test_ctx->tctx);
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenvoid test_pam_cached_auth_success(void **state)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen{
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen int ret;
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen common_test_pam_cached_auth("12345");
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen /* Back end should be contacted */
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen assert_true(pam_test_ctx->provider_contacted);
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen ret = sysdb_cache_password(pam_test_ctx->tctx->dom,
6e07b4251bf6a3cf34019c351a32a65c08392e58Timo Sirainen pam_test_ctx->pam_user_fqdn,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen "12345");
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen assert_int_equal(ret, EOK);
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen /* Reset before next call */
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen pam_test_ctx->provider_contacted = false;
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen common_test_pam_cached_auth("12345");
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen
7bd3f5614e0dd2324dd1015f084de72c0b069a1aTimo Sirainen /* Back end should not be contacted */
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen assert_false(pam_test_ctx->provider_contacted);
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen}
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
b9ce555e8624a5593b3bfd81b572b7d2e1e1fca5Timo Sirainenvoid test_pam_cached_auth_wrong_pw(void **state)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen{
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen int ret;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ret = sysdb_cache_password(pam_test_ctx->tctx->dom,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen pam_test_ctx->pam_user_fqdn,
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen "12345");
5f78b33aa505b17e23cdf27b071a24e127b3db54Timo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ret = pam_set_last_online_auth_with_curr_token(pam_test_ctx->tctx->dom,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen pam_test_ctx->pam_user_fqdn,
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen time(NULL));
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen assert_int_equal(ret, EOK);
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen common_test_pam_cached_auth("11111");
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen /* Back end should be contacted */
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen assert_true(pam_test_ctx->provider_contacted);
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen}
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen/* test cached_auth_timeout option */
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainenvoid test_pam_cached_auth_opt_timeout(void **state)
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen{
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen int ret;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen uint64_t last_online;
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen ret = sysdb_cache_password(pam_test_ctx->tctx->dom,
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen pam_test_ctx->pam_user_fqdn,
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen "12345");
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_int_equal(ret, EOK);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen last_online = time(NULL) - CACHED_AUTH_TIMEOUT - 1;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ret = pam_set_last_online_auth_with_curr_token(pam_test_ctx->tctx->dom,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen pam_test_ctx->pam_user_fqdn,
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen last_online);
ccffbed92cb02c24fd717808a84138240bf1885bTimo Sirainen assert_int_equal(ret, EOK);
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen common_test_pam_cached_auth("12345");
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen /* Back end should be contacted */
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen assert_true(pam_test_ctx->provider_contacted);
9ae24544b49e9cbf12bfa888279988a97235e10dTimo Sirainen}
e26a771fad55dfba4d5021d12ed5685c951d9b7bTimo Sirainen
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen/* too long since last on-line authentication */
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainenvoid test_pam_cached_auth_timeout(void **state)
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen{
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen int ret;
88b6f36ef1b453c08e8d9cadb229b39fc9bb4a1cTimo Sirainen
88b6f36ef1b453c08e8d9cadb229b39fc9bb4a1cTimo Sirainen ret = sysdb_cache_password(pam_test_ctx->tctx->dom,
88b6f36ef1b453c08e8d9cadb229b39fc9bb4a1cTimo Sirainen pam_test_ctx->pam_user_fqdn,
88b6f36ef1b453c08e8d9cadb229b39fc9bb4a1cTimo Sirainen "12345");
88b6f36ef1b453c08e8d9cadb229b39fc9bb4a1cTimo Sirainen assert_int_equal(ret, EOK);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen ret = pam_set_last_online_auth_with_curr_token(pam_test_ctx->tctx->dom,
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen pam_test_ctx->pam_user_fqdn,
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen 0);
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen assert_int_equal(ret, EOK);
2c677e9d339bc91d5b54376ba2986f71476c06abTimo Sirainen
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen common_test_pam_cached_auth("12345");
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen /* Back end should be contacted */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen assert_true(pam_test_ctx->provider_contacted);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
1b317fe22572738681d34d80da8012638e1e1281Timo Sirainen
b35f7104715edee0cfac6d46ab0b342033867eb7Timo Sirainenvoid test_pam_cached_auth_success_combined_pw_with_cached_2fa(void **state)
5c7aa03f959b8b9cab3eba8a585a90f4b50a4cdfTimo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int ret;
f7656d7bc15510a4259ed74ddda3c560de8a51c1Timo Sirainen
f7656d7bc15510a4259ed74ddda3c560de8a51c1Timo Sirainen common_test_pam_cached_auth("12345678");
f7656d7bc15510a4259ed74ddda3c560de8a51c1Timo Sirainen
f7656d7bc15510a4259ed74ddda3c560de8a51c1Timo Sirainen assert_true(pam_test_ctx->provider_contacted);
f7656d7bc15510a4259ed74ddda3c560de8a51c1Timo Sirainen
f7656d7bc15510a4259ed74ddda3c560de8a51c1Timo Sirainen ret = sysdb_cache_password_ex(pam_test_ctx->tctx->dom,
f31720ad5ece28ca3fa793920f1501165ad9603fTimo Sirainen pam_test_ctx->pam_user_fqdn,
f31720ad5ece28ca3fa793920f1501165ad9603fTimo Sirainen "12345678", SSS_AUTHTOK_TYPE_2FA, 5);
f31720ad5ece28ca3fa793920f1501165ad9603fTimo Sirainen assert_int_equal(ret, EOK);
f31720ad5ece28ca3fa793920f1501165ad9603fTimo Sirainen
f7656d7bc15510a4259ed74ddda3c560de8a51c1Timo Sirainen /* Reset before next call */
f7656d7bc15510a4259ed74ddda3c560de8a51c1Timo Sirainen pam_test_ctx->provider_contacted = false;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen common_test_pam_cached_auth("12345678");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
assert_false(pam_test_ctx->provider_contacted);
}
void test_pam_cached_auth_failed_combined_pw_with_cached_2fa(void **state)
{
int ret;
ret = sysdb_cache_password_ex(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345678", SSS_AUTHTOK_TYPE_2FA, 5);
assert_int_equal(ret, EOK);
ret = pam_set_last_online_auth_with_curr_token(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
time(NULL));
assert_int_equal(ret, EOK);
common_test_pam_cached_auth("1111abcde");
assert_true(pam_test_ctx->provider_contacted);
}
/* Off-line authentication */
void test_pam_offline_auth_no_hash(void **state)
{
int ret;
mock_input_pam(pam_test_ctx, "pamuser", "12345", NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_failed_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_success(void **state)
{
int ret;
ret = sysdb_cache_password(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345");
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "12345", NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_successful_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_wrong_pw(void **state)
{
int ret;
ret = sysdb_cache_password(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345");
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "11111", NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_wrong_pw_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_success_2fa(void **state)
{
int ret;
ret = sysdb_cache_password(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345");
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "12345", "abcde");
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_successful_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_failed_2fa(void **state)
{
int ret;
ret = sysdb_cache_password(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345");
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "11111", "abcde");
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_wrong_pw_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_success_2fa_with_cached_2fa(void **state)
{
int ret;
ret = sysdb_cache_password_ex(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345",
SSS_AUTHTOK_TYPE_2FA, 5);
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "12345", "abcde");
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_successful_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_failed_2fa_with_cached_2fa(void **state)
{
int ret;
ret = sysdb_cache_password_ex(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345",
SSS_AUTHTOK_TYPE_2FA, 5);
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "11111", "abcde");
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_wrong_pw_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_success_pw_with_cached_2fa(void **state)
{
int ret;
ret = sysdb_cache_password_ex(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345",
SSS_AUTHTOK_TYPE_2FA, 5);
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "12345", NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_successful_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_failed_pw_with_cached_2fa(void **state)
{
int ret;
ret = sysdb_cache_password_ex(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345",
SSS_AUTHTOK_TYPE_2FA, 5);
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "11111", NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_wrong_pw_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_success_combined_pw_with_cached_2fa(void **state)
{
int ret;
ret = sysdb_cache_password_ex(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345678", SSS_AUTHTOK_TYPE_2FA, 5);
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "12345678abcde", NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_successful_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_failed_combined_pw_with_cached_2fa(void **state)
{
int ret;
ret = sysdb_cache_password_ex(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345678", SSS_AUTHTOK_TYPE_2FA, 5);
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "11111111abcde", NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_wrong_pw_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_auth_failed_wrong_2fa_size_with_cached_2fa(void **state)
{
int ret;
ret = sysdb_cache_password_ex(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
"12345678", SSS_AUTHTOK_TYPE_2FA, 5);
assert_int_equal(ret, EOK);
mock_input_pam(pam_test_ctx, "pamuser", "12345678abcd", NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_wrong_pw_offline_auth_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_chauthtok_prelim(void **state)
{
int ret;
mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_CHAUTHTOK_PRELIM);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_offline_chauthtok_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_CHAUTHTOK_PRELIM,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_offline_chauthtok(void **state)
{
int ret;
mock_input_pam(pam_test_ctx, "pamuser", NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_CHAUTHTOK);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
pam_test_ctx->exp_pam_status = PAM_AUTHINFO_UNAVAIL;
set_cmd_cb(test_pam_offline_chauthtok_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_CHAUTHTOK,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_preauth_no_logon_name(void **state)
{
int ret;
mock_input_pam_cert(pam_test_ctx, NULL, NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
set_cmd_cb(test_pam_creds_insufficient_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
static void set_cert_auth_param(struct pam_ctx *pctx, const char *dbpath)
{
pam_test_ctx->pctx->cert_auth = true;
pam_test_ctx->pctx->nss_db = discard_const(dbpath);
}
void test_pam_preauth_cert_nocert(void **state)
{
int ret;
set_cert_auth_param(pam_test_ctx->pctx, "/no/path");
mock_input_pam_cert(pam_test_ctx, "pamuser", NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
set_cmd_cb(test_pam_simple_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
static int test_lookup_by_cert_cb(void *pvt)
{
int ret;
struct sysdb_attrs *attrs;
unsigned char *der = NULL;
size_t der_size;
if (pvt != NULL) {
attrs = sysdb_new_attrs(pam_test_ctx);
assert_non_null(attrs);
der = sss_base64_decode(pam_test_ctx, pvt, &der_size);
assert_non_null(der);
ret = sysdb_attrs_add_mem(attrs, SYSDB_USER_CERT, der, der_size);
talloc_free(der);
assert_int_equal(ret, EOK);
ret = sysdb_set_user_attr(pam_test_ctx->tctx->dom,
pam_test_ctx->pam_user_fqdn,
attrs,
LDB_FLAG_MOD_ADD);
assert_int_equal(ret, EOK);
}
return EOK;
}
static int test_lookup_by_cert_wrong_user_cb(void *pvt)
{
int ret;
struct sysdb_attrs *attrs;
unsigned char *der = NULL;
size_t der_size;
if (pvt != NULL) {
attrs = sysdb_new_attrs(pam_test_ctx);
assert_non_null(attrs);
der = sss_base64_decode(pam_test_ctx, pvt, &der_size);
assert_non_null(der);
ret = sysdb_attrs_add_mem(attrs, SYSDB_USER_CERT, der, der_size);
talloc_free(der);
assert_int_equal(ret, EOK);
ret = sysdb_set_user_attr(pam_test_ctx->tctx->dom,
pam_test_ctx->wrong_user_fqdn,
attrs,
LDB_FLAG_MOD_ADD);
assert_int_equal(ret, EOK);
}
return EOK;
}
void test_pam_preauth_cert_nomatch(void **state)
{
int ret;
set_cert_auth_param(pam_test_ctx->pctx, NSS_DB);
mock_input_pam_cert(pam_test_ctx, "pamuser", NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
mock_account_recv(0, 0, NULL, test_lookup_by_cert_cb, NULL);
set_cmd_cb(test_pam_simple_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_preauth_cert_match(void **state)
{
int ret;
set_cert_auth_param(pam_test_ctx->pctx, NSS_DB);
mock_input_pam_cert(pam_test_ctx, "pamuser", NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
mock_account_recv(0, 0, NULL, test_lookup_by_cert_cb,
discard_const(TEST_TOKEN_CERT));
set_cmd_cb(test_pam_cert_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
/* Test if PKCS11_LOGIN_TOKEN_NAME is added for the gdm-smartcard service */
void test_pam_preauth_cert_match_gdm_smartcard(void **state)
{
int ret;
set_cert_auth_param(pam_test_ctx->pctx, NSS_DB);
mock_input_pam_cert(pam_test_ctx, "pamuser", NULL, "gdm-smartcard");
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
mock_account_recv(0, 0, NULL, test_lookup_by_cert_cb,
discard_const(TEST_TOKEN_CERT));
set_cmd_cb(test_pam_cert_check_gdm_smartcard);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_preauth_cert_match_wrong_user(void **state)
{
int ret;
set_cert_auth_param(pam_test_ctx->pctx, NSS_DB);
mock_input_pam_cert(pam_test_ctx, "pamuser", NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
mock_account_recv(0, 0, NULL, test_lookup_by_cert_wrong_user_cb,
discard_const(TEST_TOKEN_CERT));
set_cmd_cb(test_pam_simple_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_preauth_cert_no_logon_name(void **state)
{
int ret;
set_cert_auth_param(pam_test_ctx->pctx, NSS_DB);
mock_input_pam_cert(pam_test_ctx, NULL, NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
mock_account_recv(0, 0, NULL, test_lookup_by_cert_cb,
discard_const(TEST_TOKEN_CERT));
set_cmd_cb(test_pam_cert_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_preauth_no_cert_no_logon_name(void **state)
{
int ret;
set_cert_auth_param(pam_test_ctx->pctx, "/no/path");
mock_input_pam_cert(pam_test_ctx, NULL, NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
set_cmd_cb(test_pam_user_unknown_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_preauth_cert_no_logon_name_no_match(void **state)
{
int ret;
set_cert_auth_param(pam_test_ctx->pctx, NSS_DB);
mock_input_pam_cert(pam_test_ctx, NULL, NULL, NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_PREAUTH);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
mock_account_recv(0, 0, NULL, test_lookup_by_cert_cb, NULL);
set_cmd_cb(test_pam_user_unknown_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_PREAUTH,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_pam_cert_auth(void **state)
{
int ret;
set_cert_auth_param(pam_test_ctx->pctx, NSS_DB);
mock_input_pam_cert(pam_test_ctx, "pamuser", "123456", NULL);
will_return(__wrap_sss_packet_get_cmd, SSS_PAM_AUTHENTICATE);
will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL);
mock_account_recv(0, 0, NULL, test_lookup_by_cert_cb,
discard_const(TEST_TOKEN_CERT));
set_cmd_cb(test_pam_simple_check);
ret = sss_cmd_execute(pam_test_ctx->cctx, SSS_PAM_AUTHENTICATE,
pam_test_ctx->pam_cmds);
assert_int_equal(ret, EOK);
/* Wait until the test finishes with EOK */
ret = test_ev_loop(pam_test_ctx->tctx);
assert_int_equal(ret, EOK);
}
void test_filter_response(void **state)
{
int ret;
struct pam_data *pd;
uint8_t offline_auth_data[(sizeof(uint32_t) + sizeof(int64_t))];
uint32_t info_type;
struct sss_test_conf_param pam_params[] = {
{ CONFDB_PAM_VERBOSITY, "1" },
{ NULL, NULL }, /* Sentinel */
};
ret = add_pam_params(pam_params, pam_test_ctx->rctx->cdb);
assert_int_equal(ret, EOK);
pd = talloc_zero(pam_test_ctx, struct pam_data);
assert_non_null(pd);
info_type = SSS_PAM_USER_INFO_OFFLINE_AUTH;
memset(offline_auth_data, 0, sizeof(offline_auth_data));
memcpy(offline_auth_data, &info_type, sizeof(uint32_t));
ret = pam_add_response(pd, SSS_PAM_USER_INFO,
sizeof(offline_auth_data), offline_auth_data);
assert_int_equal(ret, EOK);
ret = filter_responses(pam_test_ctx->rctx->cdb, pd->resp_list);
assert_int_equal(ret, EOK);
assert_true(pd->resp_list->do_not_send_to_client);
pam_params[0].value = "0";
ret = add_pam_params(pam_params, pam_test_ctx->rctx->cdb);
assert_int_equal(ret, EOK);
ret = filter_responses(pam_test_ctx->rctx->cdb, pd->resp_list);
assert_int_equal(ret, EOK);
assert_true(pd->resp_list->do_not_send_to_client);
/* SSS_PAM_USER_INFO_OFFLINE_AUTH message will only be shown with
* pam_verbosity 2 or above if cache password never expires. */
pam_params[0].value = "2";
ret = add_pam_params(pam_params, pam_test_ctx->rctx->cdb);
assert_int_equal(ret, EOK);
ret = filter_responses(pam_test_ctx->rctx->cdb, pd->resp_list);
assert_int_equal(ret, EOK);
assert_false(pd->resp_list->do_not_send_to_client);
}
int main(int argc, const char *argv[])
{
int rv;
int no_cleanup = 0;
poptContext pc;
int opt;
struct poptOption long_options[] = {
POPT_AUTOHELP
SSSD_DEBUG_OPTS
{ "no-cleanup", 'n', POPT_ARG_NONE, &no_cleanup, 0,
_("Do not delete the test database after a test run"), NULL },
POPT_TABLEEND
};
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(test_pam_authenticate,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_setcreds,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_acct_mgmt,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_open_session,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_close_session,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_chauthtok,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_chauthtok_prelim,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_preauth,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_offline_auth_no_hash,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_offline_auth_success,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_offline_auth_wrong_pw,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_offline_auth_success_2fa,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_offline_auth_failed_2fa,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(
test_pam_offline_auth_success_2fa_with_cached_2fa,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(
test_pam_offline_auth_failed_2fa_with_cached_2fa,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(
test_pam_offline_auth_success_pw_with_cached_2fa,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(
test_pam_offline_auth_failed_pw_with_cached_2fa,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(
test_pam_offline_auth_success_combined_pw_with_cached_2fa,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(
test_pam_offline_auth_failed_combined_pw_with_cached_2fa,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(
test_pam_offline_auth_failed_wrong_2fa_size_with_cached_2fa,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_offline_chauthtok_prelim,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_offline_chauthtok,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_preauth_no_logon_name,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_cached_auth_success,
pam_cached_test_setup,
pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_cached_auth_wrong_pw,
pam_cached_test_setup,
pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_cached_auth_opt_timeout,
pam_cached_test_setup,
pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_cached_auth_timeout,
pam_cached_test_setup,
pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_cached_auth_success_combined_pw_with_cached_2fa,
pam_cached_test_setup,
pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_cached_auth_failed_combined_pw_with_cached_2fa,
pam_cached_test_setup,
pam_test_teardown),
/* p11_child is not built without NSS */
#ifdef HAVE_NSS
cmocka_unit_test_setup_teardown(test_pam_preauth_cert_nocert,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_preauth_cert_nomatch,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_preauth_cert_match,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_preauth_cert_match_gdm_smartcard,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_preauth_cert_match_wrong_user,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_preauth_cert_no_logon_name,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_preauth_no_cert_no_logon_name,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(
test_pam_preauth_cert_no_logon_name_no_match,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_cert_auth,
pam_test_setup, pam_test_teardown),
cmocka_unit_test_setup_teardown(test_pam_cert_auth,
pam_test_setup_no_verification,
pam_test_teardown),
#endif /* HAVE_NSS */
cmocka_unit_test_setup_teardown(test_filter_response,
pam_test_setup, pam_test_teardown),
};
/* Set debug level to invalid value so we can deside if -d 0 was used. */
debug_level = SSSDBG_INVALID;
pc = poptGetContext(argv[0], argc, argv, long_options, 0);
while ((opt = poptGetNextOpt(pc)) != -1) {
switch (opt) {
default:
fprintf(stderr, "\nInvalid option %s: %s\n\n",
poptBadOption(pc, 0), poptStrerror(opt));
poptPrintUsage(pc, stderr, 0);
return 1;
}
}
poptFreeContext(pc);
DEBUG_CLI_INIT(debug_level);
/* Even though normally the tests should clean up after themselves
* they might not after a failed run. Remove the old db to be sure */
tests_set_cwd();
test_dom_suite_cleanup(TESTS_PATH, TEST_CONF_DB, TEST_DOM_NAME);
test_dom_suite_setup(TESTS_PATH);
cleanup_nss_db();
rv = setup_nss_db();
if (rv != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "setup_nss_db failed.\n");
exit(-1);
}
rv = cmocka_run_group_tests(tests, NULL, NULL);
if (rv == 0 && !no_cleanup) {
cleanup_nss_db();
test_dom_suite_cleanup(TESTS_PATH, TEST_CONF_DB, TEST_DOM_NAME);
}
#ifdef HAVE_NSS
/* Cleanup NSS and NSPR to make valgrund happy. */
nspr_nss_cleanup();
#endif
return rv;
}