package org.ovirt.engine.ui.common.uicommon; import org.ovirt.engine.core.common.queries.SignStringParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.ui.frontend.AsyncCallback; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.Configurator; import org.ovirt.engine.ui.uicommonweb.ErrorPopupManager; import org.ovirt.engine.ui.uicommonweb.TypeResolver; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.UIConstants; import com.google.gwt.http.client.URL; import com.google.gwt.user.client.Window; public class WebClientConsoleInvoker { private static final UIConstants constants = ConstantsManager.getInstance().getConstants(); private final String clientPage; private final WebsocketProxyConfig proxyConfig; private final String password; private final boolean useSsl; private final String host; private final String port; private final String consoleTitle; public WebClientConsoleInvoker(String clientPage, WebsocketProxyConfig proxyConfig, String host, Integer port, String password, boolean useSsl, String consoleTitle) { this.clientPage = clientPage; this.proxyConfig = proxyConfig; this.host = host; this.password = password; this.useSsl = useSsl; this.port = (port == null) ? null : port.toString(); this.consoleTitle = consoleTitle; } public void invokeClient() { Frontend.getInstance().runQuery(VdcQueryType.SignString, new SignStringParameters(createConnectionString(host, port, useSsl)), new AsyncQuery<>((AsyncCallback<VdcQueryReturnValue>) returnValue -> { String signedTicket = returnValue.getReturnValue(); invokeClientNative(signedTicket); })); } private void openingWindowFailed() { final ErrorPopupManager popupManager = (ErrorPopupManager) TypeResolver.getInstance().resolve(ErrorPopupManager.class); popupManager.show(constants.openingNewConsoleWindowFailed()); } private native void invokeClientNative(String connectionTicket)/*-{ if (!this.@org.ovirt.engine.ui.common.uicommon.WebClientConsoleInvoker::isClientBrowserSupported()()) { alert("This feature is not supported in your browser."); } var that = this; var clientUrl = this.@org.ovirt.engine.ui.common.uicommon.WebClientConsoleInvoker::createClientUrl()(); var win = $wnd.open(clientUrl, "_blank"); if (win === null) { this.@org.ovirt.engine.ui.common.uicommon.WebClientConsoleInvoker::openingWindowFailed()(); return; } win.addEventListener('load', function () { var dataToSend = { connectionTicket: connectionTicket, password: that.@org.ovirt.engine.ui.common.uicommon.WebClientConsoleInvoker::password }; win.postMessage(dataToSend, clientUrl); }, false); win.focus(); }-*/; /** * Creates an urlencoded json object that represent target endpoint. * @return encoded json object that holds host, port and sslTarget information. */ private static String createConnectionString(String host, String port, boolean sslTarget) { return URL.encode(createConnectionJsonString(host, port, sslTarget)); } /** * Helper method for creating json object out of host, port and sslTarget */ private static native String createConnectionJsonString(String host, String port, boolean sslTarget)/*-{ return JSON.stringify({ "host": host, "port": port, "ssl_target": sslTarget }); }-*/; private String createClientUrl() { return Window.Location.getProtocol() + "//" + Window.Location.getHost() + //$NON-NLS-1$ "/" + clientPage + //$NON-NLS-1$ "?host=" + proxyConfig.getProxyHost() + //$NON-NLS-1$ "&port=" + proxyConfig.getProxyPort() + //$NON-NLS-1$ "&title=" + consoleTitle; //$NON-NLS-1$ } private boolean isClientBrowserSupported() { boolean isExplorer = ((Configurator) TypeResolver.getInstance().resolve(Configurator.class)).isClientWindowsExplorer(); Float browserVersion = ((Configurator) TypeResolver.getInstance().resolve(Configurator.class)).clientBrowserVersion(); return isExplorer ? (browserVersion >= 11f) : true; } }