Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

基于secret socks增加密码保存功能

  • Loading branch information...
commit 6d2e15ea8eb3aaa4c170e26e094ca1e989addbb0 0 parents
@cdredfox authored
Showing with 15,599 additions and 0 deletions.
  1. BIN  .DS_Store
  2. 0  READEME
  3. +14 −0 source/Credits.html
  4. BIN  source/English.lproj/InfoPlist.strings
  5. +12,206 −0 source/English.lproj/MainMenu.nib/designable.nib
  6. BIN  source/English.lproj/MainMenu.nib/keyedobjects.nib
  7. +30 −0 source/Info.plist
  8. +1,400 −0 source/Secret Socks.xcodeproj/joshuachan.mode1v3
  9. +401 −0 source/Secret Socks.xcodeproj/joshuachan.pbxuser
  10. +332 −0 source/Secret Socks.xcodeproj/project.pbxproj
  11. +7 −0 source/Secret Socks.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  12. BIN  ...ce/Secret Socks.xcodeproj/project.xcworkspace/xcuserdata/yangfei.xcuserdatad/UserInterfaceState.xcuserstate
  13. +10 −0 source/Secret Socks.xcodeproj/project.xcworkspace/xcuserdata/yangfei.xcuserdatad/WorkspaceSettings.xcsettings
  14. +77 −0 source/Secret Socks.xcodeproj/xcuserdata/yangfei.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
  15. +84 −0 source/Secret Socks.xcodeproj/xcuserdata/yangfei.xcuserdatad/xcschemes/Secret Socks.xcscheme
  16. +22 −0 source/Secret Socks.xcodeproj/xcuserdata/yangfei.xcuserdatad/xcschemes/xcschememanagement.plist
  17. +7 −0 source/Secret Socks_Prefix.pch
  18. +72 −0 source/SecretSocksController.h
  19. +472 −0 source/SecretSocksController.m
  20. +87 −0 source/TaskWrapper.h
  21. +193 −0 source/TaskWrapper.m
  22. +18 −0 source/getservice
  23. +33 −0 source/getservice.py
  24. BIN  source/locked-socks.icns
  25. +14 −0 source/main.m
  26. +4 −0 source/pass
  27. BIN  source/path4068.png
  28. BIN  source/ssh
  29. +36 −0 source/ssh_interface.h
  30. +80 −0 source/ssh_interface.m
