diff options
Diffstat (limited to 'php')
| -rw-r--r-- | php/Attic/examples/sample-idp/admin_user.php | 23 | ||||
| -rw-r--r-- | php/Attic/examples/sample-idp/index.php | 24 | ||||
| -rw-r--r-- | php/Attic/examples/sample-idp/log_view.php | 96 | ||||
| -rw-r--r-- | php/Attic/examples/sample-idp/login.php | 17 | ||||
| -rw-r--r-- | php/Attic/examples/sample-idp/setup.php | 27 | ||||
| -rw-r--r-- | php/Attic/examples/sample-idp/singleSignOn.php | 116 | ||||
| -rw-r--r-- | php/Attic/examples/sample-idp/soapEndpoint.php | 14 | ||||
| -rw-r--r-- | php/Attic/examples/sample-idp/user_add.php | 4 | ||||
| -rw-r--r-- | php/Attic/examples/sample-sp/assertionConsumer.php | 111 | ||||
| -rw-r--r-- | php/Attic/examples/sample-sp/index.php | 58 | ||||
| -rw-r--r-- | php/Attic/examples/sample-sp/log_view.php | 160 | ||||
| -rw-r--r-- | php/Attic/examples/sample-sp/login.php | 40 | ||||
| -rw-r--r-- | php/Attic/examples/sample-sp/logout.php | 1 | ||||
| -rw-r--r-- | php/Attic/examples/sample-sp/metadata_idp1.xml | 8 | ||||
| -rw-r--r-- | php/Attic/examples/sample-sp/setup.php | 58 | ||||
| -rw-r--r-- | php/Attic/examples/sample-sp/view_session.php | 88 |
16 files changed, 652 insertions, 193 deletions
diff --git a/php/Attic/examples/sample-idp/admin_user.php b/php/Attic/examples/sample-idp/admin_user.php index ca5f14ba..0f0c31c3 100644 --- a/php/Attic/examples/sample-idp/admin_user.php +++ b/php/Attic/examples/sample-idp/admin_user.php @@ -81,7 +81,8 @@ $res =& $db->query($query); if (DB::isError($res)) die($res->getMessage()); - + + $logger->log("Delete User '".$_GET['del']."'", PEAR_LOG_NOTICE); } lasso_init(); @@ -164,21 +165,21 @@ if ((($count - $startUser) > $number_of_users) && !isset($_GET['show_all'])) echo "<a href=$PHP_SELF?startUser=" . ($startUser + $number_of_users) . ">Next</a>"; else - echo "Next" - ?> - <?php + echo "Next"; + + if (isset($_GET['show_all'])) + echo "| <a href=\"" . $PHP_SELF ."?startUser=0\">Paginate</a>"; + else + { for ($i = 0; $i < $count; $i += $number_of_users) if ($i == $startUser) echo "| " . ( $i / $number_of_users); else echo "| <a href=\"$PHP_SELF?startUser=$i\">" . ( $i / $number_of_users) . "</a>"; + if ($count > $number_of_users) + echo "| <a href=\"$PHP_SELF?show_all=1\">Show All</a>"; + } ?> - | - <?php if (isset($_GET['show_all'])) { ?> - <a href="<?php echo $PHP_SELF."?startUser=0"; ?>">Paginate</a> - <?php } else { ?> - <a href="<?php echo $PHP_SELF."?show_all=1"; ?>">Show All</a> - <?php } ?> | <a href="javascript:void(0)" onClick="ToggleAll();">Toggle All</a></td> <td align='right'><a href="javascript:openpopup('user_add.php')">add user</a></td> </tr> @@ -237,7 +238,7 @@ </td> </tr> <tr> - <td colspan="<?php echo $num_col; ?>" align='center'> + <td colspan="<?php echo $num_col; ?>" align='center'> <?php // get all federations for this user if (!empty($session_dump) && !empty($identity_dump)) diff --git a/php/Attic/examples/sample-idp/index.php b/php/Attic/examples/sample-idp/index.php index 44e4570d..2b14c010 100644 --- a/php/Attic/examples/sample-idp/index.php +++ b/php/Attic/examples/sample-idp/index.php @@ -22,6 +22,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + require_once 'DB.php'; + if(!extension_loaded('lasso')) { $ret = @dl('lasso.' . PHP_SHLIB_SUFFIX); if ($ret == FALSE) @@ -50,13 +52,17 @@ You can get more informations about <b>Lasso</b> at <br> $config = unserialize(file_get_contents('config.inc')); - require_once 'DB.php'; + // connect to the data base + $db = &DB::connect($config['dsn']); + if (DB::isError($db)) + die($db->getMessage()); session_start(); lasso_init(); ?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <title>Lasso Service Provider Example</title> @@ -64,15 +70,16 @@ You can get more informations about <b>Lasso</b> at <br> </head> <body> -<p> +<p align='center'> <b>Identity Provider Administration</b><br> <a href="setup.php">Setup</a><br> - <a href="admin_user.php">Users Management</a> + <a href="admin_user.php">Users Management</a><br> + <a href="view_sessions.php">View Online Users</a> <?php if ($config['log_handler'] == 'sql') { ?> <br><a href="log_view.php">View log</a> <?php } ?> </p> -<p> +<p align='center'> <b>Identity Provider Fonctionnality</b><br> <?php if (!isset($_SESSION["user_id"])) { @@ -87,8 +94,8 @@ You can get more informations about <b>Lasso</b> at <br> <?php } ?> </p> -<p> -<table> +<p align='center'> +<table align='center'> <caption><b>Status</b></caption> <tr> <?php @@ -116,11 +123,12 @@ You can get more informations about <b>Lasso</b> at <br> </table> <br> -<p>Copyright © 2004 Entr'ouvert</p> +<p align='center'>Copyright © 2004 Entr'ouvert</p> </body> </html> <?php + $db->disconnect(); lasso_shutdown(); ?> diff --git a/php/Attic/examples/sample-idp/log_view.php b/php/Attic/examples/sample-idp/log_view.php index fb68fbdc..68acc458 100644 --- a/php/Attic/examples/sample-idp/log_view.php +++ b/php/Attic/examples/sample-idp/log_view.php @@ -37,16 +37,27 @@ $number_of_msg = 8; + // Count log messages + $query = "SELECT COUNT(*) FROM log"; + $res =& $db->query($query); + if (DB::isError($res)) + die($res->getMessage()); + + $row = $res->fetchRow(); + $count = $row[0]; + $startMsg = ((empty($_GET['startMsg'])) ? 0 : $_GET['startMsg']); - $query = "SELECT * FROM log"; + $query = "SELECT * FROM log ORDER BY id DESC"; if (!isset($_GET['show_all'])) $query .= " OFFSET $startMsg LIMIT " . ($startMsg + $number_of_msg); - + + $res =& $db->query($query); - if (DB::isError($db)) - die($db->getMessage()); + if (DB::isError($res)) + die($res->getMessage()); + $numRows = $res->numRows(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" @@ -54,7 +65,7 @@ <html> <head> <head> - <title>View Logs</title> + <title>Lasso Identity Provider Example : View Logs</title> </head> <body> <br> @@ -62,6 +73,36 @@ <caption>Logged events</caption> <thead> <tr> + <td colspan='4'> + <?php + if ($startMsg) + echo "<a href=$PHP_SELF?startMsg=" . ($startMsg - $number_of_msg) . ">Previous</a>"; + else + echo "Previous" + ?> + | + <?php + if ((($count - $startMsg) > $number_of_users) && !isset($_GET['show_all'])) + echo "<a href=\"" . $PHP_SELF . "?startMsg=" . ($startMsg + $number_of_msg) . "\">Next</a>"; + else + echo "Next"; + + if (isset($_GET['show_all'])) + echo "| <a href=\"" . $PHP_SELF ."?startMsg=0\">Paginate</a>"; + else + { + for ($i = 0; $i < $count; $i += $number_of_msg) + if ($i == $startMsg) + echo "| " . ( $i / $number_of_msg); + else + echo "| <a href=\"$PHP_SELF?startMsg=$i\">" . ( $i / $number_of_msg) . "</a>"; + if ($count > $number_of_msg) + echo "| <a href=\"$PHP_SELF?show_all=1\">Show All</a>"; + } + ?> + </td> +</tr> +<tr> <td align='center'>date</td> <td align='center'>filename</td> <td align='center'>priority</td> @@ -70,38 +111,49 @@ </thead> <tbody> <?php - $num_col = $res->numCols(); - $tableinfo = $db->tableInfo($res); + if ($numRows) + { + $num_col = $res->numCols(); + $tableinfo = $db->tableInfo($res); - $desc = array("emergency", "alert", "critical", "error", "warning", "notice", "informational", "debug"); + $desc = array("emergency", "alert", "critical", "error", "warning", "notice", "informational", "debug"); - while($row = $res->fetchRow()) - { - echo "<tr>"; - for ($i = 0; $i < $num_col; $i++) + while($row = $res->fetchRow()) { - switch ($tableinfo[$i]['name']) + echo "<tr>"; + for ($i = 0; $i < $num_col; $i++) { - case "id": - break; - case "priority": - echo "<td align='center'>" . $desc[$row[$i]] . "</td>"; - break; - default: - echo "<td align='center'>" . $row[$i] . "</td>"; + switch ($tableinfo[$i]['name']) + { + case "id": + break; + case "priority": + echo "<td align='center'>" . $desc[$row[$i]] . "</td>"; + break; + case "message": + echo "<td>" . $row[$i] . "</td>"; + break; + default: + echo "<td align='center'>" . $row[$i] . "</td>"; + } } + echo "</tr>"; } - echo "</tr>"; } ?> <tr> </tr> </tbody> <tfoot> -<td colspan='5'> </td> +<tr> + <td colspan='4'> </td> +</tr> </tfoot> </table> <br> +<p align='center'><a href='index.php'>Index</a> +</p> +<br> <p>Copyright © 2004 Entr'ouvert</p> </body> </html> diff --git a/php/Attic/examples/sample-idp/login.php b/php/Attic/examples/sample-idp/login.php index 21b196f9..db24681e 100644 --- a/php/Attic/examples/sample-idp/login.php +++ b/php/Attic/examples/sample-idp/login.php @@ -37,6 +37,8 @@ $conf['db'] = $db; $logger = &Log::factory($config['log_handler'], 'log', $_SERVER['PHP_SELF'], $conf); + session_start(); + /* * */ @@ -67,7 +69,7 @@ $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); die("Internal Server Error"); - } + } send by if ($res->numRows()) { @@ -90,17 +92,17 @@ // Check Login and Password if (!($user_id = authentificateUser($db, $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))) { - $logger->log("Authentication failure with login '".$form->exportValue('username')." password '". $form->exportValue('password') ."' IP '" . $_SERVER['REMOTE_ADDR']."'", PEAR_LOG_WARNING); + $logger->log("Authentication failure with login '".$form->exportValue('username')." password '". $form->exportValue('password') ."' IP " . $_SERVER['REMOTE_ADDR'], PEAR_LOG_WARNING); sendHTTPBasicAuth(); $db->disconnect(); exit; } else { - $_SESSION['user_id'] = $user_id; - $_SESSION['username'] = $_SERVER['PHP_AUTH_USER']; - - $logger->log("User '".$_SERVER['PHP_AUTH_USER']."'($user_id) authenticated, local session started", PEAR_LOG_NOTICE); + $_SESSION['user_id'] = $user_id; + $_SESSION['username'] = $_SERVER['PHP_AUTH_USER']; + + $logger->log("User '".$_SERVER['PHP_AUTH_USER']."' ($user_id) authenticated, local session started", PEAR_LOG_NOTICE); /* TODO : load identity and session dump @@ -148,11 +150,10 @@ { if (($user_id = authentificateUser($db, $form->exportValue('username'), $form->exportValue('password')))) { - session_start(); $_SESSION['user_id'] = $user_id; $_SESSION['username'] = $form->exportValue('username'); - $logger->log("User '".$form->exportValue('username')."'($user_id) authenticated, local session started", PEAR_LOG_NOTICE); + $logger->log("User '".$form->exportValue('username')."'($user_id) authenticated, local session started", PEAR_LOG_NOTICE); $url = 'index.php'; header("Request-URI: $url"); diff --git a/php/Attic/examples/sample-idp/setup.php b/php/Attic/examples/sample-idp/setup.php index d71de39f..eaa9fa88 100644 --- a/php/Attic/examples/sample-idp/setup.php +++ b/php/Attic/examples/sample-idp/setup.php @@ -211,10 +211,11 @@ $query = "CREATE TABLE users ( user_id varchar(100) primary key, - username varchar(255) unique, - password varchar(255), + username varchar(255) unique, + password varchar(255), identity_dump text, - session_dump text)"; + session_dump text, + created timestamp)"; $res =& $db->query($query); if (DB::isError($res)) die($res->getMessage()); @@ -279,6 +280,22 @@ die($res->getMessage()); print "OK"; + + print "<br>Create table 'sessions' : "; + $query = "DROP TABLE sessions CASCADE"; + $res =& $db->query($query); + + $query = "CREATE TABLE sessions ( + id varchar(32) primary key, + expiry integer, + data text + )"; + + $res =& $db->query($query); + if (DB::isError($res)) + die($res->getMessage()); + + print "OK"; $db->disconnect(); @@ -323,9 +340,7 @@ $config['idp-ca'], lassoSignatureMethodRsaSha1); if (empty($server)) - { die("Failed"); - } else print "OK"; @@ -368,7 +383,7 @@ $setup = TRUE; } $setup_log = ob_get_contents(); - ob_end_clean(); + ob_end_clean(); ?> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> diff --git a/php/Attic/examples/sample-idp/singleSignOn.php b/php/Attic/examples/sample-idp/singleSignOn.php index 9623e32c..96dc50b2 100644 --- a/php/Attic/examples/sample-idp/singleSignOn.php +++ b/php/Attic/examples/sample-idp/singleSignOn.php @@ -56,32 +56,37 @@ } else { - $login = new LassoLogin($server); - - // init login - updateDumpsFromSession($login); - initFromAuthnRequest($login); - - - - // User must *NOT* Authenticate with the IdP - if (!$login->mustAuthenticate()) - { - $user_id = authentificateUser($db, $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']); - if (!$user_id) - die("Unknown User"); + $login = new LassoLogin($server); + + // init login + updateDumpsFromSession($login); + initFromAuthnRequest($login); + + + // User must *NOT* Authenticate with the IdP + if (!$login->mustAuthenticate()) + { + $user_id = authentificateUser($db, $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']); + if (!$user_id) + { + $logger->log("User must not authenticate, username and password are not available", PEAR_LOG_CRIT); + die("Unknown User"); + } - $array = getIdentityDumpAndSessionDumpFromUserID($db, $user_id); - if (empty($array)) - die("Could not get Identity and Session Dump"); - - $login->setIdentityFromDump($array['identity_dump']); - $login->setSessionFromDump($array['session_dump']); + $array = getIdentityDumpAndSessionDumpFromUserID($db, $user_id); + if (empty($array)) + { + $logger->log("User must no authenticate, but I don't find session and identity dump in the database", PEAR_LOG_CRIT); + die("Could not get Identity and Session Dump"); + } + + $login->setIdentityFromDump($array['identity_dump']); + $login->setSessionFromDump($array['session_dump']); - doneSingleSignOn($db, $login, $user_id); - $db->disconnect(); - exit; - } + doneSingleSignOn($db, $login, $user_id); + $db->disconnect(); + exit; + } // Check Login and Password if (!($user_id = authentificateUser($db, $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))) @@ -206,12 +211,20 @@ */ function updateDumpsFromSession(&$login) { + global $logger; + // Get session and identity dump if there are available if (!empty($_SESSION['session_dump'])) + { + $logger->log("Update user's session dump", PEAR_LOG_DEBUG); $login->setSessionFromDump($_SESSION['session_dump']); + } if (!empty($_SESSION['identity_dump'])) + { + $logger->log("Update user's identity dump", PEAR_LOG_DEBUG); $login->setIdentityFromDump($_SESSION['identity_dump']); + } } /* @@ -237,12 +250,18 @@ */ function authentificateUser($db, $username, $password) { + global $logger; + $query = "SELECT user_id FROM users WHERE username=".$db->quoteSmart($username); $query .= " AND password=".$db->quoteSmart($password); $res =& $db->query($query); if (DB::isError($res)) + { + $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); + $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); die($res->getMessage()); + } if ($res->numRows()) { @@ -259,11 +278,15 @@ function getUserIDFromNameIdentifier($db, $nameidentifier) { $query = "SELECT user_id FROM nameidentifiers WHERE name_identifier='$nameidentifier'"; - echo $query; + // echo $query; $res =& $db->query($query); - if (DB::isError($res)) - die($res->getMessage()); + if (DB::isError($res)) + { + $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); + $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); + die($res->getMessage()); + } // UserID not found if (!$res->numRows()) @@ -289,8 +312,8 @@ if ($res->numRows()) { $row =& $res->fetchRow(); - $ret = array("identity_dump" => $row[0], "session_dump" => $row[1]); - return ($ret); + $ret = array("identity_dump" => $row[0], "session_dump" => $row[1]); + return ($ret); } } @@ -300,32 +323,24 @@ */ function doneSingleSignOn($db, &$login, $user_id, $is_first_sso = FALSE) { + global $logger; + $authenticationMethod = (($_SERVER["HTTPS"] == 'on') ? lassoSamlAuthenticationMethodSecureRemotePassword : lassoSamlAuthenticationMethodPassword); // reauth in session_cache_expire, default is 180 minutes $reauthenticateOnOrAfter = strftime("%Y-%m-%dT%H:%M:%SZ", time() + session_cache_expire() * 60); - /* FIXME : there is a segfault when I use a switch statement - switch($login->protocolProfile) - { - case lassoLoginProtocolProfileBrwsArt: - $login->buildArtifactMsg(TRUE, // User is authenticated - $authenticationMethod, $reauthenticateOnOrAfter, lassoHttpMethodRedirect); - break; - case lassoLoginProtocolProfileBrwsPost: - die("TODO : Post\n"); - default: - die("Unknown protocol profile\n"); - } */ - if ($login->protocolProfile == lassoLoginProtocolProfileBrwsArt) $login->buildArtifactMsg(TRUE, // User is authenticated $authenticationMethod, $reauthenticateOnOrAfter, lassoHttpMethodRedirect); else if ($login->protocolProfile == lassoLoginProtocolProfileBrwsPost) die("TODO : Post\n"); // TODO else - die("Unknown protocol profile\n"); + { + $logger->log("Unknown protocol profile", PEAR_LOG_CRIT); + die("Unknown protocol profile\n"); + } if ($is_first_sso) { @@ -335,23 +350,30 @@ $res =& $db->query($query); if (DB::isError($res)) - die($res->getMessage()); + { + $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); + $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); + die($res->getMessage()); + } } $identity = $login->identity; // do we need to update identity dump? if ($login->isIdentityDirty) - updateIdentityDump($db, $user_id, $identity->dump()); + updateIdentityDump($db, $user_id, $identity->dump()); $session = $login->session; // do we need to update session dump? if ($login->isSessionDirty) - updateSessionDump($db, $user_id, $session->dump()); + updateSessionDump($db, $user_id, $session->dump()); if (empty($login->assertionArtifact)) + { + $logger->log("Assertion Artifact is empty", PEAR_LOG_CRIT); die("assertion Artifact is empty"); + } - saveAssertionArtifact($db, $login->assertionArtifact, $login->assertion); + saveAssertionArtifact($db, $login->assertionArtifact, $login->assertion); unset($_SESSION['login_dump']); // delete login_dump $_SESSION['identity_dump'] = $session->dump(); diff --git a/php/Attic/examples/sample-idp/soapEndpoint.php b/php/Attic/examples/sample-idp/soapEndpoint.php index 887a5063..9172e9fd 100644 --- a/php/Attic/examples/sample-idp/soapEndpoint.php +++ b/php/Attic/examples/sample-idp/soapEndpoint.php @@ -1,6 +1,5 @@ <?php /* - * * Identity Provider Example -- SOAP Endpoint * * Copyright (C) 2004 Entr'ouvert @@ -25,12 +24,19 @@ require_once 'Log.php'; require_once 'DB.php'; + $config = unserialize(file_get_contents('config.inc')); + + $server_dump = file_get_contents($config['server_dump_filename']); + header("Content-Type: text/xml\r\n"); // connect to the data base $db = &DB::connect($config['dsn']); if (DB::isError($db)) - die("Could not connect to the database"); + { + header("HTTP/1.0 500 Internal Server Error"); + exit; + } // create logger $conf['db'] = $db; @@ -42,10 +48,6 @@ die("HTTP_RAW_POST_DATA is empty!"); } - $config = unserialize(file_get_contents('config.inc')); - - $server_dump = file_get_contents($config['server_dump_filename']); - lasso_init(); $requestype = lasso_getRequestTypeFromSoapMsg($HTTP_RAW_POST_DATA); diff --git a/php/Attic/examples/sample-idp/user_add.php b/php/Attic/examples/sample-idp/user_add.php index 014677b1..ce451431 100644 --- a/php/Attic/examples/sample-idp/user_add.php +++ b/php/Attic/examples/sample-idp/user_add.php @@ -50,9 +50,9 @@ if ($form->validate()) { - $query = "INSERT INTO users (user_id, username, password) VALUES(nextval('user_id_seq'),"; + $query = "INSERT INTO users (user_id, username, password, created) VALUES(nextval('user_id_seq'),"; $query .= $db->quoteSmart($form->exportValue('username')) . ","; - $query .= $db->quoteSmart($form->exportValue('password')) . ")"; + $query .= $db->quoteSmart($form->exportValue('password')) . ", NOW())"; $res =& $db->query($query); if (DB::isError($res)) diff --git a/php/Attic/examples/sample-sp/assertionConsumer.php b/php/Attic/examples/sample-sp/assertionConsumer.php index 7ae2c7a8..85d67556 100644 --- a/php/Attic/examples/sample-sp/assertionConsumer.php +++ b/php/Attic/examples/sample-sp/assertionConsumer.php @@ -22,24 +22,36 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - $config = unserialize(file_get_contents('config.inc')); - + require_once 'Log.php'; require_once 'DB.php'; + + $config = unserialize(file_get_contents('config.inc')); + if (!$_GET['SAMLart']) { exit(1); } - + + $db = &DB::connect($config['dsn']); + + if (DB::isError($db)) + die($db->getMessage()); + + // create logger + $conf['db'] = $db; + $logger = &Log::factory($config['log_handler'], 'log', $_SERVER['PHP_SELF'], $conf); + session_start(); lasso_init(); $server_dump = file_get_contents($config['server_dump_filename']); - $server = LassoServer::newfromdump($server_dump); + $server = LassoServer::newFromDump($server_dump); $login = new LassoLogin($server); + $logger->log('Request from ' . $_SERVER['REMOTE_ADDR'], PEAR_LOG_INFO); $login->initRequest($_SERVER['QUERY_STRING'], lassoHttpMethodRedirect); $login->buildRequestMsg(); @@ -49,6 +61,9 @@ "POST %s HTTP/1.1\r\nHost: %s:%d\r\nContent-Length: %d\r\nContent-Type: text/xml\r\n\r\n%s\r\n", $url['path'], $url['host'], $url['port'], strlen($login->msgBody), $login->msgBody); + $logger->log('Send SOAP Request to '. $url['host'] . ":" .$url['port']. $url['path'], PEAR_LOG_INFO); + $logger->log('SOAP Request : ' . $soap, PEAR_LOG_DEBUG); + # PHP 4.3.0 with OpenSSL support required $fp = fsockopen("ssl://" . $url['host'], $url['port'], $errno, $errstr, 30) or die($errstr ($errno)); socket_set_timeout($fp, 10); @@ -78,41 +93,50 @@ else { if (preg_match('/Content\\-Length:\\s+([0-9]+)\\r\\n/', $header, $matches)) - $response = fread($fp, $matches[1]); + $response = @fread($fp, $matches[1]); else while (!feof($fp)) $response .= fread($fp, 1024); } fclose($fp); + $logger->log('SOAP Response Header : ' . $header, PEAR_LOG_DEBUG); + $logger->log('SOAP Response Body : ' . $response, PEAR_LOG_DEBUG); + if (!preg_match("/^HTTP\/1\\.. 200/i", $header)) { - die("Wrong artifact"); + $logger->log("Wrong Artifact send by " . $_SERVER['REMOTE_ADDR'], PEAR_LOG_ERR); + die("Wrong Artifact"); } $login->processResponseMsg($response); - - $db = &DB::connect($config['dsn']); - - if (DB::isError($db)) - die($db->getMessage()); - + $query = "SELECT user_id FROM nameidentifiers WHERE name_identifier='" . $login->nameIdentifier . "'"; $res =& $db->query($query); + $logger->log("Name Identifier : " . $login->nameIdentifier, PEAR_LOG_DEBUG); + if (DB::isError($res)) - die($res->getMessage()); + { + $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); + $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); + die($db->getMessage()); + } if ($res->numRows() > 0) { // User already exist in the database $row =& $res->fetchRow(); - $user_id = $row[0]; + $user_id = $row[0]; # Get Identity Dump from the data base $query = "SELECT identity_dump FROM users WHERE user_id='$user_id'"; $res =& $db->query($query); if (DB::isError($db)) - die($db->getMessage()); + { + $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); + $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); + die($db->getMessage()); + } $row =& $res->fetchRow(); @@ -124,11 +148,13 @@ $session = $login->session; - $_SESSION["nameidentifier"] = $login->nameIdentifier; - $_SESSION["session_dump"] = $session->dump(); - $_SESSION["user_id"] = $user_id; + $_SESSION['nameidentifier'] = $login->nameIdentifier; + $_SESSION['session_dump'] = $session->dump(); + $_SESSION['user_id'] = $user_id; $url = "index.php"; + + $logger->log("New session started for user '$user_id'", PEAR_LOG_INFO); } else { @@ -141,30 +167,48 @@ $session = $login->session; // Insert into users - $identity_dump_quoted = $db->quoteSmart($identity_dump); - $query = "INSERT INTO users (user_id,identity_dump,created) VALUES(nextval('user_id_seq'), $identity_dump_quoted, NOW())"; + $query = "INSERT INTO users (user_id,identity_dump,created) VALUES(nextval('user_id_seq'),"; + $query .= $db->quoteSmart($identity_dump) . ", NOW())"; + $res =& $db->query($query); if (DB::isError($res)) - print $res->getMessage(). "\n"; + { + $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); + $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); + die($db->getMessage()); + } + // Get UserID $query = "SELECT last_value FROM user_id_seq"; $res =& $db->query($query); if (DB::isError($res)) - print $res->getMessage(). "\n"; + { + $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); + $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); + die($db->getMessage()); + } $row = $res->fetchRow(); $user_id = $row[0]; + $logger->log("New user($user_id) created", PEAR_LOG_NOTICE); + // Insert into nameidentifiers $query = "INSERT INTO nameidentifiers VALUES('".$login->nameIdentifier."', '$user_id')"; $res =& $db->query($query); if (DB::isError($res)) - print $res->getMessage(). "\n"; + { + $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); + $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); + die($db->getMessage()); + } + + $_SESSION['nameidentifier'] = $login->nameIdentifier; + $_SESSION['session_dump'] = $session->dump(); + $_SESSION['user_id'] = $user_id; - $_SESSION["nameidentifier"] = $login->nameIdentifier; - $_SESSION["session_dump"] = $session->dump(); - $_SESSION["user_id"] = $user_id; + $logger->log("New session started for user '$user_id', redirect to the registration form", PEAR_LOG_INFO); $url = "register.php"; } @@ -173,14 +217,17 @@ $query = "UPDATE users SET last_login=NOW() WHERE user_id='$user_id'"; $res =& $db->query($query); if (DB::isError($res)) - print $res->getMessage(). "\n"; - - $db->disconnect(); - - lasso_shutdown(); + { + $logger->log("DB Error :" . $db->getMessage(), PEAR_LOG_CRIT); + $logger->log("DB Error :" . $db->getDebugInfo(), PEAR_LOG_DEBUG); + die($db->getMessage()); + } + $logger->log("Update last login for user '$user_id'", PEAR_LOG_INFO); header("Request-URI: $url"); header("Content-Location: $url"); - header("Location: $urln\n\n"); + header("Location: $url\n\n"); + $db->disconnect(); + lasso_shutdown(); exit(); ?> diff --git a/php/Attic/examples/sample-sp/index.php b/php/Attic/examples/sample-sp/index.php index 199e8286..05d16e54 100644 --- a/php/Attic/examples/sample-sp/index.php +++ b/php/Attic/examples/sample-sp/index.php @@ -22,6 +22,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + require_once 'HTTP/Session.php'; + require_once 'DB.php'; + if(!extension_loaded('lasso')) { $ret = @dl('lasso.' . PHP_SHLIB_SUFFIX); if ($ret == FALSE) @@ -50,14 +53,17 @@ You can get more informations about <b>Lasso</b> at <br> $config = unserialize(file_get_contents('config.inc')); - require_once 'DB.php'; - - session_start(); + // connect to the data base + $db = &DB::connect($config['dsn']); + if (DB::isError($db)) + die($db->getMessage()); + + session_start(); - lasso_init(); - + lasso_init(); ?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <title>Lasso Service Provider Example</title> @@ -65,19 +71,26 @@ You can get more informations about <b>Lasso</b> at <br> </head> <body> -<p> +<p align='center'> <b>Service Provider Administration</b><br> <a href="setup.php">Setup</a><br> <a href="admin_user.php">Users Management</a><br> +<a href="view_session.php">View Online Users</a> +<?php if ($config['log_handler'] == 'sql') { ?> + <br><a href="log_view.php">View log</a> +<?php } ?> </p> -<p> +<p align='center'> <b>Serice Provider Fonctionnality</b> -<table> +<table align='center'> <?php if (!isset($_SESSION["nameidentifier"])) { ?> <tr> - <td colspan="2">Single SignOn using an IdP</td> + <td colspan="2">Single SignOn using an Identity Provider</td> +</tr> +<tr> + <td colspan="2"> </td> </tr> <tr> <td>Provider</td> @@ -85,7 +98,7 @@ You can get more informations about <b>Lasso</b> at <br> </tr> <tr> <td><?php echo $config['providerID']; ?></td> - <td><a href="login.php">post</a> | <a href="login.php">artifact</a></td> + <td><a href="login.php?profile=post">post</a> | <a href="login.php?profile=artifact">artifact</a></td> </tr> <?php } else { ?> <tr> @@ -97,8 +110,8 @@ You can get more informations about <b>Lasso</b> at <br> </table> </p> -<p> -<table> +<p align='center'> +<table align='center'> <caption><b>Status</b></caption> <tr> <?php @@ -118,19 +131,14 @@ You can get more informations about <b>Lasso</b> at <br> <td><b>UserID:</b></td><td><?php echo $_SESSION["user_id"]; ?></td> </tr> <?php - $db = &DB::connect($config['dsn']); - - if (DB::isError($db)) - die($db->getMessage()); - + $query = "SELECT * FROM users WHERE user_id='". $_SESSION["user_id"] ."'"; $res =& $db->query($query); if (DB::isError($res)) - print $res->getMessage(). "\n"; + die($res->getMessage()); list($user_id, $identity_dump, $first_name, $last_name, $last_login, $created) = $res->fetchRow(); - ?> <tr> <td><b>Last Name:</b></td><td><?php echo $last_name; ?></td> @@ -147,20 +155,16 @@ You can get more informations about <b>Lasso</b> at <br> <tr> <td><b>Last Login:</b></td><td><?php echo $last_login; ?></td> <?php - $db->disconnect(); } ?> </tr> </table> </p> -<!-- <p>Lasso Version : <?php // echo lasso_version(); ?></p> --> - <br> -<p>Copyright © 2004 Entr'ouvert</p> - +<p align='center'>Copyright © 2004 Entr'ouvert</p> </body> - </html> <?php lasso_shutdown(); - ?> + $db->disconnect(); +?> diff --git a/php/Attic/examples/sample-sp/log_view.php b/php/Attic/examples/sample-sp/log_view.php new file mode 100644 index 00000000..68acc458 --- /dev/null +++ b/php/Attic/examples/sample-sp/log_view.php @@ -0,0 +1,160 @@ +<?php +/* + * Identity Provider Example -- View log + * + * Copyright (C) 2004 Entr'ouvert + * http://lasso.entrouvert.org + * + * Authors: Christophe Nowicki <cnowicki@easter-eggs.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + require_once 'HTML/QuickForm.php'; + require_once 'DB.php'; + + $config = unserialize(file_get_contents('config.inc')); + + // connect to the data base + $db = &DB::connect($config['dsn']); + if (DB::isError($db)) + die("Could not connect to the database"); + + if ($config['log_handler'] != 'sql') + die("Unsupported log handler"); + + $number_of_msg = 8; + + // Count log messages + $query = "SELECT COUNT(*) FROM log"; + $res =& $db->query($query); + if (DB::isError($res)) + die($res->getMessage()); + + $row = $res->fetchRow(); + $count = $row[0]; + + $startMsg = ((empty($_GET['startMsg'])) ? 0 : $_GET['startMsg']); + + $query = "SELECT * FROM log ORDER BY id DESC"; + if (!isset($_GET['show_all'])) + $query .= " OFFSET $startMsg LIMIT " . ($startMsg + $number_of_msg); + + + $res =& $db->query($query); + if (DB::isError($res)) + die($res->getMessage()); + + $numRows = $res->numRows(); + +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html> +<head> +<head> + <title>Lasso Identity Provider Example : View Logs</title> +</head> +<body> +<br> +<table border='1' width='100%'> +<caption>Logged events</caption> +<thead> +<tr> + <td colspan='4'> + <?php + if ($startMsg) + echo "<a href=$PHP_SELF?startMsg=" . ($startMsg - $number_of_msg) . ">Previous</a>"; + else + echo "Previous" + ?> + | + <?php + if ((($count - $startMsg) > $number_of_users) && !isset($_GET['show_all'])) + echo "<a href=\"" . $PHP_SELF . "?startMsg=" . ($startMsg + $number_of_msg) . "\">Next</a>"; + else + echo "Next"; + + if (isset($_GET['show_all'])) + echo "| <a href=\"" . $PHP_SELF ."?startMsg=0\">Paginate</a>"; + else + { + for ($i = 0; $i < $count; $i += $number_of_msg) + if ($i == $startMsg) + echo "| " . ( $i / $number_of_msg); + else + echo "| <a href=\"$PHP_SELF?startMsg=$i\">" . ( $i / $number_of_msg) . "</a>"; + if ($count > $number_of_msg) + echo "| <a href=\"$PHP_SELF?show_all=1\">Show All</a>"; + } + ?> + </td> +</tr> +<tr> + <td align='center'>date</td> + <td align='center'>filename</td> + <td align='center'>priority</td> + <td align='center'>message</td> +</tr> +</thead> +<tbody> +<?php + if ($numRows) + { + $num_col = $res->numCols(); + $tableinfo = $db->tableInfo($res); + + $desc = array("emergency", "alert", "critical", "error", "warning", "notice", "informational", "debug"); + + while($row = $res->fetchRow()) + { + echo "<tr>"; + for ($i = 0; $i < $num_col; $i++) + { + switch ($tableinfo[$i]['name']) + { + case "id": + break; + case "priority": + echo "<td align='center'>" . $desc[$row[$i]] . "</td>"; + break; + case "message": + echo "<td>" . $row[$i] . "</td>"; + break; + default: + echo "<td align='center'>" . $row[$i] . "</td>"; + } + } + echo "</tr>"; + } + } +?> +<tr> +</tr> +</tbody> +<tfoot> +<tr> + <td colspan='4'> </td> +</tr> +</tfoot> +</table> +<br> +<p align='center'><a href='index.php'>Index</a> +</p> +<br> +<p>Copyright © 2004 Entr'ouvert</p> +</body> +</html> + diff --git a/php/Attic/examples/sample-sp/login.php b/php/Attic/examples/sample-sp/login.php index 229aa28a..c857e5cd 100644 --- a/php/Attic/examples/sample-sp/login.php +++ b/php/Attic/examples/sample-sp/login.php @@ -1,6 +1,5 @@ <?php /* - * * Service Provider Example -- Simple Sing On * * Copyright (C) 2004 Entr'ouvert @@ -22,10 +21,14 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - + + require_once 'Log.php'; + require_once 'DB.php'; $config = unserialize(file_get_contents('config.inc')); + session_start(); + lasso_init(); $server_dump = file_get_contents($config['server_dump_filename']); @@ -34,20 +37,29 @@ $login = new LassoLogin($server); - $login->initauthnrequest(lassoHttpMethodRedirect); - - $request = $login->authnRequest; + switch($_GET['profile']) + { + case 'post': + // TODO + break; + case 'artifact': + $login->initauthnrequest(lassoHttpMethodRedirect); + + $request = $login->authnRequest; - $request->isPassive = FALSE; - $request->nameIdPolicy = lassoLibNameIDPolicyTypeFederated; - $request->consent = lassoLibConsentObtained; + $request->isPassive = FALSE; + $request->nameIdPolicy = lassoLibNameIDPolicyTypeFederated; + $request->consent = lassoLibConsentObtained; - $login->buildAuthnRequestMsg($config['providerID']); + $login->buildAuthnRequestMsg($config['providerID']); - $url = $login->msgUrl; + $url = $login->msgUrl; - header("Request-URI: $url"); - header("Content-Location: $url"); - header("Location: $url\r\n\r\n"); - exit(); + header("Request-URI: $url"); + header("Content-Location: $url"); + header("Location: $url\r\n\r\n"); + exit(); + default: + die('Unknown single sign on profile'); + } ?> diff --git a/php/Attic/examples/sample-sp/logout.php b/php/Attic/examples/sample-sp/logout.php index 81937679..68f15fea 100644 --- a/php/Attic/examples/sample-sp/logout.php +++ b/php/Attic/examples/sample-sp/logout.php @@ -69,7 +69,6 @@ $url['path'], $url['host'], $url['port'], strlen($logout->msgBody), $logout->msgBody); - die($soap); # PHP 4.3.0 with OpenSSL support required $fp = fsockopen("ssl://" . $url['host'], $url['port'], $errno, $errstr, 30) or die($errstr ($errno)); diff --git a/php/Attic/examples/sample-sp/metadata_idp1.xml b/php/Attic/examples/sample-sp/metadata_idp1.xml index 3330c73d..5dda1a22 100644 --- a/php/Attic/examples/sample-sp/metadata_idp1.xml +++ b/php/Attic/examples/sample-sp/metadata_idp1.xml @@ -4,16 +4,16 @@ xmlns="urn:liberty:metadata:2003-08"> <IDPDescriptor> - <SingleSignOnServiceURL>https://idp1:1998/singleSignOn</SingleSignOnServiceURL> + <SingleSignOnServiceURL>https://idp1:1998/singleSignOn.php</SingleSignOnServiceURL> <SingleSignOnProtocolProfile>http://projectliberty.org/profiles/sso-get</SingleSignOnProtocolProfile> - <SingleLogoutServiceURL>https://idp1:1998/singleLogout</SingleLogoutServiceURL> + <SingleLogoutServiceURL>https://idp1:1998/singleLogout.php</SingleLogoutServiceURL> <SingleLogoutProtocolProfile>http://projectliberty.org/profiles/slo-idp-soap</SingleLogoutProtocolProfile> - <RegisterNameIdentifierServiceURL>https://idp1:1998/registerNameIdentifier</RegisterNameIdentifierServiceURL> + <RegisterNameIdentifierServiceURL>https://idp1:1998/registerNameIdentifier.php</RegisterNameIdentifierServiceURL> <RegisterNameIdentifierProtocolProfile>http://projectliberty.org/profiles/rni-sp-http</RegisterNameIdentifierProtocolProfile> - <SoapEndpoint>https://idp1:1998/soapEndpoint</SoapEndpoint> + <SoapEndpoint>https://idp1:1998/soapEndpoint.php</SoapEndpoint> </IDPDescriptor> </EntityDescriptor> diff --git a/php/Attic/examples/sample-sp/setup.php b/php/Attic/examples/sample-sp/setup.php index eebd81ed..c6c44228 100644 --- a/php/Attic/examples/sample-sp/setup.php +++ b/php/Attic/examples/sample-sp/setup.php @@ -22,8 +22,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + require_once 'DB.php'; ?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <?php if(!extension_loaded('lasso')) { $ret = @dl('lasso.' . PHP_SHLIB_SUFFIX); @@ -35,9 +37,8 @@ print "<a href='http://lasso.entrouvert.org/'>http://lasso.entrouvert.org/</a></p>"; exit(); } - } + } - require_once 'DB.php'; # default config if (!file_exists('config.inc')) @@ -46,6 +47,7 @@ $config = array( 'dsn' => "pgsql://sp:sp@localhost/sp", 'server_dump_filename' => "lasso_server_dump.xml", + 'log_handler' => "sql", 'sp-metadata' => $cwd . "/metadata_sp1.xml", 'sp-public_key' => $cwd . "/public-key_sp1.pem", 'sp-private_key' => $cwd . "/private-key-raw_sp1.pem", @@ -140,7 +142,41 @@ die($res->getMessage()); print "OK"; + + print "<br>Create table 'log' : "; + $query = "DROP TABLE log CASCADE"; + $res =& $db->query($query); + + $query = "CREATE TABLE log ( + id integer primary key, + logtime timestamp, + ident varchar(16), + priority integer, + message text)"; + + $res =& $db->query($query); + if (DB::isError($res)) + die($res->getMessage()); + + print "OK"; + + + print "<br>Create table 'sessions' : "; + $query = "DROP TABLE sessions CASCADE"; + $res =& $db->query($query); + + $query = "CREATE TABLE sessions ( + id varchar(32) primary key, + expiry integer, + data text + )"; + $res =& $db->query($query); + if (DB::isError($res)) + die($res->getMessage()); + + print "OK"; + $db->disconnect(); $keys = array_keys($config); @@ -151,9 +187,7 @@ { print "<br>Check file " . $config[$file] . " : "; if (!file_exists($config[$file])) - { die("Failed (file does not exist)"); - } else print "OK"; } @@ -262,6 +296,20 @@ </tr> <tr> + <td colspan='3' align='center'>Logging</td> +</tr> +<tr> + <td>Handler :</td> + <td> + <select name='log_handler'> + <option value="null" <?php if ($config['log_handler'] == 'null') echo 'selected="selected"'; ?>>NULL (disabled)</option> + <option value="sql" <?php if ($config['log_handler'] == 'sql') echo 'selected="selected"'; ?>>Database</option> + <option value="syslog" <?php if ($config['log_handler'] == 'syslog') echo 'selected="selected"'; ?>>Syslog</option> + </select> + </td><td> </td> +</tr> + +<tr> <td colspan='3' align='center'>Service Provider</td> </tr> diff --git a/php/Attic/examples/sample-sp/view_session.php b/php/Attic/examples/sample-sp/view_session.php new file mode 100644 index 00000000..3a8252b3 --- /dev/null +++ b/php/Attic/examples/sample-sp/view_session.php @@ -0,0 +1,88 @@ +<?php +/* + * Service Provider Example -- Online User Viewer + * + * Copyright (C) 2004 Entr'ouvert + * http://lasso.entrouvert.org + * + * Authors: Christophe Nowicki <cnowicki@easter-eggs.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + require_once 'DB.php'; + + if (!file_exists('config.inc')) + { +?> +<p align='center'><b>Service Provider Configuration file is not available</b><br> +Please run the setup script :<br> +<a href='setup.php'>Lasso Service Provider Setup</a><br> +You can get more informations about <b>Lasso</b> at <br> +<a href='http://lasso.entrouvert.org/'>http://lasso.entrouvert.org/</a></p> +<?php + exit(); + } + $config = unserialize(file_get_contents('config.inc')); + + $db = &DB::connect($config['dsn']); + + if (DB::isError($db)) + die($db->getMessage()); + + $query = "SELECT * FROM sessions"; + + $res =& $db->query($query); + if (DB::isError($res)) + die($res->getMessage()); + + $numRows = $res->numRows(); +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> +<head> +<title>Lasso Service Provider Example : View Online Users</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" /> +</head> +<body> + +<p align='center'> +<table align='center' width='95%'> +<caption>Online Users</caption> +<thead> +<tr> + <td> </td> +</tr> +</thead> +<tbody> + +</tbody> +<tfoot> +<tr> + <td> </td> +</tr> +</tfoot> +</table> +</p> + +<br> +<p align='center'><a href='index.php'>Index</a> +</p> +<br> +<p align='center'>Copyright © 2004 Entr'ouvert</p> + +</body> +</html> |
