Started working on modern policies (from Epiphany)

UI finished, just need to hook it up to the backend.
This commit is contained in:
James Magahern
2021-09-29 18:55:23 -07:00
parent 2e25a303b0
commit 31787f57ae
7 changed files with 377 additions and 100 deletions

View File

@@ -10,7 +10,7 @@ import Foundation
class ResourcePolicyManager: NSObject, SBRResourceOriginPolicyDataSource
{
static let AllowedOriginsDefaultsKey = "allowedOrigins"
static let EnabledOriginsDefaultsKey = "enabledOrigins"
static let OriginPoliciesDefaultsKey = "originPolicies"
private static func stringSetForKey(_ key: String) -> Set<String> {
if let set = UserDefaults.standard.array(forKey: key) as? [String] {
@@ -30,6 +30,19 @@ class ResourcePolicyManager: NSObject, SBRResourceOriginPolicyDataSource
func allowedOriginsForScriptResources() -> Set<String> { allowedOriginSet }
private lazy var scriptPolicies: Dictionary<String, ScriptPolicy.PolicyType> = {
if let existingDict = UserDefaults.standard.dictionary(forKey: Self.OriginPoliciesDefaultsKey) as? Dictionary<String, Int> {
return existingDict.mapValues { ScriptPolicy.PolicyType(rawValue: $0)! }
}
return Dictionary<String, ScriptPolicy.PolicyType>()
}() {
didSet {
let encodableDictionary = scriptPolicies.mapValues { $0.rawValue }
UserDefaults.standard.set(encodableDictionary, forKey: Self.OriginPoliciesDefaultsKey)
}
}
func allowOriginToLoadScriptResources(_ origin: String) {
allowedOriginSet.formUnion([ origin ])
}
@@ -37,4 +50,16 @@ class ResourcePolicyManager: NSObject, SBRResourceOriginPolicyDataSource
func disallowOriginToLoadScriptResources(_ origin: String) {
allowedOriginSet.remove(origin)
}
func scriptPolicy(forOrigin origin: String) -> ScriptPolicy {
if let policyType = scriptPolicies[origin] {
return ScriptPolicy(policyType: policyType, securityOrigin: origin)
}
return ScriptPolicy(policyType: .alpha, securityOrigin: origin)
}
func setScriptPolicyType(_ policyType: ScriptPolicy.PolicyType, forOrigin origin: String) {
scriptPolicies[origin] = policyType
}
}

View File

@@ -0,0 +1,84 @@
//
// ScriptPolicy.swift
// App
//
// Created by James Magahern on 9/29/21.
//
import UIKit
struct ScriptPolicy: Hashable {
enum PolicyType: Int, CaseIterable {
case alpha
case bravo
case charlie
case delta
case echo
}
public let policyType: PolicyType
public let securityOrigin: String
public static func title(forPolicyType type: PolicyType) -> String {
switch type {
case .alpha: return "Alpha"
case .bravo: return "Bravo"
case .charlie: return "Charlie"
case .delta: return "Delta"
case .echo: return "Echo"
}
}
public static func localizedDescription(forPolicyType type: PolicyType) -> String {
switch type {
case .alpha:
return "All scripts blocked."
case .bravo:
return "Scripts on page are allowed."
case .charlie:
return "Allow scripts from the same security origin."
case .delta:
return "Allow scripts from common and host CDNs."
case .echo:
return "All scripts are allowed."
}
}
public static func iconRepresentation(forPolicyType type: PolicyType, size: CGSize) -> UIImage? {
let font = UIFont.boldSystemFont(ofSize: size.height - 2)
let attrs: [NSAttributedString.Key : Any] = [
.font : font,
.foregroundColor: UIColor.white,
]
let rect = CGRect(origin: .zero, size: size)
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
if let _ = UIGraphicsGetCurrentContext() {
let backgroundPath = UIBezierPath.init(roundedRect: rect, cornerRadius: 4.0)
// backgroundPath.usesEvenOddFillRule = true
backgroundPath.fill()
let character = NSString(string: { () -> String in
switch type {
case .alpha: return "𝝰"
case .bravo: return "𝝱"
case .charlie: return "𝝲"
case .delta: return "𝝳"
case .echo: return "𝝴"
}
}())
let charSize = character.size(withAttributes: attrs)
let charRect = CGRect(origin: .init(x: (size.width - charSize.width) / 2 ,
y: -(charSize.height - size.height) / 2),
size: charSize)
character.draw(in: charRect, withAttributes: attrs)
}
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}