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
178 lines
9.7 KiB
Swift
178 lines
9.7 KiB
Swift
//
|
|
// Copyright 2020 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
import XCTest
|
|
@testable import SignalServiceKit
|
|
|
|
private extension UUID {
|
|
static let uuid1 = UUID()
|
|
static let uuid2 = UUID()
|
|
static let uuid3 = UUID()
|
|
}
|
|
|
|
class GroupModelsTest: SSKBaseTestSwift {
|
|
|
|
func testGroupMembershipChangingFullMembers() {
|
|
var builder1 = GroupMembership.Builder()
|
|
builder1.addFullMember(.uuid1, role: .normal)
|
|
let membership1 = builder1.build()
|
|
|
|
var builder2 = GroupMembership.Builder()
|
|
builder2.addFullMember(.uuid1, role: .administrator)
|
|
let membership2 = builder2.build()
|
|
|
|
var builder3 = GroupMembership.Builder()
|
|
builder3.addFullMember(.uuid1, role: .normal)
|
|
builder3.addFullMember(.uuid2, role: .normal)
|
|
let membership3 = builder3.build()
|
|
|
|
var builder4 = GroupMembership.Builder()
|
|
builder4.addFullMember(.uuid1, role: .normal)
|
|
let membership4 = builder4.build()
|
|
|
|
XCTAssertEqual(membership1, membership4)
|
|
|
|
XCTAssertNotEqual(membership1, membership2)
|
|
|
|
XCTAssertNotEqual(membership1, membership3)
|
|
|
|
XCTAssertNotEqual(membership2, membership3)
|
|
}
|
|
|
|
func testGroupMembershipChangingDidJoinFromInviteLink() {
|
|
var builder1 = GroupMembership.Builder()
|
|
builder1.addFullMember(.uuid1, role: .normal, didJoinFromInviteLink: true)
|
|
let membership1 = builder1.build()
|
|
|
|
var builder2 = GroupMembership.Builder()
|
|
builder2.addFullMember(.uuid1, role: .normal, didJoinFromInviteLink: false)
|
|
let membership2 = builder2.build()
|
|
|
|
XCTAssertEqual(membership1, membership2)
|
|
}
|
|
|
|
func testGroupMembershipChangingRequestingMembers() {
|
|
var builder1 = GroupMembership.Builder()
|
|
builder1.addFullMember(.uuid1, role: .normal)
|
|
let membership1 = builder1.build()
|
|
|
|
var builder2 = GroupMembership.Builder()
|
|
builder2.addFullMember(.uuid1, role: .normal)
|
|
builder2.addRequestingMember(.uuid2)
|
|
let membership2 = builder2.build()
|
|
|
|
var builder3 = GroupMembership.Builder()
|
|
builder3.addFullMember(.uuid1, role: .normal)
|
|
builder3.addRequestingMember(.uuid3)
|
|
let membership3 = builder3.build()
|
|
|
|
var builder4 = GroupMembership.Builder()
|
|
builder4.addFullMember(.uuid1, role: .normal)
|
|
builder4.addRequestingMember(.uuid2)
|
|
let membership4 = builder4.build()
|
|
|
|
XCTAssertFalse(membership1 == membership2)
|
|
|
|
XCTAssertFalse(membership1 == membership3)
|
|
|
|
XCTAssertFalse(membership2 == membership3)
|
|
|
|
XCTAssertTrue(membership2 == membership4)
|
|
}
|
|
|
|
func testGroupMembershipChangingBannedMembers() {
|
|
var builder1 = GroupMembership.Builder()
|
|
builder1.addFullMember(.uuid1, role: .normal)
|
|
let membership1 = builder1.build()
|
|
|
|
var builder2 = membership1.asBuilder
|
|
builder2.addFullMember(.uuid1, role: .normal)
|
|
builder2.addBannedMember(.uuid2, bannedAtTimestamp: 3)
|
|
let membership2 = builder2.build()
|
|
|
|
var builder3 = GroupMembership.Builder()
|
|
builder3.addFullMember(.uuid1, role: .normal)
|
|
builder3.addBannedMember(.uuid2, bannedAtTimestamp: 12)
|
|
let membership3 = builder3.build()
|
|
|
|
var builder4 = GroupMembership.Builder()
|
|
builder4.addFullMember(.uuid1, role: .normal)
|
|
builder4.addBannedMember(.uuid2, bannedAtTimestamp: 3)
|
|
builder4.addBannedMember(.uuid3, bannedAtTimestamp: 4)
|
|
let membership4 = builder4.build()
|
|
|
|
var builder5 = GroupMembership.Builder()
|
|
builder5.addFullMember(.uuid1, role: .normal)
|
|
builder5.addBannedMember(.uuid2, bannedAtTimestamp: 3)
|
|
builder5.addBannedMember(.uuid3, bannedAtTimestamp: 4)
|
|
let membership5 = builder5.build()
|
|
|
|
XCTAssertNotEqual(membership1, membership2)
|
|
|
|
XCTAssertNotEqual(membership2, membership3)
|
|
|
|
XCTAssertNotEqual(membership3, membership4)
|
|
|
|
XCTAssertEqual(membership4, membership5)
|
|
}
|
|
|
|
func testTSGroupModelBackwardsCompatibleDeserialization() {
|
|
let groupIdLength = 16 // Taken from kGroupIdLength at the time of archiving.
|
|
let expectedGroupId = Data(repeating: 8, count: groupIdLength)
|
|
// hexstring generated by archiving:
|
|
// let model = TSGroupModel(
|
|
// groupId: expectedGroupId,
|
|
// name: "name",
|
|
// avatarData: nil,
|
|
// members: [],
|
|
// addedBy: nil
|
|
// )
|
|
// try NSKeyedArchiver.archivedData(withRootObject: model, requiringSecureCoding: false).hexadecimalString
|
|
let hexData = "62706c6973743030d4010203040506070a582476657273696f6e592461726368697665725424746f7058246f626a6563747312000186a05f100f4e534b657965644172636869766572d1080954726f6f748001a90b0c191a1b1c1d212755246e756c6cd60d0e0f1011121314151617185767726f757049645624636c6173735967726f75704e616d655c67726f75704d656d626572735f100f4d544c4d6f64656c56657273696f6e5f101767726f75704d6f64656c536368656d6156657273696f6e80058008800480068002800310001002546e616d654f101008080808080808080808080808080808d21e0e1f205a4e532e6f626a65637473a08007d2222324255a24636c6173736e616d655824636c6173736573574e534172726179a22426584e534f626a656374d2222328295c545347726f75704d6f64656ca32a2b265c545347726f75704d6f64656c584d544c4d6f64656c00080011001a00240029003200370049004c00510053005d006300700078007f0089009600a800c200c400c600c800ca00cc00ce00d000d200d700ea00ef00fa00fb00fd0102010d0116011e0121012a012f013c0140014d0000000000000201000000000000002c00000000000000000000000000000156"
|
|
|
|
let encodedData = Data.data(fromHex: hexData)!
|
|
|
|
let decodedModel = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(encodedData) as? TSGroupModel
|
|
XCTAssertNotNil(decodedModel)
|
|
let groupModel = decodedModel!
|
|
XCTAssertEqual(groupModel.groupId, expectedGroupId)
|
|
}
|
|
|
|
func testTSGroupModelV2BackwardsCompatibleDeserialization() throws {
|
|
let groupIdLength = 32 // Taken from kGroupIdLengthV2 at the time of archiving.
|
|
let expectedGroupId = Data(repeating: 8, count: groupIdLength)
|
|
// hexstring generated by archiving:
|
|
// let model = TSGroupModelV2(
|
|
// groupId: expectedGroupId,
|
|
// name: "name",
|
|
// descriptionText: "description",
|
|
// avatarData: nil,
|
|
// groupMembership: .empty,
|
|
// groupAccess: .allAccess,
|
|
// revision: 1,
|
|
// secretParamsData: Data(repeating: 8, count: 10),
|
|
// avatarUrlPath: nil,
|
|
// inviteLinkPassword: nil,
|
|
// isAnnouncementsOnly: false,
|
|
// isPlaceholderModel: false,
|
|
// wasJustMigrated: false,
|
|
// wasJustCreatedByLocalUser: false,
|
|
// didJustAddSelfViaGroupLink: false,
|
|
// addedByAddress: nil,
|
|
// droppedMembers: []
|
|
// )
|
|
// try NSKeyedArchiver.archivedData(withRootObject: model, requiringSecureCoding: false).hexadecimalString
|
|
let hexData = "62706c6973743030d4010203040506070a582476657273696f6e592461726368697665725424746f7058246f626a6563747312000186a05f100f4e534b657965644172636869766572d1080954726f6f748001af10140b0c2d2e2f30313a3b3c44454d4e54585c5f626355246e756c6cdf10100d0e0f101112131415161718191a1b1c1d1e1f20211d2324251d2728292a1d1d5f10197761734a7573744372656174656442794c6f63616c557365725f1010736563726574506172616d73446174615f100f4d544c4d6f64656c56657273696f6e566163636573735f100f6465736372697074696f6e546578745f10126973506c616365686f6c6465724d6f64656c587265766973696f6e5a6d656d626572736869705624636c6173735f101a6469644a75737441646453656c6656696147726f75704c696e6b5e64726f707065644d656d626572735f101767726f75704d6f64656c536368656d6156657273696f6e5967726f75704e616d655767726f757049645f10136973416e6e6f756e63656d656e74734f6e6c795f100f7761734a7573744d696772617465648005800380028006800a80058008800b8013800580108007801280048005800510004a080808080808080808084f1020080808080808080808080808080808080808080808080808080808080808080808d515320f333435231f28285f101161646446726f6d496e766974654c696e6b576d656d626572735a617474726962757465738009800880028007800710021001d23d3e3f405a24636c6173736e616d655824636c61737365735f101c5369676e616c536572766963654b69742e47726f7570416363657373a34142435f101c5369676e616c536572766963654b69742e47726f7570416363657373584d544c4d6f64656c584e534f626a6563745b6465736372697074696f6ed415464748494a4a4c5f1010696e76616c6964496e766974654d61705d62616e6e65644d656d626572735c6d656d626572537461746573800f800d800d800c425b5dd34f5015515253574e532e6b6579735a4e532e6f626a65637473a0a0800ed23d3e55565c4e5344696374696f6e617279a257435c4e5344696374696f6e617279d23d3e595a5f10205369676e616c536572766963654b69742e47726f75704d656d62657273686970a35b42435f10205369676e616c536572766963654b69742e47726f75704d656d62657273686970d250155d5ea08011d23d3e6061574e534172726179a26043546e616d65d23d3e64655f101f5369676e616c536572766963654b69742e545347726f75704d6f64656c5632a4666742435f101f5369676e616c536572766963654b69742e545347726f75704d6f64656c56325c545347726f75704d6f64656c00080011001a00240029003200370049004c00510053006a0070009300af00c200d400db00ed0102010b0116011d013a01490163016d0175018b019d019f01a101a301a501a701a901ab01ad01af01b101b301b501b701b901bb01bd01bf01ca01ed01ee01f9020d021502200222022402260228022a022c022e0233023e02470266026a02890292029b02a702b002c302d102de02e002e202e402e602e902f002f80303030403050307030c0319031c0329032e035103550378037d037e03800385038d03900395039a03bc03c103e300000000000002010000000000000068000000000000000000000000000003f0"
|
|
|
|
let encodedData = Data.data(fromHex: hexData)!
|
|
|
|
let decodedModel = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(encodedData) as? TSGroupModelV2
|
|
XCTAssertNotNil(decodedModel)
|
|
let groupModel = decodedModel!
|
|
XCTAssertEqual(groupModel.groupId, expectedGroupId)
|
|
}
|
|
}
|