From bac970ace24274b963f25edf29b5cbafa3aa9d26 Mon Sep 17 00:00:00 2001
From: Olav Morken <olav.morken@uninett.no>
Date: Fri, 3 Jul 2009 13:22:07 +0000
Subject: [PATCH] Auth/Simple: Add helper functions for logging an user in or
 out.

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@1549 44740490-163a-0410-bde0-09ae8108e29a
---
 lib/SimpleSAML/Auth/Simple.php    | 114 ++++++++++++++++++++++++++
 www/example-simple/verysimple.php | 129 ++++++++++++++++++++++++++++++
 2 files changed, 243 insertions(+)
 create mode 100644 lib/SimpleSAML/Auth/Simple.php
 create mode 100644 www/example-simple/verysimple.php

diff --git a/lib/SimpleSAML/Auth/Simple.php b/lib/SimpleSAML/Auth/Simple.php
new file mode 100644
index 000000000..546b2dc5e
--- /dev/null
+++ b/lib/SimpleSAML/Auth/Simple.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * Helper class for simple authentication applications.
+ *
+ * This class will use the authentication source specified in the
+ * 'default-authsource' option in 'config.php'.
+ *
+ * @package simpleSAMLphp
+ * @version $Id$
+ */
+class SimpleSAML_Auth_Simple {
+
+	/**
+	 * Check if the user is authenticated.
+	 *
+	 * This function checks if the user is authenticated with the default
+	 * authentication source selected by the 'default-authsource' option in
+	 * 'config.php'.
+	 *
+	 * @return bool  TRUE if the user is authenticated, FALSE if not.
+	 */
+	public static function isAuthenticated() {
+		$config = SimpleSAML_Configuration::getInstance();
+		$session = SimpleSAML_Session::getInstance();
+
+		$as = $config->getString('default-authsource');
+
+		return $session->isValid($as);
+	}
+
+
+	/**
+	 * Require the user to be authenticated.
+	 *
+	 * If the user is authenticated, this function returns immediately.
+	 *
+	 * If the user isn't authenticated, this function will authenticate the
+	 * user with the authentication source, and then return the user to the
+	 * current page.
+	 *
+	 * If $allowPost is set to TRUE, any POST data to the current page is
+	 * preserved. If $allowPost is FALSE, the user will be returned to the
+	 * current page with a GET request.
+	 *
+	 * @param bool $allowPost  Whether POST requests will be preserved. The default is to preserve POST requests.
+	 */
+	public static function requireAuth($allowPost = TRUE) {
+		assert('is_bool($allowPost)');
+
+		$config = SimpleSAML_Configuration::getInstance();
+		$session = SimpleSAML_Session::getInstance();
+
+		$as = $config->getString('default-authsource');
+
+		if ($session->isValid($as)) {
+			/* Already authenticated. */
+			return;
+		}
+
+		$url = SimpleSAML_Utilities::selfURL();
+		if ($allowPost && $_SERVER['REQUEST_METHOD'] === 'POST') {
+			$url = SimpleSAML_Utilities::createPostRedirectLink($url, $_POST);
+		}
+
+		SimpleSAML_Auth_Default::initLogin($as, $url);
+	}
+
+
+	/**
+	 * Log the user out.
+	 *
+	 * This function logs the user out. It will never return. By default,
+	 * it will cause a redirect to the current page after logging the user
+	 * out, but a different URL can be given with the $url parameter.
+	 *
+	 * @param string|NULL $url  The url the user should be redirected to after logging out.
+	 *                          Defaults to the current page.
+	 */
+	public static function logout($url = NULL) {
+		assert('is_string($url) || is_null($url)');
+
+		if ($url === NULL) {
+			$url = SimpleSAML_Utilities::selfURL();
+		}
+
+		SimpleSAML_Auth_Default::initLogout($url);
+	}
+
+
+	/**
+	 * Retrieve attributes of the current user.
+	 *
+	 * This function will retrieve the attributes of the current user if
+	 * the user is authenticated. If the user isn't authenticated, it will
+	 * return an empty array.
+	 *
+	 * @return array  The users attributes.
+	 */
+	public static function getAttributes() {
+
+		if (!self::isAuthenticated()) {
+			/* Not authenticated. */
+			return array();
+		}
+
+		/* Authenticated. */
+		$session = SimpleSAML_Session::getInstance();
+		return $session->getAttributes();
+	}
+
+}
+
+?>
\ No newline at end of file
diff --git a/www/example-simple/verysimple.php b/www/example-simple/verysimple.php
new file mode 100644
index 000000000..44e382edf
--- /dev/null
+++ b/www/example-simple/verysimple.php
@@ -0,0 +1,129 @@
+<?php
+
+/*
+ * This script is meant as an example of how simpleSAMLphp can be
+ * accessed from an existing application.
+ *
+ * As such, it does not use any of the simpleSAMLphp templates.
+ */
+
+
+/*
+ * We need access to the various simpleSAMLphp classes. These are loaded
+ * by the simpleSAMLphp autoloader.
+ */
+require_once('../../lib/_autoload.php');
+
+/* We need to tell simpleSAMLphp where the configuration is located. */
+SimpleSAML_Configuration::setConfigDir('../../config');
+
+
+
+/* This handles logout requests. */
+if (array_key_exists('logout', $_REQUEST)) {
+	/*
+	 * We redirect to the current URL _without_ the query parameter. This
+	 * avoids a redirect loop, since otherwise it will access the logout
+	 * endpoint again.
+	 */
+	SimpleSAML_Auth_Simple::logout(SimpleSAML_Utilities::selfURLNoQuery());
+	/* The previous function will never return. */
+}
+
+if (array_key_exists('login', $_REQUEST)) {
+	/*
+	 * If the login parameter is requested, it means that we should log
+	 * the user in. We do that by requiring the user to be authenticated.
+	 *
+	 * Note that the requireAuth-function will preserve all GET-parameters
+	 * and POST-parameters by default.
+	 */
+	SimpleSAML_Auth_Simple::requireAuth();
+	/* The previous function will only return if the user is authenticated. */
+}
+
+if (array_key_exists('message', $_POST)) {
+	/*
+	 * We require authentication while posting a message. If the user is
+	 * authenticated, the message will be shown.
+	 *
+	 * Since POST parameters are preserved during requireAuth-processing,
+	 * the message will be presented to the user after the authentication.
+	 */
+	SimpleSAML_Auth_Simple::requireAuth();
+	$message = $_POST['message'];
+} else {
+	$message = NULL;
+}
+
+/*
+ * We set a variable depending on whether the user is authenticated or not.
+ * This allows us to show the user a login link or a logout link depending
+ * on the authentication state.
+ */
+$isAuth = SimpleSAML_Auth_Simple::isAuthenticated();
+
+
+/*
+ * Retrieve the users attributes. We will list them if the user
+ * is authenticated.
+ */
+$attributes = SimpleSAML_Auth_Simple::getAttributes();
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+	<title>Simple test</title>
+</head>
+<body>
+
+<h1>Simple auth test</h1>
+
+<?php
+/* Show a logout message if authenticated or a login message if not. */
+if ($isAuth) {
+	echo '<p>You are currently authenticated. <a href="?logout">Log out</a>.</p>';
+} else {
+	echo '<p>You are not authenticated. <a href="?login">Log in</a>.</p>';
+}
+?>
+
+<p>The following form makes it possible to test requiering authentication
+in a POST handler. Try to submit the message while unauthenticated.</p>
+<form method="post" action="#">
+<input type="text" name="message" id="msg" />
+<input type="submit" value="Post message" />
+</form>
+
+<?php
+
+/* Print out the message if it is present. */
+if ($message !== NULL) {
+	echo '<h2>Message</h2>';
+	echo '<p>' . htmlspecialchars($message) . '</p>';
+}
+
+/* Print out the attributes if the user is authenticated. */
+if ($isAuth) {
+	echo '<h2>Attributes</h2>';
+	echo '<dl>';
+
+	foreach ($attributes as $name => $values) {
+		echo '<dt>' . htmlspecialchars($name) . '</dt>';
+		echo '<dd><ul>';
+		foreach ($values as $value) {
+			echo '<li>' . htmlspecialchars($value) . '</li>';
+		}
+		echo '</ul></dd>';
+	}
+
+	echo '</dl>';
+}
+
+?>
+
+</body>
+</html>
\ No newline at end of file
-- 
GitLab