From 835c9c389f12e14d8795f9b34e88bbac679030ae Mon Sep 17 00:00:00 2001 From: "Eric J. Bowersox" Date: Tue, 17 Jun 2003 04:46:53 +0000 Subject: [PATCH] better-integrated the SSO Service Provider information by moving it onto a Profile page --- conf-sso/extra-db-mysql.sql | 8 ++ conf/venice-db-init-mysql.sql | 6 ++ .../sp/scripts/sourceid/defederate.js | 12 ++- .../sp/scripts/sourceid/federate.js | 12 ++- .../sp/scripts/sourceid/federations.js | 95 ++++++++++++++++++ .../sp/scripts/sourceid/logout_sso.js | 8 +- venice-data-sso/sp/scripts/top.js | 72 ------------- .../sp/velocity/sourceid/federations.vm | 76 ++++++++++++++ venice-data-sso/sp/velocity/sourceid/top.vm | 59 ----------- venice-data/scripts/profile.js | 3 +- venice-web/images/buttons/classic/.gitignore | 1 + .../images/buttons/classic/federate.jpg | Bin 0 -> 1868 bytes venice-web/images/buttons/classic/logout.jpg | Bin 0 -> 1932 bytes .../images/buttons/classic/terminate.jpg | Bin 0 -> 1877 bytes venice-web/images/buttons/gelcap/.gitignore | 1 + venice-web/images/buttons/gelcap/federate.jpg | Bin 0 -> 2224 bytes venice-web/images/buttons/gelcap/logout.jpg | Bin 0 -> 2112 bytes .../images/buttons/gelcap/terminate.jpg | Bin 0 -> 1967 bytes 18 files changed, 214 insertions(+), 139 deletions(-) create mode 100644 venice-data-sso/sp/scripts/sourceid/federations.js delete mode 100644 venice-data-sso/sp/scripts/top.js create mode 100644 venice-data-sso/sp/velocity/sourceid/federations.vm delete mode 100644 venice-data-sso/sp/velocity/sourceid/top.vm create mode 100644 venice-web/images/buttons/classic/.gitignore create mode 100644 venice-web/images/buttons/classic/federate.jpg create mode 100644 venice-web/images/buttons/classic/logout.jpg create mode 100644 venice-web/images/buttons/classic/terminate.jpg create mode 100644 venice-web/images/buttons/gelcap/.gitignore create mode 100644 venice-web/images/buttons/gelcap/federate.jpg create mode 100644 venice-web/images/buttons/gelcap/logout.jpg create mode 100644 venice-web/images/buttons/gelcap/terminate.jpg diff --git a/conf-sso/extra-db-mysql.sql b/conf-sso/extra-db-mysql.sql index 831f84f..69d150b 100644 --- a/conf-sso/extra-db-mysql.sql +++ b/conf-sso/extra-db-mysql.sql @@ -31,3 +31,11 @@ CREATE TABLE sso_federate ( UNIQUE INDEX by_local (provider, local_name), UNIQUE INDEX by_remote (provider, remote_name) ); + +############################################################################## +# Table Additions +############################################################################## + +# Add the "Identity Federations" menu item to the profile menu. +INSERT INTO menuitems (menuid, sequence, itemtype, text, linktype, link) VALUES + (2, 100, 'TEXT', 'Identity Federations', 'SERVLET', 'sourceid/federations.js.vs?tgt=${target}'); diff --git a/conf/venice-db-init-mysql.sql b/conf/venice-db-init-mysql.sql index 1bb0278..ed379a5 100644 --- a/conf/venice-db-init-mysql.sql +++ b/conf/venice-db-init-mysql.sql @@ -574,12 +574,16 @@ INSERT INTO globalprop (nsid, prop_name, prop_value) VALUES (6, 'bnc.configure', '!Configure' ), (6, 'bn.create', '!create.jpg' ), (6, 'bnc.create', '!Create' ), + (6, 'bn.federate', '!federate.jpg' ), + (6, 'bnc.federate', '!Federate' ), (6, 'bn.i.accept', '!user_accept.jpg' ), (6, 'bnc.i.accept', '!I Accept' ), (6, 'bn.i.decline', '!user_decline.jpg' ), (6, 'bnc.i.decline', '!I Decline' ), (6, 'bn.login', '!login.jpg' ), (6, 'bnc.login', '!Log In' ), + (6, 'bn.logout', '!logout.jpg' ), + (6, 'bnc.logout', '!Log Out' ), (6, 'bn.next', '!arrow_next.jpg' ), (6, 'bnc.next', '!Next' ), (6, 'bn.ok', '!ok.jpg' ), @@ -596,6 +600,8 @@ INSERT INTO globalprop (nsid, prop_name, prop_value) VALUES (6, 'bnc.send.email', '!Send E-Mail' ), (6, 'bn.set', '!set.jpg' ), (6, 'bnc.set', '!Set' ), + (6, 'bn.terminate', '!terminate.jpg' ), + (6, 'bnc.terminate', '!Terminate' ), (6, 'bn.update', '!update.jpg' ), (6, 'bnc.update', '!Update' ), (6, 'user.agreement.title', '!Venice User Agreement' ), diff --git a/venice-data-sso/sp/scripts/sourceid/defederate.js b/venice-data-sso/sp/scripts/sourceid/defederate.js index 1787426..07e4403 100644 --- a/venice-data-sso/sp/scripts/sourceid/defederate.js +++ b/venice-data-sso/sp/scripts/sourceid/defederate.js @@ -20,21 +20,27 @@ importPackage(Packages.com.silverwrist.dynamo.util); req = bsf.lookupBean("request"); // get request rhelp = bsf.lookupBean("request_help"); // get request helper session = rhelp.session; +target = req_help.getParameterString("tgt"); +if (target==null) + target = "top.js.vs"; +vlib.setOnError(req,target); // Make sure we're logged in. user = vlib.getUser(session); if (user.isAnonymous()) dynamo.scriptReturn(new Redirect("SERVLET","top.js.vs")); +return_URL = "sourceid/federations.js.vs?tgt=" + stringutils.encodeURL(target); + // Make sure a provider ID is provided. provider = rhelp.getParameterString("provider"); if (provider==null) - dynamo.scriptReturn(new Redirect("SERVLET","top.js.vs")); + dynamo.scriptReturn(new Redirect("SERVLET",return_URL)); // Create a defederation request. rc = new ForwardToPath("/sso/fedterm"); rc.setParameter("ProviderID",provider); rc.setParameter("UserID",user); // pass our user object to SourceID -rc.setParameter("Return.Success","/top.js.vs"); -rc.setParameter("Return.Failure","/top.js.vs"); +rc.setParameter("Return.Success","/" + return_URL); +rc.setParameter("Return.Failure","/" + return_URL); dynamo.scriptReturn(rc); diff --git a/venice-data-sso/sp/scripts/sourceid/federate.js b/venice-data-sso/sp/scripts/sourceid/federate.js index 79cf7a9..e2cf406 100644 --- a/venice-data-sso/sp/scripts/sourceid/federate.js +++ b/venice-data-sso/sp/scripts/sourceid/federate.js @@ -20,16 +20,22 @@ importPackage(Packages.com.silverwrist.dynamo.util); req = bsf.lookupBean("request"); // get request rhelp = bsf.lookupBean("request_help"); // get request helper session = rhelp.session; +target = req_help.getParameterString("tgt"); +if (target==null) + target = "top.js.vs"; +vlib.setOnError(req,target); // Make sure we're logged in. user = vlib.getUser(session); if (user.isAnonymous()) dynamo.scriptReturn(new Redirect("SERVLET","top.js.vs")); +return_URL = "sourceid/federations.js.vs?tgt=" + stringutils.encodeURL(target); + // Make sure a provider ID is provided. provider = rhelp.getParameterString("provider"); if (provider==null) - dynamo.scriptReturn(new Redirect("SERVLET","top.js.vs")); + dynamo.scriptReturn(new Redirect("SERVLET",return_URL)); // Create an Authenticate + Federate request and send it off. rc = new ForwardToPath("/sso/authnRequest"); @@ -38,6 +44,6 @@ rc.setParameter("IsPassive",cast.booleanObject(false)); rc.setParameter("ForceAuthn",cast.booleanObject(false)); rc.setParameter("Federate",cast.booleanObject(true)); rc.setParameter("UserID",user); // pass our user object to SourceID -rc.setParameter("Return.Success","/top.js.vs"); -rc.setParameter("Return.Failure","/top.js.vs"); +rc.setParameter("Return.Success","/" + return_URL); +rc.setParameter("Return.Failure","/" + return_URL); dynamo.scriptReturn(rc); diff --git a/venice-data-sso/sp/scripts/sourceid/federations.js b/venice-data-sso/sp/scripts/sourceid/federations.js new file mode 100644 index 0000000..0ff68c7 --- /dev/null +++ b/venice-data-sso/sp/scripts/sourceid/federations.js @@ -0,0 +1,95 @@ +// The contents of this file are subject to the Mozilla Public License Version 1.1 +// (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at . +// +// Software distributed under the License is distributed on an "AS IS" basis, WITHOUT +// WARRANTY OF ANY KIND, either express or implied. See the License for the specific +// language governing rights and limitations under the License. +// +// The Original Code is the Venice Web Communities System. +// +// The Initial Developer of the Original Code is Eric J. Bowersox , +// for Silverwrist Design Studios. Portions created by Eric J. Bowersox are +// Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. +// +// Contributor(s): + +importPackage(java.util); +importPackage(Packages.org.sourceid.sso.util); +importPackage(Packages.org.sourceid.sso.xml); +importPackage(Packages.org.sourceid.sso.xml.lib); +importClass(Packages.com.silverwrist.dynamo.Namespaces); +importPackage(Packages.com.silverwrist.dynamo.iface); +importPackage(Packages.com.silverwrist.dynamo.util); +importClass(Packages.com.silverwrist.venice.VeniceNamespaces); +importPackage(Packages.com.silverwrist.venice.content); +importPackage(Packages.com.silverwrist.venice.frame); + +req = bsf.lookupBean("request"); +req_help = bsf.lookupBean("request_help"); +target = req_help.getParameterString("tgt"); +if (target==null) + target = "top.js.vs"; +vlib.setOnError(req,target); +user = vlib.getUser(req); + +// Check the user account. +user = vlib.getUser(req); +if (user.isAnonymous()) +{ // user not logged in, must log in first - so bounce us to the login dialog + new_target = "sourceid/federations.js.vs?tgt=" + stringutils.encodeURL(target); + dynamo.scriptReturn(new Redirect("SERVLET","login.js.vs?tgt=" + stringutils.encodeURL(new_target))); + +} // end if + +// Load the profile menu. +mprov = vcast.queryMenuProvider(req_help.getRequestObject(Namespaces.DYNAMO_OBJECT_NAMESPACE,"venice-menus")); +menu = mprov.getInlineMenu(user,VeniceNamespaces.USER_PROFILE_NAMESPACE,"user.profile.menu",cast.newIntArray(0)); +if (menu.getItemCount()>1) +{ // set up the menu properly + menu.setVariable("target",stringutils.encodeURL(target)); + ndx = menu.getItemContainingLinkText("sourceid/federations.js.vs"); + menu.setSelectedIndex(ndx); + +} // end if +else // don't display the menu + menu = null; + +// Create the return value. +rc = new VelocityView("Identity Federations","sourceid/federations.vm"); +rc.setParameter("target",target); +if (menu!=null) + rc.setParameter("menu",menu); + +// Get the list of identity providers and a bunch of information about them. +pdir = sourceid.getProviderDirectory(req); +it = pdir.getIDPList().iterator(); +plist = new ArrayList(); +while (it.hasNext()) +{ // get each identity provider in turn + map = new HashMap(); + idp = sourceid.castIDPDescriptorType(it.next()); + map.put("provider",idp.providerID); + sps = sourceid.getSessionInfoForProvider(req,idp.providerID); + if (sps!=null) + { // we're logged into this session - get the attributes of it + map.put("logged_in",cast.booleanObject(true)); + astmt = sps.getAuthenticationStatement(); + map.put("login_time",astmt.getAuthenticationInstant()); + ex_time = astmt.getReauthenticateOnOrAfter(); + if (ex_time!=null) + map.put("expire_time",ex_time); + + } // end if + else // not logged in + map.put("logged_in",cast.booleanObject(false)); + + map.put("federated",cast.booleanObject(sourceid.isUserFederatedWith(req,idp.providerID))); + + plist.add(map); // add to provider list + +} // end while + +rc.setParameter("provider_data",plist); + +dynamo.scriptOutput(rc); // all done diff --git a/venice-data-sso/sp/scripts/sourceid/logout_sso.js b/venice-data-sso/sp/scripts/sourceid/logout_sso.js index 93dce81..4245de0 100644 --- a/venice-data-sso/sp/scripts/sourceid/logout_sso.js +++ b/venice-data-sso/sp/scripts/sourceid/logout_sso.js @@ -20,16 +20,22 @@ importPackage(Packages.com.silverwrist.dynamo.util); req = bsf.lookupBean("request"); // get request rhelp = bsf.lookupBean("request_help"); // get request helper session = rhelp.session; +target = req_help.getParameterString("tgt"); +if (target==null) + target = "top.js.vs"; +vlib.setOnError(req,target); // Make sure we're logged in. user = vlib.getUser(session); if (user.isAnonymous()) dynamo.scriptReturn(new Redirect("SERVLET","top.js.vs")); +return_URL = "sourceid/federations.js.vs?tgt=" + stringutils.encodeURL(target); + // Make sure a provider ID is provided. provider = rhelp.getParameterString("provider"); if (provider==null) - dynamo.scriptReturn(new Redirect("SERVLET","top.js.vs")); + dynamo.scriptReturn(new Redirect("SERVLET",return_URL)); // Log out locally first. session.detach(); diff --git a/venice-data-sso/sp/scripts/top.js b/venice-data-sso/sp/scripts/top.js deleted file mode 100644 index 1e4c931..0000000 --- a/venice-data-sso/sp/scripts/top.js +++ /dev/null @@ -1,72 +0,0 @@ -// The contents of this file are subject to the Mozilla Public License Version 1.1 -// (the "License"); you may not use this file except in compliance with the License. -// You may obtain a copy of the License at . -// -// Software distributed under the License is distributed on an "AS IS" basis, WITHOUT -// WARRANTY OF ANY KIND, either express or implied. See the License for the specific -// language governing rights and limitations under the License. -// -// The Original Code is the Venice Web Communities System. -// -// The Initial Developer of the Original Code is Eric J. Bowersox , -// for Silverwrist Design Studios. Portions created by Eric J. Bowersox are -// Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. -// -// Contributor(s): - -importPackage(java.util); -importPackage(Packages.org.sourceid.sso.util); -importPackage(Packages.org.sourceid.sso.xml); -importPackage(Packages.org.sourceid.sso.xml.lib); -importPackage(Packages.com.silverwrist.dynamo.iface); -importPackage(Packages.com.silverwrist.dynamo.util); -importClass(Packages.com.silverwrist.venice.VeniceNamespaces); -importPackage(Packages.com.silverwrist.venice.content); -importPackage(Packages.com.silverwrist.venice.frame); - -req = bsf.lookupBean("request"); -req_help = bsf.lookupBean("request_help"); -user = vlib.getUser(req); - -// N.B. THIS IS ALL TEMPORARY - -// Create the return value. -rc = new VelocityView("Temporary SourceID Top Page","sourceid/top.vm"); -logged_in = !(user.isAnonymous()); -rc.setParameter("logged_in",cast.booleanObject(logged_in)); - -if (logged_in) -{ // Get the list of identity providers and a bunch of information about them. - pdir = sourceid.getProviderDirectory(req); - it = pdir.getIDPList().iterator(); - plist = new ArrayList(); - while (it.hasNext()) - { // get each identity provider in turn - map = new HashMap(); - idp = sourceid.castIDPDescriptorType(it.next()); - map.put("provider",idp.providerID); - sps = sourceid.getSessionInfoForProvider(req,idp.providerID); - if (sps!=null) - { // we're logged into this session - get the attributes of it - map.put("logged_in",cast.booleanObject(true)); - astmt = sps.getAuthenticationStatement(); - map.put("login_time",astmt.getAuthenticationInstant()); - ex_time = astmt.getReauthenticateOnOrAfter(); - if (ex_time!=null) - map.put("expire_time",ex_time); - - } // end if - else // not logged in - map.put("logged_in",cast.booleanObject(false)); - - map.put("federated",cast.booleanObject(sourceid.isUserFederatedWith(req,idp.providerID))); - - plist.add(map); // add to provider list - - } // end while - - rc.setParameter("provider_data",plist); - -} // end if - -dynamo.scriptReturn(rc); diff --git a/venice-data-sso/sp/velocity/sourceid/federations.vm b/venice-data-sso/sp/velocity/sourceid/federations.vm new file mode 100644 index 0000000..52c251d --- /dev/null +++ b/venice-data-sso/sp/velocity/sourceid/federations.vm @@ -0,0 +1,76 @@ +#* + The contents of this file are subject to the Mozilla Public License Version 1.1 + (the "License"); you may not use this file except in compliance with the License. + You may obtain a copy of the License at . + + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + WARRANTY OF ANY KIND, either express or implied. See the License for the specific + language governing rights and limitations under the License. + + The Original Code is the Venice Web Communities System. + + The Initial Developer of the Original Code is Eric J. Bowersox , + for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + + Contributor(s): +*# +#* + Parameters: + menu = Menu to display along the top (may be null) + provider_data = List of identity provider data. + target = Target page attribute. +*# +#set( $et = "#encodeURL( $target )" ) +#if( $menu ) + #render( $menu ) +#end +#header1( "Identity Federations" ) +

