Import Linux-PAM.
[profile/ivi/pam.git] / xtests / tst-pam_cracklib2.c
1 /*
2  * Redistribution and use in source and binary forms, with or without
3  * modification, are permitted provided that the following conditions
4  * are met:
5  * 1. Redistributions of source code must retain the above copyright
6  *    notice, and the entire permission notice in its entirety,
7  *    including the disclaimer of warranties.
8  * 2. Redistributions in binary form must reproduce the above copyright
9  *    notice, this list of conditions and the following disclaimer in the
10  *    documentation and/or other materials provided with the distribution.
11  * 3. The name of the author may not be used to endorse or promote
12  *    products derived from this software without specific prior
13  *    written permission.
14  *
15  * ALTERNATIVELY, this product may be distributed under the terms of
16  * the GNU Public License, in which case the provisions of the GPL are
17  * required INSTEAD OF the above restrictions.  (This clause is
18  * necessary due to a potential bad interaction between the GPL and
19  * the restrictions contained in a BSD-style copyright.)
20  *
21  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
22  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31  * OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 /* This test case checks
35    Patch 1688777: pam_cracklib support for minimum character classes */
36
37 #ifdef HAVE_CONFIG_H
38 #include <config.h>
39 #endif
40
41 #include <stdio.h>
42 #include <stdlib.h>
43 #include <unistd.h>
44 #include <string.h>
45 #include <security/pam_appl.h>
46
47 int debug = 0;
48
49 /* A conversation function which uses an internally-stored value for
50    the responses. */
51 static int
52 fake_conv (int num_msg, const struct pam_message **msgm,
53            struct pam_response **response, void *appdata_ptr UNUSED)
54 {
55   static int calls = 0;
56   struct pam_response *reply;
57   int count;
58
59   /* Sanity test. */
60   if (num_msg <= 0)
61     return PAM_CONV_ERR;
62
63   /* Allocate memory for the responses. */
64   reply = calloc (num_msg, sizeof (struct pam_response));
65   if (reply == NULL)
66     return PAM_CONV_ERR;
67
68   /* Each prompt elicits the same response. */
69   for (count = 0; count < num_msg; ++count)
70     {
71       if (debug)
72         fprintf(stderr,"Query: %s\n", (*msgm)[count].msg);
73       reply[count].resp_retcode = 0;
74       /* first tow calls get a correct password, second a too
75          easy one. */
76       if (calls > 1)
77         reply[count].resp = strdup ("too easy");
78       else
79         {
80           ++calls;
81           reply[count].resp = strdup ("1a9C*8dK");
82         }
83         if (debug)
84           fprintf(stderr,"Response: %s\n", reply[count].resp);
85     }
86
87   /* Set the pointers in the response structure and return. */
88   *response = reply;
89   return PAM_SUCCESS;
90 }
91
92 static struct pam_conv conv = {
93     fake_conv,
94     NULL
95 };
96
97
98 int
99 main(int argc, char *argv[])
100 {
101   pam_handle_t *pamh=NULL;
102   const char *user="root";
103   int retval;
104
105   if (argc > 1 && strcmp (argv[1], "-d") == 0)
106     debug = 1;
107
108   retval = pam_start("tst-pam_cracklib2", user, &conv, &pamh);
109   if (retval != PAM_SUCCESS)
110     {
111       if (debug)
112         fprintf (stderr, "cracklib2: pam_start returned %d\n", retval);
113       return 1;
114     }
115
116   /* Try one, first input is correct */
117   retval = pam_chauthtok (pamh, PAM_CHANGE_EXPIRED_AUTHTOK);
118   if (retval != PAM_SUCCESS)
119     {
120       if (debug)
121         fprintf (stderr, "cracklib2-1: pam_chauthtok returned %d\n", retval);
122       return 1;
123     }
124
125   /* Try two, second input is wrong */
126   retval = pam_chauthtok (pamh, PAM_CHANGE_EXPIRED_AUTHTOK);
127   if (retval != PAM_AUTHTOK_ERR)
128     {
129       if (debug)
130         fprintf (stderr, "cracklib2-2: pam_chauthtok returned %d\n", retval);
131       return 1;
132     }
133
134
135   retval = pam_end (pamh,retval);
136   if (retval != PAM_SUCCESS)
137     {
138       if (debug)
139         fprintf (stderr, "cracklib2: pam_end returned %d\n", retval);
140       return 1;
141     }
142   return 0;
143 }