package org.ovirt.engine.core.common.console; import org.ovirt.engine.core.common.businessentities.GraphicsType; import org.ovirt.engine.core.compat.StringHelper; public class ConsoleDescriptorGenerator { public static String generateDescriptor(ConsoleOptions options) { StringBuilder configBuilder = new StringBuilder("[virt-viewer]"); configBuilder.append("\ntype=").append(graphicsTypeToString(options.getGraphicsType())) .append("\nhost=").append(options.getHost()) .append("\nport=").append(options.getPort()) .append("\npassword=").append(options.getTicket()) .append("\n# Password is valid for ") .append(ConsoleOptions.TICKET_VALIDITY_SECONDS).append(" seconds.") .append("\ndelete-this-file=1") .append("\nfullscreen=").append(boolToInt(options.isFullScreen())); if (!StringHelper.isNullOrEmpty(options.getTitle())) { configBuilder.append("\ntitle=").append(options.getTitle()); } if (!StringHelper.isNullOrEmpty(options.getToggleFullscreenHotKey())) { configBuilder.append("\ntoggle-fullscreen=").append(options.getToggleFullscreenHotKey()); } String releaseCursorHotKey = options.getReleaseCursorHotKey(); if (!StringHelper.isNullOrEmpty(releaseCursorHotKey)) { configBuilder.append("\nrelease-cursor=").append(releaseCursorHotKey); } if (options.isRemapCtrlAltDelete()) { configBuilder.append("\nsecure-attention=").append(ConsoleOptions.SECURE_ATTENTION_MAPPING); } if (options.getGraphicsType() == GraphicsType.SPICE) { configBuilder.append(generateSpicePart(options)); } String remoteViewerSupportedVersions = options.getRemoteViewerSupportedVersions(); String remoteViewerNewerVersionUrl = options.getRemoteViewerNewerVersionUrl(); if (!StringHelper.isNullOrEmpty(remoteViewerSupportedVersions) && !StringHelper.isNullOrEmpty(remoteViewerNewerVersionUrl)) { configBuilder.append("\nversions=").append(remoteViewerSupportedVersions); configBuilder.append("\nnewer-version-url=").append(remoteViewerNewerVersionUrl); } configBuilder.append(generateOvirtSection(options)); return configBuilder.append("\n").toString(); } private static String generateOvirtSection(ConsoleOptions options) { final StringBuilder builder = new StringBuilder(); builder.append("\n") .append("\n[ovirt]") .append("\nhost=").append(options.getOvirtHost()) .append("\nvm-guid=").append(options.getVmId()) .append("\nsso-token=").append(options.getSsoToken()) .append("\nadmin=").append(boolToInt(options.isAdminConsole())); /* * If custom certificate is used for https then we suppose that the ca certificate is available in client system * thrust store for remote-viewer to check against. Since remote-viewer prefers ca from vv file to system ca, * 'ca' record is not included for custom https certificate. */ if (options.getTrustStore() != null && !options.isCustomHttpsCertificateUsed()) { builder.append("\nca=").append(toOnelineCertificate(options.getTrustStore())); } return builder.toString(); } private static String generateSpicePart(ConsoleOptions options) { StringBuilder configBuilder = new StringBuilder(); configBuilder.append("\ntls-port=").append(options.getSecurePort()) .append("\nenable-smartcard=").append(boolToInt(options.passSmartcardOption())) .append("\nenable-usb-autoshare=").append(boolToInt(options.isUsbAutoShare())) .append("\nusb-filter=").append(options.getUsbFilter()); if (options.getCipherSuite() != null) { configBuilder.append("\ntls-ciphers=").append(options.getCipherSuite()); } if (!StringHelper.isNullOrEmpty(options.getHostSubject()) && !StringHelper.isNullOrEmpty(options.getTrustStore())) { configBuilder.append("\nhost-subject=").append(options.getHostSubject()); configBuilder.append("\nca=").append(toOnelineCertificate(options.getTrustStore())); } if (options.isWanOptionsEnabled()) { configBuilder.append("\ncolor-depth=").append(options.colorDepthAsInt()) .append("\ndisable-effects=").append(options.disableEffectsAsString()); } if (!StringHelper.isNullOrEmpty(options.getSpiceProxy())) { configBuilder.append("\nproxy=").append(options.getSpiceProxy()); } if (!StringHelper.isNullOrEmpty(options.getSslChanels())) { configBuilder.append("\nsecure-channels=").append(formatSecureChannels(options.getSslChanels())); } return configBuilder.toString(); } private static String toOnelineCertificate(String certificate) { return certificate.replace("\n", "\\n"); } private static int boolToInt(Boolean b) { return Boolean.TRUE.equals(b) ? 1 : 0; } private static String graphicsTypeToString(GraphicsType graphicsType) { if (graphicsType == null) { return null; } switch (graphicsType) { case SPICE: return "spice"; case VNC: return "vnc"; default: return null; } } /** * Reformats the secure channels - the .vv file accepts semicolon-separated values (unlike SPICE browser plugin). */ private static String formatSecureChannels(String sslChanels) { return (sslChanels == null) ? "" : sslChanels.replace(',', ';'); } }