]> granicus.if.org Git - transmission/commitdiff
#1157 ability to pick a random port in libtransmission; mac preference to pick a...
authorMitchell Livingston <livings124@transmissionbt.com>
Thu, 11 Dec 2008 04:41:23 +0000 (04:41 +0000)
committerMitchell Livingston <livings124@transmissionbt.com>
Thu, 11 Dec 2008 04:41:23 +0000 (04:41 +0000)
libtransmission/session.c
libtransmission/transmission.h
macosx/Controller.m
macosx/Defaults.plist
macosx/PrefsController.h
macosx/PrefsController.m
macosx/en.lproj/PrefsWindow.xib

index f5664f7ba2972f616a47d664c6dfcafcba4847a2..a4343ab4c991bc60798412e3b4c7bf8bb6733752 100644 (file)
@@ -39,6 +39,9 @@
 #include "web.h"
 #include "crypto.h"
 
+#define PORT_RANDOM_MIN 1024
+#define PORT_RANDOM_MAX 65535
+
 /* Generate a peer id : "-TRxyzb-" + 12 random alphanumeric
    characters, where x is the major version number, y is the
    minor version number, z is the maintenance number, and b
@@ -275,6 +278,11 @@ tr_sessionInitFull( const char *       configDir,
     /* Initialize rate and file descripts controls */
 
     tr_fdInit( globalPeerLimit );
+    
+    /* random port */
+    if ( publicPort == -1 )
+        publicPort = tr_cryptoWeakRandInt(PORT_RANDOM_MAX - PORT_RANDOM_MIN + 1) + PORT_RANDOM_MIN;
+    
     h->shared = tr_sharedInit( h, isPortForwardingEnabled, publicPort );
     h->isPortSet = publicPort >= 0;
 
@@ -423,6 +431,14 @@ tr_sessionSetPeerPort( tr_session * session,
     tr_runInEventThread( session, tr_setBindPortImpl, data );
 }
 
+tr_port
+tr_sessionSetPeerPortRandom( tr_session * session )
+{
+    const tr_port port = tr_cryptoWeakRandInt(PORT_RANDOM_MAX - PORT_RANDOM_MIN + 1) + PORT_RANDOM_MIN;
+    tr_sessionSetPeerPort( session, port);
+    return port;
+}
+
 tr_port
 tr_sessionGetPeerPort( const tr_handle * h )
 {
index a849264baa93ca0e12cadf384e11115be0f76811..1e77c8ec4587f631679ac369e220c52d003e399a 100644 (file)
@@ -204,6 +204,7 @@ tr_encryption_mode;
  *
  * @param publicPort
  *  Port number to open for incoming peer connections.
+ *  -1 for random port.
  *  #TR_DEFAULT_PORT is the default.
  *
  * @param encryptionMode
@@ -539,6 +540,8 @@ tr_bool tr_sessionIsPortForwardingEnabled( const tr_session  * session );
 void  tr_sessionSetPeerPort( tr_session  * session,
                              tr_port       port);
 
+tr_port tr_sessionSetPeerPortRandom( tr_session  * session );
+
 tr_port tr_sessionGetPeerPort( const tr_session * session );
 
 typedef enum
index 32d13e786e146b3b545eae362688178eea29373e..9162b9df7d805f75af696678d6509500e2b11365 100644 (file)
@@ -213,7 +213,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
                                 [[[fDefaults stringForKey: @"DownloadFolder"] stringByExpandingTildeInPath] UTF8String],
                                 [fDefaults boolForKey: @"PEXGlobal"],
                                 [fDefaults boolForKey: @"NatTraversal"],
-                                [fDefaults integerForKey: @"BindPort"],
+                                [fDefaults boolForKey: @"RandomPort"] ? -1 : [fDefaults integerForKey: @"BindPort"],
                                 TR_DEFAULT_ENCRYPTION, /* reset in prefs */
                                 TR_DEFAULT_LAZY_BITFIELD_ENABLED,
                                 NO, /* reset in prefs */
index c77751994a44d843ba9cf1731de646115be5be4f..a443757226501f98077ff716b94cc836d6907ca0 100644 (file)
        <false/>
        <key>QueueSeedNumber</key>
        <integer>3</integer>
+       <key>RandomPort</key>
+       <false/>
        <key>RatioCheck</key>
        <false/>
        <key>RatioLimit</key>
index ba02c5f347e64b575b0b1e55140c462318ea1d65..568155085a8db019490afebe23b9eb95696d1b93 100644 (file)
@@ -66,6 +66,7 @@
 + (tr_handle *) handle;
 
 - (void) setPort: (id) sender;
+- (void) randomPort: (id) sender;
 - (void) setNat: (id) sender;
 - (void) updatePortStatus;
 - (void) portCheckerDidFinishProbing: (PortChecker *) portChecker;
index 50e5cff6eff5e64b40c5f9886e8afdd788b1ecad..ea5b1281e321fa266acd0b40f0c2fd40a9fd471a 100644 (file)
@@ -111,6 +111,10 @@ tr_handle * fHandle;
             [fDefaults removeObjectForKey: @"DownloadChoice"];
         }
         
