better-integrated the SSO Service Provider information by moving it onto a
Profile page
This commit is contained in:
parent
53dd5a6994
commit
835c9c389f
|
@ -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}');
|
||||
|
|
|
@ -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' ),
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
95
venice-data-sso/sp/scripts/sourceid/federations.js
Normal file
95
venice-data-sso/sp/scripts/sourceid/federations.js
Normal file
|
@ -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 <http://www.mozilla.org/MPL/>.
|
||||
//
|
||||
// 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 <erbo@silcom.com>,
|
||||
// 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
|
|
@ -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();
|
||||
|
|
|
@ -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 <http://www.mozilla.org/MPL/>.
|
||||
//
|
||||
// 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 <erbo@silcom.com>,
|
||||
// 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);
|
76
venice-data-sso/sp/velocity/sourceid/federations.vm
Normal file
76
venice-data-sso/sp/velocity/sourceid/federations.vm
Normal file
|
@ -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 <http://www.mozilla.org/MPL/>.
|
||||
|
||||
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 <erbo@silcom.com>,
|
||||
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" )
|
||||
<p><b>This site can use a federated identity from any of the following identity providers:</b></p>
|
||||
<div align="center"><table border="1">
|
||||
<tr>
|
||||
<th class="content"><b>Provider ID</b></th>
|
||||
<th class="content"><b>Logged in at:</b></th>
|
||||
<th class="content"><b>Session expires:</b></th>
|
||||
<th class="content"><b>Federated</b></th>
|
||||
<th class="content"> </th>
|
||||
</tr>
|
||||
#foreach( $p in $provider_data )
|
||||
#set( $ep = "#encodeURL( $p.provider )" )
|
||||
<tr>
|
||||
<td class="content">#encodeHTML( $p.provider )</td>
|
||||
<td class="content">
|
||||
#if( $p.logged_in )
|
||||
#formatDate( $p.login_time )
|
||||
#else
|
||||
|
||||
#end
|
||||
</td>
|
||||
<td class="content">
|
||||
#if( $p.logged_in && $p.expire_time )
|
||||
#formatDate( $p.expire_time )
|
||||
#else
|
||||
|
||||
#end
|
||||
</td>
|
||||
<td class="content">
|
||||
#if( $p.federated )
|
||||
<b>Yes</b>
|
||||
#else
|
||||
No
|
||||
#end
|
||||
</td>
|
||||
<td class="content">
|
||||
#if( $p.federated )
|
||||
<a href="#formatURL( "SERVLET" "sourceid/defederate.js.vs?provider=$ep&tgt=$et" )">#button( "IMAGE" "terminate" )</a>
|
||||
#else
|
||||
<a href="#formatURL( "SERVLET" "sourceid/federate.js.vs?provider=$ep&tgt=$et" )">#button( "IMAGE" "federate" )</a>
|
||||
#end
|
||||
#if( $p.logged_in )
|
||||
|
||||
<a href="#formatURL( "SERVLET" "sourceid/logout_sso.js.vs?provider=$ep&tgt=$et" )">#button( "IMAGE" "logout" )</a>
|
||||
#end
|
||||
</td>
|
||||
</tr>
|
||||
#end
|
||||
</table></div>
|
|
@ -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 <http://www.mozilla.org/MPL/>.
|
||||
|
||||
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 <erbo@silcom.com>,
|
||||
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 )
|
||||
<p>You are currently logged in.</p>
|
||||
<p>This Service Provider can interact with the following Identity Providers:</p>
|
||||
<table border="1">
|
||||
<tr>
|
||||
<td>ProviderID</td>
|
||||
<td>Authenticated?</td>
|
||||
<td>Federated?</td>
|
||||
</tr>
|
||||
#foreach( $p in $provider_data )
|
||||
#set( $ep = "#encodeURL( $p.provider )" )
|
||||
<tr>
|
||||
<td>$p.provider</td>
|
||||
<td>
|
||||
#if( $p.logged_in )
|
||||
Logged in at: #formatDate( $p.login_time )
|
||||
#if( $p.expire_time )
|
||||
<br />Session will expire at: #formatDate( $p.expire_time )
|
||||
#end
|
||||
<br />
|
||||
<a href="#formatURL( "SERVLET" "sourceid/logout_sso.js.vs?provider=$ep" )">Click here to log out.</a>
|
||||
#else
|
||||
Not logged in.
|
||||
#end
|
||||
</td>
|
||||
<td>
|
||||
#if( $p.federated )
|
||||
Federated.<br />
|
||||
<a href="#formatURL( "SERVLET" "sourceid/defederate.js.vs?provider=$ep" )">Click to terminate
|
||||
federation.</a>
|
||||
#else
|
||||
Not federated.<br />
|
||||
<a href="#formatURL( "SERVLET" "sourceid/federate.js.vs?provider=$ep" )">Click to federate.</a>
|
||||
#end
|
||||
</td>
|
||||
</tr>
|
||||
#end
|
||||
</table>
|
||||
#else
|
||||
<p>User not logged in.</p>
|
||||
#end
|
|
@ -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
|
||||
|
|
1
venice-web/images/buttons/classic/.gitignore
vendored
Normal file
1
venice-web/images/buttons/classic/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
.xvpics
|
BIN
venice-web/images/buttons/classic/federate.jpg
Normal file
BIN
venice-web/images/buttons/classic/federate.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
venice-web/images/buttons/classic/logout.jpg
Normal file
BIN
venice-web/images/buttons/classic/logout.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
BIN
venice-web/images/buttons/classic/terminate.jpg
Normal file
BIN
venice-web/images/buttons/classic/terminate.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
1
venice-web/images/buttons/gelcap/.gitignore
vendored
Normal file
1
venice-web/images/buttons/gelcap/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
.xvpics
|
BIN
venice-web/images/buttons/gelcap/federate.jpg
Normal file
BIN
venice-web/images/buttons/gelcap/federate.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
BIN
venice-web/images/buttons/gelcap/logout.jpg
Normal file
BIN
venice-web/images/buttons/gelcap/logout.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
BIN
venice-web/images/buttons/gelcap/terminate.jpg
Normal file
BIN
venice-web/images/buttons/gelcap/terminate.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
Loading…
Reference in New Issue
Block a user