[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