~ubuntu-branches/ubuntu/quantal/sudo/quantal

« back to all changes in this revision

Viewing changes to auth/rfc1938.c

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2011-11-20 12:07:45 UTC
  • mfrom: (1.3.17 sid)
  • Revision ID: package-import@ubuntu.com-20111120120745-o3qpklobmygytndc
Tags: 1.8.3p1-1ubuntu1
* Merge from debian/testing, remaining changes:
  - debian/patches/keep_home_by_default.patch:
    + Set HOME in initial_keepenv_table. (rebased for 1.8.3p1)
  - debian/patches/enable_badpass.patch: turn on "mail_badpass" by default:
    + attempting sudo without knowing a login password is as bad as not
      being listed in the sudoers file, especially if getting the password
      wrong means doing the access-check-email-notification never happens
      (rebased for 1.8.3p1)
  - debian/rules:
    + compile with --without-lecture --with-tty-tickets (Ubuntu specific)
    + install man/man8/sudo_root.8 (Ubuntu specific)
    + install apport hooks
    + The ubuntu-sudo-as-admin-successful.patch was taken upstream by
      Debian however it requires a --enable-admin-flag configure flag to
      actually enable it.
  - debian/sudoers: 
    + grant admin group sudo access
  - debian/sudo-ldap.dirs, debian/sudo.dirs: 
    + add usr/share/apport/package-hooks
  - debian/sudo.preinst:
    + avoid conffile prompt by checking for known default /etc/sudoers
      and if found installing the correct default /etc/sudoers file

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (c) 1994-1996, 1998-2005, 2010
3
 
 *      Todd C. Miller <Todd.Miller@courtesan.com>
4
 
 *
5
 
 * Permission to use, copy, modify, and distribute this software for any
6
 
 * purpose with or without fee is hereby granted, provided that the above
7
 
 * copyright notice and this permission notice appear in all copies.
8
 
 *
9
 
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
 
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
 
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
 
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
 
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
 
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
 
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
 
 *
17
 
 * Sponsored in part by the Defense Advanced Research Projects
18
 
 * Agency (DARPA) and Air Force Research Laboratory, Air Force
19
 
 * Materiel Command, USAF, under agreement number F39502-99-1-0512.
20
 
 */
21
 
 
22
 
#include <config.h>
23
 
 
24
 
#include <sys/types.h>
25
 
#include <sys/param.h>
26
 
#include <stdio.h>
27
 
#ifdef STDC_HEADERS
28
 
# include <stdlib.h>
29
 
# include <stddef.h>
30
 
#else
31
 
# ifdef HAVE_STDLIB_H
32
 
#  include <stdlib.h>
33
 
# endif
34
 
#endif /* STDC_HEADERS */
35
 
#ifdef HAVE_STRING_H
36
 
# include <string.h>
37
 
#endif /* HAVE_STRING_H */
38
 
#ifdef HAVE_STRINGS_H
39
 
# include <strings.h>
40
 
#endif /* HAVE_STRINGS_H */
41
 
#ifdef HAVE_UNISTD_H
42
 
# include <unistd.h>
43
 
#endif /* HAVE_UNISTD_H */
44
 
#include <pwd.h>
45
 
 
46
 
#if defined(HAVE_SKEY)
47
 
# include <skey.h>
48
 
# define RFC1938                                skey
49
 
#  ifdef __NetBSD__
50
 
#   define rfc1938challenge(a,b,c,d)    skeychallenge((a),(b),(c),(d))
51
 
#  else
52
 
#   define rfc1938challenge(a,b,c,d)    skeychallenge((a),(b),(c))
53
 
#  endif
54
 
# define rfc1938verify(a,b)             skeyverify((a),(b))
55
 
#elif defined(HAVE_OPIE)
56
 
# include <opie.h>
57
 
# define RFC1938                        opie
58
 
# define rfc1938challenge(a,b,c,d)      opiechallenge((a),(b),(c))
59
 
# define rfc1938verify(a,b)             opieverify((a),(b))
60
 
#endif
61
 
 
62
 
#include "sudo.h"
63
 
#include "sudo_auth.h"
64
 
 
65
 
int
66
 
rfc1938_setup(pw, promptp, auth)
67
 
    struct passwd *pw;
68
 
    char **promptp;
69
 
    sudo_auth *auth;
70
 
{
71
 
    char challenge[256];
72
 
    static char *orig_prompt = NULL, *new_prompt = NULL;
73
 
    static int op_len, np_size;
74
 
    static struct RFC1938 rfc1938;
75
 
 
76
 
    /* Stash a pointer to the rfc1938 struct if we have not initialized */
77
 
    if (!auth->data)
78
 
        auth->data = &rfc1938;
79
 
 
80
 
    /* Save the original prompt */
81
 
    if (orig_prompt == NULL) {
82
 
        orig_prompt = *promptp;
83
 
        op_len = strlen(orig_prompt);
84
 
 
85
 
        /* Ignore trailing colon (we will add our own) */
86
 
        if (orig_prompt[op_len - 1] == ':')
87
 
            op_len--;
88
 
        else if (op_len >= 2 && orig_prompt[op_len - 1] == ' '
89
 
            && orig_prompt[op_len - 2] == ':')
90
 
            op_len -= 2;
91
 
    }
92
 
 
93
 
#ifdef HAVE_SKEY
94
 
    /* Close old stream */
95
 
    if (rfc1938.keyfile)
96
 
        (void) fclose(rfc1938.keyfile);
97
 
#endif
98
 
 
99
 
    /*
100
 
     * Look up the user and get the rfc1938 challenge.
101
 
     * If the user is not in the OTP db, only post a fatal error if
102
 
     * we are running alone (since they may just use a normal passwd).
103
 
     */
104
 
    if (rfc1938challenge(&rfc1938, pw->pw_name, challenge, sizeof(challenge))) {
105
 
        if (IS_ONEANDONLY(auth)) {
106
 
            warningx("you do not exist in the %s database", auth->name);
107
 
            return(AUTH_FATAL);
108
 
        } else {
109
 
            return(AUTH_FAILURE);
110
 
        }
111
 
    }
112
 
 
113
 
    /* Get space for new prompt with embedded challenge */
114
 
    if (np_size < op_len + strlen(challenge) + 7) {
115
 
        np_size = op_len + strlen(challenge) + 7;
116
 
        new_prompt = (char *) erealloc(new_prompt, np_size);
117
 
    }
118
 
 
119
 
    if (def_long_otp_prompt)
120
 
        (void) snprintf(new_prompt, np_size, "%s\n%s", challenge, orig_prompt);
121
 
    else
122
 
        (void) snprintf(new_prompt, np_size, "%.*s [ %s ]:", op_len,
123
 
            orig_prompt, challenge);
124
 
 
125
 
    *promptp = new_prompt;
126
 
    return(AUTH_SUCCESS);
127
 
}
128
 
 
129
 
int
130
 
rfc1938_verify(pw, pass, auth)
131
 
    struct passwd *pw;
132
 
    char *pass;
133
 
    sudo_auth *auth;
134
 
{
135
 
 
136
 
    if (rfc1938verify((struct RFC1938 *) auth->data, pass) == 0)
137
 
        return(AUTH_SUCCESS);
138
 
    else
139
 
        return(AUTH_FAILURE);
140
 
}