Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ To opt out of data the sending of data click 'Opt out of analytics' at the botto

**v8.5.1**: 2026-01-04<br>
Address issue removing jamf users/groups.
Starting with version 8.5.1 the application will submit basic hardware, OS, and Replicator application usage to [TelemetryDeck](https://telemetrydeck.com). The data is sent anamously and used to aid in the development of the application. To opt out of data the sending of data click 'Opt out of analytics' at the bottom of the 'About Replicator' window.
Starting with version 8.5.1 the application will submit basic hardware, OS, and Replicator application usage to [TelemetryDeck](https://telemetrydeck.com). The data is sent anonymously and used to aid in the development of the application. To opt out of data the sending of data click 'Opt out of analytics' at the bottom of the 'About Replicator' window.

**v8.4.1**: 2025-11-06<br>
Address issue #128 - app is now notarized.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ A tool to synchronize objects between Jamf Pro servers. Export objects and save

![image](./Replicator/images/replicator1.png "Replicator")

By default the application will submit basic hardware, OS, and jamfCPR application usage to [TelemetryDeck](https://telemetrydeck.com). The data is sent anamously and used to aid in the development of the application. To opt out of data the sending of data click 'Opt out of analytics' at the bottom of the Settings --> app window.
By default the application will submit basic hardware, OS, and jamfCPR application usage to [TelemetryDeck](https://telemetrydeck.com). The data is sent anonymously and used to aid in the development of the application. To opt out of data the sending of data click 'Opt out of analytics' at the bottom of the Settings --> app window.

Replicate items from one Jamf server, or XML file(s), to another. If an object (based on name) exists on both source and destination, the destination object will be updated with values from the source server.
</br></br>
Expand Down
4 changes: 2 additions & 2 deletions Replicator.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -596,7 +596,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 8.6.0;
MARKETING_VERSION = "8.6.1-gio";
PRODUCT_BUNDLE_IDENTIFIER = "com.jamf.jamf-migrator";
PRODUCT_NAME = Replicator;
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
Expand Down Expand Up @@ -625,7 +625,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 8.6.0;
MARKETING_VERSION = "8.6.1-gio";
PRODUCT_BUNDLE_IDENTIFIER = "com.jamf.jamf-migrator";
PRODUCT_NAME = Replicator;
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
Expand Down
4 changes: 4 additions & 0 deletions Replicator/CreateEndpoints.swift
Original file line number Diff line number Diff line change
Expand Up @@ -977,4 +977,8 @@ class CreateEndpoints: NSObject, URLSessionDelegate {
} // if !WipeData.state.on - end
} // SendQueue - end
}

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}
10 changes: 9 additions & 1 deletion Replicator/EndpointData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,11 @@ class EndpointData: NSObject, URLSessionDelegate {
if LogLevel.debug { WriteToLog.shared.message("[getById] Returned from cleanupXml") }
}
// check progress
Endpoints.countDict[endpoint]! -= 1
if let _ = Endpoints.countDict[endpoint] {
Endpoints.countDict[endpoint]! -= 1
} else {
Endpoints.countDict[endpoint] = 0
}
if Endpoints.countDict[endpoint] == 0 {

Endpoints.countDict[endpoint] = nil
Expand Down Expand Up @@ -364,5 +368,9 @@ class EndpointData: NSObject, URLSessionDelegate {
}
}
}

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}

4 changes: 4 additions & 0 deletions Replicator/EndpointXml.swift
Original file line number Diff line number Diff line change
Expand Up @@ -363,5 +363,9 @@ class EndpointXml: NSObject, URLSessionDelegate {
}
}
}

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}

4 changes: 4 additions & 0 deletions Replicator/ExistingObjects.swift
Original file line number Diff line number Diff line change
Expand Up @@ -424,4 +424,8 @@ class ExistingObjects: NSObject, URLSessionDelegate {
completion(("Current endpoints - export.saveOnly, not needed.","\(theDestEndpoint)"))
}
}

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}
5 changes: 4 additions & 1 deletion Replicator/IconDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -617,5 +617,8 @@ class IconDelegate: NSObject, URLSessionDelegate {
} // while - end
} // DispatchQueue.main.async - end
}


func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}
2 changes: 1 addition & 1 deletion Replicator/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>20260122-5EC</string>
<string>20260909-8C6</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
Expand Down
4 changes: 4 additions & 0 deletions Replicator/Json.swift
Original file line number Diff line number Diff line change
Expand Up @@ -131,5 +131,9 @@ class Json: NSObject, URLSessionDelegate {
}
return cleanPolicies as AnyObject
}

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}

4 changes: 4 additions & 0 deletions Replicator/ObjectDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,9 @@ class ObjectDelegate: NSObject, URLSessionDelegate {
}
}
}

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}

4 changes: 4 additions & 0 deletions Replicator/PackagesDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -399,4 +399,8 @@ class PackagesDelegate: NSObject, URLSessionDelegate {
// WriteToLog.shared.message("[PackageDelegate.filenameIdDict] Duplicate references to the same package were found on \(theServer)\n\(message)")
}
}

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}
5 changes: 5 additions & 0 deletions Replicator/RemoveObjects.swift
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ class RemoveObjects: NSObject, URLSessionDelegate {
defer { semaphore.signal() }
session.finishTasksAndInvalidate()
if let httpResponse = response as? HTTPURLResponse {
if LogLevel.debug { WriteToLog.shared.message("[RemoveObjects.process] response statusCode: \(httpResponse.statusCode)") }
if let _ = String(data: data!, encoding: .utf8) {
responseData = String(data: data!, encoding: .utf8)!
} else {
Expand Down Expand Up @@ -354,4 +355,8 @@ class RemoveObjects: NSObject, URLSessionDelegate {
semaphore.wait()
}
}

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}
Loading