2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FWebCtrl_CertificateConfirmPopup.cpp
20 * @brief The file contains the definition of _CertificateConfirmPopup class.
22 #include <FBaseColArrayList.h>
23 #include <FBaseSysLog.h>
24 #include <FBaseUtilUri.h>
25 #include <FGrpDimension.h>
26 #include <FGrpRectangle.h>
27 #include <FSecCertX509Certificate.h>
28 #include <FUiCtrlButton.h>
29 #include <FUiCtrlLabel.h>
30 #include <FUiCtrlPanel.h>
31 #include <FUiLayout.h>
32 #include <FUiVerticalBoxLayout.h>
33 #include <FUi_ControlManager.h>
34 #include <FUi_ResourceManager.h>
35 #include "FWebCtrl_CertificateConfirmPopup.h"
36 #include "FWebCtrl_Utility.h"
39 using namespace Tizen::Base;
40 using namespace Tizen::Base::Collection;
41 using namespace Tizen::Base::Utility;
42 using namespace Tizen::Graphics;
43 using namespace Tizen::Io;
44 using namespace Tizen::Security::Cert;
45 using namespace Tizen::Ui;
46 using namespace Tizen::Ui::Controls;
49 namespace Tizen { namespace Web { namespace Controls
53 _CertificateConfirmPopup::_CertificateConfirmPopup(void)
54 : __certPopupMode(CERTIFICATE_POPUP_MODE_USER_CONFIRM)
56 , __pCertificatePolicyData(null)
61 _CertificateConfirmPopup::~_CertificateConfirmPopup(void)
67 _CertificateConfirmPopup::Construct(_CertificatePopupMode certPopupMode, Ewk_Certificate_Policy_Decision* pPolicy)
69 SysTryReturnResult(NID_WEB_CTRL, pPolicy, E_INVALID_ARG, "Certificate Policy pointer is null.");
72 _WebPopupData* pPopupData = _WebPopup::GetPopupData();
73 SysTryReturn(NID_WEB_CTRL, pPopupData, r = GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(r));
75 __pCertificatePolicyData = pPolicy;
76 __certPopupMode = certPopupMode;
77 String titleText = L"";
78 int popupMaxHeight = 0;
79 Rectangle rect(0, 0, 0, 0);
82 r = idList.Construct();
83 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
86 r = titleList.Construct();
87 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
89 if( __certPopupMode == CERTIFICATE_POPUP_MODE_VIEW )
91 titleText = L"Certificate";
92 popupMaxHeight = pPopupData->popupDim.height;
94 rect.height = pPopupData->popupDim.height - 4*pPopupData->sideMargin - 2*pPopupData->btnDim.height;
95 rect.width = pPopupData->labelDim.width;
97 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_CLOSE)));
98 titleList.Add(*(new String(L"Close")));
100 else // CERTIFICATE_POPUP_MODE_CONFIRM
102 titleText = L"Security Warning";
103 popupMaxHeight = 2*pPopupData->labelDim.height + 2*pPopupData->btnDim.height + 6*pPopupData->sideMargin;
105 rect.height = 2*pPopupData->labelDim.height;
106 rect.width = pPopupData->labelDim.width;
108 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_ALLOW)));
109 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_VIEW)));
110 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_CANCEL)));
112 titleList.Add(*(new String(L"Allow")));
113 titleList.Add(*(new String(L"View")));
114 titleList.Add(*(new String(L"Cancel")));
117 r = _WebPopup::Construct(true, Dimension(pPopupData->popupDim.width, popupMaxHeight));
118 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
120 SetTitleText(titleText);
122 std::unique_ptr<VerticalBoxLayout> pLayout(dynamic_cast< VerticalBoxLayout* >(GetLayoutN()));
123 SysTryReturn(NID_WEB_CTRL, pLayout.get(), r = GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(r));
125 if( certPopupMode == CERTIFICATE_POPUP_MODE_VIEW )
128 result r = GenerateCertifiate(certString);
129 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
131 std::unique_ptr<TextBox> pTextBox(new (std::nothrow) TextBox());
132 SysTryReturnResult(NID_WEB_CTRL, pTextBox.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
134 r = pTextBox->Construct(rect, TEXT_BOX_BORDER_ROUNDED);
135 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
137 r = pTextBox->SetTextSize(30);
138 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
140 r = pTextBox->SetAutoLinkMask(LINK_TYPE_NONE);
141 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
143 r = pTextBox->SetText(certString);
144 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
146 r = AddControl(*pTextBox);
147 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
149 TextBox* pCertBox = pTextBox.release();
150 pLayout->SetHorizontalAlignment(*pCertBox, LAYOUT_HORIZONTAL_ALIGN_CENTER);
152 else // CERTIFICATE_POPUP_MODE_CONFIRM
154 std::unique_ptr<Label> pLabel(new (std::nothrow) Label());
155 SysTryReturnResult(NID_WEB_CTRL, pLabel.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
157 String message = L"";
158 message = L"There are problems with the security certificate of this site.\n";
159 message.Append(ewk_certificate_policy_decision_url_get(__pCertificatePolicyData));
161 r = pLabel->Construct(rect, message);
162 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
164 pLabel->SetTextConfig(pPopupData->labelFontSize, LABEL_TEXT_STYLE_NORMAL);
166 r = AddControl(*pLabel);
167 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
169 Label* pInfoLabel = pLabel.release();
170 pLayout->SetHorizontalFitPolicy(*pInfoLabel, FIT_POLICY_PARENT);
172 Panel* pButtonPanel = CreateAndAddPanel();
173 SysTryReturn(NID_WEB_CTRL, pButtonPanel, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
175 r = CreateAndAddButtons(idList, titleList, pButtonPanel);
176 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
178 pLayout->SetHorizontalFitPolicy(*pButtonPanel, FIT_POLICY_PARENT);
179 pLayout->SetHorizontalAlignment(*pButtonPanel, LAYOUT_HORIZONTAL_ALIGN_CENTER);
181 pLayout->SetSpacing(*pButtonPanel, 2*pPopupData->sideMargin);
188 _CertificateConfirmPopup::OnActionPerformed(const Control& source, int actionId)
190 result r = E_SUCCESS;
194 case ID_BUTTON_CERTIFICATE_ALLOW:
195 ewk_certificate_policy_decision_allowed_set(__pCertificatePolicyData, EINA_TRUE);
196 __confirm = static_cast< bool >(EINA_TRUE);
199 case ID_BUTTON_CERTIFICATE_VIEW:
201 std::unique_ptr<_CertificateConfirmPopup> pCertificatePopup(new (std::nothrow) _CertificateConfirmPopup());
202 SysTryReturnVoidResult(NID_WEB_CTRL, pCertificatePopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
204 r = pCertificatePopup->Construct(CERTIFICATE_POPUP_MODE_VIEW, __pCertificatePolicyData);
205 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
207 pCertificatePopup->SetOwner(this);
209 r = pCertificatePopup->ShowPopup();
210 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
212 pCertificatePopup.release();
216 case ID_BUTTON_CERTIFICATE_CANCEL:
217 ewk_certificate_policy_decision_allowed_set(__pCertificatePolicyData, EINA_FALSE);
218 __confirm = static_cast< bool >(EINA_FALSE);
221 case ID_BUTTON_CERTIFICATE_CLOSE:
232 SysLogException(NID_WEB_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
234 if (__certPopupMode == CERTIFICATE_POPUP_MODE_VIEW )
242 _CertificateConfirmPopup::GetConfirmResult() const
249 _CertificateConfirmPopup::GenerateCertifiate(String& certString)
251 SysTryReturnResult(NID_WEB_CTRL, __pCertificatePolicyData, E_INVALID_ARG, "Certificate Policy pointer is null.");
253 String pemString(ewk_certificate_policy_decision_certificate_pem_get(__pCertificatePolicyData));
254 std::unique_ptr<ByteBuffer> pByteBuf(StringUtil::StringToUtf8N(pemString));
255 SysTryReturnResult(NID_WEB_CTRL, pByteBuf.get(), E_INVALID_DATA, "Certificate pem information is Empty.");
257 X509Certificate certificate;
258 result r = certificate.Construct(*pByteBuf);
259 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
262 certString.Append(L"ISSUED TO:\n\n");
263 String subject = certificate.GetSubject();
265 certString.Append(L"Common Name:\n");
266 certString.Append(GetStringOfToken(subject, L"/CN=") + L"\n");
268 certString.Append(L"Organization:\n");
269 certString.Append(GetStringOfToken(subject, L"/O=") + L"\n");
271 certString.Append(L"Organizational Unit:\n");
272 certString.Append(GetStringOfToken(subject, L"/OU=") + L"\n");
274 certString.Append(L"Serial Number:\n");
275 certString.Append(certificate.GetSerialNumber() + L"\n\n\n");
278 certString.Append(L"ISSUER:\n\n");
279 String issuer = certificate.GetIssuer();
281 certString.Append(L"Common Name:\n");
282 certString.Append(GetStringOfToken(issuer, L"/CN=") + L"\n");
284 certString.Append(L"Organization:\n");
285 certString.Append(GetStringOfToken(issuer, L"/O=") + L"\n");
287 certString.Append(L"Organizational Unit:\n");
288 certString.Append(GetStringOfToken(issuer, L"/OU=") + L"\n\n");
291 certString.Append(L"VALIDITY:\n\n");
292 certString.Append(L"Valid From:\n");
293 certString.Append(certificate.GetNotBefore() + L"\n\n");
295 certString.Append(L"Valid Till:\n");
296 certString.Append(certificate.GetNotAfter() + L"\n\n\n");
299 certString.Append(L"FINGERPRINTS:\n\n");
300 certString.Append(L"Signature Algorithm:\n");
301 certString.Append(certificate.GetSignatureAlgorithm() + L"\n\n");
303 std::unique_ptr<ByteBuffer> pFingerPrint(certificate.GetFingerprintN());
304 if (pFingerPrint.get() && pFingerPrint->GetPointer())
307 StringUtil::Utf8ToString((const char*)pFingerPrint->GetPointer(), fingerPrint);
308 certString.Append(fingerPrint + L"\n\n");
316 _CertificateConfirmPopup::GetStringOfToken(const String& parseString, const String& parseToken)
318 String inString(parseString);
322 outString.Append(L"\n");
324 result r = inString.IndexOf(parseToken, 0, index);
325 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, outString, r, "[%s] Propagating.", GetErrorMessage(r));
327 int prsTokLen = parseToken.GetLength();
328 r = inString.Remove(0, index + prsTokLen);
329 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, outString, r, "[%s] Propagating.", GetErrorMessage(r));
333 r = inString.IndexOf(parseToken, 0, index);
338 r = inString.Remove(index, prsTokLen);
339 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, outString, r, "[%s] Propagating.", GetErrorMessage(r));
341 inString.Insert(L"\n", index);
344 case E_OBJ_NOT_FOUND:
345 r = inString.IndexOf('=', 0, index);
349 r = inString.LastIndexOf('/', index - 3, slashIndex);
351 if (!IsFailed(r) && (slashIndex == index - 2 || slashIndex == index - 3))
353 inString.Remove(slashIndex, inString.GetLength() - slashIndex);
356 inString.Append(L"\n");
357 outString = inString;
367 }}} // Tizen::Web::Controls