+        //save a new random port
+        if ([fDefaults boolForKey: @"RandomPort"])
+            [fDefaults setInteger: tr_sessionGetPeerPort(fHandle) forKey: @"BindPort"];
+        
         //set auto import
         NSString * autoPath;
         if ([fDefaults boolForKey: @"AutoImport"] && (autoPath = [fDefaults stringForKey: @"AutoImportDirectory"]))
@@ -340,6 +344,14 @@ tr_handle * fHandle;
     [self updatePortStatus];
 }
 
+- (void) randomPort: (id) sender
+{
+    tr_port port = tr_sessionSetPeerPortRandom(fHandle);
+    
+    [fPortField setIntValue: port];
+    [self setPort: nil];
+}
+
 - (void) setNat: (id) sender
 {
     tr_sessionSetPortForwardingEnabled(fHandle, [fDefaults boolForKey: @"NatTraversal"]);
@@ -1036,7 +1048,7 @@ tr_handle * fHandle;
     [fDefaults setBool: pex forKey: @"PEXGlobal"];
     
     //port
-    int port = tr_sessionGetPeerPort(fHandle);
+    tr_port port = tr_sessionGetPeerPort(fHandle);
     [fDefaults setInteger: port forKey: @"BindPort"];
     
     BOOL nat = tr_sessionIsPortForwardingEnabled(fHandle);
index 3ba923432c23328ca3079d788f2e8581c340e506..5de3dd7d4e7f7d5cfdbdf67dcdc69158a2297ffa 100644 (file)
@@ -8,6 +8,7 @@
                <string key="IBDocument.HIToolboxVersion">352.00</string>
                <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
                        <bool key="EncodedWithXMLCoder">YES</bool>
+                       <integer value="66"/>
                </object>
                <object class="NSArray" key="IBDocument.PluginDependencies">
                        <bool key="EncodedWithXMLCoder">YES</bool>
@@ -53,7 +54,7 @@
                                <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
                        </object>
                        <object class="NSCustomView" id="249126185">
-                               <nil key="NSNextResponder"/>
+                               <reference key="NSNextResponder"/>
                                <int key="NSvFlags">256</int>
                                <object class="NSMutableArray" key="NSSubviews">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
@@ -62,6 +63,7 @@
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{189, 101}, {181, 18}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="114288993">
                                                        <int key="NSCellFlags">67239424</int>
@@ -93,6 +95,7 @@
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{189, 141}, {193, 18}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="1341189">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{78, 142}, {108, 17}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="184036008">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{42, 198}, {144, 17}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="811813130">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{189, 197}, {149, 18}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="284839720">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{189, 177}, {131, 18}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="556408151">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{208, 121}, {258, 18}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="263018774">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{208, 81}, {258, 18}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="718603970">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{106, 235}, {80, 17}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="1017981285">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{189, 234}, {303, 18}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="37001111">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{288, 49}, {82, 32}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="983781505">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{188, 59}, {101, 17}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="765517424">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{189, 19}, {183, 18}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="687318378">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{69, 20}, {117, 17}}</string>
                                                <reference key="NSSuperview" ref="249126185"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="450175985">
                                                        <int key="NSCellFlags">67239424</int>
                                        </object>
                                </object>
                                <string key="NSFrameSize">{535, 272}</string>
