ui corrections to popups and notification window
[framework/osp/web.git] / src / controls / FWebCtrl_CertificateConfirmPopup.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16 //
17
18 /**
19  * @file                FWebCtrl_CertificateConfirmPopup.cpp
20  * @brief               The file contains the definition of _CertificateConfirmPopup class.
21  */
22 #include <FAppApp.h>
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"
43 #include "FWebCtrl_WebImpl.h"
44
45
46 using namespace Tizen::Base;
47 using namespace Tizen::Base::Collection;
48 using namespace Tizen::Base::Utility;
49 using namespace Tizen::Graphics;
50 using namespace Tizen::Io;
51 using namespace Tizen::Security::Cert;
52 using namespace Tizen::System;
53 using namespace Tizen::Ui;
54 using namespace Tizen::Ui::Controls;
55
56
57 namespace Tizen { namespace Web { namespace Controls
58 {
59
60
61 static const int EDIT_TEXT_SIZE = 30;
62
63
64 _CertificateConfirmPopup::_CertificateConfirmPopup(void)
65                                                 : __certPopupMode(CERTIFICATE_POPUP_MODE_USER_CONFIRM)
66                                                 , __confirm(false)
67                                                 , __pCertificatePolicyData(null)
68 {
69 }
70
71
72 _CertificateConfirmPopup::~_CertificateConfirmPopup(void)
73 {
74 }
75
76
77 result
78 _CertificateConfirmPopup::Construct(_CertificatePopupMode certPopupMode, Ewk_Certificate_Policy_Decision* pPolicy)
79 {
80         SysTryReturnResult(NID_WEB_CTRL, pPolicy, E_INVALID_ARG, "Certificate Policy pointer is null.");
81         result r = E_SUCCESS;
82
83         _SystemResource* pSysResource = _SystemResource::GetInstance();
84         SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
85
86         _WebPopupData* pPopupData = _WebPopup::GetPopupData();
87         SysTryReturn(NID_WEB_CTRL, pPopupData, r = GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(r));
88
89         __pCertificatePolicyData = pPolicy;
90         __certPopupMode = certPopupMode;
91         String titleText = L"";
92         int popupMaxHeight = 0;
93         Rectangle rect(0, 0, 0, 0);
94
95         ArrayList idList;
96         r = idList.Construct();
97         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
98
99         ArrayList titleList;
100         r = titleList.Construct();
101         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
102
103         if( __certPopupMode == CERTIFICATE_POPUP_MODE_VIEW )
104         {
105                 titleText = pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_CERTIFICATES");
106                 popupMaxHeight = 4*pPopupData->labelDim.height + pPopupData->btnDim.height + 2*pPopupData->sideMargin;
107
108                 rect.height = 4*pPopupData->labelDim.height;
109                 rect.width = pPopupData->labelDim.width;
110
111                 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_CLOSE)));
112                 titleList.Add(*(new String(pSysResource->GetString("sys_string", "IDS_COM_BODY_DONE"))));
113         }
114         else    // CERTIFICATE_POPUP_MODE_CONFIRM
115         {
116                 titleText = pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_SECURITY_WARNING");
117                 popupMaxHeight = 2*pPopupData->labelDim.height + pPopupData->btnDim.height + 2*pPopupData->sideMargin;
118
119                 rect.height = 2*pPopupData->labelDim.height;
120                 rect.width = pPopupData->labelDim.width;
121
122                 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_ALLOW)));
123                 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_VIEW)));
124                 idList.Add(*(new Integer(ID_BUTTON_CERTIFICATE_CANCEL)));
125
126                 titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_OPT_ALLOW"))));
127                 titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_OPT_VIEW"))));
128                 titleList.Add(*(new String(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_OPT_CANCEL"))));
129         }
130
131         r = _WebPopup::Construct(true, Dimension(pPopupData->popupDim.width, popupMaxHeight));
132         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
133
134         SetTitleText(titleText);
135
136         std::unique_ptr<VerticalBoxLayout> pLayout(dynamic_cast< VerticalBoxLayout* >(GetLayoutN()));
137         SysTryReturn(NID_WEB_CTRL, pLayout.get(), r = GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(r));
138
139         if( certPopupMode == CERTIFICATE_POPUP_MODE_VIEW )
140         {
141                 String certString;
142                 result r = GenerateCertifiate(certString);
143                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
144
145                 std::unique_ptr<TextBox> pTextBox(new (std::nothrow) TextBox());
146                 SysTryReturnResult(NID_WEB_CTRL, pTextBox.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
147
148                 r = pTextBox->Construct(rect, TEXT_BOX_BORDER_ROUNDED);
149                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
150
151                 r = pTextBox->SetTextSize(EDIT_TEXT_SIZE);
152                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
153
154                 r = pTextBox->SetAutoLinkMask(LINK_TYPE_NONE);
155                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
156
157                 r = pTextBox->SetText(certString);
158                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
159
160                 r = AddControl(*pTextBox);
161                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
162
163                 TextBox* pCertBox = pTextBox.release();
164                 pLayout->SetHorizontalAlignment(*pCertBox, LAYOUT_HORIZONTAL_ALIGN_CENTER);
165         }
166         else    // CERTIFICATE_POPUP_MODE_CONFIRM
167         {
168                 std::unique_ptr<Label> pLabel(new (std::nothrow) Label());
169                 SysTryReturnResult(NID_WEB_CTRL, pLabel.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
170
171                 String message = L"";
172                 message = pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG");
173                 message.Append(L"\n");
174                 message.Append(ewk_certificate_policy_decision_url_get(__pCertificatePolicyData));
175
176                 r = pLabel->Construct(rect, message);
177                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
178
179                 pLabel->SetTextConfig(pPopupData->labelFontSize, LABEL_TEXT_STYLE_NORMAL);
180
181                 r = AddControl(*pLabel);
182                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
183
184                 Label* pInfoLabel = pLabel.release();
185                 pLayout->SetHorizontalFitPolicy(*pInfoLabel, FIT_POLICY_PARENT);
186         }
187         Panel* pButtonPanel = CreateAndAddPanel();
188         SysTryReturn(NID_WEB_CTRL, pButtonPanel, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
189
190         r = CreateAndAddButtons(idList, titleList, pButtonPanel);
191         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
192
193         pLayout->SetHorizontalFitPolicy(*pButtonPanel, FIT_POLICY_PARENT);
194         pLayout->SetHorizontalAlignment(*pButtonPanel, LAYOUT_HORIZONTAL_ALIGN_CENTER);
195
196         pLayout->SetSpacing(*pButtonPanel, 2*pPopupData->sideMargin);
197
198         return E_SUCCESS;
199 }
200
201
202 void
203 _CertificateConfirmPopup::OnActionPerformed(const Control& source, int actionId)
204 {
205         result r = E_SUCCESS;
206
207         switch (actionId)
208         {
209         case ID_BUTTON_CERTIFICATE_ALLOW:
210                 HandleUserAction(true);
211                 break;
212
213         case ID_BUTTON_CERTIFICATE_VIEW:
214         {
215                 std::unique_ptr<_CertificateConfirmPopup> pCertificatePopup(new (std::nothrow) _CertificateConfirmPopup());
216                 SysTryReturnVoidResult(NID_WEB_CTRL, pCertificatePopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
217
218                 r = pCertificatePopup->Construct(CERTIFICATE_POPUP_MODE_VIEW, __pCertificatePolicyData);
219                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
220
221                 pCertificatePopup->SetOwner(this);
222                 
223                 r = pCertificatePopup->ShowPopup();
224                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
225
226                 pCertificatePopup.release();
227                 return;
228         }
229
230         case ID_BUTTON_CERTIFICATE_CANCEL:
231                 HandleUserAction(false);
232                 break;
233
234         case ID_BUTTON_CERTIFICATE_CLOSE:
235                 break;
236
237         default:
238                 SysAssert(false);
239                 break;
240         }
241
242         r = HidePopup();
243         if (IsFailed(r))
244         {
245                 SysLogException(NID_WEB_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
246         }
247         if (__certPopupMode == CERTIFICATE_POPUP_MODE_VIEW )
248         {
249                 GetOwner()->SendUserEvent(ID_CERTIFICATE_CONFIRM_POPUP_CLOSE, null);
250         }
251 }
252
253
254 bool
255 _CertificateConfirmPopup::GetConfirmResult() const
256 {
257         return __confirm;
258 }
259
260
261 void
262 _CertificateConfirmPopup::HandleUserAction(bool allow)
263 {
264         __confirm = allow;
265
266         String pem(ewk_certificate_policy_decision_certificate_pem_get(__pCertificatePolicyData));
267         ewk_certificate_policy_decision_allowed_set(__pCertificatePolicyData, static_cast< Eina_Bool >(allow));
268         AddCertificateDb(pem, allow);
269 }
270
271
272 void
273 _CertificateConfirmPopup::AddCertificateDb(const String& pem, bool allow)
274 {
275         _DatabaseImpl db;
276         String certificatePath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
277         String table(CERTIFICATE_TABLE_NAME);
278
279         result r = db.Construct(certificatePath, "r+", null);
280         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
281
282         std::unique_ptr<DbStatement> pStmt(db.CreateStatementN(L"Insert Into " + table + L" (pem, allow) Values (?, ?)"));
283         SysTryReturnVoidResult(NID_WEB_CTRL, pStmt.get(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
284
285         SysLog(NID_WEB_CTRL, "The current value of pem is %ls, allow is %d", pem.GetPointer(), allow);
286
287         pStmt->BindString(0, pem);
288         pStmt->BindInt(1, static_cast < int >(allow));
289
290         db.BeginTransaction();
291
292         std::unique_ptr<DbEnumerator> pEnum(db.ExecuteStatementN(*pStmt));
293
294         db.CommitTransaction();
295 }
296
297
298 result
299 _CertificateConfirmPopup::GenerateCertifiate(String& certString)
300 {
301         SysTryReturnResult(NID_WEB_CTRL, __pCertificatePolicyData, E_INVALID_ARG, "Certificate Policy pointer is null.");
302
303         _SystemResource* pSysResource = _SystemResource::GetInstance();
304         SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
305
306         String pemString(ewk_certificate_policy_decision_certificate_pem_get(__pCertificatePolicyData));
307         std::unique_ptr<ByteBuffer> pByteBuf(StringUtil::StringToUtf8N(pemString));
308         SysTryReturnResult(NID_WEB_CTRL, pByteBuf.get(), E_INVALID_DATA, "Certificate pem information is Empty.");
309
310         X509Certificate certificate;
311         result r = certificate.Construct(*pByteBuf);
312         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
313
314         //Issued to
315         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ISSUED_TO_C"));
316         certString.Append(L"\n\n");
317         String subject = certificate.GetSubject();
318
319         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_COMMON_NAME_C"));
320         certString.Append(L"\n");
321         certString.Append(GetStringOfToken(subject, L"/CN=") + L"\n");
322
323         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ORGANIZATION_C"));
324         certString.Append(L"\n");
325         certString.Append(GetStringOfToken(subject, L"/O=") + L"\n");
326
327         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP ,"IDS_BR_HEADER_ORGANIZATIONAL_UNIT_C"));
328         certString.Append(L"\n");
329         certString.Append(GetStringOfToken(subject, L"/OU=") + L"\n");
330
331         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_CERTIFICATE_SERIAL_NUMBER"));
332         certString.Append(L":\n");
333         certString.Append(certificate.GetSerialNumber() + L"\n\n\n");
334
335         //Issued by
336         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ISSUED_BY_C"));
337         certString.Append(L"\n\n");
338         String issuer = certificate.GetIssuer();
339
340         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_COMMON_NAME_C"));
341         certString.Append(L"\n");
342         certString.Append(GetStringOfToken(issuer, L"/CN=") + L"\n");
343
344         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ORGANIZATION_C"));
345         certString.Append(L"\n");
346         certString.Append(GetStringOfToken(issuer, L"/O=") + L"\n");
347
348         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_ORGANIZATIONAL_UNIT_C"));
349         certString.Append(L"\n");
350         certString.Append(GetStringOfToken(issuer, L"/OU=") + L"\n\n");
351
352         //Validity
353         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_HEADER_VALIDITY_C"));
354         certString.Append(L"\n\n");
355         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_POP_CERTI_VALID_FROM_C"));
356         certString.Append(L"\n");
357         certString.Append(certificate.GetNotBefore() + L"\n\n");
358
359         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_CERTIFICATE_VALID_TILL"));
360         certString.Append(L":\n");
361         certString.Append(certificate.GetNotAfter() + L"\n\n\n");
362
363         //FingerPrints
364         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_ROOTCERTIFICATES_FINGER_PRINT"));
365         certString.Append(L":\n\n");
366         certString.Append(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_SIGNATURE_ALGORITHM_VODA"));
367         certString.Append(L":\n");
368         certString.Append(certificate.GetSignatureAlgorithm() + L"\n\n");
369
370         std::unique_ptr<ByteBuffer> pFingerPrint(certificate.GetFingerprintN());
371         if (pFingerPrint.get() && pFingerPrint->GetPointer())
372         {
373                 String fingerPrint;
374                 StringUtil::Utf8ToString((const char*)pFingerPrint->GetPointer(), fingerPrint);
375                 certString.Append(fingerPrint + L"\n\n");
376         }
377
378         return E_SUCCESS;
379 }
380
381
382 String
383 _CertificateConfirmPopup::GetStringOfToken(const String& parseString, const String& parseToken)
384 {
385         String inString(parseString);
386         int index = 0;
387
388         String outString;
389         outString.Append(L"\n");
390
391         result r = inString.IndexOf(parseToken, 0, index);
392         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, outString, r, "[%s] Propagating.", GetErrorMessage(r));
393
394         int prsTokLen = parseToken.GetLength();
395         r = inString.Remove(0, index + prsTokLen);
396         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, outString, r, "[%s] Propagating.", GetErrorMessage(r));
397
398         while (true)
399         {
400                 r = inString.IndexOf(parseToken, 0, index);
401
402                 switch (r)
403                 {
404                 case E_SUCCESS:
405                         r = inString.Remove(index, prsTokLen);
406                         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, outString, r, "[%s] Propagating.", GetErrorMessage(r));
407
408                         inString.Insert(L"\n", index);
409                         continue;
410
411                 case E_OBJ_NOT_FOUND:
412                         r = inString.IndexOf('=', 0, index);
413                         if (r == E_SUCCESS)
414                         {
415                                 int slashIndex = 0;
416                                 r = inString.LastIndexOf('/', index - 3, slashIndex);
417
418                                 if (!IsFailed(r) && (slashIndex == index - 2 || slashIndex == index - 3))
419                                 {
420                                         inString.Remove(slashIndex, inString.GetLength() - slashIndex);
421                                 }
422                         }
423                         inString.Append(L"\n");
424                         outString = inString;
425                         return outString;
426
427                 default:
428                         return outString;
429                 }
430         }
431 }
432
433
434 }}} // Tizen::Web::Controls