Skip to content

Commit

Permalink
added pref for shares
Browse files Browse the repository at this point in the history
  • Loading branch information
twocanoes committed Feb 4, 2024
1 parent b67970a commit 9c8d920
Show file tree
Hide file tree
Showing 6 changed files with 270 additions and 109 deletions.
172 changes: 160 additions & 12 deletions Profile Manifest/com.twocanoes.xcreds.plist
Original file line number Diff line number Diff line change
Expand Up @@ -426,18 +426,6 @@ A profile can consist of payloads with different version numbers. For example, c
<key>pfm_type</key>
<string>string</string>
</dict>
<dict>
<key>pfm_description</key>
<string>Name for Shares menu item. Default: &quot;Shares&quot;.</string>
<key>pfm_documentation_url</key>
<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>
<key>pfm_name</key>
<string>shareMenuItemName</string>
<key>pfm_title</key>
<string>Share Menu Item Name</string>
<key>pfm_type</key>
<string>string</string>
</dict>
<dict>
<key>pfm_description</key>
<string>Add a menu item for changing the password that will open this URL when the menu item is selected.</string>
Expand Down Expand Up @@ -1174,6 +1162,166 @@ changing “passwordID” to the correct element ID. If the value you typed into
<key>pfm_type</key>
<string>array</string>
</dict>
<dict>
<key>pfm_description</key>
<string>Shares</string>
<key>pfm_name</key>
<string>Shares</string>
<key>pfm_subkeys</key>
<array>
<dict>
<key>pfm_subkeys</key>
<array>
<dict>
<key>pfm_description</key>
<string>Name</string>
<key>pfm_name</key>
<string>Name</string>
<key>pfm_title</key>
<string>Name</string>
<key>pfm_type</key>
<string>string</string>
</dict>
<dict>
<key>pfm_description</key>
<string>URL</string>
<key>pfm_name</key>
<string>URL</string>
<key>pfm_title</key>
<string>URL</string>
<key>pfm_type</key>
<string>string</string>
</dict>
<dict>
<key>pfm_description</key>
<string>Groups</string>
<key>pfm_name</key>
<string>Groups</string>
<key>pfm_title</key>
<string>Groups</string>
<key>pfm_type</key>
<string>string</string>
</dict>
<dict>
<key>pfm_description</key>
<string>ConnectedOnly</string>
<key>pfm_name</key>
<string>ConnectedOnly</string>
<key>pfm_title</key>
<string>ConnectedOnly</string>
<key>pfm_type</key>
<string>boolean</string>
</dict>
<dict>
<key>pfm_description</key>
<string>Options</string>
<key>pfm_name</key>
<string>Options</string>
<key>pfm_title</key>
<string>Options</string>
<key>pfm_type</key>
<string>array</string>
</dict>
<dict>
<key>pfm_description</key>
<string>LocalMount</string>
<key>pfm_name</key>
<string>LocalMount</string>
<key>pfm_title</key>
<string>LocalMount</string>
<key>pfm_type</key>
<string>string</string>
</dict>
<dict>
<key>pfm_description</key>
<string>AutoMount</string>
<key>pfm_name</key>
<string>AutoMount</string>
<key>pfm_title</key>
<string>AutoMount</string>
<key>pfm_type</key>
<string>boolean</string>
</dict>
</array>
<key>pfm_type</key>
<string>dictionary</string>
</dict>
</array>
<key>pfm_title</key>
<string>Shares</string>
<key>pfm_type</key>
<string>array</string>
</dict>
<dict>
<key>pfm_description</key>
<string>HomeMountEnabled</string>
<key>pfm_name</key>
<string>HomeMountEnabled</string>
<key>pfm_title</key>
<string>HomeMountEnabled</string>
<key>pfm_type</key>
<string>boolean</string>
</dict>
<dict>
<key>pfm_description</key>
<string>HomeMountGroups</string>
<key>pfm_name</key>
<string>HomeMountGroups</string>
<key>pfm_title</key>
<string>HomeMountGroups</string>
<key>pfm_type</key>
<string>array</string>
<key>pfm_subkeys</key>
<array>
<dict>
<key>pfm_name</key>
<string>group</string>
<key>pfm_type</key>
<string>string</string>
</dict>
</array>
</dict>
<dict>
<key>pfm_description</key>
<string>HomeMountOptions</string>
<key>pfm_name</key>
<string>HomeMountOptions</string>
<key>pfm_title</key>
<string>HomeMountOptions</string>
<key>pfm_type</key>
<string>array</string>
<key>pfm_subkeys</key>
<array>
<dict>
<key>pfm_name</key>
<string>option</string>
<key>pfm_type</key>
<string>string</string>
</dict>
</array>
</dict>
<dict>
<key>pfm_description</key>
<string>HomeAppendDomain</string>
<key>pfm_name</key>
<string>HomeAppendDomain</string>
<key>pfm_title</key>
<string>HomeAppendDomain</string>
<key>pfm_type</key>
<string>boolean</string>
</dict>
<dict>
<key>pfm_description</key>
<string>Name for Shares menu item. Default: &quot;Shares&quot;.</string>
<key>pfm_documentation_url</key>
<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>
<key>pfm_name</key>
<string>shareMenuItemName</string>
<key>pfm_title</key>
<string>Share Menu Item Name</string>
<key>pfm_type</key>
<string>string</string>
</dict>
</array>
<key>pfm_targets</key>
<array>
Expand Down
82 changes: 41 additions & 41 deletions ShareMounter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import Cocoa
import NetFS