+                               <reference key="NSSuperview"/>
+                               <reference key="NSWindow"/>
                                <string key="NSClassName">NSView</string>
                                <string key="NSExtension">NSResponder</string>
                        </object>
@@ -3945,7 +3962,7 @@ AAABAAAAAQ</bytes>
                                <string key="NSExtension">NSResponder</string>
                        </object>
                        <object class="NSCustomView" id="538122014">
-                               <nil key="NSNextResponder"/>
+                               <reference key="NSNextResponder"/>
                                <int key="NSvFlags">256</int>
                                <object class="NSMutableArray" key="NSSubviews">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
@@ -3954,6 +3971,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{151, 134}, {184, 18}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="261591174">
                                                        <int key="NSCellFlags">67239424</int>
@@ -3976,6 +3994,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{54, 155}, {75, 17}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="695755489">
                                                        <int key="NSCellFlags">67239424</int>
@@ -3992,6 +4011,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{132, 154}, {165, 18}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="478851799">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4014,6 +4034,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{42, 258}, {87, 17}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="759095525">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4030,6 +4051,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{131, 258}, {196, 17}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="195557530">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4046,6 +4068,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{332, 256}, {50, 22}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="425686317">
                                                        <int key="NSCellFlags">-1804468671</int>
@@ -4112,6 +4135,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{387, 258}, {39, 17}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="120526424">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4128,6 +4152,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{454, 232}, {39, 17}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="454043587">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4144,6 +4169,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{399, 230}, {50, 22}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="963807331">
                                                        <int key="NSCellFlags">-1804468671</int>
@@ -4210,6 +4236,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{131, 232}, {263, 17}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="250566813">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4226,6 +4253,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{132, 190}, {280, 18}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="985508058">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4248,6 +4276,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{131, 212}, {259, 14}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="32643885">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4264,6 +4293,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{131, 54}, {362, 14}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="520011795">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4283,6 +4313,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{132, 98}, {289, 18}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="245208224">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4305,6 +4336,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{68, 99}, {61, 17}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="188659193">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4321,6 +4353,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{212, 76}, {306, 17}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="234963311">
                                                        <int key="NSCellFlags">67239488</int>
@@ -4337,6 +4370,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{128, 66}, {85, 32}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="650733440">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4357,6 +4391,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{497, 12}, {21, 23}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="266091399">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4380,6 +4415,7 @@ AAABAAAAAQ</bytes>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{151, 32}, {203, 18}}</string>
                                                <reference key="NSSuperview" ref="538122014"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="46409197">
                                                        <int key="NSCellFlags">67239424</int>
@@ -4399,11 +4435,13 @@ AAABAAAAAQ</bytes>
                                        </object>
                                </object>
                                <string key="NSFrameSize">{535, 298}</string>
+                               <reference key="NSSuperview"/>
+                               <reference key="NSWindow"/>
                                <string key="NSClassName">NSView</string>
                                <string key="NSExtension">NSResponder</string>
                        </object>
                        <object class="NSCustomView" id="204700639">
-                               <nil key="NSNextResponder"/>
+                               <reference key="NSNextResponder"/>
                                <int key="NSvFlags">256</int>
                                <object class="NSMutableArray" key="NSSubviews">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
