Abbiamo un problema con l'aggiornamento di uno strumento di supporto con SMJobBless che ci ha lasciato perplessi per giorni.Impossibile accedere all'elemento portachiavi dopo l'aggiornamento SMJobBless
stiamo sviluppando un'applicazione per cui ad un certo punto abbiamo bisogno di eseguire attività amministrative (carico/scarico di un kext). Stiamo anche utilizzando il portachiavi per archiviare le informazioni dell'account per la nostra applicazione.
Per le attività amministrative, utilizziamo uno strumento di supporto che viene installato utilizzando SMJobBless con cui comunichiamo tramite porte DO su Mach (con NSConnection).
Nello strumento di aiuto:
// use our bundle id as our service name
NSString* name = [[NSBundle mainBundle] bundleIdentifier];
launch_data_t checkinRequest = launch_data_new_string(LAUNCH_KEY_CHECKIN);
launch_data_t checkinResponse = launch_msg(checkinRequest);
launch_data_t machServicesDict = launch_data_dict_lookup(checkinResponse, LAUNCH_JOBKEY_MACHSERVICES);
launch_data_t machPort = launch_data_dict_lookup(machServicesDict, [name UTF8String]);
mach_port_t mp = launch_data_get_machport(machPort);
launch_data_free(checkinResponse);
launch_data_free(checkinRequest);
NSMachPort *receivePort = [[NSMachPort alloc] initWithMachPort:mp];
NSConnection *server = [NSConnection connectionWithReceivePort:receivePort sendPort:nil];
Nell'applicazione:
NSConnection *conn = [NSConnection connectionWithRegisteredName:HELPER_BUNDLE_IDENTIFIER host:nil];
id proxyServerObject = [conn rootProxy];
if(conn && proxyServerObject) {
return [proxyServerObject someMethod];
}
return NO;
Firmiamo sia l'applicazione e lo strumento di supporto utilizzando un certificato codesign da Thawte. Finora, tutto funziona come un fascino. Lo strumento di supporto è installato e possiamo comunicare con esso utilizzando DO; il nostro kext viene caricato e scaricato con successo.
Il problema inizia quando si tenta di aggiornare il nostro strumento di supporto. Utilizziamo il dizionario delle informazioni dello strumento installato e lo strumento in bundle nel nostro pacchetto di app per verificare se è necessario un aggiornamento dello strumento e chiamare nuovamente SMJobBless per eseguire l'aggiornamento.
Dopo la chiamata SMJobBless, le seguenti righe vengono visualizzati nella console:
6/19/12 10:31:24.000 AM kernel: CODE SIGNING: cs_invalid_page(0x104e17000): p=74362[OURAPP] clearing CS_VALID
6/19/12 10:31:24.000 AM kernel: CODE SIGNING: cs_invalid_page(0x10d0de000): p=74364[OURAPPHELPER] clearing CS_VALID
Dopo questo, l'applicazione è in grado di leggere la password applicazione dal nostro articolo portachiavi, la funzione SecKeychainItemCopyContent
rendimenti errSecAuthFailed (-25293)
. Tuttavia, non viene segnalato alcun errore se si verifica manualmente la firma del codice del nostro strumento helper o pacchetto applicativo installato utilizzando codesign -vvvv PATH_TO_TOOL_OR_BUNDLE
. Lo strumento e l'applicazione sono firmati all'esterno dell'ambiente Xcode e il contenuto non viene modificato dopo la procedura di firma.
Abbiamo trovato one other post che descrive una situazione simile, ma questa domanda è ancora senza risposta. Un problema correlato potrebbe essere SMJobBless returning error 4098.
Stiamo testando su OSX 10.7.4.
Chiunque ha affrontato problemi simili o c'è qualcosa di ovvio che stiamo sbagliando?
Attualmente sto riscontrando questo errore quando si tenta di aggiornare lo strumento di supporto su Yosemite (10.10).Sembra funzionare bene in El Capitan (10.11). Forse Apple ha risolto il bug? –