enum ShareKeys {
static let homeMount = "HomeMount"
static let homeMount = "HomeMountEnabled"
static let mount = "Mount"
static let shares = "Shares"
// static let groups = "Groups"
Expand Down Expand Up @@ -69,8 +69,8 @@ class ShareMounter {

let fm = FileManager.default
let ws = NSWorkspace.shared
let sharePrefs = UserDefaults.init(suiteName: "com.twocanoes.xcreds-shares")
let sharePrefs = UserDefaults.standard

var mountedShares = [URL]()
var mountedOriginalShares = [String]()
var mountedSharePaths = [URL:String]()
Expand Down Expand Up @@ -100,43 +100,42 @@ class ShareMounter {
var tempShares = [share_info]()

guard let groups = adUserRecord?.groups else { return }

//TODO: ShareReset

if let homeDict = sharePrefs?.dictionary(forKey: ShareKeys.homeMount) {


if sharePrefs.bool(forKey: ShareKeys.homeMount)==true{

myLogger.logit(.debug, message: "Evaluating home share for automounts.")
if let homePathRaw = adUserRecord?.homeDirectory {
if var homePath = URL(string: "smb:" + homePathRaw) {

if defaults.bool(forKey: PrefKeys.homeAppendDomain.rawValue) {
if let domain = defaults.string(forKey: PrefKeys.aDDomain.rawValue) {
var newHome = "smb://" + homePath.host! + "." + domain
if let domain = defaults.string(forKey: PrefKeys.aDDomain.rawValue), let host = homePath.host {
var newHome = "smb://" + host + "." + domain
newHome += homePath.path
homePath = URL(string: newHome)!
if let url = URL(string: newHome){
homePath = url
}
}
}

if let shareGroups = homeDict["Groups"] as! [String]?,
let shareAutoMount = homeDict["Mount"] as? Bool,
let shareOptions = homeDict["Options"] as! [String]? {

var currentShare = share_info(groups: shareGroups, originalURL: homePathRaw, url: homePath, name: defaults.string(forKey: PrefKeys.menuHomeDirectory.rawValue) ?? "Network Home", options: shareOptions, connectedOnly: true, mountStatus: .unmounted, localMount: nil, autoMount: shareAutoMount, reqID: nil, attemptDate: nil, localMountPoints: nil)
let homeShareGroups = sharePrefs.value(forKey: "HomeMountGroups") as? [String] ?? []
let homeShareOptions = sharePrefs.value(forKey: "HomeMountOptions") as? [String] ?? []

for share in all_shares {
if share.originalURL == currentShare.originalURL {
// share is still mounting, so copy the share
if CommandLine.arguments.contains("-shares") {
print("Share is still mounting, using existing information")
print(share)
}
currentShare = share
var currentShare = share_info(groups: homeShareGroups, originalURL: homePathRaw, url: homePath, name: defaults.string(forKey: PrefKeys.menuHomeDirectory.rawValue) ?? "Network Home", options: homeShareOptions, connectedOnly: true, mountStatus: .unmounted, localMount: nil, autoMount: true, reqID: nil, attemptDate: nil, localMountPoints: nil)

for share in all_shares {
if share.originalURL == currentShare.originalURL {
// share is still mounting, so copy the share
if CommandLine.arguments.contains("-shares") {
print("Share is still mounting, using existing information")
print(share)
}
currentShare = share
}

tempShares.append(currentShare)
resolvedShares[currentShare.url] = homePathRaw
}

tempShares.append(currentShare)
resolvedShares[currentShare.url] = homePathRaw

}
} else {
myLogger.logit(.debug, message: "Unable to get home share from preferences.")
Expand All @@ -145,24 +144,25 @@ class ShareMounter {
myLogger.logit(.debug, message: "No home mount dictionary")
}

if let mountsRaw = sharePrefs?.array(forKey: ShareKeys.shares) {
if let mountsRaw = sharePrefs.array(forKey: ShareKeys.shares) {

if mountsRaw.count == 0 { return }

for mount in mountsRaw {

guard mount is Dictionary<String, AnyObject> else { continue }
let mountDict = mount as! [String:AnyObject]
if let shareGroups = mountDict["Groups"] as! [String]?,
let shareName = mountDict["Name"] as? String,
let mountDict = mount as? [String:AnyObject] ?? [:]
let shareGroups = mountDict["Groups"] as? [String] ?? []
let shareLocalMount = mountDict["LocalMount"] as? String ?? ""
let shareOptions = mountDict["Options"] as? [String] ?? []

if let shareName = mountDict["Name"] as? String,
let shareURL = mountDict["URL"] as? String,
let shareAutoMount = mountDict["AutoMount"] as? Bool,
let shareLocalMount = mountDict["LocalMount"] as? String,
let shareConnectedOnly = mountDict["ConnectedOnly"] as? Bool,
let shareOptions = mountDict["Options"] as! [String]?,
let urlRaw = subVariables(shareURL) {

let groupsArray = groups as! [String]
let groupsArray = groups

if Set(groupsArray).intersection(Set(shareGroups)).count < 1 && shareGroups.count > 0 {
myLogger.logit(.debug, message: "Not in the right group")
Expand Down Expand Up @@ -222,7 +222,7 @@ class ShareMounter {
// we hardcode .timemachine in here b/c that will always fail on the getFileSystemInfo call
var ignoreShares = [".timemachine", "/private/", "System/Volumes"]

if let ignoreShareNamesTemp = sharePrefs?.array(forKey: ShareKeys.ignoreShareNames) as? [String] {
if let ignoreShareNamesTemp = sharePrefs.array(forKey: ShareKeys.ignoreShareNames) as? [String] {
ignoreShares.append(contentsOf: ignoreShareNamesTemp)
}

Expand Down Expand Up @@ -337,15 +337,15 @@ class ShareMounter {

myLogger.logit(.debug, message: "Attempting to mount: " + all_shares[index].url.absoluteString)

if sharePrefs?.bool(forKey: ShareKeys.slowMount) ?? false {
if sharePrefs.bool(forKey: ShareKeys.slowMount) ?? false {
let delay: useconds_t
delay = useconds_t(1000 * (sharePrefs?.integer(forKey: ShareKeys.slowMountDelay) ?? 250))
delay = useconds_t(1000 * (sharePrefs.integer(forKey: ShareKeys.slowMountDelay) ?? 250))
usleep(delay)
myLogger.logit(.debug, message: "Delaying next Mount by " + String(delay/1000) + " milliseconds since SlowMount is set.")

}

if sharePrefs?.bool(forKey: ShareKeys.finderMount) ?? false {
if sharePrefs.bool(forKey: ShareKeys.finderMount) {

myLogger.logit(.debug, message: "Mounting share via Finder")
_ = cliTask("/usr/bin/open \(all_shares[index].url.absoluteString)")
Expand Down Expand Up @@ -414,7 +414,7 @@ class ShareMounter {

var mountArray: Unmanaged<CFArray>? = nil

let myResult = NetFSMountURLSync(serverAddress as CFURL?, nil, nil, nil, openOptions as! CFMutableDictionary, mountOptions as! CFMutableDictionary, &mountArray)
let myResult = NetFSMountURLSync(serverAddress as CFURL?, nil, nil, nil, (openOptions as! CFMutableDictionary), (mountOptions as! CFMutableDictionary), &mountArray)
myLogger.logit(.debug, message: myResult.description)

if let mountPoint = mountArray!.takeRetainedValue() as? [String] {
Expand Down Expand Up @@ -444,8 +444,8 @@ class ShareMounter {
nil,
userPrincipal as CFString?,
nil,
openOptions as! CFMutableDictionary,
mountOptions as! CFMutableDictionary,
(openOptions as! CFMutableDictionary),
(mountOptions as! CFMutableDictionary),
&requestID,
queue)
{(stat:Int32, requestID:AsyncRequestID?, mountpoints:CFArray?) -> Void in
Expand Down
Loading

0 comments on commit 9c8d920

Please sign in to comment.