@@ -4472,7 +4510,7 @@ AAABAAAAAQ</bytes>
                                                <reference key="NSNextResponder" ref="204700639"/>
                                                <int key="NSvFlags">1280</int>
                                                <object class="NSPSMatrix" key="NSDrawMatrix"/>
-                                               <string key="NSFrame">{{319, 279}, {16, 16}}</string>
+                                               <string key="NSFrame">{{319, 305}, {16, 16}}</string>
                                                <reference key="NSSuperview" ref="204700639"/>
                                                <int key="NSpiFlags">28938</int>
                                                <double key="NSMaxValue">1.000000e+02</double>
@@ -4492,7 +4530,7 @@ AAABAAAAAQ</bytes>
                                                                <string>NeXT TIFF v4.0 pasteboard type</string>
                                                        </object>
                                                </object>
-                                               <string key="NSFrame">{{320, 280}, {14, 14}}</string>
+                                               <string key="NSFrame">{{320, 306}, {14, 14}}</string>
                                                <reference key="NSSuperview" ref="204700639"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSImageCell" key="NSCell" id="270102740">
@@ -4512,7 +4550,7 @@ AAABAAAAAQ</bytes>
                                        <object class="NSTextField" id="585772012">
                                                <reference key="NSNextResponder" ref="204700639"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{134, 279}, {124, 17}}</string>
+                                               <string key="NSFrame">{{134, 305}, {124, 17}}</string>
                                                <reference key="NSSuperview" ref="204700639"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="941628063">
@@ -4547,6 +4585,28 @@ AAABAAAAAQ</bytes>
                                                        <int key="NSPeriodicInterval">25</int>
                                                </object>
                                        </object>
+                                       <object class="NSButton" id="200017199">
+                                               <reference key="NSNextResponder" ref="204700639"/>
+                                               <int key="NSvFlags">256</int>
+                                               <string key="NSFrame">{{135, 279}, {231, 18}}</string>
+                                               <reference key="NSSuperview" ref="204700639"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSButtonCell" key="NSCell" id="847795095">
+                                                       <int key="NSCellFlags">67239424</int>
+                                                       <int key="NSCellFlags2">0</int>
+                                                       <string key="NSContents">Randomize the port every launch</string>
+                                                       <reference key="NSSupport" ref="86725571"/>
+                                                       <reference key="NSControlView" ref="200017199"/>
+                                                       <int key="NSButtonFlags">1211912703</int>
+                                                       <int key="NSButtonFlags2">2</int>
+                                                       <reference key="NSNormalImage" ref="1001726176"/>
+                                                       <reference key="NSAlternateImage" ref="764913887"/>
+                                                       <string key="NSAlternateContents"/>
+                                                       <string key="NSKeyEquivalent"/>
+                                                       <int key="NSPeriodicDelay">200</int>
+                                                       <int key="NSPeriodicInterval">25</int>
+                                               </object>
+                                       </object>
                                        <object class="NSButton" id="622323577">
                                                <reference key="NSNextResponder" ref="204700639"/>
                                                <int key="NSvFlags">256</int>
@@ -4572,7 +4632,7 @@ AAABAAAAAQ</bytes>
                                        <object class="NSTextField" id="911608268">
                                                <reference key="NSNextResponder" ref="204700639"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{263, 277}, {50, 22}}</string>
+                                               <string key="NSFrame">{{263, 303}, {50, 22}}</string>
                                                <reference key="NSSuperview" ref="204700639"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="453443006">
@@ -4720,7 +4780,7 @@ AAABAAAAAQ</bytes>
                                        <object class="NSTextField" id="992746122">
                                                <reference key="NSNextResponder" ref="204700639"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{339, 279}, {179, 17}}</string>
+                                               <string key="NSFrame">{{339, 305}, {179, 17}}</string>
                                                <reference key="NSSuperview" ref="204700639"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="931894024">
@@ -4736,7 +4796,7 @@ AAABAAAAAQ</bytes>
                                        <object class="NSTextField" id="25993221">
                                                <reference key="NSNextResponder" ref="204700639"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{71, 279}, {61, 17}}</string>
