Merge branch 'osx-app'

Mainline the OS X App providing the graphical user interface for the charon-xpc
privileged helper.
This commit is contained in:
Martin Willi
2014-12-18 09:50:50 +01:00
34 changed files with 4742 additions and 21 deletions
+15 -9
View File
@@ -4,8 +4,8 @@
The strongSwan OS X App consists of two components: The strongSwan OS X App consists of two components:
* A frontend to configure and control connections * A frontend App to configure and control connections (under strongSwan)
* A privileged helper daemon, controlled using XPC, called charon-xpc * A privileged helper daemon, controlled using XPC (under charon-xpc)
The privileged helper daemon gets installed automatically using SMJobBless The privileged helper daemon gets installed automatically using SMJobBless
functionality on its first use, and gets started automatically by Launchd when functionality on its first use, and gets started automatically by Launchd when
@@ -13,10 +13,10 @@ needed.
charon-xpc is a special build linking statically against strongSwan components. charon-xpc is a special build linking statically against strongSwan components.
charon-xpc sources are not part of the official strongSwan distribution. Build charon-xpc and the App sources are currently not part of the official strongSwan
the charon-xpc tarball with: distribution. Build the charon-xpc tarball with:
git archive -o charon-xpc-$(grep AC_INIT configure.ac | \ git archive -o osx-sources-$(grep AC_INIT configure.ac | \
cut -d '[' -f3 | cut -d ']' -f1).tar.bz2 \ cut -d '[' -f3 | cut -d ']' -f1).tar.bz2 \
HEAD src/frontends/osx HEAD src/frontends/osx
@@ -25,7 +25,7 @@ the charon-xpc tarball with:
Before building the Xcode project, the strongSwan base tree must be built using 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: a monolithic and static build. This can be achieved on OS X by using:
CFLAGS="-O2 -Wall -Wno-format -Wno-pointer-sign -Wno-deprecated-declarations" \ CFLAGS="-O2 -g -Wall -Wno-format -Wno-pointer-sign -Wno-deprecated-declarations" \
./configure --enable-monolithic --disable-shared --enable-static \ ./configure --enable-monolithic --disable-shared --enable-static \
--disable-defaults \ --disable-defaults \
--enable-openssl --enable-kernel-libipsec --enable-kernel-pfroute \ --enable-openssl --enable-kernel-libipsec --enable-kernel-pfroute \
@@ -38,11 +38,17 @@ a monolithic and static build. This can be achieved on OS X by using:
followed by calling make (no need to make install). followed by calling make (no need to make install).
Building charon-xpc using the Xcode project yields a single binary without Building charon-xpc using the Xcode project yields a single binary without
any non OS X dependencies. 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 Both charon-xpc and the App must be code-signed to allow the installation of
the privileged helper. git-grep for "Joe Developer" to change the signing the privileged helper. By default both targets use the _Developer ID: *_
identity. 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 ## ## XPC application protocol ##
@@ -12,7 +12,7 @@
<string>1.0</string> <string>1.0</string>
<key>SMAuthorizedClients</key> <key>SMAuthorizedClients</key>
<array> <array>
<string>identifier org.strongswan.osx and certificate leaf[subject.CN] = "Joe Developer"</string> <string>identifier org.strongswan.osx and certificate leaf[subject.CN] = "Developer ID Application: revosec AG (SRXT3TB2PY)"</string>
</array> </array>
</dict> </dict>
</plist> </plist>
+24
View File
@@ -122,6 +122,29 @@ static void segv_handler(int signal)
abort(); 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. * Main function, starts the daemon.
*/ */
@@ -204,5 +227,6 @@ int main(int argc, char *argv[])
atexit(dispatcher_cleanup); atexit(dispatcher_cleanup);
charon->start(charon); charon->start(charon);
fixup_pf_route();
return run(); return run();
} }
@@ -7,22 +7,94 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* 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 */; }; 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 */; }; 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 */; }; 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 */; };
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 */; }; 5BF60F31173405A000E5D608 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BD1CCD31726DB4000587077 /* CoreFoundation.framework */; };
5BF60F33173405AC00E5D608 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BD1CCF21727DE3E00587077 /* Security.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 */; }; 5BF60F3E1734070A00E5D608 /* xpc_dispatch.c in Sources */ = {isa = PBXBuildFile; fileRef = 5B74984C172AA3550041971E /* xpc_dispatch.c */; };
5BF60F631743C57500E5D608 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BF60F621743C57500E5D608 /* SystemConfiguration.framework */; }; 5BF60F631743C57500E5D608 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BF60F621743C57500E5D608 /* SystemConfiguration.framework */; };
/* End PBXBuildFile section */ /* 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 */ /* 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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; }; 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>"; }; 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>"; }; 5BD1CCE01726DCD000587077 /* charon-xpc-Launchd.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "charon-xpc-Launchd.plist"; sourceTree = "<group>"; };
@@ -30,10 +102,22 @@
5BD1CCEA1727CCA400587077 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.md; 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; }; 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; }; 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; }; 5BF60F621743C57500E5D608 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase 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 */ = { 5BD1CCCE1726DB4000587077 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -51,6 +135,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5BD1CCEA1727CCA400587077 /* README.md */, 5BD1CCEA1727CCA400587077 /* README.md */,
5BD1CCB61726DB0100587077 /* strongSwan */,
5BD1CCD51726DB4000587077 /* charon-xpc */, 5BD1CCD51726DB4000587077 /* charon-xpc */,
5BD1CCAF1726DB0100587077 /* Frameworks */, 5BD1CCAF1726DB0100587077 /* Frameworks */,
5BD1CCAD1726DB0100587077 /* Products */, 5BD1CCAD1726DB0100587077 /* Products */,
@@ -60,6 +145,7 @@
5BD1CCAD1726DB0100587077 /* Products */ = { 5BD1CCAD1726DB0100587077 /* Products */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5BD1CCAC1726DB0100587077 /* strongSwan.app */,
5BD1CCD11726DB4000587077 /* org.strongswan.charon-xpc */, 5BD1CCD11726DB4000587077 /* org.strongswan.charon-xpc */,
); );
name = Products; name = Products;
@@ -71,11 +157,44 @@
5BF60F621743C57500E5D608 /* SystemConfiguration.framework */, 5BF60F621743C57500E5D608 /* SystemConfiguration.framework */,
5BD1CCF21727DE3E00587077 /* Security.framework */, 5BD1CCF21727DE3E00587077 /* Security.framework */,
5BD1CCEC1727D7AF00587077 /* ServiceManagement.framework */, 5BD1CCEC1727D7AF00587077 /* ServiceManagement.framework */,
5BD1CCB01726DB0100587077 /* Cocoa.framework */,
5BD1CCD31726DB4000587077 /* CoreFoundation.framework */, 5BD1CCD31726DB4000587077 /* CoreFoundation.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; 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 */ = { 5BD1CCD51726DB4000587077 /* charon-xpc */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -95,6 +214,25 @@
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget 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 */ = { 5BD1CCD01726DB4000587077 /* charon-xpc */ = {
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 5BD1CCDA1726DB4000587077 /* Build configuration list for PBXNativeTarget "charon-xpc" */; buildConfigurationList = 5BD1CCDA1726DB4000587077 /* Build configuration list for PBXNativeTarget "charon-xpc" */;
@@ -117,7 +255,7 @@
5BD1CCA31726DB0100587077 /* Project object */ = { 5BD1CCA31726DB0100587077 /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 0450; LastUpgradeCheck = 0610;
ORGANIZATIONNAME = "revosec AG"; ORGANIZATIONNAME = "revosec AG";
}; };
buildConfigurationList = 5BD1CCA61726DB0100587077 /* Build configuration list for PBXProject "strongSwan" */; buildConfigurationList = 5BD1CCA61726DB0100587077 /* Build configuration list for PBXProject "strongSwan" */;
@@ -132,12 +270,48 @@
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
targets = ( targets = (
5BD1CCAB1726DB0100587077 /* strongSwan */,
5BD1CCD01726DB4000587077 /* charon-xpc */, 5BD1CCD01726DB4000587077 /* charon-xpc */,
); );
}; };
/* End PBXProject section */ /* 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 */ /* 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 */ = { 5BD1CCCD1726DB4000587077 /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -151,12 +325,70 @@
}; };
/* End PBXSourcesBuildPhase section */ /* 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 */ /* Begin XCBuildConfiguration section */
5BD1CCC81726DB0200587077 /* Debug */ = { 5BD1CCC81726DB0200587077 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
@@ -175,7 +407,7 @@
GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.8; MACOSX_DEPLOYMENT_TARGET = 10.7;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx; SDKROOT = macosx;
}; };
@@ -185,7 +417,6 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
@@ -198,15 +429,48 @@
GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.8; MACOSX_DEPLOYMENT_TARGET = 10.7;
SDKROOT = macosx; SDKROOT = macosx;
}; };
name = Release; 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 */ = { 5BD1CCDB1726DB4000587077 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CODE_SIGN_IDENTITY = "Joe Developer"; CODE_SIGN_IDENTITY = "Developer ID Application";
GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO; GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO;
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO;
@@ -224,6 +488,7 @@
../../libcharon/.libs, ../../libcharon/.libs,
../../libhydra/.libs, ../../libhydra/.libs,
); );
MACOSX_DEPLOYMENT_TARGET = 10.7;
OTHER_CFLAGS = ( OTHER_CFLAGS = (
"-include", "-include",
../../../config.h, ../../../config.h,
@@ -249,6 +514,7 @@
); );
PRODUCT_NAME = "org.strongswan.charon-xpc"; PRODUCT_NAME = "org.strongswan.charon-xpc";
PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE = "";
SDKROOT = macosx;
STRIP_STYLE = "non-global"; STRIP_STYLE = "non-global";
}; };
name = Debug; name = Debug;
@@ -256,8 +522,8 @@
5BD1CCDC1726DB4000587077 /* Release */ = { 5BD1CCDC1726DB4000587077 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CODE_SIGN_IDENTITY = "Joe Developer"; CODE_SIGN_IDENTITY = "Developer ID Application";
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO; GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO;
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO;
@@ -275,6 +541,7 @@
../../libcharon/.libs, ../../libcharon/.libs,
../../libhydra/.libs, ../../libhydra/.libs,
); );
MACOSX_DEPLOYMENT_TARGET = 10.7;
OTHER_CFLAGS = ( OTHER_CFLAGS = (
"-include", "-include",
../../../config.h, ../../../config.h,
@@ -300,6 +567,7 @@
); );
PRODUCT_NAME = "org.strongswan.charon-xpc"; PRODUCT_NAME = "org.strongswan.charon-xpc";
PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE = "";
SDKROOT = macosx;
STRIP_STYLE = "non-global"; STRIP_STYLE = "non-global";
}; };
name = Release; name = Release;
@@ -316,6 +584,15 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; 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" */ = { 5BD1CCDA1726DB4000587077 /* Build configuration list for PBXNativeTarget "charon-xpc" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (
@@ -0,0 +1,36 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
+358
View File
@@ -0,0 +1,358 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
@@ -0,0 +1,74 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
@@ -0,0 +1,102 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
+95
View File
@@ -0,0 +1,95 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
+258
View File
@@ -0,0 +1,258 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
+41
View File
@@ -0,0 +1,41 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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 requried
*
* @return XPC service connection, as a singleton
*/
- (xpc_connection_t)getConnection;
/**
* Return an errror string if if getConnection fails
*
* @return error string, unretained
*/
- (NSString*)getError;
@end
+223
View File
@@ -0,0 +1,223 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
@@ -0,0 +1,45 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
@@ -0,0 +1,51 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
@@ -0,0 +1,41 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
@@ -0,0 +1,56 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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
@@ -0,0 +1,32 @@
{\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.}
@@ -0,0 +1 @@
/* Localized versions of Info.plist keys */
@@ -0,0 +1,587 @@
<?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>
@@ -0,0 +1,277 @@
<?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>
@@ -0,0 +1,578 @@
<?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.

