Blame view

mailbox/system.c 3.53 KB
1
/* GNU Mailutils -- a suite of utilities for electronic mail
2 3
   Copyright (C) 2002 Free Software Foundation, Inc.

4 5 6 7
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.
8

9
   This library is distributed in the hope that it will be useful,
10
   but WITHOUT ANY WARRANTY; without even the implied warranty of
11 12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
13

14 15 16 17
   You should have received a copy of the GNU Lesser General
   Public License along with this library; if not, write to the
   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301 USA */
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#ifdef HAVE_SHADOW_H
# include <shadow.h>
#endif
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
36 37 38
#ifdef HAVE_CRYPT_H
# include <crypt.h>
#endif
39 40 41 42 43 44 45 46

#include <mailutils/list.h>
#include <mailutils/iterator.h>
#include <mailutils/mailbox.h>
#include <mailutils/argp.h>
#include <mailutils/mu_auth.h>

/* System database */
47
static int
48
mu_auth_system (struct mu_auth_data **return_data, const struct passwd *pw)
49 50 51 52 53 54 55
{
  char *mailbox_name;
  int rc;
  
  if (!pw)
    return 1;

56 57 58
  rc = mu_construct_user_mailbox_url (&mailbox_name, pw->pw_name);
  if (rc)
    return 1; /* FIXME: Return code is lost */
59
  
60
  rc = mu_auth_data_alloc (return_data,
61 62 63 64 65 66 67 68 69 70 71 72 73 74
			   pw->pw_name,
			   pw->pw_passwd,
			   pw->pw_uid,
			   pw->pw_gid,
			   pw->pw_gecos,
			   pw->pw_dir,
			   pw->pw_shell,
			   mailbox_name,
			   1);
  free (mailbox_name);
  return rc;
}

int
75 76
mu_auth_system_by_name (struct mu_auth_data **return_data,
			const void *key,
77 78
			void *func_data ARG_UNUSED,
			void *call_data ARG_UNUSED)
79 80 81 82 83 84 85 86 87
{
  if (!key)
    {
      errno = EINVAL;
      return 1;
    }
  return mu_auth_system (return_data, getpwnam (key));
}

88
static int
89 90
mu_auth_system_by_uid (struct mu_auth_data **return_data,
		       const void *key,
91 92
		       void *func_data ARG_UNUSED,
		       void *call_data ARG_UNUSED)
93 94 95 96 97 98 99 100 101
{
  if (!key)
    {
      errno = EINVAL;
      return 1;
    }
  return mu_auth_system (return_data, getpwuid (*(uid_t*) key));
}

102
static int
103
mu_authenticate_generic (struct mu_auth_data **return_data ARG_UNUSED,
104
			 const void *key,
105
			 void *func_data ARG_UNUSED,
106 107
			 void *call_data)
{
108
  const struct mu_auth_data *auth_data = key;
109 110 111 112 113 114 115 116
  char *pass = call_data;

  return !auth_data
    || !auth_data->passwd
    || strcmp (auth_data->passwd, crypt (pass, auth_data->passwd));
}

/* Called only if generic fails */
117
static int
118
mu_authenticate_system (struct mu_auth_data **return_data ARG_UNUSED,
119
			const void *key,
120
			void *func_data ARG_UNUSED,
121 122
			void *call_data)
{
123
  const struct mu_auth_data *auth_data = key;
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
  char *pass = call_data;

#ifdef HAVE_SHADOW_H
  if (auth_data)
    {
      struct spwd *spw;
      spw = getspnam (auth_data->name);
      if (spw)
	return strcmp (spw->sp_pwdp, crypt (pass, spw->sp_pwdp));
    }
#endif
  return 1;
}


struct mu_auth_module mu_auth_system_module = {
  "system",
  NULL,
  mu_authenticate_system,
  NULL,
  mu_auth_system_by_name,
  NULL,
  mu_auth_system_by_uid,
  NULL
};


struct mu_auth_module mu_auth_generic_module = {
  "generic",
  NULL,
  mu_authenticate_generic,
  NULL,
  mu_auth_nosupport,
  NULL,
  mu_auth_nosupport,
  NULL
};