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:
Tobias Brunner
2026-07-24 14:59:55 +02:00
parent 60846f24bf
commit ceae73cb04
37 changed files with 0 additions and 6547 deletions
-2
View File
@@ -1,2 +0,0 @@
xcuserdata
*.xcworkspace
-107
View File
@@ -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>
-227
View File
@@ -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();
}
-546
View File
@@ -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_ @}*/
-362
View File
@@ -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_ @}*/
-97
View File
@@ -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;
}
-62
View File
@@ -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
-359
View File
@@ -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
-96
View File
@@ -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
-259
View File
@@ -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
-42
View File
@@ -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
-224
View File
@@ -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

-22
View File
@@ -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