// Copyright 2012 Citrix Systems, Inc. Licensed under the
// Apache License, Version 2.0 (the "License"); you may not use this
// file except in compliance with the License.  Citrix Systems, Inc.
// reserves all rights not expressly granted by the License.
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// 
// Automatically generated by addcopyright.py at 04/03/2012
package com.cloud.consoleproxy;

import java.util.HashMap;
import java.util.Map;

import com.cloud.consoleproxy.util.Logger;

public class ConsoleProxyHttpHandlerHelper {
	private static final Logger s_logger = Logger.getLogger(ConsoleProxyHttpHandlerHelper.class);
	
	public static Map<String, String> getQueryMap(String query) {
		String[] params = query.split("&");
		Map<String, String> map = new HashMap<String, String>();
		for (String param : params) {
			String[] paramTokens = param.split("=");
			if(paramTokens != null && paramTokens.length == 2) {
				String name = param.split("=")[0];
				String value = param.split("=")[1];
				map.put(name, value);
			} else if (paramTokens.length == 3) {
				// very ugly, added for Xen tunneling url
				String name = paramTokens[0];
				String value = paramTokens[1] + "=" + paramTokens[2];
				map.put(name, value);
			} else {
				if(s_logger.isDebugEnabled())
					s_logger.debug("Invalid paramemter in URL found. param: " + param);
			}
		}
		
		// This is a ugly solution for now. We will do encryption/decryption translation
		// here to make it transparent to rest of the code.
		if(map.get("token") != null) {
			ConsoleProxyPasswordBasedEncryptor encryptor = new ConsoleProxyPasswordBasedEncryptor(
				ConsoleProxy.getEncryptorPassword());
			
			ConsoleProxyClientParam param = encryptor.decryptObject(ConsoleProxyClientParam.class, map.get("token"));
			if(param != null) {
				if(param.getClientHostAddress() != null)
					map.put("host", param.getClientHostAddress());
				if(param.getClientHostPort() != 0)
					map.put("port", String.valueOf(param.getClientHostPort()));
				if(param.getClientTag() != null)
					map.put("tag", param.getClientTag());
				if(param.getClientHostPassword() != null)
					map.put("sid", param.getClientHostPassword());
				if(param.getClientTunnelUrl() != null)
					map.put("consoleurl", param.getClientTunnelUrl());
				if(param.getClientTunnelSession() != null)
					map.put("sessionref", param.getClientTunnelSession());
				if(param.getTicket() != null)
					map.put("ticket", param.getTicket());
			}
		}
		
		return map;
	}
}
