#include "includes.h"

#ifdef HAVE_OSF_SIA
#include "ssh.h"
#include "auth-sia.h"
#include "log.h"
#include "servconf.h"
#include "canohost.h"

#include <sia.h>
#include <siad.h>
#include <pwd.h>
#include <signal.h>
#include <setjmp.h>
#include <sys/resource.h>
#include <unistd.h>
#include <string.h>

extern ServerOptions options;
extern int saved_argc;
extern char **saved_argv;

extern int errno;

int
auth_sia_password(char *user, char *pass)
{
	int ret;
	SIAENTITY *ent = NULL;
	const char *host;

	host = get_canonical_hostname(options.reverse_mapping_check);

	if (!user || !pass)
		return(0);

	if (sia_ses_init(&ent, saved_argc, saved_argv, host, user, NULL, 0,
	    NULL) != SIASUCCESS)
		return(0);

	if ((ret = sia_ses_authent(NULL, pass, ent)) != SIASUCCESS) {
		error("couldn't authenticate %s from %s", user, host);
		if (ret & SIASTOP)
			sia_ses_release(&ent);
		return(0);
	}

	sia_ses_release(&ent);

	return(1);
}

void
session_setup_sia(char *user, char *tty)
{
	int ret;
	struct passwd *pw;
	SIAENTITY *ent = NULL;
	const char *host;

	host = get_canonical_hostname (options.reverse_mapping_check);

	if (sia_ses_init(&ent, saved_argc, saved_argv, host, user, tty, 0,
	    NULL) != SIASUCCESS) {
		error("sia_ses_init failed");
		exit(1);
	}

	if ((pw = getpwnam(user)) == NULL) {
		sia_ses_release(&ent);
		error("getpwnam(%s) failed: %s", user, strerror(errno));
		exit(1);
	}
	if (sia_make_entity_pwd(pw, ent) != SIASUCCESS) {
		sia_ses_release(&ent);
		error("sia_make_entity_pwd failed");
		exit(1);
	}

	ent->authtype = SIA_A_NONE;
	if (sia_ses_estab(sia_collect_trm, ent) != SIASUCCESS) {
		error("couldn't establish session for %s from %s", user,
		    host);
		exit(1);
	}

	if (setpriority(PRIO_PROCESS, 0, 0) == -1) {
		sia_ses_release(&ent);
		error("setpriority failed: %s", strerror (errno));
		exit(1);
	}

	if (sia_ses_launch(sia_collect_trm, ent) != SIASUCCESS) {
		error("couldn't launch session for %s from %s", user, host);
		exit(1);
	}
	
	sia_ses_release(&ent);

	if (setreuid(geteuid(), geteuid()) < 0) {
		error("setreuid failed: %s", strerror (errno));
		exit(1);
	}
}

#endif /* HAVE_OSF_SIA */

