Skip to content

Commit

Permalink
Require origin in messages channels for authentication
Browse files Browse the repository at this point in the history
  • Loading branch information
cjmalloy committed Jan 17, 2024
1 parent c68ee44 commit b999f33
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 8 deletions.
17 changes: 14 additions & 3 deletions src/main/java/jasper/component/MessagesImplStomp.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

import static jasper.domain.proj.HasOrigin.originHierarchy;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

@Profile("!no-websocket")
Expand All @@ -25,18 +26,28 @@ public class MessagesImplStomp implements Messages {
public void updateRef(Ref ref) {
// TODO: Debounce
var encodedUrl = URLEncoder.encode(ref.getUrl(), StandardCharsets.UTF_8);
stomp.convertAndSend("/topic/ref/" + (isNotBlank(ref.getOrigin()) ? ref.getOrigin() : "default") + "/" + encodedUrl, mapper.domainToUpdateDto(ref));
var origins = originHierarchy(ref.getOrigin());
for (var o : origins) {
var origin = isNotBlank(o) ? o : "default";
stomp.convertAndSend("/topic/ref/" + origin + "/" + encodedUrl, mapper.domainToUpdateDto(ref));
}
if (ref.getTags() != null){
ref.addHierarchicalTags();
for (var tag : ref.getTags()) {
var encodedTag = URLEncoder.encode(tag, StandardCharsets.UTF_8);
stomp.convertAndSend("/topic/tag/" + encodedTag, tag);
for (var o : origins) {
var origin = isNotBlank(o) ? o : "default";
stomp.convertAndSend("/topic/tag/" + origin + "/" + encodedTag, tag);
}
}
}
if (ref.getSources() != null)
for (var source : ref.getSources()) {
var encodedSource = URLEncoder.encode(source, StandardCharsets.UTF_8);
stomp.convertAndSend("/topic/response/" + encodedSource, ref.getUrl());
for (var o : origins) {
var origin = isNotBlank(o) ? o : "default";
stomp.convertAndSend("/topic/response/" + origin + "/" + encodedSource, ref.getUrl());
}
}
}
}
15 changes: 15 additions & 0 deletions src/main/java/jasper/domain/proj/HasOrigin.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package jasper.domain.proj;

import java.util.ArrayList;
import java.util.List;

import static org.apache.commons.lang3.StringUtils.isBlank;

public interface HasOrigin {
Expand Down Expand Up @@ -28,4 +31,16 @@ static String subOrigin(String local, String origin) {
if (origin.startsWith("@")) origin = origin.substring(1);
return local + '.' + origin;
}

static List<String> originHierarchy(String origin) {
if (isBlank(origin)) return List.of("");
var result = new ArrayList<String>();
result.add(origin);
while (origin.contains(".")) {
origin = origin.substring(0, origin.lastIndexOf("."));
result.add(origin);
}
result.add("");
return result;
}
}
15 changes: 10 additions & 5 deletions src/main/java/jasper/security/Auth.java
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,8 @@ public boolean local(String origin) {
* Is this origin a sub-origin.
*/
public boolean subOrigin(String origin) {
if (isBlank(origin)) return false;
if (isBlank(getOrigin())) return true;
if (local(origin)) return true;
return origin.startsWith(getOrigin()+".");
}

Expand All @@ -204,7 +204,6 @@ public boolean subOrigin(String origin) {
*/
public boolean tenantAccess(String origin) {
if (!props.isMultiTenant()) return true;
if (local(origin)) return true;
if (subOrigin(origin)) return true;
if (getClient().getTenantAccess() == null) return false;
for (var t : getClient().getTenantAccess()) {
Expand Down Expand Up @@ -320,9 +319,12 @@ public boolean canSubscribeTo(String destination) {
if (!minRole()) return false;
if (destination == null) return false;
if (destination.startsWith("/topic/tag/")) {
var tag = destination.substring("/topic/tag/".length());
var topic = destination.substring("/topic/ref/".length());
var origin = topic.substring(0, topic.indexOf('/'));
if (origin.equals("default")) origin = "";
var tag = topic.substring(topic.indexOf('/') + 1);
var decodedTag = URLDecoder.decode(tag, StandardCharsets.UTF_8);
return canReadTag(decodedTag);
return canReadTag(decodedTag + origin);
} else if (destination.startsWith("/topic/ref/")) {
var topic = destination.substring("/topic/ref/".length());
var origin = topic.substring(0, topic.indexOf('/'));
Expand All @@ -331,7 +333,10 @@ public boolean canSubscribeTo(String destination) {
var decodedUrl = URLDecoder.decode(url, StandardCharsets.UTF_8);
return canReadRef(decodedUrl, origin);
} else if (destination.startsWith("/topic/response/")) {
return true;
var topic = destination.substring("/topic/response/".length());
var origin = topic.substring(0, topic.indexOf('/'));
if (origin.equals("default")) origin = "";
return subOrigin(origin);
}
return false;
}
Expand Down

0 comments on commit b999f33

Please sign in to comment.