Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cocoa Authorization in Swift

This is my first time writing in Swift, Cocoa (have experience in Cocoa Touch), and using Authorization, so I honestly have no idea if I am even on the right track. I am trying to make a modification to the hosts file, which requires user authentication, but both the AuthorizationCreate and AuthorizationExecuteWithPrivileges methods are giving errors.

var authorizationRef:AuthorizationRef
var status:OSStatus
status = AuthorizationCreate(nil, environment:kAuthorizationEmptyEnvironment, flags:kAuthorizationFlagDefaults, authorization:&authorizationRef)
let overwrite_hosts = "echo \(hostsContents) > /private/etc/hosts"
let args = [overwrite_hosts.cStringUsingEncoding(NSUTF8StringEncoding)]
status = AuthorizationExecuteWithPrivileges(authorizationRef, pathToTool:"/bin/sh", options:kAuthorizationFlagDefaults, arguments:args, communicationsPipe:nil)

Me calling AuthorizationCreate is throwing "Type '()' does not conform to protocol 'AuthorizationRef'" and my call of AuthorizationExecuteWithPrivileges is throwing "Could not find an overload for '__conversion' that accepts the supplied arguments"

Any ideas? Am I approaching this incorrectly?

Thanks for any help!

like image 561
Zachary Christopoulos Avatar asked Nov 11 '22 06:11

Zachary Christopoulos


1 Answers

I was able to figure out how to do it via AppleScript, but you should be able to do it using the Authorization method I was trying before, therefore leaving this question open. Anybody looking for a quick solution (no error checks implemented) you can use what I wrote below:

func doScriptWithAdmin(inScript:String) -> String{
    let script = "do shell script \"\(inScript)\" with administrator privileges"
    var appleScript = NSAppleScript(source: script)
    var eventResult = appleScript.executeAndReturnError(nil)
    if !eventResult {
        return "ERROR"
    }else{
        return eventResult.stringValue
    }
}
like image 76
Zachary Christopoulos Avatar answered Nov 15 '22 10:11

Zachary Christopoulos