2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * This file have been implemented in compliance with W3C WARP SPEC.
18 * but there are some patent issue between W3C WARP SPEC and APPLE.
19 * so if you want to use this file, refer to the README file in root directory
26 #include <dpl/utils/warp_iri.h>
27 #include <dpl/string.h>
28 #include <dpl/foreach.h>
32 //#include <ValidatorCommon.h>
35 // All schemes which are supported by external application should be ignored
38 // Warp specification require from iri to have host element. File protocol
39 // does not contain host element so it's always denied by warp.
40 // Unfortunatly all widgets are using file protocol to load its data from
41 // hard drive. What's why we cannot check any iri with file schema.
43 const char *IRI_IGNORED_SCHEME[] = { "file://", "widget://", "app://", "tel:",
44 "sms:", "smsto:", "mmsto:", "mailto:", "data:", "blob:",
45 "tizen-service:", 0 };
47 const DPL::String SCHEMA_HTTP = DPL::FromUTF8String("http");
48 const DPL::String SCHEMA_HTTPS = DPL::FromUTF8String("https");
49 const DPL::String SCHEMA_FTP = DPL::FromUTF8String("ftp");
50 } // namespace anonymous
55 m_isAccessDefinition(false),
59 void WarpIRI::set(const char *p_iri,
63 m_isAccessDefinition = m_isIRIValid = false;
68 m_isAccessDefinition = true;
72 if (strcmp(p_iri, "*") == 0) {
75 std::unique_ptr<iri_struct, decltype(&iri_destroy)> iri(iri_parse(p_iri), iri_destroy);
78 WrtLogE("Error in iri_parse!");
80 m_isAccessDefinition = false;
84 if (iri->scheme == NULL || iri->host == NULL) {
86 m_isAccessDefinition = false;
90 // all of this must be NULL in WARP definition
91 if (iri->user || iri->path || iri->query || iri->anchor) {
92 m_isAccessDefinition = false;
95 m_schema = DPL::FromASCIIString(std::string(iri->scheme));
96 m_port = static_cast<unsigned int>(iri->port);
99 m_port = getPort(m_schema);
100 if (m_port == UNKNOWN_PORT) {
101 m_isAccessDefinition = false;
106 std::string utf8host = iri->host;
107 std::list<std::string> hostTokenList;
108 DPL::Tokenize(utf8host, ".", std::front_inserter(hostTokenList));
110 if (SCHEMA_HTTP == m_schema || SCHEMA_HTTPS == m_schema) {
111 FOREACH(i, hostTokenList) {
113 int rc = idna_to_ascii_8z(i->c_str(),
115 IDNA_USE_STD3_ASCII_RULES);
117 if (IDNA_SUCCESS != rc) {
118 WrtLogW("libidn error: %i %s", rc, idna_strerror((Idna_rc)rc));
119 m_isIRIValid = false;
120 m_isAccessDefinition = false;
122 std::string token(output);
123 std::transform(token.begin(),
127 m_host.push_back(DPL::FromUTF8String(token));
132 FOREACH(i, hostTokenList){
133 m_host.push_back(DPL::FromUTF8String(*i));
138 void WarpIRI::set(const DPL::String &iristring,
141 set(DPL::ToUTF8String(iristring).c_str(), domain);
144 unsigned int WarpIRI::getPort(const DPL::String &schema) const
146 unsigned int port = UNKNOWN_PORT;
147 if (schema == SCHEMA_HTTP) {
149 } else if (schema == SCHEMA_HTTPS) {
151 } else if (schema == SCHEMA_FTP) {
157 bool WarpIRI::isSubDomain(const WarpIRI &second) const
159 if (!m_isAccessDefinition || !second.m_isIRIValid) {
162 if (m_schema != second.m_schema) {
165 if (m_port != second.m_port) {
169 size_t size = m_host.size() < second.m_host.size() ?
170 m_host.size() : second.m_host.size();
172 if (m_host.size() > second.m_host.size()) {
176 if (!m_domain && (m_host.size() != second.m_host.size())) {
180 for (size_t i = 0; i < size; ++i) {
181 if (DPL::StringCompare(m_host[i], second.m_host[i])) {
188 bool WarpIRI::isAccessDefinition() const
190 return m_isAccessDefinition;
193 bool WarpIRI::getSubDomain() const
198 bool WarpIRI::isIRISchemaIgnored(const char *iri)
200 for (int i = 0; IRI_IGNORED_SCHEME[i]; ++i) {
202 strncmp(iri, IRI_IGNORED_SCHEME[i],
203 strlen(IRI_IGNORED_SCHEME[i])))