This site can use a federated identity from any of the following identity providers:

+
+ + + + + + + + #foreach( $p in $provider_data ) + #set( $ep = "#encodeURL( $p.provider )" ) + + + + + + + + #end +
Provider IDLogged in at:Session expires:Federated 
#encodeHTML( $p.provider ) + #if( $p.logged_in ) + #formatDate( $p.login_time ) + #else +   + #end + + #if( $p.logged_in && $p.expire_time ) + #formatDate( $p.expire_time ) + #else +   + #end + + #if( $p.federated ) + Yes + #else + No + #end + + #if( $p.federated ) +#button( "IMAGE" "terminate" ) + #else +#button( "IMAGE" "federate" ) + #end + #if( $p.logged_in ) +   +#button( "IMAGE" "logout" ) + #end +
diff --git a/venice-data-sso/sp/velocity/sourceid/top.vm b/venice-data-sso/sp/velocity/sourceid/top.vm deleted file mode 100644 index c5bc734..0000000 --- a/venice-data-sso/sp/velocity/sourceid/top.vm +++ /dev/null @@ -1,59 +0,0 @@ -#* - The contents of this file are subject to the Mozilla Public License Version 1.1 - (the "License"); you may not use this file except in compliance with the License. - You may obtain a copy of the License at . - - Software distributed under the License is distributed on an "AS IS" basis, WITHOUT - WARRANTY OF ANY KIND, either express or implied. See the License for the specific - language governing rights and limitations under the License. - - The Original Code is the Venice Web Communities System. - - The Initial Developer of the Original Code is Eric J. Bowersox , - for Silverwrist Design Studios. Portions created by Eric J. Bowersox are - Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. - - Contributor(s): -*# -#header1( "Temporary Top Page" ) -#if( $logged_in ) -

