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.
23 #include <FBaseColArrayList.h>
24 #include <FBaseSysLog.h>
25 #include <FBaseUtilUri.h>
26 #include <FGrpDimension.h>
27 #include <FGrpRectangle.h>
28 #include <FIoDbEnumerator.h>
29 #include <FIoDbStatement.h>
30 #include <FSecCertX509Certificate.h>
31 #include <FUiCtrlButton.h>
32 #include <FUiCtrlLabel.h>
33 #include <FUiCtrlPanel.h>
34 #include <FUiLayout.h>
35 #include <FUiVerticalBoxLayout.h>
36 #include <FIo_DatabaseImpl.h>
37 #include <FSys_SystemResource.h>
38 #include <FUi_ControlManager.h>
39 #include <FUi_ResourceManager.h>
40 #include "FWebCtrl_CertificateConfirmPopup.h"
41 #include "FWebCtrl_EflWebkit.h"
42 #include "FWebCtrl_Utility.h"
45 using namespace Tizen::Base;
46 using namespace Tizen::Base::Collection;
47 using namespace Tizen::Base::Utility;
48 using namespace Tizen::Graphics;
49 using namespace Tizen::Io;
50 using namespace Tizen::Security::Cert;
51 using namespace Tizen::System;
52 using namespace Tizen::Ui;
53 using namespace Tizen::Ui::Controls;
56 namespace Tizen { namespace Web { namespace Controls
60 _CertificateConfirmPopup::_CertificateConfirmPopup(void)
61 : __certPopupMode(CERTIFICATE_POPUP_MODE_USER_CONFIRM)
63 , __pCertificatePolicyData(null)
68 _CertificateConfirmPopup::~_CertificateConfirmPopup(void)
74 _CertificateConfirmPopup::Construct(_CertificatePopupMode certPopupMode, Ewk_Certificate_Policy_Decision* pPolicy)
76 SysTryReturnResult(NID_WEB_CTRL, pPolicy, E_INVALID_ARG, "Certificate Policy pointer is null.");
79 _SystemResource* pSysResource = _SystemResource::GetInstance();
80 SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
82 _WebPopupData* pPopupData = _WebPopup::GetPopupData();
83 SysTryReturn(NID_WEB_CTRL, pPopupData, r = GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(r));
85 __pCertificatePolicyData = pPolicy;
86 __certPopupMode = certPopupMode;
87 String titleText = L"";
88 int popupMaxHeight = 0;
89 Rectangle rect(0, 0, 0, 0);
92 r = idList.Construct();
93 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
96 r = titleList.Construct();
97 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
99 if( __certPopupMode == CERTIFICATE_POPUP_MODE_VIEW )
101 titleText = pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_CERTIFICATES");
102 popupMaxHeight = pPopupData->popupDim.height;
104 rect.height = pPopupData->popupDim.height - 4*pPopupData->sideMargin - 2*pPopupData->btnDim.height;
105 rect.width = pPopupData->labelDim.width;
107 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_CLOSE)));
108 titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_COM_SK_DONE"))));
110 else // CERTIFICATE_POPUP_MODE_CONFIRM
112 titleText = pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_SECURITY_WARNING");
113 popupMaxHeight = 2*pPopupData->labelDim.height + 2*pPopupData->btnDim.height + 6*pPopupData->sideMargin;
115 rect.height = 2*pPopupData->labelDim.height;
116 rect.width = pPopupData->labelDim.width;
118 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_ALLOW)));
119 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_VIEW)));
120 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_CANCEL)));
122 titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_OPT_ALLOW"))));
123 titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_OPT_VIEW"))));
124 titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_OPT_CANCEL"))));
127 r = _WebPopup::Construct(true, Dimension(pPopupData->popupDim.width, popupMaxHeight));
128 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
130 SetTitleText(titleText);
132 std::unique_ptr<VerticalBoxLayout> pLayout(dynamic_cast< VerticalBoxLayout* >(GetLayoutN()));
133 SysTryReturn(NID_WEB_CTRL, pLayout.get(), r = GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(r));
135 if( certPopupMode == CERTIFICATE_POPUP_MODE_VIEW )
138 result r = GenerateCertifiate(certString);
139 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
141 std::unique_ptr<TextBox> pTextBox(new (std::nothrow) TextBox());
142 SysTryReturnResult(NID_WEB_CTRL, pTextBox.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
144 r = pTextBox->Construct(rect, TEXT_BOX_BORDER_ROUNDED);
145 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
147 r = pTextBox->SetTextSize(30);
148 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
150 r = pTextBox->SetAutoLinkMask(LINK_TYPE_NONE);
151 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
153 r = pTextBox->SetText(certString);
154 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
156 r = AddControl(*pTextBox);
157 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
159 TextBox* pCertBox = pTextBox.release();
160 pLayout->SetHorizontalAlignment(*pCertBox, LAYOUT_HORIZONTAL_ALIGN_CENTER);
162 else // CERTIFICATE_POPUP_MODE_CONFIRM
164 std::unique_ptr<Label> pLabel(new (std::nothrow) Label());
165 SysTryReturnResult(NID_WEB_CTRL, pLabel.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
167 String message = L"";
168 message = pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG");
169 message.Append(L"\n");
170 message.Append(ewk_certificate_policy_decision_url_get(__pCertificatePolicyData));
172 r = pLabel->Construct(rect, message);
173 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
175 pLabel->SetTextConfig(pPopupData->labelFontSize, LABEL_TEXT_STYLE_NORMAL);
177 r = AddControl(*pLabel);
178 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
180 Label* pInfoLabel = pLabel.release();
181 pLayout->SetHorizontalFitPolicy(*pInfoLabel, FIT_POLICY_PARENT);
183 Panel* pButtonPanel = CreateAndAddPanel();
184 SysTryReturn(NID_WEB_CTRL, pButtonPanel, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
186 r = CreateAndAddButtons(idList, titleList, pButtonPanel);
187 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
189 pLayout->SetHorizontalFitPolicy(*pButtonPanel, FIT_POLICY_PARENT);
190 pLayout->SetHorizontalAlignment(*pButtonPanel, LAYOUT_HORIZONTAL_ALIGN_CENTER);
192 pLayout->SetSpacing(*pButtonPanel, 2*pPopupData->sideMargin);
199 _CertificateConfirmPopup::OnActionPerformed(const Control& source, int actionId)
201 result r = E_SUCCESS;
205 case ID_BUTTON_CERTIFICATE_ALLOW:
206 HandleUserAction(true);
209 case ID_BUTTON_CERTIFICATE_VIEW:
211 std::unique_ptr<_CertificateConfirmPopup> pCertificatePopup(new (std::nothrow) _CertificateConfirmPopup());
212 SysTryReturnVoidResult(NID_WEB_CTRL, pCertificatePopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
214 r = pCertificatePopup->Construct(CERTIFICATE_POPUP_MODE_VIEW, __pCertificatePolicyData);
215 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
217 pCertificatePopup->SetOwner(this);
219 r = pCertificatePopup->ShowPopup();
220 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
222 pCertificatePopup.release();
226 case ID_BUTTON_CERTIFICATE_CANCEL:
227 HandleUserAction(false);
230 case ID_BUTTON_CERTIFICATE_CLOSE:
241 SysLogException(NID_WEB_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
243 if (__certPopupMode == CERTIFICATE_POPUP_MODE_VIEW )
251 _CertificateConfirmPopup::GetConfirmResult() const
258 _CertificateConfirmPopup::HandleUserAction(bool allow)
262 String pem(ewk_certificate_policy_decision_certificate_pem_get(__pCertificatePolicyData));
263 ewk_certificate_policy_decision_allowed_set(__pCertificatePolicyData, static_cast< Eina_Bool >(allow));
264 AddCertificateDb(pem, allow);
269 _CertificateConfirmPopup::AddCertificateDb(const String& pem, bool allow)
272 String certificatePath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
273 String table(CERTIFICATE_TABLE_NAME);
275 result r = db.Construct(certificatePath, "r+", null);
276 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
278 std::unique_ptr<DbStatement> pStmt(db.CreateStatementN(L"Insert Into " + table + L" (pem, allow) Values (?, ?)"));
279 SysTryReturnVoidResult(NID_WEB_CTRL, pStmt.get(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
281 SysLog(NID_WEB_CTRL, "The current value of pem is %ls, allow is %d", pem.GetPointer(), allow);
283 pStmt->BindString(0, pem);
284 pStmt->BindInt(1, static_cast < int >(allow));
286 db.BeginTransaction();
288 std::unique_ptr<DbEnumerator> pEnum(db.ExecuteStatementN(*pStmt));
290 db.CommitTransaction();
294 _CertificateConfirmPopup::GenerateCertifiate(String& certString)
296 SysTryReturnResult(NID_WEB_CTRL, __pCertificatePolicyData, E_INVALID_ARG, "Certificate Policy pointer is null.");
298 _SystemResource* pSysResource = _SystemResource::GetInstance();
299 SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
301 String pemString(ewk_certificate_policy_decision_certificate_pem_get(__pCertificatePolicyData));
302 std::unique_ptr<ByteBuffer> pByteBuf(StringUtil::StringToUtf8N(pemString));
303 SysTryReturnResult(NID_WEB_CTRL, pByteBuf.get(), E_INVALID_DATA, "Certificate pem information is Empty.");
305 X509Certificate certificate;
306 result r = certificate.Construct(*pByteBuf);
307 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
310 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ISSUED_TO_C"));
311 certString.Append(L"\n\n");
312 String subject = certificate.GetSubject();
314 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_COMMON_NAME_C"));
315 certString.Append(L"\n");
316 certString.Append(GetStringOfToken(subject, L"/CN=") + L"\n");
318 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ORGANIZATION_C"));
319 certString.Append(L"\n");
320 certString.Append(GetStringOfToken(subject, L"/O=") + L"\n");
322 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP ,"IDS_BR_HEADER_ORGANIZATIONAL_UNIT_C"));
323 certString.Append(L"\n");
324 certString.Append(GetStringOfToken(subject, L"/OU=") + L"\n");
326 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_CERTIFICATE_SERIAL_NUMBER"));
327 certString.Append(L":\n");
328 certString.Append(certificate.GetSerialNumber() + L"\n\n\n");
331 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ISSUED_BY_C"));
332 certString.Append(L"\n\n");
333 String issuer = certificate.GetIssuer();
335 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_COMMON_NAME_C"));
336 certString.Append(L"\n");
337 certString.Append(GetStringOfToken(issuer, L"/CN=") + L"\n");
339 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ORGANIZATION_C"));
340 certString.Append(L"\n");
341 certString.Append(GetStringOfToken(issuer, L"/O=") + L"\n");
343 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ORGANIZATIONAL_UNIT_C"));
344 certString.Append(L"\n");
345 certString.Append(GetStringOfToken(issuer, L"/OU=") + L"\n\n");
348 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_VALIDITY_C"));
349 certString.Append(L"\n\n");
350 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_POP_CERTI_VALID_FROM_C"));
351 certString.Append(L"\n");
352 certString.Append(certificate.GetNotBefore() + L"\n\n");
354 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_CERTIFICATE_VALID_TILL"));
355 certString.Append(L":\n");
356 certString.Append(certificate.GetNotAfter() + L"\n\n\n");
359 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_ROOTCERTIFICATES_FINGER_PRINT"));
360 certString.Append(L":\n\n");
361 certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_SIGNATURE_ALGORITHM_VODA"));
362 certString.Append(L":\n");
363 certString.Append(certificate.GetSignatureAlgorithm() + L"\n\n");
365 std::unique_ptr<ByteBuffer> pFingerPrint(certificate.GetFingerprintN());
366 if (pFingerPrint.get() && pFingerPrint->GetPointer())
369 StringUtil::Utf8ToString((const char*)pFingerPrint->GetPointer(), fingerPrint);
370 certString.Append(fingerPrint + L"\n\n");
378 _CertificateConfirmPopup::GetStringOfToken(const String& parseString, const String& parseToken)
380 String inString(parseString);
384 outString.Append(L"\n");
386 result r = inString.IndexOf(parseToken, 0, index);
387 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, outString, r, "[%s] Propagating.", GetErrorMessage(r));
389 int prsTokLen = parseToken.GetLength();
390 r = inString.Remove(0, index + prsTokLen);
391 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, outString, r, "[%s] Propagating.", GetErrorMessage(r));
395 r = inString.IndexOf(parseToken, 0, index);
400 r = inString.Remove(index, prsTokLen);
401 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, outString, r, "[%s] Propagating.", GetErrorMessage(r));
403 inString.Insert(L"\n", index);
406 case E_OBJ_NOT_FOUND:
407 r = inString.IndexOf('=', 0, index);
411 r = inString.LastIndexOf('/', index - 3, slashIndex);
413 if (!IsFailed(r) && (slashIndex == index - 2 || slashIndex == index - 3))
415 inString.Remove(slashIndex, inString.GetLength() - slashIndex);
418 inString.Append(L"\n");
419 outString = inString;
429 }}} // Tizen::Web::Controls