+                                               <string key="NSFrame">{{71, 305}, {61, 17}}</string>
                                                <reference key="NSSuperview" ref="204700639"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="475516915">
@@ -4987,8 +5047,32 @@ AAABAAAAAQ</bytes>
                                                        <int key="NSArrowPosition">2</int>
                                                </object>
                                        </object>
+                                       <object class="NSButton" id="994561291">
+                                               <reference key="NSNextResponder" ref="204700639"/>
+                                               <int key="NSvFlags">256</int>
+                                               <string key="NSFrame">{{366, 269}, {111, 32}}</string>
+                                               <reference key="NSSuperview" ref="204700639"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSButtonCell" key="NSCell" id="681368311">
+                                                       <int key="NSCellFlags">67239424</int>
+                                                       <int key="NSCellFlags2">134217728</int>
+                                                       <string key="NSContents">Randomize</string>
+                                                       <reference key="NSSupport" ref="86725571"/>
+                                                       <reference key="NSControlView" ref="994561291"/>
+                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                       <int key="NSButtonFlags2">1</int>
+                                                       <reference key="NSAlternateImage" ref="86725571"/>
+                                                       <string key="NSAlternateContents"/>
+                                                       <object class="NSMutableString" key="NSKeyEquivalent">
+                                                               <characters key="NS.bytes"/>
+                                                       </object>
+                                                       <int key="NSPeriodicDelay">200</int>
+                                                       <int key="NSPeriodicInterval">25</int>
+                                               </object>
+                                       </object>
                                </object>
-                               <string key="NSFrameSize">{535, 319}</string>
+                               <string key="NSFrameSize">{535, 345}</string>
+                               <reference key="NSSuperview"/>
                                <string key="NSClassName">NSView</string>
                                <string key="NSExtension">NSResponder</string>
                        </object>
@@ -5472,6 +5556,10 @@ AAABAAAAAQ</bytes>
                                <string key="NSExtension">NSResponder</string>
                        </object>
                        <object class="NSUserDefaultsController" id="356871564">
+                               <object class="NSMutableArray" key="NSDeclaredKeys">
+                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                       <string>RandomPort</string>
+                               </object>
                                <bool key="NSSharedInstance">YES</bool>
                        </object>
                        <object class="NSCustomObject" id="981493640">
@@ -8632,6 +8720,30 @@ AAABAAAAAQ</bytes>
                                        </object>
                                        <int key="connectionID">1888</int>
                                </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">value: values.RandomPort</string>
+                                               <reference key="source" ref="200017199"/>
+                                               <reference key="destination" ref="356871564"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="200017199"/>
+                                                       <reference key="NSDestination" ref="356871564"/>
+                                                       <string key="NSLabel">value: values.RandomPort</string>
+                                                       <string key="NSBinding">value</string>
+                                                       <string key="NSKeyPath">values.RandomPort</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">1893</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">randomPort:</string>
+                                               <reference key="source" ref="511492310"/>
+                                               <reference key="destination" ref="994561291"/>
+                                       </object>
+                                       <int key="connectionID">1894</int>
+                               </object>
                        </object>
                        <object class="IBMutableOrderedSet" key="objectRecords">
                                <object class="NSArray" key="orderedObjects">
@@ -9140,6 +9252,8 @@ AAABAAAAAQ</bytes>
                                                        <reference ref="457836636"/>
                                                        <reference ref="191075786"/>
                                                        <reference ref="190240104"/>
+                                                       <reference ref="200017199"/>
+                                                       <reference ref="994561291"/>
                                                </object>
                                                <reference key="parent" ref="37013934"/>
                                                <string key="objectName">Network</string>
@@ -11238,6 +11352,34 @@ AAABAAAAAQ</bytes>
                                                <reference key="object" ref="660134747"/>
                                                <reference key="parent" ref="360885126"/>
                                        </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">1889</int>
