Commit babebed6 babebed629af6212986befcb28ce8d9e840382e3 by Alain Magloire

To provide an easy way to crete a ticket_t from

        a file, one can create a wicket_t and fetch ticket_t's
        for different users to set on the authority.
        {
          wicket_t (&wicket, "/home/alain/.tickets");
          wicket_get_ticket (wicket, &ticket, "alain", NULL);
          authority_set_ticket (wicket, ticket);
        }

        * include/mailutils/auth.h: Added wicket_t prototypes
        functions: wicket_create(), wicket_destroy,
        wicket_get_ticket().  New prototype ticket_set_data ()
        ticket_get_data () ticket_set_destroy (), ticket_set_owner();
        * mailbox/wicket.c: New file, implements wicket_t.
        * mailbox/ticket.c: New file, implements ticket_t.
        * mailbox/auth.c: Implements only authority_t.
        * mailbox/Makefile.am: Update for ticket.c and wicket.c
1 parent 0388537f
2001-11-14 Alain Magloire
To provide an easy way to crete a ticket_t from
a file, one can create a wicket_t and fetch ticket_t's
for different users to set on the authority.
{
wicket_t (&wicket, "/home/alain/.tickets");
wicket_get_ticket (wicket, &ticket, "alain", NULL);
authority_set_ticket (wicket, ticket);
}
* include/mailutils/auth.h: Added wicket_t prototypes
functions: wicket_create(), wicket_destroy,
wicket_get_ticket(). New prototype ticket_set_data ()
ticket_get_data () ticket_set_destroy (), ticket_set_owner();
* mailbox/wicket.c: New file, implements wicket_t.
* mailbox/ticket.c: New file, implements ticket_t.
* mailbox/auth.c: Implements only authority_t.
* mailbox/Makefile.am: Update for ticket.c and wicket.c
2001-11-14 Sergey Poznyakoff
* comsat/action.c: Expand \n only for `echo'.
......
/* GNU mailutils - a suite of utilities for electronic mail
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Library Public License as published by
......@@ -36,15 +36,16 @@ extern "C" {
struct _ticket;
typedef struct _ticket *ticket_t;
extern int ticket_create __P ((ticket_t *, void *owner));
extern int ticket_create __P ((ticket_t *, void *owner));
extern void ticket_destroy __P ((ticket_t *, void *owner));
extern void * ticket_get_owner __P ((ticket_t));
extern int ticket_set_destroy __P ((ticket_t, void (*)
__P ((ticket_t)), void *owner));
extern void *ticket_get_owner __P ((ticket_t));
extern int ticket_set_pop __P ((ticket_t, int (*_pop) __P ((ticket_t, const char *, char **)), void *));
extern int ticket_pop __P ((ticket_t, const char *, char **));
extern int ticket_get_type __P ((ticket_t, char *, size_t, size_t *));
extern int ticket_set_type __P ((ticket_t, char *));
extern int ticket_set_data __P ((ticket_t, void *, void *owner));
extern int ticket_get_data __P ((ticket_t, void **));
struct _authority;
typedef struct _authority *authority_t;
......@@ -57,6 +58,18 @@ extern int authority_get_ticket __P ((authority_t, ticket_t *));
extern int authority_authenticate __P ((authority_t));
extern int authority_set_authenticate __P ((authority_t, int (*_authenticate) __P ((authority_t)), void *));
struct _wicket;
typedef struct _wicket *wicket_t;
extern int wicket_create __P ((wicket_t *, const char *));
extern int wicket_destroy __P ((wicket_t *));
extern int wicket_set_filename __P ((wicket_t, const char *));
extern int wicket_get_filename __P ((wicket_t, char *, size_t, size_t *));
extern int wicket_set_ticket __P ((wicket_t, int (*)
__P ((wicket_t, const char *,
const char *, ticket_t *))));
extern int wicket_get_ticket __P ((wicket_t, ticket_t *, const char *, const char *));
#ifdef __cplusplus
}
#endif
......
......@@ -56,6 +56,7 @@ sendmail.c \
smtp.c \
stream.c \
tcp.c \
ticket.c \
url.c \
url_file.c \
url_imap.c \
......@@ -64,6 +65,7 @@ url_mh.c \
url_path.c \
url_pop.c \
url_sendmail.c \
url_smtp.c
url_smtp.c \
wicket.c
libmailbox_la_LDFLAGS = -version-info 0:0:0
......
......@@ -22,134 +22,9 @@
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <termios.h>
#include <mailutils/mailbox.h>
#include <mailutils/mutil.h>
#include <auth0.h>
static void
echo_off(struct termios *stored_settings)
{
struct termios new_settings;
tcgetattr (0, stored_settings);
new_settings = *stored_settings;
new_settings.c_lflag &= (~ECHO);
tcsetattr (0, TCSANOW, &new_settings);
}
static void
echo_on(struct termios *stored_settings)
{
tcsetattr (0, TCSANOW, stored_settings);
}
int
ticket_create (ticket_t *pticket, void *owner)
{
ticket_t ticket;
if (pticket == NULL)
return EINVAL;
ticket = calloc (1, sizeof (*ticket));
if (ticket == NULL)
return ENOMEM;
ticket->owner = owner;
*pticket = ticket;
return 0;
}
void
ticket_destroy (ticket_t *pticket, void *owner)
{
if (pticket && *pticket)
{
ticket_t ticket = *pticket;
if (ticket->owner == owner)
{
if (ticket->type)
free (ticket->type);
free (ticket);
}
*pticket = NULL;
}
}
void *
ticket_get_owner (ticket_t ticket)
{
return (ticket) ? ticket->owner : NULL;
}
int
ticket_set_pop (ticket_t ticket,
int (*_pop) __P ((ticket_t, const char *, char **)),
void *owner)
{
if (ticket == NULL)
return EINVAL;
if (ticket->owner != owner)
return EACCES;
ticket->_pop = _pop;
return 0;
}
int
ticket_pop (ticket_t ticket, const char *challenge, char **parg)
{
if (ticket == NULL || parg == NULL)
return EINVAL;
if (ticket->_pop)
return ticket->_pop (ticket, challenge, parg);
else
{
char arg[256];
struct termios stored_settings;
int echo = 1;
/* Being smart if we see "Passwd" and turning off echo. */
if (strstr (challenge, "ass") != NULL
|| strstr (challenge, "ASS") != NULL)
echo = 0;
printf ("%s", challenge);
fflush (stdout);
if (!echo)
echo_off (&stored_settings);
fgets (arg, sizeof (arg), stdin);
if (!echo)
{
echo_on (&stored_settings);
putchar ('\n');
fflush (stdout);
}
arg [strlen (arg) - 1] = '\0'; /* nuke the trailing line. */
*parg = strdup (arg);
}
return 0;
}
int
ticket_get_type (ticket_t ticket, char *type, size_t len, size_t *pwriten)
{
size_t n;
if (ticket == NULL || type == NULL)
return EINVAL;
n = util_cpystr (type, ticket->type, len);
if (pwriten)
*pwriten = n;
return 0;
}
int
ticket_set_type (ticket_t ticket, char *type)
{
if (ticket == NULL)
return EINVAL;
if (ticket->type)
free (ticket->type);
ticket->type = strdup ((type) ? type : "");
return 0;
}
int
authority_create (authority_t *pauthority, ticket_t ticket, void *owner)
......@@ -213,7 +88,6 @@ authority_get_ticket (authority_t authority, ticket_t *pticket)
return 0;
}
int
authority_authenticate (authority_t authority)
{
......
/* GNU mailutils - a suite of utilities for electronic mail
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Library Public License as published by
......@@ -41,8 +41,9 @@ struct _ticket
{
void *owner;
char *challenge;
char *type;
int (*_pop) __P ((ticket_t, const char *challenge, char **));
void *data;
int (*_pop) __P ((ticket_t, const char *challenge, char **));
void (*_destroy) __P ((ticket_t));
};
struct _authority
......@@ -52,6 +53,12 @@ struct _authority
int (*_authenticate) __P ((authority_t));
};
struct _wicket
{
char *filename;
int (*_get_ticket) __P ((wicket_t, const char *, const char *, ticket_t *));
};
#ifdef __cplusplus
}
......
/* GNU mailutils - a suite of utilities for electronic mail
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Library Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <errno.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <termios.h>
#include <mailutils/mutil.h>
#include <auth0.h>
static void
echo_off(struct termios *stored_settings)
{
struct termios new_settings;
tcgetattr (0, stored_settings);
new_settings = *stored_settings;
new_settings.c_lflag &= (~ECHO);
tcsetattr (0, TCSANOW, &new_settings);
}
static void
echo_on(struct termios *stored_settings)
{
tcsetattr (0, TCSANOW, stored_settings);
}
int
ticket_create (ticket_t *pticket, void *owner)
{
ticket_t ticket;
if (pticket == NULL)
return EINVAL;
ticket = calloc (1, sizeof (*ticket));
if (ticket == NULL)
return ENOMEM;
ticket->owner = owner;
*pticket = ticket;
return 0;
}
void
ticket_destroy (ticket_t *pticket, void *owner)
{
if (pticket && *pticket)
{
ticket_t ticket = *pticket;
if (ticket->owner == owner)
{
if (ticket->_destroy)
ticket->_destroy (ticket);
if (ticket->challenge)
free (ticket->challenge);
free (ticket);
}
*pticket = NULL;
}
}
int
ticket_set_destroy (ticket_t ticket, void (*_destroy) __P ((ticket_t)),
void *owner)
{
if (ticket == NULL)
return EINVAL;
if (ticket->owner != owner)
return EACCES;
ticket->_destroy = _destroy;
return 0;
}
void *
ticket_get_owner (ticket_t ticket)
{
return (ticket) ? ticket->owner : NULL;
}
int
ticket_set_pop (ticket_t ticket,
int (*_pop) __P ((ticket_t, const char *, char **)),
void *owner)
{
if (ticket == NULL)
return EINVAL;
if (ticket->owner != owner)
return EACCES;
ticket->_pop = _pop;
return 0;
}
int
ticket_pop (ticket_t ticket, const char *challenge, char **parg)
{
if (ticket == NULL || parg == NULL)
return EINVAL;
if (ticket->_pop)
return ticket->_pop (ticket, challenge, parg);
else
{
char arg[256];
struct termios stored_settings;
int echo = 1;
/* Being smart if we see "Passwd" and turning off echo. */
if (strstr (challenge, "ass") != NULL
|| strstr (challenge, "ASS") != NULL)
echo = 0;
printf ("%s", challenge);
fflush (stdout);
if (!echo)
echo_off (&stored_settings);
fgets (arg, sizeof (arg), stdin);
if (!echo)
{
echo_on (&stored_settings);
putchar ('\n');
fflush (stdout);
}
arg [strlen (arg) - 1] = '\0'; /* nuke the trailing line. */
*parg = strdup (arg);
}
return 0;
}
int
ticket_get_data (ticket_t ticket, void **data)
{
if (ticket == NULL || data == NULL)
return EINVAL;
*data = ticket->data;
return 0;
}
int
ticket_set_data (ticket_t ticket, void *data, void *owner)
{
if (ticket == NULL)
return EINVAL;
if (ticket->owner != owner)
return EACCES;
ticket->data = data;
return 0;
}
/* GNU mailutils - a suite of utilities for electronic mail
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Library Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <errno.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#include <auth0.h>
struct myticket_data
{
char *user;
char *pass;
};
static char * stripwhite __P ((char *));
static int myticket_create __P ((ticket_t *, const char *, const char *));
static void myticket_destroy __P ((ticket_t));
static int _get_ticket __P ((ticket_t *, const char *, const char *));
static int myticket_pop __P ((ticket_t, const char *, char **));
int
wicket_create (wicket_t *pwicket, const char *filename)
{
if (pwicket == NULL)
return EINVAL;
*pwicket = calloc (1, sizeof (**pwicket));
if (*pwicket == NULL)
return ENOMEM;
if (filename)
(*pwicket)->filename = strdup (filename);
return 0;
}
int
wicket_destroy (wicket_t *pwicket)
{
if (pwicket && *pwicket)
{
wicket_t wicket = *pwicket;
if (wicket->filename)
free (wicket->filename);
free (wicket);
*pwicket = NULL;
}
}
int
wicket_get_filename (wicket_t wicket, char *filename, size_t len,
size_t *pwriten)
{
size_t n;
if (wicket == NULL)
return EINVAL;
n = util_cpystr (filename, wicket->filename, len);
if (pwriten)
*pwriten = n;
return 0;
}
int
wicket_set_filename (wicket_t wicket, const char *filename)
{
if (wicket == NULL)
return EINVAL;
if (wicket->filename)
free (wicket->filename);
wicket->filename = (filename) ? strdup (filename) : NULL;
return 0;
}
int
wicket_set_ticket (wicket_t wicket, int _get_ticket
__P ((wicket_t, const char *, const char *, ticket_t *)))
{
if (wicket == NULL)
return EINVAL;
wicket->_get_ticket = _get_ticket;
return 0;
}
int
wicket_get_ticket (wicket_t wicket, ticket_t *pticket, const char *user,
const char *type)
{
if (wicket == NULL || pticket == NULL || user == NULL)
return EINVAL;
if (wicket->filename == NULL)
return EINVAL;
if (wicket->_get_ticket)
return wicket->_get_ticket (wicket, user, type, pticket);
return _get_ticket (pticket, wicket->filename, user);
}
/* FIXME: This is a proof of concept ... write a more intelligent parser. */
static int
_get_ticket (ticket_t *pticket, const char *filename, const char *user)
{
FILE *fp;
char *buf;
size_t buflen;
int status = ENOENT;
fp = fopen (filename, "r");
if (fp == NULL)
return errno;
buflen = 128;
buf = malloc (buflen);
if (buf)
{
char *ptr = buf;
while (fgets (ptr, buflen, fp) != NULL)
{
size_t len = strlen (buf);
char *sep;
/* Check if a complete line. */
if (len && buf[len - 1] != '\n')
{
char *tmp = realloc (buf, 2*buflen);
if (tmp == NULL)
{
status = ENOMEM;
break;
}
buf = tmp;
ptr = buf + len;
continue;
}
else
ptr = buf;
/* Comments. */
if (*ptr == '#')
continue;
/* Skip leading spaces. */
while (isspace (*ptr))
{
ptr++;
len--;
}
/* user:passwd. Separator maybe ": \t" */
if (len && ((sep = memchr (ptr, ':', len)) != NULL
|| (sep = memchr (ptr, ' ', len)) != NULL
|| (sep = memchr (ptr, '\t', len)) != NULL))
{
*sep++ = '\0';
ptr = stripwhite (ptr);
if (strcmp (ptr, user) == 0)
{
sep = stripwhite (sep);
status = myticket_create (pticket, ptr, sep);
break;
}
}
}
}
else
status = ENOMEM;
if (buf)
free (buf);
fclose (fp);
return status;
}
static int
myticket_create (ticket_t *pticket, const char *user, const char *pass)
{
struct myticket_data *mdata;
int status = ticket_create (pticket, NULL);
if (status != 0)
return status;
mdata = calloc (1, sizeof *mdata);
if (mdata == NULL)
ticket_destroy (pticket, NULL);
ticket_set_destroy (*pticket, myticket_destroy, NULL);
ticket_set_pop (*pticket, myticket_pop, NULL);
ticket_set_data (*pticket, mdata, NULL);
if ((mdata->user = strdup (user)) == NULL
|| (mdata->pass = strdup (pass)) == NULL)
{
status = ENOMEM;
ticket_destroy (pticket, NULL);
}
return status;
}
static int
myticket_pop (ticket_t ticket, const char *challenge, char **parg)
{
struct myticket_data *mdata = NULL;
ticket_get_data (ticket, (void **)&mdata);
if (challenge && (strstr (challenge, "ass") != NULL
|| strstr (challenge, "ASS") != NULL))
*parg = strdup (mdata->pass);
else
*parg = strdup (mdata->user);
return 0;
}
static void
myticket_destroy (ticket_t ticket)
{
struct myticket_data *mdata = NULL;
ticket_get_data (ticket, (void **)&mdata);
if (mdata)
{
if (mdata->user)
free (mdata->user);
if (mdata->pass)
free (mdata->pass);
free (mdata);
}
}
/* Strip whitespace from the start and end of STRING. Return a pointer
into STRING. */
static char *
stripwhite (char *string)
{
register char *s, *t;
for (s = string; isspace (*s); s++)
;
if (*s == 0)
return (s);
t = s + strlen (s) - 1;
while (t > s && isspace (*t))
t--;
*++t = '\0';
return s;
}