GSS_S_PROMPTING_NEEDED is a bit
[cyrus-sasl.git] / saslauthd / auth_dce.c
1 /* MODULE: auth_dce */
2
3 /* COPYRIGHT
4  * Copyright (c) 1997-2000 Messaging Direct Ltd.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY MESSAGING DIRECT LTD. ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL MESSAGING DIRECT LTD. OR
20  * ITS EMPLOYEES OR AGENTS BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
23  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
25  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
26  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
27  * DAMAGE.
28  * END COPYRIGHT */
29
30 /* SYNOPSIS
31  * Authenticate against DCE.
32  * END SYNOPSIS */
33
34 #ifdef __GNUC__
35 #ident "$Id: auth_dce.c,v 1.3 2001/12/04 02:06:54 rjs3 Exp $"
36 #endif
37
38 /* PUBLIC DEPENDENCIES */
39 #include <stdlib.h>
40 #include <string.h>
41 #include "mechanisms.h"
42
43 #include "auth_dce.h"
44
45 /* END PUBLIC DEPENDENCIES */
46
47 # define RETURN(x) {return strdup(x);}
48 \f
49 /* FUNCTION: auth_dce */
50
51 #ifdef AUTH_DCE
52
53 char *                                  /* R: allocated response string */
54 auth_dce(
55   /* PARAMETERS */
56   const char *login,                    /* I: plaintext authenticator */
57   const char *password,                 /* I: plaintext password */
58   const char *service __attribute__((unused)),
59   const char *realm __attribute__((unused))
60   /* END PARAMETERS */
61   )
62 {
63     int reenter = 0;                    /* internal to authenticate() */
64     int rc;                             /* return code holder */
65     char *msg;                          /* response from authenticate() */
66     static char *reply;                 /* our reply string */
67     
68     int authenticate(char *, char *, int *, char **); /* DCE authenticator */
69
70     rc = authenticate(login, password, &reenter, &msg);
71     if (rc != 0) {
72         /*
73          * Failed. authenticate() has allocated storage for msg. We have
74          * to copy the message text into a static buffer and free the
75          * space allocated inside of authenticate().
76          */
77         if (reply != 0) {
78             free(reply);
79             reply = 0;
80         }
81         if (msg == 0)
82             RETURN("NO");
83         reply = malloc(strlen(msg) + sizeof("NO "));
84         if (reply == 0) {
85             if (msg != 0)
86                 free(msg);
87             RETURN("NO (auth_dce malloc failure)");
88         }
89         strcpy(reply, "NO ");
90         strcat(reply, msg);
91         free(msg);
92         RETURN(reply);
93     } else {
94         if (msg != 0)
95             free(msg);
96         RETURN("OK");
97     }
98 }
99
100 #else /* !AUTH_DCE */
101
102 char *
103 auth_dce(
104   const char *login __attribute__((unused)),
105   const char *password __attribute__((unused)),
106   const char *service __attribute__((unused)),
107   const char *realm __attribute__((unused))
108   )
109 {
110      return NULL;
111 }
112
113 #endif /* !AUTH_DCE */
114
115 /* END FUNCTION: auth_dce */
116
117 /* END MODULE: auth_dce */