[rst-commit] r165 - in /redwax-signtext-macos/trunk: ./ Redwax SignText/ Redwax SignText/Redwax SignText.xcodeproj/ Redwax SignText/Redwax SignText/ Redwax SignText/Redwax SignText/Assets.xcassets/ Redwax SignText/Redwax SignText/Assets.xcassets/AccentColor.colorset/ Redwax SignText/Redwax SignText/Assets.xcassets/AppIcon.appiconset/ Redwax SignText/Redwax SignText/Preview Content/ Redwax SignText/Redwax SignText/Preview Content/Preview Assets.xcassets/ Redwax SignText/Redwax SignTextTests/ Redwax SignText/Redwax SignTextUITests/
rst-commit at redwax.eu
rst-commit at redwax.eu
Sun Jun 30 23:07:05 CEST 2024
Author: minfrin at redwax.eu
Date: Sun Jun 30 23:07:04 2024
New Revision: 165
Log:
Initial add of Redwax SignText for MacOS (Swift version)
Added:
redwax-signtext-macos/trunk/Jenkinsfile
redwax-signtext-macos/trunk/Makefile
redwax-signtext-macos/trunk/Redwax SignText/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText.xcodeproj/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText.xcodeproj/project.pbxproj
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/AccentColor.colorset/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/AccentColor.colorset/Contents.json (with props)
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/AppIcon.appiconset/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/AppIcon.appiconset/Contents.json (with props)
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/Contents.json (with props)
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/CertificateData.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Crypto.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Message.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/ModelData.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Preview Content/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Preview Content/Preview Assets.xcassets/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Preview Content/Preview Assets.xcassets/Contents.json (with props)
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Redwax_SignText.entitlements
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Redwax_SignTextApp.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextContentView.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextData.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextTabView.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextTests/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextTests/Redwax_SignTextTests.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextUITests/
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextUITests/Redwax_SignTextUITests.swift
redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextUITests/Redwax_SignTextUITestsLaunchTests.swift
redwax-signtext-macos/trunk/eu.redwax.Redwax.SignText.json (with props)
Added: redwax-signtext-macos/trunk/Jenkinsfile
==============================================================================
--- redwax-signtext-macos/trunk/Jenkinsfile (added)
+++ redwax-signtext-macos/trunk/Jenkinsfile Sun Jun 30 23:07:04 2024
@@ -0,0 +1,25 @@
+pipeline {
+ agent none
+ stages {
+ stage('Build') {
+ parallel {
+ stage('MacOS') {
+ agent { label 'macos' }
+ stages {
+ stage('make pkg') {
+ steps {
+ sh 'make pkg'
+ }
+ }
+ stage('archive') {
+ steps {
+ archiveArtifacts artifacts: 'target/*.pkg', onlyIfSuccessful: true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
Added: redwax-signtext-macos/trunk/Makefile
==============================================================================
--- redwax-signtext-macos/trunk/Makefile (added)
+++ redwax-signtext-macos/trunk/Makefile Sun Jun 30 23:07:04 2024
@@ -0,0 +1,51 @@
+# Licensed to Stichting The Commons Conservancy (TCC) under one or more
+# contributor license agreements. See the AUTHORS file distributed with
+# this work for additional information regarding copyright ownership.
+# TCC licenses this file to You 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.
+#
+
+BUILD_NUMBER ?= 0
+
+MAJOR_VERSION=0
+MINOR_VERSION=9
+RELEASE_VERSION=0
+VERSION=$(MAJOR_VERSION).$(MINOR_VERSION).$(RELEASE_VERSION)
+VERSIONEX=$(VERSION).$(BUILD_NUMBER)
+
+TARGET_ROOT = $(PWD)/target/pkg
+TARGET_APP = $(TARGET_ROOT)/Applications/Redwax\ SignText.app
+TARGET_PKG = target/Redwax-SignText-$(VERSIONEX).pkg
+
+FIREFOX_PATH = /Library/Application\ Support/Mozilla/NativeMessagingHosts
+
+PROJ = xcodebuild -project Redwax\ SignText/Redwax\ SignText.xcodeproj -configuration Debug MARKETING_VERSION=$(VERSION) CURRENT_PROJECT_VERSION=$(BUILD_NUMBER)
+PKG_BUILD = pkgbuild --version $(VERSION) --install-location /
+
+all: pkg
+
+clean:
+ $(PROJ) clean
+ rm -rf ./target
+
+$(TARGET_ROOT): Redwax\ SignText/Redwax\ SignText/*.swift eu.redwax.Redwax.SignText.json
+ $(PROJ) install DSTROOT=$(TARGET_ROOT)
+ mkdir -p $@/$(FIREFOX_PATH)
+ cp -v eu.redwax.Redwax.SignText.json $@/$(FIREFOX_PATH)/eu.redwax.Redwax.SignText.json
+
+$(TARGET_PKG): $(TARGET_ROOT)
+ $(PKG_BUILD) --root $< --identifier eu.redwax.Redwax.SignText "$@"
+
+pkg: $(TARGET_PKG)
+
+
+
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText.xcodeproj/project.pbxproj
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText.xcodeproj/project.pbxproj (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText.xcodeproj/project.pbxproj Sun Jun 30 23:07:04 2024
@@ -0,0 +1,610 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 56;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ F92B01162C2D580E005F7E7A /* Redwax_SignTextApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92B01152C2D580E005F7E7A /* Redwax_SignTextApp.swift */; };
+ F92B01182C2D580E005F7E7A /* SignTextContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92B01172C2D580E005F7E7A /* SignTextContentView.swift */; };
+ F92B011A2C2D5810005F7E7A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F92B01192C2D5810005F7E7A /* Assets.xcassets */; };
+ F92B011D2C2D5810005F7E7A /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F92B011C2C2D5810005F7E7A /* Preview Assets.xcassets */; };
+ F92B01282C2D5810005F7E7A /* Redwax_SignTextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92B01272C2D5810005F7E7A /* Redwax_SignTextTests.swift */; };
+ F92B01322C2D5810005F7E7A /* Redwax_SignTextUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92B01312C2D5810005F7E7A /* Redwax_SignTextUITests.swift */; };
+ F92B01342C2D5810005F7E7A /* Redwax_SignTextUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92B01332C2D5810005F7E7A /* Redwax_SignTextUITestsLaunchTests.swift */; };
+ F92B01412C2D77EE005F7E7A /* Crypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92B01402C2D77EE005F7E7A /* Crypto.swift */; };
+ F92B01432C2D8289005F7E7A /* SignTextTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92B01422C2D8289005F7E7A /* SignTextTabView.swift */; };
+ F92B01452C2EB553005F7E7A /* ModelData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92B01442C2EB553005F7E7A /* ModelData.swift */; };
+ F92B01472C2EB85D005F7E7A /* CertificateData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92B01462C2EB85D005F7E7A /* CertificateData.swift */; };
+ F938C1172C3027A900DB191C /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = F938C1162C3027A900DB191C /* Message.swift */; };
+ F938C1192C307E1A00DB191C /* SignTextData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F938C1182C307E1A00DB191C /* SignTextData.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ F92B01242C2D5810005F7E7A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F92B010A2C2D580E005F7E7A /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F92B01112C2D580E005F7E7A;
+ remoteInfo = "Redwax SignText";
+ };
+ F92B012E2C2D5810005F7E7A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F92B010A2C2D580E005F7E7A /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F92B01112C2D580E005F7E7A;
+ remoteInfo = "Redwax SignText";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ F92B01122C2D580E005F7E7A /* Redwax SignText.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Redwax SignText.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ F92B01152C2D580E005F7E7A /* Redwax_SignTextApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Redwax_SignTextApp.swift; sourceTree = "<group>"; };
+ F92B01172C2D580E005F7E7A /* SignTextContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignTextContentView.swift; sourceTree = "<group>"; };
+ F92B01192C2D5810005F7E7A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+ F92B011C2C2D5810005F7E7A /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
+ F92B011E2C2D5810005F7E7A /* Redwax_SignText.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Redwax_SignText.entitlements; sourceTree = "<group>"; };
+ F92B01232C2D5810005F7E7A /* Redwax SignTextTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Redwax SignTextTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ F92B01272C2D5810005F7E7A /* Redwax_SignTextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Redwax_SignTextTests.swift; sourceTree = "<group>"; };
+ F92B012D2C2D5810005F7E7A /* Redwax SignTextUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Redwax SignTextUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ F92B01312C2D5810005F7E7A /* Redwax_SignTextUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Redwax_SignTextUITests.swift; sourceTree = "<group>"; };
+ F92B01332C2D5810005F7E7A /* Redwax_SignTextUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Redwax_SignTextUITestsLaunchTests.swift; sourceTree = "<group>"; };
+ F92B01402C2D77EE005F7E7A /* Crypto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Crypto.swift; sourceTree = "<group>"; };
+ F92B01422C2D8289005F7E7A /* SignTextTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignTextTabView.swift; sourceTree = "<group>"; };
+ F92B01442C2EB553005F7E7A /* ModelData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelData.swift; sourceTree = "<group>"; };
+ F92B01462C2EB85D005F7E7A /* CertificateData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificateData.swift; sourceTree = "<group>"; };
+ F938C1162C3027A900DB191C /* Message.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Message.swift; sourceTree = "<group>"; };
+ F938C1182C307E1A00DB191C /* SignTextData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignTextData.swift; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ F92B010F2C2D580E005F7E7A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F92B01202C2D5810005F7E7A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F92B012A2C2D5810005F7E7A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ F92B01092C2D580E005F7E7A = {
+ isa = PBXGroup;
+ children = (
+ F92B01142C2D580E005F7E7A /* Redwax SignText */,
+ F92B01262C2D5810005F7E7A /* Redwax SignTextTests */,
+ F92B01302C2D5810005F7E7A /* Redwax SignTextUITests */,
+ F92B01132C2D580E005F7E7A /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ F92B01132C2D580E005F7E7A /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ F92B01122C2D580E005F7E7A /* Redwax SignText.app */,
+ F92B01232C2D5810005F7E7A /* Redwax SignTextTests.xctest */,
+ F92B012D2C2D5810005F7E7A /* Redwax SignTextUITests.xctest */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ F92B01142C2D580E005F7E7A /* Redwax SignText */ = {
+ isa = PBXGroup;
+ children = (
+ F92B01152C2D580E005F7E7A /* Redwax_SignTextApp.swift */,
+ F92B01172C2D580E005F7E7A /* SignTextContentView.swift */,
+ F92B01192C2D5810005F7E7A /* Assets.xcassets */,
+ F92B011E2C2D5810005F7E7A /* Redwax_SignText.entitlements */,
+ F92B011B2C2D5810005F7E7A /* Preview Content */,
+ F92B01402C2D77EE005F7E7A /* Crypto.swift */,
+ F92B01422C2D8289005F7E7A /* SignTextTabView.swift */,
+ F92B01442C2EB553005F7E7A /* ModelData.swift */,
+ F92B01462C2EB85D005F7E7A /* CertificateData.swift */,
+ F938C1162C3027A900DB191C /* Message.swift */,
+ F938C1182C307E1A00DB191C /* SignTextData.swift */,
+ );
+ path = "Redwax SignText";
+ sourceTree = "<group>";
+ };
+ F92B011B2C2D5810005F7E7A /* Preview Content */ = {
+ isa = PBXGroup;
+ children = (
+ F92B011C2C2D5810005F7E7A /* Preview Assets.xcassets */,
+ );
+ path = "Preview Content";
+ sourceTree = "<group>";
+ };
+ F92B01262C2D5810005F7E7A /* Redwax SignTextTests */ = {
+ isa = PBXGroup;
+ children = (
+ F92B01272C2D5810005F7E7A /* Redwax_SignTextTests.swift */,
+ );
+ path = "Redwax SignTextTests";
+ sourceTree = "<group>";
+ };
+ F92B01302C2D5810005F7E7A /* Redwax SignTextUITests */ = {
+ isa = PBXGroup;
+ children = (
+ F92B01312C2D5810005F7E7A /* Redwax_SignTextUITests.swift */,
+ F92B01332C2D5810005F7E7A /* Redwax_SignTextUITestsLaunchTests.swift */,
+ );
+ path = "Redwax SignTextUITests";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ F92B01112C2D580E005F7E7A /* Redwax SignText */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = F92B01372C2D5810005F7E7A /* Build configuration list for PBXNativeTarget "Redwax SignText" */;
+ buildPhases = (
+ F92B010E2C2D580E005F7E7A /* Sources */,
+ F92B010F2C2D580E005F7E7A /* Frameworks */,
+ F92B01102C2D580E005F7E7A /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Redwax SignText";
+ productName = "Redwax SignText";
+ productReference = F92B01122C2D580E005F7E7A /* Redwax SignText.app */;
+ productType = "com.apple.product-type.application";
+ };
+ F92B01222C2D5810005F7E7A /* Redwax SignTextTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = F92B013A2C2D5810005F7E7A /* Build configuration list for PBXNativeTarget "Redwax SignTextTests" */;
+ buildPhases = (
+ F92B011F2C2D5810005F7E7A /* Sources */,
+ F92B01202C2D5810005F7E7A /* Frameworks */,
+ F92B01212C2D5810005F7E7A /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ F92B01252C2D5810005F7E7A /* PBXTargetDependency */,
+ );
+ name = "Redwax SignTextTests";
+ productName = "Redwax SignTextTests";
+ productReference = F92B01232C2D5810005F7E7A /* Redwax SignTextTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ F92B012C2C2D5810005F7E7A /* Redwax SignTextUITests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = F92B013D2C2D5810005F7E7A /* Build configuration list for PBXNativeTarget "Redwax SignTextUITests" */;
+ buildPhases = (
+ F92B01292C2D5810005F7E7A /* Sources */,
+ F92B012A2C2D5810005F7E7A /* Frameworks */,
+ F92B012B2C2D5810005F7E7A /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ F92B012F2C2D5810005F7E7A /* PBXTargetDependency */,
+ );
+ name = "Redwax SignTextUITests";
+ productName = "Redwax SignTextUITests";
+ productReference = F92B012D2C2D5810005F7E7A /* Redwax SignTextUITests.xctest */;
+ productType = "com.apple.product-type.bundle.ui-testing";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ F92B010A2C2D580E005F7E7A /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1520;
+ LastUpgradeCheck = 1520;
+ TargetAttributes = {
+ F92B01112C2D580E005F7E7A = {
+ CreatedOnToolsVersion = 15.2;
+ };
+ F92B01222C2D5810005F7E7A = {
+ CreatedOnToolsVersion = 15.2;
+ TestTargetID = F92B01112C2D580E005F7E7A;
+ };
+ F92B012C2C2D5810005F7E7A = {
+ CreatedOnToolsVersion = 15.2;
+ TestTargetID = F92B01112C2D580E005F7E7A;
+ };
+ };
+ };
+ buildConfigurationList = F92B010D2C2D580E005F7E7A /* Build configuration list for PBXProject "Redwax SignText" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = F92B01092C2D580E005F7E7A;
+ productRefGroup = F92B01132C2D580E005F7E7A /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ F92B01112C2D580E005F7E7A /* Redwax SignText */,
+ F92B01222C2D5810005F7E7A /* Redwax SignTextTests */,
+ F92B012C2C2D5810005F7E7A /* Redwax SignTextUITests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ F92B01102C2D580E005F7E7A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ F92B011D2C2D5810005F7E7A /* Preview Assets.xcassets in Resources */,
+ F92B011A2C2D5810005F7E7A /* Assets.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F92B01212C2D5810005F7E7A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F92B012B2C2D5810005F7E7A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ F92B010E2C2D580E005F7E7A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ F92B01412C2D77EE005F7E7A /* Crypto.swift in Sources */,
+ F92B01182C2D580E005F7E7A /* SignTextContentView.swift in Sources */,
+ F92B01452C2EB553005F7E7A /* ModelData.swift in Sources */,
+ F92B01472C2EB85D005F7E7A /* CertificateData.swift in Sources */,
+ F92B01432C2D8289005F7E7A /* SignTextTabView.swift in Sources */,
+ F938C1192C307E1A00DB191C /* SignTextData.swift in Sources */,
+ F92B01162C2D580E005F7E7A /* Redwax_SignTextApp.swift in Sources */,
+ F938C1172C3027A900DB191C /* Message.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F92B011F2C2D5810005F7E7A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ F92B01282C2D5810005F7E7A /* Redwax_SignTextTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F92B01292C2D5810005F7E7A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ F92B01322C2D5810005F7E7A /* Redwax_SignTextUITests.swift in Sources */,
+ F92B01342C2D5810005F7E7A /* Redwax_SignTextUITestsLaunchTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ F92B01252C2D5810005F7E7A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F92B01112C2D580E005F7E7A /* Redwax SignText */;
+ targetProxy = F92B01242C2D5810005F7E7A /* PBXContainerItemProxy */;
+ };
+ F92B012F2C2D5810005F7E7A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F92B01112C2D580E005F7E7A /* Redwax SignText */;
+ targetProxy = F92B012E2C2D5810005F7E7A /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ F92B01352C2D5810005F7E7A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 13.6;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ F92B01362C2D5810005F7E7A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 13.6;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ };
+ name = Release;
+ };
+ F92B01382C2D5810005F7E7A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_ENTITLEMENTS = "Redwax SignText/Redwax_SignText.entitlements";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_ASSET_PATHS = "\"Redwax SignText/Preview Content\"";
+ DEVELOPMENT_TEAM = 3FFL5588QM;
+ ENABLE_HARDENED_RUNTIME = YES;
+ ENABLE_PREVIEWS = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "eu.redwax.rst.Redwax-SignText";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ F92B01392C2D5810005F7E7A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_ENTITLEMENTS = "Redwax SignText/Redwax_SignText.entitlements";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_ASSET_PATHS = "\"Redwax SignText/Preview Content\"";
+ DEVELOPMENT_TEAM = 3FFL5588QM;
+ ENABLE_HARDENED_RUNTIME = YES;
+ ENABLE_PREVIEWS = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "eu.redwax.rst.Redwax-SignText";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ F92B013B2C2D5810005F7E7A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = 3FFL5588QM;
+ GENERATE_INFOPLIST_FILE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 13.6;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "eu.redwax.rst.Redwax-SignTextTests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Redwax SignText.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Redwax SignText";
+ };
+ name = Debug;
+ };
+ F92B013C2C2D5810005F7E7A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = 3FFL5588QM;
+ GENERATE_INFOPLIST_FILE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 13.6;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "eu.redwax.rst.Redwax-SignTextTests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Redwax SignText.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Redwax SignText";
+ };
+ name = Release;
+ };
+ F92B013E2C2D5810005F7E7A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = 3FFL5588QM;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "eu.redwax.rst.Redwax-SignTextUITests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "Redwax SignText";
+ };
+ name = Debug;
+ };
+ F92B013F2C2D5810005F7E7A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = 3FFL5588QM;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "eu.redwax.rst.Redwax-SignTextUITests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "Redwax SignText";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ F92B010D2C2D580E005F7E7A /* Build configuration list for PBXProject "Redwax SignText" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F92B01352C2D5810005F7E7A /* Debug */,
+ F92B01362C2D5810005F7E7A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ F92B01372C2D5810005F7E7A /* Build configuration list for PBXNativeTarget "Redwax SignText" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F92B01382C2D5810005F7E7A /* Debug */,
+ F92B01392C2D5810005F7E7A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ F92B013A2C2D5810005F7E7A /* Build configuration list for PBXNativeTarget "Redwax SignTextTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F92B013B2C2D5810005F7E7A /* Debug */,
+ F92B013C2C2D5810005F7E7A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ F92B013D2C2D5810005F7E7A /* Build configuration list for PBXNativeTarget "Redwax SignTextUITests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F92B013E2C2D5810005F7E7A /* Debug */,
+ F92B013F2C2D5810005F7E7A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = F92B010A2C2D580E005F7E7A /* Project object */;
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/AccentColor.colorset/Contents.json
==============================================================================
Binary file - no diff available.
Propchange: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/AccentColor.colorset/Contents.json
------------------------------------------------------------------------------
svn:mime-type = application/json
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/AppIcon.appiconset/Contents.json
==============================================================================
Binary file - no diff available.
Propchange: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/AppIcon.appiconset/Contents.json
------------------------------------------------------------------------------
svn:mime-type = application/json
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/Contents.json
==============================================================================
Binary file - no diff available.
Propchange: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Assets.xcassets/Contents.json
------------------------------------------------------------------------------
svn:mime-type = application/json
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/CertificateData.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/CertificateData.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/CertificateData.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,27 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+import Foundation
+
+struct CertificateData: Identifiable, Equatable, Hashable {
+
+ let id: CFData
+ var name: String = ""
+ let identity: SecIdentity
+ let certificate: SecCertificate
+ let privateKey: SecKey
+
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Crypto.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Crypto.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Crypto.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,169 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+import Foundation
+
+
+func doSign(signText: SignTextData, certificateSelection: CertificateData?) -> Data? {
+
+ var signedData: CFData?
+ return signText.payload.utf8CString.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) in
+ let osStatus = CMSEncodeContent(certificateSelection?.identity,
+ nil,
+ nil,
+ false,
+ CMSSignedAttributes.attrSigningTime,
+ ptr.baseAddress!,
+ signText.payload.utf8CString.count,
+ &signedData)
+
+ // ---------------------------------------------------------------------
+ // Verify there were no signing errors
+ // ---------------------------------------------------------------------
+ if osStatus != noErr {
+
+ // Replace this log message with the correct throw-error
+ let osStatusString = String(SecCopyErrorMessageString(osStatus, nil) ?? "")
+// Log.shared.error(message: "Signing profile failed with error: \(osStatus) - \(osStatusString)", category: String(describing: self))
+
+ // This error is returned when the ACLs somehow aren't giving correct access. Simply opening keychaing and switching the ACLs on and off and saving.
+ if osStatus == errSecInternalComponent {
+// Log.shared.error(message: "FIX: Open keychain and update the ACLs for the private key of the certificate you are trying to use.", category: String(describing: self))
+ }
+
+// throw ProfileExportError.signingErrorFailed(usingCertificate: identity.certificateName ?? "Unknown", withError: osStatusString)
+ }
+
+ // ---------------------------------------------------------------------
+ // Write the signed profile to the selected output path
+ // ---------------------------------------------------------------------
+ return (signedData as Data?)?.base64EncodedData()
+ }
+
+
+
+
+
+
+}
+
+func doCancel() async {
+
+ /* exit app if no more views */
+ exit(0)
+
+}
+
+func distinguishedNameSummmary(rdns: NSDictionary?) -> String {
+
+ let rdnValues = rdns!["value"]! as! NSArray
+
+ var cn: NSString?;
+ var ou: NSString?;
+
+ for values in rdnValues {
+ let value = values as! NSDictionary
+
+ let type = value["label"] as! NSString
+
+ if (type == kSecOIDCommonName) {
+ cn = value["value"] as? NSString;
+ }
+ if (type == kSecOIDOrganizationalUnitName) {
+ ou = value["value"] as? NSString;
+ }
+ }
+
+ if (cn != nil) {
+ return cn! as String;
+ }
+ else if (ou != nil) {
+ return ou! as String;
+ }
+ else {
+ return "[None]"
+ }
+
+}
+
+func certificateDescription(identity: SecIdentity) -> CertificateData {
+
+ var certificate: SecCertificate?
+ SecIdentityCopyCertificate(identity, &certificate);
+
+ var privateKey: SecKey?
+ SecIdentityCopyPrivateKey(identity, &privateKey);
+
+ let contents = SecCertificateCopyValues(certificate!, [kSecOIDX509V1SubjectName, kSecOIDX509V1IssuerName] as CFArray, nil) as CFDictionary?
+
+ var summary: String = "[None]";
+
+ if let subject = (contents as NSDictionary?)?[kSecOIDX509V1SubjectName] as! NSDictionary? {
+
+ summary = distinguishedNameSummmary(rdns: subject);
+
+ }
+
+ if let issuer = (contents as NSDictionary?)?[kSecOIDX509V1IssuerName] as! NSDictionary? {
+
+ summary += " (" + distinguishedNameSummmary(rdns: issuer) + ")";
+
+ }
+
+ let der = SecCertificateCopyData(certificate!)
+
+ return CertificateData(id: der, name: summary, identity: identity, certificate: certificate!, privateKey: privateKey!)
+}
+
+func updateCertificates(certificates: inout [CertificateData], incoming: NSArray) {
+
+ for index in certificates.indices.reversed() {
+ if (!incoming.contains(certificates[index].identity)) {
+ certificates.remove(at: index)
+ }
+ }
+
+ for item in incoming {
+ let identity = item as! SecIdentity;
+ if (!certificates.contains(where: { $0.identity == identity} )) {
+ certificates.append(certificateDescription(identity: identity))
+ }
+ }
+
+}
+
+func findKeychainCertificates(_ completion: @escaping (OSStatus, NSArray) -> Void) {
+ DispatchQueue.global(qos: .background).async {
+
+ let query: [String: Any] = [kSecClass as String: kSecClassIdentity,
+ kSecUseDataProtectionKeychain as String: true,
+ kSecMatchLimit as String: kSecMatchLimitAll,
+ kSecReturnRef as String: true]
+
+ var items: CFTypeRef?
+
+ let result = SecItemCopyMatching(query as NSDictionary, &items)
+
+ DispatchQueue.main.async {
+ if let certArray = items as? NSArray {
+ completion(result, certArray)
+ }
+ else {
+ completion(result, NSArray())
+ }
+ }
+ }
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Message.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Message.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Message.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,257 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+import Foundation
+
+/*
+ * Run in a background thread.
+ */
+func doReadMessage() -> [String: Any]? {
+
+ /* read stdin here */
+ let input = FileHandle.standardInput
+
+ let rawLen: Data?
+ do {
+ rawLen = try input.read(upToCount: 4);
+ } catch {
+ return nil
+ }
+// fixme we need to check ifrawLen is nil, if so it's eof
+
+ let number = rawLen!.withUnsafeBytes { pointer in
+ return pointer.load(as: Int32.self)
+ }
+
+ let rawJson: Data?
+ do {
+ rawJson = try input.read(upToCount: Int(number));
+ } catch {
+ return nil
+ }
+
+ let json = try? JSONSerialization.jsonObject(with: rawJson!, options: [])
+
+ if let dictionary = json as? [String: Any] {
+ return dictionary;
+ }
+
+ return nil;
+}
+
+func readMessages(_ completion: @escaping ([String : Any]?) -> Void) {
+
+ DispatchQueue.global(qos: .background).async {
+
+ while (true) {
+
+ let request = doReadMessage()
+
+ if (request == nil) {
+ break;
+ }
+
+ DispatchQueue.main.async {
+ completion(request)
+ }
+ }
+ }
+
+}
+
+enum Response {
+ case again
+ case show
+ case ack
+ case nack
+ case unexpected
+}
+
+/*
+ * Run in the main thread.
+ */
+func processRequest(message: [String : Any], signTexts: inout [UUID: SignTextData])-> SignTextData {
+
+ let uuid = UUID(uuidString: message["uuid"] as! String)
+
+ precondition(uuid != nil, "uuid is missing from message")
+
+ let request = message["request"]
+
+ var signTextData = signTexts[uuid!];
+
+ if (signTextData == nil ){
+
+ signTextData = SignTextData(message: message);
+
+ precondition(uuid != nil, "uuid is missing from message")
+
+ signTexts[uuid!] = signTextData;
+
+ if (request is String) {
+ signTextData?.state = Response.again
+ }
+ else {
+ signTextData?.state = Response.unexpected
+ }
+
+ return signTextData!
+ }
+ else{
+
+ let id: Int? = message["id"] as? Int
+
+ precondition(uuid != nil, "request is missing from message")
+ precondition(id != nil, "id is missing from request")
+
+ if (request is String) {
+
+ signTextData?.lastId = id!;
+
+ if (signTextData?.payload == nil) {
+ signTextData?.payload = (request as? String)!;
+ }
+ else {
+ signTextData?.payload += request as! String;
+ }
+
+ signTextData?.state = Response.again
+ return signTextData!
+ }
+ else if (request is Bool) {
+
+ if (request as! Bool == true) {
+ signTextData?.state = Response.ack
+ return signTextData!
+ }
+ else {
+ signTextData?.state = Response.nack
+ return signTextData!
+ }
+
+ }
+ else if (request is [String : Any]) {
+
+// signTextData.cas = request as! [String : Any]
+
+ signTextData?.state = Response.show
+ return signTextData!
+ }
+ else {
+ signTextData?.state = Response.unexpected
+ return signTextData!
+ }
+
+ }
+
+}
+
+func sendMessage(response: Data) {
+
+ /* write stdout here */
+ let output = FileHandle.standardOutput
+
+ let responseData = response;
+ var length: Int32 = Int32(responseData.count);
+
+ let lengthData = Data(bytes: &length,
+ count: MemoryLayout.size(ofValue: length))
+
+ output.write(lengthData);
+ output.write(responseData);
+
+}
+
+func sendAck(signTextData: SignTextData) {
+
+ let dictionary = ["uuid": signTextData.id.uuidString.lowercased(), "id": signTextData.lastId, "response": true] as [String : Any]
+
+ do {
+
+ let data = try JSONSerialization.data(withJSONObject: dictionary)
+
+ sendMessage(response: data)
+
+ }
+ catch {
+ precondition(false, "could not serialise json: \(error)")
+ }
+
+}
+
+func sendNack(signTextData: SignTextData) {
+
+ let dictionary = ["uuid": signTextData.id.uuidString.lowercased(), "id": signTextData.lastId, "response": false] as [String : Any]
+
+ do {
+
+ let data = try JSONSerialization.data(withJSONObject: dictionary)
+
+ sendMessage(response: data)
+
+ }
+ catch {
+ precondition(false, "could not serialise json: \(error)")
+ }
+
+}
+
+ at discardableResult
+func sendFragment(signTextData: SignTextData) -> Bool {
+
+ let maxFragment = 2048
+ let length = signTextData.signedText!.count > maxFragment ? maxFragment : signTextData.signedText?.count
+
+ let fragment = signTextData.signedText?.subdata(in: 0 ..< length!)
+ signTextData.signedText = signTextData.signedText?.advanced(by: length!)
+
+ /*
+ * return a string fragment, or if the fragment is empty, return
+ * true to mean EOF.
+ */
+ let dictionary = ["uuid": signTextData.id.uuidString.lowercased(), "id": signTextData.lastId, "response": String(data: fragment!, encoding: .utf8)!] as [String : Any]
+
+ do {
+
+ let data = try JSONSerialization.data(withJSONObject: dictionary)
+
+ sendMessage(response: data)
+
+ }
+ catch {
+ precondition(false, "could not serialise json: \(error)")
+ }
+
+ return (length! > 0)
+}
+
+func sendCancel(signTextData: SignTextData) {
+
+ let dictionary = ["uuid": signTextData.id.uuidString.lowercased(), "id": signTextData.lastId, "error": "error:userCancel"] as [String : Any]
+
+ do {
+
+ let data = try JSONSerialization.data(withJSONObject: dictionary)
+
+ sendMessage(response: data)
+
+ }
+ catch {
+ precondition(false, "could not serialise json: \(error)")
+ }
+
+}
+
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/ModelData.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/ModelData.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/ModelData.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,25 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+import Foundation
+
+ at MainActor
+class ModelData: ObservableObject {
+
+ @Published
+ var signTexts: [UUID: SignTextData] = [:]
+
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Preview Content/Preview Assets.xcassets/Contents.json
==============================================================================
Binary file - no diff available.
Propchange: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Preview Content/Preview Assets.xcassets/Contents.json
------------------------------------------------------------------------------
svn:mime-type = application/json
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Redwax_SignText.entitlements
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Redwax_SignText.entitlements (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Redwax_SignText.entitlements Sun Jun 30 23:07:04 2024
@@ -0,0 +1,10 @@
+<?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>com.apple.security.app-sandbox</key>
+ <true/>
+ <key>com.apple.security.files.user-selected.read-only</key>
+ <true/>
+</dict>
+</plist>
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Redwax_SignTextApp.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Redwax_SignTextApp.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/Redwax_SignTextApp.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,30 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+
+import SwiftUI
+
+ at main
+struct Redwax_SignTextApp: App {
+
+ @StateObject private var modelData = ModelData()
+
+ var body: some Scene {
+ WindowGroup {
+ SignTextTabView().environmentObject(modelData)
+ }
+ }
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextContentView.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextContentView.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextContentView.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,124 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+
+import SwiftUI
+
+struct SignTextContentView: View {
+
+ let timer = Timer.publish(every: 3, on: .main, in: .common).autoconnect()
+
+ @EnvironmentObject var modelData: ModelData
+
+ var signText: SignTextData
+
+// @State private var selectedCertificate: String?
+
+ @State private var signItem: DispatchWorkItem?
+
+ @State private var signtext: String = ""
+
+ @State private var password: String = ""
+
+ @State var certificates = Array<CertificateData>()
+
+ @State var certificateSelection: CertificateData?
+ @State var certificateIndex = 0 {
+ didSet {
+ certificateSelection = certificates[certificateIndex]
+ }
+ }
+
+ var body: some View {
+ VStack {
+
+ Text("The site has requested you sign the following text message")
+
+ TextEditor(text: .constant(signText.payload))
+ .foregroundColor(.black)
+
+ Text("If you agree with the text message above and are happy with the identity of the site, select a certificate and click sign. You will be asked for your PIN.")
+
+ Picker("Select a certificate", selection: $certificateIndex) {
+ ForEach($certificates.indices, id: \.self) { index in
+ Text(self.certificates[index].name).tag(self.certificates[index].id)
+ }
+ }
+ .labelsHidden()
+ .onReceive(timer, perform: { _ in
+
+ findKeychainCertificates({ status, certs in
+
+ updateCertificates(certificates: &certificates, incoming: certs)
+
+ })
+
+
+ })
+
+#if false
+ SecureField("Enter your PIN", text: $password, prompt: Text("Enter your PIN")).labelsHidden()
+#endif
+ HStack {
+ Spacer()
+ Button("Sign") {
+ self.clickSign()
+ }
+ .disabled(certificates.isEmpty)
+
+ Button("Cancel") {
+ Task { @MainActor in
+ do {
+ await doCancel()
+ }
+ }
+ }
+ }
+ .buttonStyle(.bordered)
+
+ }
+ .padding()
+ }
+
+ func clickSign() {
+
+ self.signItem = DispatchWorkItem {
+
+ /* run sign here */
+ let signedText = doSign(signText: signText, certificateSelection: certificates[certificateIndex]);
+
+ /* update UI with result here */
+ DispatchQueue.main.async{
+
+ signText.signedText = signedText
+
+ sendFragment(signTextData: signText)
+ }
+ }
+
+ /* kick off the sign process */
+ if(signItem != nil) {
+ DispatchQueue.global().async(execute: signItem!)
+ }
+
+ }
+
+}
+
+#Preview {
+ SignTextContentView(signText: SignTextData())
+ .environmentObject(ModelData())
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextData.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextData.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextData.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,73 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+import Foundation
+
+class SignTextData: Identifiable, Equatable {
+
+ let id: UUID
+ let contentType: String?
+ let url: URL
+ let hostname: String
+
+ var lastId: Int
+ var payload: String = ""
+ var state: Response?
+
+ var signedText: Data?
+ var signTextOffset: Int = 0
+
+ init(message: [String : Any]?) {
+
+ let uuid = message?["uuid"] as? String
+ let id: Int? = message?["id"] as? Int
+ let contentType = message?["contentType"] as? String
+ let url = message?["url"] as? String
+ let request = message?["request"]
+
+ precondition(uuid != nil, "uuid is missing from request")
+ precondition(id != nil, "id is missing from request")
+ precondition(url != nil, "url is missing from request")
+ precondition(request != nil, "'request' is missing from request")
+
+ self.id = UUID(uuidString: uuid!)!
+ self.contentType = contentType;
+ self.url = URL(string: url!)!
+ self.hostname = self.url.host()!
+
+ self.lastId = id!;
+ if (request is String) {
+ self.payload = (request as! String)
+ }
+
+ }
+
+ init() {
+ self.id = UUID()
+ self.contentType = nil;
+ self.url = URL(string: "https://interop.redwax.eu/")!
+ self.hostname = self.url.host()!
+
+ self.lastId = 0;
+ self.payload = "Testing payload to sign."
+
+ }
+
+ static func == (lhs: SignTextData, rhs: SignTextData) -> Bool {
+ return (lhs.id == rhs.id)
+ }
+
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextTabView.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextTabView.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignText/SignTextTabView.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,112 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+import SwiftUI
+
+struct SignTextTabView: View {
+
+ @EnvironmentObject var modelData: ModelData
+
+ @State private var once = false;
+
+ @State private var selectedTab = 0
+
+ @State var tabs = Array<SignTextData>()
+
+ var body: some View {
+
+ TabView(selection: $selectedTab) {
+
+ ForEach(tabs.indices, id: \.self) { index in
+
+ SignTextContentView(signText: tabs[index]).tabItem { Text(self.tabs[index].hostname) }
+
+ }
+ #if false
+ SignTextContentView(signText: SignTextData()).tabItem { Text("interop.redwax.eu") }
+ #endif
+ }
+ .padding()
+ .onReceive(modelData.$signTexts, perform: { _ in
+
+ /* tabs cleanup - anything removed from the model must be removed from the tabs */
+ for index in tabs.indices.reversed() {
+ if (modelData.signTexts[tabs[index].id] == nil) {
+ tabs.remove(at: index)
+ }
+ }
+
+ })
+ .task {
+
+ if (once == false) {
+
+ readMessages( { request in
+
+ let signText = processRequest(message: request!, signTexts: &modelData.signTexts)
+
+ switch (signText.state) {
+ case .again:
+ /* wait for the next message */
+ sendAck(signTextData: signText);
+ break
+
+ case .show:
+ /* we have our message, add a view the the tab */
+ self.tabs.append(signText)
+ break
+
+ case .ack:
+ /* browser got our fragment, send the next one */
+ if (!sendFragment(signTextData: signText)){
+ /* at the end, send a nack to mean eof */
+ sendNack(signTextData: signText)
+
+ /* we're done, remove from the model list */
+ modelData.signTexts.removeValue(forKey: signText.id)
+
+ /* exit app if no more views */
+ if (modelData.signTexts.count == 0) {
+ exit(0)
+ }
+ }
+
+ break
+ case .nack:
+ /* browser told us to give up */
+
+ break
+ default:
+ break
+
+ }
+
+ })
+
+ }
+
+ once = true;
+
+ }
+
+ }
+
+}
+
+#Preview {
+ SignTextTabView()
+ .environmentObject(ModelData())
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextTests/Redwax_SignTextTests.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextTests/Redwax_SignTextTests.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextTests/Redwax_SignTextTests.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,46 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+
+import XCTest
+ at testable import Redwax_SignText
+
+final class Redwax_SignTextTests: XCTestCase {
+
+ override func setUpWithError() throws {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+ override func tearDownWithError() throws {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() throws {
+ // This is an example of a functional test case.
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ // Any test you write for XCTest can be annotated as throws and async.
+ // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
+ // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
+ }
+
+ func testPerformanceExample() throws {
+ // This is an example of a performance test case.
+ self.measure {
+ // Put the code you want to measure the time of here.
+ }
+ }
+
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextUITests/Redwax_SignTextUITests.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextUITests/Redwax_SignTextUITests.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextUITests/Redwax_SignTextUITests.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,51 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+
+import XCTest
+
+final class Redwax_SignTextUITests: XCTestCase {
+
+ override func setUpWithError() throws {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ continueAfterFailure = false
+
+ // In UI tests itâs important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+ }
+
+ override func tearDownWithError() throws {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() throws {
+ // UI tests must launch the application that they test.
+ let app = XCUIApplication()
+ app.launch()
+
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ }
+
+ func testLaunchPerformance() throws {
+ if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
+ // This measures how long it takes to launch your application.
+ measure(metrics: [XCTApplicationLaunchMetric()]) {
+ XCUIApplication().launch()
+ }
+ }
+ }
+}
Added: redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextUITests/Redwax_SignTextUITestsLaunchTests.swift
==============================================================================
--- redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextUITests/Redwax_SignTextUITestsLaunchTests.swift (added)
+++ redwax-signtext-macos/trunk/Redwax SignText/Redwax SignTextUITests/Redwax_SignTextUITestsLaunchTests.swift Sun Jun 30 23:07:04 2024
@@ -0,0 +1,42 @@
+/* Licensed to Stichting The Commons Conservancy (TCC) under one or more
+ * contributor license agreements. See the AUTHORS file distributed with
+ * this work for additional information regarding copyright ownership.
+ * TCC licenses this file to You 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.
+ */
+
+
+import XCTest
+
+final class Redwax_SignTextUITestsLaunchTests: XCTestCase {
+
+ override class var runsForEachTargetApplicationUIConfiguration: Bool {
+ true
+ }
+
+ override func setUpWithError() throws {
+ continueAfterFailure = false
+ }
+
+ func testLaunch() throws {
+ let app = XCUIApplication()
+ app.launch()
+
+ // Insert steps here to perform after app launch but before taking a screenshot,
+ // such as logging into a test account or navigating somewhere in the app
+
+ let attachment = XCTAttachment(screenshot: app.screenshot())
+ attachment.name = "Launch Screen"
+ attachment.lifetime = .keepAlways
+ add(attachment)
+ }
+}
Added: redwax-signtext-macos/trunk/eu.redwax.Redwax.SignText.json
==============================================================================
Binary file - no diff available.
Propchange: redwax-signtext-macos/trunk/eu.redwax.Redwax.SignText.json
------------------------------------------------------------------------------
svn:mime-type = application/json
More information about the rst-commit
mailing list