10826e83eSopenharmony_ci/* 20826e83eSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 30826e83eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40826e83eSopenharmony_ci * you may not use this file except in compliance with the License. 50826e83eSopenharmony_ci * You may obtain a copy of the License at 60826e83eSopenharmony_ci * 70826e83eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 80826e83eSopenharmony_ci * 90826e83eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100826e83eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110826e83eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120826e83eSopenharmony_ci * See the License for the specific language governing permissions and 130826e83eSopenharmony_ci * limitations under the License. 140826e83eSopenharmony_ci */ 150826e83eSopenharmony_ci 160826e83eSopenharmony_ci#include "geolocation_permission.h" 170826e83eSopenharmony_ci 180826e83eSopenharmony_ci#include <cstdint> 190826e83eSopenharmony_ci#include <vector> 200826e83eSopenharmony_ci 210826e83eSopenharmony_ci#include "nweb_data_base.h" 220826e83eSopenharmony_ci#include "nweb_helper.h" 230826e83eSopenharmony_ci#include "web_errors.h" 240826e83eSopenharmony_ci#include "securec.h" 250826e83eSopenharmony_ci 260826e83eSopenharmony_cinamespace { 270826e83eSopenharmony_ciconstexpr int32_t INTERFACE_OK = 0; 280826e83eSopenharmony_ciconstexpr int32_t INTERFACE_ERROR = -1; 290826e83eSopenharmony_ciconstexpr int32_t ALLOW_PERMISSION_OPERATION = 1; 300826e83eSopenharmony_ciconstexpr int32_t DELETE_PERMISSION_OPERATION = 2; 310826e83eSopenharmony_ci 320826e83eSopenharmony_ci} // namespace 330826e83eSopenharmony_ci 340826e83eSopenharmony_cinamespace OHOS { 350826e83eSopenharmony_cinamespace NWeb { 360826e83eSopenharmony_ci 370826e83eSopenharmony_civoid GeolocationPermission::ProcessActionByType(std::string origin, bool incognitoMode, 380826e83eSopenharmony_ci int32_t operationType, int32_t *errCode) 390826e83eSopenharmony_ci{ 400826e83eSopenharmony_ci std::shared_ptr<OHOS::NWeb::NWebDataBase> dataBase = OHOS::NWeb::NWebHelper::Instance().GetDataBase(); 410826e83eSopenharmony_ci if (!dataBase) { 420826e83eSopenharmony_ci return; 430826e83eSopenharmony_ci } 440826e83eSopenharmony_ci if (operationType == ALLOW_PERMISSION_OPERATION) { 450826e83eSopenharmony_ci if (dataBase->SetPermissionByOrigin(origin, OHOS::NWeb::NWebDataBase::WebPermissionType::GEOLOCATION_TYPE, true, 460826e83eSopenharmony_ci incognitoMode) == NWebError::INVALID_ORIGIN) { 470826e83eSopenharmony_ci *errCode = NWebError::INVALID_ORIGIN; 480826e83eSopenharmony_ci return; 490826e83eSopenharmony_ci } 500826e83eSopenharmony_ci } else if (operationType == DELETE_PERMISSION_OPERATION) { 510826e83eSopenharmony_ci if (dataBase->ClearPermissionByOrigin(origin, OHOS::NWeb::NWebDataBase::WebPermissionType::GEOLOCATION_TYPE, 520826e83eSopenharmony_ci incognitoMode) == NWebError::INVALID_ORIGIN) { 530826e83eSopenharmony_ci *errCode =NWebError::INVALID_ORIGIN; 540826e83eSopenharmony_ci return; 550826e83eSopenharmony_ci } 560826e83eSopenharmony_ci } 570826e83eSopenharmony_ci return; 580826e83eSopenharmony_ci} 590826e83eSopenharmony_ci 600826e83eSopenharmony_cibool GeolocationPermission::ExecuteGetPermissionState(std::string origin, bool incognitoMode, int32_t *errCode) 610826e83eSopenharmony_ci{ 620826e83eSopenharmony_ci bool retValue = false; 630826e83eSopenharmony_ci std::shared_ptr<OHOS::NWeb::NWebDataBase> dataBase = OHOS::NWeb::NWebHelper::Instance().GetDataBase(); 640826e83eSopenharmony_ci if (!dataBase) { 650826e83eSopenharmony_ci *errCode = INTERFACE_ERROR; 660826e83eSopenharmony_ci return retValue; 670826e83eSopenharmony_ci } 680826e83eSopenharmony_ci if (dataBase->GetPermissionResultByOrigin(origin, 690826e83eSopenharmony_ci OHOS::NWeb::NWebDataBase::WebPermissionType::GEOLOCATION_TYPE, retValue, incognitoMode)) { 700826e83eSopenharmony_ci *errCode = INTERFACE_OK; 710826e83eSopenharmony_ci } else { 720826e83eSopenharmony_ci *errCode = NWebError::INVALID_ORIGIN; 730826e83eSopenharmony_ci } 740826e83eSopenharmony_ci return retValue; 750826e83eSopenharmony_ci} 760826e83eSopenharmony_ci 770826e83eSopenharmony_ci 780826e83eSopenharmony_cistd::vector<std::string> GeolocationPermission::ExecuteGetOrigins(bool incognitoMode, int32_t *errCode) 790826e83eSopenharmony_ci{ 800826e83eSopenharmony_ci std::vector<std::string> origins; 810826e83eSopenharmony_ci std::shared_ptr<OHOS::NWeb::NWebDataBase> dataBase = OHOS::NWeb::NWebHelper::Instance().GetDataBase(); 820826e83eSopenharmony_ci if (!dataBase) { 830826e83eSopenharmony_ci *errCode = INTERFACE_ERROR; 840826e83eSopenharmony_ci return origins; 850826e83eSopenharmony_ci } 860826e83eSopenharmony_ci origins = dataBase->GetOriginsByPermission( 870826e83eSopenharmony_ci OHOS::NWeb::NWebDataBase::WebPermissionType::GEOLOCATION_TYPE, incognitoMode); 880826e83eSopenharmony_ci *errCode = INTERFACE_OK; 890826e83eSopenharmony_ci return origins; 900826e83eSopenharmony_ci} 910826e83eSopenharmony_ci 920826e83eSopenharmony_civoid GeolocationPermission::CjAllowGeolocation(std::string origin, bool incognitoMode, int32_t *errCode) 930826e83eSopenharmony_ci{ 940826e83eSopenharmony_ci return ProcessActionByType(origin, incognitoMode, ALLOW_PERMISSION_OPERATION, errCode); 950826e83eSopenharmony_ci} 960826e83eSopenharmony_ci 970826e83eSopenharmony_civoid GeolocationPermission::CjDeleteGeolocation(std::string origin, bool incognitoMode, int32_t *errCode) 980826e83eSopenharmony_ci{ 990826e83eSopenharmony_ci return ProcessActionByType(origin, incognitoMode, DELETE_PERMISSION_OPERATION, errCode); 1000826e83eSopenharmony_ci} 1010826e83eSopenharmony_ci 1020826e83eSopenharmony_cibool GeolocationPermission::CjGetAccessibleGeolocation(std::string origin, bool incognitoMode, int32_t *errCode) 1030826e83eSopenharmony_ci{ 1040826e83eSopenharmony_ci return ExecuteGetPermissionState(origin, incognitoMode, errCode); 1050826e83eSopenharmony_ci} 1060826e83eSopenharmony_ci 1070826e83eSopenharmony_cistd::vector<std::string> GeolocationPermission::CjGetStoredGeolocation(bool incognitoMode, int32_t *errCode) 1080826e83eSopenharmony_ci{ 1090826e83eSopenharmony_ci return ExecuteGetOrigins(incognitoMode, errCode); 1100826e83eSopenharmony_ci} 1110826e83eSopenharmony_ci 1120826e83eSopenharmony_civoid GeolocationPermission::CjDeleteAllGeolocation(bool incognitoMode, int32_t *errCode) 1130826e83eSopenharmony_ci{ 1140826e83eSopenharmony_ci std::shared_ptr<OHOS::NWeb::NWebDataBase> dataBase = OHOS::NWeb::NWebHelper::Instance().GetDataBase(); 1150826e83eSopenharmony_ci if (dataBase != nullptr) { 1160826e83eSopenharmony_ci dataBase->ClearAllPermission(OHOS::NWeb::NWebDataBase::WebPermissionType::GEOLOCATION_TYPE, incognitoMode); 1170826e83eSopenharmony_ci } 1180826e83eSopenharmony_ci return; 1190826e83eSopenharmony_ci} 1200826e83eSopenharmony_ci 1210826e83eSopenharmony_ci} // namespace NWeb 1220826e83eSopenharmony_ci} // namespace OHOS 123