+                                               <reference key="object" ref="200017199"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="847795095"/>
+                                               </object>
+                                               <reference key="parent" ref="204700639"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">1890</int>
+                                               <reference key="object" ref="847795095"/>
+                                               <reference key="parent" ref="200017199"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">1891</int>
+                                               <reference key="object" ref="994561291"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="681368311"/>
+                                               </object>
+                                               <reference key="parent" ref="204700639"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">1892</int>
+                                               <reference key="object" ref="681368311"/>
+                                               <reference key="parent" ref="994561291"/>
+                                       </object>
                                </object>
                        </object>
                        <object class="NSMutableDictionary" key="flattenedProperties">
@@ -11595,6 +11737,12 @@ AAABAAAAAQ</bytes>
                                        <string>1834.ImportedFromIB2</string>
                                        <string>1835.IBPluginDependency</string>
                                        <string>1887.IBPluginDependency</string>
+                                       <string>1889.IBPluginDependency</string>
+                                       <string>1889.ImportedFromIB2</string>
+                                       <string>1890.IBPluginDependency</string>
+                                       <string>1891.IBPluginDependency</string>
+                                       <string>1891.ImportedFromIB2</string>
+                                       <string>1892.IBPluginDependency</string>
                                        <string>190.IBPluginDependency</string>
                                        <string>190.ImportedFromIB2</string>
                                        <string>192.IBPluginDependency</string>
@@ -12149,6 +12297,12 @@ AAABAAAAAQ</bytes>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <real value="1.000000e+00"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <real value="1.000000e+00"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <reference ref="761722050"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <reference ref="761722050"/>
@@ -12322,7 +12476,7 @@ AAABAAAAAQ</bytes>
                                        <reference ref="761722050"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <reference ref="761722050"/>
-                                       <string>{{24, 369}, {535, 319}}</string>
+                                       <string>{{24, 343}, {535, 345}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <reference ref="761722050"/>
                                        <string>{{281, 577}, {539, 315}}</string>
@@ -12376,7 +12530,7 @@ AAABAAAAAQ</bytes>
                                </object>
                        </object>
                        <nil key="sourceID"/>
-                       <int key="maxID">1888</int>
+                       <int key="maxID">1894</int>
                </object>
                <object class="IBClassDescriber" key="IBDocument.Classes">
                        <object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -12435,6 +12589,9 @@ AAABAAAAAQ</bytes>
                                                        <string>fGroupRulesPrefsContainer</string>
                                                        <string>fGroupRulesSheetWindow</string>
                                                        <string>fRuleEditor</string>
+                                                       <string>fRulesSheetCancelButton</string>
+                                                       <string>fRulesSheetDescriptionField</string>
+                                                       <string>fRulesSheetOKButton</string>
                                                        <string>fSelectedColorNameField</string>
                                                        <string>fSelectedColorView</string>
                                                        <string>fTableView</string>
@@ -12449,6 +12606,9 @@ AAABAAAAAQ</bytes>
                                                        <string>NSView</string>
                                                        <string>NSWindow</string>
                                                        <string>NSRuleEditor</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSButton</string>
                                                        <string>NSTextField</string>
                                                        <string>NSColorWell</string>
                                                        <string>NSTableView</string>
@@ -12542,6 +12702,7 @@ AAABAAAAAQ</bytes>
                                                        <string>importFolderSheetShow:</string>
                                                        <string>incompleteFolderSheetShow:</string>
                                                        <string>linkWebUI:</string>
+                                                       <string>randomPort:</string>
                                                        <string>resetWarnings:</string>
                                                        <string>setAutoImport:</string>
                                                        <string>setAutoSize:</string>
@@ -12629,6 +12790,7 @@ AAABAAAAAQ</bytes>
                                                        <string>id</string>
                                                        <string>id</string>
                                                        <string>id</string>
+                                                       <string>id</string>
                                                </object>
                                        </object>
                                        <object class="NSMutableDictionary" key="outlets">