From 9740775f62dc4672f9fffeb73f7797fda71da7bf Mon Sep 17 00:00:00 2001
From: Olav Morken <olav.morken@uninett.no>
Date: Wed, 10 Feb 2010 13:04:00 +0000
Subject: [PATCH] openidProvider: Add XRDS support.

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@2169 44740490-163a-0410-bde0-09ae8108e29a
---
 modules/openidProvider/templates/user.tpl.php |  3 ++
 modules/openidProvider/www/user.php           |  7 +++
 modules/openidProvider/www/xrds.php           | 48 +++++++++++++++++++
 3 files changed, 58 insertions(+)
 create mode 100644 modules/openidProvider/www/xrds.php

diff --git a/modules/openidProvider/templates/user.tpl.php b/modules/openidProvider/templates/user.tpl.php
index 863062c6e..9e466e87a 100644
--- a/modules/openidProvider/templates/user.tpl.php
+++ b/modules/openidProvider/templates/user.tpl.php
@@ -8,6 +8,9 @@ $serverURL = $this->data['serverURL'];
 $trustedSites = $this->data['trustedSites'];
 $userId = $this->data['userId'];
 $userIdURL = $this->data['userIdURL'];
+$xrdsURL = $this->data['xrdsURL'];
+
+header('X-XRDS-Location: ' . $xrdsURL);
 
 if ($userId !== FALSE) {
 	$title = $this->t('{openidProvider:openidProvider:title_user}', array('%USERID%' => htmlspecialchars($userId)));
diff --git a/modules/openidProvider/www/user.php b/modules/openidProvider/www/user.php
index 2ae930b44..696476286 100644
--- a/modules/openidProvider/www/user.php
+++ b/modules/openidProvider/www/user.php
@@ -50,6 +50,11 @@ if ($ownPage) {
 
 $userBase = SimpleSAML_Module::getModuleURL('openidProvider/user.php');
 
+$xrds = SimpleSAML_Module::getModuleURL('openidProvider/xrds.php');
+if ($userId !== FALSE) {
+	$xrds = SimpleSAML_Utilities::addURLparameter($xrds, array('user' => $userId));
+}
+
 $as = $server->getAuthSource();
 $t = new SimpleSAML_XHTML_Template($globalConfig, 'openidProvider:user.tpl.php');
 $t->data['identity'] = $identity;
@@ -61,5 +66,7 @@ $t->data['serverURL'] = $server->getServerURL();
 $t->data['trustedSites'] = $trustedSites;
 $t->data['userId'] = $userId;
 $t->data['userIdURL'] = $userBase . '/' . $userId;
+$t->data['xrdsURL'] = $xrds;
+
 $t->show();
 exit(0);
diff --git a/modules/openidProvider/www/xrds.php b/modules/openidProvider/www/xrds.php
new file mode 100644
index 000000000..f36bfc3e4
--- /dev/null
+++ b/modules/openidProvider/www/xrds.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * This endpoint returns an XRDS document describing this server.
+ *
+ * @package simpleSAMLphp
+ * @version $Id$
+ */
+
+if (isset($_REQUEST['user'])) {
+	$user = (string)$_REQUEST['user'];
+	$serviceTypes = array(
+		'http://specs.openid.net/auth/2.0/signon',
+		'http://openid.net/server/1.0',
+		'http://openid.net/server/1.1',
+	);
+} else {
+	$user = NULL;
+	$serviceTypes = array(
+		'http://specs.openid.net/auth/2.0/server',
+	);
+}
+
+$server = sspmod_openidProvider_Server::getInstance();
+
+$serverURL = $server->getServerURL();
+
+header('Content-Type: application/xrds+xml');
+
+echo('<?xml version="1.0" encoding="UTF-8"?>' . "\n");
+echo('<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">');
+echo('<XRD>');
+echo('<Service priority="0">');
+
+foreach ($serviceTypes as $t) {
+	echo('<Type>' . htmlspecialchars($t) . '</Type>');
+}
+
+echo('<URI>' . htmlspecialchars($serverURL) . '</URI>');
+
+if ($user !== NULL) {
+	$localId = SimpleSAML_Module::getModuleURL('openidProvider/user.php') . '/' . $user;
+	echo('<LocalID>' . htmlspecialchars($localId) . '</LocalID>');
+}
+
+echo('</Service>');
+echo('</XRD>');
+echo('</xrds:XRDS>');
-- 
GitLab