BIN  .DS_Store
Binary file not shown
0  READEME
No changes.
14 source/Credits.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <style type="text/css">
+ body { text-align: center; }
+ a, a:link { text-decoration: none; color: darkblue; }
+ a:hover { text-decoration: underline; }
+ </style>
+<body>
+<p>&copy; Joshua Chan, 2009<br/>
+<a href="http://nihilex.com/secret-socks/">http://nihilex.com/secret-socks/</a></p>
+<p><a href="http://github.com/brl/obfuscated-openssh/">obfuscated-openssh</a> patch by Bruce Leidl</p>
+<p>Special thanks to <a href="http://iamthekiller.net">Ryan Pfleghaar</a></p>
+</body>
+</html>
BIN  source/English.lproj/InfoPlist.strings
Binary file not shown
12,206 source/English.lproj/MainMenu.nib/designable.nib
12,206 additions, 0 deletions not shown
BIN  source/English.lproj/MainMenu.nib/keyedobjects.nib
Binary file not shown
30 source/Info.plist
@@ -0,0 +1,30 @@
+<?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>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string>locked-socks</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.nihilex.Secret Socks</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0.2</string>
+ <key>LSApplicationCategoryType</key>
+ <string></string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
1,400 source/Secret Socks.xcodeproj/joshuachan.mode1v3
@@ -0,0 +1,1400 @@
+<?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>ActivePerspectiveName</key>
+ <string>Project</string>
+ <key>AllowedModules</key>
+ <array>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Name</key>
+ <string>Groups and Files Outline View</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Name</key>
+ <string>Editor</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCTaskListModule</string>
+ <key>Name</key>
+ <string>Task List</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Name</key>
+ <string>File and Smart Group Detail Viewer</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXBuildResultsModule</string>
+ <key>Name</key>
+ <string>Detailed Build Results Viewer</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXProjectFindModule</string>
+ <key>Name</key>
+ <string>Project Batch Find Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCProjectFormatConflictsModule</string>
+ <key>Name</key>
+ <string>Project Format Conflicts List</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXBookmarksModule</string>
+ <key>Name</key>
+ <string>Bookmarks Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXClassBrowserModule</string>
+ <key>Name</key>
+ <string>Class Browser</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXCVSModule</string>
+ <key>Name</key>
+ <string>Source Code Control Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXDebugBreakpointsModule</string>
+ <key>Name</key>
+ <string>Debug Breakpoints Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCDockableInspector</string>
+ <key>Name</key>
+ <string>Inspector</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXOpenQuicklyModule</string>
+ <key>Name</key>
+ <string>Open Quickly Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXDebugSessionModule</string>
+ <key>Name</key>
+ <string>Debugger</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXDebugCLIModule</string>
+ <key>Name</key>
+ <string>Debug Console</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCSnapshotModule</string>
+ <key>Name</key>
+ <string>Snapshots Tool</string>
+ </dict>
+ </array>
+ <key>BundlePath</key>
+ <string>/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources</string>
+ <key>Description</key>
+ <string>DefaultDescriptionKey</string>
+ <key>DockingSystemVisible</key>
+ <false/>
+ <key>Extension</key>
+ <string>mode1v3</string>
+ <key>FavBarConfig</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>5B3595161007D9510060C42D</string>
+ <key>XCBarModuleItemNames</key>
+ <dict/>
+ <key>XCBarModuleItems</key>
+ <array/>
+ </dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>com.apple.perspectives.project.mode1v3</string>
+ <key>MajorVersion</key>
+ <integer>33</integer>
+ <key>MinorVersion</key>
+ <integer>0</integer>
+ <key>Name</key>
+ <string>Default</string>
+ <key>Notifications</key>
+ <array/>
+ <key>OpenEditors</key>
+ <array/>
+ <key>PerspectiveWidths</key>
+ <array>
+ <integer>-1</integer>
+ <integer>-1</integer>
+ </array>
+ <key>Perspectives</key>
+ <array>
+ <dict>
+ <key>ChosenToolbarItems</key>
+ <array>
+ <string>active-combo-popup</string>
+ <string>action</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ <string>debugger-enable-breakpoints</string>
+ <string>build-and-go</string>
+ <string>com.apple.ide.PBXToolbarStopButton</string>
+ <string>get-info</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ <string>com.apple.pbx.toolbar.searchfield</string>
+ </array>
+ <key>ControllerClassBaseName</key>
+ <string></string>
+ <key>IconName</key>
+ <string>WindowOfProjectWithEditor</string>
+ <key>Identifier</key>
+ <string>perspective.project</string>
+ <key>IsVertical</key>
+ <false/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <true/>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C37FBAC04509CD000000102</string>
+ <string>1C37FAAC04509CD000000102</string>
+ <string>1C37FABC05509CD000000102</string>
+ <string>1C37FABC05539CD112110102</string>
+ <string>E2644B35053B69B200211256</string>
+ <string>1C37FABC04509CD000100104</string>
+ <string>1CC0EA4004350EF90044410B</string>
+ <string>1CC0EA4004350EF90041110B</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>yes</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>218</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>29B97314FDCFA39411CA2CEA</string>
+ <string>1C37FBAC04509CD000000102</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>0</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {218, 526}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <true/>
+ <key>XCSharingToken</key>
+ <string>com.apple.Xcode.GFSharingToken</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {235, 544}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>218</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>436 293 772 585 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>235pt</string>
+ </dict>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B20306471E060097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>locked-socks.icns</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B20406471E060097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>locked-socks.icns</string>
+ <key>_historyCapacity</key>
+ <integer>0</integer>
+ <key>bookmark</key>
+ <string>5BEC79211050ADAF007DF70A</string>
+ <key>history</key>
+ <array>
+ <string>5BEC7911105092F1007DF70A</string>
+ <string>5BEC7912105092F1007DF70A</string>
+ <string>5BEC7913105092F1007DF70A</string>
+ <string>5BEC7914105092F1007DF70A</string>
+ <string>5BEC7915105092F1007DF70A</string>
+ <string>5BEC7916105092F1007DF70A</string>
+ <string>5BEC7917105092F1007DF70A</string>
+ <string>5BEC7918105092F1007DF70A</string>
+ </array>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <true/>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {532, 283}}</string>
+ <key>RubberWindowFrame</key>
+ <string>436 293 772 585 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>283pt</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B20506471E060097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Detail</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 288}, {532, 256}}</string>
+ <key>RubberWindowFrame</key>
+ <string>436 293 772 585 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Proportion</key>
+ <string>256pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>532pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCModuleDock</string>
+ <string>PBXSmartGroupTreeModule</string>
+ <string>XCModuleDock</string>
+ <string>PBXNavigatorGroup</string>
+ <string>XCDetailModule</string>
+ </array>
+ <key>TableOfContents</key>
+ <array>
+ <string>5BEC791A105092F1007DF70A</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>5BEC791B105092F1007DF70A</string>
+ <string>1CE0B20306471E060097A5F4</string>
+ <string>1CE0B20506471E060097A5F4</string>
+ </array>
+ <key>ToolbarConfigUserDefaultsMinorVersion</key>
+ <string>2</string>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.defaultV3</string>
+ </dict>
+ <dict>
+ <key>ControllerClassBaseName</key>
+ <string></string>
+ <key>IconName</key>
+ <string>WindowOfProject</string>
+ <key>Identifier</key>
+ <string>perspective.morph</string>
+ <key>IsVertical</key>
+ <integer>0</integer>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C37FBAC04509CD000000102</string>
+ <string>1C37FAAC04509CD000000102</string>
+ <string>1C08E77C0454961000C914BD</string>
+ <string>1C37FABC05509CD000000102</string>
+ <string>1C37FABC05539CD112110102</string>
+ <string>E2644B35053B69B200211256</string>
+ <string>1C37FABC04509CD000100104</string>
+ <string>1CC0EA4004350EF90044410B</string>
+ <string>1CC0EA4004350EF90041110B</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>11E0B1FE06471DED0097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>yes</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>186</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>29B97314FDCFA39411CA2CEA</string>
+ <string>1C37FABC05509CD000000102</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>0</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {186, 337}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <integer>1</integer>
+ <key>XCSharingToken</key>
+ <string>com.apple.Xcode.GFSharingToken</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {203, 355}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>186</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>373 269 690 397 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Morph</string>
+ <key>PreferredWidth</key>
+ <integer>300</integer>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCModuleDock</string>
+ <string>PBXSmartGroupTreeModule</string>
+ </array>
+ <key>TableOfContents</key>
+ <array>
+ <string>11E0B1FE06471DED0097A5F4</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.default.shortV3</string>
+ </dict>
+ </array>
+ <key>PerspectivesBarVisible</key>
+ <false/>
+ <key>ShelfIsVisible</key>
+ <false/>
+ <key>SourceDescription</key>
+ <string>file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec'</string>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TimeStamp</key>
+ <real>0.0</real>
+ <key>ToolbarDisplayMode</key>
+ <integer>1</integer>
+ <key>ToolbarIsVisible</key>
+ <true/>
+ <key>ToolbarSizeMode</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Perspectives</string>
+ <key>UpdateMessage</key>
+ <string>The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'?</string>
+ <key>WindowJustification</key>
+ <integer>5</integer>
+ <key>WindowOrderList</key>
+ <array>
+ <string>5BEC791D105092F1007DF70A</string>
+ <string>5BEC791E105092F1007DF70A</string>
+ <string>1C78EAAD065D492600B07095</string>
+ <string>1CD10A99069EF8BA00B06720</string>
+ <string>5B35955D10088DA50060C42D</string>
+ <string>/Users/joshuachan/Secret Socks/Secret Socks.xcodeproj</string>
+ </array>
+ <key>WindowString</key>
+ <string>436 293 772 585 0 0 1680 1028 </string>
+ <key>WindowToolsV3</key>
+ <array>
+ <dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>windowTool.build</string>
+ <key>IsVertical</key>
+ <true/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528F0623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string></string>
+ <key>StatusBarVisibility</key>
+ <true/>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {802, 318}}</string>
+ <key>RubberWindowFrame</key>
+ <string>782 212 802 600 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>318pt</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>XCMainBuildResultsModuleGUID</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Build Results</string>
+ <key>XCBuildResultsTrigger_Collapse</key>
+ <integer>1021</integer>
+ <key>XCBuildResultsTrigger_Open</key>
+ <integer>1011</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 323}, {802, 236}}</string>
+ <key>RubberWindowFrame</key>
+ <string>782 212 802 600 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXBuildResultsModule</string>
+ <key>Proportion</key>
+ <string>236pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>559pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Build Results</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXBuildResultsModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TableOfContents</key>
+ <array>
+ <string>5B35955D10088DA50060C42D</string>
+ <string>5BEC78D2105080E6007DF70A</string>
+ <string>1CD0528F0623707200166675</string>
+ <string>XCMainBuildResultsModuleGUID</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.buildV3</string>
+ <key>WindowString</key>
+ <string>782 212 802 600 0 0 1680 1028 </string>
+ <key>WindowToolGUID</key>
+ <string>5B35955D10088DA50060C42D</string>
+ <key>WindowToolIsVisible</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>windowTool.debugger</string>
+ <key>IsVertical</key>
+ <true/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>Debugger</key>
+ <dict>
+ <key>HorizontalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {422, 350}}</string>
+ <string>{{422, 0}, {503, 350}}</string>
+ </array>
+ </dict>
+ <key>VerticalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {925, 350}}</string>
+ <string>{{0, 350}, {925, 306}}</string>
+ </array>
+ </dict>
+ </dict>
+ <key>LauncherConfigVersion</key>
+ <string>8</string>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C162984064C10D400B95A72</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debug - GLUTExamples (Underwater)</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>DebugConsoleVisible</key>
+ <string>None</string>
+ <key>DebugConsoleWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>DebugSTDIOWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>Frame</key>
+ <string>{{0, 0}, {925, 656}}</string>
+ <key>PBXDebugSessionStackFrameViewKey</key>
+ <dict>
+ <key>DebugVariablesTableConfiguration</key>
+ <array>
+ <string>Name</string>
+ <real>146</real>
+ <string>Value</string>
+ <real>85</real>
+ <string>Summary</string>
+ <real>595</real>
+ </array>
+ <key>Frame</key>
+ <string>{{422, 0}, {503, 350}}</string>
+ <key>RubberWindowFrame</key>
+ <string>639 252 925 697 0 0 1680 1028 </string>
+ </dict>
+ <key>RubberWindowFrame</key>
+ <string>639 252 925 697 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugSessionModule</string>
+ <key>Proportion</key>
+ <string>656pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>656pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debugger</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXDebugSessionModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TableOfContents</key>
+ <array>
+ <string>1CD10A99069EF8BA00B06720</string>
+ <string>5BEC78D3105080E6007DF70A</string>
+ <string>1C162984064C10D400B95A72</string>
+ <string>5BEC78D4105080E6007DF70A</string>
+ <string>5BEC78D5105080E6007DF70A</string>
+ <string>5BEC78D6105080E6007DF70A</string>
+ <string>5BEC78D7105080E6007DF70A</string>
+ <string>5BEC78D8105080E6007DF70A</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.debugV3</string>
+ <key>WindowString</key>
+ <string>639 252 925 697 0 0 1680 1028 </string>
+ <key>WindowToolGUID</key>
+ <string>1CD10A99069EF8BA00B06720</string>
+ <key>WindowToolIsVisible</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.find</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CDD528C0622207200134675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>&lt;No Editor&gt;</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528D0623707200166675</string>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <integer>1</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {781, 167}}</string>
+ <key>RubberWindowFrame</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>781pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>50%</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528E0623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Project Find</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{8, 0}, {773, 254}}</string>
+ <key>RubberWindowFrame</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXProjectFindModule</string>
+ <key>Proportion</key>
+ <string>50%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>428pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project Find</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXProjectFindModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <string>1C530D58069F1CE1000CFCEE</string>
+ <string>1C530D59069F1CE1000CFCEE</string>
+ <string>1CDD528C0622207200134675</string>
+ <string>1C530D5A069F1CE1000CFCEE</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>1CD0528E0623707200166675</string>
+ </array>
+ <key>WindowString</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>MENUSEPARATOR</string>
+ </dict>
+ <dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>windowTool.debuggerConsole</string>
+ <key>IsVertical</key>
+ <true/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <true/>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAAC065D492600B07095</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debugger Console</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {843, 542}}</string>
+ <key>RubberWindowFrame</key>
+ <string>784 168 843 583 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugCLIModule</string>
+ <key>Proportion</key>
+ <string>542pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>542pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debugger Console</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXDebugCLIModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C78EAAD065D492600B07095</string>
+ <string>5BEC78D9105080E6007DF70A</string>
+ <string>1C78EAAC065D492600B07095</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.consoleV3</string>
+ <key>WindowString</key>
+ <string>784 168 843 583 0 0 1680 1028 </string>
+ <key>WindowToolGUID</key>
+ <string>1C78EAAD065D492600B07095</string>
+ <key>WindowToolIsVisible</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.snapshots</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>XCSnapshotModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Snapshots</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCSnapshotModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <string>Yes</string>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.snapshots</string>
+ <key>WindowString</key>
+ <string>315 824 300 550 0 0 1440 878 </string>
+ <key>WindowToolIsVisible</key>
+ <string>Yes</string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.scm</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAB2065D492600B07095</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>&lt;No Editor&gt;</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAB3065D492600B07095</string>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <integer>1</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {452, 0}}</string>
+ <key>RubberWindowFrame</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>0pt</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD052920623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>SCM</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>ConsoleFrame</key>
+ <string>{{0, 259}, {452, 0}}</string>
+ <key>Frame</key>
+ <string>{{0, 7}, {452, 259}}</string>
+ <key>RubberWindowFrame</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ <key>TableConfiguration</key>
+ <array>
+ <string>Status</string>
+ <real>30</real>
+ <string>FileName</string>
+ <real>199</real>
+ <string>Path</string>
+ <real>197.09500122070312</real>
+ </array>
+ <key>TableFrame</key>
+ <string>{{0, 0}, {452, 250}}</string>
+ </dict>
+ <key>Module</key>
+ <string>PBXCVSModule</string>
+ <key>Proportion</key>
+ <string>262pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>266pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>SCM</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXCVSModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C78EAB4065D492600B07095</string>
+ <string>1C78EAB5065D492600B07095</string>
+ <string>1C78EAB2065D492600B07095</string>
+ <string>1CD052920623707200166675</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.scm</string>
+ <key>WindowString</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>windowTool.breakpoints</string>
+ <key>IsVertical</key>
+ <false/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <true/>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C77FABC04509CD000000102</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>no</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>168</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>1C77FABC04509CD000000102</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>0</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {168, 350}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <false/>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {185, 368}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>168</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>774 385 744 409 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>185pt</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA1AED706398EBD00589147</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Detail</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{190, 0}, {554, 368}}</string>
+ <key>RubberWindowFrame</key>
+ <string>774 385 744 409 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Proportion</key>
+ <string>554pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>368pt</string>
+ </dict>
+ </array>
+ <key>MajorVersion</key>
+ <integer>3</integer>
+ <key>MinorVersion</key>
+ <integer>0</integer>
+ <key>Name</key>
+ <string>Breakpoints</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXSmartGroupTreeModule</string>
+ <string>XCDetailModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TableOfContents</key>
+ <array>
+ <string>5B35988D100A23C70060C42D</string>
+ <string>5B35988E100A23C70060C42D</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>1CA1AED706398EBD00589147</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.breakpointsV3</string>
+ <key>WindowString</key>
+ <string>774 385 744 409 0 0 1680 1028 </string>
+ <key>WindowToolGUID</key>
+ <string>5B35988D100A23C70060C42D</string>
+ <key>WindowToolIsVisible</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.debugAnimator</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debug Visualizer</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXNavigatorGroup</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.debugAnimatorV3</string>
+ <key>WindowString</key>
+ <string>100 100 700 500 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.bookmarks</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>PBXBookmarksModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Bookmarks</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXBookmarksModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>0</integer>
+ <key>WindowString</key>
+ <string>538 42 401 187 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.projectFormatConflicts</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>XCProjectFormatConflictsModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project Format Conflicts</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCProjectFormatConflictsModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>0</integer>
+ <key>WindowContentMinSize</key>
+ <string>450 300</string>
+ <key>WindowString</key>
+ <string>50 850 472 307 0 0 1440 877</string>
+ </dict>
+ <dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>windowTool.classBrowser</string>
+ <key>IsVertical</key>
+ <true/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>OptionsSetName</key>
+ <string>Hierarchy, all classes</string>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA6456E063B45B4001379D8</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Class Browser - NSObject</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>ClassesFrame</key>
+ <string>{{0, 0}, {378, 96}}</string>
+ <key>ClassesTreeTableConfiguration</key>
+ <array>
+ <string>PBXClassNameColumnIdentifier</string>
+ <real>208</real>
+ <string>PBXClassBookColumnIdentifier</string>
+ <real>22</real>
+ </array>
+ <key>Frame</key>
+ <string>{{0, 0}, {630, 332}}</string>
+ <key>MembersFrame</key>
+ <string>{{0, 101}, {378, 231}}</string>
+ <key>MembersTreeTableConfiguration</key>
+ <array>
+ <string>PBXMemberTypeIconColumnIdentifier</string>
+ <real>22</real>
+ <string>PBXMemberNameColumnIdentifier</string>
+ <real>216</real>
+ <string>PBXMemberTypeColumnIdentifier</string>
+ <real>101</real>
+ <string>PBXMemberBookColumnIdentifier</string>
+ <real>22</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>478 646 630 352 0 0 1680 1028 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXClassBrowserModule</string>
+ <key>Proportion</key>
+ <string>332pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>332pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Class Browser</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXClassBrowserModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <false/>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C0AD2AF069F1E9B00FABCE6</string>
+ <string>5B359EE0100D93FB0060C42D</string>
+ <string>1CA6456E063B45B4001379D8</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.classbrowser</string>
+ <key>WindowString</key>
+ <string>478 646 630 352 0 0 1680 1028 </string>
+ <key>WindowToolGUID</key>
+ <string>1C0AD2AF069F1E9B00FABCE6</string>
+ <key>WindowToolIsVisible</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.refactoring</string>
+ <key>IncludeInToolsMenu</key>
+ <integer>0</integer>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{0, 0}, {500, 335}</string>
+ <key>RubberWindowFrame</key>
+ <string>{0, 0}, {500, 335}</string>
+ </dict>
+ <key>Module</key>
+ <string>XCRefactoringModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Refactoring</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCRefactoringModule</string>
+ </array>
+ <key>WindowString</key>
+ <string>200 200 500 356 0 0 1920 1200 </string>
+ </dict>
+ </array>
+</dict>
+</plist>
401 source/Secret Socks.xcodeproj/joshuachan.pbxuser
@@ -0,0 +1,401 @@
+// !$*UTF8*$!
+{
+ 089C165DFE840E0CC02AAC07 /* English */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {459, 252}}";
+ sepNavSelRange = "{73, 0}";
+ sepNavVisRange = "{0, 75}";
+ sepNavWindowFrame = "{{448, 96}, {856, 787}}";
+ };
+ };
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ activeArchitecturePreference = i386;
+ activeBuildConfigurationName = Release;
+ activeExecutable = 5B3595091007D8D70060C42D /* Secret Socks */;
+ activeTarget = 8D1107260486CEB800E47090 /* Secret Socks */;
+ addToTargets = (
+ 8D1107260486CEB800E47090 /* Secret Socks */,
+ );
+ breakpoints = (
+ );
+ codeSenseManager = 5B3595181007D9520060C42D /* Code sense */;
+ executables = (
+ 5B3595091007D8D70060C42D /* Secret Socks */,
+ );
+ perUserDictionary = {
+ "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 20,
+ 20,
+ 198,
+ 20,
+ 99,
+ 99,
+ 29,
+ 20,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXBreakpointsDataSource_ActionID,
+ PBXBreakpointsDataSource_TypeID,
+ PBXBreakpointsDataSource_BreakpointID,
+ PBXBreakpointsDataSource_UseID,
+ PBXBreakpointsDataSource_LocationID,
+ PBXBreakpointsDataSource_ConditionID,
+ PBXBreakpointsDataSource_IgnoreCountID,
+ PBXBreakpointsDataSource_ContinueID,
+ );
+ };
+ PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 20,
+ 300,
+ 101,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXErrorsWarningsDataSource_TypeID,
+ PBXErrorsWarningsDataSource_MessageID,
+ PBXErrorsWarningsDataSource_LocationID,
+ );
+ };
+ PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 22,
+ 300,
+ 169,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXExecutablesDataSource_ActiveFlagID,
+ PBXExecutablesDataSource_NameID,
+ PBXExecutablesDataSource_CommentsID,
+ );
+ };
+ PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = 1;
+ PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 20,
+ 293,
+ 20,
+ 48,
+ 43,
+ 43,
+ 20,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXFileDataSource_FiletypeID,
+ PBXFileDataSource_Filename_ColumnID,
+ PBXFileDataSource_Built_ColumnID,
+ PBXFileDataSource_ObjectSize_ColumnID,
+ PBXFileDataSource_Errors_ColumnID,
+ PBXFileDataSource_Warnings_ColumnID,
+ PBXFileDataSource_Target_ColumnID,
+ );
+ };
+ PBXConfiguration.PBXFileTableDataSource3.PBXSymbolsDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXSymbolsDataSource_SymbolNameID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 16,
+ 200,
+ 50,
+ 151,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXSymbolsDataSource_SymbolTypeIconID,
+ PBXSymbolsDataSource_SymbolNameID,
+ PBXSymbolsDataSource_SymbolTypeID,
+ PBXSymbolsDataSource_ReferenceNameID,
+ );
+ };
+ PBXConfiguration.PBXFileTableDataSource3.XCSCMDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 20,
+ 20,
+ 187,
+ 20,
+ 48.16259765625,
+ 43,
+ 43,
+ 20,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXFileDataSource_SCM_ColumnID,
+ PBXFileDataSource_FiletypeID,
+ PBXFileDataSource_Filename_ColumnID,
+ PBXFileDataSource_Built_ColumnID,
+ PBXFileDataSource_ObjectSize_ColumnID,
+ PBXFileDataSource_Errors_ColumnID,
+ PBXFileDataSource_Warnings_ColumnID,
+ PBXFileDataSource_Target_ColumnID,
+ );
+ };
+ PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 20,
+ 253,
+ 60,
+ 20,
+ 48,
+ 43,
+ 43,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXFileDataSource_FiletypeID,
+ PBXFileDataSource_Filename_ColumnID,
+ PBXTargetDataSource_PrimaryAttribute,
+ PBXFileDataSource_Built_ColumnID,
+ PBXFileDataSource_ObjectSize_ColumnID,
+ PBXFileDataSource_Errors_ColumnID,
+ PBXFileDataSource_Warnings_ColumnID,
+ );
+ };
+ PBXPerProjectTemplateStateSaveDate = 273703737;
+ PBXWorkspaceStateSaveDate = 273703737;
+ };
+ perUserProjectItems = {
+ 5BEC7911105092F1007DF70A /* PBXTextBookmark */ = 5BEC7911105092F1007DF70A /* PBXTextBookmark */;
+ 5BEC7912105092F1007DF70A /* PBXTextBookmark */ = 5BEC7912105092F1007DF70A /* PBXTextBookmark */;
+ 5BEC7913105092F1007DF70A /* PlistBookmark */ = 5BEC7913105092F1007DF70A /* PlistBookmark */;
+ 5BEC7914105092F1007DF70A /* PBXTextBookmark */ = 5BEC7914105092F1007DF70A /* PBXTextBookmark */;
+ 5BEC7915105092F1007DF70A /* PBXTextBookmark */ = 5BEC7915105092F1007DF70A /* PBXTextBookmark */;
+ 5BEC7916105092F1007DF70A /* PBXBookmark */ = 5BEC7916105092F1007DF70A /* PBXBookmark */;
+ 5BEC7917105092F1007DF70A /* PBXTextBookmark */ = 5BEC7917105092F1007DF70A /* PBXTextBookmark */;
+ 5BEC7918105092F1007DF70A /* PBXBookmark */ = 5BEC7918105092F1007DF70A /* PBXBookmark */;
+ 5BEC79211050ADAF007DF70A /* PBXBookmark */ = 5BEC79211050ADAF007DF70A /* PBXBookmark */;
+ };
+ sourceControlManager = 5B3595171007D9520060C42D /* Source Control */;
+ userBuildSettings = {
+ };
+ };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {864, 305}}";
+ sepNavSelRange = "{222, 0}";
+ sepNavVisRange = "{0, 258}";
+ sepNavWindowFrame = "{{268, 216}, {1003, 576}}";
+ };
+ };
+ 5B3595091007D8D70060C42D /* Secret Socks */ = {
+ isa = PBXExecutable;
+ activeArgIndices = (
+ );
+ argumentStrings = (
+ );
+ autoAttachOnCrash = 1;
+ breakpointsEnabled = 0;
+ configStateDict = {
+ };
+ customDataFormattersEnabled = 1;
+ dataTipCustomDataFormattersEnabled = 1;
+ dataTipShowTypeColumn = 1;
+ dataTipSortType = 0;
+ debuggerPlugin = GDBDebugging;
+ disassemblyDisplayState = 0;
+ dylibVariantSuffix = "";
+ enableDebugStr = 1;
+ environmentEntries = (
+ );
+ executableSystemSymbolLevel = 0;
+ executableUserSymbolLevel = 0;
+ libgmallocEnabled = 0;
+ name = "Secret Socks";
+ savedGlobals = {
+ };
+ showTypeColumn = 0;
+ sourceDirectories = (
+ );
+ variableFormatDictionary = {
+ };
+ };
+ 5B3595171007D9520060C42D /* Source Control */ = {
+ isa = PBXSourceControlManager;
+ fallbackIsa = XCSourceControlManager;
+ isSCMEnabled = 0;
+ scmConfiguration = {
+ repositoryNamesForRoots = {
+ "" = "";
+ };
+ };
+ };
+ 5B3595181007D9520060C42D /* Code sense */ = {
+ isa = PBXCodeSenseManager;
+ indexTemplatePath = "";
+ };
+ 5B3595191007DB650060C42D /* ssh_interface.h */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {691, 518}}";
+ sepNavSelRange = "{887, 0}";
+ sepNavVisRange = "{0, 819}";
+ sepNavWindowFrame = "{{173, 423}, {750, 558}}";
+ };
+ };
+ 5B35951A1007DB660060C42D /* ssh_interface.m */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {944, 1040}}";
+ sepNavSelRange = "{434, 0}";
+ sepNavVisRange = "{0, 921}";
+ sepNavWindowFrame = "{{322, 149}, {1003, 576}}";
+ };
+ };
+ 5B35951F10085F8F0060C42D /* SecretSocksController.h */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {691, 1053}}";
+ sepNavSelRange = "{424, 0}";
+ sepNavVisRange = "{209, 954}";
+ sepNavWindowFrame = "{{663, 423}, {750, 558}}";
+ };
+ };
+ 5B35952010085F8F0060C42D /* SecretSocksController.m */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {852, 5824}}";
+ sepNavSelRange = "{9695, 0}";
+ sepNavVisRange = "{8400, 1598}";
+ sepNavWindowFrame = "{{331, 149}, {856, 787}}";
+ };
+ };
+ 5B35971C1009AD880060C42D /* TaskWrapper.m */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {2476, 2483}}";
+ sepNavSelRange = "{7333, 0}";
+ sepNavVisRange = "{713, 2899}";
+ sepNavWindowFrame = "{{235, 151}, {825, 851}}";
+ };
+ };
+ 5B35971D1009AD880060C42D /* TaskWrapper.h */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {2480, 1232}}";
+ sepNavSelRange = "{4077, 0}";
+ sepNavVisRange = "{0, 2077}";
+ sepNavWindowFrame = "{{900, 471}, {751, 557}}";
+ };
+ };
+ 5B35991C100A34D90060C42D /* pass */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {471, 251}}";
+ sepNavSelRange = "{32, 0}";
+ sepNavVisRange = "{0, 35}";
+ sepNavWindowFrame = "{{551, 130}, {1003, 576}}";
+ };
+ };
+ 5B359DE0100BE3A00060C42D /* Credits.html */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {797, 659}}";
+ sepNavSelRange = "{82, 0}";
+ sepNavVisRange = "{0, 500}";
+ sepNavWindowFrame = "{{811, 103}, {856, 787}}";
+ };
+ };
+ 5BE5DCDF100ED128004C4DF5 /* getservice */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {544, 252}}";
+ sepNavSelRange = "{12, 0}";
+ sepNavVisRange = "{0, 338}";
+ sepNavWindowFrame = "{{975, 57}, {636, 441}}";
+ };
+ };
+ 5BEC78BF10506C45007DF70A /* getservice.py */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {551, 442}}";
+ sepNavSelRange = "{0, 0}";
+ sepNavVisRange = "{0, 425}";
+ sepNavWindowFrame = "{{103, 286}, {795, 617}}";
+ };
+ };
+ 5BEC7911105092F1007DF70A /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 5B35971C1009AD880060C42D /* TaskWrapper.m */;
+ name = "TaskWrapper.m: 152";
+ rLen = 0;
+ rLoc = 7333;
+ rType = 0;
+ vrLen = 1379;
+ vrLoc = 1939;
+ };
+ 5BEC7912105092F1007DF70A /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 089C165DFE840E0CC02AAC07 /* English */;
+ name = "InfoPlist.strings: 3";
+ rLen = 0;
+ rLoc = 73;
+ rType = 0;
+ vrLen = 75;
+ vrLoc = 0;
+ };
+ 5BEC7913105092F1007DF70A /* PlistBookmark */ = {
+ isa = PlistBookmark;
+ fRef = 8D1107310486CEB800E47090 /* Info.plist */;
+ fallbackIsa = PBXBookmark;
+ isK = 0;
+ kPath = (
+ );
+ name = "/Users/joshuachan/Secret Socks/Info.plist";
+ rLen = 0;
+ rLoc = 2147483647;
+ };
+ 5BEC7914105092F1007DF70A /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 5BEC78BF10506C45007DF70A /* getservice.py */;
+ name = "getservice.py: 1";
+ rLen = 0;
+ rLoc = 0;
+ rType = 0;
+ vrLen = 425;
+ vrLoc = 0;
+ };
+ 5BEC7915105092F1007DF70A /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 5BE5DCDF100ED128004C4DF5 /* getservice */;
+ name = "getservice: 2";
+ rLen = 0;
+ rLoc = 12;
+ rType = 0;
+ vrLen = 338;
+ vrLoc = 0;
+ };
+ 5BEC7916105092F1007DF70A /* PBXBookmark */ = {
+ isa = PBXBookmark;
+ fRef = 5B3599F9100A79D90060C42D /* path4068.png */;
+ };
+ 5BEC7917105092F1007DF70A /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 5B35991C100A34D90060C42D /* pass */;
+ name = "pass: 4";
+ rLen = 0;
+ rLoc = 32;
+ rType = 0;
+ vrLen = 35;
+ vrLoc = 0;
+ };
+ 5BEC7918105092F1007DF70A /* PBXBookmark */ = {
+ isa = PBXBookmark;
+ fRef = 5BA31E17100E6B0900C5F597 /* locked-socks.icns */;
+ };
+ 5BEC79211050ADAF007DF70A /* PBXBookmark */ = {
+ isa = PBXBookmark;
+ fRef = 5BA31E17100E6B0900C5F597 /* locked-socks.icns */;
+ };
+ 8D1107260486CEB800E47090 /* Secret Socks */ = {
+ activeExec = 0;
+ executables = (
+ 5B3595091007D8D70060C42D /* Secret Socks */,
+ );
+ };
+ 8D1107310486CEB800E47090 /* Info.plist */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {944, 448}}";
+ sepNavSelRange = "{710, 0}";
+ sepNavVisRange = "{0, 851}";
+ sepNavWindowFrame = "{{663, 438}, {1003, 576}}";
+ };
+ };
+}
332 source/Secret Socks.xcodeproj/project.pbxproj
@@ -0,0 +1,332 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 5B35951B1007DB660060C42D /* ssh_interface.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B35951A1007DB660060C42D /* ssh_interface.m */; };
+ 5B35952110085F8F0060C42D /* SecretSocksController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B35952010085F8F0060C42D /* SecretSocksController.m */; };
+ 5B3595CA10089DE70060C42D /* ssh in Resources */ = {isa = PBXBuildFile; fileRef = 5B3595C910089DE70060C42D /* ssh */; };
+ 5B35971E1009AD880060C42D /* TaskWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B35971C1009AD880060C42D /* TaskWrapper.m */; };
+ 5B35991D100A34D90060C42D /* pass in Resources */ = {isa = PBXBuildFile; fileRef = 5B35991C100A34D90060C42D /* pass */; };
+ 5B3599FA100A79D90060C42D /* path4068.png in Resources */ = {isa = PBXBuildFile; fileRef = 5B3599F9100A79D90060C42D /* path4068.png */; };
+ 5B359DE1100BE3A00060C42D /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = 5B359DE0100BE3A00060C42D /* Credits.html */; };
+ 5B359EF8100D95310060C42D /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B359EF7100D95310060C42D /* Security.framework */; };
+ 5BEC78C010506C45007DF70A /* getservice.py in Resources */ = {isa = PBXBuildFile; fileRef = 5BEC78BF10506C45007DF70A /* getservice.py */; };
+ 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; };
+ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
+ 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
+ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = "<group>"; };
+ 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
+ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
+ 32CA4F630368D1EE00C91783 /* Secret Socks_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Secret Socks_Prefix.pch"; sourceTree = "<group>"; };
+ 5B3595191007DB650060C42D /* ssh_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssh_interface.h; sourceTree = "<group>"; };
+ 5B35951A1007DB660060C42D /* ssh_interface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ssh_interface.m; sourceTree = "<group>"; };
+ 5B35951F10085F8F0060C42D /* SecretSocksController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecretSocksController.h; sourceTree = "<group>"; };
+ 5B35952010085F8F0060C42D /* SecretSocksController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SecretSocksController.m; sourceTree = "<group>"; };
+ 5B3595C910089DE70060C42D /* ssh */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = ssh; sourceTree = "<group>"; };
+ 5B35971C1009AD880060C42D /* TaskWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TaskWrapper.m; sourceTree = "<group>"; };
+ 5B35971D1009AD880060C42D /* TaskWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TaskWrapper.h; sourceTree = "<group>"; };
+ 5B35991C100A34D90060C42D /* pass */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = pass; sourceTree = "<group>"; };
+ 5B3599F9100A79D90060C42D /* path4068.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = path4068.png; sourceTree = "<group>"; };
+ 5B359DE0100BE3A00060C42D /* Credits.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = Credits.html; sourceTree = "<group>"; };
+ 5B359EF7100D95310060C42D /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; };
+ 5BA31E17100E6B0900C5F597 /* locked-socks.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "locked-socks.icns"; sourceTree = "<group>"; };
+ 5BE5DCDF100ED128004C4DF5 /* getservice */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = getservice; sourceTree = "<group>"; };
+ 5BEC78BF10506C45007DF70A /* getservice.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = getservice.py; sourceTree = "<group>"; };
+ 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 8D1107320486CEB800E47090 /* Secret Socks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Secret Socks.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8D11072E0486CEB800E47090 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
+ 5B359EF8100D95310060C42D /* Security.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 5B3595191007DB650060C42D /* ssh_interface.h */,
+ 5B35951A1007DB660060C42D /* ssh_interface.m */,
+ 5B35971C1009AD880060C42D /* TaskWrapper.m */,
+ 5B35971D1009AD880060C42D /* TaskWrapper.h */,
+ 5B35951F10085F8F0060C42D /* SecretSocksController.h */,
+ 5B35952010085F8F0060C42D /* SecretSocksController.m */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 5B359EF7100D95310060C42D /* Security.framework */,
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
+ );
+ name = "Linked Frameworks";
+ sourceTree = "<group>";
+ };
+ 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 29B97324FDCFA39411CA2CEA /* AppKit.framework */,
+ 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
+ 29B97325FDCFA39411CA2CEA /* Foundation.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "<group>";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D1107320486CEB800E47090 /* Secret Socks.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* Secret Socks */ = {
+ isa = PBXGroup;
+ children = (
+ 080E96DDFE201D6D7F000001 /* Classes */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = "Secret Socks";
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 32CA4F630368D1EE00C91783 /* Secret Socks_Prefix.pch */,
+ 29B97316FDCFA39411CA2CEA /* main.m */,
+ 5B359DE0100BE3A00060C42D /* Credits.html */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 5BE5DCDF100ED128004C4DF5 /* getservice */,
+ 5BA31E17100E6B0900C5F597 /* locked-socks.icns */,
+ 5B3599F9100A79D90060C42D /* path4068.png */,
+ 5B3595C910089DE70060C42D /* ssh */,
+ 8D1107310486CEB800E47090 /* Info.plist */,
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
+ 29B97318FDCFA39411CA2CEA /* MainMenu.nib */,
+ 5B35991C100A34D90060C42D /* pass */,
+ 5BEC78BF10506C45007DF70A /* getservice.py */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
+ 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 8D1107260486CEB800E47090 /* Secret Socks */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Secret Socks" */;
+ buildPhases = (
+ 8D1107290486CEB800E47090 /* Resources */,
+ 8D11072C0486CEB800E47090 /* Sources */,
+ 8D11072E0486CEB800E47090 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Secret Socks";
+ productInstallPath = "$(HOME)/Applications";
+ productName = "Secret Socks";
+ productReference = 8D1107320486CEB800E47090 /* Secret Socks.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0420;
+ };
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Secret Socks" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* Secret Socks */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8D1107260486CEB800E47090 /* Secret Socks */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8D1107290486CEB800E47090 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */,
+ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
+ 5B3595CA10089DE70060C42D /* ssh in Resources */,
+ 5B35991D100A34D90060C42D /* pass in Resources */,
+ 5B3599FA100A79D90060C42D /* path4068.png in Resources */,
+ 5B359DE1100BE3A00060C42D /* Credits.html in Resources */,
+ 5BEC78C010506C45007DF70A /* getservice.py in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8D11072C0486CEB800E47090 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072D0486CEB800E47090 /* main.m in Sources */,
+ 5B35951B1007DB660060C42D /* ssh_interface.m in Sources */,
+ 5B35952110085F8F0060C42D /* SecretSocksController.m in Sources */,
+ 5B35971E1009AD880060C42D /* TaskWrapper.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C165DFE840E0CC02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 29B97319FDCFA39411CA2CEA /* English */,
+ );
+ name = MainMenu.nib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ C01FCF4B08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Secret Socks_Prefix.pch";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ PRODUCT_NAME = "Secret Socks";
+ SDKROOT = macosx;
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ C01FCF4C08A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Secret Socks_Prefix.pch";
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ PRODUCT_NAME = "Secret Socks";
+ SDKROOT = macosx;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = (
+ ppc,
+ i386,
+ );
+ CURRENT_PROJECT_VERSION = 1.0.2;
+ GCC_ENABLE_OBJC_GC = supported;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Secret Socks" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4B08A954540054247B /* Debug */,
+ C01FCF4C08A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Secret Socks" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
7 source/Secret Socks.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:Secret Socks.xcodeproj">
+ </FileRef>
+</Workspace>
BIN  ...Secret Socks.xcodeproj/project.xcworkspace/xcuserdata/yangfei.xcuserdatad/UserInterfaceState.xcuserstate
Binary file not shown
10 ...e/Secret Socks.xcodeproj/project.xcworkspace/xcuserdata/yangfei.xcuserdatad/WorkspaceSettings.xcsettings
@@ -0,0 +1,10 @@
+<?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>IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>
+ <true/>
+ <key>IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges</key>
+ <true/>
+</dict>
+</plist>
77 source/Secret Socks.xcodeproj/xcuserdata/yangfei.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+ type = "1"
+ version = "1.0">
+ <FileBreakpoints>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "SecretSocksController.m"
+ timestampString = "353042686.510241"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "33"
+ endingLineNumber = "33"
+ landmarkName = "@implementation SecretSocksController"
+ landmarkType = "3">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "SecretSocksController.m"
+ timestampString = "353042686.510241"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "31"
+ endingLineNumber = "31"
+ landmarkName = "-init"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "SecretSocksController.m"
+ timestampString = "353043091.844148"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "63"
+ endingLineNumber = "63"
+ landmarkName = "-doConnect:"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "SecretSocksController.m"
+ timestampString = "353046366.725604"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "353"
+ endingLineNumber = "353"
+ landmarkName = "-savePrefs"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "SecretSocksController.m"
+ timestampString = "353043933.703695"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "341"
+ endingLineNumber = "341"
+ landmarkName = "-loadPrefs"
+ landmarkType = "5">
+ </FileBreakpoint>
+ </FileBreakpoints>
+</Bucket>
84 source/Secret Socks.xcodeproj/xcuserdata/yangfei.xcuserdatad/xcschemes/Secret Socks.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8D1107260486CEB800E47090"
+ BuildableName = "Secret Socks.app"
+ BlueprintName = "Secret Socks"
+ ReferencedContainer = "container:Secret Socks.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8D1107260486CEB800E47090"
+ BuildableName = "Secret Socks.app"
+ BlueprintName = "Secret Socks"
+ ReferencedContainer = "container:Secret Socks.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8D1107260486CEB800E47090"
+ BuildableName = "Secret Socks.app"
+ BlueprintName = "Secret Socks"
+ ReferencedContainer = "container:Secret Socks.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8D1107260486CEB800E47090"
+ BuildableName = "Secret Socks.app"
+ BlueprintName = "Secret Socks"
+ ReferencedContainer = "container:Secret Socks.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
22 source/Secret Socks.xcodeproj/xcuserdata/yangfei.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,22 @@
+<?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>SchemeUserState</key>
+ <dict>
+ <key>Secret Socks.xcscheme</key>
+ <dict>
+ <key>orderHint</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>SuppressBuildableAutocreation</key>
+ <dict>
+ <key>8D1107260486CEB800E47090</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ </dict>
+</dict>
+</plist>
7 source/Secret Socks_Prefix.pch
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'Secret Socks' target in the 'Secret Socks' project
+//
+
+#ifdef __OBJC__
+ #import <Cocoa/Cocoa.h>
+#endif
72 source/SecretSocksController.h
@@ -0,0 +1,72 @@
+//
+// SecretSocksController.h
+// Secret Socks
+//
+// Created by Joshua Chan on 11/07/09.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "ssh_interface.h"
+#import "TaskWrapper.h"
+
+#include <stdio.h>
+#include <string.h>
+//#import <Security/Authorization.h>
+
+// Number of seconds to wait for SSH to connect
+#define SSH_TIMEOUT 10
+
+@interface SecretSocksController : NSObject <TaskWrapperController>
+{
+ IBOutlet NSMenuItem *connectMenu;
+ IBOutlet NSMenuItem *disconnectMenu;
+
+ IBOutlet NSTabView *tabs;
+ IBOutlet NSTextField *hostnameField;
+ IBOutlet NSTextField *portnumField;
+ IBOutlet NSTextField *keyField;
+ IBOutlet NSTextField *usernameField;
+ IBOutlet NSTextField *passwordField;
+ IBOutlet NSTextField *socksportField;
+ IBOutlet NSButton *applyToNetwork;
+ IBOutlet NSButton *toggleDrawer;
+ IBOutlet NSButton *rememberButton;
+
+ IBOutlet NSTextView *statusLabel;
+ IBOutlet NSButton *connectButton;
+ IBOutlet NSImageView *checkmark;
+ IBOutlet NSProgressIndicator *busySpin;
+ IBOutlet NSWindow *window;
+ IBOutlet NSDrawer *drawer;
+
+ IBOutlet NSDrawer *passwordDrawer;
+ IBOutlet NSTextField *passwordField2;
+
+ ssh_interface *sshInterface;
+ bool isConnected;
+ bool windowHasBeenClosed;
+ NSBundle *thisBundle;
+
+ NSUserDefaults *preferences;
+}
+
+- (id)init;
+- (IBAction)showConfig:(id)sender;
+- (IBAction)showStatus:(id)sender;
+- (IBAction)showHelp:(id)sender;
+- (IBAction)doConnect:(id)sender;
+- (void)toggleCheckmark:(bool)status;
+- (void)toggleSOCKSSetting:(bool)status;
+- (void)loadPrefs;
+- (void)savePrefs;
+- (void)applicationWillFinishLaunching: (NSNotification *)aNotification;
+- (BOOL)drawerShouldOpen:(NSDrawer *)sender;
+- (BOOL)drawerShouldClose:(NSDrawer *)sender;
+- (void)drawerDidOpen:(NSNotification *)notification;
+- (void)windowDidMiniaturize:(NSNotification *)notification;
+- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)theSender;
+- (BOOL)windowShouldClose:(id)theWindow;
+- (void)applicationWillTerminate:(NSApplication *)theApplication;
+- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication;
+
+@end
472 source/SecretSocksController.m
@@ -0,0 +1,472 @@
+//
+// SecretSocksController.m
+// Secret Socks
+//
+// Created by Joshua Chan on 11/07/09.
+//
+
+#import "SecretSocksController.h"
+
+@implementation SecretSocksController
+
+
+- (id)init {
+ self = [super init];
+
+ isConnected = false;
+ windowHasBeenClosed = false;
+ thisBundle = [NSBundle bundleForClass:[self class]];
+
+ preferences = [[NSUserDefaults standardUserDefaults] retain];
+ NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
+ @"" ,@"hostName",
+ @"22" , @"portNumber",
+ @"", @"obfuscationKey",
+ @"", @"username",
+ @"9999", @"socksPort",
+ [NSNumber numberWithInt:1], @"applyToNetwork",
+ nil ]; // terminate the list
+ [preferences registerDefaults:dict];
+ return self;
+}
+
+
+// Show the config screen
+- (IBAction)showConfig:(id)sender {
+ if ([drawer state] != NSDrawerOpenState) {
+ [toggleDrawer performClick: self];
+ }
+ [tabs selectTabViewItemWithIdentifier:@"config"];
+}
+
+// Show the status screen
+- (IBAction)showStatus:(id)sender {
+ if ([drawer state] != NSDrawerOpenState) {
+ [toggleDrawer performClick: self];
+ }
+ [tabs selectTabViewItemWithIdentifier:@"status"];
+}
+
+// Show the help screen
+- (IBAction)showHelp:(id)sender {
+ if ([drawer state] != NSDrawerOpenState) {
+ [toggleDrawer performClick: self];
+ }
+ [tabs selectTabViewItemWithIdentifier:@"help"];
+}
+
+
+// Respond to clicking the "Connect" button
+- (IBAction)doConnect:(id)sender {
+ [self savePrefs];
+
+ if (!isConnected) {
+ // Make sure hostname settings is present
+ if ([[hostnameField stringValue] length] == 0) {
+ [self showConfig: self];
+ return;
+ }
+ // Get password
+ else if ([passwordDrawer state] == NSDrawerOpenState) {
+ // standalone passwd has priority if drawer is open
+ [passwordField setStringValue: [passwordField2 stringValue]];
+ }else if ([[passwordField stringValue] length] == 0) {
+ if ([[passwordField2 stringValue] length] == 0) {
+ // Neither settings nor standalone has a passwd
+ [passwordDrawer open];
+ return;
+ } else {
+ // Copy standalone passwd to settings
+ [passwordField setStringValue: [passwordField2 stringValue]];
+ }
+ } else {
+ // Copy settings passwd to standalone box
+ [passwordField2 setStringValue: [passwordField stringValue]];
+ }
+
+ isConnected = true;
+
+ // Initialize sshInterface with config settings
+ sshInterface = [ssh_interface alloc];
+ [sshInterface setLocalSocksPort:[socksportField stringValue]];
+ [sshInterface setServerSshPort:[portnumField stringValue]];
+ [sshInterface setServerHostname:[hostnameField stringValue]];
+ [sshInterface setServerSshObfuscatedKey:[keyField stringValue]];
+ [sshInterface setServerSshUsername:[usernameField stringValue]];
+ [sshInterface setServerSshPasswd:[passwordField stringValue]];
+ // Connect
+ [sshInterface connectToServer:self];
+
+ if (isConnected) {
+ [passwordDrawer close];
+ }
+
+ } else {
+ // Disconnect
+ [sshInterface disconnectFromServer];
+ [sshInterface dealloc];
+ }
+}
+
+
+// This callback is implemented as part of conforming to the ProcessController protocol.
+// It will be called whenever there is output from the TaskWrapper.
+- (void)appendOutput:(NSString *)output
+{
+ // add the string to the NSTextView's
+ // backing store, in the form of an attributed string
+ [[statusLabel textStorage] appendAttributedString: [[[NSAttributedString alloc]
+ initWithString: output] autorelease]];
+ [self performSelector:@selector(scrollToVisible:) withObject:nil afterDelay:0.0];
+}
+
+
+// This routine is called after adding new results to the text view's backing store.
+// We now need to scroll the NSScrollView in which the NSTextView sits to the part
+// that we just added at the end
+- (void)scrollToVisible:(id)ignore {
+ [statusLabel scrollRangeToVisible:NSMakeRange([[statusLabel string] length], 0)];
+}
+
+
+// A callback that gets called when a TaskWrapper is launched, allowing us to do any setup
+// that is needed from the app side.
+- (void)processStarted
+{
+ [self appendOutput:@"\nConnecting...\n"];
+ [connectButton setTitle:@"Disconnect?"];
+ [busySpin startAnimation: self];
+
+ char searchStr[255];
+ char outputStr[1024];
+ FILE *fh;
+ int hasMatch, hasTimedOut;
+ NSDate *timeStarted = [NSDate date];
+ sprintf(searchStr, "127.0.0.1.%s", [[socksportField stringValue] cStringUsingEncoding:1]);
+
+ // Warning: n00b hack
+ // Keep running netstat to check whether the local SOCKS port is listening
+ do {
+ sleep(1);
+ hasMatch = false;
+ fh = popen("netstat -na", "r");
+ do {
+ fgets(outputStr, sizeof(outputStr), fh);
+ if (strstr(outputStr, searchStr)) {
+ hasMatch = true;
+ break;
+ }
+ } while (!feof(fh));
+ pclose(fh);
+ hasTimedOut = (abs((int)[timeStarted timeIntervalSinceNow]) > SSH_TIMEOUT);
+ } while (!hasTimedOut && !hasMatch && ![sshInterface hasTerminated]);
+
+ [busySpin stopAnimation: self];
+
+ // Check if socks proxy is open
+ if (hasMatch) {
+ [self toggleCheckmark: true];
+ [self appendOutput:@"Success!\n"];
+ // Turn on SOCKS in the system wide settings
+ if ([applyToNetwork state] == NSOnState) {
+ [self toggleSOCKSSetting: true];
+ }
+ } else {
+ // T