After

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 467 B

+21
View File
@@ -0,0 +1,21 @@
/*
* Copyright (C) 2013 Martin Willi
* Copyright (C) 2013 revosec 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);
}
@@ -0,0 +1,43 @@
<?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.2.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>
@@ -0,0 +1,7 @@
//
// Prefix header for all source files of the 'strongSwan' target in the 'strongSwan' project
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif
+2
View File
@@ -22,6 +22,8 @@
#ifndef TASK_H_ #ifndef TASK_H_
#define TASK_H_ #define TASK_H_
#include <utils/utils.h>
typedef enum task_type_t task_type_t; typedef enum task_type_t task_type_t;
typedef struct task_t task_t; typedef struct task_t task_t;
@@ -830,6 +830,15 @@ static void process_link(private_kernel_pfroute_net_t *this,
DBG1(DBG_KNL, "interface %s deactivated", iface->ifname); DBG1(DBG_KNL, "interface %s deactivated", iface->ifname);
} }
} }
#ifdef __APPLE__
/* There seems to be a race condition on 10.10, where we get
* the RTM_IFINFO, but getifaddrs() does not return the virtual
* IP installed on a tun device, but we also don't get a
* RTM_NEWADDR. We therefore could miss the new address, letting
* virtual IP installation fail. Delaying getifaddrs() helps,
* but is obviously not a clean fix. */
usleep(50000);
#endif
iface->flags = msg->ifm_flags; iface->flags = msg->ifm_flags;
repopulate_iface(this, iface); repopulate_iface(this, iface);
found = TRUE; found = TRUE;
+3 -3
View File
@@ -24,6 +24,9 @@
#ifndef HOST_H_ #ifndef HOST_H_
#define HOST_H_ #define HOST_H_
#include <utils/utils.h>
#include <utils/chunk.h>
typedef enum host_diff_t host_diff_t; typedef enum host_diff_t host_diff_t;
typedef struct host_t host_t; typedef struct host_t host_t;
@@ -31,9 +34,6 @@ typedef struct host_t host_t;
#include <stdio.h> #include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include <utils/utils.h>
#include <utils/chunk.h>
/** /**
* Representates a Host * Representates a Host
* *
+2
View File
@@ -23,6 +23,8 @@
#ifndef PROCESSOR_H_ #ifndef PROCESSOR_H_
#define PROCESSOR_H_ #define PROCESSOR_H_
#include <utils/utils.h>
typedef struct processor_t processor_t; typedef struct processor_t processor_t;
#include <stdlib.h> #include <stdlib.h>
+6
View File
@@ -34,6 +34,12 @@
/* Mach uses a semaphore_create() call, use a different name for ours */ /* Mach uses a semaphore_create() call, use a different name for ours */
#define semaphore_create(x) strongswan_semaphore_create(x) #define semaphore_create(x) strongswan_semaphore_create(x)
/* Since OS X 10.10 XPC includes some additional conflicting Mach types */
#define host_t strongswan_host_t
#define processor_t strongswan_processor_t
#define task_t strongswan_task_t
#define thread_t strongswan_thread_t
/* forward declaration, see below */ /* forward declaration, see below */
static inline int precancellable_poll(struct pollfd fds[], nfds_t nfds, static inline int precancellable_poll(struct pollfd fds[], nfds_t nfds,
int timeout); int timeout);