You are currently logged in.

-

This Service Provider can interact with the following Identity Providers:

- - - - - - - #foreach( $p in $provider_data ) - #set( $ep = "#encodeURL( $p.provider )" ) - - - - - - #end -
ProviderIDAuthenticated?Federated?
$p.provider - #if( $p.logged_in ) - Logged in at: #formatDate( $p.login_time ) - #if( $p.expire_time ) -
Session will expire at: #formatDate( $p.expire_time ) - #end -
- Click here to log out. - #else - Not logged in. - #end -
- #if( $p.federated ) - Federated.
- Click to terminate - federation. - #else - Not federated.
- Click to federate. - #end -
-#else -

User not logged in.

-#end diff --git a/venice-data/scripts/profile.js b/venice-data/scripts/profile.js index cfc8724..5adf65b 100644 --- a/venice-data/scripts/profile.js +++ b/venice-data/scripts/profile.js @@ -54,7 +54,8 @@ menu = mprov.getInlineMenu(user,VeniceNamespaces.USER_PROFILE_NAMESPACE,"user.pr if (menu.getItemCount()>1) { // set up the menu properly menu.setVariable("target",stringutils.encodeURL(target)); - menu.setSelectedIndex(0); + ndx = menu.getItemContainingLinkText("profile.js.vs"); + menu.setSelectedIndex(ndx); } // end if else // don't display the menu diff --git a/venice-web/images/buttons/classic/.gitignore b/venice-web/images/buttons/classic/.gitignore new file mode 100644 index 0000000..5c165d9 --- /dev/null +++ b/venice-web/images/buttons/classic/.gitignore @@ -0,0 +1 @@ +.xvpics diff --git a/venice-web/images/buttons/classic/federate.jpg b/venice-web/images/buttons/classic/federate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe068f750704dc54bf2f2c0f9df2e0cc21f93cc6 GIT binary patch literal 1868 zcmbu3dpy$%AIE>&%*>IQYiW;r93JJk3@bxA8zz@c9Ys2iTWEz*bB#^$Jmfk~9Er(E z?qg!+cF3(z9hc^QPp+ehPL1r*^ZaxEKcDZP@6YG``ijOxbASv1Z;uB+AP``8c!1~t zP&yat=XJ}^S1mm7R)E@t06#Tbdq)@1ByjFq?Qi9qaAYcd-3WfiVgTP`?h&U2}sT-b^kSEH@DQHpP z#wK2L4b2m{S|fDW-OQqAgM!2D@o!EL^eC2LG06WLphJX& z%BmXza%YKNln>%C4NW5(lDw98X3?Q<0+51$4u6Iq0V{xW!}QeZDDz%oyQJgkT3>eT z)y%b$HJz+kEfr&WMRD*-n=@Bc&v2u_r}&N2em!P6g;KWpf)js*WZ7%ER2Z~Wg`#%! z9%NQ{ciaU?=5u1Dg0Wjx1#u*780)+16Go3$?q#6$%m8x3f#Rt1sWVm<31^Sx%0;g) z1#!%3OgHq!^RYMojhN&-{cLS#f3T6pe}OXDU5nhh`#MjMJ|h-=TYl^b{KU_lW75+` z4~kjmg(|(53>K_9uf6-6wCC_IwXtE&b^guzIbQd#c}0!cX0NExNl|-W8&7I`OgK@q zsGlBV(&k4vF>J-nIacU!@zD~ro=thYZk21hVD}R<#<|N8;#C{`5ArKd3gYo9Utw4W zTVpzjU5|gJ9xg7aotkqrbz(dE%EDaBqe+Eo4|@0O65>Z0^kk1V;nX8XgXTa=p1W>H zN*FAvEZ_&>KH))YBI<|v`{y;7iI~odXrG45D$H%&2eN8(%r4r+Mo=G-r_a_OVMAr@ zQ9(4qP-wz*at0SRq_jZZKOb6Nhp=_S@xFkWHWPFP#!ID|_NOZ;3Mt%K?dlJok%i5~ z3Yd@y6uw80<`nD7vD#%BvD@?y{=l-brfiQ>bi+NVyyefdS%*BOh(DFQSYz5Av~%9BR2BT+h&r_xp~p$U3gQHkOfCKHhbQdUgGCwV)2+w~1RcGvA&q z7Xe+rcowj4{?o?`*Gn4UEX=D6a3AC}PjT;f?p)cZ!t>tU9(vTo)&1?+wZTfcaZEWw zO77tl&%kLXk`j0AeOgQTu<@JAsIBkwlq0(kMV3zp7v;x)qN+`ed$+oos-Nwr%r=Ne{jxusE}`FGm8IP!TfVt<1`lzeu$2 zV~_{vuGw|DKW%7vSAU75AH!vDwa#V+&Dz=RU1ky;tq~00xPSuZ`9087*wk7|qCr`g zos7o``_u?#tV*X^Vtq*1k~5~qk``}L$Sx8AHBWTPptj?ikvhVi9^;;}(y>aLmyE)t zU?;=ZF;zEweJmS=N9-K>q?0urV8k8ixu~hD(+1Bkj}xb|Vt(5UADV~&@jjWhwHQ|^ zH}I7%43a_>^RjTcBscADJy@TMj{3#t^mkG+h?w2C;ny7|UOgPvUZg>-Q8C`;s$Z~_ z*-@6V3Hf@I`M69@1}dr6slTK&ZZ=)6KFpG;?166Lhn)E^o6J4=Bdval_ZfbSXpHO} znNu|$6;kKOxlO_Ao;FO!eh^L4TF$T+paJ{N)@Q!nF$oy-LENkFcZg{ZD(pH?Y1y5l zt6vkNA4DOnq_xQn`whQr8B#h56jB^&w$dU(qWoF!W1ART72C7KQY2QI39e1T+tSQc zI?bK3v6cjR@Mk*Pc$4X( G@&5vq-!IAl literal 0 HcmV?d00001 diff --git a/venice-web/images/buttons/classic/logout.jpg b/venice-web/images/buttons/classic/logout.jpg new file mode 100644 index 0000000000000000000000000000000000000000..05bd295f08cfd4f3316a75310da20c7007aef80b GIT binary patch literal 1932 zcmbu4X*k=77RLWc#8w?*r-@pk8pVjMsL=8dF(P(j?I2o$qNt@(GM1^%6^XTXicr+3 zilIc+DAf_ms5NS;Mo51lS7< z@V@{GHa9~8<3fn431M-es_vm7s#qM}nLi8Id|mrT`U?3+fUjkK7XT9l6ai-lNF4yf zKoA&+|A$}(Ac80UUm~Jn!h*y?3IIU_0zrkKr~l4DU?C_(7zT)_iK4H#NXyD0V`Pj1 zDPr=5wv7tv8kz>ivFY@R=Fx3ITUh{w2>d@m!9v0iQ87WL2Lr%h5Eu#pL!tl8L12gw z3@Q!CsG+Y2yTk;36p>Xoa76}H2v{?K1Oy~F7y<*VfYt~Ty|u~mjI1tk{G~=>)13hN z)}wW;d>&H8kWyC}_3i~>Dz{K^pMW0awU+sm?6OTc2SneOdZ@F(jK=HS{&1{{eheR| zB2E4FLzgVo6r^pDh{)wK26O#3x@RMmTneo15f0SFZ#vpf(33U22u7K8dCs8NQ1Wr` zkW=(Gm@HuJ)tjm4llJ7)IH3&2R^JCWXmroCI_wZWgp4 zj;@a!nhz|D*D`y~2@Lis{%H;7doCwp z-T0Sqm)CL*c_Xs-u)6ovnjBf4)AV2|K0xs4c)(INH?H?i*GzT(5v7T9i&bY&`PXY? zUyK*;Nk%!!FgSz1mbX7-EzK$TE{ju6k%aA6GLqXND|p;{EN`||Mt336{%rFXdO2hU zZpYrHI^A*Wwc2}8y*t z2#=hJFhoQYRg0!+L{7-+A?McSxJfAo-JCwtzk*>|+IJNEluIKoxpZ2$`;CRKfBY^$ zDYD@ln`soelRcK^Q+N)?Bq`@4w7BZ(DH)45+>(BS^GuCT~*f z6uA2A0vxT6Q@#efs7v7nM76)(neZ}J-rl?}q0!3}Ii0F!#>w{6fjZ8I%#<|Q>g?Vd?4Q$EejoGP+?t(lku zZIirTl|lB=U2jdoPtJ_o)E>1Z6^3cIIFod-ZXEKd@bS;_cDE6Ad!(c zxk@A~E4HVdtfsMfjbdvISmNkkVk{W#hmbyA|AdmnRkyn|RhC1(^7iFpOxBgtq($Bw z!HjL0_M;J_se%vuR;|?r#ZK=eX&vsf4cWE7PCc>i&tuF*IiZKhZ&(Ish96n@Y2Hry z!@J`k&YhQAA`3AkiNgx5O_gn0mvCFRKlKvIRbtcswYO9nI?)>X{L#I9S~KSto$kCg z6O^;%+U1f=FL4o?{$vnGZ;Imi;b;)ajyG4O4bMam~Ua zavh3R=4Z>uv5cjeO3bE!$@ z&rt@2b6mfWy*s|^#$c@q4&aGC-}g}jvVW+-XfQVl>-BE<4qnWhZ$~=!1eobg-!{Mo z=$l1ryzam?a^0`IBN%&DNB8i}nSs zix%?BPU!8_(th49ZwUR;usDlGw>N}cD>W=5DhE1f9Y@4aQ^-c4<5JF<&QipF2*#^V zh%wCvETRW@O)htH7x%l?7FuO9%ho|+RT3Q2&3PP+H@VLT-X{&2O(>mJi_%lUp-Qq` zC*gZ2YvNQP%C_FQpi2BN*Mf(Dy-@y?3_C~JGMS#OAgN`i;`NGhjCrx!b1C*&Mw%?R OZSw==!z|(%fBHYnvOg67 literal 0 HcmV?d00001 diff --git a/venice-web/images/buttons/classic/terminate.jpg b/venice-web/images/buttons/classic/terminate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4b7a4e51a4b81c92cd79b0cc8a6efbc27ddecfa GIT binary patch literal 1877 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 literal 0 HcmV?d00001 diff --git a/venice-web/images/buttons/gelcap/terminate.jpg b/venice-web/images/buttons/gelcap/terminate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b068a4786e06cceb9c128ee8c3e21b47a4277782 GIT binary patch literal 1967 zcmbu4c|6pK8^^yhvomHiW@nt`*k%S3a-Zu+m|{$F45pA{+8NCZR*ogdR)`!qa*wN| zolpsth}^cNR>?Vx6iUJ{ww7|tvcG-3_VxRFKhIy!>-l`%&+~}JL~j5z+1B0`0D(XN zX{P|uHXug~WzfPIbZjImoQZW~GO%{`$DKtJ0CCs$pR^14Pk`O9s2#w-fxUn;1cV2` z7!U*l5_JQL000IJ83 zxvK-xGI$#oT3B3udB<=_l5i)e00KbJ|DyuCNijHLXJ~}kZD0^66!Fj2zo{4iCMJo~ zvv#3LN#peglx;#nS6r!d#?|cdp|_%O00{x@+zr71hk>sX(`y+{r?UyyXU0atOcL;f ztgQ1iiY0)eq%vev79)dEu6Z`-IXu=H0xu+HQOz|!m*_jxXWlcFQ)y=Y5I2}yO>VBy zcfN&@QaRnp;Up)++M(dWPB5+?($IWIn3-Gjd$w_;%}<>E$^rK^{;zDh%TWOLT)8o; zhp;)rS6E$sBbOsFBkmUN#puX6Aui5JPR>er`DA90w!Cqn|7~?8ZT%KiyiYR0s+4JG z=0<%Iargzd-d49lOm}4YX!|6|sy2@#;?N!-d`*mOcQI;u2kJvFWwC_@^!|B$%pPPc_%gyjdaR+0I7w+^vS z)fW3GP~WanKbt+UzUkv++uP}tTXC$}BkFr}fbmU(#y?7l8nv}XF%9x_C+@YsQ%ot* z(9z-qUuGgp^{4iAba@GR*M6e|{W{G02sIY@_PD$Y+v>jixe>_~VMgI77dt7~+K|@V zD+3`{7A;>@*{@D$X;5SaxCX}YL-OGTU8AT&R;{(2V=b<#bAiT#agK9~uM%%RL?D9A z*m>(!UM877Q(tTbzveG(2_6>DhBce#j*l#&9DfgCucR*($Yc!nl8z!LdtGbyI-inq zF@nlirGlh!-7Q?T)V`)^!QdPv3i^pao32XmAY}~l;H1K_=Ra!Rpw}jhD{sS;{oH)A z?>Edd5>&!0-CjAC{Dhx11`e76cI+GmckI$pdD(GMM=goz!KOZW+_AQl?9yX80VsZV6)r&=O zZ7B{?Nn^yW=6h4W7W1a`Z=w9Ee zWM5xv**9w$^ z(PKXo!E}~NJ7hqH(SJHxwHSeDEOEnG?P;r`Z-yMpPdm#{9>@DROpAfh#^3oofjnJO z5&?&_Gz8lCsEn3X-Pb8sEM{0xS@npyF9z`?m0VRcMy~<=Ui*#p!epfq?SuQx%i`H? zk`%{FEN=-beo?$}!^o?Z;(Y>(RoR$u+&ihLz#6S}h4y^Tk@vD%T!qSV)#e3LTSrslm)Px>|unJ<+h zotUkP=N+%Ptq%#Zotm?QdHc7v6F&Xxt}}M*eJ_zlJ`X;ezOnYLaI_{}-g%*IH|6Ae zmksw&8yEDh$JA}AuW#q4gqvo649-#Z@-AWry0}m@@PP885kNu&oE1#98wpM(B(bPY zImHh&z;BSmuQ+U`+U0Xeo#tW_4egdnoq)U{>tbHXGfHm2ug5ekj{#v5eGR f?}9+bU%rAgsQQ_y>{d{g9A$;!=DsYxAmaT61f4Ix literal 0 HcmV?d00001