Compare commits
202 Commits
Author | SHA1 | Date |
---|---|---|
![]() |
38d6abba3e | |
![]() |
77bfacdf9b | |
![]() |
f8b7360e46 | |
![]() |
c81e2d1a9b | |
![]() |
6a5d4b32b7 | |
![]() |
267d5f75fd | |
![]() |
4e170ec200 | |
![]() |
1cf0633f78 | |
![]() |
5ba021e086 | |
![]() |
8b0ec50ca2 | |
![]() |
1a2894f7a2 | |
![]() |
837a26f020 | |
![]() |
f8e26d1de0 | |
![]() |
21babb5bf2 | |
![]() |
0a3d7ed076 | |
![]() |
5efdc773fb | |
![]() |
aa6c3bb331 | |
![]() |
429346694e | |
![]() |
36f45beeae | |
![]() |
28d24ab3f7 | |
![]() |
b3b54532bd | |
![]() |
1faaed22fb | |
![]() |
c0bbe36657 | |
![]() |
3beb5a81f4 | |
![]() |
9bf31885c2 | |
![]() |
0f516da163 | |
![]() |
1e91f06399 | |
![]() |
3133c449f1 | |
![]() |
996ebf6196 | |
![]() |
d1302494ec | |
![]() |
33bfa93cfa | |
![]() |
d23013b79e | |
![]() |
7a9ede89d2 | |
![]() |
bce96bf49d | |
![]() |
0649e80251 | |
![]() |
ba1cc83658 | |
![]() |
666c6dc20a | |
![]() |
0a54c68422 | |
![]() |
f34fc46f45 | |
![]() |
a4ec91e072 | |
![]() |
a626fbff56 | |
![]() |
4067e2632c | |
![]() |
930d31161f | |
![]() |
03b6a74cda | |
![]() |
cf72f4d07e | |
![]() |
74c0600635 | |
![]() |
dd9da3b892 | |
![]() |
f7fdb660d8 | |
![]() |
73363caa4f | |
![]() |
9ef61e71a6 | |
![]() |
76aa26762b | |
![]() |
c083034b95 | |
![]() |
dd7001510a | |
![]() |
c86273529c | |
![]() |
fdefa22acb | |
![]() |
3f45347224 | |
![]() |
4abaa4dfa8 | |
![]() |
048af83c98 | |
![]() |
ed2dfbe57e | |
![]() |
6d1f27da12 | |
![]() |
26c51acbdb | |
![]() |
f8a253db40 | |
![]() |
8de2fc9fa7 | |
![]() |
d258ea4394 | |
![]() |
d004e98105 | |
![]() |
8b4ade78d8 | |
![]() |
319c415223 | |
![]() |
2ddf1f9160 | |
![]() |
96ec845544 | |
![]() |
863a5e6d77 | |
![]() |
325c805ed3 | |
![]() |
5f65e6e23f | |
![]() |
26768fc9c7 | |
![]() |
74c24aac83 | |
![]() |
af961267d2 | |
![]() |
6efaf45833 | |
![]() |
118178cc80 | |
![]() |
724a36f991 | |
![]() |
6e52bc480f | |
![]() |
cbd8c9306d | |
![]() |
a79a2b53fc | |
![]() |
a8da9da0db | |
![]() |
3d2b34094a | |
![]() |
6a99c49fa6 | |
![]() |
76c169e126 | |
![]() |
bd149de5b8 | |
![]() |
b392cbb797 | |
![]() |
96950e8175 | |
![]() |
c7a5c576d0 | |
![]() |
fd9a05d3e0 | |
![]() |
99e626574c | |
![]() |
a2947a8070 | |
![]() |
78be32c876 | |
![]() |
56e9dffe60 | |
![]() |
6422cffac7 | |
![]() |
6f14a6f6e8 | |
![]() |
9013c4c93a | |
![]() |
cf85f01595 | |
![]() |
a29d0126a0 | |
![]() |
f955d4b27b | |
![]() |
4d7c0ae354 | |
![]() |
1389ef1899 | |
![]() |
a2a33a53d1 | |
![]() |
04e1386cfc | |
![]() |
f49adfe781 | |
![]() |
a49ab2b145 | |
![]() |
4630c535bc | |
![]() |
78f9be11d4 | |
![]() |
cf1813f427 | |
![]() |
fc868522c8 | |
![]() |
e565d9b1b5 | |
![]() |
7216b7626e | |
![]() |
8e0fd84296 | |
![]() |
3990c5f311 | |
![]() |
354bc2a2e3 | |
![]() |
aca21e0a8d | |
![]() |
8ec1630aa3 | |
![]() |
5f3e057d04 | |
![]() |
1a9a26b319 | |
![]() |
0a01e5263b | |
![]() |
f44bf57295 | |
![]() |
37edbfceb7 | |
![]() |
56ea40ea45 | |
![]() |
71384d7e5b | |
![]() |
0f80cb8d7a | |
![]() |
faa2449d54 | |
![]() |
dedf40e525 | |
![]() |
105b7fd7f4 | |
![]() |
04016992d6 | |
![]() |
46eca1c306 | |
![]() |
55cfdd967f | |
![]() |
224abd0ade | |
![]() |
5a8e7abdc9 | |
![]() |
81d58267ba | |
![]() |
8fd3c03a24 | |
![]() |
b5665ab4c9 | |
![]() |
32c0422208 | |
![]() |
7f09c5a66a | |
![]() |
f0a8a94458 | |
![]() |
9873d46db9 | |
![]() |
1d0f6d73c3 | |
![]() |
1d96d2a632 | |
![]() |
2a84c436ef | |
![]() |
e46b17e24b | |
![]() |
2137a954d3 | |
![]() |
25bf44ad5f | |
![]() |
1ac62fb97e | |
![]() |
1e07079f63 | |
![]() |
fa1dc66625 | |
![]() |
0ad1a00097 | |
![]() |
3bd126bed4 | |
![]() |
420799ec37 | |
![]() |
1b84c2f442 | |
![]() |
036d4dff27 | |
![]() |
82932fc6c0 | |
![]() |
b5ef5d29bb | |
![]() |
50c695a4cf | |
![]() |
507b14a8e5 | |
![]() |
848d7e97d7 | |
![]() |
6871f068d7 | |
![]() |
663b45c94d | |
![]() |
3fcf5e9b96 | |
![]() |
c00882f8ed | |
![]() |
1169253384 | |
![]() |
a872058ad9 | |
![]() |
bab6eecd92 | |
![]() |
50a410e075 | |
![]() |
01c67659ab | |
![]() |
682e865f94 | |
![]() |
bb937cc9df | |
![]() |
39b8c84141 | |
![]() |
c2a7f288c2 | |
![]() |
8edfcf19f7 | |
![]() |
d600157be3 | |
![]() |
d5dbd7b6a3 | |
![]() |
67e8c5ccef | |
![]() |
7593e05956 | |
![]() |
22dd6a9663 | |
![]() |
e3d6db60dd | |
![]() |
c30e66ee2b | |
![]() |
3abf10ec57 | |
![]() |
a9d0494822 | |
![]() |
5607c31330 | |
![]() |
ffd471116e | |
![]() |
2a296936b7 | |
![]() |
de3b071fe1 | |
![]() |
29f7340535 | |
![]() |
186c0d16d2 | |
![]() |
4c08fb8793 | |
![]() |
9b6f56b02e | |
![]() |
183f01d0eb | |
![]() |
d79187b0fe | |
![]() |
20fe9bda81 | |
![]() |
2ddff10546 | |
![]() |
01309217c1 | |
![]() |
667bff6c84 | |
![]() |
8f617ff655 | |
![]() |
983f292329 | |
![]() |
b50b797edf | |
![]() |
a77fe47606 | |
![]() |
dae156b6bb | |
![]() |
77eabee9a7 |
|
@ -0,0 +1 @@
|
|||
github: chrisballinger
|
|
@ -1,3 +1,4 @@
|
|||
.env
|
||||
.DS_Store
|
||||
build
|
||||
*.mode1v3
|
||||
|
@ -14,3 +15,7 @@ Carthage/
|
|||
com.mono0926.LicensePlist.Output/
|
||||
|
||||
Secrets.plist
|
||||
Preview.html
|
||||
fastlane/report.xml
|
||||
fastlane/test_output/
|
||||
.ruby-version
|
||||
|
|
|
@ -31,3 +31,12 @@
|
|||
[submodule "Submodules/LumberjackConsole"]
|
||||
path = Submodules/LumberjackConsole
|
||||
url = git@github.com:ChatSecure/LumberjackConsole.git
|
||||
[submodule "Submodules/YapDatabase"]
|
||||
path = Submodules/YapDatabase
|
||||
url = git@github.com:ChatSecure/YapDatabase.git
|
||||
[submodule "Submodules/YapTaskQueue"]
|
||||
path = Submodules/YapTaskQueue
|
||||
url = git@github.com:ChatSecure/YapTaskQueue.git
|
||||
[submodule "Submodules/libsqlfs"]
|
||||
path = Submodules/libsqlfs
|
||||
url = git@github.com:ChatSecure/libsqlfs.git
|
||||
|
|
11
.travis.yml
11
.travis.yml
|
@ -1,4 +1,4 @@
|
|||
osx_image: xcode9.3
|
||||
osx_image: xcode12
|
||||
language: objective-c
|
||||
|
||||
# Handle git submodules yourself
|
||||
|
@ -9,9 +9,8 @@ git:
|
|||
# Use sed to replace the SSH URL with the public URL, then initialize submodules
|
||||
before_install:
|
||||
# Fix Travis xcodebuild exited with 65 https://github.com/travis-ci/travis-ci/issues/6675#issuecomment-257964767
|
||||
- export IOS_SIMULATOR_UDID=`instruments -s devices | grep -m 1 "iPhone 8 (11" | awk -F '[ ]' '{print $4}' | awk -F '[\[]' '{print $2}' | sed 's/.$//'`
|
||||
- export IOS_SIMULATOR_UDID=`instruments -s devices | grep -m 1 "iPhone 8 (14" | awk -F '[ ]' '{print $4}' | awk -F '[\[]' '{print $2}' | sed 's/.$//'`
|
||||
- echo $IOS_SIMULATOR_UDID
|
||||
- open -a "simulator" --args -CurrentDeviceUDID $IOS_SIMULATOR_UDID
|
||||
- bundle install # We need a pre-release CocoaPods version
|
||||
- sed -i -e 's/git@github.com:/git:\/\/github.com\//' .gitmodules
|
||||
- sed -i -e 's/git@github.com:/git:\/\/github.com\//' Podfile
|
||||
|
@ -22,12 +21,8 @@ install:
|
|||
- curl -L https://github.com/ChatSecure/ChatSecure-iOS-Precompiled-Dependencies/archive/master.zip -o ChatSecure-iOS-Precompiled-Dependencies.zip
|
||||
- unzip -q ChatSecure-iOS-Precompiled-Dependencies.zip
|
||||
- mv ChatSecure-iOS-Precompiled-Dependencies-master ChatSecure-iOS-Precompiled-Dependencies
|
||||
- mkdir -p ./Carthage/Build/iOS/
|
||||
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/Carthage-iOS.zip -d ./Carthage/Build
|
||||
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/CPAProxyDependencies.zip -d ./Submodules/CPAProxy/
|
||||
- mv ./Submodules/CPAProxy/CPAProxyDependencies ./Submodules/CPAProxy/CPAProxyDependencies-iOS
|
||||
- cp -r ./Submodules/CPAProxy/CPAProxyDependencies-iOS ./Submodules/CPAProxy/CPAProxyDependencies-macOS
|
||||
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/OTRKitDependencies-iOS.zip -d ./Submodules/OTRKit/
|
||||
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/OTRKitDependencies.zip -d ./Submodules/OTRKit/
|
||||
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/Pods.zip
|
||||
|
||||
before_script:
|
||||
|
|
16
Cartfile
16
Cartfile
|
@ -1,16 +0,0 @@
|
|||
github "ChatSecure/Mantle" "2.1.0_headerfix"
|
||||
github "nolanw/HTMLReader" "1d0dda3"
|
||||
github "AFNetworking/AFNetworking" ~> 3.1
|
||||
github "TheLevelUp/ZXingObjC" ~> 3.2.2
|
||||
github "soffes/SAMKeychain" ~> 1.5
|
||||
github "jdg/MBProgressHUD" ~> 1.1
|
||||
github "TTTAttributedLabel/TTTAttributedLabel" ~> 2.0
|
||||
github "PureLayout/PureLayout" ~> 3.0
|
||||
github "facebook/KVOController" ~> 1.2
|
||||
github "xmartlabs/XLForm" ~> 4.0.0
|
||||
github "mattt/FormatterKit" ~> 1.8
|
||||
|
||||
### Using CocoaPods due to Swift 3->4 issues ###
|
||||
# github "Cocoanetics/Kvitto" ~> 1.0
|
||||
# github "Cocoanetics/DTFoundation" ~> 1.7
|
||||
# github "Alamofire/Alamofire" ~> 4.4
|
|
@ -1,11 +0,0 @@
|
|||
github "AFNetworking/AFNetworking" "3.2.0"
|
||||
github "ChatSecure/Mantle" "4c1a09cb0c0811956cd35262340e42b940971cbb"
|
||||
github "PureLayout/PureLayout" "v3.0.2"
|
||||
github "TTTAttributedLabel/TTTAttributedLabel" "2.0.0"
|
||||
github "TheLevelUp/ZXingObjC" "3.2.2"
|
||||
github "facebook/KVOController" "v1.2.0"
|
||||
github "jdg/MBProgressHUD" "1.1.0"
|
||||
github "mattt/FormatterKit" "1.8.2"
|
||||
github "nolanw/HTMLReader" "1d0dda3849ff719fa15a0c4cac0118c70ef2217c"
|
||||
github "soffes/SAMKeychain" "v1.5.3"
|
||||
github "xmartlabs/XLForm" "4.0.0"
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,129 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1200"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
|
||||
BuildableName = "ChatSecure.app"
|
||||
BlueprintName = "ChatSecure"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "NO"
|
||||
buildForProfiling = "NO"
|
||||
buildForArchiving = "NO"
|
||||
buildForAnalyzing = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AFB21A169D54009F3E6C"
|
||||
BuildableName = "ChatSecureTests.xctest"
|
||||
BlueprintName = "ChatSecureTests"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "macOS_Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
disableMainThreadChecker = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
|
||||
BuildableName = "ChatSecure.app"
|
||||
BlueprintName = "ChatSecure"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AFB21A169D54009F3E6C"
|
||||
BuildableName = "ChatSecureTests.xctest"
|
||||
BlueprintName = "ChatSecureTests"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6365CEFB1E2453F6009E213F"
|
||||
BuildableName = "ChatSecureUITests.xctest"
|
||||
BlueprintName = "ChatSecureUITests"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "macOS_Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
|
||||
BuildableName = "ChatSecure.app"
|
||||
BlueprintName = "ChatSecure"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<EnvironmentVariables>
|
||||
<EnvironmentVariable
|
||||
key = "OS_ACTIVITY_MODE"
|
||||
value = "disable"
|
||||
isEnabled = "NO">
|
||||
</EnvironmentVariable>
|
||||
</EnvironmentVariables>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "macOS_Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
|
||||
BuildableName = "ChatSecure.app"
|
||||
BlueprintName = "ChatSecure"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "macOS_Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "macOS_Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0930"
|
||||
LastUpgradeVersion = "1200"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
@ -37,10 +37,20 @@
|
|||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
buildConfiguration = "iOS_Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
disableMainThreadChecker = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
|
||||
BuildableName = "ChatSecure.app"
|
||||
BlueprintName = "ChatSecure"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
|
@ -53,17 +63,7 @@
|
|||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "D9227C321BA7952100B5E1D0"
|
||||
BuildableName = "ChatSecureCoreTests.xctest"
|
||||
BlueprintName = "ChatSecureCoreTests"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
skipped = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6365CEFB1E2453F6009E213F"
|
||||
|
@ -73,20 +73,9 @@
|
|||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
|
||||
BuildableName = "ChatSecure.app"
|
||||
BlueprintName = "ChatSecure"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
buildConfiguration = "iOS_Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
|
@ -109,14 +98,12 @@
|
|||
<EnvironmentVariable
|
||||
key = "OS_ACTIVITY_MODE"
|
||||
value = "disable"
|
||||
isEnabled = "YES">
|
||||
isEnabled = "NO">
|
||||
</EnvironmentVariable>
|
||||
</EnvironmentVariables>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
buildConfiguration = "iOS_Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
|
@ -133,10 +120,10 @@
|
|||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
buildConfiguration = "iOS_Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
buildConfiguration = "iOS_Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0930"
|
||||
LastUpgradeVersion = "1200"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
@ -10,11 +10,11 @@
|
|||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "NO"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "D9227C291BA7952100B5E1D0"
|
||||
BlueprintIdentifier = "D9C527FF235CB55C002B213A"
|
||||
BuildableName = "ChatSecureCore.framework"
|
||||
BlueprintName = "ChatSecureCore"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
|
@ -23,26 +23,15 @@
|
|||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
buildConfiguration = "iOS_Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "D9227C291BA7952100B5E1D0"
|
||||
BuildableName = "ChatSecureCore.framework"
|
||||
BlueprintName = "ChatSecureCore"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
buildConfiguration = "iOS_Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
|
@ -51,20 +40,9 @@
|
|||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "D9227C291BA7952100B5E1D0"
|
||||
BuildableName = "ChatSecureCore.framework"
|
||||
BlueprintName = "ChatSecureCore"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
buildConfiguration = "iOS_Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
|
@ -72,7 +50,7 @@
|
|||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "D9227C291BA7952100B5E1D0"
|
||||
BlueprintIdentifier = "D9C527FF235CB55C002B213A"
|
||||
BuildableName = "ChatSecureCore.framework"
|
||||
BlueprintName = "ChatSecureCore"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
|
@ -80,10 +58,10 @@
|
|||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
buildConfiguration = "iOS_Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
buildConfiguration = "iOS_Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0930"
|
||||
LastUpgradeVersion = "1200"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
@ -23,10 +23,19 @@
|
|||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
buildConfiguration = "iOS_Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AFB21A169D54009F3E6C"
|
||||
BuildableName = "ChatSecureTests.xctest"
|
||||
BlueprintName = "ChatSecureTests"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
|
@ -39,20 +48,9 @@
|
|||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AFB21A169D54009F3E6C"
|
||||
BuildableName = "ChatSecureTests.xctest"
|
||||
BlueprintName = "ChatSecureTests"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
buildConfiguration = "iOS_Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
|
@ -77,11 +75,9 @@
|
|||
isEnabled = "YES">
|
||||
</EnvironmentVariable>
|
||||
</EnvironmentVariables>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
buildConfiguration = "iOS_Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
|
@ -97,10 +93,10 @@
|
|||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
buildConfiguration = "iOS_Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
buildConfiguration = "iOS_Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0930"
|
||||
LastUpgradeVersion = "1200"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
@ -10,7 +10,8 @@
|
|||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
disableMainThreadChecker = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
|
@ -23,22 +24,12 @@
|
|||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
|
||||
BuildableName = "ChatSecure.app"
|
||||
BlueprintName = "ChatSecure"
|
||||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
disableMainThreadChecker = "YES"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
|
@ -55,8 +46,6 @@
|
|||
ReferencedContainer = "container:ChatSecure.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
|
|
|
@ -8,7 +8,17 @@
|
|||
<array>
|
||||
<string>applinks:chatsecure.org</string>
|
||||
</array>
|
||||
<key>com.apple.developer.default-data-protection</key>
|
||||
<string>NSFileProtectionComplete</string>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.device.audio-input</key>
|
||||
<true/>
|
||||
<key>com.apple.security.device.camera</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.server</key>
|
||||
<true/>
|
||||
<key>com.apple.security.personal-information.photos-library</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
//
|
||||
// UIActionSheet+ChatSecure.h
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by David Chiles on 10/24/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
@import UIKit;
|
||||
|
||||
@interface UIActionSheet (ChatSecure)
|
||||
|
||||
- (void)otr_presentInView:(UIView *)view;
|
||||
|
||||
@end
|
|
@ -1,23 +0,0 @@
|
|||
//
|
||||
// UIActionSheet+ChatSecure.m
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by David Chiles on 10/24/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "UIActionSheet+ChatSecure.h"
|
||||
#import "OTRAppDelegate.h"
|
||||
|
||||
@implementation UIActionSheet (ChatSecure)
|
||||
|
||||
- (void)otr_presentInView:(UIView *)view
|
||||
{
|
||||
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
|
||||
[self showInView:view];
|
||||
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
||||
[self showInView:[OTRAppDelegate appDelegate].window];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,21 +0,0 @@
|
|||
//
|
||||
// OTROAuthRefresher.h
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 3/28/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
@import Foundation;
|
||||
|
||||
@class GTMOAuth2Authentication;
|
||||
@class FBAccessTokenData;
|
||||
@class OTROAuthXMPPAccount;
|
||||
|
||||
typedef void(^OTROAuthCompletionBlock)(id token,NSError *);
|
||||
|
||||
@interface OTROAuthRefresher : NSObject
|
||||
|
||||
+ (void)refreshAccount:(OTROAuthXMPPAccount *)account completion:(OTROAuthCompletionBlock)completionBlock;
|
||||
|
||||
@end
|
|
@ -1,41 +0,0 @@
|
|||
//
|
||||
// OTROAuthRefresher.m
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 3/28/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTROAuthRefresher.h"
|
||||
|
||||
#import "GTMOAuth2Authentication.h"
|
||||
#import "OTRSecrets.h"
|
||||
#import "OTRConstants.h"
|
||||
|
||||
#import "OTROAuthXMPPAccount.h"
|
||||
|
||||
|
||||
@implementation OTROAuthRefresher
|
||||
|
||||
+ (void)refreshGoogleToken:(GTMOAuth2Authentication *)authToken completion:(OTROAuthCompletionBlock)completionBlock
|
||||
{
|
||||
[authToken authorizeRequest:nil completionHandler:^(NSError *error) {
|
||||
if (completionBlock) {
|
||||
if (!error) {
|
||||
completionBlock(authToken,nil);
|
||||
}
|
||||
else {
|
||||
completionBlock(nil,error);
|
||||
}
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
+ (void)refreshAccount:(OTROAuthXMPPAccount *)account completion:(OTROAuthCompletionBlock)completionBlock
|
||||
{
|
||||
if (account.accountType == OTRAccountTypeGoogleTalk) {
|
||||
[self refreshGoogleToken:[account accountSpecificToken] completion:completionBlock];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,144 +0,0 @@
|
|||
//
|
||||
// OTRProtocolManager.swift
|
||||
// ChatSecureCore
|
||||
//
|
||||
// Created by Chris Ballinger on 1/22/18.
|
||||
// Copyright © 2018 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import OTRAssets
|
||||
|
||||
@objc
|
||||
public class OTRProtocolManager: NSObject {
|
||||
private var protocols: [String:OTRProtocol] = [:]
|
||||
private var xmppManagers: [XMPPManager] {
|
||||
return protocols.values.compactMap { $0 as? XMPPManager }
|
||||
}
|
||||
|
||||
@objc
|
||||
public func existsProtocolForAccount(_ account: OTRAccount) -> Bool {
|
||||
return existsProtocol(for: account)
|
||||
}
|
||||
|
||||
public func existsProtocol(for account: OTRAccount) -> Bool {
|
||||
return protocols[account.uniqueId] != nil
|
||||
}
|
||||
|
||||
@objc
|
||||
public func protocolForAccount(_ account: OTRAccount) -> OTRProtocol? {
|
||||
return protocols[account.uniqueId]
|
||||
}
|
||||
|
||||
public func `protocol`(for account: OTRAccount) -> OTRProtocol? {
|
||||
return protocolForAccount(account)
|
||||
}
|
||||
|
||||
@objc
|
||||
public func xmppManagerForAccount(_ account: OTRAccount) -> XMPPManager? {
|
||||
return xmppManager(for: account)
|
||||
}
|
||||
|
||||
public func xmppManager(for account: OTRAccount) -> XMPPManager? {
|
||||
return protocolForAccount(account) as? XMPPManager
|
||||
}
|
||||
|
||||
@objc
|
||||
public func removeProtocolForAccount(_ account: OTRAccount) {
|
||||
removeProtocolForAccount(account)
|
||||
}
|
||||
|
||||
public func removeProtocol(for account: OTRAccount) {
|
||||
protocols[account.uniqueId] = nil
|
||||
}
|
||||
|
||||
@objc
|
||||
public func isAccountConnected(_ account: OTRAccount) -> Bool {
|
||||
return xmppManager(for: account)?.loginStatus == .authenticated
|
||||
}
|
||||
|
||||
@objc
|
||||
public func loginAccount(_ account: OTRAccount) {
|
||||
loginAccount(account, userInitiated: false)
|
||||
}
|
||||
|
||||
@objc
|
||||
public func loginAccount(_ account: OTRAccount, userInitiated: Bool) {
|
||||
xmppManager(for: account)?.connectUserInitiated(userInitiated)
|
||||
}
|
||||
|
||||
@objc
|
||||
public func loginAccounts(_ accounts: [OTRAccount]) {
|
||||
accounts.forEach {
|
||||
self.loginAccount($0)
|
||||
}
|
||||
}
|
||||
|
||||
@objc
|
||||
public func goAwayForAllAccounts() {
|
||||
xmppManagers.forEach {
|
||||
$0.goAway()
|
||||
}
|
||||
}
|
||||
|
||||
@objc
|
||||
public func sendMessage(_ message: OTROutgoingMessage) {
|
||||
send(message)
|
||||
}
|
||||
|
||||
/// This should probably be moved elsewhere
|
||||
public func send(_ message: OTROutgoingMessage) {
|
||||
let _account = OTRDatabaseManager.shared.connections?.read.fetch {
|
||||
message.buddy(with: $0)?.account(with: $0)
|
||||
}
|
||||
guard let account = _account else { return }
|
||||
xmppManager(for: account)?.send(message)
|
||||
}
|
||||
|
||||
@objc
|
||||
public func disconnectAllAccounts() {
|
||||
disconnectAllAccountsSocketOnly(false, timeout: 0, completionBlock: nil)
|
||||
}
|
||||
|
||||
@objc
|
||||
public func disconnectAllAccountsSocketOnly(_ socketOnly: Bool,
|
||||
timeout: TimeInterval,
|
||||
completionBlock: (()->Void)?) {
|
||||
let group = DispatchGroup()
|
||||
var observers: [NSKeyValueObservation] = []
|
||||
xmppManagers.forEach { (xmpp) in
|
||||
guard xmpp.loginStatus != .disconnected else {
|
||||
return
|
||||
}
|
||||
group.enter()
|
||||
let observer = xmpp.observe(\.loginStatus, changeHandler: { (xmpp, change) in
|
||||
if xmpp.loginStatus == .disconnected {
|
||||
group.leave()
|
||||
}
|
||||
})
|
||||
observers.append(observer)
|
||||
xmpp.disconnectSocketOnly(socketOnly)
|
||||
}
|
||||
group.notify(queue: .main) {
|
||||
observers.removeAll()
|
||||
completionBlock?()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public extension OTRProtocolManager {
|
||||
#if DEBUG
|
||||
/// when OTRBranding.pushStagingAPIURL is nil (during tests) a valid value must be supplied for the integration tests to pass
|
||||
private static let pushApiEndpoint: URL = OTRBranding.pushStagingAPIURL ?? URL(string: "http://localhost")!
|
||||
#else
|
||||
private static let pushApiEndpoint: URL = OTRBranding.pushAPIURL
|
||||
#endif
|
||||
|
||||
@objc public static let encryptionManager = OTREncryptionManager()
|
||||
@objc public static let shared = OTRProtocolManager()
|
||||
@objc public static func sharedInstance() -> OTRProtocolManager {
|
||||
return OTRProtocolManager.shared
|
||||
}
|
||||
|
||||
@objc public static let pushController = PushController(baseURL: OTRProtocolManager.pushApiEndpoint, sessionConfiguration: URLSessionConfiguration.ephemeral)
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
//
|
||||
// OTRPurchaseController.h
|
||||
// Off the Record
|
||||
//
|
||||
// Created by Christopher Ballinger on 9/28/12.
|
||||
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
// This file is part of ChatSecure.
|
||||
//
|
||||
// ChatSecure is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ChatSecure is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <StoreKit/StoreKit.h>
|
||||
#import "OTRStoreTableViewCell.h"
|
||||
|
||||
#define kOTRPurchaseControllerProductUpdateNotification @"kOTRPurchaseControllerProductUpdateNotification"
|
||||
|
||||
@protocol OTRPurchaseControllerDelegate <NSObject>
|
||||
@required
|
||||
- (void) productsUpdated:(NSArray*)products;
|
||||
@end
|
||||
|
||||
@interface OTRPurchaseController : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver>
|
||||
|
||||
@property (nonatomic, weak) id<OTRPurchaseControllerDelegate> delegate;
|
||||
@property (nonatomic, strong) NSArray *products;
|
||||
|
||||
- (void) requestProducts;
|
||||
- (void) buyProduct:(SKProduct *)product;
|
||||
- (void) restorePurchases;
|
||||
|
||||
- (BOOL) isProductIdentifierPurchased:(NSString*)productIdentifier;
|
||||
- (void) setProductIdentifier:(NSString*)productIdentifier purchased:(BOOL)purchased;
|
||||
|
||||
+ (OTRPurchaseController*) sharedInstance;
|
||||
|
||||
@end
|
|
@ -1,176 +0,0 @@
|
|||
//
|
||||
// OTRPurchaseController.m
|
||||
// Off the Record
|
||||
//
|
||||
// Created by Christopher Ballinger on 9/28/12.
|
||||
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
// This file is part of ChatSecure.
|
||||
//
|
||||
// ChatSecure is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ChatSecure is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#import "OTRPurchaseController.h"
|
||||
#import "AFNetworking.h"
|
||||
#import "Strings.h"
|
||||
#import "OTRPushAPIClient.h"
|
||||
|
||||
#define REQUEST_PRODUCT_IDENTIFIERS @"request_product_identifiers"
|
||||
#define PRODUCT_IDENTIFIERS_KEY @"identifiers"
|
||||
|
||||
#define PRODUCTS_KEY @"products"
|
||||
|
||||
@implementation OTRPurchaseController
|
||||
@synthesize products;
|
||||
|
||||
- (void) dealloc {
|
||||
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
|
||||
}
|
||||
|
||||
- (id) init {
|
||||
if (self = [super init]) {
|
||||
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (OTRPurchaseController*)sharedInstance
|
||||
{
|
||||
static dispatch_once_t once;
|
||||
static OTRPurchaseController *sharedInstance;
|
||||
dispatch_once(&once, ^{
|
||||
sharedInstance = [[OTRPurchaseController alloc] init];
|
||||
});
|
||||
return sharedInstance;
|
||||
}
|
||||
|
||||
- (void) requestProducts {
|
||||
if (products) {
|
||||
[self.delegate productsUpdated:products];
|
||||
} else {
|
||||
[self requestProductIdentifiers];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) requestProductIdentifiers {
|
||||
// Code to request product identifiers here
|
||||
NSURL *requestURL = [NSURL URLWithString:REQUEST_PRODUCT_IDENTIFIERS relativeToURL:[OTRPushAPIClient sharedClient].baseURL];
|
||||
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
|
||||
[manager GET:requestURL.absoluteString parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
|
||||
[self fetchProductsWithIdentifiers:[NSSet setWithArray:[responseObject objectForKey:PRODUCT_IDENTIFIERS_KEY]]];
|
||||
} failure:^(NSURLSessionDataTask *task, NSError *error) {
|
||||
NSLog(@"Error loading product identifiers: %@%@", [error localizedDescription], [error userInfo]);
|
||||
}];
|
||||
}
|
||||
|
||||
- (void) fetchProductsWithIdentifiers:(NSSet*)identifiers {
|
||||
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:identifiers];
|
||||
request.delegate = self;
|
||||
[request start];
|
||||
}
|
||||
|
||||
|
||||
- (void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
|
||||
if ([response.invalidProductIdentifiers count] > 0) {
|
||||
NSLog(@"Invalid products identifiers: %@", [response.invalidProductIdentifiers description]);
|
||||
}
|
||||
self.products = response.products;
|
||||
[self.delegate productsUpdated:products];
|
||||
}
|
||||
|
||||
- (void) buyProduct:(SKProduct *)product {
|
||||
if ([SKPaymentQueue canMakePayments]) {
|
||||
SKPayment *payment = [SKPayment paymentWithProduct:product];
|
||||
[[SKPaymentQueue defaultQueue] addPayment:payment];
|
||||
} else {
|
||||
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:ERROR_STRING message:PAYMENTS_SETUP_ERROR_STRING delegate:nil cancelButtonTitle:nil otherButtonTitles:OK_STRING, nil];
|
||||
[alert show];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
|
||||
for (SKPaymentTransaction *transaction in transactions) {
|
||||
NSLog(@"Transaction: %@", transaction.transactionIdentifier);
|
||||
switch (transaction.transactionState) {
|
||||
case SKPaymentTransactionStatePurchased:
|
||||
NSLog(@"Transaction purchased");
|
||||
//[[OTRPushController sharedInstance] registerWithReceipt:transaction.transactionReceipt resetAccount:NO];
|
||||
[self setProductIdentifier:transaction.payment.productIdentifier purchased:YES];
|
||||
[self sendProductUpdateNotification];
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
|
||||
break;
|
||||
case SKPaymentTransactionStateFailed:
|
||||
NSLog(@"Transaction failed");
|
||||
[self sendProductUpdateNotification];
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
|
||||
break;
|
||||
case SKPaymentTransactionStateRestored:
|
||||
NSLog(@"Original transaction restored: %@", transaction.originalTransaction.transactionIdentifier);
|
||||
//[[OTRPushController sharedInstance] registerWithReceipt:transaction.transactionReceipt resetAccount:YES];
|
||||
[self setProductIdentifier:transaction.payment.productIdentifier purchased:YES];
|
||||
[self sendProductUpdateNotification];
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
|
||||
NSLog(@"Transaction restored");
|
||||
break;
|
||||
case SKPaymentTransactionStatePurchasing:
|
||||
NSLog(@"Purchasing transaction... ");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void) sendProductUpdateNotification {
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:kOTRPurchaseControllerProductUpdateNotification object:self];
|
||||
}
|
||||
|
||||
- (BOOL) isProductIdentifierPurchased:(NSString*)productIdentifier {
|
||||
NSMutableDictionary *productsDictionary = [self productsDictionary];
|
||||
NSNumber *productValue = [productsDictionary objectForKey:productIdentifier];
|
||||
if (!productValue) {
|
||||
return NO;
|
||||
}
|
||||
return [productValue boolValue];
|
||||
}
|
||||
|
||||
- (NSMutableDictionary*) productsDictionary {
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
NSMutableDictionary *productDictionary = [NSMutableDictionary dictionaryWithDictionary:[defaults objectForKey:PRODUCTS_KEY]];
|
||||
if (!productDictionary) {
|
||||
productDictionary = [NSMutableDictionary dictionary];
|
||||
}
|
||||
return productDictionary;
|
||||
}
|
||||
|
||||
- (void) saveProductsDictionary:(NSMutableDictionary*)productsDictionary {
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
[defaults setObject:productsDictionary forKey:PRODUCTS_KEY];
|
||||
BOOL success = [defaults synchronize];
|
||||
if (!success) {
|
||||
NSLog(@"Product preferences not saved to disk!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void) setProductIdentifier:(NSString*)productIdentifier purchased:(BOOL)purchased {
|
||||
NSMutableDictionary *productsDictionary = [self productsDictionary];
|
||||
[productsDictionary setObject:[NSNumber numberWithBool:purchased] forKey:productIdentifier];
|
||||
[self saveProductsDictionary:productsDictionary];
|
||||
}
|
||||
|
||||
- (void) restorePurchases {
|
||||
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,20 +0,0 @@
|
|||
//
|
||||
// OTRPushTLVHandler.h
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by David Chiles on 9/28/15.
|
||||
// Copyright © 2015 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
@import Foundation;
|
||||
@import OTRKit;
|
||||
#import "OTRPushTLVHandlerProtocols.h"
|
||||
|
||||
@interface OTRPushTLVHandler : NSObject <OTRTLVHandler, OTRPushTLVHandlerProtocol>
|
||||
|
||||
@property (nonatomic, weak, readwrite) id<OTRPushTLVHandlerDelegate> delegate;
|
||||
@property (nonatomic, weak, readwrite) OTRKit *otrKit;
|
||||
|
||||
- (instancetype)initWithOTRKit:(OTRKit *)otrKit delegate:(id<OTRPushTLVHandlerDelegate>)delegate;
|
||||
|
||||
@end
|
|
@ -1,43 +0,0 @@
|
|||
//
|
||||
// OTRPushTLVHandler.m
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by David Chiles on 9/28/15.
|
||||
// Copyright © 2015 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTRPushTLVHandler.h"
|
||||
@import OTRKit;
|
||||
|
||||
static const uint16_t OTRPushTLVType = 0x01A4;
|
||||
|
||||
@implementation OTRPushTLVHandler
|
||||
|
||||
- (instancetype)initWithOTRKit:(OTRKit *)otrKit delegate:(id<OTRPushTLVHandlerDelegate>)delegate;
|
||||
{
|
||||
if (self = [self init]) {
|
||||
self.otrKit = otrKit;
|
||||
self.delegate = delegate;
|
||||
[self.otrKit registerTLVHandler:self];
|
||||
}
|
||||
return self;
|
||||
|
||||
}
|
||||
|
||||
- (NSArray *)handledTLVTypes
|
||||
{
|
||||
return @[@(OTRPushTLVType)];
|
||||
}
|
||||
|
||||
- (void)receiveTLV:(OTRTLV *)tlv username:(NSString *)username accountName:(NSString *)accountName protocol:(NSString *)protocol fingerprint:(OTRFingerprint *)fingerprint tag:(id)tag
|
||||
{
|
||||
[self.delegate receivePushData:tlv.data username:username accountName:accountName protocolString:protocol fingerprint:fingerprint];
|
||||
}
|
||||
|
||||
- (void)sendPushData:(NSData *)data username:(NSString *)username accountName:(NSString *)accountName protocol:(NSString *)protocol
|
||||
{
|
||||
OTRTLV *tlv = [[OTRTLV alloc] initWithType:OTRPushTLVType data:data];
|
||||
[self.otrKit encodeMessage:nil tlvs:@[tlv] username:username accountName:accountName protocol:protocol tag:nil];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,28 +0,0 @@
|
|||
//
|
||||
// OTRPushTLVHandlerDelegateProtocol.h
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by David Chiles on 9/28/15.
|
||||
// Copyright © 2015 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
@class OTRFingerprint;
|
||||
@protocol OTRPushTLVHandlerDelegate
|
||||
|
||||
@required
|
||||
- (void)receivePushData:(NSData *)tlvData
|
||||
username:(NSString *)username
|
||||
accountName:(NSString *)accountName
|
||||
protocolString:(NSString *)protocolString
|
||||
fingerprint:(OTRFingerprint *)fingerprint;
|
||||
|
||||
@end
|
||||
|
||||
@protocol OTRPushTLVHandlerProtocol
|
||||
|
||||
@required
|
||||
- (void)sendPushData:(NSData *)data
|
||||
username:(NSString *)username
|
||||
accountName:(NSString *)accountName
|
||||
protocol:(NSString *)protocol;
|
||||
|
||||
@end
|
|
@ -1,55 +0,0 @@
|
|||
//
|
||||
// OTROTRSignalEncryptionHelper.swift
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by David Chiles on 10/3/16.
|
||||
// Copyright © 2016 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import OTRKit
|
||||
|
||||
class OTRSignalEncryptionHelper {
|
||||
|
||||
/**
|
||||
Encrypt data with IV and key using aes-128-gcm
|
||||
|
||||
- parameter data: The data to be encrypted.
|
||||
- parameter key The symmetric key
|
||||
- parameter iv The initialization vector
|
||||
|
||||
returns: The encrypted data
|
||||
*/
|
||||
class func encryptData(_ data:Data, key:Data, iv:Data) throws -> OTRCryptoData? {
|
||||
return try OTRCryptoUtility.encryptAESGCMData(data, key: key, iv: iv)
|
||||
}
|
||||
|
||||
/**
|
||||
Decrypt data with IV and key using aes-128-gcm
|
||||
|
||||
- parameter data: The data to be decrypted.
|
||||
- parameter key The symmetric key
|
||||
- parameter iv The initialization vector
|
||||
|
||||
returns: The Decrypted data
|
||||
*/
|
||||
class func decryptData(_ data:Data, key:Data, iv:Data, authTag:Data) throws -> Data? {
|
||||
let cryptoData = OTRCryptoData(data: data, authTag: authTag)
|
||||
return try OTRCryptoUtility.decryptAESGCMData(cryptoData, key: key, iv: iv)
|
||||
}
|
||||
|
||||
/** Generates random data of length 16 bytes */
|
||||
fileprivate class func randomDataOfBlockLength() -> Data? {
|
||||
return OTRPasswordGenerator.randomData(withLength: 16)
|
||||
}
|
||||
|
||||
/** Generates random key of length 16 bytes*/
|
||||
class func generateSymmetricKey() -> Data? {
|
||||
return self.randomDataOfBlockLength()
|
||||
}
|
||||
/** Generates random iv of length 16 bytes */
|
||||
class func generateIV() -> Data? {
|
||||
return self.randomDataOfBlockLength()
|
||||
}
|
||||
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
//
|
||||
// OTRTorManager.m
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by Christopher Ballinger on 10/3/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTRTorManager.h"
|
||||
|
||||
@import CPAProxy;
|
||||
|
||||
@implementation OTRTorManager
|
||||
|
||||
- (instancetype) init {
|
||||
if (self = [super init]) {
|
||||
// Get resource paths for the torrc and geoip files from the main bundle
|
||||
NSBundle *cpaProxyFrameworkBundle = [NSBundle bundleForClass:[CPAProxyManager class]];
|
||||
NSURL *cpaProxyBundleURL = [cpaProxyFrameworkBundle URLForResource:@"CPAProxy" withExtension:@"bundle"];
|
||||
NSBundle *cpaProxyBundle = [[NSBundle alloc] initWithURL:cpaProxyBundleURL];
|
||||
NSParameterAssert(cpaProxyBundle != nil);
|
||||
|
||||
NSString *torrcPath = [[NSBundle mainBundle] pathForResource:@"torrc" ofType:nil]; // use custom torrc
|
||||
NSString *geoipPath = [cpaProxyBundle pathForResource:@"geoip" ofType:nil];
|
||||
NSString *dataDirectory = [[[[[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"com.ChatSecure.Tor"] path];
|
||||
|
||||
// Initialize a CPAProxyManager
|
||||
CPAConfiguration *configuration = [CPAConfiguration configurationWithTorrcPath:torrcPath geoipPath:geoipPath torDataDirectoryPath:dataDirectory];
|
||||
configuration.isolateDestinationAddress = YES;
|
||||
configuration.isolateDestinationPort = YES;
|
||||
self.torManager = [CPAProxyManager proxyWithConfiguration:configuration];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
#pragma - mark Singleton Methodd
|
||||
|
||||
+ (instancetype)sharedInstance
|
||||
{
|
||||
static id _sharedInstance = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
_sharedInstance = [[self alloc] init];
|
||||
});
|
||||
|
||||
return _sharedInstance;
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,90 +0,0 @@
|
|||
//
|
||||
// PushOTRListener.swift
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by David Chiles on 9/29/15.
|
||||
// Copyright © 2015 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import ChatSecure_Push_iOS
|
||||
|
||||
/**
|
||||
* Listen for changes from EncryptionManager for changes in state and when detetced going encrypted
|
||||
* ensures push token is transfered
|
||||
*/
|
||||
class PushOTRListener: NSObject {
|
||||
|
||||
let queue = OperationQueue()
|
||||
var notification:NSObjectProtocol?
|
||||
weak var storage:PushStorageProtocol?
|
||||
weak var pushController:PushController?
|
||||
weak var tlvHandler:OTRPushTLVHandlerProtocol?
|
||||
|
||||
init (storage:PushStorageProtocol?, pushController:PushController?, tlvHandler:OTRPushTLVHandlerProtocol?) {
|
||||
self.storage = storage
|
||||
self.pushController = pushController
|
||||
self.tlvHandler = tlvHandler
|
||||
super.init()
|
||||
self.startObserving()
|
||||
}
|
||||
|
||||
func startObserving() {
|
||||
self.notification = NotificationCenter.default.addObserver(forName: NSNotification.Name.OTRMessageStateDidChange, object: nil, queue: self.queue) {[weak self] (notification) -> Void in
|
||||
self?.handleNotification(notification)
|
||||
}
|
||||
}
|
||||
|
||||
func handleNotification(_ notification:Notification) {
|
||||
guard let buddy = notification.object as? OTRBuddy else {
|
||||
return
|
||||
}
|
||||
|
||||
if let dictionary = notification.userInfo as? [String:AnyObject] {
|
||||
let number = dictionary[OTRMessageStateKey] as? NSNumber
|
||||
if let enumValue = number?.uintValue, enumValue == OTREncryptionMessageState.encrypted.rawValue {
|
||||
|
||||
|
||||
if let account = self.storage?.account(buddy.accountUniqueId) {
|
||||
//Everytime we're starting a new OTR Session we resend a new fresh push token either from the server or the cache
|
||||
self.pushController?.getNewPushToken(buddy.uniqueId, completion: {[weak self] (t, error) -> Void in
|
||||
if let token = t, let pushToken = token.pushToken {
|
||||
do {
|
||||
try self?.sendOffToken(pushToken, buddyUsername: buddy.username, accountUsername: account.username, protocol: account.protocolTypeString())
|
||||
} catch let error as NSError {
|
||||
|
||||
if (error.code == PushError.misingExpiresDate.rawValue) {
|
||||
self?.pushController?.storage.removeToken(token)
|
||||
//Somehow we got a token without a expires date. We need to clear the database of these tokens and try again
|
||||
guard let timeBuffer = self?.pushController?.timeBufffer else {
|
||||
return
|
||||
}
|
||||
|
||||
self?.pushController?.storage.removeAllOurExpiredUnusedTokens(timeBuffer, completion: { (count) in
|
||||
//try again
|
||||
self?.handleNotification(notification)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func sendOffToken(_ token:Token, buddyUsername:String, accountUsername:String, protocol:String) throws -> Void {
|
||||
if let url = self.pushController?.apiClient.messageEndpont().absoluteString {
|
||||
if let data = try PushSerializer.serialize([token], APIEndpoint: url) {
|
||||
self.tlvHandler?.sendPush(data, username: buddyUsername, accountName:accountUsername , protocol: `protocol`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
deinit {
|
||||
if let token = self.notification {
|
||||
NotificationCenter.default.removeObserver(token)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
//
|
||||
// OTRXMPPStream.h
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by Chris Ballinger on 2/3/17.
|
||||
// Copyright © 2017 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
@import Foundation;
|
||||
@import XMPPFramework;
|
||||
|
||||
@interface OTRXMPPStream : XMPPStream
|
||||
|
||||
/**
|
||||
* The connected servers hostname. The last attempted hostname before the socket actually connects to an IP address (e.g. after SRV lookup)
|
||||
**/
|
||||
@property (nonatomic, readonly, nullable) NSString *connectedHostName;
|
||||
|
||||
@end
|
|
@ -1,24 +0,0 @@
|
|||
//
|
||||
// OTRXMPPStream.m
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by Chris Ballinger on 2/3/17.
|
||||
// Copyright © 2017 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTRXMPPStream.h"
|
||||
|
||||
@interface XMPPStream(Overrides)
|
||||
- (BOOL)connectToHost:(NSString *)host onPort:(UInt16)port withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr;
|
||||
@end
|
||||
|
||||
@implementation OTRXMPPStream
|
||||
|
||||
/** Override */
|
||||
- (BOOL)connectToHost:(NSString *)host onPort:(UInt16)port withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr
|
||||
{
|
||||
_connectedHostName = [host copy];
|
||||
return [super connectToHost:host onPort:port withTimeout:timeout error:errPtr];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,13 +0,0 @@
|
|||
//
|
||||
// OTRFacebookOAuthXMPPAccount.h
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 3/28/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTROAuthXMPPAccount.h"
|
||||
|
||||
@interface OTRFacebookOAuthXMPPAccount : OTROAuthXMPPAccount
|
||||
|
||||
@end
|
|
@ -1,13 +0,0 @@
|
|||
//
|
||||
// OTRFacebookOAuthXMPPAccount.m
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 3/28/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTRFacebookOAuthXMPPAccount.h"
|
||||
|
||||
@implementation OTRFacebookOAuthXMPPAccount
|
||||
|
||||
@end
|
|
@ -1,13 +0,0 @@
|
|||
//
|
||||
// OTRGoogleOAuthXMPPAccount.h
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 3/28/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTROAuthXMPPAccount.h"
|
||||
|
||||
@interface OTRGoogleOAuthXMPPAccount : OTROAuthXMPPAccount
|
||||
|
||||
@end
|
|
@ -1,98 +0,0 @@
|
|||
//
|
||||
// OTRGoogleOAuthXMPPAccount.m
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 3/28/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTRGoogleOAuthXMPPAccount.h"
|
||||
@import gtm_oauth2;
|
||||
@import OTRAssets;
|
||||
#import "OTRConstants.h"
|
||||
|
||||
|
||||
NSString *const kOTRExpirationDateKey = @"kOTRExpirationDateKey";
|
||||
NSString *const kOTRExpiresInKey = @"expires_in";
|
||||
|
||||
|
||||
@implementation OTRGoogleOAuthXMPPAccount
|
||||
|
||||
- (UIImage *)accountImage
|
||||
{
|
||||
return [UIImage imageNamed:OTRGoogleTalkImageName inBundle:[OTRAssets resourcesBundle] compatibleWithTraitCollection:nil];
|
||||
}
|
||||
|
||||
-(NSString *)accessTokenString {
|
||||
return [self authToken].accessToken;
|
||||
}
|
||||
|
||||
-(void)setOAuthTokenDictionary:(NSDictionary *)oAuthTokenDictionary
|
||||
{
|
||||
if ([oAuthTokenDictionary count]) {
|
||||
NSMutableDictionary * mutableTokenDictionary = [oAuthTokenDictionary mutableCopy];
|
||||
NSNumber * expiresIn = [mutableTokenDictionary objectForKey:kOTRExpiresInKey];
|
||||
[mutableTokenDictionary removeObjectForKey:kOTRExpiresInKey];
|
||||
NSDate *date = nil;
|
||||
if (expiresIn) {
|
||||
unsigned long deltaSeconds = [expiresIn unsignedLongValue];
|
||||
if (deltaSeconds > 0) {
|
||||
date = [NSDate dateWithTimeIntervalSinceNow:deltaSeconds];
|
||||
}
|
||||
}
|
||||
if(date) {
|
||||
[mutableTokenDictionary setObject:date forKey:kOTRExpirationDateKey];
|
||||
}
|
||||
oAuthTokenDictionary = mutableTokenDictionary;
|
||||
}
|
||||
[super setOAuthTokenDictionary:oAuthTokenDictionary];
|
||||
}
|
||||
|
||||
-(NSDictionary *)oAuthTokenDictionary
|
||||
{
|
||||
NSMutableDictionary * mutableTokenDictionary = [[super oAuthTokenDictionary] mutableCopy];
|
||||
NSDate * expirationDate = [mutableTokenDictionary objectForKey:kOTRExpirationDateKey];
|
||||
|
||||
NSTimeInterval timeInterval = [expirationDate timeIntervalSinceDate:[NSDate date]];
|
||||
mutableTokenDictionary[kOTRExpiresInKey] = @(timeInterval);
|
||||
return mutableTokenDictionary;
|
||||
}
|
||||
|
||||
-(GTMOAuth2Authentication *)authToken
|
||||
{
|
||||
GTMOAuth2Authentication * auth = nil;
|
||||
NSDictionary * tokenDictionary = [self oAuthTokenDictionary];
|
||||
if ([tokenDictionary count]) {
|
||||
auth = [[GTMOAuth2Authentication alloc] init];
|
||||
[auth setParameters:[tokenDictionary mutableCopy]];
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
auth.clientID = [OTRBranding googleAppId];
|
||||
auth.clientSecret = [OTRSecrets googleAppSecret];
|
||||
auth.scope = [OTRBranding googleAppScope];
|
||||
auth.tokenURL = [GTMOAuth2SignIn googleTokenURL];
|
||||
return auth;
|
||||
}
|
||||
|
||||
- (id)accountSpecificToken
|
||||
{
|
||||
return [self authToken];
|
||||
}
|
||||
|
||||
- (void)setAccountSpecificToken:(id)accountSpecificToken
|
||||
{
|
||||
if ([accountSpecificToken isKindOfClass:[GTMOAuth2Authentication class]]) {
|
||||
GTMOAuth2Authentication *token = (GTMOAuth2Authentication *)accountSpecificToken;
|
||||
[self setOAuthTokenDictionary:token.parameters];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma - mark Class Methods
|
||||
|
||||
+ (NSString *)collection
|
||||
{
|
||||
return NSStringFromClass([OTRAccount class]);
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,16 +0,0 @@
|
|||
//
|
||||
// OTROAuthXMPPAccount.h
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 3/28/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTRXMPPAccount.h"
|
||||
|
||||
@interface OTROAuthXMPPAccount : OTRXMPPAccount
|
||||
|
||||
@property (nonatomic, strong) NSDictionary *oAuthTokenDictionary;
|
||||
@property (nonatomic, strong) id accountSpecificToken;
|
||||
|
||||
@end
|
|
@ -1,94 +0,0 @@
|
|||
//
|
||||
// OTROAuthXMPPAccount.m
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 3/28/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTROAuthXMPPAccount.h"
|
||||
@import SAMKeychain;
|
||||
#import "OTRLog.h"
|
||||
#import "OTRConstants.h"
|
||||
|
||||
@implementation OTROAuthXMPPAccount
|
||||
|
||||
-(void)setPassword:(NSString *)password
|
||||
{
|
||||
if(![password length])
|
||||
{
|
||||
[self setOAuthTokenDictionary:nil];
|
||||
}
|
||||
}
|
||||
-(NSString *)password
|
||||
{
|
||||
return [self accessTokenString];
|
||||
}
|
||||
|
||||
-(NSString *)accessTokenString
|
||||
{
|
||||
return @"";
|
||||
}
|
||||
|
||||
-(void)setOAuthTokenDictionary:(NSDictionary *)oAuthTokenDictionary
|
||||
{
|
||||
if (![oAuthTokenDictionary count]) {
|
||||
[super setPassword:nil];
|
||||
}
|
||||
else {
|
||||
NSError *error = nil;
|
||||
|
||||
SAMKeychainQuery * keychainQuery = [self baseKeychainQuery];
|
||||
|
||||
keychainQuery.passwordObject = oAuthTokenDictionary;
|
||||
|
||||
[keychainQuery save:&error];
|
||||
|
||||
if (error) {
|
||||
DDLogError(@"Error saving password to keychain: %@%@", [error localizedDescription], [error userInfo]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (NSDictionary *)oAuthTokenDictionary
|
||||
{
|
||||
NSError * error = nil;
|
||||
NSDictionary *dictionary = nil;
|
||||
|
||||
SAMKeychainQuery * keychainQuery = [self baseKeychainQuery];
|
||||
[keychainQuery fetch:&error];
|
||||
|
||||
if (error) {
|
||||
DDLogError(@"Error retreiving password from keychain: %@%@", [error localizedDescription], [error userInfo]);
|
||||
error = nil;
|
||||
}
|
||||
else {
|
||||
dictionary = (NSDictionary *)keychainQuery.passwordObject;
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
-(SAMKeychainQuery *)baseKeychainQuery
|
||||
{
|
||||
SAMKeychainQuery * keychainQuery = [[SAMKeychainQuery alloc] init];
|
||||
keychainQuery.service = kOTRServiceName;
|
||||
keychainQuery.account = self.uniqueId;
|
||||
return keychainQuery;
|
||||
}
|
||||
|
||||
|
||||
#pragma - mark Class Methods
|
||||
|
||||
+ (NSString *)collection
|
||||
{
|
||||
return NSStringFromClass([OTRAccount class]);
|
||||
}
|
||||
|
||||
+ (NSDictionary*) encodingBehaviorsByPropertyKey {
|
||||
NSMutableDictionary *encodingBehaviors = [NSMutableDictionary dictionaryWithDictionary:[super encodingBehaviorsByPropertyKey]];
|
||||
[encodingBehaviors setObject:@(MTLModelEncodingBehaviorExcluded) forKey:NSStringFromSelector(@selector(accountSpecificToken))];
|
||||
[encodingBehaviors setObject:@(MTLModelEncodingBehaviorExcluded) forKey:NSStringFromSelector(@selector(oAuthTokenDictionary))];
|
||||
return encodingBehaviors;
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,14 +0,0 @@
|
|||
//
|
||||
// OTRGoolgeOAuthLoginHandler.h
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by David Chiles on 5/13/15.
|
||||
// Copyright (c) 2015 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
@import Foundation;
|
||||
#import "OTRXMPPLoginHandler.h"
|
||||
|
||||
@interface OTRGoolgeOAuthLoginHandler : OTRXMPPLoginHandler
|
||||
|
||||
@end
|
|
@ -1,36 +0,0 @@
|
|||
//
|
||||
// OTRGoolgeOAuthLoginHandler.m
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by David Chiles on 5/13/15.
|
||||
// Copyright (c) 2015 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTRGoolgeOAuthLoginHandler.h"
|
||||
#import "OTRGoogleOAuthXMPPAccount.h"
|
||||
#import "OTROAuthRefresher.h"
|
||||
#import "OTRXMPPLoginHandler.h"
|
||||
#import "OTRXMPPManager.h"
|
||||
|
||||
@implementation OTRGoolgeOAuthLoginHandler
|
||||
|
||||
- (void)performActionWithValidForm:(XLFormDescriptor *)form account:(OTROAuthXMPPAccount *)account progress:(void (^)(NSInteger progress, NSString *summaryString))progress completion:(void (^)(OTRAccount * account, NSError *error))completion
|
||||
{
|
||||
[OTROAuthRefresher refreshAccount:account completion:^(id token, NSError *error) {
|
||||
if (!error) {
|
||||
account.accountSpecificToken = token;
|
||||
[super performActionWithValidForm:form account:account progress:progress completion:completion];
|
||||
} else if (completion) {
|
||||
//Error refreshing account
|
||||
completion(account, error);
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
// Override superclass to prevent password clash
|
||||
- (void) finishConnectingWithForm:(XLFormDescriptor *)form account:(OTRXMPPAccount *)account {
|
||||
[self prepareForXMPPConnectionFrom:form account:account];
|
||||
[self.xmppManager connectUserInitiated:YES];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,36 +0,0 @@
|
|||
//
|
||||
// OTRStoreViewController.h
|
||||
// Off the Record
|
||||
//
|
||||
// Created by Christopher Ballinger on 9/28/12.
|
||||
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
// This file is part of ChatSecure.
|
||||
//
|
||||
// ChatSecure is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ChatSecure is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <StoreKit/StoreKit.h>
|
||||
#import "OTRStoreTableViewCell.h"
|
||||
#import "OTRPurchaseController.h"
|
||||
#import "OTRPushController.h"
|
||||
|
||||
@interface OTRStoreViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, OTRPurchaseControllerDelegate>
|
||||
|
||||
@property (nonatomic, weak) OTRPurchaseController *purchaseController;
|
||||
@property (nonatomic, weak) OTRPushController *pushController;
|
||||
@property (nonatomic, weak) NSArray *products;
|
||||
@property (nonatomic, strong) UITableView *productTableView;
|
||||
|
||||
@end
|
|
@ -1,186 +0,0 @@
|
|||
//
|
||||
// OTRStoreViewController.m
|
||||
// Off the Record
|
||||
//
|
||||
// Created by Christopher Ballinger on 9/28/12.
|
||||
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
// This file is part of ChatSecure.
|
||||
//
|
||||
// ChatSecure is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ChatSecure is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#import "OTRStoreViewController.h"
|
||||
#import "MBProgressHUD.h"
|
||||
#import "Strings.h"
|
||||
#import "OTRPushAccessViewController.h"
|
||||
#import "OTRConstants.h"
|
||||
|
||||
enum {
|
||||
ACCOUNT_INFO_SECTION = 0,
|
||||
PATS_SECTION,
|
||||
PRODUCTS_SECTION
|
||||
};
|
||||
|
||||
enum {
|
||||
ACCOUNT_INFO_ACCOUNT_ROW = 0,
|
||||
ACCOUNT_INFO_PASSWORD_ROW,
|
||||
ACCOUNT_INFO_EXPIRATION_ROW
|
||||
};
|
||||
|
||||
@interface OTRStoreViewController ()
|
||||
|
||||
@end
|
||||
|
||||
@implementation OTRStoreViewController
|
||||
@synthesize productTableView, products, purchaseController, pushController;
|
||||
|
||||
- (void) dealloc {
|
||||
self.productTableView = nil;
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
- (id)init {
|
||||
if(self = [super init]) {
|
||||
self.productTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
|
||||
self.productTableView.delegate = self;
|
||||
self.productTableView.dataSource = self;
|
||||
self.title = STORE_STRING;
|
||||
self.purchaseController = [OTRPurchaseController sharedInstance];
|
||||
self.pushController = [OTRPushController sharedInstance];
|
||||
purchaseController.delegate = self;
|
||||
self.products = [NSArray array];
|
||||
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:RESTORE_STRING style:UIBarButtonItemStyleBordered target:self action:@selector(restorePurchases:)];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedProductUpdateNotification:) name:kOTRPurchaseControllerProductUpdateNotification object:purchaseController];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedProductUpdateNotification:) name:kOTRPushAccountUpdateNotification object:pushController];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) receivedProductUpdateNotification:(NSNotification*)notification {
|
||||
[self.productTableView reloadData];
|
||||
}
|
||||
|
||||
- (void) loadView {
|
||||
[super loadView];
|
||||
[self.view addSubview:productTableView];
|
||||
}
|
||||
|
||||
- (void) hideHUD {
|
||||
[MBProgressHUD hideHUDForView:self.view animated:YES];
|
||||
}
|
||||
|
||||
- (void) showHUD {
|
||||
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
|
||||
}
|
||||
|
||||
- (void) restorePurchases:(id)sender {
|
||||
[purchaseController restorePurchases];
|
||||
}
|
||||
|
||||
- (void) viewWillAppear:(BOOL)animated {
|
||||
[super viewWillAppear:animated];
|
||||
self.productTableView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
|
||||
self.productTableView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
|
||||
[self showHUD];
|
||||
[purchaseController requestProducts];
|
||||
}
|
||||
|
||||
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
if (indexPath.section == ACCOUNT_INFO_SECTION) {
|
||||
static NSString *cellIdentifier = @"InfoCellIdentifier";
|
||||
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
|
||||
if (!cell) {
|
||||
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
|
||||
}
|
||||
if (indexPath.row == ACCOUNT_INFO_ACCOUNT_ROW) {
|
||||
cell.textLabel.text = ACCOUNT_ID_STRING;
|
||||
cell.detailTextLabel.text = pushController.accountID;
|
||||
} else if (indexPath.row == ACCOUNT_INFO_PASSWORD_ROW) {
|
||||
cell.textLabel.text = PASSWORD_STRING;
|
||||
cell.detailTextLabel.text = pushController.password;
|
||||
} else if (indexPath.row == ACCOUNT_INFO_EXPIRATION_ROW) {
|
||||
cell.textLabel.text = EXPIRATION_TITLE_STRING;
|
||||
cell.detailTextLabel.text = [pushController.expirationDate description];
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
if (indexPath.section == PRODUCTS_SECTION) {
|
||||
static NSString *cellIdentifier = @"StoreCellIdentifier";
|
||||
OTRStoreTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
|
||||
if (!cell) {
|
||||
cell = [[OTRStoreTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
|
||||
}
|
||||
SKProduct *product = [products objectAtIndex:indexPath.row];
|
||||
cell.product = product;
|
||||
return cell;
|
||||
}
|
||||
if (indexPath.section == PATS_SECTION) {
|
||||
static NSString *cellIdentifier = @"CellIdentifier";
|
||||
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
|
||||
if (!cell) {
|
||||
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
|
||||
}
|
||||
cell.textLabel.text = PATS_SECTION_STRING;
|
||||
return cell;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
[tableView deselectRowAtIndexPath:indexPath animated:YES];
|
||||
if (indexPath.section == PATS_SECTION) {
|
||||
OTRPushAccessViewController *patViewController = [[OTRPushAccessViewController alloc] init];
|
||||
[self.navigationController pushViewController:patViewController animated:YES];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
|
||||
return 3;
|
||||
}
|
||||
|
||||
- (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
|
||||
if (section == ACCOUNT_INFO_SECTION) {
|
||||
return ACCOUNT_INFO_STRING;
|
||||
} else if (section == PRODUCTS_SECTION) {
|
||||
return PRODUCTS_SECTION_STRING;
|
||||
} else if (section == PATS_SECTION) {
|
||||
return PATS_SECTION_STRING;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
||||
if (section == ACCOUNT_INFO_SECTION) {
|
||||
return 3;
|
||||
} else if (section == PRODUCTS_SECTION) {
|
||||
return [products count];
|
||||
} else if (section == PATS_SECTION) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (void)didReceiveMemoryWarning
|
||||
{
|
||||
[super didReceiveMemoryWarning];
|
||||
// Dispose of any resources that can be recreated.
|
||||
}
|
||||
|
||||
- (void) productsUpdated:(NSArray*)newProducts {
|
||||
self.products = newProducts;
|
||||
[self hideHUD];
|
||||
[self.productTableView reloadData];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,294 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.17" systemVersion="16F2073" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="gpY-7F-1nv">
|
||||
<device id="retina4_0" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.14"/>
|
||||
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Purchase View Controller-->
|
||||
<scene sceneID="IEN-E6-Trv">
|
||||
<objects>
|
||||
<viewController id="gpY-7F-1nv" customClass="PurchaseViewController" customModule="ChatSecureCore" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="Iq9-D8-dij"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="QwV-if-gsM"/>
|
||||
</layoutGuides>
|
||||
<view key="view" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="peW-Bv-YYS">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Thank you!" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="z0b-01-F8c">
|
||||
<rect key="frame" x="88.5" y="40" width="143" height="124"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="30"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="tzh-dS-ZUa">
|
||||
<rect key="frame" x="8" y="202" width="304" height="80"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="80" id="Kw4-oY-0g6"/>
|
||||
</constraints>
|
||||
<string key="text">Help us make developing free and open source privacy tools sustainable. We welcome any contribution to support ongoing development. </string>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NHC-BV-VjX">
|
||||
<rect key="frame" x="16" y="518" width="53" height="30"/>
|
||||
<state key="normal" title="Restore"/>
|
||||
<connections>
|
||||
<action selector="restoreButtonPressed:" destination="gpY-7F-1nv" eventType="touchUpInside" id="Fsq-Es-0M2"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gXX-QC-Oew">
|
||||
<rect key="frame" x="218" y="518" width="86" height="30"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="30" id="wUL-Ha-GfW"/>
|
||||
</constraints>
|
||||
<state key="normal" title="Maybe Later"/>
|
||||
<connections>
|
||||
<segue destination="IC3-R1-eWi" kind="show" identifier="maybeLaterSegue" id="tn7-VO-3bW"/>
|
||||
</connections>
|
||||
</button>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9Kx-N0-Yqp" userLabel="IAP Buttons View">
|
||||
<rect key="frame" x="8" y="411" width="304" height="99"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="boG-Bi-Djt">
|
||||
<rect key="frame" x="106" y="34.5" width="92" height="30"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="92" id="oqS-bf-dPs"/>
|
||||
</constraints>
|
||||
<state key="normal" title="🍺 $5.99/mo"/>
|
||||
<connections>
|
||||
<action selector="mediumMoneyButtonPressed:" destination="gpY-7F-1nv" eventType="touchUpInside" id="tbX-rd-nIN"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="647-wq-NMP">
|
||||
<rect key="frame" x="203" y="34.5" width="99" height="30"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="99" id="d8H-xD-nje"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="15"/>
|
||||
<state key="normal" title="🎁 $19.99/mo"/>
|
||||
<connections>
|
||||
<action selector="bigMoneyButtonPressed:" destination="gpY-7F-1nv" eventType="touchUpInside" id="IPi-GG-LnN"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fmr-wM-gJf">
|
||||
<rect key="frame" x="8" y="34.5" width="96" height="30"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="96" id="MID-1x-8IL"/>
|
||||
</constraints>
|
||||
<state key="normal" title=" ☕️ $2.99/mo"/>
|
||||
<connections>
|
||||
<action selector="smallMoneyButtonPressed:" destination="gpY-7F-1nv" eventType="touchUpInside" id="Y1E-2a-AEZ"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="fmr-wM-gJf" firstAttribute="leading" secondItem="9Kx-N0-Yqp" secondAttribute="leading" constant="8" id="1BE-Z7-0fj"/>
|
||||
<constraint firstAttribute="height" constant="99" id="3AB-qU-aP0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="647-wq-NMP" secondAttribute="trailing" constant="2" id="4l0-3t-pvh"/>
|
||||
<constraint firstItem="647-wq-NMP" firstAttribute="centerY" secondItem="9Kx-N0-Yqp" secondAttribute="centerY" id="5Jx-L6-0K2"/>
|
||||
<constraint firstItem="647-wq-NMP" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="boG-Bi-Djt" secondAttribute="trailing" constant="2" id="Af7-yx-GZi"/>
|
||||
<constraint firstItem="boG-Bi-Djt" firstAttribute="centerY" secondItem="9Kx-N0-Yqp" secondAttribute="centerY" id="T7U-BC-XxD"/>
|
||||
<constraint firstItem="fmr-wM-gJf" firstAttribute="centerY" secondItem="9Kx-N0-Yqp" secondAttribute="centerY" id="bfM-bM-SwJ"/>
|
||||
<constraint firstItem="boG-Bi-Djt" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="fmr-wM-gJf" secondAttribute="trailing" constant="2" id="mZL-5u-FIt"/>
|
||||
<constraint firstItem="boG-Bi-Djt" firstAttribute="centerX" secondItem="9Kx-N0-Yqp" secondAttribute="centerX" id="xvx-9z-JTr"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="TopLeft" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="L5z-3N-jCk">
|
||||
<rect key="frame" x="8" y="290" width="304" height="113"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="113" id="qDI-VN-1U7"/>
|
||||
</constraints>
|
||||
<attributedString key="attributedText">
|
||||
<fragment>
|
||||
<string key="content">• Feel good supporting indie software
|
||||
• Continued development and updates
|
||||
• Help keep the app free for everyone
|
||||
</string>
|
||||
<attributes>
|
||||
<font key="NSFont" size="17" name=".AppleSystemUIFont"/>
|
||||
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
|
||||
</attributes>
|
||||
</fragment>
|
||||
<fragment>
|
||||
<string key="content" base64-UTF8="YES">
|
||||
Cg
|
||||
</string>
|
||||
<attributes>
|
||||
<font key="NSFont" size="10" name=".SFNSText"/>
|
||||
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
|
||||
</attributes>
|
||||
</fragment>
|
||||
<fragment content="This is a monthly, auto-renewing subscription. Terms: chatsecure.org/terms Privacy: chatsecure.org/privacy ">
|
||||
<attributes>
|
||||
<font key="NSFont" size="12" name=".SFNSText"/>
|
||||
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
|
||||
</attributes>
|
||||
</fragment>
|
||||
</attributedString>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="NHC-BV-VjX" firstAttribute="leading" secondItem="peW-Bv-YYS" secondAttribute="leadingMargin" id="3Ls-pR-mfZ"/>
|
||||
<constraint firstItem="9Kx-N0-Yqp" firstAttribute="leading" secondItem="peW-Bv-YYS" secondAttribute="leading" constant="8" id="3g8-Q4-0ei"/>
|
||||
<constraint firstItem="L5z-3N-jCk" firstAttribute="top" secondItem="tzh-dS-ZUa" secondAttribute="bottom" constant="8" id="3g9-MG-GAz"/>
|
||||
<constraint firstItem="9Kx-N0-Yqp" firstAttribute="top" secondItem="L5z-3N-jCk" secondAttribute="bottom" constant="8" id="FfC-bQ-6js"/>
|
||||
<constraint firstItem="gXX-QC-Oew" firstAttribute="trailing" secondItem="peW-Bv-YYS" secondAttribute="trailingMargin" id="JVt-Nv-DaQ"/>
|
||||
<constraint firstItem="z0b-01-F8c" firstAttribute="top" secondItem="Iq9-D8-dij" secondAttribute="bottom" constant="20" id="TCP-xD-oSg"/>
|
||||
<constraint firstAttribute="trailing" secondItem="9Kx-N0-Yqp" secondAttribute="trailing" constant="8" id="Y57-Vy-ehS"/>
|
||||
<constraint firstItem="tzh-dS-ZUa" firstAttribute="top" secondItem="z0b-01-F8c" secondAttribute="bottom" constant="38" id="YFW-lj-qTn"/>
|
||||
<constraint firstAttribute="trailing" secondItem="L5z-3N-jCk" secondAttribute="trailing" constant="8" id="a3a-vh-d2x"/>
|
||||
<constraint firstItem="z0b-01-F8c" firstAttribute="centerX" secondItem="peW-Bv-YYS" secondAttribute="centerX" id="b6j-hF-k4Q"/>
|
||||
<constraint firstItem="QwV-if-gsM" firstAttribute="top" secondItem="NHC-BV-VjX" secondAttribute="bottom" constant="20" id="gfh-PU-VRs"/>
|
||||
<constraint firstItem="QwV-if-gsM" firstAttribute="top" secondItem="gXX-QC-Oew" secondAttribute="bottom" constant="20" id="n6r-dW-Zc5"/>
|
||||
<constraint firstItem="tzh-dS-ZUa" firstAttribute="leading" secondItem="peW-Bv-YYS" secondAttribute="leading" constant="8" id="prV-fI-OYz"/>
|
||||
<constraint firstItem="L5z-3N-jCk" firstAttribute="leading" secondItem="peW-Bv-YYS" secondAttribute="leading" constant="8" id="uKF-kS-Jsl"/>
|
||||
<constraint firstItem="gXX-QC-Oew" firstAttribute="top" secondItem="9Kx-N0-Yqp" secondAttribute="bottom" constant="8" id="uVB-NP-i6z"/>
|
||||
<constraint firstAttribute="trailing" secondItem="tzh-dS-ZUa" secondAttribute="trailing" constant="8" id="wz4-Pk-Mga"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="bigMoneyButton" destination="647-wq-NMP" id="GrV-zj-vYS"/>
|
||||
<outlet property="mediumMoneyButton" destination="boG-Bi-Djt" id="jav-TU-9Pu"/>
|
||||
<outlet property="smallMoneyButton" destination="fmr-wM-gJf" id="1NI-Xh-aYF"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="K78-wq-a6D" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="-401.25" y="166.25"/>
|
||||
</scene>
|
||||
<!--Maybe Later View Controller-->
|
||||
<scene sceneID="bxY-k8-xlG">
|
||||
<objects>
|
||||
<viewController storyboardIdentifier="moreWaysToHelp" id="IC3-R1-eWi" customClass="MaybeLaterViewController" customModule="ChatSecureCore" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="voe-yP-IWR"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="hNv-Ah-nAt"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="ijh-fq-dON">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="More Ways to Help" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="97z-ZP-B7P">
|
||||
<rect key="frame" x="24" y="40" width="272" height="36"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="30"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Can't spare the cash right now? There are plenty of other ways to contribute. " textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="dEy-M2-DVk">
|
||||
<rect key="frame" x="16" y="92" width="288" height="61"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="61" id="eTe-hN-cnT"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VSE-2h-AoI">
|
||||
<rect key="frame" x="251" y="518" width="41" height="30"/>
|
||||
<state key="normal" title="Finish"/>
|
||||
<connections>
|
||||
<action selector="dismissButtonPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="GyF-cY-oKZ"/>
|
||||
</connections>
|
||||
</button>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="b7t-YO-UNy">
|
||||
<rect key="frame" x="24" y="215.5" width="272" height="237"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="AUB-hE-6FZ">
|
||||
<rect key="frame" x="78" y="8" width="116" height="30"/>
|
||||
<state key="normal" title="Spread the Word"/>
|
||||
<connections>
|
||||
<action selector="shareButtonPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="OIb-uk-2WH"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="byp-Sd-dEW">
|
||||
<rect key="frame" x="87" y="46" width="99" height="30"/>
|
||||
<state key="normal" title="Help Translate"/>
|
||||
<connections>
|
||||
<action selector="translateButtonPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="wkl-kQ-eqX"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JvN-7y-LU8">
|
||||
<rect key="frame" x="64.5" y="84" width="144" height="30"/>
|
||||
<state key="normal" title="Join the Beta Testers"/>
|
||||
<connections>
|
||||
<action selector="joinBetaPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="LeL-Wm-Nny"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ui4-L3-zT2">
|
||||
<rect key="frame" x="74" y="122" width="124" height="30"/>
|
||||
<state key="normal" title="Submit your Ideas"/>
|
||||
<connections>
|
||||
<action selector="submitIdeasPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="6KG-J6-yCQ"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ynN-Or-UyI">
|
||||
<rect key="frame" x="77" y="160" width="118" height="30"/>
|
||||
<state key="normal" title="File a Bug Report"/>
|
||||
<connections>
|
||||
<action selector="fileBugPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="oyD-cC-I3A"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NFE-tU-GVQ">
|
||||
<rect key="frame" x="52" y="198" width="169" height="30"/>
|
||||
<state key="normal" title="Review on the App Store"/>
|
||||
<connections>
|
||||
<action selector="reviewButtonPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="lHd-ca-cyC"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="byp-Sd-dEW" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="EyY-wO-6Fe"/>
|
||||
<constraint firstItem="Ui4-L3-zT2" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="Fju-XI-2oN"/>
|
||||
<constraint firstItem="ynN-Or-UyI" firstAttribute="top" secondItem="Ui4-L3-zT2" secondAttribute="bottom" constant="8" id="GAP-kd-4Ut"/>
|
||||
<constraint firstItem="NFE-tU-GVQ" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="HKL-2q-jWn"/>
|
||||
<constraint firstItem="byp-Sd-dEW" firstAttribute="top" secondItem="AUB-hE-6FZ" secondAttribute="bottom" constant="8" id="ZKr-Gz-5uV"/>
|
||||
<constraint firstItem="JvN-7y-LU8" firstAttribute="top" secondItem="byp-Sd-dEW" secondAttribute="bottom" constant="8" id="bT9-xo-zw5"/>
|
||||
<constraint firstItem="JvN-7y-LU8" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="ccG-JC-PZw"/>
|
||||
<constraint firstItem="AUB-hE-6FZ" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="dFW-fP-XNt"/>
|
||||
<constraint firstAttribute="height" constant="237" id="dYn-Go-epJ"/>
|
||||
<constraint firstItem="ynN-Or-UyI" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="l1W-oC-gVn"/>
|
||||
<constraint firstItem="AUB-hE-6FZ" firstAttribute="top" secondItem="b7t-YO-UNy" secondAttribute="top" constant="8" id="tjZ-Sf-1YG"/>
|
||||
<constraint firstItem="NFE-tU-GVQ" firstAttribute="top" secondItem="ynN-Or-UyI" secondAttribute="bottom" constant="8" id="wCs-Pd-Y6s"/>
|
||||
<constraint firstItem="Ui4-L3-zT2" firstAttribute="top" secondItem="JvN-7y-LU8" secondAttribute="bottom" constant="8" id="yNf-Wb-BLe"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="97z-ZP-B7P" secondAttribute="trailing" constant="8" id="3gH-2g-ZKl"/>
|
||||
<constraint firstItem="b7t-YO-UNy" firstAttribute="centerY" secondItem="ijh-fq-dON" secondAttribute="centerY" constant="50" id="8Bh-YY-2KH"/>
|
||||
<constraint firstItem="VSE-2h-AoI" firstAttribute="trailing" secondItem="ijh-fq-dON" secondAttribute="trailingMargin" constant="-12" id="DNI-EF-njD"/>
|
||||
<constraint firstAttribute="trailing" secondItem="dEy-M2-DVk" secondAttribute="trailing" constant="16" id="ESJ-AZ-Deb"/>
|
||||
<constraint firstItem="dEy-M2-DVk" firstAttribute="leading" secondItem="ijh-fq-dON" secondAttribute="leading" constant="16" id="Kpr-UL-8uK"/>
|
||||
<constraint firstItem="b7t-YO-UNy" firstAttribute="centerX" secondItem="ijh-fq-dON" secondAttribute="centerX" id="Mkv-TF-j9Y"/>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="b7t-YO-UNy" secondAttribute="trailing" constant="8" id="YpF-OM-8ES"/>
|
||||
<constraint firstItem="97z-ZP-B7P" firstAttribute="top" secondItem="voe-yP-IWR" secondAttribute="bottom" constant="20" id="aNc-4A-ZdK"/>
|
||||
<constraint firstItem="b7t-YO-UNy" firstAttribute="leading" secondItem="ijh-fq-dON" secondAttribute="leadingMargin" constant="8" id="hTw-Mc-9Bh"/>
|
||||
<constraint firstItem="hNv-Ah-nAt" firstAttribute="top" secondItem="VSE-2h-AoI" secondAttribute="bottom" constant="20" id="ncl-4B-LUm"/>
|
||||
<constraint firstItem="97z-ZP-B7P" firstAttribute="leading" secondItem="ijh-fq-dON" secondAttribute="leadingMargin" constant="8" id="ocS-St-uVa"/>
|
||||
<constraint firstItem="dEy-M2-DVk" firstAttribute="top" secondItem="97z-ZP-B7P" secondAttribute="bottom" constant="16" id="uWm-jY-5ea"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="subheadingLabel" destination="dEy-M2-DVk" id="eh2-Dc-mih"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="8Af-JD-7ZL" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="451.875" y="166.90140845070422"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
|
@ -1,466 +0,0 @@
|
|||
//
|
||||
// OMEMODeviceVerificationViewController.swift
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by Chris Ballinger on 10/13/16.
|
||||
// Copyright © 2016 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import XLForm
|
||||
import YapDatabase
|
||||
import OTRAssets
|
||||
|
||||
open class KeyManagementViewController: XLFormViewController {
|
||||
|
||||
@objc open var completionBlock: (()->Void)?
|
||||
|
||||
// Crypto Chooser row tags
|
||||
open static let DefaultRowTag = "DefaultRowTag"
|
||||
open static let PlaintextRowTag = "PlaintextRowTag"
|
||||
open static let OTRRowTag = "OTRRowTag"
|
||||
open static let OMEMORowTag = "OMEMORowTag"
|
||||
open static let ShowAdvancedCryptoSettingsTag = "ShowAdvancedCryptoSettingsTag"
|
||||
|
||||
open let accountKey:String
|
||||
open var readConnection: YapDatabaseConnection
|
||||
open var writeConnection: YapDatabaseConnection
|
||||
|
||||
lazy var signalCoordinator:OTROMEMOSignalCoordinator? = {
|
||||
var account:OTRAccount? = nil
|
||||
self.readConnection.read { (transaction) in
|
||||
account = OTRAccount.fetchObject(withUniqueID: self.accountKey, transaction: transaction)
|
||||
}
|
||||
|
||||
guard let acct = account else {
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let xmpp = OTRProtocolManager.sharedInstance().protocol(for: acct) as? XMPPManager else {
|
||||
return nil
|
||||
}
|
||||
return xmpp.omemoSignalCoordinator
|
||||
}()
|
||||
|
||||
@objc public init(accountKey:String,
|
||||
readConnection: YapDatabaseConnection,
|
||||
writeConnection:YapDatabaseConnection,
|
||||
form: XLFormDescriptor) {
|
||||
self.accountKey = accountKey
|
||||
self.readConnection = readConnection
|
||||
self.writeConnection = writeConnection
|
||||
super.init(nibName: nil, bundle: nil)
|
||||
|
||||
self.form = form
|
||||
}
|
||||
|
||||
required public init!(coder aDecoder: NSCoder!) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
open override func viewDidLoad() {
|
||||
// gotta register cell before super
|
||||
OMEMODeviceFingerprintCell.registerCellClass(OMEMODeviceFingerprintCell.defaultRowDescriptorType())
|
||||
UserInfoProfileCell.registerCellClass(UserInfoProfileCell.defaultRowDescriptorType())
|
||||
|
||||
super.viewDidLoad()
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonPressed(_:)))
|
||||
self.tableView.allowsMultipleSelectionDuringEditing = false
|
||||
|
||||
// Overriding superclass behaviour. This prevents the red icon on left of cell for deletion. Just want swipe to delete on device/fingerprint.
|
||||
self.tableView.setEditing(false, animated: false)
|
||||
}
|
||||
|
||||
open override func didReceiveMemoryWarning() {
|
||||
super.didReceiveMemoryWarning()
|
||||
// Dispose of any resources that can be recreated.
|
||||
}
|
||||
|
||||
@objc open func doneButtonPressed(_ sender: AnyObject?) {
|
||||
var devicesToSave: [OMEMODevice] = []
|
||||
var otrFingerprintsToSave: [OTRFingerprint] = []
|
||||
for (_, value) in form.formValues() {
|
||||
switch value {
|
||||
case let device as OMEMODevice:
|
||||
devicesToSave.append(device)
|
||||
case let fingerprint as OTRFingerprint:
|
||||
otrFingerprintsToSave.append(fingerprint)
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
OTRDatabaseManager.sharedInstance().readWriteDatabaseConnection?.asyncReadWrite({ (t: YapDatabaseReadWriteTransaction) in
|
||||
for viewedDevice in devicesToSave {
|
||||
if var device = t.object(forKey: viewedDevice.uniqueId, inCollection: OMEMODevice.collection) as? OMEMODevice {
|
||||
device = device.copy() as! OMEMODevice
|
||||
device.trustLevel = viewedDevice.trustLevel
|
||||
|
||||
if (device.trustLevel == .trustedUser && device.isExpired()) {
|
||||
device.lastSeenDate = viewedDevice.lastSeenDate
|
||||
}
|
||||
|
||||
device.save(with: t)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
otrFingerprintsToSave.forEach { (fingerprint) in
|
||||
OTRProtocolManager.encryptionManager.save(fingerprint)
|
||||
}
|
||||
if let completion = self.completionBlock {
|
||||
completion()
|
||||
}
|
||||
dismiss(animated: true, completion: nil)
|
||||
}
|
||||
|
||||
fileprivate func isAbleToDeleteCellAtIndexPath(_ indexPath:IndexPath) -> Bool {
|
||||
if let rowDescriptor = self.form.formRow(atIndex: indexPath) {
|
||||
|
||||
switch rowDescriptor.value {
|
||||
case let device as OMEMODevice:
|
||||
if let myBundle = self.signalCoordinator?.fetchMyBundle() {
|
||||
// This is only used to compare so we don't allow delete UI on our device
|
||||
let thisDeviceYapKey = OMEMODevice.yapKey(withDeviceId: NSNumber(value: myBundle.deviceId as UInt32), parentKey: self.accountKey, parentCollection: OTRAccount.collection)
|
||||
if device.uniqueId != thisDeviceYapKey {
|
||||
return true
|
||||
}
|
||||
}
|
||||
case let fingerprint as OTRFingerprint:
|
||||
if (fingerprint.accountName != fingerprint.username) {
|
||||
return true
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
fileprivate func performEdit(_ action:UITableViewCellEditingStyle, indexPath:IndexPath) {
|
||||
if ( action == .delete ) {
|
||||
if let rowDescriptor = self.form.formRow(atIndex: indexPath) {
|
||||
rowDescriptor.sectionDescriptor.removeFormRow(rowDescriptor)
|
||||
switch rowDescriptor.value {
|
||||
case let device as OMEMODevice:
|
||||
|
||||
self.signalCoordinator?.removeDevice([device], completion: { (success) in
|
||||
|
||||
})
|
||||
break
|
||||
case let fingerprint as OTRFingerprint:
|
||||
do {
|
||||
try OTRProtocolManager.encryptionManager.otrKit.delete(fingerprint)
|
||||
} catch {
|
||||
|
||||
}
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open static func cryptoChooserRows(_ buddy: OTRBuddy, connection: YapDatabaseConnection) -> [XLFormRowDescriptor] {
|
||||
|
||||
let bestAvailableRow = XLFormRowDescriptor(tag: DefaultRowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: Best_Available())
|
||||
let plaintextOnlyRow = XLFormRowDescriptor(tag: PlaintextRowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: Plaintext_Only())
|
||||
let plaintextOtrRow = XLFormRowDescriptor(tag: PlaintextRowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: Plaintext_Opportunistic_OTR())
|
||||
let otrRow = XLFormRowDescriptor(tag: OTRRowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: "OTR")
|
||||
let omemoRow = XLFormRowDescriptor(tag: OMEMORowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: "OMEMO")
|
||||
|
||||
var hasDevices = false
|
||||
|
||||
connection.read { (transaction: YapDatabaseReadTransaction) in
|
||||
if OMEMODevice.allDevices(forParentKey: buddy.uniqueId, collection: type(of: buddy).collection, transaction: transaction).count > 0 {
|
||||
hasDevices = true
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasDevices) {
|
||||
omemoRow.disabled = NSNumber(value: true as Bool)
|
||||
}
|
||||
|
||||
let trueValue = NSNumber(value: true as Bool)
|
||||
switch buddy.preferredSecurity {
|
||||
case .plaintextOnly:
|
||||
plaintextOnlyRow.value = trueValue
|
||||
break
|
||||
case .bestAvailable:
|
||||
bestAvailableRow.value = trueValue
|
||||
break
|
||||
case .OTR:
|
||||
otrRow.value = trueValue
|
||||
break
|
||||
case .OMEMO:
|
||||
omemoRow.value = trueValue
|
||||
break
|
||||
case .omemOandOTR:
|
||||
omemoRow.value = trueValue
|
||||
break
|
||||
case .plaintextWithOTR:
|
||||
plaintextOtrRow.value = trueValue
|
||||
}
|
||||
|
||||
let formRows = [bestAvailableRow, plaintextOnlyRow, plaintextOtrRow, otrRow, omemoRow]
|
||||
|
||||
var currentRow: XLFormRowDescriptor? = nil
|
||||
var rowsToDeselect: NSMutableSet = NSMutableSet()
|
||||
let onChangeBlock = { (oldValue: Any?, newValue: Any?, rowDescriptor: XLFormRowDescriptor) in
|
||||
// Prevent infinite loops
|
||||
// Allow deselection
|
||||
if rowsToDeselect.count > 0 {
|
||||
rowsToDeselect.remove(rowDescriptor)
|
||||
return
|
||||
}
|
||||
if currentRow != nil {
|
||||
return
|
||||
}
|
||||
currentRow = rowDescriptor
|
||||
|
||||
// Don't allow user to unselect a true value
|
||||
if (newValue as AnyObject?)?.boolValue == false {
|
||||
rowDescriptor.value = NSNumber(value: true as Bool)
|
||||
currentRow = nil
|
||||
return
|
||||
}
|
||||
|
||||
// Deselect other rows
|
||||
rowsToDeselect = NSMutableSet(array: formRows.filter({ $0 != rowDescriptor }))
|
||||
for row in rowsToDeselect {
|
||||
guard let row = row as? XLFormRowDescriptor else {
|
||||
continue
|
||||
}
|
||||
let newValue = NSNumber(value: false as Bool)
|
||||
row.value = newValue
|
||||
// Wow that's janky
|
||||
(row.sectionDescriptor.formDescriptor.delegate as! XLFormViewControllerDelegate).reloadFormRow!(row)
|
||||
}
|
||||
|
||||
var preferredSecurity: OTRSessionSecurity = .bestAvailable
|
||||
if (plaintextOnlyRow.value as AnyObject?)?.boolValue == true {
|
||||
preferredSecurity = .plaintextOnly
|
||||
} else if (otrRow.value as AnyObject?)?.boolValue == true {
|
||||
preferredSecurity = .OTR
|
||||
} else if (omemoRow.value as AnyObject?)?.boolValue == true {
|
||||
preferredSecurity = .OMEMO
|
||||
} else if (bestAvailableRow.value as AnyObject?)?.boolValue == true {
|
||||
preferredSecurity = .bestAvailable
|
||||
} else if (plaintextOtrRow.value as AnyObject?)?.boolValue == true {
|
||||
preferredSecurity = .plaintextWithOTR
|
||||
}
|
||||
|
||||
OTRDatabaseManager.sharedInstance().readWriteDatabaseConnection?.readWrite({ (transaction: YapDatabaseReadWriteTransaction) in
|
||||
guard var buddy = transaction.object(forKey: buddy.uniqueId, inCollection: type(of: buddy).collection) as? OTRBuddy else {
|
||||
return
|
||||
}
|
||||
guard let account = buddy.account(with: transaction) else {
|
||||
return
|
||||
}
|
||||
buddy = buddy.copy() as! OTRBuddy
|
||||
buddy.preferredSecurity = preferredSecurity
|
||||
buddy.save(with: transaction)
|
||||
// Cancel OTR session if plaintext or omemo only
|
||||
if (preferredSecurity == .plaintextOnly || preferredSecurity == .OMEMO) {
|
||||
OTRProtocolManager.encryptionManager.otrKit.disableEncryption(withUsername: buddy.username, accountName: account.username, protocol: account.protocolTypeString())
|
||||
}
|
||||
})
|
||||
currentRow = nil
|
||||
}
|
||||
|
||||
for row in formRows {
|
||||
row.onChangeBlock = onChangeBlock
|
||||
}
|
||||
|
||||
return formRows
|
||||
}
|
||||
|
||||
//MARK UITableView Delegate overrides
|
||||
|
||||
open override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
|
||||
if self.isAbleToDeleteCellAtIndexPath(indexPath) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
open override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
|
||||
if self.isAbleToDeleteCellAtIndexPath(indexPath) {
|
||||
return .delete
|
||||
}
|
||||
return .none
|
||||
}
|
||||
|
||||
open override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
|
||||
|
||||
self.performEdit(editingStyle, indexPath: indexPath)
|
||||
}
|
||||
|
||||
|
||||
@objc open static func profileFormDescriptorForAccount(_ account: OTRAccount, buddies: [OTRBuddy], connection: YapDatabaseConnection) -> XLFormDescriptor {
|
||||
let form = XLFormDescriptor(title: Profile_String())
|
||||
|
||||
let yourProfileSection = XLFormSectionDescriptor.formSection(withTitle: Me_String())
|
||||
let yourProfileRow = XLFormRowDescriptor(tag: account.uniqueId, rowType: UserInfoProfileCell.defaultRowDescriptorType())
|
||||
yourProfileRow.value = account
|
||||
yourProfileSection.addFormRow(yourProfileRow)
|
||||
|
||||
guard let xmpp = OTRProtocolManager.sharedInstance().protocol(for: account) as? XMPPManager else {
|
||||
return form
|
||||
}
|
||||
guard let myBundle = xmpp.omemoSignalCoordinator?.fetchMyBundle() else {
|
||||
return form
|
||||
}
|
||||
let thisDevice = OMEMODevice(deviceId: NSNumber(value: myBundle.deviceId as UInt32), trustLevel: .trustedUser, parentKey: account.uniqueId, parentCollection: type(of: account).collection, publicIdentityKeyData: myBundle.identityKey, lastSeenDate: Date())
|
||||
var ourDevices: [OMEMODevice] = []
|
||||
connection.read { (transaction: YapDatabaseReadTransaction) in
|
||||
ourDevices = OMEMODevice.allDevices(forParentKey: account.uniqueId, collection: type(of: account).collection, transaction: transaction)
|
||||
}
|
||||
|
||||
|
||||
let ourFilteredDevices = ourDevices.filter({ (device: OMEMODevice) -> Bool in
|
||||
return device.uniqueId != thisDevice.uniqueId
|
||||
})
|
||||
|
||||
// TODO - Sort ourDevices and theirDevices by lastSeen
|
||||
|
||||
let addDevicesToSection: ([OMEMODevice], XLFormSectionDescriptor) -> Void = { devices, section in
|
||||
for device in devices {
|
||||
guard let _ = device.publicIdentityKeyData else {
|
||||
continue
|
||||
}
|
||||
let row = XLFormRowDescriptor(tag: device.uniqueId, rowType: OMEMODeviceFingerprintCell.defaultRowDescriptorType())
|
||||
row.value = device.copy()
|
||||
|
||||
// Don't allow editing of your own device
|
||||
if device.uniqueId == thisDevice.uniqueId {
|
||||
row.disabled = true
|
||||
}
|
||||
|
||||
section.addFormRow(row)
|
||||
}
|
||||
}
|
||||
|
||||
let otrKit = OTRProtocolManager.encryptionManager.otrKit
|
||||
let allFingerprints = otrKit.allFingerprints()
|
||||
let myFingerprint = otrKit.fingerprint(forAccountName: account.username, protocol: account.protocolTypeString())
|
||||
let addFingerprintsToSection: ([OTRFingerprint], XLFormSectionDescriptor) -> Void = { fingerprints, section in
|
||||
for fingerprint in fingerprints {
|
||||
let row = XLFormRowDescriptor(tag: (fingerprint.fingerprint as NSData).otr_hexString(), rowType: OMEMODeviceFingerprintCell.defaultRowDescriptorType())
|
||||
if let myFingerprint = myFingerprint {
|
||||
if (fingerprint === myFingerprint) {
|
||||
// We implicitly trust ourselves with OTR
|
||||
row.disabled = true
|
||||
} else {
|
||||
row.disabled = false
|
||||
}
|
||||
}
|
||||
|
||||
row.value = fingerprint
|
||||
|
||||
section.addFormRow(row)
|
||||
}
|
||||
}
|
||||
|
||||
var allMyDevices: [OMEMODevice] = []
|
||||
allMyDevices.append(thisDevice)
|
||||
allMyDevices.append(contentsOf: ourFilteredDevices)
|
||||
addDevicesToSection(allMyDevices, yourProfileSection)
|
||||
|
||||
var theirSections: [XLFormSectionDescriptor] = []
|
||||
|
||||
if let myFingerprint = myFingerprint {
|
||||
addFingerprintsToSection([myFingerprint], yourProfileSection)
|
||||
}
|
||||
|
||||
// Add section for each buddy's device
|
||||
for buddy in buddies {
|
||||
let theirSection = XLFormSectionDescriptor.formSection(withTitle: buddy.username)
|
||||
|
||||
let buddyRow = XLFormRowDescriptor(tag: buddy.uniqueId, rowType: UserInfoProfileCell.defaultRowDescriptorType())
|
||||
buddyRow.value = buddy
|
||||
theirSection.addFormRow(buddyRow)
|
||||
var theirDevices: [OMEMODevice] = []
|
||||
connection.read({ (transaction: YapDatabaseReadTransaction) in
|
||||
theirDevices = OMEMODevice.allDevices(forParentKey: buddy.uniqueId, collection: type(of: buddy).collection, transaction: transaction)
|
||||
})
|
||||
let theirFingerprints = allFingerprints.filter({ (fingerprint: OTRFingerprint) -> Bool in
|
||||
return fingerprint.username == buddy.username &&
|
||||
fingerprint.accountName == account.username
|
||||
})
|
||||
|
||||
addDevicesToSection(theirDevices, theirSection)
|
||||
addFingerprintsToSection(theirFingerprints, theirSection)
|
||||
theirSections.append(theirSection)
|
||||
}
|
||||
|
||||
|
||||
var sectionsToAdd: [XLFormSectionDescriptor] = []
|
||||
sectionsToAdd.append(contentsOf: theirSections)
|
||||
|
||||
// cryptoChooserRows is only meaningful for 1:1 conversations at the moment
|
||||
if buddies.count == 1 {
|
||||
let buddy = buddies.first!
|
||||
let cryptoSection = XLFormSectionDescriptor.formSection(withTitle: Advanced_Encryption_Settings())
|
||||
cryptoSection.footerTitle = Advanced_Crypto_Warning()
|
||||
let showAdvancedSwitch = XLFormRowDescriptor.init(tag: self.ShowAdvancedCryptoSettingsTag, rowType: XLFormRowDescriptorTypeBooleanSwitch, title: Show_Advanced_Encryption_Settings())
|
||||
showAdvancedSwitch.value = NSNumber(value: false as Bool)
|
||||
let cryptoChooser = cryptoChooserRows(buddy, connection: connection)
|
||||
for row in cryptoChooser {
|
||||
cryptoSection.addFormRow(row)
|
||||
}
|
||||
cryptoSection.hidden = "$\(ShowAdvancedCryptoSettingsTag)==0"
|
||||
let buddySection = theirSections.first!
|
||||
buddySection.addFormRow(showAdvancedSwitch)
|
||||
sectionsToAdd.append(cryptoSection)
|
||||
}
|
||||
|
||||
sectionsToAdd.append(yourProfileSection)
|
||||
|
||||
for section in sectionsToAdd {
|
||||
if section.formRows.count > 0 {
|
||||
form.addFormSection(section)
|
||||
}
|
||||
}
|
||||
|
||||
return form
|
||||
}
|
||||
|
||||
// MARK: - UITableViewDelegate
|
||||
|
||||
open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
super.tableView(tableView, didSelectRowAt: indexPath)
|
||||
tableView.deselectRow(at: indexPath, animated: true)
|
||||
guard let cell = self.tableView(tableView, cellForRowAt: indexPath) as? OMEMODeviceFingerprintCell else {
|
||||
return
|
||||
}
|
||||
var fingerprint = ""
|
||||
var username = ""
|
||||
var cryptoType = ""
|
||||
if let device = cell.rowDescriptor.value as? OMEMODevice {
|
||||
cryptoType = "OMEMO"
|
||||
fingerprint = device.humanReadableFingerprint
|
||||
self.readConnection.read({ (transaction) in
|
||||
if let buddy = transaction.object(forKey: device.parentKey, inCollection: device.parentCollection) as? OTRBuddy {
|
||||
username = buddy.username
|
||||
}
|
||||
})
|
||||
}
|
||||
if let otrFingerprint = cell.rowDescriptor.value as? OTRFingerprint {
|
||||
cryptoType = "OTR"
|
||||
fingerprint = (otrFingerprint.fingerprint as NSData).humanReadableFingerprint()
|
||||
username = otrFingerprint.username
|
||||
}
|
||||
if fingerprint.count == 0 || username.count == 0 || cryptoType.count == 0 {
|
||||
return
|
||||
}
|
||||
let stringToShare = "\(username): \(cryptoType) \(fingerprint)"
|
||||
let activityViewController = UIActivityViewController(activityItems: [stringToShare], applicationActivities: nil)
|
||||
if let ppc = activityViewController.popoverPresentationController {
|
||||
ppc.sourceView = cell
|
||||
ppc.sourceRect = cell.frame
|
||||
}
|
||||
present(activityViewController, animated: true, completion: nil)
|
||||
}
|
||||
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
//
|
||||
// OTRStoreTableViewCell.h
|
||||
// Off the Record
|
||||
//
|
||||
// Created by Christopher Ballinger on 9/28/12.
|
||||
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
// This file is part of ChatSecure.
|
||||
//
|
||||
// ChatSecure is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ChatSecure is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <StoreKit/StoreKit.h>
|
||||
|
||||
@interface OTRStoreTableViewCell : UITableViewCell
|
||||
|
||||
@property (nonatomic, strong) SKProduct *product;
|
||||
|
||||
@end
|
|
@ -1,66 +0,0 @@
|
|||
//
|
||||
// OTRStoreTableViewCell.m
|
||||
// Off the Record
|
||||
//
|
||||
// Created by Christopher Ballinger on 9/28/12.
|
||||
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
// This file is part of ChatSecure.
|
||||
//
|
||||
// ChatSecure is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ChatSecure is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#import "OTRStoreTableViewCell.h"
|
||||
#import "OTRPurchaseController.h"
|
||||
#import "Strings.h"
|
||||
|
||||
@implementation OTRStoreTableViewCell
|
||||
@synthesize product;
|
||||
|
||||
- (void) setProduct:(SKProduct *)newProduct {
|
||||
product = newProduct;
|
||||
self.textLabel.text = product.localizedTitle;
|
||||
self.detailTextLabel.text = product.localizedDescription;
|
||||
|
||||
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
|
||||
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
|
||||
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
|
||||
[numberFormatter setLocale:product.priceLocale];
|
||||
NSString *priceString = [numberFormatter stringFromNumber:product.price];
|
||||
|
||||
BOOL productPurchased = [[OTRPurchaseController sharedInstance] isProductIdentifierPurchased:product.productIdentifier];
|
||||
if (productPurchased) {
|
||||
priceString = PURCHASED_STRING;
|
||||
}
|
||||
|
||||
UISegmentedControl *buyButton = [[UISegmentedControl alloc]initWithItems:@[priceString]];
|
||||
buyButton.segmentedControlStyle = UISegmentedControlStyleBar;
|
||||
buyButton.momentary = YES;
|
||||
if (productPurchased) {
|
||||
buyButton.enabled = NO;
|
||||
} else {
|
||||
[buyButton addTarget:self
|
||||
action:@selector(buyButtonPressed:)
|
||||
forControlEvents:UIControlEventValueChanged];
|
||||
}
|
||||
self.accessoryView = buyButton;
|
||||
}
|
||||
|
||||
- (void) buyButtonPressed:(id)sender {
|
||||
UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
|
||||
[activityView startAnimating];
|
||||
self.accessoryView = activityView;
|
||||
[[OTRPurchaseController sharedInstance] buyProduct:self.product];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,29 +0,0 @@
|
|||
//
|
||||
// OTRPasswordStrengthTextField.h
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 5/1/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
@import UIKit;
|
||||
@import Navajo;
|
||||
|
||||
@class OTRPasswordStrengthView;
|
||||
|
||||
@protocol OTRPasswordStrengthViewDelegate <NSObject>
|
||||
|
||||
- (void)passwordView:(OTRPasswordStrengthView *)view didChangePassword:(NSString *)password strength:(NJOPasswordStrength)strength failingRules:(NSArray *)rules;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@interface OTRPasswordStrengthView : UIView
|
||||
|
||||
- (id)initWithRules:(NSArray *)rules;
|
||||
- (id)initWithDefaultRules;
|
||||
|
||||
@property (nonatomic, strong) UITextField *textField;
|
||||
@property (nonatomic, weak) id<OTRPasswordStrengthViewDelegate> delegate;
|
||||
|
||||
@end
|
|
@ -1,139 +0,0 @@
|
|||
//
|
||||
// OTRPasswordStrengthTextField.m
|
||||
// Off the Record
|
||||
//
|
||||
// Created by David Chiles on 5/1/14.
|
||||
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OTRPasswordStrengthView.h"
|
||||
@import PureLayout;
|
||||
|
||||
@interface OTRPasswordStrengthView ()
|
||||
|
||||
@property (nonatomic, strong) UIProgressView *passwordStrengthMeterView;
|
||||
@property (nonatomic, strong) NJOPasswordValidator *validator;
|
||||
@property (nonatomic) BOOL addedContraints;
|
||||
|
||||
@property (nonatomic, weak) id UITextFieldTextDidChangeNotificationObject;
|
||||
|
||||
@end
|
||||
|
||||
@implementation OTRPasswordStrengthView
|
||||
|
||||
-(void)dealloc
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self.UITextFieldTextDidChangeNotificationObject];
|
||||
}
|
||||
|
||||
- (id)initWithRules:(NSArray *)rules
|
||||
{
|
||||
if (self = [self initWithFrame:CGRectZero]) {
|
||||
self.validator = [NJOPasswordValidator validatorWithRules:rules];
|
||||
self.addedContraints = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)initWithDefaultRules
|
||||
{
|
||||
if (self = [self initWithFrame:CGRectZero]) {
|
||||
self.validator = [NJOPasswordValidator standardValidator];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
if (self) {
|
||||
self.passwordStrengthMeterView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
|
||||
self.passwordStrengthMeterView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
|
||||
[self addSubview:self.passwordStrengthMeterView];
|
||||
|
||||
self.textField = [[UITextField alloc] initWithFrame:CGRectZero];
|
||||
self.textField.secureTextEntry = YES;
|
||||
self.textField.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
self.textField.clearButtonMode = UITextFieldViewModeWhileEditing;
|
||||
|
||||
[self addSubview:self.textField];
|
||||
|
||||
__weak OTRPasswordStrengthView *welf = self;
|
||||
self.UITextFieldTextDidChangeNotificationObject = [[NSNotificationCenter defaultCenter] addObserverForName:UITextFieldTextDidChangeNotification object:self.textField queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||
[welf updatePasswordStrength:note.object];
|
||||
}];
|
||||
|
||||
[self updatePasswordStrength:self];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (CGSize)intrinsicContentSize
|
||||
{
|
||||
return CGSizeMake(self.passwordStrengthMeterView.frame.size.width, self.passwordStrengthMeterView.frame.size.height+self.textField.frame.size.height+2);
|
||||
}
|
||||
|
||||
- (void)updatePasswordStrength:(id)sender
|
||||
{
|
||||
NSString *password = self.textField.text;
|
||||
NJOPasswordStrength strength = [NJOPasswordStrengthEvaluator strengthOfPassword:password];
|
||||
|
||||
|
||||
NSArray *failingRules = nil;
|
||||
if ([self.validator validatePassword:password failingRules:&failingRules]) {
|
||||
switch (strength) {
|
||||
|
||||
case NJOVeryWeakPasswordStrength:
|
||||
self.passwordStrengthMeterView.progress = 0.05f;
|
||||
self.passwordStrengthMeterView.tintColor = [UIColor redColor];
|
||||
break;
|
||||
case NJOWeakPasswordStrength:
|
||||
self.passwordStrengthMeterView.progress = 0.25f;
|
||||
self.passwordStrengthMeterView.tintColor = [UIColor orangeColor];
|
||||
break;
|
||||
case NJOReasonablePasswordStrength:
|
||||
self.passwordStrengthMeterView.progress = 0.5f;
|
||||
self.passwordStrengthMeterView.tintColor = [UIColor yellowColor];
|
||||
break;
|
||||
case NJOStrongPasswordStrength:
|
||||
self.passwordStrengthMeterView.progress = 0.75f;
|
||||
self.passwordStrengthMeterView.tintColor = [UIColor greenColor];
|
||||
break;
|
||||
case NJOVeryStrongPasswordStrength:
|
||||
self.passwordStrengthMeterView.progress = 1.0f;
|
||||
self.passwordStrengthMeterView.tintColor = [UIColor cyanColor];
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
self.passwordStrengthMeterView.progress = 0.0f;
|
||||
self.passwordStrengthMeterView.tintColor = [UIColor redColor];
|
||||
}
|
||||
|
||||
if ([password length] == 0) {
|
||||
self.passwordStrengthMeterView.progress = 0.0f;
|
||||
}
|
||||
|
||||
if ([self.delegate respondsToSelector:@selector(passwordView:didChangePassword:strength:failingRules:)]) {
|
||||
[self.delegate passwordView:self didChangePassword:password strength:strength failingRules:failingRules];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)updateConstraints
|
||||
{
|
||||
if (!self.addedContraints) {
|
||||
|
||||
[self.textField autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero excludingEdge:ALEdgeBottom];
|
||||
|
||||
[self.passwordStrengthMeterView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero excludingEdge:ALEdgeTop];
|
||||
[self.passwordStrengthMeterView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.textField withOffset:2.0];
|
||||
|
||||
self.addedContraints = YES;
|
||||
}
|
||||
[super updateConstraints];
|
||||
|
||||
|
||||
}
|
||||
|
||||
@end
|
|
@ -2,6 +2,10 @@
|
|||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
||||
<array>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER).refresh</string>
|
||||
</array>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
|
@ -15,7 +19,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.3.0</string>
|
||||
<string>$(MARKETING_VERSION)</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
|
@ -35,7 +39,7 @@
|
|||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>127</string>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>FacebookAppID</key>
|
||||
<string>447241325394334</string>
|
||||
<key>FacebookDisplayName</key>
|
||||
|
@ -43,7 +47,9 @@
|
|||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<true/>
|
||||
<key>ITSEncryptionExportComplianceCode</key>
|
||||
<string>51d17d3e-5e07-49ad-a308-9625d81e411f</string>
|
||||
<string>$(EXPORT_COMPLIANCE_CODE)</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.social-networking</string>
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
<array>
|
||||
<string>twitter</string>
|
||||
|
@ -74,19 +80,20 @@
|
|||
<key>UIAppFonts</key>
|
||||
<array>
|
||||
<string>FontAwesome.ttf</string>
|
||||
<string>OTRResources.bundle/MaterialIcons-Regular.ttf</string>
|
||||
<string>OTRResources.bundle/ios-icon-font.ttf</string>
|
||||
<string>MaterialIcons-Regular.ttf</string>
|
||||
<string>ios-icon-font.ttf</string>
|
||||
</array>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>fetch</string>
|
||||
<string>processing</string>
|
||||
<string>remote-notification</string>
|
||||
</array>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
<string>arm64</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
//
|
||||
// InfoPlist.h
|
||||
// ChatSecure
|
||||
//
|
||||
// Created by Chris Ballinger on 10/27/19.
|
||||
// Copyright © 2019 Chris Ballinger. All rights reserved.
|
||||
//
|
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ZRl-hb-7fs">
|
||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Table View Controller-->
|
||||
<scene sceneID="ECP-MZ-xYm">
|
||||
<objects>
|
||||
<tableViewController id="HLB-Xb-40a" sceneMemberID="viewController">
|
||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="80" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="0xl-e4-7or">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="HLB-Xb-40a" id="SyW-Kd-rpT"/>
|
||||
<outlet property="delegate" destination="HLB-Xb-40a" id="WTb-ZI-jsv"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
<navigationItem key="navigationItem" id="jDn-Rl-4jF"/>
|
||||
</tableViewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="DZk-ZY-fFe" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="-498" y="394"/>
|
||||
</scene>
|
||||
<!--Navigation Controller-->
|
||||
<scene sceneID="m77-e3-WYR">
|
||||
<objects>
|
||||
<navigationController id="ZRl-hb-7fs" sceneMemberID="viewController">
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="yuJ-Kr-8Hj">
|
||||
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</navigationBar>
|
||||
<connections>
|
||||
<segue destination="HLB-Xb-40a" kind="relationship" relationship="rootViewController" id="5sj-7j-u5X"/>
|
||||
</connections>
|
||||
</navigationController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="rhI-A3-3ff" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="-1416" y="394"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
|
@ -1,124 +0,0 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "iphone",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "iPhoneLaunch480h@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "retina4",
|
||||
"filename" : "iPhoneLaunch568h@2x.png",
|
||||
"minimum-system-version" : "7.0",
|
||||
"orientation" : "portrait",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "iPadLaunchPortrait.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "iPadLaunchLandscape.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "iPadLaunchPortrait@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "iPadLaunchLandscape@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "iphone",
|
||||
"extent" : "full-screen",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "iphone",
|
||||
"extent" : "full-screen",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "iphone",
|
||||
"extent" : "full-screen",
|
||||
"subtype" : "retina4",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "to-status-bar",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "to-status-bar",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "to-status-bar",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "to-status-bar",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"scale" : "2x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 6.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 15 KiB |
Binary file not shown.
Before Width: | Height: | Size: 5.6 KiB |
Binary file not shown.
Before Width: | Height: | Size: 16 KiB |
Binary file not shown.
Before Width: | Height: | Size: 4.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 5.5 KiB |
|
@ -1,48 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="15A282b" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view contentMode="scaleToFill" id="iN0-l3-epB">
|
||||
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="80" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="iPu-HT-aag">
|
||||
<rect key="frame" x="0.0" y="65" width="480" height="415"/>
|
||||
<animations/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableView>
|
||||
<navigationBar contentMode="scaleToFill" translucent="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6Z9-o3-9ZF">
|
||||
<rect key="frame" x="0.0" y="0.0" width="480" height="64"/>
|
||||
<animations/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="64" id="Cs5-Xy-Q1I"/>
|
||||
</constraints>
|
||||
<color key="barTintColor" red="0.96862751245498657" green="0.96862751245498657" blue="0.96862751245498657" alpha="1" colorSpace="deviceRGB"/>
|
||||
<items>
|
||||
<navigationItem id="ke5-CU-CbA"/>
|
||||
</items>
|
||||
</navigationBar>
|
||||
</subviews>
|
||||
<animations/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="iPu-HT-aag" firstAttribute="top" secondItem="6Z9-o3-9ZF" secondAttribute="bottom" constant="1" id="4Bh-C4-d2J"/>
|
||||
<constraint firstItem="iPu-HT-aag" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="5PX-Ym-vSU"/>
|
||||
<constraint firstAttribute="bottom" secondItem="iPu-HT-aag" secondAttribute="bottom" id="GXM-Bf-qmM"/>
|
||||
<constraint firstItem="6Z9-o3-9ZF" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Qtv-PE-tRx"/>
|
||||
<constraint firstAttribute="trailing" secondItem="iPu-HT-aag" secondAttribute="trailing" id="TYx-jK-g4H"/>
|
||||
<constraint firstAttribute="trailing" secondItem="6Z9-o3-9ZF" secondAttribute="trailing" id="YK2-gG-uAt"/>
|
||||
<constraint firstItem="6Z9-o3-9ZF" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="oSn-Le-D40"/>
|
||||
</constraints>
|
||||
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics"/>
|
||||
<nil key="simulatedTopBarMetrics"/>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<point key="canvasLocation" x="408" y="458"/>
|
||||
</view>
|
||||
</objects>
|
||||
</document>
|
|
@ -1,26 +1,26 @@
|
|||
name: Alamofire, nameSpecified:
|
||||
body: Copyright (c) 2014-2…
|
||||
version: 4.7.0
|
||||
name: AFNetworking, nameSpecified:
|
||||
body: Copyright (c) 2011-2…
|
||||
version: 4.0.1
|
||||
|
||||
name: AFNetworking, nameSpecified:
|
||||
body: Copyright (c) 2011-2…
|
||||
version: 4.0.1
|
||||
|
||||
name: AFNetworking, nameSpecified:
|
||||
body: Copyright (c) 2011-2…
|
||||
version: 4.0.1
|
||||
|
||||
name: Alamofire, nameSpecified:
|
||||
body: Copyright (c) 2014-2…
|
||||
version: 4.7.0
|
||||
version: 5.4.3
|
||||
|
||||
name: Alamofire, nameSpecified:
|
||||
body: Copyright (c) 2014-2…
|
||||
version: 4.7.0
|
||||
version: 5.4.3
|
||||
|
||||
name: Appirater, nameSpecified:
|
||||
body: Copyright 2017. Aras…
|
||||
version: 2.3.1
|
||||
|
||||
name: Appirater, nameSpecified:
|
||||
body: Copyright 2017. Aras…
|
||||
version: 2.3.1
|
||||
|
||||
name: Appirater, nameSpecified:
|
||||
body: Copyright 2017. Aras…
|
||||
version: 2.3.1
|
||||
name: Alamofire, nameSpecified:
|
||||
body: Copyright (c) 2014-2…
|
||||
version: 5.4.3
|
||||
|
||||
name: ARChromeActivity, nameSpecified:
|
||||
body: ARChromeActivity
|
||||
|
@ -63,105 +63,99 @@ version: 4.0.2
|
|||
|
||||
name: ChatSecure-Push-iOS, nameSpecified:
|
||||
body: …
|
||||
version: 1.0
|
||||
version: 1.1
|
||||
|
||||
name: ChatSecure-Push-iOS, nameSpecified:
|
||||
body: …
|
||||
version: 1.0
|
||||
version: 1.1
|
||||
|
||||
name: ChatSecure-Push-iOS, nameSpecified:
|
||||
body: …
|
||||
version: 1.0
|
||||
version: 1.1
|
||||
|
||||
name: ChatSecureCore, nameSpecified:
|
||||
body: ChatSecure, an OTR-c…
|
||||
version: 1.0.0
|
||||
|
||||
name: ChatSecureCore, nameSpecified:
|
||||
body: ChatSecure, an OTR-c…
|
||||
version: 1.0.0
|
||||
|
||||
name: ChatSecureCore, nameSpecified:
|
||||
body: ChatSecure, an OTR-c…
|
||||
version: 1.0.0
|
||||
|
||||
name: CocoaAsyncSocket, nameSpecified:
|
||||
body: Public Domain Licens…
|
||||
version: 7.6.2
|
||||
version: 7.6.5
|
||||
|
||||
name: CocoaAsyncSocket, nameSpecified:
|
||||
body: Public Domain Licens…
|
||||
version: 7.6.2
|
||||
version: 7.6.5
|
||||
|
||||
name: CocoaAsyncSocket, nameSpecified:
|
||||
body: Public Domain Licens…
|
||||
version: 7.6.2
|
||||
version: 7.6.5
|
||||
|
||||
name: CocoaLumberjack, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 3.4.1
|
||||
body: BSD 3-Clause License…
|
||||
version: 3.7.2
|
||||
|
||||
name: CocoaLumberjack, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 3.4.1
|
||||
body: BSD 3-Clause License…
|
||||
version: 3.7.2
|
||||
|
||||
name: CocoaLumberjack, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 3.4.1
|
||||
|
||||
name: CPAProxy, nameSpecified:
|
||||
body: Copyright (c) 2013 C…
|
||||
version: 1.2.0
|
||||
|
||||
name: CPAProxy, nameSpecified:
|
||||
body: Copyright (c) 2013 C…
|
||||
version: 1.2.0
|
||||
|
||||
name: CPAProxy, nameSpecified:
|
||||
body: Copyright (c) 2013 C…
|
||||
version: 1.2.0
|
||||
body: BSD 3-Clause License…
|
||||
version: 3.7.2
|
||||
|
||||
name: DTFoundation, nameSpecified:
|
||||
body: Copyright (c) 2011, …
|
||||
version: 1.7.13
|
||||
version: 1.7.18
|
||||
|
||||
name: DTFoundation, nameSpecified:
|
||||
body: Copyright (c) 2011, …
|
||||
version: 1.7.13
|
||||
version: 1.7.18
|
||||
|
||||
name: DTFoundation, nameSpecified:
|
||||
body: Copyright (c) 2011, …
|
||||
version: 1.7.13
|
||||
version: 1.7.18
|
||||
|
||||
name: FormatterKit, nameSpecified:
|
||||
body: Copyright (c) 2011–2…
|
||||
version: 1.9.0
|
||||
|
||||
name: FormatterKit, nameSpecified:
|
||||
body: Copyright (c) 2011–2…
|
||||
version: 1.9.0
|
||||
|
||||
name: FormatterKit, nameSpecified:
|
||||
body: Copyright (c) 2011–2…
|
||||
version: 1.9.0
|
||||
|
||||
name: GCDWebServer, nameSpecified:
|
||||
body: Copyright (c) 2012-2…
|
||||
version: 3.4.2
|
||||
version: 3.5.4
|
||||
|
||||
name: GCDWebServer, nameSpecified:
|
||||
body: Copyright (c) 2012-2…
|
||||
version: 3.4.2
|
||||
version: 3.5.4
|
||||
|
||||
name: GCDWebServer, nameSpecified:
|
||||
body: Copyright (c) 2012-2…
|
||||
version: 3.4.2
|
||||
version: 3.5.4
|
||||
|
||||
name: gtm-http-fetcher, nameSpecified:
|
||||
body:
|
||||
…
|
||||
version: 1.1
|
||||
name: HTMLReader, nameSpecified:
|
||||
body: HTMLReader is in the…
|
||||
version: 2.1.7
|
||||
|
||||
name: gtm-http-fetcher, nameSpecified:
|
||||
body:
|
||||
…
|
||||
version: 1.1
|
||||
name: HTMLReader, nameSpecified:
|
||||
body: HTMLReader is in the…
|
||||
version: 2.1.7
|
||||
|
||||
name: gtm-http-fetcher, nameSpecified:
|
||||
body:
|
||||
…
|
||||
version: 1.1
|
||||
|
||||
name: gtm-oauth2, nameSpecified:
|
||||
body:
|
||||
…
|
||||
version: 1.1
|
||||
|
||||
name: gtm-oauth2, nameSpecified:
|
||||
body:
|
||||
…
|
||||
version: 1.1
|
||||
|
||||
name: gtm-oauth2, nameSpecified:
|
||||
body:
|
||||
…
|
||||
version: 1.1
|
||||
name: HTMLReader, nameSpecified:
|
||||
body: HTMLReader is in the…
|
||||
version: 2.1.7
|
||||
|
||||
name: IOCipher, nameSpecified:
|
||||
body: GNU LESSER GENER…
|
||||
|
@ -207,57 +201,63 @@ version: 1.5.1
|
|||
|
||||
name: KissXML, nameSpecified:
|
||||
body: Copyright (c) 2012, …
|
||||
version: 5.2.2
|
||||
version: 5.3.1
|
||||
|
||||
name: KissXML, nameSpecified:
|
||||
body: Copyright (c) 2012, …
|
||||
version: 5.2.2
|
||||
version: 5.3.1
|
||||
|
||||
name: KissXML, nameSpecified:
|
||||
body: Copyright (c) 2012, …
|
||||
version: 5.2.2
|
||||
|
||||
name: KSCrash, nameSpecified:
|
||||
body: Copyright (c) 2012 K…
|
||||
version: 1.15.18
|
||||
|
||||
name: KSCrash, nameSpecified:
|
||||
body: Copyright (c) 2012 K…
|
||||
version: 1.15.18
|
||||
|
||||
name: KSCrash, nameSpecified:
|
||||
body: Copyright (c) 2012 K…
|
||||
version: 1.15.18
|
||||
version: 5.3.1
|
||||
|
||||
name: Kvitto, nameSpecified:
|
||||
body: Copyright (c) 2015, …
|
||||
version: 1.0.3
|
||||
version: 1.0.6
|
||||
|
||||
name: Kvitto, nameSpecified:
|
||||
body: Copyright (c) 2015, …
|
||||
version: 1.0.3
|
||||
version: 1.0.6
|
||||
|
||||
name: Kvitto, nameSpecified:
|
||||
body: Copyright (c) 2015, …
|
||||
version: 1.0.3
|
||||
version: 1.0.6
|
||||
|
||||
name: KVOController, nameSpecified:
|
||||
body: BSD License
|
||||
|
||||
For KVO…
|
||||
version: 1.2.0
|
||||
|
||||
name: KVOController, nameSpecified:
|
||||
body: BSD License
|
||||
|
||||
For KVO…
|
||||
version: 1.2.0
|
||||
|
||||
name: KVOController, nameSpecified:
|
||||
body: BSD License
|
||||
|
||||
For KVO…
|
||||
version: 1.2.0
|
||||
|
||||
name: libidn, nameSpecified:
|
||||
body: libidn-podspec
|
||||
|
||||
The …
|
||||
version: 1.33
|
||||
version: 1.35
|
||||
|
||||
name: libidn, nameSpecified:
|
||||
body: libidn-podspec
|
||||
|
||||
The …
|
||||
version: 1.33
|
||||
version: 1.35
|
||||
|
||||
name: libidn, nameSpecified:
|
||||
body: libidn-podspec
|
||||
|
||||
The …
|
||||
version: 1.33
|
||||
version: 1.35
|
||||
|
||||
name: libsqlfs, nameSpecified:
|
||||
body: GNU LESSER GENER…
|
||||
|
@ -271,20 +271,62 @@ name: libsqlfs, nameSpecified:
|
|||
body: GNU LESSER GENER…
|
||||
version: 1.3.2
|
||||
|
||||
name: LumberjackConsole, nameSpecified:
|
||||
body: Apache License
|
||||
…
|
||||
version: 3.3.0
|
||||
name: LicensePlist, nameSpecified:
|
||||
body: MIT License
|
||||
|
||||
Copyrig…
|
||||
version: 3.13.0
|
||||
|
||||
name: LicensePlist, nameSpecified:
|
||||
body: MIT License
|
||||
|
||||
Copyrig…
|
||||
version: 3.13.0
|
||||
|
||||
name: LicensePlist, nameSpecified:
|
||||
body: MIT License
|
||||
|
||||
Copyrig…
|
||||
version: 3.13.0
|
||||
|
||||
name: LumberjackConsole, nameSpecified:
|
||||
body: Apache License
|
||||
…
|
||||
version: 3.3.0
|
||||
version: 3.3.1
|
||||
|
||||
name: LumberjackConsole, nameSpecified:
|
||||
body: Apache License
|
||||
…
|
||||
version: 3.3.0
|
||||
version: 3.3.1
|
||||
|
||||
name: LumberjackConsole, nameSpecified:
|
||||
body: Apache License
|
||||
…
|
||||
version: 3.3.1
|
||||
|
||||
name: Mantle, nameSpecified:
|
||||
body: **Copyright (c) GitH…
|
||||
version: 2.1.6
|
||||
|
||||
name: Mantle, nameSpecified:
|
||||
body: **Copyright (c) GitH…
|
||||
version: 2.1.6
|
||||
|
||||
name: Mantle, nameSpecified:
|
||||
body: **Copyright (c) GitH…
|
||||
version: 2.1.6
|
||||
|
||||
name: MBProgressHUD, nameSpecified:
|
||||
body: Copyright © 2009-202…
|
||||
version: 1.2.0
|
||||
|
||||
name: MBProgressHUD, nameSpecified:
|
||||
body: Copyright © 2009-202…
|
||||
version: 1.2.0
|
||||
|
||||
name: MBProgressHUD, nameSpecified:
|
||||
body: Copyright © 2009-202…
|
||||
version: 1.2.0
|
||||
|
||||
name: MWFeedParser, nameSpecified:
|
||||
body: Copyright (c) 2010 M…
|
||||
|
@ -298,18 +340,6 @@ name: MWFeedParser, nameSpecified:
|
|||
body: Copyright (c) 2010 M…
|
||||
version: 1.0.1
|
||||
|
||||
name: Navajo, nameSpecified:
|
||||
body: Copyright (c) 2014 M…
|
||||
version: 0.0.1
|
||||
|
||||
name: Navajo, nameSpecified:
|
||||
body: Copyright (c) 2014 M…
|
||||
version: 0.0.1
|
||||
|
||||
name: Navajo, nameSpecified:
|
||||
body: Copyright (c) 2014 M…
|
||||
version: 0.0.1
|
||||
|
||||
name: NBUCore, nameSpecified:
|
||||
body:
|
||||
…
|
||||
|
@ -325,29 +355,41 @@ body:
|
|||
…
|
||||
version: 2.1.0
|
||||
|
||||
name: OTRKit, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 2.0.0
|
||||
name: OTRAssets, nameSpecified:
|
||||
body: ChatSecure, an OTR-c…
|
||||
version: 0.1.0
|
||||
|
||||
name: OTRAssets, nameSpecified:
|
||||
body: ChatSecure, an OTR-c…
|
||||
version: 0.1.0
|
||||
|
||||
name: OTRAssets, nameSpecified:
|
||||
body: ChatSecure, an OTR-c…
|
||||
version: 0.1.0
|
||||
|
||||
name: OTRKit, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 2.0.0
|
||||
version: 3.0.0
|
||||
|
||||
name: OTRKit, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 2.0.0
|
||||
version: 3.0.0
|
||||
|
||||
name: OTRKit, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 3.0.0
|
||||
|
||||
name: ParkedTextField, nameSpecified:
|
||||
body: The MIT License (MIT…
|
||||
version: 0.4.0
|
||||
version: 1.0.0
|
||||
|
||||
name: ParkedTextField, nameSpecified:
|
||||
body: The MIT License (MIT…
|
||||
version: 0.4.0
|
||||
version: 1.0.0
|
||||
|
||||
name: ParkedTextField, nameSpecified:
|
||||
body: The MIT License (MIT…
|
||||
version: 0.4.0
|
||||
version: 1.0.0
|
||||
|
||||
name: ProxyKit, nameSpecified:
|
||||
body: The MIT License (MIT…
|
||||
|
@ -361,6 +403,18 @@ name: ProxyKit, nameSpecified:
|
|||
body: The MIT License (MIT…
|
||||
version: 1.2.0
|
||||
|
||||
name: PureLayout, nameSpecified:
|
||||
body: This code is distrib…
|
||||
version: 3.1.8
|
||||
|
||||
name: PureLayout, nameSpecified:
|
||||
body: This code is distrib…
|
||||
version: 3.1.8
|
||||
|
||||
name: PureLayout, nameSpecified:
|
||||
body: This code is distrib…
|
||||
version: 3.1.8
|
||||
|
||||
name: QRCodeReaderViewController, nameSpecified:
|
||||
body: The MIT License (MIT…
|
||||
version: 4.0.2
|
||||
|
@ -373,89 +427,101 @@ name: QRCodeReaderViewController, nameSpecified:
|
|||
body: The MIT License (MIT…
|
||||
version: 4.0.2
|
||||
|
||||
name: Reveal-SDK, nameSpecified:
|
||||
body: # REVEAL LICENSE AGR…
|
||||
version: 13
|
||||
name: SAMKeychain, nameSpecified:
|
||||
body: Copyright (c) 2010-2…
|
||||
version: 1.5.3
|
||||
|
||||
name: Reveal-SDK, nameSpecified:
|
||||
body: # REVEAL LICENSE AGR…
|
||||
version: 13
|
||||
name: SAMKeychain, nameSpecified:
|
||||
body: Copyright (c) 2010-2…
|
||||
version: 1.5.3
|
||||
|
||||
name: Reveal-SDK, nameSpecified:
|
||||
body: # REVEAL LICENSE AGR…
|
||||
version: 13
|
||||
name: SAMKeychain, nameSpecified:
|
||||
body: Copyright (c) 2010-2…
|
||||
version: 1.5.3
|
||||
|
||||
name: SignalProtocolC, nameSpecified:
|
||||
body: Copyright 20…
|
||||
version: 2.3.1
|
||||
body: Copy…
|
||||
version: 2.3.2
|
||||
|
||||
name: SignalProtocolC, nameSpecified:
|
||||
body: Copyright 20…
|
||||
version: 2.3.1
|
||||
body: Copy…
|
||||
version: 2.3.2
|
||||
|
||||
name: SignalProtocolC, nameSpecified:
|
||||
body: Copyright 20…
|
||||
version: 2.3.1
|
||||
body: Copy…
|
||||
version: 2.3.2
|
||||
|
||||
name: SignalProtocolObjC, nameSpecified:
|
||||
body: Copyright 2016-2017 …
|
||||
version: 1.0.0
|
||||
version: 1.1.0
|
||||
|
||||
name: SignalProtocolObjC, nameSpecified:
|
||||
body: Copyright 2016-2017 …
|
||||
version: 1.0.0
|
||||
version: 1.1.0
|
||||
|
||||
name: SignalProtocolObjC, nameSpecified:
|
||||
body: Copyright 2016-2017 …
|
||||
version: 1.0.0
|
||||
version: 1.1.0
|
||||
|
||||
name: SQLCipher, nameSpecified:
|
||||
body: Copyright (c) 2008, …
|
||||
version: 3.4.2
|
||||
version: 4.4.3
|
||||
|
||||
name: SQLCipher, nameSpecified:
|
||||
body: Copyright (c) 2008, …
|
||||
version: 3.4.2
|
||||
version: 4.4.3
|
||||
|
||||
name: SQLCipher, nameSpecified:
|
||||
body: Copyright (c) 2008, …
|
||||
version: 3.4.2
|
||||
version: 4.4.3
|
||||
|
||||
name: TUSafariActivity, nameSpecified:
|
||||
body: Copyright (c) 2012 T…
|
||||
version: 1.0.4
|
||||
name: TTTAttributedLabel, nameSpecified:
|
||||
body: Copyright (c) 2011 M…
|
||||
version: 2.0.0
|
||||
|
||||
name: TUSafariActivity, nameSpecified:
|
||||
body: Copyright (c) 2012 T…
|
||||
version: 1.0.4
|
||||
name: TTTAttributedLabel, nameSpecified:
|
||||
body: Copyright (c) 2011 M…
|
||||
version: 2.0.0
|
||||
|
||||
name: TUSafariActivity, nameSpecified:
|
||||
body: Copyright (c) 2012 T…
|
||||
version: 1.0.4
|
||||
name: TTTAttributedLabel, nameSpecified:
|
||||
body: Copyright (c) 2011 M…
|
||||
version: 2.0.0
|
||||
|
||||
name: XLForm, nameSpecified:
|
||||
body: The MIT License (MIT…
|
||||
version: 4.3.0
|
||||
|
||||
name: XLForm, nameSpecified:
|
||||
body: The MIT License (MIT…
|
||||
version: 4.3.0
|
||||
|
||||
name: XLForm, nameSpecified:
|
||||
body: The MIT License (MIT…
|
||||
version: 4.3.0
|
||||
|
||||
name: XMPPFramework, nameSpecified:
|
||||
body: GCDAsyncSocket: (Pub…
|
||||
version: 4.0
|
||||
version: 4.1.1
|
||||
|
||||
name: XMPPFramework, nameSpecified:
|
||||
body: GCDAsyncSocket: (Pub…
|
||||
version: 4.0
|
||||
version: 4.1.1
|
||||
|
||||
name: XMPPFramework, nameSpecified:
|
||||
body: GCDAsyncSocket: (Pub…
|
||||
version: 4.0
|
||||
version: 4.1.1
|
||||
|
||||
name: YapDatabase, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 3.0.2
|
||||
version: 4.0.1
|
||||
|
||||
name: YapDatabase, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 3.0.2
|
||||
version: 4.0.1
|
||||
|
||||
name: YapDatabase, nameSpecified:
|
||||
body: Software License Agr…
|
||||
version: 3.0.2
|
||||
version: 4.0.1
|
||||
|
||||
name: YapTaskQueue, nameSpecified:
|
||||
body: This is free and une…
|
||||
|
@ -469,29 +535,19 @@ name: YapTaskQueue, nameSpecified:
|
|||
body: This is free and une…
|
||||
version: 0.3.0
|
||||
|
||||
name: AFNetworking, nameSpecified: , owner: AFNetworking, version: 3.2.0
|
||||
name: ZXingObjC, nameSpecified:
|
||||
body: …
|
||||
version: 3.6.5
|
||||
|
||||
name: FormatterKit, nameSpecified: , owner: mattt, version: 1.8.2
|
||||
name: ZXingObjC, nameSpecified:
|
||||
body: …
|
||||
version: 3.6.5
|
||||
|
||||
name: HTMLReader, nameSpecified: , owner: nolanw, version: 1d0dda3
|
||||
name: ZXingObjC, nameSpecified:
|
||||
body: …
|
||||
version: 3.6.5
|
||||
|
||||
name: KVOController, nameSpecified: , owner: facebook, version: v1.2.0
|
||||
|
||||
name: Mantle, nameSpecified: , owner: ChatSecure, version: 4c1a09c
|
||||
|
||||
name: MBProgressHUD, nameSpecified: , owner: jdg, version: 1.1.0
|
||||
|
||||
name: PureLayout, nameSpecified: , owner: PureLayout, version: v3.0.2
|
||||
|
||||
name: SAMKeychain, nameSpecified: , owner: soffes, version: v1.5.3
|
||||
|
||||
name: TTTAttributedLabel, nameSpecified: , owner: TTTAttributedLabel, version: 2.0.0
|
||||
|
||||
name: XLForm, nameSpecified: , owner: xmartlabs, version: 4.0.0
|
||||
|
||||
name: ZXingObjC, nameSpecified: , owner: TheLevelUp, version: 3.2.2
|
||||
|
||||
name: libevent, nameSpecified: , version: 2.0.22
|
||||
name: libevent, nameSpecified: , version: 2.1.10
|
||||
body: Libevent is availabl…
|
||||
|
||||
name: libgcrypt, nameSpecified: , version: 1.8.1
|
||||
|
@ -500,16 +556,19 @@ body: Libgcrypt - The GNU …
|
|||
name: libgpg-error, nameSpecified: , version:
|
||||
body: Package: libgpg-erro…
|
||||
|
||||
name: liblzma, nameSpecified: , version: 5.2.4
|
||||
body: liblzma is in the pu…
|
||||
|
||||
name: libotr, nameSpecified: , version: 4.1.1
|
||||
body: Off-the-Record Messa…
|
||||
|
||||
name: OpenSSL, nameSpecified: , version: 1.0.2n
|
||||
name: OpenSSL, nameSpecified: , version: 1.1.1c
|
||||
body: LICENSE ISSUES
|
||||
===…
|
||||
|
||||
name: Tor, nameSpecified: , version: 0.3.0.13
|
||||
name: Tor, nameSpecified: , version: 0.4.0.5
|
||||
body: This file contains t…
|
||||
|
||||
add-version-numbers: true
|
||||
|
||||
LicensePlist Version: 1.8.3
|
||||
LicensePlist Version: 3.13.0
|
|
@ -4,11 +4,17 @@
|
|||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Title</key>
|
||||
<string>Licenses</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/AFNetworking</string>
|
||||
<key>Title</key>
|
||||
<string>AFNetworking (3.2.0)</string>
|
||||
<string>AFNetworking (4.0.1)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -16,15 +22,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/Alamofire</string>
|
||||
<key>Title</key>
|
||||
<string>Alamofire (4.7.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/Appirater</string>
|
||||
<key>Title</key>
|
||||
<string>Appirater (2.3.1)</string>
|
||||
<string>Alamofire (5.4.3)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -56,7 +54,15 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/ChatSecure-Push-iOS</string>
|
||||
<key>Title</key>
|
||||
<string>ChatSecure-Push-iOS (1.0)</string>
|
||||
<string>ChatSecure-Push-iOS (1.1)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/ChatSecureCore</string>
|
||||
<key>Title</key>
|
||||
<string>ChatSecureCore (1.0.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -64,7 +70,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/CocoaAsyncSocket</string>
|
||||
<key>Title</key>
|
||||
<string>CocoaAsyncSocket (7.6.2)</string>
|
||||
<string>CocoaAsyncSocket (7.6.5)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -72,15 +78,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/CocoaLumberjack</string>
|
||||
<key>Title</key>
|
||||
<string>CocoaLumberjack (3.4.1)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/CPAProxy</string>
|
||||
<key>Title</key>
|
||||
<string>CPAProxy (1.2.0)</string>
|
||||
<string>CocoaLumberjack (3.7.2)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -88,7 +86,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/DTFoundation</string>
|
||||
<key>Title</key>
|
||||
<string>DTFoundation (1.7.13)</string>
|
||||
<string>DTFoundation (1.7.18)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -96,7 +94,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/FormatterKit</string>
|
||||
<key>Title</key>
|
||||
<string>FormatterKit (1.8.2)</string>
|
||||
<string>FormatterKit (1.9.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -104,23 +102,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/GCDWebServer</string>
|
||||
<key>Title</key>
|
||||
<string>GCDWebServer (3.4.2)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/gtm-http-fetcher</string>
|
||||
<key>Title</key>
|
||||
<string>gtm-http-fetcher (1.1)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/gtm-oauth2</string>
|
||||
<key>Title</key>
|
||||
<string>gtm-oauth2 (1.1)</string>
|
||||
<string>GCDWebServer (3.5.4)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -128,7 +110,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/HTMLReader</string>
|
||||
<key>Title</key>
|
||||
<string>HTMLReader (1d0dda3)</string>
|
||||
<string>HTMLReader (2.1.7)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -160,15 +142,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/KissXML</string>
|
||||
<key>Title</key>
|
||||
<string>KissXML (5.2.2)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/KSCrash</string>
|
||||
<key>Title</key>
|
||||
<string>KSCrash (1.15.18)</string>
|
||||
<string>KissXML (5.3.1)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -176,7 +150,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/Kvitto</string>
|
||||
<key>Title</key>
|
||||
<string>Kvitto (1.0.3)</string>
|
||||
<string>Kvitto (1.0.6)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -184,7 +158,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/KVOController</string>
|
||||
<key>Title</key>
|
||||
<string>KVOController (v1.2.0)</string>
|
||||
<string>KVOController (1.2.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -192,7 +166,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/libevent</string>
|
||||
<key>Title</key>
|
||||
<string>libevent (2.0.22)</string>
|
||||
<string>libevent (2.1.10)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -216,7 +190,15 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/libidn</string>
|
||||
<key>Title</key>
|
||||
<string>libidn (1.33)</string>
|
||||
<string>libidn (1.35)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/liblzma</string>
|
||||
<key>Title</key>
|
||||
<string>liblzma (5.2.4)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -236,11 +218,19 @@
|
|||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/LicensePlist</string>
|
||||
<key>Title</key>
|
||||
<string>LicensePlist (3.13.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/LumberjackConsole</string>
|
||||
<key>Title</key>
|
||||
<string>LumberjackConsole (3.3.0)</string>
|
||||
<string>LumberjackConsole (3.3.1)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -248,7 +238,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/Mantle</string>
|
||||
<key>Title</key>
|
||||
<string>Mantle (4c1a09c)</string>
|
||||
<string>Mantle (2.1.6)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -256,7 +246,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/MBProgressHUD</string>
|
||||
<key>Title</key>
|
||||
<string>MBProgressHUD (1.1.0)</string>
|
||||
<string>MBProgressHUD (1.2.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -268,14 +258,6 @@
|
|||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/Navajo</string>
|
||||
<key>Title</key>
|
||||
<string>Navajo (0.0.1)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/NBUCore</string>
|
||||
|
@ -288,7 +270,15 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/OpenSSL</string>
|
||||
<key>Title</key>
|
||||
<string>OpenSSL (1.0.2n)</string>
|
||||
<string>OpenSSL (1.1.1c)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/OTRAssets</string>
|
||||
<key>Title</key>
|
||||
<string>OTRAssets (0.1.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -296,7 +286,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/OTRKit</string>
|
||||
<key>Title</key>
|
||||
<string>OTRKit (2.0.0)</string>
|
||||
<string>OTRKit (3.0.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -304,7 +294,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/ParkedTextField</string>
|
||||
<key>Title</key>
|
||||
<string>ParkedTextField (0.4.0)</string>
|
||||
<string>ParkedTextField (1.0.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -320,7 +310,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/PureLayout</string>
|
||||
<key>Title</key>
|
||||
<string>PureLayout (v3.0.2)</string>
|
||||
<string>PureLayout (3.1.8)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -332,19 +322,11 @@
|
|||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/Reveal-SDK</string>
|
||||
<key>Title</key>
|
||||
<string>Reveal-SDK (13)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/SAMKeychain</string>
|
||||
<key>Title</key>
|
||||
<string>SAMKeychain (v1.5.3)</string>
|
||||
<string>SAMKeychain (1.5.3)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -352,7 +334,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/SignalProtocolC</string>
|
||||
<key>Title</key>
|
||||
<string>SignalProtocolC (2.3.1)</string>
|
||||
<string>SignalProtocolC (2.3.2)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -360,7 +342,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/SignalProtocolObjC</string>
|
||||
<key>Title</key>
|
||||
<string>SignalProtocolObjC (1.0.0)</string>
|
||||
<string>SignalProtocolObjC (1.1.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -368,7 +350,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/SQLCipher</string>
|
||||
<key>Title</key>
|
||||
<string>SQLCipher (3.4.2)</string>
|
||||
<string>SQLCipher (4.4.3)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -376,7 +358,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/Tor</string>
|
||||
<key>Title</key>
|
||||
<string>Tor (0.3.0.13)</string>
|
||||
<string>Tor (0.4.0.5)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -388,19 +370,11 @@
|
|||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/TUSafariActivity</string>
|
||||
<key>Title</key>
|
||||
<string>TUSafariActivity (1.0.4)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/XLForm</string>
|
||||
<key>Title</key>
|
||||
<string>XLForm (4.0.0)</string>
|
||||
<string>XLForm (4.3.0)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -408,7 +382,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/XMPPFramework</string>
|
||||
<key>Title</key>
|
||||
<string>XMPPFramework (4.0)</string>
|
||||
<string>XMPPFramework (4.1.1)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -416,7 +390,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/YapDatabase</string>
|
||||
<key>Title</key>
|
||||
<string>YapDatabase (3.0.2)</string>
|
||||
<string>YapDatabase (4.0.1)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
@ -432,7 +406,7 @@
|
|||
<key>File</key>
|
||||
<string>com.mono0926.LicensePlist/ZXingObjC</string>
|
||||
<key>Title</key>
|
||||
<string>ZXingObjC (3.2.2)</string>
|
||||
<string>ZXingObjC (3.6.5)</string>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
</dict>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright (c) 2011-2016 Alamofire Software Foundation (http://alamofire.org/)
|
||||
<string>Copyright (c) 2011-2020 Alamofire Software Foundation (http://alamofire.org/)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
|
||||
<string>Copyright (c) 2014-2021 Alamofire Software Foundation (http://alamofire.org/)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -1,108 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright (c) 2013 Claudiu-Vlad Ursache
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
--
|
||||
|
||||
ENCRYPTION NOTICE / APP DISTRIBUTION NOTES
|
||||
|
||||
This software uses strong cryptography and may it fall under certain
|
||||
export/import and/or use restrictions in some other parts of the world.
|
||||
BEFORE using any encryption software, please check your country's laws,
|
||||
regulations and policies concerning the import, possession, or use,
|
||||
and re-export of encryption software, to see if this is permitted.
|
||||
See http://www.wassenaar.org/ for more information.
|
||||
|
||||
This source package does not directly contain encryption software. Please see
|
||||
the OpenSSL, libevent, and Tor license portions for links to the encryption-containing
|
||||
portions of this application. Distributions of this source package
|
||||
(and only this source package, without external dependencies) may not be
|
||||
considered encryption software depending on the regulations of your jurisdiction.
|
||||
|
||||
Distribution of binary versions of this application may be subject to
|
||||
further export/import and/or use restrictions. (iOS developers: see the
|
||||
"My application uses a public domain library (openssh)..." question in the
|
||||
"World Wide Trade Compliance for the App Store" page on the Apple iTunes Connect
|
||||
FAQs[3] site. Also note the "I intend to distribute my app only in the United
|
||||
States and Canada..." question on that FAQ page.)
|
||||
|
||||
[3]: https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/wa/jumpTo?page=faqs
|
||||
|
||||
--
|
||||
|
||||
OpenSSL is not bundled in the source tree of this application, but is required
|
||||
to compile the library. NOTE: Binary forms of this application are subject
|
||||
to the license and must reproduce the copyright notices and disclaimers
|
||||
located in the full license (link below).
|
||||
|
||||
OpenSSL is available under the OpenSSL License License & Original SSLeay License:
|
||||
|
||||
Copyright (c) 1998-2011 The OpenSSL Project.
|
||||
|
||||
Full license available at:
|
||||
|
||||
https://www.openssl.org/source/license.html
|
||||
|
||||
--
|
||||
|
||||
Libevent is not bundled in the source tree of this application, but is required
|
||||
to compile the library. NOTE: Binary forms of this application are subject
|
||||
to the license and must reproduce the copyright notices and disclaimers
|
||||
located in the full license (link below).
|
||||
|
||||
Libevent is available for use under the following license, commonly known
|
||||
as the 3-clause (or "modified") BSD license:
|
||||
|
||||
Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
Copyright (c) 2007-2010 Niels Provos and Nick Mathewson
|
||||
|
||||
Full license available at:
|
||||
|
||||
http://libevent.org/LICENSE.txt
|
||||
|
||||
--
|
||||
|
||||
Tor is not bundled in the source tree of this application, but is required
|
||||
to compile the library. NOTE: Binary forms of this application are subject
|
||||
to the license and must reproduce the copyright notices and disclaimers
|
||||
located in the full license (link below).
|
||||
|
||||
Tor is available under a BSD-style license:
|
||||
|
||||
Copyright (c) 2001-2004, Roger Dingledine
|
||||
Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
|
||||
Copyright (c) 2007-2013, The Tor Project, Inc.
|
||||
|
||||
Full license available at:
|
||||
|
||||
https://gitweb.torproject.org/tor.git?a=blob_plain;hb=HEAD;f=LICENSE</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,32 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>ChatSecure, an OTR-compatible iOS encrypted chat client
|
||||
Copyright (C) 2012, Chris Ballinger
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
If you would like to relicense this code to sell it on the App Store,
|
||||
please contact me at chris@chatsecure.org.</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -6,24 +6,21 @@
|
|||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Software License Agreement (BSD License)
|
||||
<string>BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2010-2016, Deusty, LLC
|
||||
Copyright (c) 2010-2021, Deusty, LLC
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
with or without modification, are permitted provided that the following conditions are met:
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer.
|
||||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Neither the name of Deusty nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of Deusty, LLC.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>
|
||||
3. Neither the name of Deusty nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Deusty, LLC.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright (c) 2011–2015 Mattt Thompson (http://mattt.me/)
|
||||
<string>Copyright (c) 2011–2019 Mattt Thompson (http://mattt.me/)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright (c) 2012 Karl Stenerud
|
||||
|
||||
Licencing: MIT (https://opensource.org/licenses/MIT)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in the documentation of any redistributions of the template files themselves (but not in projects built using the templates).
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -6,7 +6,9 @@
|
|||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright (c) 2014 Mattt Thompson (http://mattt.me/)
|
||||
<string>MIT License
|
||||
|
||||
Copyright (c) 2017 Masayuki Ono
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -15,16 +17,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
|
@ -6,7 +6,7 @@
|
|||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright © 2009-2016 Matej Bukovinski
|
||||
<string>Copyright © 2009-2020 Matej Bukovinski
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -13,11 +13,19 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
---
|
||||
|
||||
**This project uses portions of code from the Proton framework.**
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>----------------------------------------</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>**This project uses portions of code from the Proton framework.**
|
||||
**Proton is copyright (c) 2012, Bitswift, Inc.**
|
||||
**All rights reserved.**
|
||||
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>ChatSecure, an OTR-compatible iOS encrypted chat client
|
||||
Copyright (C) 2012, Chris Ballinger
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
If you would like to relicense this code to sell it on the App Store,
|
||||
please contact me at chris@chatsecure.org.</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -1,171 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string># REVEAL LICENSE AGREEMENT v2.0
|
||||
|
||||
## NOTICE TO USER:
|
||||
|
||||
This is a legally enforceable agreement between you (__"you"__ or __"yours"__ and other grammatical equivalents) and Itty Bitty Apps Pty. Ltd. (__"the Company"__), which covers your use of the Reveal software product that accompanies this Agreement and related software components, which may include associated media, printed materials, and "online" or electronic documentation. All such software and materials are referred to herein as the __"Software"__ or __"the Reveal Software"__. If you do not agree to the terms of this License Agreement, then do not install or use the Software. By explicitly accepting this License Agreement, or by installing, copying, downloading, accessing, or otherwise using the Software, you are acknowledging and agreeing to be bound by the following terms:
|
||||
|
||||
## 1. DEFINITIONS
|
||||
|
||||
__(a) "Software"__ shall mean the Reveal software including any Updates thereto, in object and source form, and the media and Documentation provided by the Company to you and for which you are granted a license pursuant to this Agreement.
|
||||
|
||||
__(b) "Documentation"__ shall mean the printed or online written reference material furnished to you in conjunction with the Software, including, without limitation, instructions, guidelines, and end user guides.
|
||||
|
||||
__(c) "Intellectual Property Rights"__ shall mean all intellectual property rights, including, without limitation, patent, copyright, trademark, and trade secret.
|
||||
|
||||
__(d) "Updates"__ shall mean a modification, error correction, bug fix, new release, or other update to or for the Software.
|
||||
|
||||
|
||||
## 2. LICENSE GRANT
|
||||
|
||||
The Company may, at its sole discretion, grant you a Trial License, a Personal License, a Commercial Seat License, a Site License or an Enterprise License.
|
||||
|
||||
If you have not purchased or otherwise rightfully obtained a Personal License, a Commercial Seat License, a Site License or an Enterprise License for the Reveal Software, the Trial License Terms (2.1) are applicable to your use of the Reveal Software. The Trial License Terms are also applicable to any usage of the Reveal Software by you that is not covered under any other licenses you may have.
|
||||
|
||||
The Personal License Terms (2.2) apply if you have a Personal License. The Commercial Seat License Terms (2.3) apply if you have a Commercial Seat License. The Site License Terms (2.4) apply if you have a Site License. The Enterprise License Terms (2.5) apply if you have an Enterprise License.
|
||||
|
||||
The General Terms (3) apply in all cases.
|
||||
|
||||
### 2.1 TRIAL LICENSE TERMS
|
||||
|
||||
The Company grants you a non-exclusive license to use the Software for time-limited evaluation purposes, only in accordance with the terms and conditions set forth herein. The Software may be used for a period of 14 calendar days from the time of activation. Upon lapse of such trial period all of or part of the functionality of the Software will be disabled automatically.
|
||||
|
||||
If you wish to use the Software after the trial period, you must purchase a Personal License, a Commercial Seat License, a Site License or an Enterprise License. The Company may extend to you an expiring license key, in which event such a license key will be considered a means to extend the trial period under the Trial License Terms.
|
||||
|
||||
|
||||
### 2.2 PERSONAL LICENSE TERMS
|
||||
|
||||
The Company grants you a non-exclusive license to use the Software, only in accordance with the terms and conditions set forth herein. This License grants you the right to activate and use the Software on no more than 2 computers primarily used by you. Use of the Software under this license may be for both commercial and non-commercial purposes. Personal licences are not available to companies, commercial institutions, government agencies or business entities.
|
||||
|
||||
|
||||
### 2.3 COMMERCIAL SEAT LICENSE TERMS
|
||||
|
||||
The Company grants you a non-exclusive license to use the Software, only in accordance with the terms and conditions set forth herein. This License is only available to companies, commercial institutions, government agencies and business entities.
|
||||
|
||||
This License does not allow the Software to be activated and used on computers that are not either a) owned by you, b) owned by any fully owned subsidiary of yours, c) owned by or operated primarily by your employees or employees of any fully owned subsidiary of yours. A Commercial Seat License must be purchased for every person employed by you or employed by any fully owned subsidiary of yours wishing to use the Software.
|
||||
|
||||
This license is granted exclusively on a per-employee basis within your organisation and is not transferable to another current employee without written permission. This License grants the right to activate and use the Software on no more than 2 computers used by the employee.
|
||||
|
||||
This License does not allow the use of the Software other than for business purposes of your company. If entering into a Commercial Seat License you personally warrant that you have full legal authority to enter into this agreement on behalf of your employer.
|
||||
|
||||
|
||||
### 2.4 SITE LICENSE TERMS
|
||||
|
||||
The Company grants you a non-exclusive license to use the Software, only in accordance with the terms and conditions set forth herein. This License is only available to companies, commercial institutions, government agencies and business entities.
|
||||
|
||||
This License does not allow the Software to be activated and used on computers that are not either a) owned by you, b) owned by any fully owned subsidiary of yours, c) owned by or operated primarily by your employees or employees of any fully owned subsidiary of yours.
|
||||
|
||||
Unless otherwise specified, any Site License you acquire from the Company is valid only for use at the business locations listed on your sales invoice.
|
||||
|
||||
This License does not allow the use of the Software other than for business purposes of your company. If entering into a Site License you personally warrant that you have full legal authority to enter into this agreement on behalf of your employer.
|
||||
|
||||
|
||||
### 2.5 ENTERPRISE LICENSE TERMS
|
||||
|
||||
The Company grants you a non-exclusive license to use the Software, only in accordance with the terms and conditions set forth herein. This License is only available to companies, commercial institutions, government agencies and business entities.
|
||||
|
||||
This License does not allow the Software to be activated and used on computers that are not either a) owned by you, b) owned by any fully owned subsidiary of yours, c) owned by or operated primarily by your employees or employees of any fully owned subsidiary of yours.
|
||||
|
||||
This License allows global use of the Software by all employees or employees of any fully owned subsidiary of the company, commercial institution, government agency or business entity listed in your sales invoice.
|
||||
|
||||
This License does not allow the use of the Software other than for business purposes of your company. If entering into an Enterprise License you personally warrant that you have full legal authority to enter into this agreement on behalf of your employer.
|
||||
|
||||
|
||||
## 3. GENERAL TERMS
|
||||
|
||||
### 3.1 TITLE
|
||||
|
||||
‘REVEAL’™ and ‘ITTY BITTY APPS’™ represent proprietary common law trademarks owned by the Company and must not be used without written permission.
|
||||
|
||||
The Company shall own and retain all right, title and interest in and to all Intellectual Property Rights related to the Software, the Documentation and all improvements to any of them however so created. You do not acquire any other rights, express or implied, in the Software. ALL RIGHTS NOT EXPRESSLY GRANTED HEREUNDER ARE RESERVED TO THE COMPANY.
|
||||
|
||||
### 3.2 ARCHIVAL OR BACKUP COPIES
|
||||
|
||||
You may copy the Software for backup and archival purposes only, provided that the original and each copy is kept in your possession and that your installation and use of the Software does not exceed that allowed in the "License Grant" section above.
|
||||
|
||||
### 3.3 THINGS YOU MUST NOT DO
|
||||
|
||||
The Software and Documentation are protected by Australian and international copyright law. You must treat the Software and Documentation like any other copyrighted material—for example, a book. You may not:
|
||||
|
||||
* copy the Documentation,
|
||||
* copy the Software except to make archival or backup copies as provided above,
|
||||
* modify or adapt the Software or merge it into another program,
|
||||
* reverse engineer, disassemble, decompile or make any attempt to discover the source code of the Software,
|
||||
* place the Software onto a server so that it is accessible via a public network such as the Internet, or
|
||||
* sublicense, rent, lease, sublicense or lend any portion of the Software or Documentation.
|
||||
|
||||
### 3.4 LIMITATION OF LICENSE VALIDITY
|
||||
|
||||
Any License to use the Software granted to you under this License Agreement is limited to the release of the Software available at the time of purchase plus all releases of the Software for 12 months from the time of purchase exclusively. The Company reserves the right to change the terms of this agreement in any future major or minor release of the software.
|
||||
|
||||
### 3.5 ONLINE ACTIVATION
|
||||
|
||||
The Software requires activation in order to use it under the terms of this agreement. If you do not activate the Software, all of or part of the functionality of the Software will disable automatically. The Company may at its sole discretion decide to adjust the exact technical conditions under which unactivated copies of the Software cease to work. You need an active, functional internet connection to activate your copy of the Software. Your licensed use of the Software is bound to the computer(s) you used to complete activation. You may need to reactivate your copy of the Software after replacing the logic board or otherwise changing the hardware configuration of your computer. You may need to contact the Company to complete reactivation.
|
||||
|
||||
### 3.6 ADDITIONAL SERVICES
|
||||
|
||||
Fees may apply for additional services and products offered by the company and others, such as services that integrate with the Software or extend the functionality of the Software.
|
||||
|
||||
### 3.7 TECHNICAL AND RELATED INFORMATION
|
||||
|
||||
The Company and its subsidiaries may collect and use technical and related information, such as technical information concerning your computer, system and application software. The Company does not collect (a) any information that identifies your work, (b) any file names or file contents of anything you work on using the Software. The Company and its subsidiaries are free to use the collected information in any form that does not personally identify you.
|
||||
|
||||
### 3.8 PRIVACY
|
||||
|
||||
The Company will not sell or in any way license usage of your personal information to third parties. The Company will make reasonable efforts to keep your personal information secure.
|
||||
|
||||
### 3.9 TRANSFERS
|
||||
|
||||
With prior notice to the Company, you may transfer all your rights to use the Software and Documentation only once and permanently to another person or legal entity provided you transfer this License Agreement, the Software and Documentation, including all copies, updates and prior versions to such person or entity and that you retain no copies, including copies stored on computer. The receiving person or legal entity must satisfy the conditions of the applicable license terms set out in section 2.
|
||||
|
||||
### 3.10 LIMITED WARRANTY
|
||||
|
||||
We warrant that for a period of 14 days after delivery of this copy of the Software to you the Software will perform in substantial accordance with the Documentation.
|
||||
|
||||
To the extent permitted by applicable law, THE FOREGOING LIMITED WARRANTY IS IN LIEU OF ALL OTHER WARRANTIES OR CONDITIONS, EXPRESS OR IMPLIED, AND WE DISCLAIM ANY AND ALL IMPLIED WARRANTIES OR CONDITIONS, INCLUDING ANY IMPLIED WARRANTY OF TITLE, NONINFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, regardless of whether we know or had reason to know of your particular needs. No employee, agent, dealer or distributor of ours is authorized to modify this limited warranty, nor to make any additional warranties.
|
||||
SOME STATES DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
### 3.11 LIMITED REMEDY
|
||||
|
||||
Our entire liability and your exclusive remedy for breach of the foregoing warranty shall be, at our option, to return the price you paid minus fees incurred to transfer those funds to you.
|
||||
|
||||
IN NO EVENT WILL WE BE LIABLE TO YOU FOR ANY DIRECT OR INDIRECT DAMAGES, INCLUDING ANY LOST PROFITS, LOST SAVINGS, OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING FROM THE USE OR THE INABILITY TO USE THE SOFTWARE (EVEN IF WE OR AN AUTHORIZED DEALER OR DISTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF THESE DAMAGES), OR FOR ANY CLAIM BY ANY OTHER PARTY.
|
||||
SOME STATES DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
### 3.12 TERM AND TERMINATION
|
||||
|
||||
This license agreement takes effect upon your use of the software and remains effective until terminated. You may terminate it at any time by destroying all copies of the Software and Documentation in your possession. It will also automatically terminate if you fail to comply with any term or condition of this license agreement. You hereby agree that on termination of this license to permanently destroy all copies of the Software and Documentation in your possession.
|
||||
|
||||
### 3.13 CONFIDENTIALITY
|
||||
|
||||
The Software contains trade secrets and proprietary know-how that belong to the Company and it is being made available to you in strict confidence. ANY USE OR DISCLOSURE OF THE SOFTWARE, OR OF ITS ALGORITHMS, PROTOCOLS OR INTERFACES, OTHER THAN IN STRICT ACCORDANCE WITH THIS LICENSE AGREEMENT, MAY BE ACTIONABLE AS A VIOLATION OF THE COMPANY'S TRADE SECRET RIGHTS.
|
||||
|
||||
### 3.14 GENERAL PROVISIONS
|
||||
|
||||
__3.14.1__ This written license agreement is the exclusive agreement between you and the Company concerning the Software and Documentation and supersedes any prior purchase order, communication, advertising or representation concerning the Software.
|
||||
|
||||
__3.14.2__ This is the entire agreement between the parties relating to the subject matter hereof and all other terms are rejected. No waiver or modification of this Agreement shall be valid unless in writing signed by each party. The waiver of a breach of any term hereof shall in no way be construed as a waiver of any term or other breach hereof. If any provision of this Agreement is held by a court of competent jurisdiction to be contrary to law the remaining provisions of this Agreement shall remain in full force and effect.
|
||||
|
||||
__3.14.3__ In the event of litigation between you and the Company concerning the Software or Documentation, the prevailing party in the litigation will be entitled to recover attorney fees and expenses from the other party.
|
||||
|
||||
__3.14.4__ This Agreement, and all disputes arising out of or related thereto, shall be governed by and construed under the laws of the State of Victoria, Australia, without reference to conflict of laws principles. All such disputes shall be subject to the exclusive jurisdiction of the state and federal courts located in Australia, and the parties agree and submit to the personal and exclusive jurisdiction and venue of these courts.
|
||||
|
||||
|
||||
## 4. CONTACT INFORMATION
|
||||
|
||||
If you have any questions about this License Agreement, or if you want to contact the Company for any reason, please direct all mail correspondence to: Itty Bitty Apps Pty. Ltd. Level 6, 84 William St, Melbourne, Victoria, Australia, 3000, or electronic correspondence to info@ittybittyapps.com.
|
||||
|
||||
Do you agree to be bound by the terms of this agreement?</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -6,7 +6,7 @@
|
|||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string> Copyright 2015-2016 Open Whisper Systems
|
||||
<string> Copyright 2015-2016 Open Whisper Systems
|
||||
|
||||
Licensed under the GPLv3: http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright (c) 2012 ThinkUltimate (http://thinkultimate.com).
|
||||
|
||||
http://github.com/davbeck/TUSafariActivity
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
- Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -291,11 +291,19 @@ src/ext/mulodi4.c is distributed under this license:
|
|||
license. As a contributor, you agree to allow your code to be
|
||||
used under both.
|
||||
|
||||
Full text of the relevant licenses is included below.
|
||||
|
||||
=========================================================================
|
||||
|
||||
University of Illinois/NCSA
|
||||
Full text of the relevant licenses is included below.</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>----------------------------------------</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string> University of Illinois/NCSA
|
||||
Open Source License
|
||||
|
||||
Copyright (c) 2009-2016 by the contributors listed in CREDITS.TXT
|
||||
|
@ -340,11 +348,19 @@ src/ext/mulodi4.c is distributed under this license:
|
|||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS WITH THE SOFTWARE.
|
||||
|
||||
=========================================================================
|
||||
|
||||
Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT
|
||||
OTHER DEALINGS WITH THE SOFTWARE.</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>----------------------------------------</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string> Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
|
|
|
@ -10,11 +10,19 @@
|
|||
|
||||
This class is released under the public domain.
|
||||
Originally created by Robbie Hanson in Q3 2010.
|
||||
Updated and maintained by Deusty LLC and the Mac/iOS development community.
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
CocoaLumberjack: (BSD Style License)
|
||||
Updated and maintained by Deusty LLC and the Mac/iOS development community.</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>----------------------------------------</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>CocoaLumberjack: (BSD Style License)
|
||||
|
||||
Copyright (c) 2010, Deusty, LLC
|
||||
All rights reserved.
|
||||
|
@ -31,11 +39,19 @@ with or without modification, are permitted provided that the following conditio
|
|||
derived from this software without specific prior
|
||||
written permission of Deusty, LLC.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>----------------------------------------</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>
|
||||
XMPPStream and all other source code: (BSD Style License)
|
||||
|
||||
Software License Agreement (BSD License)
|
||||
|
|
|
@ -1,217 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -1,217 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -58,11 +58,19 @@ ht-internal.h:
|
|||
Copyright (c) 2002 Christopher Clark
|
||||
|
||||
minheap-internal.h:
|
||||
Copyright (c) 2006 Maxim Yegorushkin <maxim.yegorushkin@gmail.com>
|
||||
|
||||
==============================
|
||||
|
||||
The arc4module is available under the following, sometimes called the
|
||||
Copyright (c) 2006 Maxim Yegorushkin <maxim.yegorushkin@gmail.com></string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>----------------------------------------</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>The arc4module is available under the following, sometimes called the
|
||||
"OpenBSD" license:
|
||||
|
||||
Copyright (c) 1996, David Mazieres <dm@uun.org>
|
||||
|
|
|
@ -28,11 +28,19 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
===============================================
|
||||
|
||||
Libidn COPYING -- Explanation of licensing conditions.
|
||||
THE SOFTWARE.</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>----------------------------------------</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Libidn COPYING -- Explanation of licensing conditions.
|
||||
Copyright (C) 2002-2015 Simon Josefsson
|
||||
See the end for copying conditions.
|
||||
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright 2017. Arash Payan. This library is distributed under the terms of the MIT/X11.</string>
|
||||
<string>liblzma is in the public domain.
|
||||
</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
|
@ -0,0 +1 @@
|
|||
EXPORT_COMPLIANCE_CODE=51d17d3e-5e07-49ad-a308-9625d81e411f
|
|
@ -0,0 +1 @@
|
|||
EXPORT_COMPLIANCE_CODE=51d17d3e-5e07-49ad-a308-9625d81e411f
|
|
@ -0,0 +1 @@
|
|||
EXPORT_COMPLIANCE_CODE=da55f6b4-d796-422f-9566-c5188326ac49
|
|
@ -0,0 +1 @@
|
|||
EXPORT_COMPLIANCE_CODE=da55f6b4-d796-422f-9566-c5188326ac49
|
|
@ -0,0 +1,85 @@
|
|||
Pod::Spec.new do |s|
|
||||
s.name = 'ChatSecureCore'
|
||||
s.version = '1.0.0'
|
||||
s.summary = 'A short description of ChatSecureCore.'
|
||||
|
||||
s.description = <<-DESC
|
||||
TODO: Add long description of the pod here.
|
||||
DESC
|
||||
|
||||
s.homepage = 'https://github.com/ChatSecure/ChatSecure-iOS'
|
||||
s.license = { :type => 'GPLv3', :file => 'LICENSE' }
|
||||
s.author = { 'Chris Ballinger' => 'chris@chatsecure.org' }
|
||||
s.source = { :git => 'https://github.com/ChatSecure/ChatSecureCore.git', :tag => s.version.to_s }
|
||||
s.social_media_url = 'https://twitter.com/ChatSecure'
|
||||
|
||||
s.ios.deployment_target = '9.0'
|
||||
|
||||
# s.subspec 'Source' do |ss|
|
||||
# ss.source_files = ['ChatSecure/Classes/**/*.{h,m,swift}', 'ChatSecureCore/**/*.h']
|
||||
# ss.public_header_files = ['ChatSecureCore/ChatSecureCore.h',
|
||||
# 'ChatSecureCore/Public/*.h',]
|
||||
# ss.private_header_files = ['ChatSecureCore/Private/*.h']
|
||||
|
||||
# ss.xcconfig = { 'OTHER_CFLAGS' => '$(inherited) -DSQLITE_HAS_CODEC' }
|
||||
|
||||
# ss.frameworks = ['UIKit', 'StoreKit']
|
||||
# end
|
||||
|
||||
s.module_name = 'ChatSecureCorePod'
|
||||
|
||||
# User Interface
|
||||
s.dependency 'OpenInChrome', '~> 0.0'
|
||||
s.dependency 'JTSImageViewController', '~> 1.4'
|
||||
s.dependency 'BButton', '~> 4.0'
|
||||
s.dependency 'ARChromeActivity', '~> 1.0'
|
||||
s.dependency 'QRCodeReaderViewController', '~> 4.0'
|
||||
s.dependency 'ParkedTextField', '~> 1.0'
|
||||
|
||||
s.dependency 'JSQMessagesViewController'
|
||||
s.dependency 'LumberjackConsole'
|
||||
|
||||
# Utility
|
||||
s.dependency 'CocoaLumberjack/Swift', '~> 3.7'
|
||||
s.dependency 'MWFeedParser', '~> 1.0'
|
||||
s.dependency 'BBlock', '~> 1.2'
|
||||
s.dependency 'LicensePlist'
|
||||
|
||||
# Network
|
||||
s.dependency 'CocoaAsyncSocket', '~> 7.6.0'
|
||||
s.dependency 'ProxyKit/Client', '~> 1.2.0'
|
||||
s.dependency 'GCDWebServer', '~> 3.4'
|
||||
# s.dependency 'CPAProxy'
|
||||
s.dependency 'XMPPFramework/Swift'
|
||||
|
||||
s.dependency 'ChatSecure-Push-iOS'
|
||||
|
||||
s.dependency 'SQLCipher', '~> 4.4'
|
||||
s.dependency 'YapDatabase/SQLCipher', '~> 4.0'
|
||||
|
||||
s.dependency 'libsqlfs/SQLCipher'
|
||||
s.dependency 'IOCipher/GCDWebServer'
|
||||
s.dependency 'YapTaskQueue/SQLCipher'
|
||||
|
||||
# Crypto
|
||||
s.dependency 'SignalProtocolObjC'
|
||||
s.dependency 'OTRKit'
|
||||
|
||||
s.dependency 'Alamofire', '~> 5.0'
|
||||
s.dependency 'Kvitto', '~> 1.0'
|
||||
|
||||
s.dependency "Mantle"
|
||||
s.dependency "HTMLReader", '~> 2.1.1'
|
||||
s.dependency "AFNetworking/Security", '~> 4.0'
|
||||
s.dependency "ZXingObjC/QRCode", '~> 3.6'
|
||||
s.dependency "SAMKeychain", '~> 1.5'
|
||||
s.dependency "MBProgressHUD", '~> 1.1'
|
||||
s.dependency "TTTAttributedLabel", '~> 2.0'
|
||||
s.dependency "PureLayout", '~> 3.0'
|
||||
s.dependency "KVOController", '~> 1.2'
|
||||
s.dependency "XLForm", '~> 4.1'
|
||||
s.dependency "FormatterKit/TimeIntervalFormatter", '~> 1.8'
|
||||
s.dependency "FormatterKit/UnitOfInformationFormatter", '~> 1.8'
|
||||
|
||||
s.dependency "OTRAssets"
|
||||
end
|
|
@ -34,7 +34,6 @@ FOUNDATION_EXPORT const unsigned char ChatSecureCoreVersionString[];
|
|||
#import "OTRDatabaseManager.h"
|
||||
#import "OTRAppDelegate.h"
|
||||
#import "AppTheme.h"
|
||||
#import "OTRPushTLVHandlerProtocols.h"
|
||||
#import "OTREncryptionManager.h"
|
||||
#import "OTRQRCodeActivity.h"
|
||||
#import "OTRIncomingMessage.h"
|
||||
|
@ -87,6 +86,8 @@ FOUNDATION_EXPORT const unsigned char ChatSecureCoreVersionString[];
|
|||
#import "OTRXMPPRoomManager.h"
|
||||
#import "OTRQRCodeReaderDelegate.h"
|
||||
#import "OTRBuddyApprovalCell.h"
|
||||
#import "RoomOccupantRole.h"
|
||||
|
||||
|
||||
#import "OTRImageItem.h"
|
||||
#import "OTRAudioItem.h"
|
||||
|
|
|
@ -9,14 +9,14 @@
|
|||
import Foundation
|
||||
|
||||
|
||||
public extension NSData {
|
||||
extension NSData {
|
||||
@objc public func hexString() -> String {
|
||||
return (self as Data).hexString()
|
||||
}
|
||||
}
|
||||
|
||||
// http://stackoverflow.com/a/26502285/805882
|
||||
public extension NSString {
|
||||
extension NSString {
|
||||
|
||||
/// Create `Data` from hexadecimal string representation
|
||||
///
|
|
@ -10,6 +10,7 @@
|
|||
#import "OTRConstants.h"
|
||||
@import XMPPFramework;
|
||||
@import OTRAssets;
|
||||
#import "ChatSecureCoreCompat-Swift.h"
|
||||
|
||||
@implementation NSURL (ChatSecure)
|
||||
|
||||
|
@ -197,7 +198,7 @@
|
|||
view = sender;
|
||||
}
|
||||
UIAlertAction *visitURL = [UIAlertAction actionWithTitle:OPEN_IN_SAFARI() style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
|
||||
[[UIApplication sharedApplication] openURL:self];
|
||||
[[UIApplication sharedApplication] open:self];
|
||||
}];
|
||||
UIAlertAction *cancel = [UIAlertAction actionWithTitle:CANCEL_STRING() style:UIAlertActionStyleCancel handler:nil];
|
||||
UIAlertController *alert = [UIAlertController alertControllerWithTitle:self.absoluteString message:nil preferredStyle:UIAlertControllerStyleActionSheet];
|
||||
|
@ -211,12 +212,4 @@
|
|||
[viewController presentViewController:alert animated:YES completion:nil];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIViewController (ChatSecureURL)
|
||||
- (void) promptToShowURL:(NSURL*)url sender:(id)sender {
|
||||
[url promptToShowURLFromViewController:self sender:sender];
|
||||
}
|
||||
|
||||
|
||||
@end
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
#import "UIActivity+ChatSecure.h"
|
||||
@import ARChromeActivity;
|
||||
@import TUSafariActivity;
|
||||
#import "OTROpenInFacebookActivity.h"
|
||||
#import "OTROpenInTwitterActivity.h"
|
||||
@import OTRAssets;
|
||||
|
@ -16,22 +15,21 @@
|
|||
@implementation UIActivity (ChatSecure)
|
||||
|
||||
+ (NSArray<UIActivity*>*) otr_linkActivities {
|
||||
TUSafariActivity *safariActivity = [TUSafariActivity new];
|
||||
ARChromeActivity *chromeActivity = [ARChromeActivity new];
|
||||
chromeActivity.activityTitle = OPEN_IN_CHROME();
|
||||
chromeActivity.callbackURL = [NSURL URLWithString:@"chatsecure://"];
|
||||
OTROpenInTwitterActivity *twitterActivity = [OTROpenInTwitterActivity new];
|
||||
OTROpenInFacebookActivity *facebookActivity = [OTROpenInFacebookActivity new];
|
||||
NSArray *applicationActivites = @[twitterActivity,facebookActivity,safariActivity,chromeActivity];
|
||||
NSArray *applicationActivites = @[twitterActivity,facebookActivity,chromeActivity];
|
||||
return applicationActivites;
|
||||
}
|
||||
|
||||
+ (CGSize)otr_defaultImageSize
|
||||
{
|
||||
CGSize size = CGSizeZero;
|
||||
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
|
||||
if (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
|
||||
size = CGSizeMake(43, 43);
|
||||
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
||||
} else if (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
|
||||
size = CGSizeMake(55, 55);
|
||||
}
|
||||
return size;
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
#import "UIActivityViewController+ChatSecure.h"
|
||||
@import ARChromeActivity;
|
||||
@import TUSafariActivity;
|
||||
#import "OTROpenInFacebookActivity.h"
|
||||
#import "OTROpenInTwitterActivity.h"
|
||||
@import OTRAssets;
|
|
@ -49,7 +49,7 @@ extension NotificationType: RawRepresentable {
|
|||
public typealias RawValue = String
|
||||
}
|
||||
|
||||
public extension UIApplication {
|
||||
extension UIApplication {
|
||||
|
||||
/// Removes all but one foreground notifications for typing and message events sent from APNS
|
||||
@objc public func removeExtraForegroundNotifications() {
|
||||
|
@ -138,7 +138,7 @@ public extension UIApplication {
|
|||
let chatString = WANTS_TO_CHAT_STRING()
|
||||
let text = "\(name) \(chatString)"
|
||||
let unreadCount = self.applicationIconBadgeNumber + 1
|
||||
self.showLocalNotificationWith(identifier: nil, body: text, badge: unreadCount, userInfo: [kOTRNotificationType:kOTRNotificationTypeSubscriptionRequest], recurring: false)
|
||||
self.showLocalNotificationWith(groupingIdentifier: nil, body: text, badge: unreadCount, userInfo: [kOTRNotificationType:kOTRNotificationTypeSubscriptionRequest], recurring: false)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -158,28 +158,26 @@ public extension UIApplication {
|
|||
let userInfo:[AnyHashable:Any] = [kOTRNotificationThreadKey:identifier,
|
||||
kOTRNotificationThreadCollection:thread.threadCollection,
|
||||
kOTRNotificationType: kOTRNotificationTypeApprovedBuddy]
|
||||
self.showLocalNotificationWith(identifier: identifier, body: message, badge: unreadCount, userInfo: userInfo, recurring: false)
|
||||
self.showLocalNotificationWith(groupingIdentifier: nil, body: message, badge: unreadCount, userInfo: userInfo, recurring: false)
|
||||
}
|
||||
}
|
||||
|
||||
internal func showLocalNotificationFor(_ thread:OTRThreadOwner?, text:String, unreadCount:Int) {
|
||||
if let thread = thread, thread.isMuted { return } // No notifications for muted
|
||||
DispatchQueue.main.async {
|
||||
var identifier:String? = nil
|
||||
var userInfo:[AnyHashable:Any]? = nil
|
||||
if let t = thread {
|
||||
identifier = t.threadIdentifier
|
||||
userInfo = [kOTRNotificationThreadKey:t.threadIdentifier,
|
||||
kOTRNotificationThreadCollection:t.threadCollection,
|
||||
kOTRNotificationType: kOTRNotificationTypeChatMessage]
|
||||
}
|
||||
self.showLocalNotificationWith(identifier: identifier, body: text, badge: unreadCount, userInfo: userInfo, recurring: false)
|
||||
self.showLocalNotificationWith(groupingIdentifier: nil, body: text, badge: unreadCount, userInfo: userInfo, recurring: false)
|
||||
}
|
||||
}
|
||||
|
||||
@objc public func showLocalNotificationWith(identifier:String?, body:String, badge:Int, userInfo:[AnyHashable:Any]?, recurring:Bool) {
|
||||
@objc public func showLocalNotificationWith(groupingIdentifier:String?, body:String, badge:Int, userInfo:[AnyHashable:Any]?, recurring:Bool) {
|
||||
DispatchQueue.main.async {
|
||||
if recurring, self.hasRecurringLocalNotificationWith(identifier: identifier) {
|
||||
if recurring, self.hasRecurringLocalNotificationWith(identifier: groupingIdentifier) {
|
||||
return // Already pending
|
||||
}
|
||||
// Use the new UserNotifications.framework on iOS 10+
|
||||
|
@ -187,9 +185,9 @@ public extension UIApplication {
|
|||
let localNotification = UNMutableNotificationContent()
|
||||
localNotification.body = body
|
||||
localNotification.badge = NSNumber(integerLiteral: badge)
|
||||
localNotification.sound = UNNotificationSound.default()
|
||||
if let identifier = identifier {
|
||||
localNotification.threadIdentifier = identifier
|
||||
localNotification.sound = UNNotificationSound.default
|
||||
if let threadKey = userInfo?[kOTRNotificationThreadKey] as? String {
|
||||
localNotification.threadIdentifier = threadKey
|
||||
}
|
||||
if let userInfo = userInfo {
|
||||
localNotification.userInfo = userInfo
|
||||
|
@ -201,7 +199,7 @@ public extension UIApplication {
|
|||
date.minute = 0
|
||||
trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
|
||||
}
|
||||
let request = UNNotificationRequest(identifier: UUID().uuidString, content: localNotification, trigger: trigger) // Schedule the notification.
|
||||
let request = UNNotificationRequest(identifier: groupingIdentifier ?? UUID().uuidString, content: localNotification, trigger: trigger) // Schedule the notification.
|
||||
let center = UNUserNotificationCenter.current()
|
||||
center.add(request, withCompletionHandler: { (error: Error?) in
|
||||
if let error = error as NSError? {
|
||||
|
@ -282,9 +280,9 @@ public extension UIApplication {
|
|||
let username = account.username
|
||||
var body = "\(CONNECTION_ERROR_STRING()) \(username)."
|
||||
|
||||
|
||||
if error.domain == GCDAsyncSocketErrorDomain,
|
||||
let code = GCDAsyncSocketError(rawValue: error.code) {
|
||||
|
||||
let code = GCDAsyncSocketError.Code.init(rawValue: error.code) {
|
||||
switch code {
|
||||
case .noError,
|
||||
.connectTimeoutError,
|
||||
|
@ -298,6 +296,8 @@ public extension UIApplication {
|
|||
case .otherError:
|
||||
// this is probably a SSL error
|
||||
body = body + " \(CONNECTION_ERROR_CERTIFICATE_VERIFY_STRING())"
|
||||
@unknown default:
|
||||
return
|
||||
}
|
||||
} else if error.domain == "kCFStreamErrorDomainSSL" {
|
||||
body = body + " \(CONNECTION_ERROR_CERTIFICATE_VERIFY_STRING())"
|
||||
|
@ -325,19 +325,12 @@ public extension UIApplication {
|
|||
let userInfo = [kOTRNotificationType: kOTRNotificationTypeConnectionError,
|
||||
kOTRNotificationAccountKey: accountKey]
|
||||
|
||||
if #available(iOS 10.0, *) {
|
||||
UNUserNotificationCenter.current().getDeliveredNotifications(completionHandler: { (notifications) in
|
||||
// FIXME: this deduplication code doesn't seem to work
|
||||
// if we are already showing a notification, let's not spam the user too much with more of them
|
||||
for notification in notifications {
|
||||
if notification.request.identifier == accountKey {
|
||||
return
|
||||
}
|
||||
}
|
||||
self.showLocalNotificationWith(identifier: accountKey, body: body, badge: badge, userInfo: userInfo, recurring: false)
|
||||
})
|
||||
} else {
|
||||
showLocalNotificationWith(identifier: accountKey, body: body, badge: badge, userInfo: userInfo, recurring: false)
|
||||
}
|
||||
self.showLocalNotificationWith(groupingIdentifier: accountKey, body: body, badge: badge, userInfo: userInfo, recurring: false)
|
||||
}
|
||||
}
|
||||
|
||||
extension UIApplication {
|
||||
@objc public func open(_ url: URL) {
|
||||
open(url, options: [:], completionHandler: nil)
|
||||
}
|
||||
}
|
|
@ -10,7 +10,7 @@ import Foundation
|
|||
import UIKit
|
||||
|
||||
|
||||
public extension UINavigationController {
|
||||
extension UINavigationController {
|
||||
|
||||
@objc public func otr_baseViewContorllers() -> [UIViewController] {
|
||||
var result:[UIViewController] = []
|
|
@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
@interface UITableView (ChatSecure)
|
||||
|
||||
/** deleteActionAlsoRemovesFromRoster is YES for the ChooseBuddy view, otherwise NO. Connection must be read-write */
|
||||
+ (nullable NSArray<UITableViewRowAction *> *)editActionsForThread:(id<OTRThreadOwner>)thread deleteActionAlsoRemovesFromRoster:(BOOL)deleteActionAlsoRemovesFromRoster connection:(YapDatabaseConnection*)connection;
|
||||
+ (nullable UISwipeActionsConfiguration *)editActionsForThread:(id<OTRThreadOwner>)thread deleteActionAlsoRemovesFromRoster:(BOOL)deleteActionAlsoRemovesFromRoster connection:(YapDatabaseConnection*)connection;
|
||||
|
||||
@end
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -8,14 +8,14 @@
|
|||
|
||||
#import "UITableView+ChatSecure.h"
|
||||
#import "OTRXMPPBuddy.h"
|
||||
#import <ChatSecureCore/ChatSecureCore-Swift.h>
|
||||
#import "ChatSecureCoreCompat-Swift.h"
|
||||
#import "OTRXMPPManager_Private.h"
|
||||
@import OTRAssets;
|
||||
|
||||
@implementation UITableView (ChatSecure)
|
||||
|
||||
/** Connection must be read-write */
|
||||
+ (nullable NSArray<UITableViewRowAction *> *)editActionsForThread:(id<OTRThreadOwner>)thread deleteActionAlsoRemovesFromRoster:(BOOL)deleteActionAlsoRemovesFromRoster connection:(YapDatabaseConnection*)connection {
|
||||
+ (nullable UISwipeActionsConfiguration *)editActionsForThread:(id<OTRThreadOwner>)thread deleteActionAlsoRemovesFromRoster:(BOOL)deleteActionAlsoRemovesFromRoster connection:(YapDatabaseConnection*)connection {
|
||||
NSParameterAssert(thread);
|
||||
NSParameterAssert(connection);
|
||||
if (!thread || !connection) {
|
||||
|
@ -33,22 +33,23 @@
|
|||
archiveTitle = UNARCHIVE_ACTION_STRING();
|
||||
}
|
||||
|
||||
UITableViewRowAction *archiveAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:archiveTitle handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
|
||||
UIContextualAction *archiveAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:archiveTitle handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
|
||||
[connection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction * _Nonnull transaction) {
|
||||
NSString *key = [thread threadIdentifier];
|
||||
NSString *collection = [thread threadCollection];
|
||||
id object = [transaction objectForKey:key inCollection:collection];
|
||||
if (![object conformsToProtocol:@protocol(OTRThreadOwner)]) {
|
||||
completionHandler(NO);
|
||||
return;
|
||||
}
|
||||
id <OTRThreadOwner> thread = object;
|
||||
thread.isArchived = !thread.isArchived;
|
||||
[thread saveWithTransaction:transaction];
|
||||
completionHandler(YES);
|
||||
}];
|
||||
}];
|
||||
|
||||
UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:DELETE_STRING() handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
|
||||
|
||||
UIContextualAction *deleteAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:DELETE_STRING() handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
|
||||
[connection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
[OTRBaseMessage deleteAllMessagesForBuddyId:[thread threadIdentifier] transaction:transaction];
|
||||
}];
|
||||
|
@ -61,7 +62,7 @@
|
|||
[connection readWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) {
|
||||
account = [OTRAccount fetchObjectWithUniqueID:accountKey transaction:transaction];
|
||||
}];
|
||||
OTRXMPPManager *xmppManager = (OTRXMPPManager *)[OTRProtocolManager.shared protocolForAccount:account];
|
||||
OTRXMPPManager *xmppManager = (OTRXMPPManager *)[[OTRProtocolManager sharedInstance] protocolForAccount:account];
|
||||
if (room.roomJID) {
|
||||
[xmppManager.roomManager leaveRoom:room.roomJID];
|
||||
}
|
||||
|
@ -70,6 +71,7 @@
|
|||
//Delete database items
|
||||
[connection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
[((OTRXMPPRoom *)thread) removeWithTransaction:transaction];
|
||||
completionHandler(YES);
|
||||
}];
|
||||
} else if ([thread isKindOfClass:[OTRBuddy class]] && deleteActionAlsoRemovesFromRoster) {
|
||||
OTRBuddy *dbBuddy = (OTRBuddy*)thread;
|
||||
|
@ -80,11 +82,14 @@
|
|||
[connection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
[action saveWithTransaction:transaction];
|
||||
[dbBuddy removeWithTransaction:transaction];
|
||||
completionHandler(YES);
|
||||
}];
|
||||
} else {
|
||||
completionHandler(NO);
|
||||
}
|
||||
}];
|
||||
|
||||
return @[deleteAction, archiveAction];
|
||||
return [UISwipeActionsConfiguration configurationWithActions:@[deleteAction, archiveAction]];
|
||||
}
|
||||
|
||||
@end
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue