From b5c41b83249677bf1dec46de4a7ce97fee55729e Mon Sep 17 00:00:00 2001
From: Leif Johansson
Date: Thu, 3 Nov 2011 10:53:40 +0100
Subject: import 1.1.3
---
src/main/webapp/Suggest.js | 362 ++++++++++++++++++++++++++
src/main/webapp/WEB-INF/tlds/struts-bean.tld | 0
src/main/webapp/WEB-INF/tlds/struts-logic.tld | 0
src/main/webapp/WEB-INF/web.xml | 97 ++++---
src/main/webapp/images/incommon.gif | Bin
src/main/webapp/images/internet2.gif | Bin
src/main/webapp/images/logo.jpg | Bin
src/main/webapp/index.htm | 0
src/main/webapp/static.html | 163 ++++++++++++
src/main/webapp/static2.html | 160 ++++++++++++
src/main/webapp/wayf.css | 18 ++
src/main/webapp/wayf.jsp | 125 ++++++++-
src/main/webapp/wayferror.jsp | 4 +-
13 files changed, 864 insertions(+), 65 deletions(-)
create mode 100755 src/main/webapp/Suggest.js
mode change 100644 => 100755 src/main/webapp/WEB-INF/tlds/struts-bean.tld
mode change 100644 => 100755 src/main/webapp/WEB-INF/tlds/struts-logic.tld
mode change 100644 => 100755 src/main/webapp/WEB-INF/web.xml
mode change 100644 => 100755 src/main/webapp/images/incommon.gif
mode change 100644 => 100755 src/main/webapp/images/internet2.gif
mode change 100644 => 100755 src/main/webapp/images/logo.jpg
mode change 100644 => 100755 src/main/webapp/index.htm
create mode 100755 src/main/webapp/static.html
create mode 100755 src/main/webapp/static2.html
mode change 100644 => 100755 src/main/webapp/wayf.css
mode change 100644 => 100755 src/main/webapp/wayf.jsp
mode change 100644 => 100755 src/main/webapp/wayferror.jsp
(limited to 'src/main')
diff --git a/src/main/webapp/Suggest.js b/src/main/webapp/Suggest.js
new file mode 100755
index 0000000..537064b
--- /dev/null
+++ b/src/main/webapp/Suggest.js
@@ -0,0 +1,362 @@
+function TypeAheadControl(list, box, orig, submit, optype, ie6hack)
+{
+ //
+ // Squirrel away the parameters we were given
+ //
+ this.elementList = list;
+ this.textBox = box;
+ this.origin = orig;
+ this.submit = submit;
+ this.optype = optype;
+ this.results = 0;
+ //
+ // Change these as needed
+ //
+ this.maxResults = 10; // How many to show
+ this.alwaysShowResult = true; // Show dropdown even if there are more that ,axResult results
+ this.ie6hack = ie6hack;
+ var myThis = this;
+
+ //
+ // Setup the lowercase names
+ //
+ var i = 0;
+ while (i < list.length) {
+ if (null == list[i]) {
+ list.length = i;
+ break;
+ }
+ list[i][2] = list[i][0].toLowerCase();
+ i++;
+ }
+ //
+ // Set up the 'dropDown'
+ //
+ this.dropDown = document.createElement('div');
+ this.dropDown.className = 'dropdown';
+ this.dropDown.style.visibility = 'hidden';
+ this.dropDown.style.width = box.offsetWidth;
+ this.dropDown.current = -1;
+ document.body.appendChild(this.dropDown);
+
+ //
+ // mouse listeners for the dropdown box
+ //
+ this.dropDown.onmouseover = function(event) {
+ if (!event) {
+ event = window.event;
+ }
+ target = event.target;
+ if (!target) {
+ target = event.srcElement;
+ }
+ myThis.select(target);
+ }
+
+ this.dropDown.onmousedown = function(event) {
+ if (-1 != myThis.dropDown.current) {
+ myThis.textBox.value = myThis.results[myThis.dropDown.current][0];
+ }
+ }
+
+ //
+ // Add the listeners to the text box
+ //
+ this.textBox.onkeyup = function(event) {
+ //
+ // get window even if needed (because of browser oddities)
+ //
+ if (!event) {
+ event = window.event;
+ }
+ myThis.handleKeyUp(event);
+ };
+
+ this.textBox.onkeydown = function(event) {
+ if (!event) {
+ event = window.event;
+ }
+
+ myThis.handleKeyDown(event);
+ };
+
+ this.textBox.onblur = function() {
+ myThis.hideDrop();
+ };
+
+ this.textBox.onfocus = function() {
+ myThis.handleChange();
+ };
+
+};
+//
+// Given a name return the first maxresults, or all possibles
+//
+TypeAheadControl.prototype.getPossible = function(name) {
+ var possibles = [];
+ var inIndex = 0;
+ var outIndex = 0;
+ name = name.toLowerCase();
+ var strIndex = 0;
+ var str;
+ var ostr;
+
+ while (outIndex <= this.maxResults && inIndex < this.elementList.length) {
+ strIndex = this.elementList[inIndex][2].indexOf(name);
+ if (-1 != strIndex) {
+ //
+ // a hit
+ //
+ str = this.elementList[inIndex][0];
+ possibles[outIndex] = new Array(str, this.elementList[inIndex][1]);
+ outIndex ++;
+ } else {
+ //
+ // Check entityId
+ strIndex = this.elementList[inIndex][1].indexOf(name);
+ if (-1 != strIndex) {
+ //
+ // a hit
+ //
+ str = this.elementList[inIndex][0];
+ possibles[outIndex] = new Array(str, this.elementList[inIndex][1]);
+ outIndex ++;
+ }
+ }
+ inIndex ++;
+ }
+ //
+ // reset the cursor to the top
+ //
+ this.dropDown.current = -1;
+
+ return possibles;
+};
+
+TypeAheadControl.prototype.handleKeyUp = function(event) {
+ var key = event.keyCode;
+
+ if (27 == key) {
+ //
+ // Escape - clear
+ //
+ this.textBox.value = '';
+ this.handleChange();
+ } else if (8 == key || 32 == key || (key >= 46 && key < 112) || key > 123) {
+ //
+ // Backspace, Space and >=Del to F12
+ //
+ this.handleChange();
+ }
+};
+
+TypeAheadControl.prototype.handleKeyDown = function(event) {
+
+ var key = event.keyCode;
+
+ if (38 == key) {
+ //
+ // up arrow
+ //
+ this.upSelect();
+
+ } else if (40 == key) {
+ //
+ // down arrow
+ //
+ this.downSelect();
+ }
+};
+
+TypeAheadControl.prototype.hideDrop = function() {
+ var i = 0;
+ if (null != this.ie6hack) {
+ while (i < this.ie6hack.length) {
+ this.ie6hack[i].style.visibility = 'visible';
+ i++;
+ }
+ }
+ this.dropDown.style.visibility = 'hidden';
+ if (-1 == this.dropDown.current) {
+ this.doUnselected();
+ }
+};
+
+TypeAheadControl.prototype.showDrop = function() {
+ var i = 0;
+ if (null != this.ie6hack) {
+ while (i < this.ie6hack.length) {
+ this.ie6hack[i].style.visibility = 'hidden';
+ i++;
+ }
+ }
+ this.dropDown.style.visibility = 'visible';
+};
+
+
+TypeAheadControl.prototype.doSelected = function() {
+ this.submit.value='Select';
+ this.optype.value = 'selection';
+};
+
+TypeAheadControl.prototype.doUnselected = function() {
+ this.submit.value='Search';
+
+ this.optype.value = 'search';
+};
+
+TypeAheadControl.prototype.handleChange = function() {
+
+ var val = this.textBox.value;
+ var res = this.getPossible(val);
+
+ if (0 == val.length ||
+ 0 == res.length ||
+ (!this.alwaysShowResult && this.maxResults < res.length)) {
+ this.hideDrop();
+ this.doUnselected();
+ this.results = [];
+ this.dropDown.current = -1;
+ } else {
+ this.results = res;
+ this.populateDropDown(res);
+ if (1 == res.length) {
+ this.select(this.dropDown.childNodes[0]);
+ this.doSelected();
+ } else {
+ this.doUnselected();
+ }
+ }
+};
+
+//
+// A lot of the stuff below comes from
+// http://www.webreference.com/programming/javascript/ncz/column2
+//
+// With thanks to Nicholas C Zakas
+//
+TypeAheadControl.prototype.populateDropDown = function(list) {
+ this.dropDown.innerHTML = '';
+ var i = 0;
+ var div;
+ while (i < list.length) {
+ div = document.createElement('div');
+ div.appendChild(document.createTextNode(list[i][0]));
+// div.style.zIndex = '1000';
+ this.dropDown.appendChild(div);
+ i++;
+ }
+ var off = this.getXY();
+ this.dropDown.style.left = off[0] + 'px';
+ this.dropDown.style.top = off[1] + 'px';
+ this.showDrop();
+};
+
+TypeAheadControl.prototype.getXY = function() {
+
+ var node = this.textBox;
+ var sumX = 0;
+ var sumY = node.offsetHeight;
+
+ while(node.tagName != 'BODY') {
+ sumX += node.offsetLeft;
+ sumY += node.offsetTop;
+ node = node.offsetParent;
+ }
+ //
+ // And add in the offset for the Body
+ //
+ sumX += node.offsetLeft;
+ sumY += node.offsetTop;
+
+ return [sumX, sumY];
+};
+
+TypeAheadControl.prototype.select = function(selected) {
+ var i = 0;
+ var node;
+ this.dropDown.current = -1;
+ this.doUnselected();
+ while (i < this.dropDown.childNodes.length) {
+ node = this.dropDown.childNodes[i];
+ if (node == selected) {
+ //
+ // Highlight it
+ //
+ node.className = 'current';
+ //
+ // turn on the button
+ //
+ this.doSelected();
+ //
+ // setup the cursor
+ //
+ this.dropDown.current = i;
+ //
+ // and the value for the Server
+ //
+ this.origin.value = this.results[i][1];
+ this.origin.textValue = this.results[i][0];
+ } else {
+ node.className = '';
+ }
+ i++;
+ }
+ this.textBox.focus();
+};
+
+TypeAheadControl.prototype.downSelect = function() {
+ if (this.results.length > 0) {
+
+ if (-1 == this.dropDown.current) {
+ //
+ // mimic a select()
+ //
+ this.dropDown.current = 0;
+ this.dropDown.childNodes[0].className = 'current';
+ this.doSelected();
+ this.origin.value = this.results[0][1];
+ this.origin.textValue = this.results[0][0];
+
+ } else if (this.dropDown.current < (this.results.length-1)) {
+ //
+ // turn off highlight
+ //
+ this.dropDown.childNodes[this.dropDown.current].className = '';
+ //
+ // move cursor
+ //
+ this.dropDown.current++;
+ //
+ // and 'select'
+ //
+ this.dropDown.childNodes[this.dropDown.current].className = 'current';
+ this.doSelected();
+ this.origin.value = this.results[this.dropDown.current][1];
+ this.origin.textValue = this.results[this.dropDown.current][0];
+ }
+ }
+};
+
+
+TypeAheadControl.prototype.upSelect = function() {
+ if ((this.results.length > 0) &&
+ (this.dropDown.current > 0)) {
+
+ //
+ // turn off highlight
+ //
+ this.dropDown.childNodes[this.dropDown.current].className = '';
+ //
+ // move cursor
+ //
+ this.dropDown.current--;
+ //
+ // and 'select'
+ //
+ this.dropDown.childNodes[this.dropDown.current].className = 'current';
+ this.doSelected();
+ this.origin.value = this.results[this.dropDown.current][1];
+ this.origin.textValue = this.results[this.dropDown.current][0];
+ }
+};
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/tlds/struts-bean.tld b/src/main/webapp/WEB-INF/tlds/struts-bean.tld
old mode 100644
new mode 100755
diff --git a/src/main/webapp/WEB-INF/tlds/struts-logic.tld b/src/main/webapp/WEB-INF/tlds/struts-logic.tld
old mode 100644
new mode 100755
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
old mode 100644
new mode 100755
index c938b16..ef5f00e
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -1,55 +1,50 @@
-
-
-
-
-
-
-
- WAYF
- Shibboleth WAYF Service
- edu.internet2.middleware.shibboleth.wayf.WayfService
-
- WAYFConfigFileLocation
- $DS_HOME$/conf/wayfconfig.xml
-
-
- WAYFLogConfig
- $DS_HOME$/conf/logging.xml
+
+
+
+
+ WAYF
+ Shibboleth WAYF Service
+ edu.internet2.middleware.shibboleth.wayf.WayfService
+
+ WAYFConfigFileLocation
+ $DS_HOME$/conf/wayfconfig.xml
+
+
+ WAYFLogConfig
+ $DS_HOME$/conf/logging.xmlWAYFLogConfigPollFrequency300000
-
-
-
-
-
-
- WAYF
- /WAYF
-
-
-
- WAYF
- *.wayf
-
-
-
- WAYF
- /DS
-
-
-
- WAYF
- *.ds
-
-
-
- css
- text/css
-
-
+
+
+
+
+
+
+ WAYF
+ /WAYF
+
+
+
+ WAYF
+ *.wayf
+
+
+
+ WAYF
+ /DS
+
+
+
+ WAYF
+ *.ds
+
+
+
+ css
+ text/css
+
+
diff --git a/src/main/webapp/images/incommon.gif b/src/main/webapp/images/incommon.gif
old mode 100644
new mode 100755
diff --git a/src/main/webapp/images/internet2.gif b/src/main/webapp/images/internet2.gif
old mode 100644
new mode 100755
diff --git a/src/main/webapp/images/logo.jpg b/src/main/webapp/images/logo.jpg
old mode 100644
new mode 100755
diff --git a/src/main/webapp/index.htm b/src/main/webapp/index.htm
old mode 100644
new mode 100755
diff --git a/src/main/webapp/static.html b/src/main/webapp/static.html
new file mode 100755
index 0000000..c35b8a3
--- /dev/null
+++ b/src/main/webapp/static.html
@@ -0,0 +1,163 @@
+
+
+
+Static Discovery Service with centralised hinting
+
+
+This is a boring, but static web page which shows how an signle SP can
+configure their own "Discovery Service" without recouse to a Java
+Container but taking full advantage of the centralised cookie server
+in the Federation Discovery Service.
+
+
This is not meant to be pretty - it is meant to be easy for SP's
+(who understand HTML) to understand and develop. It is however
+targetted at a single SP. Sites running multiple SPs and wanting a
+single Discovery will still need to deploy a real DS, or deploy this
+as an embedded wayf on each SP.
+
+
+There is obviously plenty of room for adding all the visual sugar and
+branding that we want at the three levels
+
+
A World Wide "This is a Discovery" look and feel
+
A Federation branding
+
"Corporate" Branding
+
+
+
Just for fun, this Discovery service points to the I2Wiki, a Shib 2
+SP (and so with an easier configuration). To make things even more
+fun it has access to metadata (mostly statically loaded) for 6
+Federations. (UK, InCommon, MAMS, Switch AcoNet and Renater)
+
+
+
+
+
+
Enter Organization Name
+
+
+
+
+
+
Configuring
+
+Details on how to set this up this are embedded as comments in this
+web page. Currently a lot of the configuration is manual. Future
+versions will be as automatic as possible and the only configuration
+required will be the link which is displayed when there is not
+javascript enabled.
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/static2.html b/src/main/webapp/static2.html
new file mode 100755
index 0000000..470b099
--- /dev/null
+++ b/src/main/webapp/static2.html
@@ -0,0 +1,160 @@
+
+
+
+Static Discovery Service with centralised hinting
+
+
+This is a boring, but static web page which shows how an signle SP can
+configure their own "Discovery Service" without recouse to a Java
+Container but taking full advantage of the centralised cookie server
+in the Federation Discovery Service.
+
+
+This DS points at a test SP in the UK Federation, and uses the
+Shib/SAML1 protocol. It is a lot harder to configure (a lot like
+setting up one a "WAYFless URLS". Consider it motivation to upgrade
+from SAML1 to SAML2...
+
+
+
+
+
+
Enter Organization Name
+
+
+
+
+
+
+
Configuring
+
+Details on how to set this up this are embedded as comments in this
+web page. Currently a lot of the configuration is manual. Although
+it would be feasible to automate this just as is planned for Shib2
+SPs, the duplication seems needless given that the product has a 9
+month shelf life.
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/wayf.css b/src/main/webapp/wayf.css
old mode 100644
new mode 100755
index 4056aa3..0eeb26c
--- a/src/main/webapp/wayf.css
+++ b/src/main/webapp/wayf.css
@@ -102,3 +102,21 @@ span.warning {
text-align: center;
margin-top: 1.5em;
}
+
+div.dropdown {
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid black;
+ position: absolute;
+}
+
+div.dropdown div {
+ background-color: white;
+ cursor: default;
+ padding: 0px 3px;
+}
+
+div.dropdown div.current {
+ background-color: #3366cc;
+ color: white;
+}
diff --git a/src/main/webapp/wayf.jsp b/src/main/webapp/wayf.jsp
old mode 100644
new mode 100755
index 74ba11d..12d72da
--- a/src/main/webapp/wayf.jsp
+++ b/src/main/webapp/wayf.jsp
@@ -2,6 +2,7 @@
<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ page language="java" import="java.util.*,edu.internet2.middleware.shibboleth.wayf.*,java.lang.*" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
@@ -123,6 +124,7 @@
10 - Recently used sites hyperlinks
20 -
+ 25 - AutoSuggestion
30 Federation selection
40 IdP within Selection
50 Select button
@@ -158,15 +160,14 @@ Select an identity provider
The Service you are trying to reach requires that you
-authenticate with your home institution, please select it from the
-list below.
+authenticate with your home organization, enter the name below.
-Recently used institutions:
+Recently used organizations:
@@ -178,6 +179,7 @@ Recently used institutions:
simulating the user having specified a permanent cookie -->
+