summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Bauer2017-09-08 16:54:59 +0200
committerJonathan Bauer2017-09-08 16:54:59 +0200
commitc0cbc1b3cb20b6c86d917394bdffe9c15a74a54d (patch)
tree8343a06ad4c8f3d08c03d685b6c2456dcabf8d5b
parent[netshare] minor layout optimizations (diff)
downloadtutor-module-c0cbc1b3cb20b6c86d917394bdffe9c15a74a54d.tar.gz
tutor-module-c0cbc1b3cb20b6c86d917394bdffe9c15a74a54d.tar.xz
tutor-module-c0cbc1b3cb20b6c86d917394bdffe9c15a74a54d.zip
[client/server] support for mountpoint/displayname
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/NetshareConfigurator.java137
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/NetshareTable.java25
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java30
3 files changed, 128 insertions, 64 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/NetshareConfigurator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/NetshareConfigurator.java
index 54aacdeb..5ae805db 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/NetshareConfigurator.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/NetshareConfigurator.java
@@ -38,7 +38,7 @@ import org.openslx.dozmod.gui.helper.GridManager;
import org.openslx.dozmod.util.FormatHelper;
/**
- * Widget for netrules configuration of lectures
+ * Widget for network share configuration of lectures
*/
public class NetshareConfigurator extends NetshareConfiguratorLayout {
@@ -46,8 +46,13 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout {
private final static Logger LOGGER = Logger.getLogger(NetshareConfigurator.class);
private List<NetShare> tblNetshareData = null;
+ // mount points / win drive letters - ideally, we would check whether the image is linux or windows based
+ // and either show a drive selection list like this one, or a textfield for a user-defined mount point...
+ private Character[] mountPoints = { 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
public NetshareConfigurator() {
+
super();
+
tblNetshare.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
@@ -55,6 +60,38 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout {
}
});
+ tblNetshare.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+ NetShare item = tblNetshare.getSelectedItem();
+ // ugly block-wise sets, but only one test needed compared to
+ // doing lots of item != null ? ... : ...
+ if (item != null) {
+ // share from the list is selected: fill bottom form and change "Add" to "Apply"
+ btnDel.setEnabled(true);
+ tfSharePath.setText(item.path);
+ tfShareName.setText(item.displayname);
+ tfUsername.setText(item.username);
+ tfPassword.setText(item.password);
+ cboNetshareAuth.setSelectedItem(item.auth);
+ cboNetshareMountPoint.setSelectedItem(Character.valueOf(item.mountpoint.charAt(0)));
+ btnAdd.setText("Ändern");
+ } else {
+ btnDel.setEnabled(false);
+ tfSharePath.setText(null);
+ tfShareName.setText(null);
+ tfUsername.setText(null);
+ tfPassword.setText(null);
+ cboNetshareAuth.setSelectedItem(null);
+ cboNetshareMountPoint.setSelectedItem(null);
+ btnAdd.setText("Hinzufügen");
+ }
+ }
+ });
+
+ cboNetshareMountPoint.setModel(new DefaultComboBoxModel<Character>(mountPoints));
+ cboNetshareMountPoint.setSelectedItem(null);
+
// combobox for share authentication types
cboNetshareAuth.setModel(new DefaultComboBoxModel<NetShareAuth>(NetShareAuth.values()));
cboNetshareAuth.addActionListener(new ActionListener() {
@@ -72,17 +109,22 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout {
chkShowPass.setEnabled(activate);
}
});
- tfUsername.setEnabled(false);
- lblUsername.setEnabled(false);
- tfPassword.setEnabled(false);
- lblPassword.setEnabled(false);
- chkShowPass.setEnabled(false);
+ cboNetshareAuth.setSelectedItem(null);
+
btnAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// check if we are editing an existing share entry or
// creating a new one, check for input either way
NetShare input = new NetShare();
+
+ String inputShareName = tfShareName.getText();
+ if (inputShareName.isEmpty()) {
+ lblError.setText("Kein Anzeigename angegeben!");
+ return;
+ }
+ input.displayname = inputShareName;
+
NetShareAuth inputNetShareAuth = cboNetshareAuth.getItemAt(cboNetshareAuth.getSelectedIndex());
if (inputNetShareAuth == null) {
lblError.setText("Kein Authentifizierungstyp angegeben!");
@@ -120,7 +162,11 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout {
LOGGER.debug("Bad input, aborting.");
return;
}
-
+ // now check for optional mount path
+ Character inputMountPoint = cboNetshareMountPoint.getItemAt(cboNetshareMountPoint.getSelectedIndex());
+ if (inputMountPoint != null) {
+ input.mountpoint = inputMountPoint.toString() + ":";
+ }
// now decide whether to create a new entry or update existing one
NetShare oldEntry = tblNetshare.getSelectedItem();
if (oldEntry != null) {
@@ -179,31 +225,11 @@ public class NetshareConfigurator extends NetshareConfiguratorLayout {
}
}
});
-
- tblNetshare.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
- @Override
- public void valueChanged(ListSelectionEvent e) {
- NetShare item = tblNetshare.getSelectedItem();
- // ugly block-wise sets, but only one test needed compared to
- // doing lots of item != null ? ... : ...
- if (item != null) {
- // share from the list is selected: fill bottom form and change "Add" to "Apply"
- btnDel.setEnabled(true);
- tfSharePath.setText(item.path);
- tfUsername.setText(item.username);
- tfPassword.setText(item.password);
- cboNetshareAuth.setSelectedItem(item.auth);
- btnAdd.setText("Ändern");
- } else {
- btnDel.setEnabled(false);
- tfSharePath.setText(null);
- tfUsername.setText(null);
- tfPassword.setText(null);
- cboNetshareAuth.setSelectedItem(null);
- btnAdd.setText("Hinzufügen");
- }
- }
- });
+ chkShowPass.setEnabled(false);
+ tfUsername.setEnabled(false);
+ lblUsername.setEnabled(false);
+ tfPassword.setEnabled(false);
+ lblPassword.setEnabled(false);
}
public List<NetShare> getState() {
@@ -263,10 +289,10 @@ class NetshareConfiguratorLayout extends JPanel {
private final static String txtNetshareDesc = "Hier können Sie Netzlaufwerke angeben,"
+ " die automatisch beim Start der Veranstaltung eingebunden werden sollen.";
- protected QLabel lblShareAuth, lblSharePath, lblUsername, lblPassword, lblError;
-
+
+ protected QLabel lblShareAuth, lblSharePath, lblShareName, lblMountPoint, lblUsername, lblPassword, lblError;
protected NetshareTable tblNetshare = new NetshareTable();
- protected JTextField tfSharePath, tfUsername;
+ protected JTextField tfSharePath, tfShareName, tfUsername;
protected JPasswordField tfPassword;
protected JButton btnAdd, btnDel;
protected JCheckBox chkShowPass;
@@ -278,8 +304,14 @@ class NetshareConfiguratorLayout extends JPanel {
return FormatHelper.netShareAuthName(item);
}
});
-
-
+ protected ComboBox<Character> cboNetshareMountPoint = new ComboBox<>(new ComboBoxRenderer<Character>() {
+ @Override
+ public String renderItem(Character letter) {
+ if (letter == null)
+ return null;
+ return letter.toString() + ":";
+ }
+ });
public NetshareConfiguratorLayout() {
GridManager grid = new GridManager(this, 5, true, new Insets(3, 3, 3, 3));
@@ -293,31 +325,40 @@ class NetshareConfiguratorLayout extends JPanel {
JPanel pnlNewShare = new JPanel();
GridManager gridNewShare = new GridManager(pnlNewShare, 5, true);
pnlNewShare.setBorder(BorderFactory.createTitledBorder("Details"));
+ lblSharePath = new QLabel("Pfad");
+ gridNewShare.add(lblSharePath);
+ tfSharePath = new JTextField();
+ gridNewShare.add(tfSharePath, 4).fill(true, false).expand(true, false);
+ gridNewShare.nextRow();
// bottom form to add a new share
+ lblShareName = new QLabel("Anzeigename");
+ lblMountPoint = new QLabel("Ziel");
+ tfShareName = new JTextField();
+
+ gridNewShare.add(lblShareName);
+ gridNewShare.add(tfShareName, 2).fill(true, false).expand(true, false);
+ gridNewShare.add(lblMountPoint);
+ gridNewShare.add(cboNetshareMountPoint);
+ gridNewShare.nextRow();
lblShareAuth = new QLabel("Authentifizierung");
gridNewShare.add(lblShareAuth);
gridNewShare.add(cboNetshareAuth, 4).fill(true, false).expand(true, false);
gridNewShare.nextRow();
- lblSharePath = new QLabel("URI");
- gridNewShare.add(lblSharePath);
- tfSharePath = new JTextField();
- gridNewShare.add(tfSharePath, 4).fill(true, false).expand(true, false);
- gridNewShare.nextRow();
lblUsername = new QLabel("Username");
gridNewShare.add(lblUsername);
tfUsername = new JTextField(20);
gridNewShare.add(tfUsername, 1).fill(true, false).expand(true, false);
- lblPassword = new QLabel("Passwort:");
+ lblPassword = new QLabel("Passwort");
gridNewShare.add(lblPassword);
tfPassword = new JPasswordField(20);
gridNewShare.add(tfPassword, 2).fill(true, false).expand(true, false);
gridNewShare.nextRow();
chkShowPass = new JCheckBox("Passwort anzeigen");
- JPanel pnlHidePass = new JPanel();
- pnlHidePass.setLayout(new BoxLayout(pnlHidePass, BoxLayout.LINE_AXIS));
- pnlHidePass.add(Box.createGlue());
- pnlHidePass.add(chkShowPass, BorderLayout.LINE_END);
- gridNewShare.add(pnlHidePass, 5).fill(true, false).expand(true, false);
+ JPanel pnlShowPass = new JPanel();
+ pnlShowPass.setLayout(new BoxLayout(pnlShowPass, BoxLayout.LINE_AXIS));
+ pnlShowPass.add(Box.createGlue());
+ pnlShowPass.add(chkShowPass, BorderLayout.LINE_END);
+ gridNewShare.add(pnlShowPass, 5).fill(true, false).expand(true, false);
gridNewShare.nextRow();
grid.add(pnlNewShare, 5).fill(true, false).expand(true, false);
grid.nextRow();
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/NetshareTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/NetshareTable.java
index 7ebde4eb..f8e4d138 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/NetshareTable.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/NetshareTable.java
@@ -1,41 +1,52 @@
package org.openslx.dozmod.gui.control.table;
import org.openslx.bwlp.thrift.iface.NetShare;
+import org.openslx.bwlp.thrift.iface.NetShareAuth;
import org.openslx.dozmod.thrift.Sorters;
import org.openslx.dozmod.util.FormatHelper;
@SuppressWarnings("serial")
public class NetshareTable extends ListTable<NetShare> {
+ public static final ListTableColumn COL_NAME = new ListTableColumn("Name");
+ public static final ListTableColumn COL_MOUNT = new ListTableColumn("Ziel");
public static final ListTableColumn COL_PATH = new ListTableColumn("Pfad");
- public static final ListTableColumn COL_TYPE = new ListTableColumn("Typ", Sorters.netShareAuth);
+ public static final ListTableColumn COL_AUTH = new ListTableColumn("Authentifizierung", Sorters.netShareAuth);
public static final ListTableColumn COL_USER = new ListTableColumn("Username");
public static final ListTableColumn COL_PASSWORD = new ListTableColumn("Passwort");
public NetshareTable() {
- super(COL_PATH, COL_TYPE, COL_USER, COL_PASSWORD);
+ super(COL_NAME, COL_PATH, COL_MOUNT, COL_AUTH, COL_USER, COL_PASSWORD);
}
@Override
protected Object getValueAtInternal(NetShare item, ListTableColumn columnIndex) {
+ if (columnIndex == COL_NAME)
+ return item.displayname;
+ if (columnIndex == COL_MOUNT)
+ return item.mountpoint;
if (columnIndex == COL_PATH)
return item.path;
- if (columnIndex == COL_TYPE)
- return FormatHelper.netShareAuthName(item.auth);
+ if (columnIndex == COL_AUTH)
+ return item.auth;
if (columnIndex == COL_USER)
return item.username;
if (columnIndex == COL_PASSWORD)
return item.password;
- //TODO others!
throw new IndexOutOfBoundsException();
}
@Override
public Object modelValueToDisplayFormat(Object object, ListTableColumn column) {
+ if (column == COL_NAME)
+ return (String) object;
+ if (column == COL_MOUNT)
+ return (String) object;
if (column == COL_PATH)
return (String) object;
- if (column == COL_TYPE)
- return object.toString();
+ if (column == COL_AUTH) {
+ return FormatHelper.netShareAuthName((NetShareAuth) object);
+ }
if (column == COL_USER)
return (String) object;
if (column == COL_PASSWORD) {
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java
index 0975a443..4e7a2508 100644
--- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java
@@ -202,22 +202,34 @@ public class WebServer extends NanoHTTPD {
} catch (SQLException e) {
return internalServerError();
}
- // TODO format expected from the client-side to
- // handle different types of login. Currently:
- // * no username, no password => use credentials of logged in user
- // * username and optional password => user-specified credentials
+ // openslx.exe expects shares in the following format
+ // <path> <letter> <shortcut> <username> <password>
+ // letter is either a drive letter for Windows VMs,
+ // or a mount point for Linux VMs.
StringBuilder sb = new StringBuilder();
if (!list.isEmpty()) {
for (NetShare share : list) {
sb.append(share.path);
+ sb.append('\t');
+ if (share.isSetMountpoint()) {
+ sb.append(share.mountpoint);
+ } else {
+ // mark missing mount point, run-virt
+ // should assign a random one
+ sb.append("#NO_MOUNT#");
+ }
+ sb.append('\t');
+ sb.append(share.displayname);
if (share.auth == NetShareAuth.LOGIN_USER) {
- // nothing to do
+ // TODO how to mark that it should use the logged in user's credentials
}
- if (share.auth == NetShareAuth.OTHER_USER) {
- sb.append(' ');
+ if (share.auth == NetShareAuth.OTHER_USER && share.isSetUsername()) {
+ sb.append('\t');
sb.append(share.username);
- sb.append(' ');
- sb.append(share.password); // TODO fixme
+ if (share.isSetPassword()) {
+ sb.append('\t');
+ sb.append(share.password); // TODO fixme
+ }
}
sb.append("\n");
}