Change license to AGPL
This commit:
- Updates the `LICENSE` file
- Start every file with something like:
// Copyright YEAR_FIRST_PUBLISHED Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
---
First, I removed existing license headers with this Ruby 3.1.2 script:
require 'set'
EXTENSIONS_TO_CHECK = Set['.h', '.hpp', '.cpp', '.m', '.mm', '.pch', '.swift']
same = 0
different = 0
all_files = `git ls-files`.lines.map { |line| line.strip }
all_files.each do |relative_path|
if relative_path == 'Pods'
next
end
unless EXTENSIONS_TO_CHECK.include? File.extname(relative_path)
next
end
path = File.expand_path(relative_path)
contents = File.read(path)
new_contents = contents.sub(/\/\/\n\/\/ Copyright .*\n\/\/\n\n/, '')
if contents == new_contents
same += 1
else
different += 1
end
File.write(path, new_contents)
end
puts "updated #{different} file(s), left #{same} untouched"
I'm sure this script could be improved, but it worked well enough.
Then, I created `Scripts/lint/lint-license-headers` and ran it to auto-
fix a lot of files. This changed the mode of some files, but I think
that's actually desirable. For example,
`SignalServiceKit/src/Util/AppContext.m` previously had a mode of
`0755/-rwxr-xr-x`, and it's now `0644/-rw-r--r--`.
Then I fixed some stragglers and updated the precommit script.
See [a similar change in the Desktop app][0].
[0]: 8bfaf598af
105 lines
4.0 KiB
Swift
105 lines
4.0 KiB
Swift
//
|
|
// Copyright 2016 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
import SignalServiceKit
|
|
|
|
let CompareSafetyNumbersActivityType = "org.whispersystems.signal.activity.CompareSafetyNumbers"
|
|
|
|
@objc(OWSCompareSafetyNumbersActivityDelegate)
|
|
public protocol CompareSafetyNumbersActivityDelegate {
|
|
func compareSafetyNumbersActivitySucceeded(activity: CompareSafetyNumbersActivity)
|
|
func compareSafetyNumbersActivity(_ activity: CompareSafetyNumbersActivity, failedWithError error: Error)
|
|
}
|
|
|
|
@objc(OWSCompareSafetyNumbersActivity)
|
|
public class CompareSafetyNumbersActivity: UIActivity {
|
|
|
|
var mySafetyNumbers: String?
|
|
weak var delegate: CompareSafetyNumbersActivityDelegate?
|
|
|
|
@objc
|
|
required init(delegate: CompareSafetyNumbersActivityDelegate) {
|
|
self.delegate = delegate
|
|
super.init()
|
|
}
|
|
|
|
// MARK: UIActivity
|
|
|
|
public override class var activityCategory: UIActivity.Category { .action }
|
|
|
|
public override var activityType: UIActivity.ActivityType? {
|
|
UIActivity.ActivityType(rawValue: CompareSafetyNumbersActivityType)
|
|
}
|
|
|
|
public override var activityTitle: String? {
|
|
NSLocalizedString("COMPARE_SAFETY_NUMBER_ACTION", comment: "Activity Sheet label")
|
|
}
|
|
|
|
public override var activityImage: UIImage? { #imageLiteral(resourceName: "ic_lock_outline") }
|
|
|
|
public override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
|
|
return stringsFrom(activityItems: activityItems).count > 0
|
|
}
|
|
|
|
public override func prepare(withActivityItems activityItems: [Any]) {
|
|
let myFormattedSafetyNumbers = stringsFrom(activityItems: activityItems).first
|
|
mySafetyNumbers = numericOnly(string: myFormattedSafetyNumbers)
|
|
}
|
|
|
|
public override func perform() {
|
|
defer { activityDidFinish(true) }
|
|
|
|
guard let delegate = delegate else {
|
|
owsFailDebug("Missing delegate.")
|
|
return
|
|
}
|
|
|
|
let pasteboardNumerics = numericOnly(string: UIPasteboard.general.string)
|
|
guard let pasteboardString = pasteboardNumerics,
|
|
pasteboardString.count == 60 else {
|
|
Logger.warn("no valid safety numbers found in pasteboard: \(String(describing: pasteboardNumerics))")
|
|
let error = OWSError(error: .userError,
|
|
description: NSLocalizedString("PRIVACY_VERIFICATION_FAILED_NO_SAFETY_NUMBERS_IN_CLIPBOARD", comment: "Alert body for user error"),
|
|
isRetryable: false)
|
|
|
|
delegate.compareSafetyNumbersActivity(self, failedWithError: error)
|
|
return
|
|
}
|
|
|
|
let pasteboardSafetyNumbers = pasteboardString
|
|
|
|
if pasteboardSafetyNumbers == mySafetyNumbers {
|
|
Logger.info("successfully matched safety numbers. local numbers: \(String(describing: mySafetyNumbers)) pasteboard:\(pasteboardSafetyNumbers)")
|
|
delegate.compareSafetyNumbersActivitySucceeded(activity: self)
|
|
} else {
|
|
Logger.warn("local numbers: \(String(describing: mySafetyNumbers)) didn't match pasteboard:\(pasteboardSafetyNumbers)")
|
|
let error = OWSError(error: .privacyVerificationFailure,
|
|
description: NSLocalizedString("PRIVACY_VERIFICATION_FAILED_MISMATCHED_SAFETY_NUMBERS_IN_CLIPBOARD", comment: "Alert body"),
|
|
isRetryable: false)
|
|
delegate.compareSafetyNumbersActivity(self, failedWithError: error)
|
|
}
|
|
}
|
|
|
|
// MARK: Helpers
|
|
|
|
func numericOnly(string: String?) -> String? {
|
|
guard let string = string else {
|
|
return nil
|
|
}
|
|
|
|
var numericOnly: String?
|
|
if let regex = try? NSRegularExpression(pattern: "\\D", options: .caseInsensitive) {
|
|
numericOnly = regex.stringByReplacingMatches(in: string, options: .withTransparentBounds, range: string.entireRange, withTemplate: "")
|
|
}
|
|
|
|
return numericOnly
|
|
}
|
|
|
|
func stringsFrom(activityItems: [Any]) -> [String] {
|
|
return activityItems.map { $0 as? String }.filter { $0 != nil }.map { $0! }
|
|
}
|
|
}
|