package org.ovirt.engine.core.common.console;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.GraphicsType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.StringHelper;
public class ConsoleOptions implements Serializable{
private Guid vmId;
private GraphicsType graphicsType;
// general
/**
* vv file: [virt-viewer] host
*/
private String host;
private Integer port;
private String ticket;
private String title;
private String vmName;
private boolean remapCtrlAltDelete;
private String toggleFullscreenHotKey;
private String releaseCursorHotKey;
private String remoteViewerNewerVersionUrl;
private String remoteViewerSupportedVersions;
// spice
private boolean fullScreen;
private int numberOfMonitors;
private int usbListenPort;
private boolean usbAutoShare;
protected String usbFilter;
private boolean adminConsole;
private int securePort;
private String sslChanels;
private String cipherSuite;
private String hostSubject;
private String trustStore;
// if true, user provided his custom certificate for HTTPS communication
// if false, engine's CA has been used so we can pass it to remote-viewer
private boolean customHttpsCertificateUsed;
private boolean noTaskMgrExecution;
private WanColorDepth wanColorDepth;
private boolean wanOptionsEnabled;
private boolean smartcardEnabled = false;
private String spiceProxy = null;
// the user can choose to disable the smartcard even when it is enabled, but can not choose to enable it, when it is
// disabled
private boolean smartcardEnabledOverridden = false;
// even the spice proxy is globally configured, user can choose to disable it for specific VM
private boolean spiceProxyEnabled;
private List<WanDisableEffects> wanDisableEffects;
/**
* engine_host:engine_port
* vv file: [ovirt] host
*/
private String ovirtHost;
private String ssoToken;
public static final int TICKET_VALIDITY_SECONDS = 120;
public static final int SPICE_USB_DEFAULT_PORT = 32023;
public static final int SET_SPICE_DISABLE_USB_LISTEN_PORT = 0;
public static final String SECURE_ATTENTION_MAPPING = "ctrl+alt+end";
public ConsoleOptions() {
setWanDisableEffects(new ArrayList<WanDisableEffects>());
setWanColorDepth(WanColorDepth.depth16);
setWanOptionsEnabled(false);
setNoTaskMgrExecution(false);
}
public ConsoleOptions(GraphicsType graphicsType) {
this();
this.graphicsType = graphicsType;
}
public Guid getVmId() {
return vmId;
}
public void setVmId(Guid vmId) {
this.vmId = vmId;
}
public GraphicsType getGraphicsType() {
return graphicsType;
}
public void setGraphicsType(GraphicsType graphicsType) {
this.graphicsType = graphicsType;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getVmName() {
return vmName;
}
public void setVmName(String vmName) {
this.vmName = vmName;
}
public String getHost() {
return host;
}
public Integer getPort() {
return port;
}
public String getTicket() {
return ticket;
}
public void setHost(String host) {
this.host = host;
}
public void setPort(Integer port) {
this.port = port;
}
public void setTicket(String ticket) {
this.ticket = ticket;
}
public boolean isRemapCtrlAltDelete() {
return remapCtrlAltDelete;
}
public void setRemapCtrlAltDelete(boolean remapCtrlAltDelete) {
this.remapCtrlAltDelete = remapCtrlAltDelete;
}
public String getToggleFullscreenHotKey() {
return toggleFullscreenHotKey;
}
public void setToggleFullscreenHotKey(String toggleFullscreenHotKey) {
this.toggleFullscreenHotKey = toggleFullscreenHotKey;
}
public String getReleaseCursorHotKey() {
return releaseCursorHotKey;
}
public void setReleaseCursorHotKey(String releaseCursorHotKey) {
this.releaseCursorHotKey = releaseCursorHotKey;
}
public boolean isFullScreen() {
return fullScreen;
}
public void setFullScreen(boolean fullScreen) {
this.fullScreen = fullScreen;
}
public int getNumberOfMonitors() {
return numberOfMonitors;
}
public void setNumberOfMonitors(int numberOfMonitors) {
this.numberOfMonitors = numberOfMonitors;
}
public boolean isUsbAutoShare() {
return usbAutoShare;
}
public void setUsbAutoShare(boolean usbAutoShare) {
this.usbAutoShare = usbAutoShare;
}
public String getUsbFilter() {
return usbFilter;
}
public void setUsbFilter(String usbFilter) {
this.usbFilter = usbFilter;
}
public boolean isAdminConsole() {
return adminConsole;
}
public void setAdminConsole(boolean adminConsole) {
this.adminConsole = adminConsole;
}
public int getSecurePort() {
return securePort & 0xffff;
}
public void setSecurePort(int securePort) {
this.securePort = securePort;
}
public int getRawSecurePort() {
return securePort;
}
public String getSslChanels() {
return sslChanels;
}
public void setSslChanels(String sslChanels) {
this.sslChanels = adjustLegacySecureChannels(sslChanels);
}
public String getCipherSuite() {
return cipherSuite;
}
public void setCipherSuite(String cipherSuite) {
this.cipherSuite = cipherSuite;
}
public String getHostSubject() {
return hostSubject;
}
public void setHostSubject(String hostSubject) {
this.hostSubject = hostSubject;
}
public String getTrustStore() {
return trustStore;
}
public void setTrustStore(String trustStore) {
this.trustStore = trustStore;
}
public boolean isCustomHttpsCertificateUsed() {
return customHttpsCertificateUsed;
}
public void setCustomHttpsCertificateUsed(boolean customHttpsCertificateUsed) {
this.customHttpsCertificateUsed = customHttpsCertificateUsed;
}
public boolean isNoTaskMgrExecution() {
return noTaskMgrExecution;
}
public void setNoTaskMgrExecution(boolean noTaskMgrExecution) {
this.noTaskMgrExecution = noTaskMgrExecution;
}
public WanColorDepth getWanColorDepth() {
return wanColorDepth;
}
public int colorDepthAsInt() {
if (getWanColorDepth() != null) {
return getWanColorDepth().asInt();
}
return ConsoleOptions.WanColorDepth.depth16.asInt();
}
public void setWanColorDepth(WanColorDepth wanColorDepth) {
this.wanColorDepth = wanColorDepth;
}
public boolean isWanOptionsEnabled() {
return wanOptionsEnabled;
}
public void setWanOptionsEnabled(boolean wanOptionsEnabled) {
this.wanOptionsEnabled = wanOptionsEnabled;
}
public boolean isSmartcardEnabled() {
return smartcardEnabled;
}
public void setSmartcardEnabled(boolean smartcardEnabled) {
this.smartcardEnabled = smartcardEnabled;
}
public boolean passSmartcardOption() {
return isSmartcardEnabled() && !isSmartcardEnabledOverridden();
}
public String getSpiceProxy() {
return spiceProxy;
}
public void setSpiceProxy(String spiceProxy) {
this.spiceProxy = spiceProxy;
}
/**
* Returns true if the user has choosen to disable the smartcard even it is by default enabled
*/
public boolean isSmartcardEnabledOverridden() {
return smartcardEnabledOverridden;
}
public void setSmartcardEnabledOverridden(boolean smartcardEnabledOverridden) {
this.smartcardEnabledOverridden = smartcardEnabledOverridden;
}
public boolean isSpiceProxyEnabled() {
return spiceProxyEnabled;
}
public void setSpiceProxyEnabled(boolean spiceProxyEnabled) {
this.spiceProxyEnabled = spiceProxyEnabled;
}
public List<WanDisableEffects> getWanDisableEffects() {
return wanDisableEffects;
}
public void setWanDisableEffects(List<WanDisableEffects> wanDisableEffects) {
this.wanDisableEffects = wanDisableEffects;
}
public String getRemoteViewerNewerVersionUrl() {
return remoteViewerNewerVersionUrl;
}
public void setRemoteViewerNewerVersionUrl(String remoteViewerNewerVersionUrl) {
this.remoteViewerNewerVersionUrl = remoteViewerNewerVersionUrl;
}
public String getRemoteViewerSupportedVersions() {
return remoteViewerSupportedVersions;
}
public void setRemoteViewerSupportedVersions(String remoteViewerSupportedVersions) {
this.remoteViewerSupportedVersions = remoteViewerSupportedVersions;
}
public String getOvirtHost() {
return ovirtHost;
}
public void setOvirtHost(String ovirtHost) {
this.ovirtHost = ovirtHost;
}
public String getSsoToken() {
return ssoToken;
}
public void setSsoToken(String ssoToken) {
this.ssoToken = ssoToken;
}
public enum WanColorDepth {
depth16(16),
depth32(32);
private final int depth;
private WanColorDepth(int depth) {
this.depth = depth;
}
public static WanColorDepth fromInt(int integerDepth) {
for (WanColorDepth value : values()) {
if (value.depth == integerDepth) {
return value;
}
}
throw new IllegalArgumentException("Illegal int value: " + integerDepth);
}
public int asInt() {
return depth;
}
}
public enum WanDisableEffects {
animation("animation"),
wallpaper("wallpaper"),
fontSmooth("font-smooth"),
all("all");
private final String stringValue;
private WanDisableEffects(String stringValue) {
this.stringValue = stringValue;
}
public static WanDisableEffects fromString(String str) {
for (WanDisableEffects value : values()) {
if (value.stringValue.equals(str)) {
return value;
}
}
throw new IllegalArgumentException("Illegal string value: " + str);
}
public String asString() {
return stringValue;
}
}
/**
* Reformat secure channels string if they are in legacy ('s'-prefixed) format.
* @param legacySecureChannels (e.g. "smain,sinput")
* @return secure channels in correct format (e.g. "main,input")
*/
static String adjustLegacySecureChannels(String legacySecureChannels) {
if (StringHelper.isNullOrEmpty(legacySecureChannels)) {
return legacySecureChannels;
}
String secureChannels = legacySecureChannels;
List<String> legacyChannels = Arrays.asList(
new String[]{"smain", "sdisplay", "sinputs", "scursor", "splayback", "srecord", "ssmartcard", "susbredir"});
for (String channel : legacyChannels) {
secureChannels = secureChannels.replace(channel, channel.substring(1));
}
return secureChannels;
}
public String disableEffectsAsString() {
StringBuilder disableEffectsBuffer = new StringBuilder();
int countdown = getWanDisableEffects().size();
for (ConsoleOptions.WanDisableEffects disabledEffect : getWanDisableEffects()) {
disableEffectsBuffer.append(disabledEffect.asString());
if (countdown != 1) {
disableEffectsBuffer.append(", ");
}
countdown--;
}
return disableEffectsBuffer.toString();
}
}