Skip to content
This repository has been archived by the owner on May 10, 2024. It is now read-only.

Commit

Permalink
Fix #1442: Adblock rust integration. (#1441)
Browse files Browse the repository at this point in the history
  • Loading branch information
iccub authored and jhreis committed Aug 30, 2019
1 parent 73f87a5 commit ddc2c22
Show file tree
Hide file tree
Showing 24 changed files with 412 additions and 365 deletions.
4 changes: 2 additions & 2 deletions Client-Bridging-Header.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@
#import "Shared-Bridging-Header.h"
#import "Storage-Bridging-Header.h"

#import "ABPFilterLibWrapper.h"

#import "HttpsEverywhereObjC.h"
#import "NSData+GZIP.h"
#import "NSFileManager+Tar.h"

#import <YubiKit/YubiKit.h>
#import <CommonCrypto/CommonCrypto.h>

#import "ablock_rust_lib.h"

#endif
136 changes: 38 additions & 98 deletions Client.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

62 changes: 53 additions & 9 deletions Client/FileManagerExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@ extension FileManager {
}
public typealias FolderLockObj = (folder: Folder, lock: Bool)

static var documentDirectoryURL: URL? {
return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
}

//Lock a folder using FolderLockObj provided.
@discardableResult public func setFolderAccess(_ lockObjects: [FolderLockObj]) -> Bool {
guard let baseDir = baseDirectory() else { return false }
Expand Down Expand Up @@ -46,9 +42,10 @@ extension FileManager {
return false
}

func writeToDiskInFolder(_ data: Data, fileName: String, folderName: String) -> Bool {
func writeToDiskInFolder(_ data: Data, fileName: String, folderName: String,
location: SearchPathDirectory = .applicationSupportDirectory) -> Bool {

guard let folderUrl = getOrCreateFolder(name: folderName) else { return false }
guard let folderUrl = getOrCreateFolder(name: folderName, location: location) else { return false }

do {
let fileUrl = folderUrl.appendingPathComponent(fileName)
Expand All @@ -61,10 +58,11 @@ extension FileManager {
return true
}

/// Creates a folder at documents directory and returns its URL.
/// Creates a folder at given location and returns its URL.
/// If folder already exists, returns its URL as well.
func getOrCreateFolder(name: String, excludeFromBackups: Bool = true) -> URL? {
guard let documentsDir = FileManager.documentDirectoryURL else { return nil }
func getOrCreateFolder(name: String, excludeFromBackups: Bool = true,
location: SearchPathDirectory = .applicationSupportDirectory) -> URL? {
guard let documentsDir = location.url else { return nil }

var folderDir = documentsDir.appendingPathComponent(name)

Expand All @@ -86,7 +84,53 @@ extension FileManager {
}
}

func removeFolder(withName name: String, location: SearchPathDirectory) {
guard let locationUrl = location.url else { return }
let fileUrl = locationUrl.appendingPathComponent(name)

if !fileExists(atPath: fileUrl.path) {
log.debug("File \(fileUrl) doesn't exist")
return
}

do {
try removeItem(at: fileUrl)
} catch {
log.error(error)
}
}

func moveFile(sourceName: String, sourceLocation: SearchPathDirectory,
destinationName: String, destinationLocation: SearchPathDirectory) {
guard let sourceLocation = sourceLocation.url,
let destinationLocation = destinationLocation.url else {
return
}

let sourceFileUrl = sourceLocation.appendingPathComponent(sourceName)
let destinationFileUrl = destinationLocation.appendingPathComponent(destinationName)

if !fileExists(atPath: sourceFileUrl.path) {
log.debug("File \(sourceFileUrl) doesn't exist")
return
}

do {
try moveItem(at: sourceFileUrl, to: destinationFileUrl)
} catch {
log.error(error)
}
}

private func baseDirectory() -> String? {
return NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first
}
}

extension FileManager.SearchPathDirectory {

/// Returns first url in user domain mask of given search path directory
var url: URL? {
return FileManager.default.urls(for: self, in: .userDomainMask).first
}
}
2 changes: 1 addition & 1 deletion Client/Frontend/Browser/DownloadQueue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ extension Download: URLSessionTaskDelegate, URLSessionDownloadDelegate {
}

private func uniqueDownloadPathForFilename(_ filename: String) throws -> URL {
let downloadsPath = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("Downloads")
let downloadsPath = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

let basePath = downloadsPath.appendingPathComponent(filename)
let fileExtension = basePath.pathExtension
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class AdblockDebugMenuTableViewController: TableViewController {
return fm.contents(atPath: bundlePath)
}

// Search in documents directory otherwise
// Search in application support directory otherwise
let folderName = AdblockResourceDownloader.folderName
guard let folderUrl = fm.getOrCreateFolder(name: folderName) else { return nil }

Expand Down
8 changes: 5 additions & 3 deletions Client/HttpCookieExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public extension HTTPCookie {
return "CookiesData.json"
}

private static let directory = FileManager.SearchPathDirectory.applicationSupportDirectory.url

typealias Success = Bool
class func saveToDisk(_ filename: String = HTTPCookie.locallySavedFile, completion: ((Success) -> Void)? = nil) {
let cookieStore = WKWebsiteDataStore.default().httpCookieStore
Expand All @@ -31,7 +33,7 @@ public extension HTTPCookie {
*/
WKWebsiteDataStore.default().fetchDataRecords(ofTypes: [WKWebsiteDataTypeCookies]) { _ in}
cookieStore.getAllCookies { cookies in
guard let baseDir = FileManager.documentDirectoryURL else {
guard let baseDir = directory else {
completion?(false)
return
}
Expand All @@ -47,7 +49,7 @@ public extension HTTPCookie {
}

class func loadFromDisk(_ filename: String = HTTPCookie.locallySavedFile, completion: ((Success) -> Void)? = nil) {
guard let baseDir = FileManager.documentDirectoryURL else {
guard let baseDir = directory else {
completion?(false)
return
}
Expand Down Expand Up @@ -82,7 +84,7 @@ public extension HTTPCookie {
}

class func deleteLocalCookieFile(_ filename: String = HTTPCookie.locallySavedFile) {
guard let baseDir = FileManager.documentDirectoryURL else {
guard let baseDir = directory else {
return
}
let url = baseDir.appendingPathComponent(filename)
Expand Down
16 changes: 9 additions & 7 deletions Client/WebFilters/AdblockResourceDownloader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ class AdblockResourceDownloader {
private let networkManager: NetworkManager
private let locale: String

private let endpoint = "https://adblock-data.s3.brave.com/ios/"
static let folderName = "abp-data"

static let endpoint = "https://adblock-data.s3.brave.com/iOS13"

init(networkManager: NetworkManager = NetworkManager(), locale: String? = Locale.current.languageCode) {
if locale == nil {
log.warning("No locale provided, using default one(\"en\")")
Expand Down Expand Up @@ -64,21 +65,22 @@ class AdblockResourceDownloader {
let queue = DispatchQueue(label: queueName)
let nm = networkManager
let folderName = AdblockResourceDownloader.folderName
// name of the file on server
let resourceName = type.resourceName

// file name of which the file will be saved on disk
let fileName = type.identifier

let completedDownloads = type.associatedFiles.map { fileType -> Deferred<AdBlockNetworkResource> in
let fileExtension = "." + fileType.rawValue
let fileExtension = fileType.rawValue
let etagExtension = fileExtension + ".etag"

guard let resourceName = resourceName,
let url = URL(string: endpoint + resourceName + fileExtension) else {
guard let resourceName = type.resourceName(for: fileType), var url = type.endpoint else {
return Deferred<AdBlockNetworkResource>()
}

let etag = fileFromDocumentsAsString(fileName + etagExtension, inFolder: folderName)
url.appendPathComponent(resourceName)
url.appendPathExtension(fileExtension)

let etag = fileFromDocumentsAsString("\(fileName).\(etagExtension)", inFolder: folderName)
let request = nm.downloadResource(with: url, resourceType: .cached(etag: etag))
.mapQueue(queue) { resource in
AdBlockNetworkResource(resource: resource, fileType: fileType, type: type)
Expand Down
67 changes: 37 additions & 30 deletions Client/WebFilters/AdblockResourcesMappings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,14 @@
import Foundation

struct AdblockResourcesMappings {
static let generalAdblockName = "latest"
static func generalAdblockName(for fileType: FileType) -> String? {
switch fileType {
case .dat: return "combined-included-rs"
case .json: return "combined-included"
default: return nil
}
}

static let generalHttpseName = "httpse"
static let defaultLocale = "en"
}
Expand All @@ -16,35 +23,35 @@ enum ResourceLocale: String {

var resourceName: String {
switch self {
case .ar: return "9FCEECEC-52B4-4487-8E57-8781E82C91D0-latest"
case .bg: return "FD176DD1-F9A0-4469-B43E-B1764893DD5C-latest"
case .zh: return "11F62B02-9D1F-4263-A7F8-77D2B55D4594-latest"
case .cs: return "7CCB6921-7FDA-4A9B-B70A-12DD0A8F08EA-latest"
case .de: return "E71426E7-E898-401C-A195-177945415F38-latest"
case .da: return "9EF6A21C-5014-4199-95A2-A82491274203-latest"
case .et: return "0783DBFD-B5E0-4982-9B4A-711BDDB925B7-latest"
case .fi: return "1C6D8556-3400-4358-B9AD-72689D7B2C46-latest"
case .fr: return "9852EFC4-99E4-4F2D-A915-9C3196C7A1DE-latest"
case .el: return "6C0F4C7F-969B-48A0-897A-14583015A587-latest"
case .hu: return "EDEEE15A-6FA9-4FAC-8CA8-3565508EAAC3-latest"
case .id: return "93123971-5AE6-47BA-93EA-BE1E4682E2B6-latest"
case .hi: return "4C07DB6B-6377-4347-836D-68702CF1494A-latest"
case .fa: return "C3C2F394-D7BB-4BC2-9793-E0F13B2B5971-latest"
case .is: return "48796273-E783-431E-B864-44D3DCEA66DC-latest"
case .he: return "85F65E06-D7DA-4144-B6A5-E1AA965D1E47-latest"
case .it: return "AB1A661D-E946-4F29-B47F-CA3885F6A9F7-latest"
case .ja: return "03F91310-9244-40FA-BCF6-DA31B832F34D-latest"
case .ko: return "1E6CF01B-AFC4-47D2-AE59-3E32A1ED094F-latest"
case .lt: return "4E8B1A63-DEBE-4B8B-AD78-3811C632B353-latest"
case .lv: return "15B64333-BAF9-4B77-ADC8-935433CD6F4C-latest"
case .nl: return "9D644676-4784-4982-B94D-C9AB19098D2A-latest"
case .pl: return "BF9234EB-4CB7-4CED-9FCB-F1FD31B0666C-latest"
case .ru, .uk, .be: return "80470EEC-970F-4F2C-BF6B-4810520C72E6-latest"
case .es: return "AE657374-1851-4DC4-892B-9212B13B15A7-latest"
case .sl: return "418D293D-72A8-4A28-8718-A1EE40A45AAF-latest"
case .sv: return "7DC2AC80-5BBC-49B8-B473-A31A1145CAC1-latest"
case .tr: return "1BE19EFD-9191-4560-878E-30ECA72B5B3C-latest"
case .vi: return "6A0209AC-9869-4FD6-A9DF-039B4200D52C-latest"
case .ar: return "9FCEECEC-52B4-4487-8E57-8781E82C91D0"
case .bg: return "FD176DD1-F9A0-4469-B43E-B1764893DD5C"
case .zh: return "11F62B02-9D1F-4263-A7F8-77D2B55D4594"
case .cs: return "7CCB6921-7FDA-4A9B-B70A-12DD0A8F08EA"
case .de: return "E71426E7-E898-401C-A195-177945415F38"
case .da: return "9EF6A21C-5014-4199-95A2-A82491274203"
case .et: return "0783DBFD-B5E0-4982-9B4A-711BDDB925B7"
case .fi: return "1C6D8556-3400-4358-B9AD-72689D7B2C46"
case .fr: return "9852EFC4-99E4-4F2D-A915-9C3196C7A1DE"
case .el: return "6C0F4C7F-969B-48A0-897A-14583015A587"
case .hu: return "EDEEE15A-6FA9-4FAC-8CA8-3565508EAAC3"
case .id: return "93123971-5AE6-47BA-93EA-BE1E4682E2B6"
case .hi: return "4C07DB6B-6377-4347-836D-68702CF1494A"
case .fa: return "C3C2F394-D7BB-4BC2-9793-E0F13B2B5971"
case .is: return "48796273-E783-431E-B864-44D3DCEA66DC"
case .he: return "85F65E06-D7DA-4144-B6A5-E1AA965D1E47"
case .it: return "AB1A661D-E946-4F29-B47F-CA3885F6A9F7"
case .ja: return "03F91310-9244-40FA-BCF6-DA31B832F34D"
case .ko: return "1E6CF01B-AFC4-47D2-AE59-3E32A1ED094F"
case .lt: return "4E8B1A63-DEBE-4B8B-AD78-3811C632B353"
case .lv: return "15B64333-BAF9-4B77-ADC8-935433CD6F4C"
case .nl: return "9D644676-4784-4982-B94D-C9AB19098D2A"
case .pl: return "BF9234EB-4CB7-4CED-9FCB-F1FD31B0666C"
case .ru, .uk, .be: return "80470EEC-970F-4F2C-BF6B-4810520C72E6"
case .es: return "AE657374-1851-4DC4-892B-9212B13B15A7"
case .sl: return "418D293D-72A8-4A28-8718-A1EE40A45AAF"
case .sv: return "7DC2AC80-5BBC-49B8-B473-A31A1145CAC1"
case .tr: return "1BE19EFD-9191-4560-878E-30ECA72B5B3C"
case .vi: return "6A0209AC-9869-4FD6-A9DF-039B4200D52C"
}
}
}
19 changes: 16 additions & 3 deletions Client/WebFilters/AdblockerType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import Shared

private let log = Logger.browserLogger

enum FileType: String { case dat, json, tgz }
enum FileType: String {
case dat, json, tgz
}

enum AdblockerType {
case general
Expand Down Expand Up @@ -39,14 +41,25 @@ enum AdblockerType {
}

/// A name under which given resource is stored on server.
var resourceName: String? {
func resourceName(for fileType: FileType) -> String? {
switch self {
case .general: return AdblockResourcesMappings.generalAdblockName
case .general: return AdblockResourcesMappings.generalAdblockName(for: fileType)
case .httpse: return AdblockResourcesMappings.generalHttpseName
case .regional(let locale): return ResourceLocale(rawValue: locale)?.resourceName
}
}

/// A name under which given resource is stored on server.
var endpoint: URL? {
guard var url = URL(string: AdblockResourceDownloader.endpoint) else { return nil }

if case .regional = self {
url.appendPathComponent("regional")
}

return url
}

var blockListName: BlocklistName? {
switch self {
case .general: return BlocklistName.ad
Expand Down
10 changes: 0 additions & 10 deletions Client/WebFilters/ShieldStats/Adblock/ABPFilterLibWrapper.h

This file was deleted.

Loading

0 comments on commit ddc2c22

Please # to comment.