summaryrefslogtreecommitdiff
path: root/usr.sbin/popa3d/virtual.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/popa3d/virtual.c')
-rw-r--r--usr.sbin/popa3d/virtual.c197
1 files changed, 0 insertions, 197 deletions
diff --git a/usr.sbin/popa3d/virtual.c b/usr.sbin/popa3d/virtual.c
deleted file mode 100644
index 1153fd474bd..00000000000
--- a/usr.sbin/popa3d/virtual.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/* $OpenBSD: virtual.c,v 1.6 2004/06/20 05:18:07 itojun Exp $ */
-
-/*
- * Virtual domain support.
- */
-
-#include "params.h"
-
-#if POP_VIRTUAL
-
-#define _XOPEN_SOURCE 4
-#define _XOPEN_SOURCE_EXTENDED
-#define _XOPEN_VERSION 4
-#define _XPG4_2
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <errno.h>
-#include <pwd.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#ifndef NAME_MAX
-#define NAME_MAX 255
-#endif
-
-extern int log_error(char *s);
-
-char *virtual_domain;
-char *virtual_spool;
-
-int virtual_startup(void)
-{
- return 0;
-}
-
-static char *lookup(void)
-{
- struct sockaddr_storage ss;
- int length;
- int error;
- static char hbuf[NI_MAXHOST];
-
- length = sizeof(ss);
- if (getsockname(0, (struct sockaddr *)&ss, &length)) {
- if (errno == ENOTSOCK) return "";
- log_error("getsockname");
- return NULL;
- }
-
- error = getnameinfo((struct sockaddr *)&ss, length, hbuf, sizeof(hbuf),
- NULL, 0, NI_NUMERICHOST);
- if (error) {
- /* logging? */
- return NULL;
- }
-
- return hbuf;
-}
-
-static int is_valid_user(char *user)
-{
- unsigned char *p;
-
-/* This is pretty liberal, but we're going to use direct syscalls only,
- * and they have to accept all the printable characters */
- for (p = (unsigned char *)user; *p; p++)
- if (*p < ' ' || *p > 0x7E || *p == '.' || *p == '/') return 0;
-
- if (p - (unsigned char *)user > NAME_MAX) return 0;
-
- return 1;
-}
-
-struct passwd *virtual_userpass(char *user, char *pass, int *known)
-{
- struct passwd *pw, *result;
- struct stat stat;
- char auth[VIRTUAL_AUTH_SIZE];
- char *address, *pathname;
- char *template, *passwd;
- int fail;
- int fd, size;
-
- *known = 0;
-
-/* Make sure we don't try to authenticate globally if something fails
- * before we find out whether the virtual domain is known to us */
- virtual_domain = "UNKNOWN";
- virtual_spool = NULL;
-
- if (!(address = lookup())) return NULL;
-
-/* Authenticate globally (if supported) if run on a non-socket */
- if (!*address) {
- virtual_domain = NULL;
- return NULL;
- }
-
- fail = 0;
- if (!is_valid_user(user)) {
- user = "INVALID";
- fail = 1;
- }
-
-/* This "can't happen", but is just too critical to not check explicitly */
- if (strchr(address, '/') || strchr(user, '/'))
- return NULL;
-
- if (asprintf(&pathname, "%s/%s", VIRTUAL_HOME_PATH, address) == -1)
- return NULL;
-
- if (lstat(pathname, &stat)) {
- if (errno == ENOENT)
- virtual_domain = NULL;
- else
- log_error("lstat");
- free(pathname);
- return NULL;
- }
-
- if (!(address = strdup(address))) {
- free(pathname);
- return NULL;
- }
- virtual_domain = address;
-
- free(pathname);
-
- if (asprintf(&pathname, "%s/%s/%s/%s", VIRTUAL_HOME_PATH, address,
- VIRTUAL_AUTH_PATH, user) == -1)
- return NULL;
-
- if ((fd = open(pathname, O_RDONLY)) < 0 && errno != ENOENT) {
- log_error("open");
- fail = 1;
- }
-
- free(pathname);
-
- if (asprintf(&virtual_spool, "%s/%s/%s", VIRTUAL_HOME_PATH,
- virtual_domain, VIRTUAL_SPOOL_PATH) == -1) {
- close(fd);
- return NULL;
- }
-
- size = 0;
- if (fd >= 0) {
- *known = !fail;
-
- if ((size = read(fd, auth, sizeof(auth))) < 0) {
- log_error("read");
- size = 0;
- fail = 1;
- }
-
- close(fd);
- }
-
- if (size >= sizeof(auth)) {
- size = 0;
- fail = 1;
- }
-
- auth[size] = 0;
-
- if (!(template = strtok(auth, ":")) || !*template) {
- template = "INVALID";
- fail = 1;
- }
- if (!(passwd = strtok(NULL, ":")) || !*passwd ||
- *passwd == '*' || *passwd == '!') {
- passwd = AUTH_DUMMY_SALT;
- fail = 1;
- }
- if (!strtok(NULL, ":")) fail = 1;
-
- if ((pw = getpwnam(template)))
- memset(pw->pw_passwd, 0, strlen(pw->pw_passwd));
- endpwent();
-
- result = NULL;
- if (!strcmp(crypt(pass, passwd), passwd) && !fail)
- result = pw;
-
- memset(auth, 0, sizeof(auth));
-
- return result;
-}
-
-#endif