Skip to content

Commit ede8821

Browse files
author
James Leigh
committed
Fix #681: Encode server password in base64 over the network
Signed-off-by: James Leigh <james.leigh@ontotext.com>
1 parent 72a0146 commit ede8821

10 files changed

Lines changed: 82 additions & 15 deletions

File tree

core/http/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/AbstractServlet.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,14 @@ public abstract class AbstractServlet implements Servlet {
3838

3939
protected final Logger log = LoggerFactory.getLogger(this.getClass());
4040

41+
@Deprecated
4142
protected static final String SERVER_USER = "server-user";
4243

44+
@Deprecated
4345
protected static final String SERVER_PASSWORD = "server-password";
4446

47+
protected static final String SERVER_USER_PASSWORD = "server-user-password";
48+
4549
protected static final String ACCEPT = "Accept";
4650

4751
/**

core/http/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchGateway.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,8 @@ private void changeServer(final HttpServletRequest req, final HttpServletRespons
178178
// Valid server was submitted by form. Set cookie and redirect to
179179
// repository selection page.
180180
this.cookies.addNewCookie(req, resp, SERVER_COOKIE, server);
181-
final String user = getOptionalParameter(req, SERVER_USER);
182-
this.cookies.addNewCookie(req, resp, SERVER_USER, user);
183-
final String password = getOptionalParameter(req, SERVER_PASSWORD);
184-
this.cookies.addNewCookie(req, resp, SERVER_PASSWORD, password);
181+
final String user_password = getOptionalParameter(req, SERVER_USER_PASSWORD);
182+
this.cookies.addNewCookie(req, resp, SERVER_USER_PASSWORD, user_password);
185183
final StringBuilder uri = new StringBuilder(req.getRequestURI());
186184
uri.setLength(uri.length() - req.getPathInfo().length());
187185
resetCache();

core/http/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchServlet.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.net.MalformedURLException;
1414
import java.net.URL;
1515
import java.net.URLDecoder;
16+
import java.util.Base64;
1617
import java.util.concurrent.ConcurrentHashMap;
1718
import java.util.concurrent.ConcurrentMap;
1819

@@ -254,10 +255,21 @@ private void setCredentials(final HttpServletRequest req, final HttpServletRespo
254255
final RemoteRepositoryManager rrm = (RemoteRepositoryManager)manager;
255256
LOGGER.info("RemoteRepositoryManager URL: {}", rrm.getLocation());
256257
final CookieHandler cookies = new CookieHandler(config);
257-
final String user = cookies.getCookieNullIfEmpty(req, resp, WorkbenchGateway.SERVER_USER);
258-
final String password = cookies.getCookieNullIfEmpty(req, resp, WorkbenchGateway.SERVER_PASSWORD);
259-
LOGGER.info("Setting user '{}' and password '{}'.", user, password);
260-
rrm.setUsernameAndPassword(user, password);
258+
final String user_password = cookies.getCookieNullIfEmpty(req, resp, WorkbenchGateway.SERVER_USER_PASSWORD);
259+
if (user_password == null) {
260+
rrm.setUsernameAndPassword(null, null);
261+
} else {
262+
String decoded;
263+
try {
264+
decoded = new String(Base64.getDecoder().decode(user_password));
265+
} catch(IllegalArgumentException e) {
266+
decoded = user_password; // older browsers
267+
}
268+
final String user = decoded.substring(0, decoded.indexOf(':'));
269+
final String password = decoded.substring(decoded.indexOf(':')+1);
270+
LOGGER.info("Setting user '{}' and their password.", user);
271+
rrm.setUsernameAndPassword(user, password);
272+
}
261273
// initialize() required to push credentials to internal HTTP
262274
// client.
263275
rrm.initialize();

core/http/workbench/src/main/webapp/scripts/saved-queries.js

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/http/workbench/src/main/webapp/scripts/server.js

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/http/workbench/src/main/webapp/scripts/template.js

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/http/workbench/src/main/webapp/scripts/ts/saved-queries.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ module workbench {
1212
declare var YASQE: any;
1313

1414
export function deleteQuery(savedBy: string, name: string, urn: string) {
15-
var currentUser = workbench.getCookie("server-user");
15+
var encoded = workbench.getCookie("server-user-password");
16+
var decoded = encoded && window.atob ? window.atob(encoded) : encoded;
17+
var currentUser = decoded && decoded.substring(0, decoded.indexOf(':'));
1618
if ((!savedBy || currentUser == savedBy)) {
1719
if (confirm("'"
1820
+ name
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/// <reference path="template.ts" />
2+
/// <reference path="jquery.d.ts" />
3+
4+
// WARNING: Do not edit the *.js version of this file. Instead, always edit the
5+
// corresponding *.ts source in the ts subfolder, and then invoke the
6+
// compileTypescript.sh bash script to generate new *.js and *.js.map files.
7+
8+
/**
9+
* Invoked by the change server form in server.xsl.
10+
*/
11+
function changeServer(event) {
12+
event.preventDefault();
13+
var form = $(event.target).closest('form')[0];
14+
var user = $('#server-user').prop('value');
15+
var password = $('#server-password').prop('value');
16+
if (user && password) {
17+
var decoded = user + ':' + password;
18+
var encoded = window.btoa ? window.btoa(decoded) : decoded;
19+
$('#server-password').attr('name', 'server-user-password').prop('value', encoded);
20+
}
21+
form.submit();
22+
}

core/http/workbench/src/main/webapp/scripts/ts/template.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,10 @@ module workbench {
8888
workbench
8989
.addLoad(function() {
9090
document.getElementById('noscript-message').style.display = 'none';
91-
var user = workbench.getCookie('server-user');
92-
if (user.length == 0 || user == '""') {
91+
var encoded = workbench.getCookie("server-user-password");
92+
var decoded = encoded && window.atob ? window.atob(encoded) : encoded;
93+
var user = decoded && decoded.substring(0, decoded.indexOf(':'));
94+
if (!user || user == '""') {
9395
user = '<span class="disabled">None</span>';
9496
}
9597
var selectedUser = document.getElementById('selected-user');

core/http/workbench/src/main/webapp/transformations/server.xsl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<xsl:include href="template.xsl" />
1414

1515
<xsl:template match="sparql:sparql">
16-
<form action="server" method="post">
16+
<form action="server" method="post" onsubmit="changeServer(event)">
1717
<table class="dataentry">
1818
<tbody>
1919
<tr>
@@ -70,6 +70,8 @@
7070
</tbody>
7171
</table>
7272
</form>
73+
<script src="../../scripts/server.js" type="text/javascript">
74+
</script>
7375
</xsl:template>
7476

7577
</xsl:stylesheet>

0 commit comments

Comments
 (0)