Skip to content

Commit

Permalink
begin using credentials manager
Browse files Browse the repository at this point in the history
  • Loading branch information
daykin committed Nov 27, 2024
1 parent bbb2582 commit edf4749
Show file tree
Hide file tree
Showing 19 changed files with 194 additions and 115 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import javafx.stage.Stage;
import org.csstudio.display.builder.runtime.RuntimeUtil;
import org.phoebus.applications.uxanalytics.monitor.backend.BackendConnection;
import org.phoebus.applications.uxanalytics.monitor.backend.database.BackendConnection;
import org.phoebus.applications.uxanalytics.monitor.backend.database.MongoDBConnection;
import org.phoebus.applications.uxanalytics.monitor.backend.database.Neo4JConnection;
import org.phoebus.applications.uxanalytics.monitor.representation.ActiveWindowsService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class UXAToolkitListener implements ToolkitListener {

private ActiveTab tabWrapper;
private final UXAMonitor monitor = UXAMonitor.getInstance();
void setTabWrapper(ActiveTab tabWrapper){
public void setTabWrapper(ActiveTab tabWrapper){
this.tabWrapper = tabWrapper;
}

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.phoebus.applications.uxanalytics.monitor.backend;
package org.phoebus.applications.uxanalytics.monitor.backend.database;

import org.csstudio.display.builder.model.Widget;
import org.csstudio.display.builder.model.properties.ActionInfo;
Expand All @@ -11,15 +11,14 @@
public interface BackendConnection {
public Boolean connect(String hostOrRegion, Integer port, String usernameOrAccessKey, String passwordOrSecretKey);
public default String getProtocol(){return "";}
public default String getDefaultHost(){return "localhost";}
public default String getDefaultPort(){return "";}
public default String getHost(){return "localhost";}
public default String getPort(){return "";}
public default String getDefaultUsername(){return "";}
public default Integer tearDown(){return -1;}
public default void setImageClient(ImageClient imageClient){}
public default void handleClick(ActiveTab who, Widget widget, Integer x, Integer y){}
public default void handleClick(ActiveTab who, Integer x, Integer y){this.handleClick(who, null, x, y);}
public default void handleAction(ActiveTab who, Widget widget, ActionInfo info){}
public default void handleDisplayOpen(ActiveTab who, Widget widget, DisplayInfo targetDisplayInfo){};
public default void handlePVWrite(ActiveTab who, Widget widget, String PVName, String value){};
public default void handleDisplayOpen(DisplayInfo target, DisplayInfo src, ResourceOpenSources how){};
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoCredential;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
Expand All @@ -22,12 +23,14 @@
import org.bson.Document;
import org.bson.UuidRepresentation;
import org.csstudio.display.builder.runtime.app.DisplayRuntimeInstance;
import org.phoebus.applications.uxanalytics.monitor.backend.BackendConnection;
import org.phoebus.applications.uxanalytics.monitor.backend.image.FilesystemImageClient;
import org.phoebus.applications.uxanalytics.monitor.backend.image.S3ImageClient;
import org.phoebus.applications.uxanalytics.monitor.util.FileUtils;
import org.phoebus.applications.uxanalytics.monitor.backend.image.ImageClient;
import org.phoebus.applications.uxanalytics.monitor.backend.image.MongoDBImageClient;
import org.phoebus.applications.uxanalytics.monitor.UXAMonitor;
import org.phoebus.applications.uxanalytics.monitor.representation.ActiveTab;
import org.phoebus.framework.preferences.PhoebusPreferenceService;

public class MongoDBConnection implements BackendConnection {

Expand All @@ -39,6 +42,24 @@ public class MongoDBConnection implements BackendConnection {
private MongoDatabase database = null;
private ImageClient imageClient = null;

static final String COLLECTION = PhoebusPreferenceService
.userNodeForClass(MongoDBConnection.class)
.get("click-collection","clicks");

static final String DATABASE = PhoebusPreferenceService
.userNodeForClass(MongoDBConnection.class)
.get("database","phoebus-analytics");

public static MongoDBConnection instance;
public static MongoDBConnection getInstance(){
if(instance == null){
instance = new MongoDBConnection();
}
return instance;
}

private MongoDBConnection(){}

@Override
public Boolean connect(String hostname, Integer port, String username, String password) {
String uri;
Expand All @@ -52,8 +73,21 @@ public Boolean connect(String hostname, Integer port, String username, String pa
.uuidRepresentation(UuidRepresentation.STANDARD)
.build();
mongoClient = MongoClients.create(settings);
database = mongoClient.getDatabase("phoebus-analytics");
database.createCollection("clicks");
database = mongoClient.getDatabase(DATABASE);
database.createCollection(COLLECTION);
switch(PhoebusPreferenceService.userNodeForClass(MongoDBConnection.class).get("image-provider","mongodb"))
{
case "filesystem":
this.setImageClient(FilesystemImageClient.getInstance());
break;
case "s3":
this.setImageClient(S3ImageClient.getInstance());
break;
case "mongodb":
default:
this.setImageClient(MongoDBImageClient.getInstance());

}
UXAMonitor.getInstance().notifyConnectionChange(this);
return true;
} catch (Exception ex) {
Expand All @@ -68,8 +102,13 @@ public String getProtocol() {
}

@Override
public String getDefaultPort() {
return "27017";
public String getHost(){
return PhoebusPreferenceService.userNodeForClass(this.getClass()).get("host", "localhost");
}

@Override
public String getPort() {
return PhoebusPreferenceService.userNodeForClass(this.getClass()).get("port", "27017");
}

public Integer connect(String host, String port, String user, String password, ImageClient imageClient) {
Expand Down Expand Up @@ -103,6 +142,7 @@ static BufferedImage getSnapshot(ActiveTab who) {

@Override
public void handleClick(ActiveTab who, Integer x, Integer y) {
//if another image client hasn't been set up yet, default to a collection in the MongoDB database
if(database != null && imageClient == null){
imageClient = MongoDBImageClient.getInstance();
((MongoDBImageClient) imageClient).connect(mongoClient);
Expand Down Expand Up @@ -132,7 +172,7 @@ public void handleClick(ActiveTab who, Integer x, Integer y) {
.append("path", path)
.append("time", Instant.now().getEpochSecond());
try {
database.getCollection("clicks").insertOne(clickEvent);
database.getCollection(COLLECTION).insertOne(clickEvent);
} catch (Exception ex) {
logger.log(Level.WARNING, "Failed to write click event to MongoDB", ex);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
import org.csstudio.display.builder.model.util.ModelResourceUtil;
import org.csstudio.display.builder.runtime.app.DisplayInfo;
import org.neo4j.driver.*;
import org.phoebus.applications.uxanalytics.monitor.backend.BackendConnection;
import org.phoebus.applications.uxanalytics.monitor.util.FileUtils;
import org.phoebus.applications.uxanalytics.monitor.util.ResourceOpenSources;
import org.phoebus.applications.uxanalytics.monitor.representation.ActiveTab;
import org.phoebus.framework.preferences.PhoebusPreferenceService;

import java.time.Instant;
import java.util.Map;
Expand Down Expand Up @@ -40,8 +40,18 @@ public class Neo4JConnection implements BackendConnection {

public static final String PROTOCOL = "neo4j://";

public static Neo4JConnection instance;
public static Neo4JConnection getInstance(){
if(instance == null){
instance = new Neo4JConnection();
}
return instance;
}

private Session session;

private Neo4JConnection(){}

@Override
public Boolean connect(String host, Integer port, String username, String password) {
try {
Expand All @@ -50,7 +60,9 @@ public Boolean connect(String host, Integer port, String username, String passwo
logger.log(Level.INFO, "Connected to " + host + " on port " + port + " as " + username);
session = driver.session(
SessionConfig.builder()
.withDatabase("neo4j")
.withDatabase(
PhoebusPreferenceService.userNodeForClass(FileUtils.class)
.get("database", "neo4j"))
.build());
return true;
} catch (Exception ex) {
Expand All @@ -65,8 +77,13 @@ public String getProtocol() {
}

@Override
public String getDefaultPort() {
return "7687";
public String getHost(){
return PhoebusPreferenceService.userNodeForClass(this.getClass()).get("host", "localhost");
}

@Override
public String getPort() {
return PhoebusPreferenceService.userNodeForClass(this.getClass()).get("port", "7687");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import org.csstudio.display.builder.model.Widget;
import org.csstudio.display.builder.model.properties.ActionInfo;
import org.phoebus.applications.uxanalytics.monitor.backend.BackendConnection;
import org.phoebus.applications.uxanalytics.monitor.representation.ActiveTab;

import java.util.logging.Level;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.phoebus.applications.uxanalytics.monitor.backend.database.authentication;

import org.phoebus.applications.uxanalytics.monitor.backend.database.MongoDBConnection;
import org.phoebus.security.authorization.ServiceAuthenticationProvider;
import org.phoebus.security.tokens.AuthenticationScope;

public class MongoDBAuthenticationProvider implements ServiceAuthenticationProvider {

@Override
public void authenticate(String username, String password) {
MongoDBConnection connection = MongoDBConnection.getInstance();
MongoDBConnection.getInstance().connect(connection.getHost(), Integer.parseInt(connection.getPort()), username, password);

}

@Override
public void logout(String token) {

}

@Override
public AuthenticationScope getAuthenticationScope() {
return AuthenticationScope.MONGODB;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package org.phoebus.applications.uxanalytics.monitor.backend.authentication;
package org.phoebus.applications.uxanalytics.monitor.backend.database.authentication;

import org.phoebus.security.authorization.ServiceAuthenticationProvider;
import org.phoebus.security.tokens.AuthenticationScope;

public class Neo4JAuthenticationProvider implements ServiceAuthenticationProvider {


@Override
public void authenticate(String username, String password) {

Expand All @@ -16,6 +18,6 @@ public void logout(String token) {

@Override
public AuthenticationScope getAuthenticationScope() {
return null;
return AuthenticationScope.NEO4J;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@ public class FilesystemImageClient implements ImageClient {
//Filesystem location to store images
private String imageLocation;

public static FilesystemImageClient instance;
public static FilesystemImageClient getInstance(){
if(instance == null){
instance = new FilesystemImageClient();
}
return instance;
}

private FilesystemImageClient(){}

@Override
public Integer uploadImage(URI image, BufferedImage screenshot) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@
public interface ImageClient {
public Integer uploadImage(URI image, BufferedImage screenshot);
public boolean imageExists(URI image);
public default void connect(String username, String password){}
public default void disconnect(){}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,30 @@
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.phoebus.applications.uxanalytics.monitor.backend.database.MongoDBConnection;
import org.phoebus.framework.preferences.PhoebusPreferenceService;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.util.Base64;

/*
* MongoDBImageClient is intended to be invoked from the MongoDBConnection class,
* if a different @ImageClient (S3, filesystem, etc.) is not specified.
*/
public class MongoDBImageClient implements ImageClient{

static MongoDBImageClient instance;
MongoDatabase database = null;
static final String COLLECTION = PhoebusPreferenceService
.userNodeForClass(MongoDBConnection.class)
.get("image-collection","images");

static final String DATABASE = PhoebusPreferenceService
.userNodeForClass(MongoDBConnection.class)
.get("database","phoebus-analytics");

private MongoDBImageClient(){
}
Expand All @@ -26,12 +39,12 @@ public static MongoDBImageClient getInstance(){
}

public void connect(MongoClient client){
database = client.getDatabase("phoebus-analytics");
database.createCollection("images");
database = client.getDatabase(DATABASE);
database.createCollection(COLLECTION);
}

public boolean imageExists(URI image){
return database.getCollection("images")
return database.getCollection(COLLECTION)
.find(new Document("name", image.toString()))
.first() != null;
}
Expand All @@ -51,7 +64,7 @@ public Integer uploadImage(URI name, BufferedImage screenshot) {
.append("width", screenshot.getWidth())
.append("height", screenshot.getHeight())
.append("image", base64Blob);
database.getCollection("images").insertOne(imageDoc);
database.getCollection(COLLECTION).insertOne(imageDoc);
return 0;
}
catch (Exception e) {
Expand Down
Loading

0 comments on commit edf4749

Please sign in to comment.