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/webapp') 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.xml WAYFLogConfigPollFrequency 300000 - - - - - - - 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

+ + +

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 -->
+

@@ -186,7 +188,8 @@ Recently used institutions: - ?entityID=<%= java.net.URLEncoder.encode(ei.toString(), "utf-8") %>&return=<%= java.net.URLEncoder.encode(re.toString(), "utf-8") %>&returnIDxParam=<%= java.net.URLEncoder.encode( returnIDParam.toString(), "utf-8" ) %>&cache=perm&action=selection&origin="> + ?entityID=<%= java.net.URLEncoder.encode(ei.toString(), "utf-8") %>&return=<%= java.net.URLEncoder.encode(re.toString(), "utf-8") %>&returnIDxParam=<%= java.net.URLEncoder.encode( returnIDParam.toString(), "utf-8" ) %>&cache=perm&action=selection&origin=<%=java.net.URLEncoder.encode(((IdPSite)site).getName())%> +"> @@ -194,7 +197,7 @@ Recently used institutions: - ?target=<%= java.net.URLEncoder.encode(targ.toString(),"utf-8") %>&shire=<%= java.net.URLEncoder.encode(shire.toString(),"utf-8") %>&providerId=<%= java.net.URLEncoder.encode(pid.toString(),"utf-8") %>&time=&cache=perm&action=selection&origin="> + ?target=<%= java.net.URLEncoder.encode(targ.toString(),"utf-8") %>&shire=<%= java.net.URLEncoder.encode(shire.toString(),"utf-8") %>&providerId=<%= java.net.URLEncoder.encode(pid.toString(),"utf-8") %>&time=&cache=perm&action=selection&origin=<%=java.net.URLEncoder.encode(((IdPSite)site).getName())%> @@ -230,13 +233,54 @@ Recently used institutions: - + -

+ + + + or

@@ -412,6 +463,9 @@ Search by keyword:

+ + +

@@ -540,8 +594,55 @@ function changedFed(X, Selected) { --> - + + + + + + + + + + - \ No newline at end of file + diff --git a/src/main/webapp/wayferror.jsp b/src/main/webapp/wayferror.jsp old mode 100644 new mode 100755 index a0cb29d..1fd564a --- a/src/main/webapp/wayferror.jsp +++ b/src/main/webapp/wayferror.jsp @@ -25,12 +25,12 @@

Please email administrator's name and include the following error message:

-

WAYF failure at ()

+

Discovery Service failure at ()

-

The DiscoveryService should not be called directly

+

The Discovery Service should not be called directly

-- cgit v1.1