Domanda

E 'possibile sostituire la finestra di login di Mac OS X, /System/Library/CoreServices/loginwindow.app, con un'applicazione finestra di login personalizzato? ( Vedi il mio razionale per farlo .)

Ho paura mie capacità di programmazione Cocoa sono rudimentali. Trovo interessante il fatto che, quando ho eseguito la sonda CGSession (che è un programma di utilità non documentata che esegue cambio utente rapido) per vedere le funzioni che utilizza, facendo

nm -mg /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession

quello della funzione associata è:

(undefined [lazy bound]) external _CGSCreateLoginSession (from ApplicationServices)

Non ho trovato la documentazione sul quadro ApplicationServices. Ho il sospetto che sto ricevendo in profondità nel servizio Interfacce Provider invece di applicativi interfacce di programmazione.

Ho trovato questo davvero interessante frammento: ( google cache di ) ( link diretto alla pagina verso il basso ;. sembra che il sito è in fase di ri-organizzazione) da un'applicazione che pretende di passare alla finestra di accesso, anche se il cambio utente rapido è disabilitato

#include "CGSInternal.h"

int main (int argc, const char * argv[]) {
    // switch to the login window
    CGSCreateLoginSession(NULL);

    return 0;
}

Prendo CG significare CoreGraphics, e non si capisce cosa che ha a che fare con la registrazione in (se non con forse mettere un login dialogo fino oltre il lavoro dell'utente corrente).

Anche se non è possibile ottenere una sostituzione per la finestra di login, sarei interessato a sapere cosa si può fare in questo senso (da parte di persone che non lavorano per Apple).

È stato utile?

Soluzione

L'applicazione finestra di login viene definita come parte della configurazione di launchd in /System/Library/LaunchDaemons/com.apple.loginwindow.plist .

In teoria è possibile sostituire la finestra di login con il proprio, ma non so che cosa si deve fare nel nuovo app - Penso che la finestra di login fa un po 'più di autenticazione e impostare la sessione utente -> tra altri, sembra che il suo fare alcuni lavori relativi launchd.

Ho compilato un'applicazione che chiama CGSCreateLoginSession e una volta che lo si esegue le transizioni alla finestra di login tramite il cubo rotante. Immagino che questo è il motivo per cui richiede CoreGraphics - è solo una funzione grafica che richiama il logout al termine

.

Si potrebbe provare un InputManager e vedere la finestra di login carica il codice -> se lo fa, si potrebbe quindi modificare il loginwindow NIB ( LoginWindowUI.nib ) e aggiungere alcuni pulsanti per visualizzare una nuova finestra con il browser dell'utente. Una volta che lo studente sceglie una foto di lui / lei si potrebbe inserire automaticamente i campi username e password nel loginwindow.

Il nodo è tutta teoria, e sembra molto fragile e insicuro.

In bocca al lupo.

modifica Successivo

Si prega di notare questo è molto pericoloso in modo da utilizzare con attenzione - ho TUBO il mio sistema un paio di volte quando si cerca fuori questa roba

Ecco un'implementazione proof-of-concept che inietta codice nella loginwindow.

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <strings.h>
#include <syslog.h>

#import <Cocoa/Cocoa.h>

#include <execinfo.h>

@interface LLApp:NSApplication
@end
@implementation LLApp
- (void)run
{
    syslog(LOG_ERR, "LLApp being run");
    [super run];
}
@end

void my_openlog(const char *ident, int logopt, int facility);

typedef struct interpose_s 
{
        void * new_func;
        void * orig_func;
} interpose_t;

int MyNSApplicationMain(int argc,  const char ** argv);


static const interpose_t interposers[] __attribute__ ((section("__DATA, __interpose")))     = {
{ (void *) my_openlog, (void *) openlog },
};

void my_openlog(const char *ident, int logopt, int facility)
{
        openlog(ident, logopt, facility);

    if(!strcmp(ident, "/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow"))
    {

        [LLApp poseAsClass:[NSApplication class]];
    }
    else
    {
        syslog(LOG_ERR, "Ignoring unknown indent: >%s<", ident);
    }
    return;
}

Il codice compila con:

gcc -Wall -dynamiclib -undefined dynamic_lookup -o ~/Desktop/libinterposers.dylib testin.m -framework Cocoa

Codice di carico si basa sulla interponendo quindi la definizione di launchd loginwindow deve contenere una voce aggiuntiva (per consentire interponendo nel linker dinamico), cioè:.

<key>EnvironmentVariables</key>
<dict>    
    <key>DYLD_INSERT_LIBRARIES</key>
    <string>path_to/Desktop/libinterposers.dylib</string>
</dict>

Altri suggerimenti

Sì, è possibile utilizzare lo SFAuthorizationPluginView

qui il link di riferimento alla ADC

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top