Commit 0e94fcab authored by Gregor Longariva's avatar Gregor Longariva 💬
Browse files

Merge branch 'dev' into 'master'

Merge actual dev version into main

See merge request faumac/networkShareMounter!34
parents 86ef73be c8a29288
......@@ -10,8 +10,6 @@
<dict>
<key>de.fau.rrze.NetworkShareMounter</key>
<string>Network Share Mounter</string>
<key>de.fau.rrze.NetworkShareMounter-LaunchAtLoginHelper</key>
<string>de.fau.rrze.NetworkShareMounter-LaunchAtLoginHelpe</string>
</dict>
<key>signingCertificate</key>
<string>Developer ID Application</string>
......
......@@ -42,8 +42,12 @@ class AppDelegate: NSObject, NSApplicationDelegate {
//
// initalize class which will perform all the automounter tasks
let mounter = self.mounter
self.mountpath = mounter.mountpath
//
// initialize statistics reporting struct
let stats = AppStatistics.init()
stats.reportAppInstallation()
//
// register App according to userDefaults as "start at login"
......@@ -70,7 +74,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
let netConnection = Monitor.shared
let status = netConnection.netOn
NSLog("Current Network Path is \(status)")
mounter.mountShares()
self.mounter.mountShares()
})
}
......@@ -78,7 +82,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
//
// unmount all shares befor leaving
if userDefaults.bool(forKey: "unmountOnExit") == true {
mounter.unmountAllShares()
self.mounter.unmountAllShares()
}
//
// end network monitoring
......@@ -136,7 +140,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
menu.addItem(NSMenuItem(title: NSLocalizedString("About Network Share Mounter", comment: "About Network Share Mounter"),
action: #selector(AppDelegate.openHelpURL(_:)), keyEquivalent: ""))
}
// menu.addItem(NSMenuItem(title: NSLocalizedString("Network Share Mounter", comment: "Info"), action: #selector(AppDelegate.showInfo(_:)), keyEquivalent: "P"))
menu.addItem(NSMenuItem(title: NSLocalizedString("Mount shares", comment: "Mount shares"),
action: #selector(AppDelegate.mountManually(_:)), keyEquivalent: "m"))
menu.addItem(NSMenuItem(title: NSLocalizedString("Unmount shares", comment: "Unmount shares"),
......
//
// AppStatistics.swift
// Network Share Mounter
//
// Created by Gregor Longariva on 21.06.22.
// Copyright © 2022 Regionales Rechenzentrum Erlangen. All rights reserved.
//
import Foundation
import Cocoa
struct AppStatistics {
var instanceUUID = "UNKNOWN"
var appVersion = "UNKNOWN"
var reportURL = Settings.statisticsReportURL
var bundleID = "UNKNOWN"
let userDefaults = UserDefaults.standard
init() {
self.instanceUUID = getInstanceUUID()
self.appVersion = getAppVersion()
self.bundleID = getBundleID()
}
private func getInstanceUUID() -> String {
if let uuid = userDefaults.string(forKey: "UUID") {
return(uuid)
} else {
let uuid = UUID().uuidString
userDefaults.set(uuid, forKey: "UUID")
return(uuid)
}
}
private func getBundleID() -> String {
if let bundleID = Bundle.main.bundleIdentifier {
return(bundleID)
} else {
return("UNKNOWN")
}
}
private func getAppVersion() -> String {
if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
return(appVersion)
} else {
return("UNKNOWN")
}
}
func reportAppInstallation() -> Void {
let reportData = "/?bundleid=" + self.bundleID + "&uuid=" + self.instanceUUID + "&version=" + self.appVersion
guard let reportURL = URL(string: Settings.statisticsReportURL + reportData) else {
return()
}
var request = URLRequest(url: reportURL)
request.httpMethod = "GET"
let sessionConfiguration = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfiguration)
let semaphore = DispatchSemaphore(value: 0)
NSLog("Trying to connect to report server")
session.dataTask(with: reportURL) { data, response, error in
DispatchQueue.main.async {
if error != nil || (response as! HTTPURLResponse).statusCode != 200 {
NSLog("Connection to reporting server failed.")
} else {
NSLog("Reported app statistics.")
}
// swiftlint:enable force_cast
semaphore.signal()
}
}.resume()
//_ = semaphore.wait(wallTimeout: .distantFuture)
return()
}
}
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="20037"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
......
......@@ -10,6 +10,10 @@
<true/>
<key>helpURL</key>
<string></string>
<key>location</key>
<string></string>
<key>cleanupLocationDirectory</key>
<false/>
<key>customNetworkShares</key>
<array/>
</dict>
......
......@@ -40,9 +40,10 @@ typealias MountCallbackHandler = (Int32, URL?, [String]?) -> Void;
class Mounter {
var localizedFolder: String
var localizedFolder = Settings.translation[Locale.current.languageCode!] ?? Settings.translation["en"]!
var mountpath: String
let fm = FileManager.default
let userDefaults = UserDefaults.standard
//let url: URL
fileprivate var asyncRequestId: AsyncRequestID?
......@@ -50,10 +51,15 @@ class Mounter {
init() {
// create subfolder in home to mount shares in
self.localizedFolder = Settings.translation[Locale.current.languageCode!] ?? Settings.translation["en"]!
self.mountpath = NSString(string: "~/\(localizedFolder)").expandingTildeInPath
if userDefaults.string(forKey: "location") != nil {
self.mountpath = NSString(string: userDefaults.string(forKey: "location")!).expandingTildeInPath
} else {
self.mountpath = NSString(string: "~/\(self.localizedFolder)").expandingTildeInPath
}
do {
//
// try to create (if not exists) the directory where the network shares will be mounted
if !fm.fileExists(atPath: mountpath) {
try fm.createDirectory(atPath: mountpath, withIntermediateDirectories: false, attributes: nil)
NSLog("\(mountpath): created")
......@@ -126,32 +132,37 @@ extension Mounter {
// if directory is a regular directory go on
if !isDirectoryFilesystemMount(atPath: path.appendingPathComponent(filePath)) {
//
// if the function has a parameter we want ot hanlde files
if let unwrappedFilename = filename {
if !isDirectoryFilesystemMount(atPath: path.appendingPathComponent(filePath)) {
let deleteFile = path.appendingPathComponent(filePath).appendingPathComponent(unwrappedFilename)
if fm.fileExists(atPath: deleteFile) {
NSLog("Deleting obstructing file \(deleteFile)")
try fm.removeItem(atPath: deleteFile)
// Clean up the directory containing the mounts only if defined in userdefaults
if userDefaults.bool(forKey: "cleanupLocationDirectory") == true {
//
// if the function has a parameter we want to handle files
if let unwrappedFilename = filename {
if !isDirectoryFilesystemMount(atPath: path.appendingPathComponent(filePath)) {
let deleteFile = path.appendingPathComponent(filePath).appendingPathComponent(unwrappedFilename)
if fm.fileExists(atPath: deleteFile) {
NSLog("Deleting obstructing file \(deleteFile)")
try fm.removeItem(atPath: deleteFile)
}
}
} else {
//
// else we have a directory to remove
// delete directories only if the direcotry/location of the mountpoints
let deleteFile = path.appendingPathComponent(filePath)
let task = Process()
task.launchPath = "/bin/rmdir"
task.arguments = ["\(deleteFile)"]
let pipe = Pipe()
task.standardOutput = pipe
//
// Launch the task
task.launch()
//
// Get the data
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
NSLog("Deleting obstructing directory \(deleteFile): \(output ?? "done")")
}
} else {
//
// else we have a directory to remove
let deleteFile = path.appendingPathComponent(filePath)
let task = Process()
task.launchPath = "/bin/rmdir"
task.arguments = ["\(deleteFile)"]
let pipe = Pipe()
task.standardOutput = pipe
//
// Launch the task
task.launch()
//
// Get the data
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
NSLog("Deleting obstructing directory \(deleteFile): \(output ?? "done")")
}
} else {
//
......@@ -173,7 +184,7 @@ extension Mounter {
//
// rudimentary check for XXX-1, XXX-2, ... mountdirs
// sure, this could be done better (e.g. regex mathcing), but I don't think it's worth thinking about
for count in 1...10 {
for count in 1...20 {
if filePath.contains(shareMountDir + "-\(count)") {
NSLog("Duplicatre mount of \(share): it is already mounted as \(path.appendingPathComponent(filePath)). Trying to unmount...")
unmountShare(atPath: path.appendingPathComponent(filePath))
......
......@@ -14,8 +14,10 @@ class NetworkShareMounterViewController: NSViewController {
let userDefaults = UserDefaults.standard
@objc dynamic var launchAtLogin = LaunchAtLogin.kvo
// let customshares = UserDefaults(suiteName: config.defaultsDomain)?.array(forKey: "customNetworkShares") as? [String] ?? []
// swiftlint:disable force_cast
let appDelegate = NSApplication.shared.delegate as! AppDelegate
// swiftlint:enable force_cast
override func viewDidLoad() {
super.viewDidLoad()
......@@ -60,9 +62,8 @@ class NetworkShareMounterViewController: NSViewController {
if shareArray.contains(shareString) {
NSLog("\(shareString) is already in list of user's customNetworkShares")
} else {
let mounter = Mounter.init()
do {
try mounter.doTheMount(forShare: usersNewShare.stringValue)
try appDelegate.mounter.doTheMount(forShare: usersNewShare.stringValue)
shareArray.append(usersNewShare.stringValue)
userDefaults.set(shareArray, forKey: "customNetworkShares")
usersNewShare.stringValue=""
......
......@@ -28,4 +28,5 @@ struct Settings {
".DS_Store",
".autodiskmounted"
]
static let statisticsReportURL = "https://faumac.rrze.fau.de/apps"
}
......@@ -23,13 +23,19 @@ For an easier configuration of all the preference keys without creating or modif
| Key | Type | Description | Default Value | Aviable in version | Required? | Example |
| :------------------ | :---- | :---------------------|:-------------------------------------- | --------------------------------- | ------- | ---- |
| `networkShares` | Array | array with all network shares. For example configured through a MDM | - | all | - |`smb://filer.your.domain/share`<br />`smb://homefiler.your.domain/%USERNAME%`|
| `customNetworkShares` | Array | array with all user configured network shares | - | all | optional |`smb://myhomefiler.my.domain/share`|
| `autostart` | Boolean | if set, the app will be launched on user-login | false | v2 | optional ||
| `canQuit` | Boolean | if set, the user can quit the app | true | v2 | optional ||
| `canChangeAutostart` | Boolean | if set to false, the user can not change the Autostart option | true | v2 | optional ||
| `unmountOnExit` | Boolean | if set to false the shares will be mounted after quitting the app | true | v2 | optional ||
| `helpURL` | String | configure a help URL to help users interact with the application | - | v2 | optional |https://www.anleitungen.rrze.fau.de/betriebssysteme/apple-macos-und-ios/macos/#networksharemounter|
| `networkShares` | Array | Array with all (SMB) network shares. For example configured through a MDM. Note: %USERNAME% will be replaced with the current user's login name.| - | all | - |`smb://filer.your.domain/share`<br />`smb://homefiler.your.domain/%USERNAME%`|
| `customNetworkShares` | Array | Array with all user configured (SMB) network shares. It's not recommend to set this array via MDM | - | all | optional |`smb://myhomefiler.my.domain/share`|
| `autostart` | Boolean | If set, the app will be launched on user-login | false | v2 | optional ||
| `canQuit` | Boolean | If set, the user can quit the app | true | v2 | optional ||
| `canChangeAutostart` | Boolean | If set to false, the user can not change the Autostart option | true | v2 | optional ||
| `unmountOnExit` | Boolean | If set to false the shares will be mounted after quitting the app | true | v2 | optional ||
| `location` | String | Path where network shares will be mounted. Leave blank for the default value (highly recommended) | - | v2 | optional | `/Volumes` |
| `cleanupLocationDirectory` | Boolean | If set to true, the mount location will be cleaned up from obstructing files and directories. Use with caution if the location directory is not the default!| false | v2 | - | `false` |
| `helpURL` | String | Configure a help URL to help users interact with the application | - | v2 | optional |https://www.anleitungen.rrze.fau.de/betriebssysteme/apple-macos-und-ios/macos/#networksharemounter|
#### Important note for `location` and `cleanupLocationDirectory` values
If `location` is left empty (or is not defined), a directory is created in a subdirectory of the user's home where the network drives will be mounted. Since this directory always contains only mounted network shares, there is a routine that cleans up this directory and deletes unnecessary files and directories.
If another directory is used to mount the network drives (like `location` set to, for example, `/Volumes`) **it is strongly recommended** to disable the cleanup routine by setting `cleanupLocationDirectory` to `false`.
### Screenshots
Screenshots of our Network Share Mounter app. On the left the menu bar icon with the mount, unmount and quit options. On the right the configuration window with the custom network share list:
......@@ -63,7 +69,7 @@ The defaults domain for our [pre-built package](https://gitlab.rrze.fau.de/fauma
[Download example Configuration Profile](https://gitlab.rrze.fau.de/faumac/networkShareMounter/-/blob/master/jamf-manifests/networkShareMounter%20Legacy.mobileconfig).
If you want to configure shares manuelly, you can use this command:
If you want to configure shares manually, you can use this command:
```bash
defaults write de.uni-erlangen.rrze.networkShareMounter networkShares -array "smb://filer.your.domain/share" "smb://filer2.your.domain/home/Another Share/foobar" "smb://home.your.domain/%USERNAME%"
......@@ -79,6 +85,12 @@ defaults write de.uni-erlangen.rrze.networkShareMounter customNetworkShares -arr
* There is an optional parameter `--openMountDir` which opens a new finder window of the networkShareMounter mount directory. (e.g. "\~/Network shares" or "\~/Netzlaufwerke")
* If you want to change the installation directory, go to **Build Settings** > **Deployment** > **Installation Directory**. But keep in mind that you also have to change the path of the LaunchAgent (command line version).
## FAQ
### 1) Jamf recon stuck with configured Network Share Mounter app
This is probably due the innventory collection configuration "Include home directory sizes" in Jamf (Pro). Both Network Share Mounter versions, v2 and legacy, mounting the shares in the users home (~/Network Shares). If the option is now enabled, Jamf will also try to collect the size of the network share mounter mounts and the process get stuck.
To resolve this behaviour, go to **Settings > Computer Management - Management Framework > Inventory Collection** and disable the option **Include home directory sizes**.
## Contact
Feel free to contact us for ideas, enhancements or bug reports at the [service desk address](mailto:rrze-gitlab+faumac-networksharemounter-506-issue-@fau.de).
For general questions you can write directly to the team at [rrze-mac@fau.de](mailto:rrze-mac@fau.de).
......
# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app
apple_id("rrze-apple-entwickler@fau.de") # Your Apple email address
team_id("C8F68RFW4L")
app_identifier("de.fau.rrze.NetworkShareMounter")
......
......@@ -52,6 +52,7 @@ lane :commonTasks do
desc "perform some commont build tasks"
id = getbundleid
tag = getlatestag
default_platform(:mac)
signing_id = ENV["SIGNING_ID"]
app_store_connect_api_key(
is_key_content_base64: true
......@@ -76,9 +77,12 @@ lane :commonTasks do
)
get_certificates
sync_code_signing
cert
sigh(force: true)
gym(
scheme: "networkShareMounter",
output_directory: "build/",
export_method: "developer-id",
export_options: "./ExportOptions.plist"
)
end
......@@ -107,7 +111,7 @@ lane :test do
signing_id = ENV["SIGNING_ID"]
output = sh("productbuild", "--sign", "#{signing_id}", "--component", "../build/Network\ Share\ Mounter.app", "/Applications", "../build/NetworkShareMounterTest-#{appversion}.pkg")
rescue => exception
on_error(exception)
#on_error(exception)
end
end
......@@ -154,24 +158,25 @@ lane :release do
xcodeproj: "networkShareMounter.xcodeproj"
)
build
appversion = getappversion
desc "Create DMG image"
dmg(
path: "build/Network Share Mounter.app",
output_path: "build/NetworkShareMounter.dmg",
output_path: "build/NetworkShareMounter-#{appversion}.dmg",
volume_name: "NetworkShareMounter"
)
desc "creating .pkg file"
signing_id = ENV["SIGNING_ID"]
output = sh("productbuild", "--sign", "#{signing_id}", "--component", "../build/Network\ Share\ Mounter.app", "/Applications", "../build/NetworkShareMounter.pkg")
output = sh("productbuild", "--sign", "#{signing_id}", "--component", "../build/Network\ Share\ Mounter.app", "/Applications", "../build/NetworkShareMounter-#{appversion}.pkg")
desc "Notarize dmg"
notarize(
package: "build/NetworkShareMounter.dmg",
package: "build/NetworkShareMounter-#{appversion}.dmg",
bundle_id: "de.fau.rrze.NetworkShareMounter",
username: "rrze-apple-entwickler@fau.de"
)
desc "Notarize pkg"
notarize(
package: "build/NetworkShareMounter.pkg",
package: "build/NetworkShareMounter-#{appversion}.pkg",
bundle_id: "de.fau.rrze.NetworkShareMounter",
username: "rrze-apple-entwickler@fau.de"
)
......
......@@ -6,6 +6,7 @@
# Remove the # in front of the line to enable the option
# scheme("Example")
scheme("Network Share Mounter")
# sdk("iphoneos9.0")
\ No newline at end of file
......@@ -2,8 +2,9 @@ git_url("https://gitlab.rrze.fau.de/faumac/fastlanecerts.git")
storage_mode("git")
app_identifier("de.fau.rrze.NetworkShareMounter")
type("development") # The default type, can be: appstore, adhoc, enterprise or development
type("developer_id") # The default type, can be: appstore, adhoc, enterprise or development
#additional_cert_types("mac_installer_distribution")
platform("macos")
# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"])
username("rrze-apple-entwickler@fau.de") # Your Apple Developer Portal username
......
{
"$schema": "http://json-schema.org/schema#",
"title": "Network Share Mounter (de.fau.rrze.NetworkShareMounter)",
"description": "Jamf Manifest for Network Share Mounter v2",
"__version": "1.0",
"description": "Jamf Manifest for Network Share Mounter v2.",
"__version": "1.1",
"__feedback": "rrze-mac@fau.de",
"type": "object",
"options": {
"remove_empty_properties": true
},
"links": [{
"rel": "More information",
"href": "https://gitlab.rrze.fau.de/faumac/networkShareMounter"
}
],
"properties": {
"networkShares": {
"title": "Network shares",
"description": "Add shares to mount (example: smb://filer.your.domain/share)",
"description": "Array with all network shares. Example: smb://filer.your.domain/share. Note: %USERNAME% will be replaced with the current user's login name.",
"type": "array",
"items": {
"type": "string",
"pattern": "^smb:\\/\\/\\S*$",
"title": "Share"
}
},
"location": {
"title": "Mount path",
"description": "Path where network shares will be mounted. Leave blank for the default value (highly recommended)",
"links": [{
"rel": "More information",
"href": "https://gitlab.rrze.fau.de/faumac/networkShareMounter#important-note-for-location-and-cleanuplocationdirectory-values"
}
],
"type": "string",
"default": ""
},
"cleanupLocationDirectory": {
"title": "Clean up obstructing files and directories",
"links": [{
"rel": "More information",
"href": "https://gitlab.rrze.fau.de/faumac/networkShareMounter#important-note-for-location-and-cleanuplocationdirectory-values"
}
],
"description": "if set to true, the mount location will be cleaned up from obstructing files and directories. Use with caution!",
"type": "boolean",
"default": false
},
"autostart": {
"title": "Enable autostart",
"description": "If set to true, the app will be launched on user-login",
"type": "boolean",
"default": "false"
"default": false
},
"canQuit": {
"title": "Show Exit",
"description": "Show exit button in the menu bar",
"type": "boolean",
"default": "true"
"default": true
},
"canChangeAutostart": {
"title": "Allow autostart changes",
"description": "Allow users to change the autostart settings",
"type": "boolean",
"default": "true"
"default": true
},
"unmountOnExit": {
"title": "Unmount shares on exit",
"description": "Unmount shares if the app get closed",
"type": "boolean",
"default": "true"
"default": true
},
"helpURL": {
"title": "Help URL",
"description": "Configure a help URL to help users interact with the application",
"pattern": "^http[s]?:\\/\\/\\S*$",
"type": "string",
"default": ""
}
......
......@@ -11,6 +11,7 @@
D60FA5271E7FBE2200D9B5A5 /* config.swift in Sources */ = {isa = PBXBuildFile; fileRef = D60FA5261E7FBE2200D9B5A5 /* config.swift */; };
F72985C42760EF3800FCF8C9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F72985C62760EF3800FCF8C9 /* Localizable.strings */; };
F739C41A2755297F003A3CC5 /* DefaultValues.plist in Resources */ = {isa = PBXBuildFile; fileRef = F739C418275525BC003A3CC5 /* DefaultValues.plist */; };
F742ACF62861CB62009864DF /* AppStatistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = F742ACF52861CB62009864DF /* AppStatistics.swift */; };
F77107B7274EC51600556B20 /* Monitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77107B6274EC51600556B20 /* Monitor.swift */; };
F77107B9274EC76200556B20 /* Mounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77107B8274EC76200556B20 /* Mounter.swift */; };
F77107BB274EC7D200556B20 /* config.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77107BA274EC7D200556B20 /* config.swift */; };
......@@ -60,6 +61,7 @@
F72985C52760EF3800FCF8C9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
F72985C72760EF3B00FCF8C9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
F739C418275525BC003A3CC5 /* DefaultValues.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = DefaultValues.plist; sourceTree = "<group>"; };
F742ACF52861CB62009864DF /* AppStatistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStatistics.swift; sourceTree = "<group>"; };
F77107B6274EC51600556B20 /* Monitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Monitor.swift; sourceTree = "<group>"; };
F77107B8274EC76200556B20 /* Mounter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mounter.swift; sourceTree = "<group>"; };
F77107BA274EC7D200556B20 /* config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = config.swift; sourceTree = "<group>"; };
......@@ -149,6 +151,7 @@
F79B15C2274E7D3600C322A8 /* Network-Share-Mounter-Info.plist */,
F72985C62760EF3800FCF8C9 /* Localizable.strings */,
F77107BA274EC7D200556B20 /* config.swift */,
F742ACF52861CB62009864DF /* AppStatistics.swift */,
F77107B8274EC76200556B20 /* Mounter.swift */,
F79B1597274E722000C322A8 /* AppDelegate.swift */,
F739C418275525BC003A3CC5 /* DefaultValues.plist */,
......@@ -265,8 +268,6 @@
};
F79B15AE274E722100C322A8 = {
CreatedOnToolsVersion = 13.2;
DevelopmentTeam = C8F68RFW4L;
ProvisioningStyle = Manual;
TestTargetID = F79B1594274E722000C322A8;
};
};
......@@ -363,6 +364,7 @@
files = (
F77107B7274EC51600556B20 /* Monitor.swift in Sources */,
F79B15C4274E800C00C322A8 /* NetworkShareMounterViewController.swift in Sources */,
F742ACF62861CB62009864DF /* AppStatistics.swift in Sources */,
F77107BB274EC7D200556B20 /* config.swift in Sources */,
F79B1598274E722000C322A8 /* AppDelegate.swift in Sources */,
F77107B9274EC76200556B20 /* Mounter.swift in Sources */,
......@@ -551,7 +553,7 @@
CODE_SIGN_STYLE = Manual;
DEVELOPMENT_TEAM = C8F68RFW4L;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = "$(SRCROOT)/networkShareMounter/de.uni-erlangen.rrze.networkShareMounter.plist";
INFOPLIST_FILE = "networkShareMounter/de.uni-erlangen.rrze.networkShareMounter.plist";
INSTALL_PATH = "/Library/Application Support/FAUmac/bin";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......@@ -568,7 +570,7 @@
CODE_SIGN_STYLE = Manual;
DEVELOPMENT_TEAM = C8F68RFW4L;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = "$(SRCROOT)/networkShareMounter/de.uni-erlangen.rrze.networkShareMounter.plist";
INFOPLIST_FILE = "networkShareMounter/de.uni-erlangen.rrze.networkShareMounter.plist";
INSTALL_PATH = "/Library/Application Support/FAUmac/bin";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......@@ -589,10 +591,10 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = "Network Share Mounter/Network_Share_Mounter.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_IDENTITY = "Developer ID Application";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 19;
CURRENT_PROJECT_VERSION = 38;
DEVELOPMENT_TEAM = C8F68RFW4L;
ENABLE_HARDENED_RUNTIME = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
......@@ -607,12 +609,12 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 2.0.4;
MARKETING_VERSION = 2.1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = de.fau.rrze.NetworkShareMounter;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
PROVISIONING_PROFILE_SPECIFIER = "Network Share Mounter";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
......@@ -633,10 +635,10 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = "Network Share Mounter/Network_Share_Mounter.entitlements";