// Licensed to the Software Freedom Conservancy (SFC) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The SFC licenses this file // to you under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with 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. #include "AddCookieCommandHandler.h" #include #include "errorcodes.h" #include "../Browser.h" #include "../BrowserCookie.h" #include "../CookieManager.h" #include "../IECommandExecutor.h" #define MAX_EXPIRATION_SECONDS 2147483647 namespace webdriver { AddCookieCommandHandler::AddCookieCommandHandler(void) { } AddCookieCommandHandler::~AddCookieCommandHandler(void) { } void AddCookieCommandHandler::ExecuteInternal( const IECommandExecutor& executor, const ParametersMap& command_parameters, Response* response) { ParametersMap::const_iterator cookie_parameter_iterator = command_parameters.find("cookie"); if (cookie_parameter_iterator == command_parameters.end()) { response->SetErrorResponse(ERROR_INVALID_ARGUMENT, "Missing parameter: cookie"); return; } Json::Value cookie_value = cookie_parameter_iterator->second; BrowserCookie cookie = BrowserCookie::FromJson(cookie_value); if (cookie.expiration_time() > MAX_EXPIRATION_SECONDS) { time_t current_time; time(¤t_time); time_t max_time = current_time + MAX_EXPIRATION_SECONDS; std::vector raw_formatted_time(30); tm time_info; gmtime_s(&time_info, &max_time); std::string format_string = "%a, %d %b %Y %H:%M:%S GMT"; strftime(&raw_formatted_time[0], 30, format_string.c_str(), &time_info); std::string formatted_time(&raw_formatted_time[0]); std::string error_message = "Internet Explorer does not allow cookies to "; error_message.append("be set more than "); error_message.append(std::to_string(MAX_EXPIRATION_SECONDS)).append(" "); error_message.append("(2 ^ 32 - 1) seconds into the future, or "); error_message.append(formatted_time).append(". This ia a limitaton of "); error_message.append("the browser, not the driver."); response->SetErrorResponse(ERROR_UNABLE_TO_SET_COOKIE, error_message); return; } BrowserHandle browser_wrapper; int status_code = executor.GetCurrentBrowser(&browser_wrapper); if (status_code != WD_SUCCESS) { response->SetErrorResponse(status_code, "Unable to get current browser"); return; } size_t last_path_slash_index = cookie.path().find_last_of("/"); if (last_path_slash_index != std::string::npos) { std::string last_path_segment = cookie.path().substr(last_path_slash_index); if (last_path_segment.size() > 1 && last_path_segment.find(".") != std::string::npos) { // This algorithm is far from perfect. If the "path" property of the // cookie includes the document name, the cookie won't be properly set, // as IE's cookie handling expects a directory for path, not a file // or document name. Strip the last segment of the path property (if // if the path segment doesn't already end in a slash, and contains // a period). cookie.set_path(cookie.path().substr(0, last_path_slash_index)); } } status_code = browser_wrapper->cookie_manager()->SetCookie( browser_wrapper->GetCurrentUrl(), cookie); if (status_code == EUNHANDLEDERROR) { std::string error = "Could not set cookie. The most common cause "; error.append("of this error is a mismatch in the bitness between the "); error.append("driver and browser. In particular, be sure you are not "); error.append("attempting to use a 64-bit IEDriverServer.exe against "); error.append("IE 10 or 11, even on 64-bit Windows."); response->SetErrorResponse(status_code, error); return; } else if (status_code != WD_SUCCESS) { response->SetErrorResponse(status_code, "Unable to add cookie to page"); return; } response->SetSuccessResponse(Json::Value::null); } } // namespace webdriver