charon-xpc: Remove prototypical macOS application
This has been deprecated for years. As there are several potential (security) issues, just remove the code.
This commit is contained in:
@@ -1,2 +0,0 @@
|
||||
xcuserdata
|
||||
*.xcworkspace
|
||||
@@ -1,107 +0,0 @@
|
||||
# strongSwan OS X App #
|
||||
|
||||
## Introduction ##
|
||||
|
||||
The strongSwan OS X App consists of two components:
|
||||
|
||||
* A frontend App to configure and control connections (under strongSwan)
|
||||
* A privileged helper daemon, controlled using XPC (under charon-xpc)
|
||||
|
||||
The privileged helper daemon gets installed automatically using SMJobBless
|
||||
functionality on its first use, and gets started automatically by Launchd when
|
||||
needed.
|
||||
|
||||
charon-xpc is a special build linking statically against strongSwan components.
|
||||
|
||||
charon-xpc and the App sources are currently not part of the official strongSwan
|
||||
distribution. Build the charon-xpc tarball with:
|
||||
|
||||
git archive -o osx-sources-$(grep AC_INIT configure.ac | \
|
||||
cut -d '[' -f3 | cut -d ']' -f1).tar.bz2 \
|
||||
HEAD src/frontends/osx
|
||||
|
||||
## Building strongSwan ##
|
||||
|
||||
Before building the Xcode project, the strongSwan base tree must be built using
|
||||
a monolithic and static build. This can be achieved on OS X by using:
|
||||
|
||||
CFLAGS="-O2 -g -Wall -Wno-format -Wno-pointer-sign -Wno-deprecated-declarations" \
|
||||
./configure --enable-monolithic --disable-shared --enable-static \
|
||||
--disable-defaults \
|
||||
--enable-openssl --enable-kernel-libipsec --enable-kernel-pfroute \
|
||||
--enable-eap-mschapv2 --enable-eap-identity --enable-eap-md5 \
|
||||
--enable-eap-gtc --enable-pkcs1 --enable-socket-default --enable-osx-attr \
|
||||
--enable-xauth-generic --enable-gcm --enable-ccm --enable-ctr \
|
||||
--enable-keychain --enable-nonce --enable-charon \
|
||||
--enable-ikev1 --enable-ikev2
|
||||
|
||||
followed by calling make (no need to make install).
|
||||
|
||||
Building charon-xpc using the Xcode project yields a single binary without
|
||||
any non OS X dependencies. The strongSwan target in the same project builds
|
||||
the App and integrates charon-xpc for the deployment.
|
||||
|
||||
Both charon-xpc and the App must be code-signed to allow the installation of
|
||||
the privileged helper. By default both targets use the _Developer ID: *_
|
||||
wildcard to use the first usable code signing identity. Both the App and
|
||||
charon-xpc require a hardcoded certificate subject under
|
||||
_strongSwan/strongSwan-Info.plist_ respectively
|
||||
_charon-xpc/charon-xpc-Info.plist_. Update the _org.strongswan.charon-xpc_
|
||||
_SMPrivilegedExecutables_ in the App and _SMAuthorizedClients_ in charon-xpc
|
||||
with your code signing certificate identity.
|
||||
|
||||
## XPC application protocol ##
|
||||
|
||||
charon-xpc provides a Mach service under the name _org.strongswan.charon-xpc_.
|
||||
Clients can connect to this service to control the daemon. All messages
|
||||
on all connections use the following string dictionary keys/values:
|
||||
|
||||
* _type_: XPC message type, currently either
|
||||
* _rpc_ for a remote procedure call, expects a response
|
||||
* _event_ for application specific event messages
|
||||
* _rpc_: defines the name of the RPC function to call (for _type_ = _rpc_)
|
||||
* _event_: defines a name for the event (for _type_ = _event_)
|
||||
|
||||
Additional arguments and return values are specified by the call and can have
|
||||
any type. Keys are directly attached to the message dictionary.
|
||||
|
||||
On the Mach service connection, the following RPC messages are currently
|
||||
defined:
|
||||
|
||||
* string version = get_version()
|
||||
* _version_: strongSwan version of charon-xpc
|
||||
* bool success = start_connection(string name, string host, string id,
|
||||
endpoint channel)
|
||||
* _success_: TRUE if initiation started successfully
|
||||
* _name_: connection name to initiate
|
||||
* _host_: server hostname (and identity)
|
||||
* _id_: client identity to use
|
||||
* _channel_: XPC endpoint for this connection
|
||||
|
||||
The start_connection() RPC returns just after the initiation of the call and
|
||||
does not wait for the connection to establish. Nonetheless does it have a
|
||||
return value to indicate if connection initiation could be triggered.
|
||||
|
||||
The App passes an (anonymous) XPC endpoint to start_connection(). If the call
|
||||
succeeds, charon-xpc connects to this endpoint to establish a channel used for
|
||||
this specific IKE connection.
|
||||
|
||||
On this channel, the following RPC calls are currently defined from charon-xpc
|
||||
to the App:
|
||||
|
||||
* string password = get_password(string username)
|
||||
* _password_: user password returned
|
||||
* _username_: username to query a password for
|
||||
|
||||
And the following from the App to charon-xpc:
|
||||
|
||||
* bool success = stop_connection()
|
||||
* _success_: TRUE if termination of connection initiated
|
||||
|
||||
The following events are currently defined from charon-xpc to the App:
|
||||
|
||||
* up(): IKE_SA has been established
|
||||
* down(): IKE_SA has been closed or failed to establish
|
||||
* child_up(string local_ts, string remote_ts): CHILD_SA has been established
|
||||
* child_down(string local_ts, string remote_ts): CHILD_SA has been closed
|
||||
* log(string message): debug log message for this connection
|
||||
@@ -1,18 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>org.strongswan.charon-xpc</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>charon-xpc</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>SMAuthorizedClients</key>
|
||||
<array>
|
||||
<string>identifier org.strongswan.osx and certificate leaf[subject.CN] = "Developer ID Application: revosec AG (SRXT3TB2PY)"</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,13 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>org.strongswan.charon-xpc</string>
|
||||
<key>MachServices</key>
|
||||
<dict>
|
||||
<key>org.strongswan.charon-xpc</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,227 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <pthread.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <library.h>
|
||||
#include <daemon.h>
|
||||
#include <threading/thread.h>
|
||||
#include <utils/backtrace.h>
|
||||
|
||||
#include "xpc_dispatch.h"
|
||||
|
||||
/**
|
||||
* XPC dispatcher class
|
||||
*/
|
||||
static xpc_dispatch_t *dispatcher;
|
||||
|
||||
/**
|
||||
* atexit() cleanup for dispatcher
|
||||
*/
|
||||
void dispatcher_cleanup()
|
||||
{
|
||||
DESTROY_IF(dispatcher);
|
||||
}
|
||||
|
||||
/**
|
||||
* hook in library for debugging messages
|
||||
*/
|
||||
extern void (*dbg) (debug_t group, level_t level, char *fmt, ...);
|
||||
|
||||
/**
|
||||
* Logging hook for library logs, using stderr output
|
||||
*/
|
||||
static void dbg_stderr(debug_t group, level_t level, char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
if (level <= 1)
|
||||
{
|
||||
va_start(args, fmt);
|
||||
fprintf(stderr, "00[%N] ", debug_names, group);
|
||||
vfprintf(stderr, fmt, args);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(args);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the daemon and handle unix signals
|
||||
*/
|
||||
static int run()
|
||||
{
|
||||
sigset_t set;
|
||||
|
||||
sigemptyset(&set);
|
||||
sigaddset(&set, SIGINT);
|
||||
sigaddset(&set, SIGTERM);
|
||||
sigprocmask(SIG_BLOCK, &set, NULL);
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
int sig;
|
||||
|
||||
sig = sigwaitinfo(&set, NULL);
|
||||
if (sig == -1)
|
||||
{
|
||||
if (errno == EINTR)
|
||||
{ /* ignore signals we didn't wait for */
|
||||
continue;
|
||||
}
|
||||
DBG1(DBG_DMN, "waiting for signal failed: %s", strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
switch (sig)
|
||||
{
|
||||
case SIGINT:
|
||||
case SIGTERM:
|
||||
DBG1(DBG_DMN, "%s received, shutting down",
|
||||
sig == SIGINT ? "SIGINT" : "SIGTERM");
|
||||
charon->bus->alert(charon->bus, ALERT_SHUTDOWN_SIGNAL, sig);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle SIGSEGV/SIGILL signals raised by threads
|
||||
*/
|
||||
static void segv_handler(int signal)
|
||||
{
|
||||
backtrace_t *backtrace;
|
||||
|
||||
DBG1(DBG_DMN, "thread %u received %d", thread_current_id(), signal);
|
||||
backtrace = backtrace_create(2);
|
||||
backtrace->log(backtrace, NULL, TRUE);
|
||||
backtrace->destroy(backtrace);
|
||||
|
||||
DBG1(DBG_DMN, "killing ourself, received critical signal");
|
||||
abort();
|
||||
}
|
||||
|
||||
/**
|
||||
* PF_ROUTE for some reason does not send an event for the first address
|
||||
* installed after a fresh boot. Fix this by installing a fake tun address
|
||||
* just to remove it afterwards.
|
||||
*/
|
||||
static void fixup_pf_route()
|
||||
{
|
||||
tun_device_t *tun;
|
||||
host_t *host;
|
||||
|
||||
tun = tun_device_create(NULL);
|
||||
if (tun)
|
||||
{
|
||||
if (tun->up(tun))
|
||||
{
|
||||
host = host_create_from_string("127.0.0.99", 0);
|
||||
tun->set_address(tun, host, 32);
|
||||
host->destroy(host);
|
||||
}
|
||||
tun->destroy(tun);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Main function, starts the daemon.
|
||||
*/
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct sigaction action;
|
||||
struct utsname utsname;
|
||||
level_t levels[DBG_MAX];
|
||||
int group;
|
||||
|
||||
dbg = dbg_stderr;
|
||||
atexit(library_deinit);
|
||||
if (!library_init(NULL, "charon-xpc"))
|
||||
{
|
||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||
}
|
||||
if (lib->integrity)
|
||||
{
|
||||
if (!lib->integrity->check_file(lib->integrity, "charon-xpc", argv[0]))
|
||||
{
|
||||
exit(SS_RC_DAEMON_INTEGRITY);
|
||||
}
|
||||
}
|
||||
atexit(libcharon_deinit);
|
||||
if (!libcharon_init())
|
||||
{
|
||||
exit(SS_RC_INITIALIZATION_FAILED);
|
||||
}
|
||||
for (group = 0; group < DBG_MAX; group++)
|
||||
{
|
||||
levels[group] = LEVEL_CTRL;
|
||||
}
|
||||
charon->set_default_loggers(charon, levels, TRUE);
|
||||
charon->load_loggers(charon);
|
||||
|
||||
lib->settings->set_default_str(lib->settings, "charon-xpc.port", "0");
|
||||
lib->settings->set_default_str(lib->settings, "charon-xpc.port_nat_t", "0");
|
||||
lib->settings->set_default_str(lib->settings,
|
||||
"charon-xpc.close_ike_on_child_failure", "yes");
|
||||
lib->settings->set_default_str(lib->settings,
|
||||
"charon-xpc.plugins.osx-attr.append", "no");
|
||||
if (!charon->initialize(charon,
|
||||
lib->settings->get_str(lib->settings, "charon-xpc.load",
|
||||
"nonce pkcs1 openssl keychain ctr ccm gcm kernel-libipsec "
|
||||
"kernel-pfroute socket-default eap-identity eap-mschapv2 "
|
||||
"eap-md5 xauth-generic osx-attr")))
|
||||
{
|
||||
exit(SS_RC_INITIALIZATION_FAILED);
|
||||
}
|
||||
|
||||
if (uname(&utsname) != 0)
|
||||
{
|
||||
memset(&utsname, 0, sizeof(utsname));
|
||||
}
|
||||
DBG1(DBG_DMN, "Starting charon-xpc IKE daemon (strongSwan %s, %s %s, %s)",
|
||||
VERSION, utsname.sysname, utsname.release, utsname.machine);
|
||||
|
||||
/* add handler for SEGV and ILL,
|
||||
* INT, TERM and HUP are handled by sigwaitinfo() in run() */
|
||||
action.sa_handler = segv_handler;
|
||||
action.sa_flags = 0;
|
||||
sigemptyset(&action.sa_mask);
|
||||
sigaddset(&action.sa_mask, SIGINT);
|
||||
sigaddset(&action.sa_mask, SIGTERM);
|
||||
sigaddset(&action.sa_mask, SIGHUP);
|
||||
sigaction(SIGSEGV, &action, NULL);
|
||||
sigaction(SIGILL, &action, NULL);
|
||||
sigaction(SIGBUS, &action, NULL);
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &action, NULL);
|
||||
|
||||
pthread_sigmask(SIG_SETMASK, &action.sa_mask, NULL);
|
||||
|
||||
dispatcher = xpc_dispatch_create();
|
||||
if (!dispatcher)
|
||||
{
|
||||
exit(SS_RC_INITIALIZATION_FAILED);
|
||||
}
|
||||
atexit(dispatcher_cleanup);
|
||||
|
||||
charon->start(charon);
|
||||
fixup_pf_route();
|
||||
return run();
|
||||
}
|
||||
@@ -1,546 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include "xpc_channels.h"
|
||||
#include "xpc_logger.h"
|
||||
|
||||
#include <credentials/sets/callback_cred.h>
|
||||
#include <collections/hashtable.h>
|
||||
#include <threading/rwlock.h>
|
||||
#include <daemon.h>
|
||||
|
||||
typedef struct private_xpc_channels_t private_xpc_channels_t;
|
||||
|
||||
/**
|
||||
* Private data of an xpc_channels_t object.
|
||||
*/
|
||||
struct private_xpc_channels_t {
|
||||
|
||||
/**
|
||||
* Public xpc_channels_t interface.
|
||||
*/
|
||||
xpc_channels_t public;
|
||||
|
||||
/**
|
||||
* Registered channels, IKE_SA unique ID => entry_t
|
||||
*/
|
||||
hashtable_t *channels;
|
||||
|
||||
/**
|
||||
* Lock for channels list
|
||||
*/
|
||||
rwlock_t *lock;
|
||||
|
||||
/**
|
||||
* Callback credential set for passwords
|
||||
*/
|
||||
callback_cred_t *creds;
|
||||
};
|
||||
|
||||
/**
|
||||
* Channel entry
|
||||
*/
|
||||
typedef struct {
|
||||
/* XPC channel to App */
|
||||
xpc_connection_t conn;
|
||||
/* associated IKE_SA unique identifier */
|
||||
uintptr_t sa;
|
||||
/* did we already ask for a password? */
|
||||
bool passworded;
|
||||
/* channel specific logger */
|
||||
xpc_logger_t *logger;
|
||||
} entry_t;
|
||||
|
||||
/**
|
||||
* Clean up an entry, canceling connection
|
||||
*/
|
||||
static void destroy_entry(entry_t *entry)
|
||||
{
|
||||
charon->bus->remove_logger(charon->bus, &entry->logger->logger);
|
||||
entry->logger->destroy(entry->logger);
|
||||
xpc_connection_suspend(entry->conn);
|
||||
xpc_release(entry->conn);
|
||||
free(entry);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find an IKE_SA unique identifier by a given XPC channel
|
||||
*/
|
||||
static uint32_t find_ike_sa_by_conn(private_xpc_channels_t *this,
|
||||
xpc_connection_t conn)
|
||||
{
|
||||
enumerator_t *enumerator;
|
||||
entry_t *entry;
|
||||
uint32_t ike_sa = 0;
|
||||
|
||||
this->lock->read_lock(this->lock);
|
||||
enumerator = this->channels->create_enumerator(this->channels);
|
||||
while (enumerator->enumerate(enumerator, NULL, &entry))
|
||||
{
|
||||
if (entry->conn == conn)
|
||||
{
|
||||
ike_sa = entry->sa;
|
||||
break;
|
||||
}
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
this->lock->unlock(this->lock);
|
||||
|
||||
return ike_sa;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an entry for a given XPC connection
|
||||
*/
|
||||
static void remove_conn(private_xpc_channels_t *this, xpc_connection_t conn)
|
||||
{
|
||||
uintptr_t ike_sa;
|
||||
entry_t *entry;
|
||||
|
||||
ike_sa = find_ike_sa_by_conn(this, conn);
|
||||
if (ike_sa)
|
||||
{
|
||||
this->lock->write_lock(this->lock);
|
||||
entry = this->channels->remove(this->channels, (void*)ike_sa);
|
||||
this->lock->unlock(this->lock);
|
||||
|
||||
if (entry)
|
||||
{
|
||||
destroy_entry(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Trigger termination of a connection
|
||||
*/
|
||||
static void stop_connection(private_xpc_channels_t *this, uint32_t ike_sa,
|
||||
xpc_object_t request, xpc_object_t reply)
|
||||
{
|
||||
status_t status;
|
||||
|
||||
status = charon->controller->terminate_ike(charon->controller, ike_sa, FALSE,
|
||||
NULL, NULL, 0, 0);
|
||||
xpc_dictionary_set_bool(reply, "success", status != NOT_FOUND);
|
||||
}
|
||||
|
||||
/**
|
||||
* XPC RPC command dispatch table
|
||||
*/
|
||||
static struct {
|
||||
char *name;
|
||||
void (*handler)(private_xpc_channels_t *this, uint32_t ike_sa,
|
||||
xpc_object_t request, xpc_object_t reply);
|
||||
} commands[] = {
|
||||
{ "stop_connection", stop_connection },
|
||||
};
|
||||
|
||||
/**
|
||||
* Handle a request message from App
|
||||
*/
|
||||
static void handle(private_xpc_channels_t *this, xpc_connection_t conn,
|
||||
xpc_object_t request)
|
||||
{
|
||||
xpc_object_t reply;
|
||||
const char *type, *rpc;
|
||||
bool found = FALSE;
|
||||
uint32_t ike_sa;
|
||||
int i;
|
||||
|
||||
type = xpc_dictionary_get_string(request, "type");
|
||||
if (type)
|
||||
{
|
||||
if (streq(type, "rpc"))
|
||||
{
|
||||
reply = xpc_dictionary_create_reply(request);
|
||||
rpc = xpc_dictionary_get_string(request, "rpc");
|
||||
ike_sa = find_ike_sa_by_conn(this, conn);
|
||||
if (reply && rpc && ike_sa)
|
||||
{
|
||||
for (i = 0; i < countof(commands); i++)
|
||||
{
|
||||
if (streq(commands[i].name, rpc))
|
||||
{
|
||||
found = TRUE;
|
||||
commands[i].handler(this, ike_sa, request, reply);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
DBG1(DBG_CFG, "received invalid XPC rpc command: %s", rpc);
|
||||
}
|
||||
if (reply)
|
||||
{
|
||||
xpc_connection_send_message(conn, reply);
|
||||
xpc_release(reply);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG1(DBG_CFG, "received unknown XPC message type: %s", type);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG1(DBG_CFG, "received XPC message without a type");
|
||||
}
|
||||
}
|
||||
|
||||
METHOD(xpc_channels_t, add, void,
|
||||
private_xpc_channels_t *this, xpc_connection_t conn, uint32_t ike_sa)
|
||||
{
|
||||
entry_t *entry;
|
||||
|
||||
INIT(entry,
|
||||
.conn = conn,
|
||||
.sa = ike_sa,
|
||||
.logger = xpc_logger_create(conn),
|
||||
);
|
||||
|
||||
xpc_retain(entry->conn);
|
||||
xpc_connection_set_event_handler(entry->conn, ^(xpc_object_t event)
|
||||
{
|
||||
if (event == XPC_ERROR_CONNECTION_INVALID ||
|
||||
event == XPC_ERROR_CONNECTION_INTERRUPTED)
|
||||
{
|
||||
remove_conn(this, conn);
|
||||
}
|
||||
else if (xpc_get_type(event) == XPC_TYPE_DICTIONARY)
|
||||
{
|
||||
handle(this, conn, event);
|
||||
}
|
||||
});
|
||||
|
||||
entry->logger->set_ike_sa(entry->logger, entry->sa);
|
||||
charon->bus->add_logger(charon->bus, &entry->logger->logger);
|
||||
|
||||
this->lock->write_lock(this->lock);
|
||||
this->channels->put(this->channels, (void*)entry->sa, entry);
|
||||
this->lock->unlock(this->lock);
|
||||
|
||||
xpc_connection_resume(conn);
|
||||
}
|
||||
|
||||
METHOD(listener_t, alert, bool,
|
||||
private_xpc_channels_t *this, ike_sa_t *ike_sa, alert_t alert, va_list args)
|
||||
{
|
||||
const char *desc;
|
||||
|
||||
switch (alert)
|
||||
{
|
||||
case ALERT_LOCAL_AUTH_FAILED:
|
||||
desc = "local-auth";
|
||||
break;
|
||||
case ALERT_PEER_AUTH_FAILED:
|
||||
desc = "remote-auth";
|
||||
break;
|
||||
case ALERT_PEER_ADDR_FAILED:
|
||||
desc = "dns";
|
||||
break;
|
||||
case ALERT_PEER_INIT_UNREACHABLE:
|
||||
desc = "unreachable";
|
||||
break;
|
||||
case ALERT_RETRANSMIT_SEND_TIMEOUT:
|
||||
desc = "timeout";
|
||||
break;
|
||||
case ALERT_PROPOSAL_MISMATCH_IKE:
|
||||
case ALERT_PROPOSAL_MISMATCH_CHILD:
|
||||
desc = "proposal-mismatch";
|
||||
break;
|
||||
case ALERT_TS_MISMATCH:
|
||||
desc = "ts-mismatch";
|
||||
break;
|
||||
default:
|
||||
return TRUE;
|
||||
}
|
||||
if (ike_sa)
|
||||
{
|
||||
entry_t *entry;
|
||||
uintptr_t sa;
|
||||
|
||||
sa = ike_sa->get_unique_id(ike_sa);
|
||||
this->lock->read_lock(this->lock);
|
||||
entry = this->channels->get(this->channels, (void*)sa);
|
||||
if (entry)
|
||||
{
|
||||
xpc_object_t msg;
|
||||
|
||||
msg = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(msg, "type", "event");
|
||||
xpc_dictionary_set_string(msg, "event", "alert");
|
||||
xpc_dictionary_set_string(msg, "alert", desc);
|
||||
xpc_connection_send_message(entry->conn, msg);
|
||||
xpc_release(msg);
|
||||
}
|
||||
this->lock->unlock(this->lock);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
METHOD(listener_t, ike_rekey, bool,
|
||||
private_xpc_channels_t *this, ike_sa_t *old, ike_sa_t *new)
|
||||
{
|
||||
entry_t *entry;
|
||||
uintptr_t sa;
|
||||
|
||||
sa = old->get_unique_id(old);
|
||||
this->lock->write_lock(this->lock);
|
||||
entry = this->channels->remove(this->channels, (void*)sa);
|
||||
if (entry)
|
||||
{
|
||||
entry->sa = new->get_unique_id(new);
|
||||
entry->logger->set_ike_sa(entry->logger, entry->sa);
|
||||
this->channels->put(this->channels, (void*)entry->sa, entry);
|
||||
}
|
||||
this->lock->unlock(this->lock);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
METHOD(listener_t, ike_state_change, bool,
|
||||
private_xpc_channels_t *this, ike_sa_t *ike_sa, ike_sa_state_t state)
|
||||
{
|
||||
if (state == IKE_CONNECTING)
|
||||
{
|
||||
entry_t *entry;
|
||||
uintptr_t sa;
|
||||
|
||||
sa = ike_sa->get_unique_id(ike_sa);
|
||||
this->lock->read_lock(this->lock);
|
||||
entry = this->channels->get(this->channels, (void*)sa);
|
||||
if (entry)
|
||||
{
|
||||
xpc_object_t msg;
|
||||
|
||||
msg = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(msg, "type", "event");
|
||||
xpc_dictionary_set_string(msg, "event", "connecting");
|
||||
xpc_connection_send_message(entry->conn, msg);
|
||||
xpc_release(msg);
|
||||
}
|
||||
this->lock->unlock(this->lock);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
METHOD(listener_t, child_updown, bool,
|
||||
private_xpc_channels_t *this, ike_sa_t *ike_sa,
|
||||
child_sa_t *child_sa, bool up)
|
||||
{
|
||||
entry_t *entry;
|
||||
uintptr_t sa;
|
||||
|
||||
sa = ike_sa->get_unique_id(ike_sa);
|
||||
this->lock->read_lock(this->lock);
|
||||
entry = this->channels->get(this->channels, (void*)sa);
|
||||
if (entry)
|
||||
{
|
||||
xpc_object_t msg;
|
||||
linked_list_t *list;
|
||||
char buf[256];
|
||||
|
||||
msg = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(msg, "type", "event");
|
||||
if (up)
|
||||
{
|
||||
xpc_dictionary_set_string(msg, "event", "child_up");
|
||||
}
|
||||
else
|
||||
{
|
||||
xpc_dictionary_set_string(msg, "event", "child_down");
|
||||
}
|
||||
|
||||
list = linked_list_create_from_enumerator(
|
||||
child_sa->create_ts_enumerator(child_sa, TRUE));
|
||||
snprintf(buf, sizeof(buf), "%#R", list);
|
||||
list->destroy(list);
|
||||
xpc_dictionary_set_string(msg, "ts_local", buf);
|
||||
|
||||
list = linked_list_create_from_enumerator(
|
||||
child_sa->create_ts_enumerator(child_sa, FALSE));
|
||||
snprintf(buf, sizeof(buf), "%#R", list);
|
||||
list->destroy(list);
|
||||
xpc_dictionary_set_string(msg, "ts_remote", buf);
|
||||
|
||||
xpc_connection_send_message(entry->conn, msg);
|
||||
xpc_release(msg);
|
||||
}
|
||||
this->lock->unlock(this->lock);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
METHOD(listener_t, ike_updown, bool,
|
||||
private_xpc_channels_t *this, ike_sa_t *ike_sa, bool up)
|
||||
{
|
||||
xpc_object_t msg;
|
||||
entry_t *entry;
|
||||
uintptr_t sa;
|
||||
|
||||
sa = ike_sa->get_unique_id(ike_sa);
|
||||
if (up)
|
||||
{
|
||||
this->lock->read_lock(this->lock);
|
||||
entry = this->channels->get(this->channels, (void*)sa);
|
||||
if (entry)
|
||||
{
|
||||
msg = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(msg, "type", "event");
|
||||
xpc_dictionary_set_string(msg, "event", "up");
|
||||
xpc_connection_send_message(entry->conn, msg);
|
||||
xpc_release(msg);
|
||||
}
|
||||
this->lock->unlock(this->lock);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->lock->write_lock(this->lock);
|
||||
entry = this->channels->remove(this->channels, (void*)sa);
|
||||
this->lock->unlock(this->lock);
|
||||
if (entry)
|
||||
{
|
||||
msg = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(msg, "type", "event");
|
||||
xpc_dictionary_set_string(msg, "event", "down");
|
||||
xpc_connection_send_message(entry->conn, msg);
|
||||
xpc_release(msg);
|
||||
xpc_connection_send_barrier(entry->conn, ^() {
|
||||
destroy_entry(entry);
|
||||
});
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Query password from App using XPC channel
|
||||
*/
|
||||
static shared_key_t *query_password(xpc_connection_t conn, identification_t *id)
|
||||
{
|
||||
char buf[128], *password;
|
||||
xpc_object_t request, response;
|
||||
shared_key_t *shared = NULL;
|
||||
|
||||
request = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(request, "type", "rpc");
|
||||
xpc_dictionary_set_string(request, "rpc", "get_password");
|
||||
snprintf(buf, sizeof(buf), "%Y", id);
|
||||
xpc_dictionary_set_string(request, "username", buf);
|
||||
|
||||
response = xpc_connection_send_message_with_reply_sync(conn, request);
|
||||
xpc_release(request);
|
||||
if (xpc_get_type(response) == XPC_TYPE_DICTIONARY)
|
||||
{
|
||||
password = (char*)xpc_dictionary_get_string(response, "password");
|
||||
if (password)
|
||||
{
|
||||
shared = shared_key_create(SHARED_EAP,
|
||||
chunk_clone(chunk_from_str(password)));
|
||||
}
|
||||
}
|
||||
xpc_release(response);
|
||||
return shared;
|
||||
}
|
||||
|
||||
/**
|
||||
* Password query callback
|
||||
*/
|
||||
static shared_key_t* password_cb(private_xpc_channels_t *this,
|
||||
shared_key_type_t type,
|
||||
identification_t *me, identification_t *other,
|
||||
id_match_t *match_me, id_match_t *match_other)
|
||||
{
|
||||
shared_key_t *shared = NULL;
|
||||
ike_sa_t *ike_sa;
|
||||
entry_t *entry;
|
||||
uint32_t sa;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case SHARED_EAP:
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
ike_sa = charon->bus->get_sa(charon->bus);
|
||||
if (ike_sa)
|
||||
{
|
||||
sa = ike_sa->get_unique_id(ike_sa);
|
||||
this->lock->read_lock(this->lock);
|
||||
entry = this->channels->get(this->channels, (void*)(uintptr_t)sa);
|
||||
if (entry && !entry->passworded)
|
||||
{
|
||||
entry->passworded = TRUE;
|
||||
|
||||
shared = query_password(entry->conn, me);
|
||||
if (shared)
|
||||
{
|
||||
if (match_me)
|
||||
{
|
||||
*match_me = ID_MATCH_PERFECT;
|
||||
}
|
||||
if (match_other)
|
||||
{
|
||||
*match_other = ID_MATCH_PERFECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
this->lock->unlock(this->lock);
|
||||
}
|
||||
return shared;
|
||||
}
|
||||
|
||||
METHOD(xpc_channels_t, destroy, void,
|
||||
private_xpc_channels_t *this)
|
||||
{
|
||||
lib->credmgr->remove_set(lib->credmgr, &this->creds->set);
|
||||
this->creds->destroy(this->creds);
|
||||
this->channels->destroy(this->channels);
|
||||
this->lock->destroy(this->lock);
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* See header
|
||||
*/
|
||||
xpc_channels_t *xpc_channels_create()
|
||||
{
|
||||
private_xpc_channels_t *this;
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.listener = {
|
||||
.alert = _alert,
|
||||
.ike_updown = _ike_updown,
|
||||
.ike_rekey = _ike_rekey,
|
||||
.ike_state_change = _ike_state_change,
|
||||
.child_updown = _child_updown,
|
||||
},
|
||||
.add = _add,
|
||||
.destroy = _destroy,
|
||||
},
|
||||
.channels = hashtable_create(hashtable_hash_ptr,
|
||||
hashtable_equals_ptr, 4),
|
||||
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
|
||||
);
|
||||
|
||||
this->creds = callback_cred_create_shared(
|
||||
(callback_cred_shared_cb_t)password_cb, this);
|
||||
lib->credmgr->add_set(lib->credmgr, &this->creds->set);
|
||||
|
||||
return &this->public;
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup xpc charon-xpc
|
||||
*
|
||||
* @defgroup xpc_channels xpc_channels
|
||||
* @{ @ingroup xpc
|
||||
*/
|
||||
|
||||
#ifndef XPC_CHANNELS_H_
|
||||
#define XPC_CHANNELS_H_
|
||||
|
||||
#include <xpc/xpc.h>
|
||||
|
||||
#include <bus/bus.h>
|
||||
|
||||
typedef struct xpc_channels_t xpc_channels_t;
|
||||
|
||||
/**
|
||||
* XPC to App channel management.
|
||||
*/
|
||||
struct xpc_channels_t {
|
||||
|
||||
/**
|
||||
* Implements listener_t.
|
||||
*/
|
||||
listener_t listener;
|
||||
|
||||
/**
|
||||
* Associate an IKE_SA unique identifier to an XPC connection.
|
||||
*
|
||||
* @param conn XPC connection to channel
|
||||
* @param ike_sa IKE_SA unique identifier to associate to connection
|
||||
*/
|
||||
void (*add)(xpc_channels_t *this, xpc_connection_t conn, uint32_t ike_sa);
|
||||
|
||||
/**
|
||||
* Destroy a xpc_channels_t.
|
||||
*/
|
||||
void (*destroy)(xpc_channels_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a xpc_channels instance.
|
||||
*/
|
||||
xpc_channels_t *xpc_channels_create();
|
||||
|
||||
#endif /** XPC_CHANNELS_H_ @}*/
|
||||
@@ -1,362 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include "xpc_dispatch.h"
|
||||
#include "xpc_channels.h"
|
||||
|
||||
#include <xpc/xpc.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <daemon.h>
|
||||
#include <processing/jobs/callback_job.h>
|
||||
|
||||
typedef struct private_xpc_dispatch_t private_xpc_dispatch_t;
|
||||
|
||||
/**
|
||||
* Private data of an xpc_dispatch_t object.
|
||||
*/
|
||||
struct private_xpc_dispatch_t {
|
||||
|
||||
/**
|
||||
* Public xpc_dispatch_t interface.
|
||||
*/
|
||||
xpc_dispatch_t public;
|
||||
|
||||
/**
|
||||
* XPC service we offer
|
||||
*/
|
||||
xpc_connection_t service;
|
||||
|
||||
/**
|
||||
* XPC IKE_SA specific channels to App
|
||||
*/
|
||||
xpc_channels_t *channels;
|
||||
|
||||
/**
|
||||
* GCD queue for XPC events
|
||||
*/
|
||||
dispatch_queue_t queue;
|
||||
|
||||
/**
|
||||
* Number of active App connections
|
||||
*/
|
||||
refcount_t refcount;
|
||||
|
||||
/**
|
||||
* PID of main thread
|
||||
*/
|
||||
pid_t pid;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return version of this helper
|
||||
*/
|
||||
static void get_version(private_xpc_dispatch_t *this,
|
||||
xpc_object_t request, xpc_object_t reply)
|
||||
{
|
||||
xpc_dictionary_set_string(reply, "version", PACKAGE_VERSION);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create peer config with associated ike config
|
||||
*/
|
||||
static peer_cfg_t* create_peer_cfg(char *name, char *host)
|
||||
{
|
||||
ike_cfg_t *ike_cfg;
|
||||
peer_cfg_t *peer_cfg;
|
||||
uint16_t local_port, remote_port = IKEV2_UDP_PORT;
|
||||
ike_cfg_create_t ike = {
|
||||
.version = IKEV2,
|
||||
.local = "0.0.0.0",
|
||||
.remote = host,
|
||||
.remote_port = IKEV2_UDP_PORT,
|
||||
.no_certreq = TRUE,
|
||||
.fragmentation = FRAGMENTATION_YES,
|
||||
};
|
||||
peer_cfg_create_t peer = {
|
||||
.cert_policy = CERT_SEND_IF_ASKED,
|
||||
.unique = UNIQUE_REPLACE,
|
||||
.keyingtries = 1,
|
||||
.rekey_time = 36000, /* 10h */
|
||||
.jitter_time = 600, /* 10min */
|
||||
.over_time = 600, /* 10min */
|
||||
.dpd = 30,
|
||||
};
|
||||
|
||||
ike.local_port = charon->socket->get_port(charon->socket, FALSE);
|
||||
if (ike.local_port != IKEV2_UDP_PORT)
|
||||
{
|
||||
ike.remote_port = IKEV2_NATT_PORT;
|
||||
}
|
||||
ike_cfg = ike_cfg_create(&ike);
|
||||
ike_cfg->add_proposal(ike_cfg, proposal_create_default(PROTO_IKE));
|
||||
ike_cfg->add_proposal(ike_cfg, proposal_create_default_aead(PROTO_IKE));
|
||||
peer_cfg = peer_cfg_create(name, ike_cfg, &peer);
|
||||
peer_cfg->add_virtual_ip(peer_cfg, host_create_from_string("0.0.0.0", 0));
|
||||
|
||||
return peer_cfg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a single auth cfg of given class to peer cfg
|
||||
*/
|
||||
static void add_auth_cfg(peer_cfg_t *peer_cfg, bool local,
|
||||
char *id, auth_class_t class)
|
||||
{
|
||||
auth_cfg_t *auth;
|
||||
|
||||
auth = auth_cfg_create();
|
||||
auth->add(auth, AUTH_RULE_AUTH_CLASS, class);
|
||||
auth->add(auth, AUTH_RULE_IDENTITY, identification_create_from_string(id));
|
||||
if (!local)
|
||||
{
|
||||
auth->add(auth, AUTH_RULE_IDENTITY_LOOSE, TRUE);
|
||||
}
|
||||
peer_cfg->add_auth_cfg(peer_cfg, auth, local);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attach child config to peer config
|
||||
*/
|
||||
static child_cfg_t* create_child_cfg(char *name)
|
||||
{
|
||||
child_cfg_t *child_cfg;
|
||||
traffic_selector_t *ts;
|
||||
child_cfg_create_t child = {
|
||||
.lifetime = {
|
||||
.time = {
|
||||
.life = 10800 /* 3h */,
|
||||
.rekey = 10200 /* 2h50min */,
|
||||
.jitter = 300 /* 5min */
|
||||
},
|
||||
},
|
||||
.mode = MODE_TUNNEL,
|
||||
};
|
||||
|
||||
child_cfg = child_cfg_create(name, &child);
|
||||
child_cfg->add_proposal(child_cfg, proposal_create_from_string(PROTO_ESP,
|
||||
"aes128gcm8-aes128gcm12-aes128gcm16-"
|
||||
"aes256gcm8-aes256gcm12-aes256gcm16"));
|
||||
child_cfg->add_proposal(child_cfg, proposal_create_default_aead(PROTO_ESP));
|
||||
child_cfg->add_proposal(child_cfg, proposal_create_default(PROTO_ESP));
|
||||
ts = traffic_selector_create_dynamic(0, 0, 65535);
|
||||
child_cfg->add_traffic_selector(child_cfg, TRUE, ts);
|
||||
ts = traffic_selector_create_from_string(0, TS_IPV4_ADDR_RANGE,
|
||||
"0.0.0.0", 0, "255.255.255.255", 65535);
|
||||
child_cfg->add_traffic_selector(child_cfg, FALSE, ts);
|
||||
|
||||
return child_cfg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Controller initiate callback
|
||||
*/
|
||||
static bool initiate_cb(uint32_t *sa, debug_t group, level_t level,
|
||||
ike_sa_t *ike_sa, const char *message)
|
||||
{
|
||||
if (ike_sa)
|
||||
{
|
||||
*sa = ike_sa->get_unique_id(ike_sa);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start initiating an IKE connection
|
||||
*/
|
||||
void start_connection(private_xpc_dispatch_t *this,
|
||||
xpc_object_t request, xpc_object_t reply)
|
||||
{
|
||||
peer_cfg_t *peer_cfg;
|
||||
child_cfg_t *child_cfg;
|
||||
char *name, *id, *host;
|
||||
bool success = FALSE;
|
||||
xpc_endpoint_t endpoint;
|
||||
xpc_connection_t channel;
|
||||
uint32_t ike_sa;
|
||||
|
||||
name = (char*)xpc_dictionary_get_string(request, "name");
|
||||
host = (char*)xpc_dictionary_get_string(request, "host");
|
||||
id = (char*)xpc_dictionary_get_string(request, "id");
|
||||
endpoint = xpc_dictionary_get_value(request, "channel");
|
||||
channel = xpc_connection_create_from_endpoint(endpoint);
|
||||
|
||||
if (name && id && host && channel)
|
||||
{
|
||||
peer_cfg = create_peer_cfg(name, host);
|
||||
|
||||
add_auth_cfg(peer_cfg, TRUE, id, AUTH_CLASS_EAP);
|
||||
add_auth_cfg(peer_cfg, FALSE, host, AUTH_CLASS_ANY);
|
||||
|
||||
child_cfg = create_child_cfg(name);
|
||||
peer_cfg->add_child_cfg(peer_cfg, child_cfg->get_ref(child_cfg));
|
||||
|
||||
if (charon->controller->initiate(charon->controller, peer_cfg, child_cfg,
|
||||
(controller_cb_t)initiate_cb, &ike_sa, LEVEL_CTRL, 0, FALSE) == NEED_MORE)
|
||||
{
|
||||
this->channels->add(this->channels, channel, ike_sa);
|
||||
success = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
xpc_dictionary_set_bool(reply, "success", success);
|
||||
}
|
||||
|
||||
/**
|
||||
* XPC RPC command dispatch table
|
||||
*/
|
||||
static struct {
|
||||
char *name;
|
||||
void (*handler)(private_xpc_dispatch_t *this,
|
||||
xpc_object_t request, xpc_object_t reply);
|
||||
} commands[] = {
|
||||
{ "get_version", get_version },
|
||||
{ "start_connection", start_connection },
|
||||
};
|
||||
|
||||
/**
|
||||
* Handle a received XPC request message
|
||||
*/
|
||||
static void handle(private_xpc_dispatch_t *this, xpc_object_t request)
|
||||
{
|
||||
xpc_connection_t client;
|
||||
xpc_object_t reply;
|
||||
const char *type, *rpc;
|
||||
bool found = FALSE;
|
||||
int i;
|
||||
|
||||
type = xpc_dictionary_get_string(request, "type");
|
||||
if (type)
|
||||
{
|
||||
if (streq(type, "rpc"))
|
||||
{
|
||||
reply = xpc_dictionary_create_reply(request);
|
||||
rpc = xpc_dictionary_get_string(request, "rpc");
|
||||
if (reply && rpc)
|
||||
{
|
||||
for (i = 0; i < countof(commands); i++)
|
||||
{
|
||||
if (streq(commands[i].name, rpc))
|
||||
{
|
||||
found = TRUE;
|
||||
commands[i].handler(this, request, reply);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
DBG1(DBG_CFG, "received invalid XPC rpc command: %s", rpc);
|
||||
}
|
||||
if (reply)
|
||||
{
|
||||
client = xpc_dictionary_get_remote_connection(request);
|
||||
xpc_connection_send_message(client, reply);
|
||||
xpc_release(reply);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG1(DBG_CFG, "received unknown XPC message type: %s", type);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG1(DBG_CFG, "received XPC message without a type");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalizer for client connections
|
||||
*/
|
||||
static void cleanup_connection(private_xpc_dispatch_t *this)
|
||||
{
|
||||
if (ref_put(&this->refcount))
|
||||
{
|
||||
DBG1(DBG_CFG, "no XPC connections, raising SIGTERM");
|
||||
kill(this->pid, SIGTERM);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up GCD handler for XPC events
|
||||
*/
|
||||
static void set_handler(private_xpc_dispatch_t *this)
|
||||
{
|
||||
xpc_retain(this->service);
|
||||
xpc_connection_set_event_handler(this->service, ^(xpc_object_t conn)
|
||||
{
|
||||
xpc_connection_set_event_handler(conn, ^(xpc_object_t event)
|
||||
{
|
||||
if (xpc_get_type(event) == XPC_TYPE_DICTIONARY)
|
||||
{
|
||||
handle(this, event);
|
||||
}
|
||||
});
|
||||
ref_get(&this->refcount);
|
||||
xpc_connection_set_context(conn, this);
|
||||
xpc_connection_set_finalizer_f(conn, (void*)cleanup_connection);
|
||||
xpc_connection_resume(conn);
|
||||
});
|
||||
xpc_connection_resume(this->service);
|
||||
}
|
||||
|
||||
METHOD(xpc_dispatch_t, destroy, void,
|
||||
private_xpc_dispatch_t *this)
|
||||
{
|
||||
charon->bus->remove_listener(charon->bus, &this->channels->listener);
|
||||
this->channels->destroy(this->channels);
|
||||
if (this->service)
|
||||
{
|
||||
xpc_connection_suspend(this->service);
|
||||
xpc_release(this->service);
|
||||
}
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* See header
|
||||
*/
|
||||
xpc_dispatch_t *xpc_dispatch_create()
|
||||
{
|
||||
private_xpc_dispatch_t *this;
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.destroy = _destroy,
|
||||
},
|
||||
.channels = xpc_channels_create(),
|
||||
.queue = dispatch_queue_create("org.strongswan.charon-xpc.q",
|
||||
DISPATCH_QUEUE_CONCURRENT),
|
||||
.pid = getpid(),
|
||||
);
|
||||
charon->bus->add_listener(charon->bus, &this->channels->listener);
|
||||
|
||||
this->service = xpc_connection_create_mach_service(
|
||||
"org.strongswan.charon-xpc", this->queue,
|
||||
XPC_CONNECTION_MACH_SERVICE_LISTENER);
|
||||
if (!this->service)
|
||||
{
|
||||
destroy(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
set_handler(this);
|
||||
|
||||
return &this->public;
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup xpc_dispatch xpc_dispatch
|
||||
* @{ @ingroup xpc
|
||||
*/
|
||||
|
||||
#ifndef XPC_DISPATCH_H_
|
||||
#define XPC_DISPATCH_H_
|
||||
|
||||
typedef struct xpc_dispatch_t xpc_dispatch_t;
|
||||
|
||||
/**
|
||||
* XPC dispatcher to control the daemon.
|
||||
*/
|
||||
struct xpc_dispatch_t {
|
||||
|
||||
/**
|
||||
* Destroy a xpc_dispatch_t.
|
||||
*/
|
||||
void (*destroy)(xpc_dispatch_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a xpc_dispatch instance.
|
||||
*/
|
||||
xpc_dispatch_t *xpc_dispatch_create();
|
||||
|
||||
#endif /** XPC_DISPATCH_H_ @}*/
|
||||
@@ -1,97 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include "xpc_logger.h"
|
||||
|
||||
typedef struct private_xpc_logger_t private_xpc_logger_t;
|
||||
|
||||
/**
|
||||
* Private data of an xpc_logger_t object.
|
||||
*/
|
||||
struct private_xpc_logger_t {
|
||||
|
||||
/**
|
||||
* Public xpc_logger_t interface.
|
||||
*/
|
||||
xpc_logger_t public;
|
||||
|
||||
/**
|
||||
* XPC channel to send logging messages to
|
||||
*/
|
||||
xpc_connection_t conn;
|
||||
|
||||
/**
|
||||
* IKE_SA we log for
|
||||
*/
|
||||
uint32_t ike_sa;
|
||||
};
|
||||
|
||||
METHOD(logger_t, log_, void,
|
||||
private_xpc_logger_t *this, debug_t group, level_t level, int thread,
|
||||
ike_sa_t* ike_sa, const char *message)
|
||||
{
|
||||
if (ike_sa && ike_sa->get_unique_id(ike_sa) == this->ike_sa)
|
||||
{
|
||||
xpc_object_t msg;
|
||||
|
||||
msg = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(msg, "type", "event");
|
||||
xpc_dictionary_set_string(msg, "event", "log");
|
||||
xpc_dictionary_set_string(msg, "message", message);
|
||||
xpc_connection_send_message(this->conn, msg);
|
||||
xpc_release(msg);
|
||||
}
|
||||
}
|
||||
|
||||
METHOD(logger_t, get_level, level_t,
|
||||
private_xpc_logger_t *this, debug_t group)
|
||||
{
|
||||
return LEVEL_CTRL;
|
||||
}
|
||||
|
||||
METHOD(xpc_logger_t, set_ike_sa, void,
|
||||
private_xpc_logger_t *this, uint32_t ike_sa)
|
||||
{
|
||||
this->ike_sa = ike_sa;
|
||||
}
|
||||
|
||||
METHOD(xpc_logger_t, destroy, void,
|
||||
private_xpc_logger_t *this)
|
||||
{
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* See header
|
||||
*/
|
||||
xpc_logger_t *xpc_logger_create(xpc_connection_t conn)
|
||||
{
|
||||
private_xpc_logger_t *this;
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.logger = {
|
||||
.log = _log_,
|
||||
.get_level = _get_level,
|
||||
},
|
||||
.set_ike_sa = _set_ike_sa,
|
||||
.destroy = _destroy,
|
||||
},
|
||||
.conn = conn,
|
||||
);
|
||||
|
||||
return &this->public;
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup xpc_logger xpc_logger
|
||||
* @{ @ingroup xpc
|
||||
*/
|
||||
|
||||
#ifndef XPC_LOGGER_H_
|
||||
#define XPC_LOGGER_H_
|
||||
|
||||
#include <xpc/xpc.h>
|
||||
|
||||
#include <daemon.h>
|
||||
|
||||
typedef struct xpc_logger_t xpc_logger_t;
|
||||
|
||||
/**
|
||||
* Connection specific logger over XPC.
|
||||
*/
|
||||
struct xpc_logger_t {
|
||||
|
||||
/**
|
||||
* Implements logger_t.
|
||||
*/
|
||||
logger_t logger;
|
||||
|
||||
/**
|
||||
* Set the IKE_SA unique identifier this logger logs for.
|
||||
*
|
||||
* @param ike_sa IKE_SA unique identifier
|
||||
*/
|
||||
void (*set_ike_sa)(xpc_logger_t *this, uint32_t ike_sa);
|
||||
|
||||
/**
|
||||
* Destroy a xpc_logger_t.
|
||||
*/
|
||||
void (*destroy)(xpc_logger_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a xpc_logger instance.
|
||||
*
|
||||
* @param conn XPC connection to send logging events to
|
||||
* @return XPC logger
|
||||
*/
|
||||
xpc_logger_t *xpc_logger_create(xpc_connection_t conn);
|
||||
|
||||
#endif /** XPC_LOGGER_H_ @}*/
|
||||
@@ -1,600 +0,0 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
5B04A712174558F100A13BDC /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 5B04A711174558F100A13BDC /* icon.png */; };
|
||||
5B04A7211747800F00A13BDC /* icon-alt.png in Resources */ = {isa = PBXBuildFile; fileRef = 5B04A7201747800F00A13BDC /* icon-alt.png */; };
|
||||
5B313F9A17A93D590055C86A /* icon-large.icns in Resources */ = {isa = PBXBuildFile; fileRef = 5B313F9917A93D590055C86A /* icon-large.icns */; };
|
||||
5B74989217311B200041971E /* xpc_channels.c in Sources */ = {isa = PBXBuildFile; fileRef = 5B74989117311B200041971E /* xpc_channels.c */; };
|
||||
5B7498B8173275D10041971E /* xpc_logger.c in Sources */ = {isa = PBXBuildFile; fileRef = 5B7498B7173275D10041971E /* xpc_logger.c */; };
|
||||
5B7FA5A11754D5DB00264BAC /* LogController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B7FA59F1754D5DB00264BAC /* LogController.m */; };
|
||||
5B7FA5B01754EBC800264BAC /* ConnController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B7FA5AE1754EBC800264BAC /* ConnController.m */; };
|
||||
5B7FA5B51754F5AF00264BAC /* PasswordController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B7FA5B31754F5AF00264BAC /* PasswordController.m */; };
|
||||
5B8D879B1A40658B008E5702 /* Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B8D879A1A40658B008E5702 /* Helper.m */; };
|
||||
5B8D879C1A409E4D008E5702 /* LogWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B8D879E1A409E4D008E5702 /* LogWindow.xib */; };
|
||||
5B8D879F1A409E5A008E5702 /* ConnWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B8D87A11A409E5A008E5702 /* ConnWindow.xib */; };
|
||||
5B8D87A21A409E6D008E5702 /* PasswordWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B8D87A41A409E6D008E5702 /* PasswordWindow.xib */; };
|
||||
5BAE9E9A17A94A2600858FE2 /* icon-active.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BAE9E9917A94A2500858FE2 /* icon-active.png */; };
|
||||
5BD1CCB11726DB0100587077 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BD1CCB01726DB0100587077 /* Cocoa.framework */; };
|
||||
5BD1CCBB1726DB0100587077 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5BD1CCB91726DB0100587077 /* InfoPlist.strings */; };
|
||||
5BD1CCBD1726DB0100587077 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BD1CCBC1726DB0100587077 /* main.m */; };
|
||||
5BD1CCC11726DB0100587077 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 5BD1CCBF1726DB0100587077 /* Credits.rtf */; };
|
||||
5BD1CCC41726DB0100587077 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BD1CCC31726DB0100587077 /* AppDelegate.m */; };
|
||||
5BD1CCC71726DB0200587077 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BD1CCC51726DB0200587077 /* MainMenu.xib */; };
|
||||
5BD1CCD71726DB4000587077 /* charon-xpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 5BD1CCD61726DB4000587077 /* charon-xpc.c */; };
|
||||
5BD1CCDF1726DC0A00587077 /* org.strongswan.charon-xpc in Copy Files */ = {isa = PBXBuildFile; fileRef = 5BD1CCD11726DB4000587077 /* org.strongswan.charon-xpc */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
5BD1CCEB1727CCA400587077 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 5BD1CCEA1727CCA400587077 /* README.md */; };
|
||||
5BD1CCED1727D7AF00587077 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BD1CCEC1727D7AF00587077 /* ServiceManagement.framework */; };
|
||||
5BD1CCF31727DE3E00587077 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BD1CCF21727DE3E00587077 /* Security.framework */; };
|
||||
5BD1CCFB1729365F00587077 /* Control.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BD1CCFA1729365F00587077 /* Control.m */; };
|
||||
5BF60F31173405A000E5D608 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BD1CCD31726DB4000587077 /* CoreFoundation.framework */; };
|
||||
5BF60F33173405AC00E5D608 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BD1CCF21727DE3E00587077 /* Security.framework */; };
|
||||
5BF60F3E1734070A00E5D608 /* xpc_dispatch.c in Sources */ = {isa = PBXBuildFile; fileRef = 5B74984C172AA3550041971E /* xpc_dispatch.c */; };
|
||||
5BF60F631743C57500E5D608 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BF60F621743C57500E5D608 /* SystemConfiguration.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
5BD1CCE81726E45200587077 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 5BD1CCA31726DB0100587077 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 5BD1CCD01726DB4000587077;
|
||||
remoteInfo = "charon-xpc";
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
5BD1CCDE1726DBF100587077 /* Copy Files */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 12;
|
||||
dstPath = Contents/Library/LaunchServices;
|
||||
dstSubfolderSpec = 1;
|
||||
files = (
|
||||
5BD1CCDF1726DC0A00587077 /* org.strongswan.charon-xpc in Copy Files */,
|
||||
);
|
||||
name = "Copy Files";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
5B04A711174558F100A13BDC /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = "<group>"; };
|
||||
5B04A7201747800F00A13BDC /* icon-alt.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-alt.png"; sourceTree = "<group>"; };
|
||||
5B313F9917A93D590055C86A /* icon-large.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "icon-large.icns"; sourceTree = "<group>"; };
|
||||
5B74984C172AA3550041971E /* xpc_dispatch.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xpc_dispatch.c; sourceTree = "<group>"; };
|
||||
5B74984E172AA3670041971E /* xpc_dispatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xpc_dispatch.h; sourceTree = "<group>"; };
|
||||
5B74989017311AFC0041971E /* xpc_channels.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xpc_channels.h; sourceTree = "<group>"; };
|
||||
5B74989117311B200041971E /* xpc_channels.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xpc_channels.c; sourceTree = "<group>"; };
|
||||
5B7498B7173275D10041971E /* xpc_logger.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xpc_logger.c; sourceTree = "<group>"; };
|
||||
5B7498B9173275DD0041971E /* xpc_logger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xpc_logger.h; sourceTree = "<group>"; };
|
||||
5B7FA59E1754D5DB00264BAC /* LogController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LogController.h; sourceTree = "<group>"; };
|
||||
5B7FA59F1754D5DB00264BAC /* LogController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LogController.m; sourceTree = "<group>"; };
|
||||
5B7FA5AD1754EBC800264BAC /* ConnController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConnController.h; sourceTree = "<group>"; };
|
||||
5B7FA5AE1754EBC800264BAC /* ConnController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConnController.m; sourceTree = "<group>"; };
|
||||
5B7FA5B21754F5AF00264BAC /* PasswordController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PasswordController.h; sourceTree = "<group>"; };
|
||||
5B7FA5B31754F5AF00264BAC /* PasswordController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PasswordController.m; sourceTree = "<group>"; };
|
||||
5B8D87991A406572008E5702 /* Helper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Helper.h; sourceTree = "<group>"; };
|
||||
5B8D879A1A40658B008E5702 /* Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Helper.m; sourceTree = "<group>"; };
|
||||
5B8D879D1A409E4D008E5702 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/LogWindow.xib; sourceTree = "<group>"; };
|
||||
5B8D87A01A409E5A008E5702 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ConnWindow.xib; sourceTree = "<group>"; };
|
||||
5B8D87A31A409E6D008E5702 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/PasswordWindow.xib; sourceTree = "<group>"; };
|
||||
5BAE9E9917A94A2500858FE2 /* icon-active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-active.png"; sourceTree = "<group>"; };
|
||||
5BD1CCAC1726DB0100587077 /* strongSwan.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = strongSwan.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
5BD1CCB01726DB0100587077 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
||||
5BD1CCB81726DB0100587077 /* strongSwan-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "strongSwan-Info.plist"; sourceTree = "<group>"; };
|
||||
5BD1CCBA1726DB0100587077 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
5BD1CCBC1726DB0100587077 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
5BD1CCBE1726DB0100587077 /* strongSwan-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "strongSwan-Prefix.pch"; sourceTree = "<group>"; };
|
||||
5BD1CCC01726DB0100587077 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
|
||||
5BD1CCC21726DB0100587077 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
||||
5BD1CCC31726DB0100587077 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
|
||||
5BD1CCC61726DB0200587077 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||
5BD1CCD11726DB4000587077 /* org.strongswan.charon-xpc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "org.strongswan.charon-xpc"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
5BD1CCD31726DB4000587077 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
|
||||
5BD1CCD61726DB4000587077 /* charon-xpc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "charon-xpc.c"; sourceTree = "<group>"; };
|
||||
5BD1CCE01726DCD000587077 /* charon-xpc-Launchd.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "charon-xpc-Launchd.plist"; sourceTree = "<group>"; };
|
||||
5BD1CCE11726DD9900587077 /* charon-xpc-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "charon-xpc-Info.plist"; sourceTree = "<group>"; };
|
||||
5BD1CCEA1727CCA400587077 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.md; sourceTree = "<group>"; };
|
||||
5BD1CCEC1727D7AF00587077 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
|
||||
5BD1CCF21727DE3E00587077 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
|
||||
5BD1CCF91729365F00587077 /* Control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Control.h; sourceTree = "<group>"; };
|
||||
5BD1CCFA1729365F00587077 /* Control.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Control.m; sourceTree = "<group>"; };
|
||||
5BF60F621743C57500E5D608 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
5BD1CCA91726DB0100587077 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
5BD1CCF31727DE3E00587077 /* Security.framework in Frameworks */,
|
||||
5BD1CCED1727D7AF00587077 /* ServiceManagement.framework in Frameworks */,
|
||||
5BD1CCB11726DB0100587077 /* Cocoa.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
5BD1CCCE1726DB4000587077 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
5BF60F631743C57500E5D608 /* SystemConfiguration.framework in Frameworks */,
|
||||
5BF60F31173405A000E5D608 /* CoreFoundation.framework in Frameworks */,
|
||||
5BF60F33173405AC00E5D608 /* Security.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
5BD1CCA11726DB0100587077 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5BD1CCEA1727CCA400587077 /* README.md */,
|
||||
5BD1CCB61726DB0100587077 /* strongSwan */,
|
||||
5BD1CCD51726DB4000587077 /* charon-xpc */,
|
||||
5BD1CCAF1726DB0100587077 /* Frameworks */,
|
||||
5BD1CCAD1726DB0100587077 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5BD1CCAD1726DB0100587077 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5BD1CCAC1726DB0100587077 /* strongSwan.app */,
|
||||
5BD1CCD11726DB4000587077 /* org.strongswan.charon-xpc */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5BD1CCAF1726DB0100587077 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5BF60F621743C57500E5D608 /* SystemConfiguration.framework */,
|
||||
5BD1CCF21727DE3E00587077 /* Security.framework */,
|
||||
5BD1CCEC1727D7AF00587077 /* ServiceManagement.framework */,
|
||||
5BD1CCB01726DB0100587077 /* Cocoa.framework */,
|
||||
5BD1CCD31726DB4000587077 /* CoreFoundation.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5BD1CCB61726DB0100587077 /* strongSwan */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5B04A711174558F100A13BDC /* icon.png */,
|
||||
5B04A7201747800F00A13BDC /* icon-alt.png */,
|
||||
5BAE9E9917A94A2500858FE2 /* icon-active.png */,
|
||||
5B313F9917A93D590055C86A /* icon-large.icns */,
|
||||
5BD1CCBF1726DB0100587077 /* Credits.rtf */,
|
||||
5BD1CCBE1726DB0100587077 /* strongSwan-Prefix.pch */,
|
||||
5BD1CCBC1726DB0100587077 /* main.m */,
|
||||
5BD1CCB91726DB0100587077 /* InfoPlist.strings */,
|
||||
5BD1CCB81726DB0100587077 /* strongSwan-Info.plist */,
|
||||
5BD1CCC21726DB0100587077 /* AppDelegate.h */,
|
||||
5BD1CCC31726DB0100587077 /* AppDelegate.m */,
|
||||
5B7FA59E1754D5DB00264BAC /* LogController.h */,
|
||||
5B7FA59F1754D5DB00264BAC /* LogController.m */,
|
||||
5B8D879E1A409E4D008E5702 /* LogWindow.xib */,
|
||||
5BD1CCC51726DB0200587077 /* MainMenu.xib */,
|
||||
5BD1CCF91729365F00587077 /* Control.h */,
|
||||
5BD1CCFA1729365F00587077 /* Control.m */,
|
||||
5B7FA5AD1754EBC800264BAC /* ConnController.h */,
|
||||
5B7FA5AE1754EBC800264BAC /* ConnController.m */,
|
||||
5B8D87A11A409E5A008E5702 /* ConnWindow.xib */,
|
||||
5B7FA5B21754F5AF00264BAC /* PasswordController.h */,
|
||||
5B7FA5B31754F5AF00264BAC /* PasswordController.m */,
|
||||
5B8D87A41A409E6D008E5702 /* PasswordWindow.xib */,
|
||||
5B8D87991A406572008E5702 /* Helper.h */,
|
||||
5B8D879A1A40658B008E5702 /* Helper.m */,
|
||||
);
|
||||
path = strongSwan;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5BD1CCD51726DB4000587077 /* charon-xpc */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5BD1CCD61726DB4000587077 /* charon-xpc.c */,
|
||||
5BD1CCE01726DCD000587077 /* charon-xpc-Launchd.plist */,
|
||||
5BD1CCE11726DD9900587077 /* charon-xpc-Info.plist */,
|
||||
5B74984C172AA3550041971E /* xpc_dispatch.c */,
|
||||
5B74984E172AA3670041971E /* xpc_dispatch.h */,
|
||||
5B74989017311AFC0041971E /* xpc_channels.h */,
|
||||
5B74989117311B200041971E /* xpc_channels.c */,
|
||||
5B7498B7173275D10041971E /* xpc_logger.c */,
|
||||
5B7498B9173275DD0041971E /* xpc_logger.h */,
|
||||
);
|
||||
path = "charon-xpc";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
5BD1CCAB1726DB0100587077 /* strongSwan */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 5BD1CCCA1726DB0200587077 /* Build configuration list for PBXNativeTarget "strongSwan" */;
|
||||
buildPhases = (
|
||||
5BD1CCA81726DB0100587077 /* Sources */,
|
||||
5BD1CCA91726DB0100587077 /* Frameworks */,
|
||||
5BD1CCAA1726DB0100587077 /* Resources */,
|
||||
5BD1CCDE1726DBF100587077 /* Copy Files */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
5BD1CCE91726E45200587077 /* PBXTargetDependency */,
|
||||
);
|
||||
name = strongSwan;
|
||||
productName = strongSwan;
|
||||
productReference = 5BD1CCAC1726DB0100587077 /* strongSwan.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
5BD1CCD01726DB4000587077 /* charon-xpc */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 5BD1CCDA1726DB4000587077 /* Build configuration list for PBXNativeTarget "charon-xpc" */;
|
||||
buildPhases = (
|
||||
5BD1CCCD1726DB4000587077 /* Sources */,
|
||||
5BD1CCCE1726DB4000587077 /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "charon-xpc";
|
||||
productName = "charon-xpc";
|
||||
productReference = 5BD1CCD11726DB4000587077 /* org.strongswan.charon-xpc */;
|
||||
productType = "com.apple.product-type.tool";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
5BD1CCA31726DB0100587077 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0620;
|
||||
ORGANIZATIONNAME = "revosec AG";
|
||||
};
|
||||
buildConfigurationList = 5BD1CCA61726DB0100587077 /* Build configuration list for PBXProject "strongSwan" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = 5BD1CCA11726DB0100587077;
|
||||
productRefGroup = 5BD1CCAD1726DB0100587077 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
5BD1CCAB1726DB0100587077 /* strongSwan */,
|
||||
5BD1CCD01726DB4000587077 /* charon-xpc */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
5BD1CCAA1726DB0100587077 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
5BD1CCBB1726DB0100587077 /* InfoPlist.strings in Resources */,
|
||||
5BD1CCC11726DB0100587077 /* Credits.rtf in Resources */,
|
||||
5BD1CCC71726DB0200587077 /* MainMenu.xib in Resources */,
|
||||
5BD1CCEB1727CCA400587077 /* README.md in Resources */,
|
||||
5B04A712174558F100A13BDC /* icon.png in Resources */,
|
||||
5B04A7211747800F00A13BDC /* icon-alt.png in Resources */,
|
||||
5B8D879C1A409E4D008E5702 /* LogWindow.xib in Resources */,
|
||||
5B8D879F1A409E5A008E5702 /* ConnWindow.xib in Resources */,
|
||||
5B8D87A21A409E6D008E5702 /* PasswordWindow.xib in Resources */,
|
||||
5B313F9A17A93D590055C86A /* icon-large.icns in Resources */,
|
||||
5BAE9E9A17A94A2600858FE2 /* icon-active.png in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
5BD1CCA81726DB0100587077 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
5BD1CCBD1726DB0100587077 /* main.m in Sources */,
|
||||
5BD1CCC41726DB0100587077 /* AppDelegate.m in Sources */,
|
||||
5BD1CCFB1729365F00587077 /* Control.m in Sources */,
|
||||
5B7FA5A11754D5DB00264BAC /* LogController.m in Sources */,
|
||||
5B8D879B1A40658B008E5702 /* Helper.m in Sources */,
|
||||
5B7FA5B01754EBC800264BAC /* ConnController.m in Sources */,
|
||||
5B7FA5B51754F5AF00264BAC /* PasswordController.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
5BD1CCCD1726DB4000587077 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
5BD1CCD71726DB4000587077 /* charon-xpc.c in Sources */,
|
||||
5B74989217311B200041971E /* xpc_channels.c in Sources */,
|
||||
5BF60F3E1734070A00E5D608 /* xpc_dispatch.c in Sources */,
|
||||
5B7498B8173275D10041971E /* xpc_logger.c in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
5BD1CCE91726E45200587077 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 5BD1CCD01726DB4000587077 /* charon-xpc */;
|
||||
targetProxy = 5BD1CCE81726E45200587077 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
5B8D879E1A409E4D008E5702 /* LogWindow.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
5B8D879D1A409E4D008E5702 /* en */,
|
||||
);
|
||||
name = LogWindow.xib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5B8D87A11A409E5A008E5702 /* ConnWindow.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
5B8D87A01A409E5A008E5702 /* en */,
|
||||
);
|
||||
name = ConnWindow.xib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5B8D87A41A409E6D008E5702 /* PasswordWindow.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
5B8D87A31A409E6D008E5702 /* en */,
|
||||
);
|
||||
name = PasswordWindow.xib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5BD1CCB91726DB0100587077 /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
5BD1CCBA1726DB0100587077 /* en */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5BD1CCBF1726DB0100587077 /* Credits.rtf */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
5BD1CCC01726DB0100587077 /* en */,
|
||||
);
|
||||
name = Credits.rtf;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5BD1CCC51726DB0200587077 /* MainMenu.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
5BD1CCC61726DB0200587077 /* en */,
|
||||
);
|
||||
name = MainMenu.xib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
5BD1CCC81726DB0200587077 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
5BD1CCC91726DB0200587077 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
5BD1CCCB1726DB0200587077 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "strongSwan/strongSwan-Prefix.pch";
|
||||
INFOPLIST_FILE = "strongSwan/strongSwan-Info.plist";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE = "";
|
||||
SDKROOT = macosx;
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
5BD1CCCC1726DB0200587077 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "strongSwan/strongSwan-Prefix.pch";
|
||||
INFOPLIST_FILE = "strongSwan/strongSwan-Info.plist";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE = "";
|
||||
SDKROOT = macosx;
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
5BD1CCDB1726DB4000587077 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
|
||||
GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
/usr/include,
|
||||
../../libstrongswan,
|
||||
../../libcharon,
|
||||
);
|
||||
INFOPLIST_FILE = "charon-xpc/charon-xpc-Info.plist";
|
||||
INSTALL_PATH = /;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
/usr/lib,
|
||||
../../libstrongswan/.libs,
|
||||
../../libcharon/.libs,
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
OTHER_CFLAGS = (
|
||||
"-include",
|
||||
../../../config.h,
|
||||
);
|
||||
OTHER_LDFLAGS = (
|
||||
"-lcrypto",
|
||||
"-force_load",
|
||||
../../libstrongswan/.libs/libstrongswan.a,
|
||||
"-force_load",
|
||||
../../libipsec/.libs/libipsec.a,
|
||||
"-force_load",
|
||||
../../libcharon/.libs/libcharon.a,
|
||||
"-sectcreate",
|
||||
__TEXT,
|
||||
__info_plist,
|
||||
"charon-xpc/charon-xpc-Info.plist",
|
||||
"-sectcreate",
|
||||
__TEXT,
|
||||
__launchd_plist,
|
||||
"charon-xpc/charon-xpc-Launchd.plist",
|
||||
);
|
||||
PRODUCT_NAME = "org.strongswan.charon-xpc";
|
||||
PROVISIONING_PROFILE = "";
|
||||
SDKROOT = macosx;
|
||||
STRIP_STYLE = "non-global";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
5BD1CCDC1726DB4000587077 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
|
||||
GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
/usr/include,
|
||||
../../libstrongswan,
|
||||
../../libcharon,
|
||||
);
|
||||
INFOPLIST_FILE = "charon-xpc/charon-xpc-Info.plist";
|
||||
INSTALL_PATH = /;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
/usr/lib,
|
||||
../../libstrongswan/.libs,
|
||||
../../libcharon/.libs,
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
OTHER_CFLAGS = (
|
||||
"-include",
|
||||
../../../config.h,
|
||||
);
|
||||
OTHER_LDFLAGS = (
|
||||
"-lcrypto",
|
||||
"-force_load",
|
||||
../../libstrongswan/.libs/libstrongswan.a,
|
||||
"-force_load",
|
||||
../../libipsec/.libs/libipsec.a,
|
||||
"-force_load",
|
||||
../../libcharon/.libs/libcharon.a,
|
||||
"-sectcreate",
|
||||
__TEXT,
|
||||
__info_plist,
|
||||
"charon-xpc/charon-xpc-Info.plist",
|
||||
"-sectcreate",
|
||||
__TEXT,
|
||||
__launchd_plist,
|
||||
"charon-xpc/charon-xpc-Launchd.plist",
|
||||
);
|
||||
PRODUCT_NAME = "org.strongswan.charon-xpc";
|
||||
PROVISIONING_PROFILE = "";
|
||||
SDKROOT = macosx;
|
||||
STRIP_STYLE = "non-global";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
5BD1CCA61726DB0100587077 /* Build configuration list for PBXProject "strongSwan" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
5BD1CCC81726DB0200587077 /* Debug */,
|
||||
5BD1CCC91726DB0200587077 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
5BD1CCCA1726DB0200587077 /* Build configuration list for PBXNativeTarget "strongSwan" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
5BD1CCCB1726DB0200587077 /* Debug */,
|
||||
5BD1CCCC1726DB0200587077 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
5BD1CCDA1726DB4000587077 /* Build configuration list for PBXNativeTarget "charon-xpc" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
5BD1CCDB1726DB4000587077 /* Debug */,
|
||||
5BD1CCDC1726DB4000587077 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 5BD1CCA31726DB0100587077 /* Project object */;
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#import "Control.h"
|
||||
|
||||
/**
|
||||
* Main application delegate, controls the status menu
|
||||
*/
|
||||
@interface AppDelegate : NSObject <NSApplicationDelegate,ControlDelegate> {
|
||||
|
||||
/**
|
||||
* Status menu controlled
|
||||
*/
|
||||
IBOutlet NSMenu *statusMenu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Action to add a new connection
|
||||
*/
|
||||
- (IBAction)addConnection:(id)sender;
|
||||
|
||||
@end
|
||||
@@ -1,359 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import "AppDelegate.h"
|
||||
#import "Control.h"
|
||||
#import "LogController.h"
|
||||
#import "ConnController.h"
|
||||
#import "PasswordController.h"
|
||||
|
||||
@implementation AppDelegate {
|
||||
NSStatusItem *statusItem;
|
||||
NSImage *active;
|
||||
NSImage *inactive;
|
||||
NSInteger nonConnectionItemCount;
|
||||
NSMutableArray *connections;
|
||||
Control *control;
|
||||
ConnController *editor;
|
||||
PasswordController *password;
|
||||
}
|
||||
|
||||
- (void)change:(connectionState)state withConnection:(NSDictionary*)conn
|
||||
{
|
||||
NSInteger idx;
|
||||
NSMenuItem *item;
|
||||
|
||||
idx = [statusMenu indexOfItemWithRepresentedObject:conn];
|
||||
if (idx != -1)
|
||||
{
|
||||
item = [statusMenu itemAtIndex:idx];
|
||||
|
||||
switch (state) {
|
||||
case STATE_DOWN:
|
||||
[item setState:NSOffState];
|
||||
[item setAction:@selector(doConnection:)];
|
||||
[[[item submenu] itemAtIndex:0] setAction:@selector(doConnection:)];
|
||||
[[[item submenu] itemAtIndex:0] setTitle:@"Connect"];
|
||||
[[[item submenu] itemAtIndex:1] setAction:@selector(editConnection:)];
|
||||
[[[item submenu] itemAtIndex:2] setAction:@selector(removeConnection:)];
|
||||
[self updateIcon];
|
||||
break;
|
||||
case STATE_WORKING:
|
||||
[item setState:NSMixedState];
|
||||
[item setAction:@selector(undoConnection:)];
|
||||
[[[item submenu] itemAtIndex:0] setAction:@selector(undoConnection:)];
|
||||
[[[item submenu] itemAtIndex:0] setTitle:@"Disconnect"];
|
||||
[[[item submenu] itemAtIndex:1] setAction:nil];
|
||||
[[[item submenu] itemAtIndex:2] setAction:nil];
|
||||
[self updateIcon];
|
||||
break;
|
||||
case STATE_UP:
|
||||
[item setState:NSOnState];
|
||||
[self updateIcon];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString*)createPasswordWithConnection:(NSDictionary*)conn
|
||||
{
|
||||
return [password query];
|
||||
}
|
||||
|
||||
- (void)raise:(NSString*)alert withConnection:(NSDictionary*)conn
|
||||
{
|
||||
NSAlert *popup;
|
||||
NSString *text;
|
||||
|
||||
text = [[NSString alloc]
|
||||
initWithFormat:@"Establishing connection %@ failed:",
|
||||
[conn objectForKey:@"name"]];
|
||||
popup = [[NSAlert alloc] init];
|
||||
[popup setMessageText:text];
|
||||
[popup setInformativeText:alert];
|
||||
[popup runModal];
|
||||
[text release];
|
||||
[popup release];
|
||||
}
|
||||
|
||||
- (void)log:(NSString*)line withConnection:(NSDictionary*)conn
|
||||
{
|
||||
[[self findLog:conn] appendLine:line];
|
||||
}
|
||||
|
||||
- (IBAction)undoConnection:(id)sender
|
||||
{
|
||||
NSDictionary *conn;
|
||||
|
||||
conn = [sender representedObject];
|
||||
[control disconnect:conn];
|
||||
}
|
||||
|
||||
- (IBAction)doConnection:(id)sender
|
||||
{
|
||||
NSDictionary *conn;
|
||||
|
||||
conn = [sender representedObject];
|
||||
[[self findLog:conn] clear];
|
||||
[control connect:conn];
|
||||
}
|
||||
|
||||
- (IBAction)addConnection:(id)sender
|
||||
{
|
||||
NSMutableDictionary *conn;
|
||||
|
||||
conn = [editor createConnection];
|
||||
if (conn)
|
||||
{
|
||||
[connections insertObject:conn atIndex:[connections count]];
|
||||
[self saveConnections];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)editConnection:(id)sender
|
||||
{
|
||||
NSMutableDictionary *conn;
|
||||
|
||||
conn = [sender representedObject];
|
||||
if ([editor editConnection:conn])
|
||||
{
|
||||
[self saveConnections];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)removeConnection:(id)sender
|
||||
{
|
||||
NSDictionary *conn;
|
||||
|
||||
conn = [sender representedObject];
|
||||
[connections removeObject:conn];
|
||||
[self saveConnections];
|
||||
}
|
||||
|
||||
- (void)loadConnections
|
||||
{
|
||||
NSUserDefaults *defaults;
|
||||
NSArray *array;
|
||||
|
||||
defaults = [NSUserDefaults standardUserDefaults];
|
||||
array = [defaults arrayForKey:@"connections"];
|
||||
if (array)
|
||||
{
|
||||
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
|
||||
if ([obj isKindOfClass:[NSDictionary class]])
|
||||
{
|
||||
NSMutableDictionary *dict;
|
||||
|
||||
dict = [obj mutableCopy];
|
||||
[connections insertObject:dict atIndex:[connections count]];
|
||||
[dict release];
|
||||
}
|
||||
}];
|
||||
}
|
||||
[defaults addObserver:self
|
||||
forKeyPath:@"connections"
|
||||
options:NSKeyValueObservingOptionNew
|
||||
context:NULL];
|
||||
}
|
||||
|
||||
- (void)saveConnections
|
||||
{
|
||||
NSUserDefaults *defaults;
|
||||
|
||||
defaults = [NSUserDefaults standardUserDefaults];
|
||||
[defaults setObject:connections forKey:@"connections"];
|
||||
[defaults synchronize];
|
||||
}
|
||||
|
||||
- (void)viewLog:(id)sender
|
||||
{
|
||||
[[sender representedObject] show];
|
||||
}
|
||||
|
||||
- (LogController*)findLog:(NSDictionary *)connection
|
||||
{
|
||||
NSInteger idx;
|
||||
NSMenuItem *item;
|
||||
|
||||
idx = [statusMenu indexOfItemWithRepresentedObject:connection];
|
||||
if (idx != -1)
|
||||
{
|
||||
item = [statusMenu itemAtIndex:idx];
|
||||
item = [[item submenu] itemAtIndex:3];
|
||||
return [item representedObject];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)addMenuItem:(NSDictionary *)connection
|
||||
{
|
||||
NSString *name, *title;
|
||||
NSMenuItem *item;
|
||||
NSMenu *submenu;
|
||||
LogController *ctl;
|
||||
|
||||
name = [connection objectForKey:@"name"];
|
||||
if (name) {
|
||||
/* create submenu first */
|
||||
submenu = [[NSMenu alloc] initWithTitle:@"submenu"];
|
||||
|
||||
item = [[NSMenuItem alloc] initWithTitle:@"Connect"
|
||||
action:@selector(doConnection:)
|
||||
keyEquivalent:@""];
|
||||
[item setTarget:self];
|
||||
[item setRepresentedObject:connection];
|
||||
[submenu insertItem:item atIndex:0];
|
||||
[item release];
|
||||
|
||||
item = [[NSMenuItem alloc] initWithTitle:@"Edit..."
|
||||
action:@selector(editConnection:)
|
||||
keyEquivalent:@""];
|
||||
[item setTarget:self];
|
||||
[item setRepresentedObject:connection];
|
||||
[submenu insertItem:item atIndex:1];
|
||||
[item release];
|
||||
|
||||
item = [[NSMenuItem alloc] initWithTitle:@"Remove"
|
||||
action:@selector(removeConnection:)
|
||||
keyEquivalent:@""];
|
||||
[item setTarget:self];
|
||||
[item setRepresentedObject:connection];
|
||||
[submenu insertItem:item atIndex:2];
|
||||
[item release];
|
||||
|
||||
item = [[NSMenuItem alloc] initWithTitle:@"View Log..."
|
||||
action:@selector(viewLog:)
|
||||
keyEquivalent:@""];
|
||||
[item setTarget:self];
|
||||
ctl = [[LogController alloc] initWithWindowNibName:@"LogWindow"];
|
||||
title = [NSString stringWithFormat: @"strongSwan Log: %@", name];
|
||||
[[ctl window] setTitle:title];
|
||||
[item setRepresentedObject:ctl];
|
||||
[ctl release];
|
||||
[submenu insertItem:item atIndex:3];
|
||||
[item release];
|
||||
|
||||
item = [[NSMenuItem alloc] initWithTitle:name
|
||||
action:@selector(doConnection:)
|
||||
keyEquivalent:@""];
|
||||
[item setTarget:self];
|
||||
[item setRepresentedObject:connection];
|
||||
[item setSubmenu:submenu];
|
||||
[submenu release];
|
||||
[statusMenu insertItem:item atIndex:
|
||||
[statusMenu numberOfItems] - nonConnectionItemCount];
|
||||
[item release];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)repopulateMenu
|
||||
{
|
||||
while ([statusMenu numberOfItems] > nonConnectionItemCount)
|
||||
{
|
||||
[statusMenu removeItemAtIndex:0];
|
||||
}
|
||||
[connections enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) {
|
||||
if ([obj isKindOfClass:[NSDictionary class]]) {
|
||||
[self addMenuItem:obj];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath
|
||||
ofObject:(id)object change:(NSDictionary *)change
|
||||
context:(void *)context
|
||||
{
|
||||
[self repopulateMenu];
|
||||
}
|
||||
|
||||
- (void)updateIcon
|
||||
{
|
||||
NSMenuItem *item;
|
||||
bool anyactive = FALSE;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < [statusMenu numberOfItems] - nonConnectionItemCount; i++)
|
||||
{
|
||||
item = [statusMenu itemAtIndex:i];
|
||||
if ([item state] == NSOnState)
|
||||
{
|
||||
anyactive = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
[statusItem setImage: anyactive ? active : inactive];
|
||||
}
|
||||
|
||||
- (void)initializeMenu
|
||||
{
|
||||
NSImage *icon;
|
||||
NSString *path;
|
||||
|
||||
statusItem = [[[NSStatusBar systemStatusBar]
|
||||
statusItemWithLength:NSVariableStatusItemLength] retain];
|
||||
[statusItem setMenu:statusMenu];
|
||||
[statusItem setHighlightMode:YES];
|
||||
|
||||
path = [[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"];
|
||||
icon = [[NSImage alloc] initWithContentsOfFile:path];
|
||||
[statusItem setImage:icon];
|
||||
inactive = icon;
|
||||
|
||||
path = [[NSBundle mainBundle] pathForResource:@"icon-active" ofType:@"png"];
|
||||
icon = [[NSImage alloc] initWithContentsOfFile:path];
|
||||
active = icon;
|
||||
|
||||
path = [[NSBundle mainBundle] pathForResource:@"icon-alt" ofType:@"png"];
|
||||
icon = [[NSImage alloc] initWithContentsOfFile:path];
|
||||
[statusItem setAlternateImage:icon];
|
||||
[icon release];
|
||||
|
||||
nonConnectionItemCount = [statusMenu numberOfItems];
|
||||
|
||||
[self repopulateMenu];
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
||||
{
|
||||
[self loadConnections];
|
||||
[self initializeMenu];
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
control = [[Control alloc] initWithDelegate:self];
|
||||
connections = [[NSMutableArray alloc] init];
|
||||
editor = [[ConnController alloc] initWithWindowNibName:@"ConnWindow"];
|
||||
password = [[PasswordController alloc] initWithWindowNibName:@"PasswordWindow"];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
[defaults removeObserver:self forKeyPath:@"connections"];
|
||||
[statusItem release];
|
||||
[active release];
|
||||
[inactive release];
|
||||
[connections release];
|
||||
[control release];
|
||||
[editor release];
|
||||
[password release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,75 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
/**
|
||||
* Controller for the Connection Editor window
|
||||
*/
|
||||
@interface ConnController : NSWindowController {
|
||||
|
||||
/**
|
||||
* Text field for the connection name
|
||||
*/
|
||||
IBOutlet NSTextField *name;
|
||||
|
||||
/**
|
||||
* Authentication method select control
|
||||
*/
|
||||
IBOutlet NSPopUpButton *auth;
|
||||
|
||||
/**
|
||||
* Server address of connection
|
||||
*/
|
||||
IBOutlet NSTextField *server;
|
||||
|
||||
/**
|
||||
* Username used for client authentication
|
||||
*/
|
||||
IBOutlet NSTextField *user;
|
||||
|
||||
/**
|
||||
* Confirmation button to save/create connection
|
||||
*/
|
||||
IBOutlet NSButton *ok;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the currently edited connection
|
||||
*/
|
||||
- (IBAction)saveConnEditor:(id)sender;
|
||||
|
||||
/**
|
||||
* Cancel editing the current connection
|
||||
*/
|
||||
- (IBAction)cancelConnEditor:(id)sender;
|
||||
|
||||
/**
|
||||
* Open a dialog to create a new connection.
|
||||
*
|
||||
* @return dictionary with connection settings, retained
|
||||
*/
|
||||
- (NSMutableDictionary*)createConnection;
|
||||
|
||||
/**
|
||||
* Open a dialog to edit a connection
|
||||
*
|
||||
* @param conn dictionary with connection settings, gets updated
|
||||
* @return TRUE if connection has been updated, FALSE if aborted
|
||||
*/
|
||||
- (bool)editConnection:(NSMutableDictionary*)conn;
|
||||
|
||||
@end
|
||||
@@ -1,103 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import "ConnController.h"
|
||||
|
||||
@interface ConnController ()
|
||||
|
||||
@end
|
||||
|
||||
@implementation ConnController
|
||||
|
||||
- (void)moveWindowToActiveSpace
|
||||
{
|
||||
NSInteger behavior, old;
|
||||
|
||||
/* seems that NSWindowCollectionBehaviorMoveToActiveSpace does not work
|
||||
* when a window is opened a second time. Fix that by changing the
|
||||
* behavior forth and back. */
|
||||
old = behavior = [[self window] collectionBehavior];
|
||||
behavior &= ~NSWindowCollectionBehaviorMoveToActiveSpace;
|
||||
behavior |= NSWindowCollectionBehaviorCanJoinAllSpaces;
|
||||
|
||||
[[self window] setCollectionBehavior: behavior];
|
||||
[[self window] setCollectionBehavior: old];
|
||||
|
||||
[NSApp activateIgnoringOtherApps:YES];
|
||||
}
|
||||
|
||||
- (IBAction)saveConnEditor:(id)sender
|
||||
{
|
||||
[NSApp stopModal];
|
||||
}
|
||||
|
||||
- (IBAction)cancelConnEditor:(id)sender
|
||||
{
|
||||
[NSApp abortModal];
|
||||
}
|
||||
|
||||
- (NSMutableDictionary*)createConnection
|
||||
{
|
||||
NSMutableDictionary *conn = nil;
|
||||
|
||||
[[self window] setTitle:@"Add new connection"];
|
||||
[name setStringValue:@""];
|
||||
[server setStringValue:@""];
|
||||
[user setStringValue:@""];
|
||||
[ok setEnabled:FALSE];
|
||||
[self moveWindowToActiveSpace];
|
||||
if ([NSApp runModalForWindow: [self window]] == NSRunStoppedResponse)
|
||||
{
|
||||
conn = [NSMutableDictionary dictionaryWithObjectsAndKeys:
|
||||
[name stringValue], @"name",
|
||||
[server stringValue], @"server",
|
||||
[user stringValue], @"username",
|
||||
nil];
|
||||
}
|
||||
[[self window] orderOut: self];
|
||||
return conn;
|
||||
}
|
||||
|
||||
- (bool)editConnection:(NSMutableDictionary*)conn
|
||||
{
|
||||
bool edited = NO;
|
||||
|
||||
[[self window] setTitle:@"Edit connection"];
|
||||
[name setStringValue:[conn objectForKey:@"name"]];
|
||||
[server setStringValue:[conn objectForKey:@"server"]];
|
||||
[user setStringValue:[conn objectForKey:@"username"]];
|
||||
[ok setEnabled:TRUE];
|
||||
[self moveWindowToActiveSpace];
|
||||
if ([NSApp runModalForWindow: [self window]] == NSRunStoppedResponse)
|
||||
{
|
||||
[conn setObject:[name stringValue] forKey:@"name"];
|
||||
[conn setObject:[server stringValue] forKey:@"server"];
|
||||
[conn setObject:[user stringValue] forKey:@"username"];
|
||||
edited = YES;
|
||||
}
|
||||
[[self window] orderOut: self];
|
||||
return edited;
|
||||
}
|
||||
|
||||
- (void)controlTextDidChange:(NSNotification *)notification
|
||||
{
|
||||
[ok setEnabled:
|
||||
[[name stringValue] length] &&
|
||||
[[server stringValue] length] &&
|
||||
[[user stringValue] length]];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/**
|
||||
* State of a connection during connect.
|
||||
*/
|
||||
typedef enum {
|
||||
/** The connection is currently down */
|
||||
STATE_DOWN,
|
||||
/** The connection is getting established, the daemon is working */
|
||||
STATE_WORKING,
|
||||
/** The connection has been established successfully */
|
||||
STATE_UP,
|
||||
} connectionState;
|
||||
|
||||
/**
|
||||
* This protocol defines callback functions to invoke during connect.
|
||||
*/
|
||||
@protocol ControlDelegate
|
||||
|
||||
/**
|
||||
* The connection has changed its state
|
||||
*
|
||||
* @param state new connection state
|
||||
* @param conn connection that changed its state
|
||||
*/
|
||||
- (void)change:(connectionState)state withConnection:(NSDictionary*)conn;
|
||||
|
||||
/**
|
||||
* A password is required for authentication
|
||||
*
|
||||
* @param conn connection a password is required for
|
||||
* @return a retained password string
|
||||
*/
|
||||
- (NSString*)createPasswordWithConnection:(NSDictionary*)conn;
|
||||
|
||||
/**
|
||||
* Show an alert message to the user
|
||||
*
|
||||
* @param alert alert message string
|
||||
* @param conn connection an error has occurred
|
||||
*/
|
||||
- (void)raise:(NSString*)alert withConnection:(NSDictionary*)conn;
|
||||
|
||||
/**
|
||||
* Log a line for a specific connection
|
||||
*
|
||||
* @param line log line string
|
||||
* @param conn connection the line is logged for
|
||||
*/
|
||||
- (void)log:(NSString*)line withConnection:(NSDictionary*)conn;
|
||||
@end
|
||||
|
||||
/**
|
||||
* Implements connection connect/disconnect operations using a GUI delegate.
|
||||
*/
|
||||
@interface Control : NSObject
|
||||
|
||||
/**
|
||||
* Try to establish a connection
|
||||
*
|
||||
* @param conn connection configuration to initiate
|
||||
*/
|
||||
- (void)connect:(NSDictionary*)conn;
|
||||
|
||||
/**
|
||||
* Disconnect a previously established connection
|
||||
*
|
||||
* @param conn connection configuration to terminate
|
||||
*/
|
||||
- (void)disconnect:(NSDictionary*)conn;
|
||||
|
||||
/**
|
||||
* Initiate the Control class using a delegate for GUI operations
|
||||
*
|
||||
* @param delegate delegate to invoke callbacks on during connect operation
|
||||
* @return class instance
|
||||
*/
|
||||
- (id)initWithDelegate:(id<ControlDelegate>)delegate;
|
||||
|
||||
@end
|
||||
@@ -1,259 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import "Control.h"
|
||||
#import "Helper.h"
|
||||
|
||||
@implementation Control {
|
||||
/* Provides the XPC main connection to the privileged helper */
|
||||
Helper *helper;
|
||||
/* active connection specific XPC channels, indexed by connection name */
|
||||
NSDictionary *active;
|
||||
/* delegate to invoke callbacks on */
|
||||
id<ControlDelegate> del;
|
||||
}
|
||||
|
||||
- (NSString*)translateAlert:(const char*)alert
|
||||
{
|
||||
if (strcmp(alert, "local-auth") == 0)
|
||||
{
|
||||
return @"Client authentication failed";
|
||||
}
|
||||
if (strcmp(alert, "remote-auth") == 0)
|
||||
{
|
||||
return @"Server authentication failed";
|
||||
}
|
||||
if (strcmp(alert, "dns") == 0)
|
||||
{
|
||||
return @"Resolving server hostname failed";
|
||||
}
|
||||
if (strcmp(alert, "unreachable") == 0)
|
||||
{
|
||||
return @"Server is unreachable";
|
||||
}
|
||||
if (strcmp(alert, "timeout") == 0)
|
||||
{
|
||||
return @"Server did not respond";
|
||||
}
|
||||
if (strcmp(alert, "proposal-mismatch") == 0)
|
||||
{
|
||||
return @"No common cryptographic algorithms found";
|
||||
}
|
||||
if (strcmp(alert, "ts-mismatch") == 0)
|
||||
{
|
||||
return @"No common traffic selectors found";
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- (void)changeState:(connectionState)state withChannel:(xpc_connection_t)channel
|
||||
andConn:(NSDictionary*)conn
|
||||
{
|
||||
NSString *name;
|
||||
|
||||
name = [conn objectForKey:@"name"];
|
||||
switch (state)
|
||||
{
|
||||
case STATE_WORKING:
|
||||
xpc_dictionary_set_value(active, [name UTF8String], channel);
|
||||
break;
|
||||
case STATE_DOWN:
|
||||
xpc_dictionary_set_value(active, [name UTF8String], NULL);
|
||||
break;
|
||||
case STATE_UP:
|
||||
break;
|
||||
}
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
[del change:state withConnection:conn];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)handleEvent:(xpc_object_t)request withChannel:(xpc_connection_t)channel
|
||||
andConn:(NSDictionary*)conn
|
||||
{
|
||||
xpc_connection_t client;
|
||||
xpc_object_t reply;
|
||||
const char *type, *rpc, *event;
|
||||
client = xpc_dictionary_get_remote_connection(request);
|
||||
type = xpc_dictionary_get_string(request, "type");
|
||||
if (type)
|
||||
{
|
||||
if (strcmp(type, "rpc") == 0)
|
||||
{
|
||||
reply = xpc_dictionary_create_reply(request);
|
||||
rpc = xpc_dictionary_get_string(request, "rpc");
|
||||
if (rpc)
|
||||
{
|
||||
if (strcmp(rpc, "get_password") == 0)
|
||||
{
|
||||
__block NSString *password;
|
||||
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
password = [del createPasswordWithConnection:conn];
|
||||
});
|
||||
xpc_dictionary_set_string(reply, "password",
|
||||
[password UTF8String]);
|
||||
[password release];
|
||||
}
|
||||
}
|
||||
xpc_connection_send_message(client, reply);
|
||||
xpc_release(reply);
|
||||
}
|
||||
if (strcmp(type, "event") == 0)
|
||||
{
|
||||
event = xpc_dictionary_get_string(request, "event");
|
||||
if (event)
|
||||
{
|
||||
if (strcmp(event, "log") == 0)
|
||||
{
|
||||
NSString *line;
|
||||
|
||||
line = [[NSString alloc] initWithUTF8String:
|
||||
xpc_dictionary_get_string(request, "message")];
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[del log:line withConnection:conn];
|
||||
});
|
||||
[line release];
|
||||
}
|
||||
if (strcmp(event, "alert") == 0)
|
||||
{
|
||||
NSString *msg;
|
||||
const char *str;
|
||||
|
||||
str = xpc_dictionary_get_string(request, "alert");
|
||||
if (str)
|
||||
{
|
||||
msg = [self translateAlert:str];
|
||||
if (msg)
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[del raise:msg withConnection:conn];
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
if (strcmp(event, "connecting") == 0)
|
||||
{
|
||||
[self changeState:STATE_WORKING withChannel:channel andConn:conn];
|
||||
}
|
||||
if (strcmp(event, "up") == 0)
|
||||
{
|
||||
/* IKE_SA up */
|
||||
}
|
||||
if (strcmp(event, "down") == 0)
|
||||
{
|
||||
[self changeState:STATE_DOWN withChannel:channel andConn:conn];
|
||||
}
|
||||
if (strcmp(event, "child_up") == 0)
|
||||
{
|
||||
[self changeState:STATE_UP withChannel:channel andConn:conn];
|
||||
}
|
||||
if (strcmp(event, "child_down") == 0)
|
||||
{
|
||||
[self changeState:STATE_DOWN withChannel:channel andConn:conn];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)connect:(NSDictionary*)conn
|
||||
{
|
||||
xpc_object_t request;
|
||||
xpc_connection_t service, daemon;
|
||||
NSString *name, *server, *username;
|
||||
|
||||
name = [conn objectForKey:@"name"];
|
||||
server = [conn objectForKey:@"server"];
|
||||
username = [conn objectForKey:@"username"];
|
||||
|
||||
daemon = [helper getConnection];
|
||||
if (!daemon)
|
||||
{
|
||||
[del raise:[helper getError] withConnection:conn];
|
||||
}
|
||||
|
||||
request = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(request, "type", "rpc");
|
||||
xpc_dictionary_set_string(request, "rpc", "start_connection");
|
||||
xpc_dictionary_set_string(request, "name", [name UTF8String]);
|
||||
xpc_dictionary_set_string(request, "host", [server UTF8String]);
|
||||
xpc_dictionary_set_string(request, "id", [username UTF8String]);
|
||||
|
||||
service = xpc_connection_create(NULL, NULL);
|
||||
xpc_connection_set_event_handler(service, ^(xpc_object_t channel) {
|
||||
|
||||
xpc_connection_set_event_handler(channel, ^(xpc_object_t event) {
|
||||
|
||||
if (event == XPC_ERROR_CONNECTION_INTERRUPTED ||
|
||||
event == XPC_ERROR_CONNECTION_INVALID)
|
||||
{
|
||||
xpc_dictionary_set_value(active, [name UTF8String], NULL);
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
[del change:STATE_DOWN withConnection:conn];
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
[self handleEvent:event withChannel:channel andConn:conn];
|
||||
}
|
||||
});
|
||||
xpc_connection_resume(channel);
|
||||
});
|
||||
|
||||
xpc_connection_resume(service);
|
||||
xpc_dictionary_set_connection(request, "channel", xpc_retain(service));
|
||||
xpc_connection_send_message_with_reply(daemon, request,
|
||||
dispatch_get_main_queue(),
|
||||
^(xpc_object_t reply) {});
|
||||
xpc_release(request);
|
||||
}
|
||||
|
||||
- (void)disconnect:(NSDictionary*)conn
|
||||
{
|
||||
xpc_connection_t tunnel;
|
||||
xpc_object_t request;
|
||||
|
||||
tunnel = xpc_dictionary_get_value(active,
|
||||
[[conn objectForKey:@"name"] UTF8String]);
|
||||
if (tunnel)
|
||||
{
|
||||
request = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(request, "type", "rpc");
|
||||
xpc_dictionary_set_string(request, "rpc", "stop_connection");
|
||||
xpc_connection_send_message_with_reply(tunnel, request,
|
||||
dispatch_get_main_queue(),
|
||||
^(xpc_object_t reply) {});
|
||||
xpc_release(request);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
xpc_release(active);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (id)initWithDelegate:(id<ControlDelegate>)delegate;
|
||||
{
|
||||
self = [super init];
|
||||
helper = [[Helper alloc] init];
|
||||
active = xpc_dictionary_create(NULL, NULL, 0);
|
||||
del = delegate;
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/**
|
||||
* Privileged Helper abstraction.
|
||||
*
|
||||
* Manages the installation of the privileged helper charon-xpc binary
|
||||
* using authorization, SMJobBless() installation using XPC and also
|
||||
* checks the installed helper version.
|
||||
*/
|
||||
@interface Helper : NSObject
|
||||
|
||||
/**
|
||||
* Get the XPC connection singleton, installing helper if required
|
||||
*
|
||||
* @return XPC service connection, as a singleton
|
||||
*/
|
||||
- (xpc_connection_t)getConnection;
|
||||
|
||||
/**
|
||||
* Return an error string if if getConnection fails
|
||||
*
|
||||
* @return error string, unretained
|
||||
*/
|
||||
- (NSString*)getError;
|
||||
|
||||
@end
|
||||
@@ -1,224 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import "Helper.h"
|
||||
|
||||
#include <ServiceManagement/ServiceManagement.h>
|
||||
#include <Security/Authorization.h>
|
||||
|
||||
/* to check strongSwan version */
|
||||
#include "../../../../config.h"
|
||||
|
||||
@implementation Helper {
|
||||
/* XPC connection to the helper */
|
||||
xpc_connection_t helper;
|
||||
/* authorization instance, if authorized */
|
||||
AuthorizationRef auth;
|
||||
/* string of last error occurred */
|
||||
NSString* errmsg;
|
||||
}
|
||||
|
||||
- (void)setError:(NSString*)error
|
||||
{
|
||||
if (errmsg)
|
||||
{
|
||||
[errmsg release];
|
||||
}
|
||||
errmsg = error;
|
||||
}
|
||||
|
||||
- (bool)authorize
|
||||
{
|
||||
AuthorizationItem item = { kSMRightBlessPrivilegedHelper, 0, NULL, 0 };
|
||||
AuthorizationRights rights = { 1, &item };
|
||||
OSStatus status;
|
||||
|
||||
if (auth)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
status = AuthorizationCreate(&rights, kAuthorizationEmptyEnvironment,
|
||||
kAuthorizationFlagDefaults |
|
||||
kAuthorizationFlagInteractionAllowed |
|
||||
kAuthorizationFlagExtendRights, &auth);
|
||||
if (status == errAuthorizationSuccess)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
if (errmsg)
|
||||
{
|
||||
[errmsg release];
|
||||
}
|
||||
[self setError:[NSString stringWithFormat:@"Authorization failed: %@",
|
||||
SecCopyErrorMessageString(status, NULL)]];
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
- (bool)manage:(CFStringRef)label bless:(bool)bless
|
||||
{
|
||||
bool done;
|
||||
CFErrorRef error;
|
||||
|
||||
if (![self authorize])
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (bless)
|
||||
{
|
||||
done = SMJobBless(kSMDomainSystemLaunchd, label, auth, &error);
|
||||
}
|
||||
else
|
||||
{
|
||||
done = SMJobRemove(kSMDomainSystemLaunchd, label, auth, TRUE, &error);
|
||||
}
|
||||
if (!done)
|
||||
{
|
||||
[self setError:
|
||||
[NSString stringWithFormat:@"Installing privileged helper failed: %@",
|
||||
CFErrorCopyDescription(error)]];
|
||||
CFRelease(error);
|
||||
}
|
||||
return done;
|
||||
}
|
||||
|
||||
- (bool)make:(CFStringRef)label
|
||||
{
|
||||
char str[128];
|
||||
|
||||
if (!CFStringGetCString(label, str, sizeof(str), kCFStringEncodingUTF8))
|
||||
{
|
||||
[self setError:@"converting XPC service name failed"];
|
||||
return FALSE;
|
||||
}
|
||||
helper = xpc_connection_create_mach_service(str, NULL,
|
||||
XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
|
||||
if (!helper)
|
||||
{
|
||||
[self setError:@"creating XPC mach service failed"];
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xpc_connection_set_event_handler(helper, ^(xpc_object_t event) {
|
||||
if (xpc_get_type(event) == XPC_TYPE_ERROR)
|
||||
{
|
||||
if (event == XPC_ERROR_CONNECTION_INTERRUPTED ||
|
||||
event == XPC_ERROR_CONNECTION_INVALID)
|
||||
{
|
||||
if (helper)
|
||||
{
|
||||
xpc_connection_cancel(helper);
|
||||
helper = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
xpc_connection_resume(helper);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
- (bool)checkVersion
|
||||
{
|
||||
xpc_object_t request, response;
|
||||
bool match = FALSE;
|
||||
|
||||
request = xpc_dictionary_create(NULL, NULL, 0);
|
||||
xpc_dictionary_set_string(request, "type", "rpc");
|
||||
xpc_dictionary_set_string(request, "rpc", "get_version");
|
||||
|
||||
response = xpc_connection_send_message_with_reply_sync(helper, request);
|
||||
xpc_release(request);
|
||||
if (xpc_get_type(response) == XPC_TYPE_DICTIONARY)
|
||||
{
|
||||
match = strcmp(xpc_dictionary_get_string(response, "version"),
|
||||
PACKAGE_VERSION) == 0;
|
||||
}
|
||||
xpc_release(response);
|
||||
return match;
|
||||
}
|
||||
|
||||
- (bool)makeAndCheck:(CFStringRef)label
|
||||
{
|
||||
if (![self make:label])
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if ([self checkVersion])
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
xpc_connection_cancel(helper);
|
||||
helper = NULL;
|
||||
/* version outdated, uninstall old helper */
|
||||
[self manage:label bless:FALSE];
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
- (bool)blessAndMake:(CFStringRef)label
|
||||
{
|
||||
#ifdef DEBUG
|
||||
/* always update helper when debugging */
|
||||
[self manage:label bless:FALSE];
|
||||
[self manage:label bless:TRUE];
|
||||
#endif
|
||||
|
||||
if (![self makeAndCheck:label])
|
||||
{
|
||||
if ([self manage:label bless:TRUE])
|
||||
{
|
||||
[self makeAndCheck:label];
|
||||
}
|
||||
}
|
||||
return helper;
|
||||
}
|
||||
|
||||
- (xpc_connection_t)getConnection
|
||||
{
|
||||
if (!helper)
|
||||
{
|
||||
[self blessAndMake:CFSTR("org.strongswan.charon-xpc")];
|
||||
}
|
||||
return helper;
|
||||
}
|
||||
|
||||
- (NSString*)getError
|
||||
{
|
||||
return errmsg;
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
if (helper)
|
||||
{
|
||||
xpc_connection_cancel(helper);
|
||||
}
|
||||
if (auth)
|
||||
{
|
||||
AuthorizationFree(auth, kAuthorizationFlagDefaults);
|
||||
}
|
||||
if (errmsg)
|
||||
{
|
||||
[errmsg release];
|
||||
}
|
||||
[super dealloc];
|
||||
}
|
||||
@end
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
/**
|
||||
* Controller for a connection specific log Window
|
||||
*/
|
||||
@interface LogController : NSWindowController {
|
||||
/**
|
||||
* Text field for the log entries
|
||||
*/
|
||||
IBOutlet NSTextView *textView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the log window on the active Desktop
|
||||
*/
|
||||
- (void)show;
|
||||
|
||||
/**
|
||||
* Append a new log line to the log
|
||||
*
|
||||
* @param line log line to append
|
||||
*/
|
||||
- (void)appendLine:(NSString*)line;
|
||||
|
||||
/**
|
||||
* Clear the log window
|
||||
*/
|
||||
- (void)clear;
|
||||
|
||||
@end
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import "LogController.h"
|
||||
|
||||
@interface LogController ()
|
||||
|
||||
@end
|
||||
|
||||
@implementation LogController
|
||||
|
||||
- (void)appendLine:(NSString*)line
|
||||
{
|
||||
NSAttributedString* attr;
|
||||
|
||||
attr = [[NSAttributedString alloc] initWithString:line];
|
||||
[[textView textStorage] appendAttributedString:attr];
|
||||
[attr release];
|
||||
|
||||
attr = [[NSAttributedString alloc] initWithString:@"\n"];
|
||||
[[textView textStorage] appendAttributedString:attr];
|
||||
[attr release];
|
||||
|
||||
[textView scrollRangeToVisible:NSMakeRange([[textView string] length], 0)];
|
||||
}
|
||||
|
||||
- (void)clear
|
||||
{
|
||||
[textView setString:@""];
|
||||
}
|
||||
|
||||
- (void)show
|
||||
{
|
||||
[self showWindow:self];
|
||||
[[self window] makeKeyAndOrderFront:self];
|
||||
[[self window] orderFrontRegardless];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
/**
|
||||
* Controller for the EAP password dialog.
|
||||
*/
|
||||
@interface PasswordController : NSWindowController {
|
||||
|
||||
/**
|
||||
* Text field the user enters the password
|
||||
*/
|
||||
IBOutlet NSTextField *password;
|
||||
}
|
||||
|
||||
/**
|
||||
* Action invoked when the user confirms the password entry
|
||||
*/
|
||||
- (IBAction)confirm: (id)sender;
|
||||
|
||||
/**
|
||||
* Query the user for a password by invoking the modal dialog.
|
||||
*
|
||||
* @return password string, retained
|
||||
*/
|
||||
- (NSString*)query;
|
||||
|
||||
@end
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import "PasswordController.h"
|
||||
|
||||
@interface PasswordController ()
|
||||
|
||||
@end
|
||||
|
||||
@implementation PasswordController
|
||||
|
||||
- (void)moveWindowToActiveSpace
|
||||
{
|
||||
NSInteger behavior, old;
|
||||
|
||||
/* seems that NSWindowCollectionBehaviorMoveToActiveSpace does not work
|
||||
* when a window is opened a second time. Fix that by changing the
|
||||
* behavior forth and back. */
|
||||
old = behavior = [[self window] collectionBehavior];
|
||||
behavior &= ~NSWindowCollectionBehaviorMoveToActiveSpace;
|
||||
behavior |= NSWindowCollectionBehaviorCanJoinAllSpaces;
|
||||
|
||||
[[self window] setCollectionBehavior: behavior];
|
||||
[[self window] setCollectionBehavior: old];
|
||||
|
||||
[NSApp activateIgnoringOtherApps:YES];
|
||||
}
|
||||
|
||||
- (IBAction)confirm:(id)sender
|
||||
{
|
||||
[NSApp stopModal];
|
||||
}
|
||||
|
||||
- (NSString *)query
|
||||
{
|
||||
[password setStringValue:@""];
|
||||
[self moveWindowToActiveSpace];
|
||||
[NSApp runModalForWindow: [self window]];
|
||||
[[self window] orderOut: self];
|
||||
|
||||
return [[password stringValue] retain];
|
||||
}
|
||||
|
||||
@end
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,32 +0,0 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1265
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;\red0\green0\blue255;}
|
||||
\paperw11900\paperh16840\viewkind1\viewscale96
|
||||
\deftab720
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri0
|
||||
|
||||
\f0\fs24 \cf0 Based on the strongSwan Open Source project:\
|
||||
\
|
||||
{\field{\*\fldinst{HYPERLINK "http://www.strongswan.org"}}{\fldrslt \cf2 \ul \ulc2 http://www.strongswan.org}}\
|
||||
\
|
||||
The App and the
|
||||
\i charon-xpc
|
||||
\i0 privileged helper tool are licensed under the {\field{\*\fldinst{HYPERLINK "http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt"}}{\fldrslt \cf2 \ul \ulc2 General Public License Version 2}}. The strongSwan source code is available for download at:\
|
||||
\
|
||||
{\field{\*\fldinst{HYPERLINK "http://download.strongswan.org/"}}{\fldrslt \cf2 \ul \ulc2 http://download.strongswan.org/}}\
|
||||
\
|
||||
The App and the
|
||||
\i charon-xpc
|
||||
\i0 helper sources are not part of the main strongSwan distribution, but available separately under:\
|
||||
\
|
||||
{\field{\*\fldinst{HYPERLINK "http://download.strongswan.org/osx/"}}{\fldrslt \cf2 \ul \ulc2 http://download.strongswan.org/osx/}}\
|
||||
\
|
||||
The
|
||||
\i osx-sources
|
||||
\i0 tarball should get extracted into the strongSwan sources root directory. The
|
||||
\i README.md
|
||||
\i0 in
|
||||
\i src/frontends/osx
|
||||
\i0 has more information about building
|
||||
\i charon-xpc
|
||||
\i0 and the App.}
|
||||
@@ -1 +0,0 @@
|
||||
/* Localized versions of Info.plist keys */
|
||||
@@ -1,587 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">1080</int>
|
||||
<string key="IBDocument.SystemVersion">12D78</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">2840</string>
|
||||
<string key="IBDocument.AppKitVersion">1187.37</string>
|
||||
<string key="IBDocument.HIToolboxVersion">626.00</string>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="NS.object.0">2840</string>
|
||||
</object>
|
||||
<array key="IBDocument.IntegratedClassDependencies">
|
||||
<string>IBNSLayoutConstraint</string>
|
||||
<string>NSCustomObject</string>
|
||||
<string>NSScrollView</string>
|
||||
<string>NSScroller</string>
|
||||
<string>NSTextView</string>
|
||||
<string>NSView</string>
|
||||
<string>NSWindowTemplate</string>
|
||||
</array>
|
||||
<array key="IBDocument.PluginDependencies">
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</array>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
|
||||
<integer value="1" key="NS.object.0"/>
|
||||
</object>
|
||||
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<object class="NSCustomObject" id="1001">
|
||||
<string key="NSClassName">LogController</string>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="1003">
|
||||
<string key="NSClassName">FirstResponder</string>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="1004">
|
||||
<string key="NSClassName">NSApplication</string>
|
||||
</object>
|
||||
<object class="NSWindowTemplate" id="995804331">
|
||||
<int key="NSWindowStyleMask">15</int>
|
||||
<int key="NSWindowBacking">2</int>
|
||||
<string key="NSWindowRect">{{121, 123}, {547, 312}}</string>
|
||||
<int key="NSWTFlags">611845120</int>
|
||||
<string key="NSWindowTitle">Window</string>
|
||||
<string key="NSWindowClass">NSWindow</string>
|
||||
<nil key="NSViewClass"/>
|
||||
<nil key="NSUserInterfaceItemIdentifier"/>
|
||||
<object class="NSView" key="NSWindowView" id="875316202">
|
||||
<reference key="NSNextResponder"/>
|
||||
<int key="NSvFlags">256</int>
|
||||
<array class="NSMutableArray" key="NSSubviews">
|
||||
<object class="NSScrollView" id="12648948">
|
||||
<reference key="NSNextResponder" ref="875316202"/>
|
||||
<int key="NSvFlags">256</int>
|
||||
<array class="NSMutableArray" key="NSSubviews">
|
||||
<object class="NSClipView" id="710672467">
|
||||
<reference key="NSNextResponder" ref="12648948"/>
|
||||
<int key="NSvFlags">2304</int>
|
||||
<array class="NSMutableArray" key="NSSubviews">
|
||||
<object class="NSTextView" id="476923000">
|
||||
<reference key="NSNextResponder" ref="710672467"/>
|
||||
<int key="NSvFlags">2322</int>
|
||||
<string key="NSFrameSize">{525, 286}</string>
|
||||
<reference key="NSSuperview" ref="710672467"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="757345988"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:13</string>
|
||||
<object class="NSTextContainer" key="NSTextContainer" id="756204541">
|
||||
<object class="NSLayoutManager" key="NSLayoutManager">
|
||||
<object class="NSTextStorage" key="NSTextStorage">
|
||||
<object class="NSMutableString" key="NSString">
|
||||
<characters key="NS.bytes"/>
|
||||
</object>
|
||||
<nil key="NSDelegate"/>
|
||||
</object>
|
||||
<array class="NSMutableArray" key="NSTextContainers">
|
||||
<reference ref="756204541"/>
|
||||
</array>
|
||||
<int key="NSLMFlags">166</int>
|
||||
<nil key="NSDelegate"/>
|
||||
</object>
|
||||
<reference key="NSTextView" ref="476923000"/>
|
||||
<double key="NSWidth">525</double>
|
||||
<int key="NSTCFlags">1</int>
|
||||
</object>
|
||||
<object class="NSTextViewSharedData" key="NSSharedData">
|
||||
<int key="NSFlags">10593</int>
|
||||
<int key="NSTextCheckingTypes">0</int>
|
||||
<nil key="NSMarkedAttributes"/>
|
||||
<object class="NSColor" key="NSBackgroundColor" id="1072550816">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MQA</bytes>
|
||||
</object>
|
||||
<dictionary key="NSSelectedAttributes">
|
||||
<object class="NSColor" key="NSBackgroundColor">
|
||||
<int key="NSColorSpace">6</int>
|
||||
<string key="NSCatalogName">System</string>
|
||||
<string key="NSColorName">selectedTextBackgroundColor</string>
|
||||
<object class="NSColor" key="NSColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSColor" key="NSColor">
|
||||
<int key="NSColorSpace">6</int>
|
||||
<string key="NSCatalogName">System</string>
|
||||
<string key="NSColorName">selectedTextColor</string>
|
||||
<object class="NSColor" key="NSColor" id="120554890">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MAA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
</dictionary>
|
||||
<reference key="NSInsertionColor" ref="120554890"/>
|
||||
<dictionary key="NSLinkAttributes">
|
||||
<object class="NSColor" key="NSColor">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MCAwIDEAA</bytes>
|
||||
</object>
|
||||
<object class="NSCursor" key="NSCursor">
|
||||
<string key="NSHotSpot">{8, -8}</string>
|
||||
<int key="NSCursorType">13</int>
|
||||
</object>
|
||||
<integer value="1" key="NSUnderline"/>
|
||||
</dictionary>
|
||||
<object class="NSParagraphStyle" key="NSDefaultParagraphStyle">
|
||||
<int key="NSAlignment">4</int>
|
||||
<nil key="NSTabStops"/>
|
||||
<int key="NSWritingDirection">1</int>
|
||||
</object>
|
||||
<nil key="NSTextFinder"/>
|
||||
<int key="NSPreferredTextFinderStyle">1</int>
|
||||
</object>
|
||||
<int key="NSTVFlags">6</int>
|
||||
<string key="NSMaxSize">{548, 10000000}</string>
|
||||
<nil key="NSDelegate"/>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrame">{{1, 1}, {525, 286}}</string>
|
||||
<reference key="NSSuperview" ref="12648948"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="476923000"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:11</string>
|
||||
<reference key="NSDocView" ref="476923000"/>
|
||||
<reference key="NSBGColor" ref="1072550816"/>
|
||||
<object class="NSCursor" key="NSCursor">
|
||||
<string key="NSHotSpot">{4, 5}</string>
|
||||
<object class="NSImage" key="NSImage">
|
||||
<int key="NSImageFlags">12582912</int>
|
||||
<array class="NSMutableArray" key="NSReps">
|
||||
<array>
|
||||
<integer value="0"/>
|
||||
<object class="NSBitmapImageRep">
|
||||
<object class="NSData" key="NSTIFFRepresentation">
|
||||
<bytes key="NS.bytes">TU0AKgAAEAj///8A////qwAAAP8AAAD/AwMD/BYWFtIFBQVuAAAABv///wD///8E6+vrTGhoaLYtLS3p
|
||||
BAQE/QAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///+rAAAA/wAAAP8AAAD/AAAA/wAAAP8EBATSX19fK9HR0ZciIiLv
|
||||
AAAA/wAAAP8AAAD/AAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////CsPDw0CRkZG1FxcX9AAAAP8bGxvr
|
||||
ICAg8AAAAP8ICAjlFRUVVQAAAA////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wrm5uab
|
||||
FxcX9AAAAP8AAAD/AQEB3wAAAA////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///zaXl5fGAAAA/wAAAP8AAABR////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////CO7u7q8AAAD/AAAA/wAAAAz///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///+rAAAA/wAAAP////8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///6sAAAD/AAAA/////wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+r
|
||||
AAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///6sAAAD/AAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////qwAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///+rAAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///6sAAAD/AAAA/////wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/AAAA/wAAAP8AAAD/
|
||||
AAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+rAAAA/wAAAP8AAAD/
|
||||
AAAA/wAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////qwAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///+rAAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///6sAAAD/AAAA/////wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///+rAAAA/wAAAP////8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///6sAAAD/AAAA/////wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////qwAAAP8AAAD/
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+r
|
||||
AAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////CO7u7q8AAAD/AAAA/wAAAAz///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///80mpqaxQAAAP8AAAD/AAAATv///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////CuXl5ZYeHh7xAAAA/wAAAP8CAgLXAAAAD////wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////EKurq0mOjo63FxcX9AAAAP8bGxvrICAg8AAAAP8ICAjlHh4eXAAAABj///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////qwAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE1V9fXyvS0tKZICAg8AAAAP8AAAD/
|
||||
AAAA/wAAAP8AAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///+rAAAA/wAAAP8AAAD/FBQU1AUFBXEAAAAG////AP///wTr6+tO
|
||||
ZWVluC4uLuoAAAD/AAAA/wAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8AABABAAADAAAAAQAgAAABAQADAAAAAQAgAAABAgADAAAABAAA
|
||||
EM4BAwADAAAAAQABAAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAE
|
||||
AAABFgADAAAAAQAgAAABFwAEAAAAAQAAEAABGgAFAAAAAQAAENYBGwAFAAAAAQAAEN4BHAADAAAAAQAB
|
||||
AAABKAADAAAAAQACAAABUgADAAAAAQACAAABUwADAAAABAAAEOYAAAAAAAgACAAIAAgSAAAAACAAABIA
|
||||
AAAAIAAAAAEAAQABAAE</bytes>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
<array>
|
||||
<integer value="0"/>
|
||||
<object class="NSBitmapImageRep">
|
||||
<object class="NSData" key="NSTIFFRepresentation">
|
||||
<bytes key="NS.bytes">TU0AKgAABAj///9VQ0ND/wAAAP////8A////AP///6pDQ0P/AAAA/////wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///+qAAAA/////6oAAAD/////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///6oAAAD/////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///+qAAAA/////wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////qgAAAP////8A////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///6oAAAD/////AP///wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+qAAAA/////wD///8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////qgAAAP////8A
|
||||
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////qgAAAP8AAAD/
|
||||
AAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+q
|
||||
AAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////qgAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///6oAAAD/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///+qAAAA/////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////qgAAAP////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///8A////qgAAAP////+qAAAA/////wD///8A////AP///wD///8A////AP///wD///8A
|
||||
////AP///wD///9VQ0ND/wAAAP////8A////AP///6pDQ0P/AAAA/////wD///8A////AP///wD///8A
|
||||
////AP///wD///8AAA4BAAADAAAAAQAQAAABAQADAAAAAQAQAAABAgADAAAABAAABLYBAwADAAAAAQAB
|
||||
AAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQAQ
|
||||
AAABFwAEAAAAAQAABAABHAADAAAAAQABAAABUgADAAAAAQACAAABUwADAAAABAAABL6HcwAHAAAHqAAA
|
||||
BMYAAAAAAAgACAAIAAgAAQABAAEAAQAAB6hhcHBsAiAAAG1udHJSR0IgWFlaIAfZAAIAGQALABoAC2Fj
|
||||
c3BBUFBMAAAAAGFwcGwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2Rlc2MAAAEIAAAAb2RzY20AAAF4AAAFbGNw
|
||||
cnQAAAbkAAAAOHd0cHQAAAccAAAAFHJYWVoAAAcwAAAAFGdYWVoAAAdEAAAAFGJYWVoAAAdYAAAAFHJU
|
||||
UkMAAAdsAAAADmNoYWQAAAd8AAAALGJUUkMAAAdsAAAADmdUUkMAAAdsAAAADmRlc2MAAAAAAAAAFEdl
|
||||
bmVyaWMgUkdCIFByb2ZpbGUAAAAAAAAAAAAAABRHZW5lcmljIFJHQiBQcm9maWxlAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAB4AAAAMc2tTSwAA
|
||||
ACgAAAF4aHJIUgAAACgAAAGgY2FFUwAAACQAAAHIcHRCUgAAACYAAAHsdWtVQQAAACoAAAISZnJGVQAA
|
||||
ACgAAAI8emhUVwAAABYAAAJkaXRJVAAAACgAAAJ6bmJOTwAAACYAAAKia29LUgAAABYAAALIY3NDWgAA
|
||||
ACIAAALeaGVJTAAAAB4AAAMAZGVERQAAACwAAAMeaHVIVQAAACgAAANKc3ZTRQAAACYAAAKiemhDTgAA
|
||||
ABYAAANyamFKUAAAABoAAAOIcm9STwAAACQAAAOiZWxHUgAAACIAAAPGcHRQTwAAACYAAAPobmxOTAAA
|
||||
ACgAAAQOZXNFUwAAACYAAAPodGhUSAAAACQAAAQ2dHJUUgAAACIAAARaZmlGSQAAACgAAAR8cGxQTAAA
|
||||
ACwAAASkcnVSVQAAACIAAATQYXJFRwAAACYAAATyZW5VUwAAACYAAAUYZGFESwAAAC4AAAU+AFYBYQBl
|
||||
AG8AYgBlAGMAbgD9ACAAUgBHAEIAIABwAHIAbwBmAGkAbABHAGUAbgBlAHIAaQENAGsAaQAgAFIARwBC
|
||||
ACAAcAByAG8AZgBpAGwAUABlAHIAZgBpAGwAIABSAEcAQgAgAGcAZQBuAOgAcgBpAGMAUABlAHIAZgBp
|
||||
AGwAIABSAEcAQgAgAEcAZQBuAOkAcgBpAGMAbwQXBDAEMwQwBDsETAQ9BDgEOQAgBD8EQAQ+BEQEMAQ5
|
||||
BDsAIABSAEcAQgBQAHIAbwBmAGkAbAAgAGcA6QBuAOkAcgBpAHEAdQBlACAAUgBWAEKQGnUoACAAUgBH
|
||||
AEIAIIJyX2ljz4/wAFAAcgBvAGYAaQBsAG8AIABSAEcAQgAgAGcAZQBuAGUAcgBpAGMAbwBHAGUAbgBl
|
||||
AHIAaQBzAGsAIABSAEcAQgAtAHAAcgBvAGYAaQBsx3y8GAAgAFIARwBCACDVBLhc0wzHfABPAGIAZQBj
|
||||
AG4A/QAgAFIARwBCACAAcAByAG8AZgBpAGwF5AXoBdUF5AXZBdwAIABSAEcAQgAgBdsF3AXcBdkAQQBs
|
||||
AGwAZwBlAG0AZQBpAG4AZQBzACAAUgBHAEIALQBQAHIAbwBmAGkAbADBAGwAdABhAGwA4QBuAG8AcwAg
|
||||
AFIARwBCACAAcAByAG8AZgBpAGxmbpAaACAAUgBHAEIAIGPPj/Blh072TgCCLAAgAFIARwBCACAw1zDt
|
||||
MNUwoTCkMOsAUAByAG8AZgBpAGwAIABSAEcAQgAgAGcAZQBuAGUAcgBpAGMDkwO1A70DuQO6A8wAIAPA
|
||||
A8EDvwPGA68DuwAgAFIARwBCAFAAZQByAGYAaQBsACAAUgBHAEIAIABnAGUAbgDpAHIAaQBjAG8AQQBs
|
||||
AGcAZQBtAGUAZQBuACAAUgBHAEIALQBwAHIAbwBmAGkAZQBsDkIOGw4jDkQOHw4lDkwAIABSAEcAQgAg
|
||||
DhcOMQ5IDicORA4bAEcAZQBuAGUAbAAgAFIARwBCACAAUAByAG8AZgBpAGwAaQBZAGwAZQBpAG4AZQBu
|
||||
ACAAUgBHAEIALQBwAHIAbwBmAGkAaQBsAGkAVQBuAGkAdwBlAHIAcwBhAGwAbgB5ACAAcAByAG8AZgBp
|
||||
AGwAIABSAEcAQgQeBDEESQQ4BDkAIAQ/BEAEPgREBDgEOwRMACAAUgBHAEIGRQZEBkEAIAYqBjkGMQZK
|
||||
BkEAIABSAEcAQgAgBicGRAY5BicGRQBHAGUAbgBlAHIAaQBjACAAUgBHAEIAIABQAHIAbwBmAGkAbABl
|
||||
AEcAZQBuAGUAcgBlAGwAIABSAEcAQgAtAGIAZQBzAGsAcgBpAHYAZQBsAHMAZXRleHQAAAAAQ29weXJp
|
||||
Z2h0IDIwMDcgQXBwbGUgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4AWFlaIAAAAAAAAPNSAAEAAAAB
|
||||
Fs9YWVogAAAAAAAAdE0AAD3uAAAD0FhZWiAAAAAAAABadQAArHMAABc0WFlaIAAAAAAAACgaAAAVnwAA
|
||||
uDZjdXJ2AAAAAAAAAAEBzQAAc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAA
|
||||
wGw</bytes>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
</array>
|
||||
<object class="NSColor" key="NSColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MCAwAA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<int key="NScvFlags">4</int>
|
||||
</object>
|
||||
<object class="NSScroller" id="862774956">
|
||||
<reference key="NSNextResponder" ref="12648948"/>
|
||||
<int key="NSvFlags">256</int>
|
||||
<string key="NSFrame">{{510, 1}, {16, 286}}</string>
|
||||
<reference key="NSSuperview" ref="12648948"/>
|
||||
<reference key="NSWindow"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:83</string>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
<reference key="NSTarget" ref="12648948"/>
|
||||
<string key="NSAction">_doScroller:</string>
|
||||
<double key="NSCurValue">1</double>
|
||||
<double key="NSPercent">0.85256409645080566</double>
|
||||
</object>
|
||||
<object class="NSScroller" id="757345988">
|
||||
<reference key="NSNextResponder" ref="12648948"/>
|
||||
<int key="NSvFlags">256</int>
|
||||
<string key="NSFrame">{{1, 271}, {525, 16}}</string>
|
||||
<reference key="NSSuperview" ref="12648948"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="710672467"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:33</string>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
<int key="NSsFlags">1</int>
|
||||
<reference key="NSTarget" ref="12648948"/>
|
||||
<string key="NSAction">_doScroller:</string>
|
||||
<double key="NSCurValue">1</double>
|
||||
<double key="NSPercent">0.94565218687057495</double>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrame">{{10, 10}, {527, 288}}</string>
|
||||
<reference key="NSSuperview" ref="875316202"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="710672467"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<int key="NSsFlags">133170</int>
|
||||
<reference key="NSVScroller" ref="862774956"/>
|
||||
<reference key="NSHScroller" ref="757345988"/>
|
||||
<reference key="NSContentView" ref="710672467"/>
|
||||
<double key="NSMinMagnification">0.25</double>
|
||||
<double key="NSMaxMagnification">4</double>
|
||||
<double key="NSMagnification">1</double>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrameSize">{547, 312}</string>
|
||||
<reference key="NSSuperview"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="12648948"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:20</string>
|
||||
</object>
|
||||
<string key="NSScreenRect">{{0, 0}, {1366, 746}}</string>
|
||||
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
|
||||
<bool key="NSWindowIsRestorable">YES</bool>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<array class="NSMutableArray" key="connectionRecords">
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">textView</string>
|
||||
<reference key="source" ref="1001"/>
|
||||
<reference key="destination" ref="476923000"/>
|
||||
</object>
|
||||
<int key="connectionID">15</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">window</string>
|
||||
<reference key="source" ref="1001"/>
|
||||
<reference key="destination" ref="995804331"/>
|
||||
</object>
|
||||
<int key="connectionID">16</int>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<array key="orderedObjects">
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<array key="object" id="0"/>
|
||||
<reference key="children" ref="1000"/>
|
||||
<nil key="parent"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-2</int>
|
||||
<reference key="object" ref="1001"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">File's Owner</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-1</int>
|
||||
<reference key="object" ref="1003"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">First Responder</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-3</int>
|
||||
<reference key="object" ref="1004"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">Application</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">5</int>
|
||||
<reference key="object" ref="995804331"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<reference ref="875316202"/>
|
||||
</array>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">logWindow</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">6</int>
|
||||
<reference key="object" ref="875316202"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<reference ref="12648948"/>
|
||||
<object class="IBNSLayoutConstraint" id="1012392115">
|
||||
<reference key="firstItem" ref="12648948"/>
|
||||
<int key="firstAttribute">9</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="875316202"/>
|
||||
<int key="secondAttribute">9</int>
|
||||
<float key="multiplier">1</float>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">0.0</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="875316202"/>
|
||||
<int key="scoringType">5</int>
|
||||
<float key="scoringTypeFloat">22</float>
|
||||
<int key="contentType">2</int>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="543576754">
|
||||
<reference key="firstItem" ref="12648948"/>
|
||||
<int key="firstAttribute">3</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="875316202"/>
|
||||
<int key="secondAttribute">3</int>
|
||||
<float key="multiplier">1</float>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">14</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="875316202"/>
|
||||
<int key="scoringType">3</int>
|
||||
<float key="scoringTypeFloat">9</float>
|
||||
<int key="contentType">3</int>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="191511330">
|
||||
<reference key="firstItem" ref="875316202"/>
|
||||
<int key="firstAttribute">4</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="12648948"/>
|
||||
<int key="secondAttribute">4</int>
|
||||
<float key="multiplier">1</float>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">10</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="875316202"/>
|
||||
<int key="scoringType">3</int>
|
||||
<float key="scoringTypeFloat">9</float>
|
||||
<int key="contentType">3</int>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="878820173">
|
||||
<reference key="firstItem" ref="875316202"/>
|
||||
<int key="firstAttribute">6</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="12648948"/>
|
||||
<int key="secondAttribute">6</int>
|
||||
<float key="multiplier">1</float>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">10</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="875316202"/>
|
||||
<int key="scoringType">9</int>
|
||||
<float key="scoringTypeFloat">40</float>
|
||||
<int key="contentType">3</int>
|
||||
</object>
|
||||
</array>
|
||||
<reference key="parent" ref="995804331"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">7</int>
|
||||
<reference key="object" ref="12648948"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<reference ref="862774956"/>
|
||||
<reference ref="757345988"/>
|
||||
<reference ref="476923000"/>
|
||||
</array>
|
||||
<reference key="parent" ref="875316202"/>
|
||||
<string key="objectName">logView</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">12</int>
|
||||
<reference key="object" ref="862774956"/>
|
||||
<reference key="parent" ref="12648948"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">13</int>
|
||||
<reference key="object" ref="757345988"/>
|
||||
<reference key="parent" ref="12648948"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">14</int>
|
||||
<reference key="object" ref="476923000"/>
|
||||
<reference key="parent" ref="12648948"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">45</int>
|
||||
<reference key="object" ref="878820173"/>
|
||||
<reference key="parent" ref="875316202"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">47</int>
|
||||
<reference key="object" ref="191511330"/>
|
||||
<reference key="parent" ref="875316202"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">48</int>
|
||||
<reference key="object" ref="543576754"/>
|
||||
<reference key="parent" ref="875316202"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">49</int>
|
||||
<reference key="object" ref="1012392115"/>
|
||||
<reference key="parent" ref="875316202"/>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="12.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="13.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="14.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="45.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="47.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="48.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="49.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<boolean value="NO" key="5.NSWindowTemplate.visibleAtLaunch"/>
|
||||
<array class="NSMutableArray" key="6.IBNSViewMetadataConstraints">
|
||||
<reference ref="878820173"/>
|
||||
<reference ref="191511330"/>
|
||||
<reference ref="543576754"/>
|
||||
<reference ref="1012392115"/>
|
||||
</array>
|
||||
<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<boolean value="NO" key="7.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||
<string key="7.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
||||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">49</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">LogController</string>
|
||||
<string key="superclassName">NSWindowController</string>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<string key="NS.key.0">textView</string>
|
||||
<string key="NS.object.0">NSTextView</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<string key="NS.key.0">textView</string>
|
||||
<object class="IBToOneOutletInfo" key="NS.object.0">
|
||||
<string key="name">textView</string>
|
||||
<string key="candidateClassName">NSTextView</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/LogController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
|
||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
<bool key="IBDocument.UseAutolayout">YES</bool>
|
||||
</data>
|
||||
</archive>
|
||||
@@ -1,277 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">1080</int>
|
||||
<string key="IBDocument.SystemVersion">12D78</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">2840</string>
|
||||
<string key="IBDocument.AppKitVersion">1187.37</string>
|
||||
<string key="IBDocument.HIToolboxVersion">626.00</string>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="NS.object.0">2840</string>
|
||||
</object>
|
||||
<array key="IBDocument.IntegratedClassDependencies">
|
||||
<string>NSCustomObject</string>
|
||||
<string>NSMenu</string>
|
||||
<string>NSMenuItem</string>
|
||||
</array>
|
||||
<array key="IBDocument.PluginDependencies">
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</array>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
|
||||
<integer value="1" key="NS.object.0"/>
|
||||
</object>
|
||||
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1048">
|
||||
<object class="NSCustomObject" id="1021">
|
||||
<string key="NSClassName">NSApplication</string>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="1014">
|
||||
<string key="NSClassName">FirstResponder</string>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="1050">
|
||||
<string key="NSClassName">NSApplication</string>
|
||||
</object>
|
||||
<object class="NSMenu" id="616737697">
|
||||
<string key="NSTitle"/>
|
||||
<array class="NSMutableArray" key="NSMenuItems">
|
||||
<object class="NSMenuItem" id="325430392">
|
||||
<reference key="NSMenu" ref="616737697"/>
|
||||
<bool key="NSIsDisabled">YES</bool>
|
||||
<bool key="NSIsSeparator">YES</bool>
|
||||
<string key="NSTitle"/>
|
||||
<string key="NSKeyEquiv"/>
|
||||
<int key="NSMnemonicLoc">2147483647</int>
|
||||
<object class="NSCustomResource" key="NSOnImage" id="399365745">
|
||||
<string key="NSClassName">NSImage</string>
|
||||
<string key="NSResourceName">NSMenuCheckmark</string>
|
||||
</object>
|
||||
<object class="NSCustomResource" key="NSMixedImage" id="358256706">
|
||||
<string key="NSClassName">NSImage</string>
|
||||
<string key="NSResourceName">NSMenuMixedState</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMenuItem" id="438443409">
|
||||
<reference key="NSMenu" ref="616737697"/>
|
||||
<string key="NSTitle">Add connection...</string>
|
||||
<string key="NSKeyEquiv"/>
|
||||
<int key="NSMnemonicLoc">2147483647</int>
|
||||
<reference key="NSOnImage" ref="399365745"/>
|
||||
<reference key="NSMixedImage" ref="358256706"/>
|
||||
</object>
|
||||
<object class="NSMenuItem" id="124555692">
|
||||
<reference key="NSMenu" ref="616737697"/>
|
||||
<string key="NSTitle">About</string>
|
||||
<string key="NSKeyEquiv"/>
|
||||
<int key="NSMnemonicLoc">2147483647</int>
|
||||
<reference key="NSOnImage" ref="399365745"/>
|
||||
<reference key="NSMixedImage" ref="358256706"/>
|
||||
</object>
|
||||
<object class="NSMenuItem" id="198783502">
|
||||
<reference key="NSMenu" ref="616737697"/>
|
||||
<string key="NSTitle">Quit</string>
|
||||
<string key="NSKeyEquiv"/>
|
||||
<int key="NSMnemonicLoc">2147483647</int>
|
||||
<reference key="NSOnImage" ref="399365745"/>
|
||||
<reference key="NSMixedImage" ref="358256706"/>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="976324537">
|
||||
<string key="NSClassName">AppDelegate</string>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="755631768">
|
||||
<string key="NSClassName">NSFontManager</string>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<array class="NSMutableArray" key="connectionRecords">
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBActionConnection" key="connection">
|
||||
<string key="label">terminate:</string>
|
||||
<reference key="source" ref="1050"/>
|
||||
<reference key="destination" ref="198783502"/>
|
||||
</object>
|
||||
<int key="connectionID">559</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBActionConnection" key="connection">
|
||||
<string key="label">orderFrontStandardAboutPanel:</string>
|
||||
<reference key="source" ref="1050"/>
|
||||
<reference key="destination" ref="124555692"/>
|
||||
</object>
|
||||
<int key="connectionID">560</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">delegate</string>
|
||||
<reference key="source" ref="1021"/>
|
||||
<reference key="destination" ref="976324537"/>
|
||||
</object>
|
||||
<int key="connectionID">495</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">statusMenu</string>
|
||||
<reference key="source" ref="976324537"/>
|
||||
<reference key="destination" ref="616737697"/>
|
||||
</object>
|
||||
<int key="connectionID">550</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBActionConnection" key="connection">
|
||||
<string key="label">addConnection:</string>
|
||||
<reference key="source" ref="976324537"/>
|
||||
<reference key="destination" ref="438443409"/>
|
||||
</object>
|
||||
<int key="connectionID">561</int>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<array key="orderedObjects">
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<array key="object" id="0"/>
|
||||
<reference key="children" ref="1048"/>
|
||||
<nil key="parent"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-2</int>
|
||||
<reference key="object" ref="1021"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">File's Owner</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-1</int>
|
||||
<reference key="object" ref="1014"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">First Responder</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-3</int>
|
||||
<reference key="object" ref="1050"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">Application</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">420</int>
|
||||
<reference key="object" ref="755631768"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">494</int>
|
||||
<reference key="object" ref="976324537"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">536</int>
|
||||
<reference key="object" ref="616737697"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<reference ref="198783502"/>
|
||||
<reference ref="124555692"/>
|
||||
<reference ref="325430392"/>
|
||||
<reference ref="438443409"/>
|
||||
</array>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">statusMenu</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">538</int>
|
||||
<reference key="object" ref="198783502"/>
|
||||
<reference key="parent" ref="616737697"/>
|
||||
<string key="objectName">quitItem</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">547</int>
|
||||
<reference key="object" ref="124555692"/>
|
||||
<reference key="parent" ref="616737697"/>
|
||||
<string key="objectName">aboutItem</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">557</int>
|
||||
<reference key="object" ref="325430392"/>
|
||||
<reference key="parent" ref="616737697"/>
|
||||
<string key="objectName">connSeparator</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">558</int>
|
||||
<reference key="object" ref="438443409"/>
|
||||
<reference key="parent" ref="616737697"/>
|
||||
<string key="objectName">addItem</string>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="494.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="547.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="557.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="558.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
||||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">780</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">AppDelegate</string>
|
||||
<string key="superclassName">NSObject</string>
|
||||
<dictionary class="NSMutableDictionary" key="actions">
|
||||
<string key="addConnection:">id</string>
|
||||
<string key="confirmPassword:">id</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||
<object class="IBActionInfo" key="addConnection:">
|
||||
<string key="name">addConnection:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
<object class="IBActionInfo" key="confirmPassword:">
|
||||
<string key="name">confirmPassword:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="outlets">
|
||||
<string key="password">NSTextField</string>
|
||||
<string key="passwordDialog">NSWindow</string>
|
||||
<string key="statusMenu">NSMenu</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<object class="IBToOneOutletInfo" key="password">
|
||||
<string key="name">password</string>
|
||||
<string key="candidateClassName">NSTextField</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="passwordDialog">
|
||||
<string key="name">passwordDialog</string>
|
||||
<string key="candidateClassName">NSWindow</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo" key="statusMenu">
|
||||
<string key="name">statusMenu</string>
|
||||
<string key="candidateClassName">NSMenu</string>
|
||||
</object>
|
||||
</dictionary>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/AppDelegate.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
|
||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
<dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
|
||||
<string key="NSMenuCheckmark">{11, 11}</string>
|
||||
<string key="NSMenuMixedState">{10, 3}</string>
|
||||
</dictionary>
|
||||
<bool key="IBDocument.UseAutolayout">YES</bool>
|
||||
</data>
|
||||
</archive>
|
||||
@@ -1,578 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">1070</int>
|
||||
<string key="IBDocument.SystemVersion">14B25</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">6254</string>
|
||||
<string key="IBDocument.AppKitVersion">1343.16</string>
|
||||
<string key="IBDocument.HIToolboxVersion">755.00</string>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="NS.object.0">6254</string>
|
||||
</object>
|
||||
<array key="IBDocument.IntegratedClassDependencies">
|
||||
<string>IBNSLayoutConstraint</string>
|
||||
<string>NSButton</string>
|
||||
<string>NSButtonCell</string>
|
||||
<string>NSCustomObject</string>
|
||||
<string>NSSecureTextField</string>
|
||||
<string>NSSecureTextFieldCell</string>
|
||||
<string>NSTextField</string>
|
||||
<string>NSTextFieldCell</string>
|
||||
<string>NSView</string>
|
||||
<string>NSWindowTemplate</string>
|
||||
</array>
|
||||
<array key="IBDocument.PluginDependencies">
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</array>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
|
||||
<integer value="1" key="NS.object.0"/>
|
||||
</object>
|
||||
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<object class="NSCustomObject" id="1001">
|
||||
<string key="NSClassName">PasswordController</string>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="1003">
|
||||
<string key="NSClassName">FirstResponder</string>
|
||||
</object>
|
||||
<object class="NSCustomObject" id="1004">
|
||||
<string key="NSClassName">NSApplication</string>
|
||||
</object>
|
||||
<object class="NSWindowTemplate" id="114195528">
|
||||
<int key="NSWindowStyleMask">1</int>
|
||||
<int key="NSWindowBacking">2</int>
|
||||
<string key="NSWindowRect">{{121, 123}, {246, 91}}</string>
|
||||
<int key="NSWTFlags">611845120</int>
|
||||
<string key="NSWindowTitle">Password required</string>
|
||||
<string key="NSWindowClass">NSWindow</string>
|
||||
<nil key="NSViewClass"/>
|
||||
<nil key="NSUserInterfaceItemIdentifier"/>
|
||||
<object class="NSView" key="NSWindowView" id="7448341">
|
||||
<reference key="NSNextResponder"/>
|
||||
<int key="NSvFlags">256</int>
|
||||
<array class="NSMutableArray" key="NSSubviews">
|
||||
<object class="NSSecureTextField" id="799423857">
|
||||
<reference key="NSNextResponder" ref="7448341"/>
|
||||
<int key="NSvFlags">268</int>
|
||||
<string key="NSFrame">{{98, 51}, {128, 22}}</string>
|
||||
<reference key="NSSuperview" ref="7448341"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="302090053"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSSecureTextFieldCell" key="NSCell" id="450546837">
|
||||
<int key="NSCellFlags">342884416</int>
|
||||
<int key="NSCellFlags2">272630848</int>
|
||||
<string key="NSContents"/>
|
||||
<object class="NSFont" key="NSSupport" id="735681452">
|
||||
<bool key="IBIsSystemFont">YES</bool>
|
||||
<double key="NSSize">13</double>
|
||||
<int key="NSfFlags">1044</int>
|
||||
</object>
|
||||
<string key="NSCellIdentifier">_NS:9</string>
|
||||
<reference key="NSControlView" ref="799423857"/>
|
||||
<bool key="NSDrawsBackground">YES</bool>
|
||||
<object class="NSColor" key="NSBackgroundColor">
|
||||
<int key="NSColorSpace">6</int>
|
||||
<string key="NSCatalogName">System</string>
|
||||
<string key="NSColorName">textBackgroundColor</string>
|
||||
<object class="NSColor" key="NSColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MQA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSColor" key="NSTextColor">
|
||||
<int key="NSColorSpace">6</int>
|
||||
<string key="NSCatalogName">System</string>
|
||||
<string key="NSColorName">textColor</string>
|
||||
<object class="NSColor" key="NSColor" id="709375487">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MAA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<array key="NSAllowedInputLocales">
|
||||
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
|
||||
</array>
|
||||
</object>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
<int key="NSTextFieldAlignmentRectInsetsVersion">1</int>
|
||||
</object>
|
||||
<object class="NSTextField" id="101537030">
|
||||
<reference key="NSNextResponder" ref="7448341"/>
|
||||
<int key="NSvFlags">268</int>
|
||||
<string key="NSFrame">{{21, 54}, {69, 17}}</string>
|
||||
<reference key="NSSuperview" ref="7448341"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="799423857"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:1535</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="839790140">
|
||||
<int key="NSCellFlags">68157504</int>
|
||||
<int key="NSCellFlags2">272630784</int>
|
||||
<string key="NSContents">Password:</string>
|
||||
<reference key="NSSupport" ref="735681452"/>
|
||||
<string key="NSCellIdentifier">_NS:1535</string>
|
||||
<reference key="NSControlView" ref="101537030"/>
|
||||
<object class="NSColor" key="NSBackgroundColor">
|
||||
<int key="NSColorSpace">6</int>
|
||||
<string key="NSCatalogName">System</string>
|
||||
<string key="NSColorName">controlColor</string>
|
||||
<object class="NSColor" key="NSColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSColor" key="NSTextColor">
|
||||
<int key="NSColorSpace">6</int>
|
||||
<string key="NSCatalogName">System</string>
|
||||
<string key="NSColorName">controlTextColor</string>
|
||||
<reference key="NSColor" ref="709375487"/>
|
||||
</object>
|
||||
</object>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
<int key="NSTextFieldAlignmentRectInsetsVersion">1</int>
|
||||
</object>
|
||||
<object class="NSButton" id="302090053">
|
||||
<reference key="NSNextResponder" ref="7448341"/>
|
||||
<int key="NSvFlags">268</int>
|
||||
<string key="NSFrame">{{144, 13}, {88, 32}}</string>
|
||||
<reference key="NSSuperview" ref="7448341"/>
|
||||
<reference key="NSWindow"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSButtonCell" key="NSCell" id="202290476">
|
||||
<int key="NSCellFlags">67108864</int>
|
||||
<int key="NSCellFlags2">134217728</int>
|
||||
<string key="NSContents">OK</string>
|
||||
<reference key="NSSupport" ref="735681452"/>
|
||||
<string key="NSCellIdentifier">_NS:9</string>
|
||||
<reference key="NSControlView" ref="302090053"/>
|
||||
<int key="NSButtonFlags">-2038284288</int>
|
||||
<int key="NSButtonFlags2">129</int>
|
||||
<string key="NSAlternateContents"/>
|
||||
<string type="base64-UTF8" key="NSKeyEquivalent">DQ</string>
|
||||
<int key="NSPeriodicDelay">200</int>
|
||||
<int key="NSPeriodicInterval">25</int>
|
||||
</object>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
</array>
|
||||
<string key="NSFrameSize">{246, 91}</string>
|
||||
<reference key="NSSuperview"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="101537030"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:20</string>
|
||||
</object>
|
||||
<string key="NSScreenRect">{{0, 0}, {1366, 745}}</string>
|
||||
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
|
||||
<int key="NSWindowCollectionBehavior">2</int>
|
||||
<bool key="NSWindowIsRestorable">YES</bool>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<array key="connectionRecords">
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">password</string>
|
||||
<reference key="source" ref="1001"/>
|
||||
<reference key="destination" ref="799423857"/>
|
||||
</object>
|
||||
<int key="connectionID">21</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">window</string>
|
||||
<reference key="source" ref="1001"/>
|
||||
<reference key="destination" ref="114195528"/>
|
||||
</object>
|
||||
<int key="connectionID">22</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBActionConnection" key="connection">
|
||||
<string key="label">confirm:</string>
|
||||
<reference key="source" ref="1001"/>
|
||||
<reference key="destination" ref="302090053"/>
|
||||
</object>
|
||||
<int key="connectionID">23</int>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<array key="orderedObjects">
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<array key="object" id="0"/>
|
||||
<reference key="children" ref="1000"/>
|
||||
<nil key="parent"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-2</int>
|
||||
<reference key="object" ref="1001"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">File's Owner</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-1</int>
|
||||
<reference key="object" ref="1003"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">First Responder</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-3</int>
|
||||
<reference key="object" ref="1004"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">Application</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">5</int>
|
||||
<reference key="object" ref="114195528"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<reference ref="7448341"/>
|
||||
</array>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">passwordDialog</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">6</int>
|
||||
<reference key="object" ref="7448341"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<reference ref="302090053"/>
|
||||
<reference ref="799423857"/>
|
||||
<reference ref="101537030"/>
|
||||
<object class="IBNSLayoutConstraint" id="716977026">
|
||||
<reference key="firstItem" ref="101537030"/>
|
||||
<int key="firstAttribute">5</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="7448341"/>
|
||||
<int key="secondAttribute">5</int>
|
||||
<float key="multiplier">1</float>
|
||||
<string key="multiplierString">1</string>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">23</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="7448341"/>
|
||||
<int key="scoringType">3</int>
|
||||
<float key="scoringTypeFloat">9</float>
|
||||
<int key="contentType">3</int>
|
||||
<bool key="placeholder">NO</bool>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="173643459">
|
||||
<reference key="firstItem" ref="101537030"/>
|
||||
<int key="firstAttribute">3</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="7448341"/>
|
||||
<int key="secondAttribute">3</int>
|
||||
<float key="multiplier">1</float>
|
||||
<string key="multiplierString">1</string>
|
||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
||||
<double key="value">20</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="7448341"/>
|
||||
<int key="scoringType">0</int>
|
||||
<float key="scoringTypeFloat">29</float>
|
||||
<int key="contentType">3</int>
|
||||
<bool key="placeholder">NO</bool>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="291011649">
|
||||
<reference key="firstItem" ref="799423857"/>
|
||||
<int key="firstAttribute">10</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="101537030"/>
|
||||
<int key="secondAttribute">10</int>
|
||||
<float key="multiplier">1</float>
|
||||
<string key="multiplierString">1</string>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">0.0</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="7448341"/>
|
||||
<int key="scoringType">6</int>
|
||||
<float key="scoringTypeFloat">24</float>
|
||||
<int key="contentType">2</int>
|
||||
<bool key="placeholder">NO</bool>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="890267046">
|
||||
<reference key="firstItem" ref="7448341"/>
|
||||
<int key="firstAttribute">6</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="799423857"/>
|
||||
<int key="secondAttribute">6</int>
|
||||
<float key="multiplier">1</float>
|
||||
<string key="multiplierString">1</string>
|
||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
||||
<double key="value">20</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="7448341"/>
|
||||
<int key="scoringType">0</int>
|
||||
<float key="scoringTypeFloat">29</float>
|
||||
<int key="contentType">3</int>
|
||||
<bool key="placeholder">NO</bool>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="215068406">
|
||||
<reference key="firstItem" ref="7448341"/>
|
||||
<int key="firstAttribute">6</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="302090053"/>
|
||||
<int key="secondAttribute">6</int>
|
||||
<float key="multiplier">1</float>
|
||||
<string key="multiplierString">1</string>
|
||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
||||
<double key="value">20</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="7448341"/>
|
||||
<int key="scoringType">0</int>
|
||||
<float key="scoringTypeFloat">29</float>
|
||||
<int key="contentType">3</int>
|
||||
<bool key="placeholder">NO</bool>
|
||||
</object>
|
||||
<object class="IBNSLayoutConstraint" id="359266808">
|
||||
<reference key="firstItem" ref="7448341"/>
|
||||
<int key="firstAttribute">4</int>
|
||||
<int key="relation">0</int>
|
||||
<reference key="secondItem" ref="302090053"/>
|
||||
<int key="secondAttribute">4</int>
|
||||
<float key="multiplier">1</float>
|
||||
<string key="multiplierString">1</string>
|
||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
||||
<double key="value">20</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="7448341"/>
|
||||
<int key="scoringType">0</int>
|
||||
<float key="scoringTypeFloat">29</float>
|
||||
<int key="contentType">3</int>
|
||||
<bool key="placeholder">NO</bool>
|
||||
</object>
|
||||
</array>
|
||||
<reference key="parent" ref="114195528"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">7</int>
|
||||
<reference key="object" ref="302090053"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<object class="IBNSLayoutConstraint" id="612120711">
|
||||
<reference key="firstItem" ref="302090053"/>
|
||||
<int key="firstAttribute">7</int>
|
||||
<int key="relation">0</int>
|
||||
<nil key="secondItem"/>
|
||||
<int key="secondAttribute">0</int>
|
||||
<float key="multiplier">1</float>
|
||||
<string key="multiplierString">1</string>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">76</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="302090053"/>
|
||||
<int key="scoringType">3</int>
|
||||
<float key="scoringTypeFloat">9</float>
|
||||
<int key="contentType">1</int>
|
||||
<bool key="placeholder">NO</bool>
|
||||
</object>
|
||||
<reference ref="202290476"/>
|
||||
</array>
|
||||
<reference key="parent" ref="7448341"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">8</int>
|
||||
<reference key="object" ref="799423857"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<object class="IBNSLayoutConstraint" id="234306912">
|
||||
<reference key="firstItem" ref="799423857"/>
|
||||
<int key="firstAttribute">7</int>
|
||||
<int key="relation">0</int>
|
||||
<nil key="secondItem"/>
|
||||
<int key="secondAttribute">0</int>
|
||||
<float key="multiplier">1</float>
|
||||
<string key="multiplierString">1</string>
|
||||
<object class="IBLayoutConstant" key="constant">
|
||||
<double key="value">128</double>
|
||||
</object>
|
||||
<float key="priority">1000</float>
|
||||
<reference key="containingView" ref="799423857"/>
|
||||
<int key="scoringType">3</int>
|
||||
<float key="scoringTypeFloat">9</float>
|
||||
<int key="contentType">1</int>
|
||||
<bool key="placeholder">NO</bool>
|
||||
</object>
|
||||
<reference ref="450546837"/>
|
||||
</array>
|
||||
<reference key="parent" ref="7448341"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">9</int>
|
||||
<reference key="object" ref="101537030"/>
|
||||
<array class="NSMutableArray" key="children">
|
||||
<reference ref="839790140"/>
|
||||
</array>
|
||||
<reference key="parent" ref="7448341"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">10</int>
|
||||
<reference key="object" ref="716977026"/>
|
||||
<reference key="parent" ref="7448341"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">11</int>
|
||||
<reference key="object" ref="173643459"/>
|
||||
<reference key="parent" ref="7448341"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">12</int>
|
||||
<reference key="object" ref="291011649"/>
|
||||
<reference key="parent" ref="7448341"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">13</int>
|
||||
<reference key="object" ref="890267046"/>
|
||||
<reference key="parent" ref="7448341"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">14</int>
|
||||
<reference key="object" ref="215068406"/>
|
||||
<reference key="parent" ref="7448341"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">15</int>
|
||||
<reference key="object" ref="359266808"/>
|
||||
<reference key="parent" ref="7448341"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">16</int>
|
||||
<reference key="object" ref="839790140"/>
|
||||
<reference key="parent" ref="101537030"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">17</int>
|
||||
<reference key="object" ref="234306912"/>
|
||||
<reference key="parent" ref="799423857"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">18</int>
|
||||
<reference key="object" ref="450546837"/>
|
||||
<reference key="parent" ref="799423857"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">19</int>
|
||||
<reference key="object" ref="612120711"/>
|
||||
<reference key="parent" ref="302090053"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">20</int>
|
||||
<reference key="object" ref="202290476"/>
|
||||
<reference key="parent" ref="302090053"/>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="10.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="11.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="12.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="13.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="14.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="15.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="16.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="17.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="18.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="20.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<boolean value="NO" key="5.NSWindowTemplate.visibleAtLaunch"/>
|
||||
<array class="NSMutableArray" key="6.IBNSViewMetadataConstraints">
|
||||
<reference ref="716977026"/>
|
||||
<reference ref="173643459"/>
|
||||
<reference ref="291011649"/>
|
||||
<reference ref="890267046"/>
|
||||
<reference ref="215068406"/>
|
||||
<reference ref="359266808"/>
|
||||
</array>
|
||||
<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<array key="7.IBNSViewMetadataConstraints">
|
||||
<reference ref="612120711"/>
|
||||
</array>
|
||||
<boolean value="NO" key="7.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||
<string key="7.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<array class="NSMutableArray" key="8.IBNSViewMetadataConstraints">
|
||||
<reference ref="234306912"/>
|
||||
</array>
|
||||
<boolean value="NO" key="8.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||
<string key="8.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<boolean value="NO" key="9.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||
<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
||||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">23</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">PasswordController</string>
|
||||
<string key="superclassName">NSWindowController</string>
|
||||
<object class="NSMutableDictionary" key="actions">
|
||||
<string key="NS.key.0">confirm:</string>
|
||||
<string key="NS.object.0">id</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="actionInfosByName">
|
||||
<string key="NS.key.0">confirm:</string>
|
||||
<object class="IBActionInfo" key="NS.object.0">
|
||||
<string key="name">confirm:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<string key="NS.key.0">password</string>
|
||||
<string key="NS.object.0">NSTextField</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||
<string key="NS.key.0">password</string>
|
||||
<object class="IBToOneOutletInfo" key="NS.object.0">
|
||||
<string key="name">password</string>
|
||||
<string key="candidateClassName">NSTextField</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">../strongSwan/PasswordController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">PasswordController</string>
|
||||
<object class="NSMutableDictionary" key="actions">
|
||||
<string key="NS.key.0">confirm:</string>
|
||||
<string key="NS.object.0">id</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="actionInfosByName">
|
||||
<string key="NS.key.0">confirm:</string>
|
||||
<object class="IBActionInfo" key="NS.object.0">
|
||||
<string key="name">confirm:</string>
|
||||
<string key="candidateClassName">id</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">../strongSwan/PasswordController.m</string>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
|
||||
<bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">NO</bool>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
|
||||
<integer value="4600" key="NS.object.0"/>
|
||||
</object>
|
||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
<bool key="IBDocument.UseAutolayout">YES</bool>
|
||||
</data>
|
||||
</archive>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 401 B |
Binary file not shown.
|
Before Width: | Height: | Size: 413 B |
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 467 B |
@@ -1,22 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return NSApplicationMain(argc, (const char **)argv);
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>icon-large.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>org.strongswan.osx</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>strongSwan OS X App</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>5.3.2</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.utilities</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
|
||||
<key>LSUIElement</key>
|
||||
<true/>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2013 revosec AG. All rights reserved.</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
<key>SMPrivilegedExecutables</key>
|
||||
<dict>
|
||||
<key>org.strongswan.charon-xpc</key>
|
||||
<string>identifier "org.strongswan.charon-xpc" and certificate leaf[subject.CN] = "Developer ID Application: revosec AG (SRXT3TB2PY)"</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,7 +0,0 @@
|
||||
//
|
||||
// Prefix header for all source files of the 'strongSwan' target in the 'strongSwan' project
|
||||
//
|
||||
|
||||
#ifdef __OBJC__
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#endif
|
||||
Reference in New Issue
Block a user