]> granicus.if.org Git - transmission/commitdiff
add a separate flag for enabling/disabling the rpc address whitelist
authorCharles Kerr <charles@transmissionbt.com>
Wed, 1 Oct 2008 22:59:29 +0000 (22:59 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Wed, 1 Oct 2008 22:59:29 +0000 (22:59 +0000)
cli/cli.c
daemon/daemon.c
gtk/main.c
gtk/tr-prefs.c
gtk/tr-prefs.h
libtransmission/rpc-server.c
libtransmission/rpc-server.h
libtransmission/session.c
libtransmission/transmission.h

index 3ef2182715215671ee6664d027fa05b4391bc5ec..4be969c03ce3452235c85b7ee87ed48aa791a2e7 100644 (file)
--- a/cli/cli.c
+++ b/cli/cli.c
@@ -310,6 +310,7 @@ main( int     argc,
         peerSocketTOS,
         TR_DEFAULT_RPC_ENABLED,
         TR_DEFAULT_RPC_PORT,
+        TR_DEFAULT_RPC_WHITELIST_ENABLED,
         TR_DEFAULT_RPC_WHITELIST,
         FALSE, "fnord", "potzrebie",
         TR_DEFAULT_PROXY_ENABLED,
index 795a2d458c7ae079e12f08a2f189a7155a8693c9..2f0e3c0c1702601606f5c2f153e7d20ef02077d4 100644 (file)
@@ -33,25 +33,26 @@ static int         closing = FALSE;
 static tr_handle * mySession;
 static char        myConfigFilename[MAX_PATH_LENGTH];
 
-#define KEY_BLOCKLIST        "blocklist-enabled"
-#define KEY_DOWNLOAD_DIR     "download-dir"
-#define KEY_ENCRYPTION       "encryption"
-#define KEY_LAZY_BITFIELD    "lazy-bitfield-enabled"
-#define KEY_PEER_LIMIT       "max-peers-global"
-#define KEY_PEER_PORT        "peer-port"
-#define KEY_PORT_FORWARDING  "port-forwarding-enabled"
-#define KEY_PEX_ENABLED      "pex-enabled"
-#define KEY_AUTH_REQUIRED    "rpc-authentication-required"
-#define KEY_USERNAME         "rpc-username"
-#define KEY_PASSWORD         "rpc-password"
-#define KEY_WHITELIST        "rpc-whitelist"
-#define KEY_RPC_PORT         "rpc-port"
-#define KEY_DSPEED           "download-limit"
-#define KEY_DSPEED_ENABLED   "download-limit-enabled"
-#define KEY_USPEED           "upload-limit"
-#define KEY_USPEED_ENABLED   "upload-limit-enabled"
-
-#define CONFIG_FILE          "settings.json"
+#define KEY_BLOCKLIST         "blocklist-enabled"
+#define KEY_DOWNLOAD_DIR      "download-dir"
+#define KEY_ENCRYPTION        "encryption"
+#define KEY_LAZY_BITFIELD     "lazy-bitfield-enabled"
+#define KEY_PEER_LIMIT        "max-peers-global"
+#define KEY_PEER_PORT         "peer-port"
+#define KEY_PORT_FORWARDING   "port-forwarding-enabled"
+#define KEY_PEX_ENABLED       "pex-enabled"
+#define KEY_AUTH_REQUIRED     "rpc-authentication-required"
+#define KEY_USERNAME          "rpc-username"
+#define KEY_PASSWORD          "rpc-password"
+#define KEY_WHITELIST         "rpc-whitelist"
+#define KEY_WHITELIST_ENABLED "rpc-whitelist-enabled"
+#define KEY_RPC_PORT          "rpc-port"
+#define KEY_DSPEED            "download-limit"
+#define KEY_DSPEED_ENABLED    "download-limit-enabled"
+#define KEY_USPEED            "upload-limit"
+#define KEY_USPEED_ENABLED    "upload-limit-enabled"
+
+#define CONFIG_FILE           "settings.json"
 
 /***
 ****  Config File
@@ -169,6 +170,7 @@ session_init( const char * configDir,
     char          mycwd[MAX_PATH_LENGTH];
     tr_benc       state, *dict = NULL;
     int           peerPort = -1, peers = -1;
+    int           whitelistEnabled = -1;
     int           pexEnabled = -1;
     int           fwdEnabled = -1;
     int           upLimit = -1, upLimited = -1, downLimit = -1,
@@ -208,6 +210,8 @@ session_init( const char * configDir,
                   TR_DEFAULT_BLOCKLIST_ENABLED );
     getConfigInt( dict, KEY_RPC_PORT,        &rpcPort,
                   TR_DEFAULT_RPC_PORT );
+    getConfigInt( dict, KEY_WHITELIST_ENABLED, &whitelistEnabled,
+                  TR_DEFAULT_RPC_WHITELIST_ENABLED );
     getConfigStr( dict, KEY_WHITELIST,       &whitelist,
                   TR_DEFAULT_RPC_WHITELIST );
     getConfigInt( dict, KEY_AUTH_REQUIRED,   &authRequired,      FALSE );
@@ -231,8 +235,9 @@ session_init( const char * configDir,
                                     TR_MSG_INF, 0,
                                     blocklistEnabled,
                                     TR_DEFAULT_PEER_SOCKET_TOS,
-                                    TRUE, rpcPort, whitelist, authRequired,
-                                    username, password,
+                                    TRUE, rpcPort,
+                                    whitelistEnabled, whitelist,
+                                    authRequired, username, password,
                                     TR_DEFAULT_PROXY_ENABLED,
                                     TR_DEFAULT_PROXY,
                                     TR_DEFAULT_PROXY_PORT,
index fbd778f8cbb99b95943c7b9e155e6b52c3630d4b..09bc53616683c3f8118c049f18ad4f4dfa39fd7e 100644 (file)
@@ -484,6 +484,7 @@ main( int     argc,
             pref_int_get( PREF_KEY_PEER_SOCKET_TOS ),
             pref_flag_get( PREF_KEY_RPC_ENABLED ),
             pref_int_get( PREF_KEY_RPC_PORT ),
+            pref_flag_get( PREF_KEY_RPC_WHITELIST_ENABLED ),
             pref_string_get( PREF_KEY_RPC_WHITELIST ),
             pref_flag_get( PREF_KEY_RPC_AUTH_ENABLED ),
             pref_string_get( PREF_KEY_RPC_USERNAME ),
@@ -1197,6 +1198,10 @@ prefschanged( TrCore * core UNUSED,
         const char * s = pref_string_get( key );
         tr_sessionSetRPCWhitelist( tr, s );
     }
+    else if( !strcmp( key, PREF_KEY_RPC_WHITELIST_ENABLED ) )
+    {
+        tr_sessionSetRPCWhitelistEnabled( tr, pref_flag_get( key ) );
+    }
     else if( !strcmp( key, PREF_KEY_RPC_USERNAME ) )
     {
         const char * s = pref_string_get( key );
index 433426ee3e6482d8a70f3e55b8596d50f6bdb9b0..a6a12e61ea62dfde86fde0739c9964c0fce71092 100644 (file)
@@ -128,6 +128,8 @@ tr_prefs_init_global( void )
     pref_flag_set_default   ( PREF_KEY_RPC_ENABLED, TR_DEFAULT_RPC_ENABLED );
     pref_int_set_default    ( PREF_KEY_RPC_PORT, TR_DEFAULT_RPC_PORT );
     pref_string_set_default ( PREF_KEY_RPC_WHITELIST, TR_DEFAULT_RPC_WHITELIST );
+    pref_flag_set_default   ( PREF_KEY_RPC_WHITELIST_ENABLED, TR_DEFAULT_RPC_WHITELIST_ENABLED  );
+
 
     rand = g_rand_new ( );
     for( i = 0; i < 16; ++i )
@@ -594,8 +596,10 @@ struct remote_page
     GtkWidget *        remove_button;
     GSList *           widgets;
     GSList *           auth_widgets;
+    GSList *           whitelist_widgets;
     GtkToggleButton *  rpc_tb;
     GtkToggleButton *  auth_tb;
+    GtkToggleButton *  whitelist_tb;
 };
 
 static void
@@ -686,6 +690,8 @@ refreshRPCSensitivity( struct remote_page * page )
         page->rpc_tb );
     const int          auth_active = gtk_toggle_button_get_active(
         page->auth_tb );
+    const int          whitelist_active = gtk_toggle_button_get_active(
+        page->whitelist_tb );
     GtkTreeSelection * sel = gtk_tree_view_get_selection( page->view );
     const int          have_addr =
         gtk_tree_selection_get_selected( sel, NULL,
@@ -700,6 +706,10 @@ refreshRPCSensitivity( struct remote_page * page )
         gtk_widget_set_sensitive( GTK_WIDGET(
                                       l->data ), rpc_active && auth_active );
 
+    for( l = page->whitelist_widgets; l != NULL; l = l->next )
+        gtk_widget_set_sensitive( GTK_WIDGET( l->data ),
+                                  rpc_active && whitelist_active );
+
     gtk_widget_set_sensitive( page->remove_button,
                               rpc_active && have_addr && n_rules > 1 );
 }
@@ -760,6 +770,12 @@ webPage( GObject * core )
     gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 );
     hig_workarea_add_wide_control( t, &row, h );
 
+    /* port */
+    w = new_spin_button( PREF_KEY_RPC_PORT, core, 0, 65535, 1 );
+    page->widgets = g_slist_append( page->widgets, w );
+    w = hig_workarea_add_row( t, &row, _( "Listening _port:" ), w, NULL );
+    page->widgets = g_slist_append( page->widgets, w );
+
     /* require authentication */
     s = _( "_Require username" );
     w = new_check_button( s, PREF_KEY_RPC_AUTH_ENABLED, core );
@@ -783,11 +799,13 @@ webPage( GObject * core )
     w = hig_workarea_add_row( t, &row, s, w, NULL );
     page->auth_widgets = g_slist_append( page->auth_widgets, w );
 
-    /* port */
-    w = new_spin_button( PREF_KEY_RPC_PORT, core, 0, 65535, 1 );
-    page->widgets = g_slist_append( page->widgets, w );
-    w = hig_workarea_add_row( t, &row, _( "Listening _port:" ), w, NULL );
+    /* require authentication */
+    s = _( "Only allow the following IP _addresses to connect:" );
+    w = new_check_button( s, PREF_KEY_RPC_WHITELIST_ENABLED, core );
+    hig_workarea_add_wide_control( t, &row, w );
+    page->whitelist_tb = GTK_TOGGLE_BUTTON( w );
     page->widgets = g_slist_append( page->widgets, w );
+    g_signal_connect( w, "clicked", G_CALLBACK( onRPCToggled ), page );
 
     /* access control list */
     {
@@ -806,7 +824,7 @@ webPage( GObject * core )
         g_signal_connect( w, "button-release-event",
                           G_CALLBACK( on_tree_view_button_released ), NULL );
 
-        page->widgets = g_slist_append( page->widgets, w );
+        page->whitelist_widgets = g_slist_append( page->whitelist_widgets, w );
         v = page->view = GTK_TREE_VIEW( w );
         gtk_tooltips_set_tip( tips, w,
                               _(
@@ -833,11 +851,11 @@ webPage( GObject * core )
         gtk_tree_view_append_column( v, c );
         gtk_tree_view_set_headers_visible( v, FALSE );
 
-        s = _( "Allowed _IP Addresses:" );
+        s = _( "Addresses:" );
         w = hig_workarea_add_row( t, &row, s, w, NULL );
         gtk_misc_set_alignment( GTK_MISC( w ), 0.0f, 0.0f );
         gtk_misc_set_padding( GTK_MISC( w ), 0, GUI_PAD );
-        page->widgets = g_slist_append( page->widgets, w );
+        page->whitelist_widgets = g_slist_append( page->whitelist_widgets, w );
 
         h = gtk_hbox_new( TRUE, GUI_PAD );
         w = gtk_button_new_from_stock( GTK_STOCK_REMOVE );
@@ -847,7 +865,7 @@ webPage( GObject * core )
         onWhitelistSelectionChanged( sel, page );
         gtk_box_pack_start_defaults( GTK_BOX( h ), w );
         w = gtk_button_new_from_stock( GTK_STOCK_ADD );
-        page->widgets = g_slist_append( page->widgets, w );
+        page->whitelist_widgets = g_slist_append( page->whitelist_widgets, w );
         g_signal_connect( w, "clicked", G_CALLBACK( onAddWhitelistClicked ), page );
         gtk_box_pack_start_defaults( GTK_BOX( h ), w );
         w = gtk_hbox_new( FALSE, 0 );
index 515da3e27d9044ffe6ae2800c380b62472c82956..a57c627e42586ea3824d3afd3b3a2e1e987bcfe5 100644 (file)
@@ -66,6 +66,7 @@ GtkWidget * tr_prefs_dialog_new( GObject *   core,
 #define PREF_KEY_RPC_PORT               "rpc-port"
 #define PREF_KEY_RPC_ENABLED            "rpc-enabled"
 #define PREF_KEY_RPC_WHITELIST          "rpc-whitelist"
+#define PREF_KEY_RPC_WHITELIST_ENABLED  "rpc-whitelist-enabled"
 #define PREF_KEY_RPC_AUTH_ENABLED       "rpc-authentication-required"
 #define PREF_KEY_RPC_PASSWORD           "rpc-password"
 #define PREF_KEY_RPC_USERNAME           "rpc-username"
index 6bbf38520226842ba402238d9d0ba8b43ad71cd4..25b2d6b383f53ec837aeb663e308641255b58b9d 100644 (file)
@@ -42,8 +42,9 @@
 
 struct tr_rpc_server
 {
-    unsigned int       isEnabled         : 1;
-    unsigned int       isPasswordEnabled : 1;
+    unsigned int       isEnabled          : 1;
+    unsigned int       isPasswordEnabled  : 1;
+    unsigned int       isWhitelistEnabled : 1;
     uint16_t           port;
     struct evhttp *    httpd;
     tr_handle *        session;
@@ -367,6 +368,9 @@ isAddressAllowed( const tr_rpc_server * server,
 {
     const char * str;
 
+    if( !server->isWhitelistEnabled )
+        return 1;
+
     for( str = server->whitelist; str && *str; )
     {
         const char * delimiter = strchr( str, ',' );
@@ -411,7 +415,7 @@ handle_request( struct evhttp_request * req,
             }
         }
 
-        if( server->whitelist && !isAddressAllowed( server, req->remote_host ) )
+        if( !isAddressAllowed( server, req->remote_host ) )
         {
             send_simple_response( req, 401, "Unauthorized IP Address" );
         }
@@ -550,6 +554,19 @@ tr_rpcGetWhitelist( const tr_rpc_server * server )
     return tr_strdup( server->whitelist ? server->whitelist : "" );
 }
 
+void
+tr_rpcSetWhitelistEnabled( tr_rpc_server  * server,
+                           int              isEnabled )
+{
+    server->isWhitelistEnabled = isEnabled != 0;
+}
+
+int
+tr_rpcGetWhitelistEnabled( const tr_rpc_server * server )
+{
+    return server->isWhitelistEnabled;
+}
+
 /****
 *****  PASSWORD
 ****/
@@ -625,6 +642,7 @@ tr_rpc_server *
 tr_rpcInit( tr_handle *  session,
             int          isEnabled,
             uint16_t     port,
+            int          isWhitelistEnabled,
             const char * whitelist,
             int          isPasswordEnabled,
             const char * username,
@@ -638,6 +656,7 @@ tr_rpcInit( tr_handle *  session,
     s->whitelist = tr_strdup( whitelist && *whitelist ? whitelist : TR_DEFAULT_RPC_WHITELIST );
     s->username = tr_strdup( username );
     s->password = tr_strdup( password );
+    s->isWhitelistEnabled = isWhitelistEnabled != 0;
     s->isPasswordEnabled = isPasswordEnabled != 0;
     s->isEnabled = isEnabled != 0;
     if( isEnabled )
index 407a5696cd90bd8188a583e87e4a05c05a207466..b21833e2eba5adb4a6a46774c40d2d8e207f1b16 100644 (file)
@@ -18,6 +18,7 @@ typedef struct tr_rpc_server tr_rpc_server;
 tr_rpc_server * tr_rpcInit( struct tr_handle * session,
                             int                isEnabled,
                             uint16_t           port,
+                            int                isWhitelistEnabled,
                             const char *       whitelist,
                             int                isPasswordEnabled,
                             const char *       username,
@@ -39,6 +40,11 @@ int             tr_rpcSetTest( const tr_rpc_server * server,
                                const char *          whitelist,
                                char **               allocme_errmsg );
 
+void            tr_rpcSetWhitelistEnabled( tr_rpc_server  * server,
+                                           int              isEnabled );
+
+int             tr_rpcGetWhitelistEnabled( const tr_rpc_server * server );
+
 void            tr_rpcSetWhitelist( tr_rpc_server * server,
                                     const char *    whitelist );
 
index ced5092ecb90a07940d93b822f1228d28bc1fd28..d7903c131926db7bd8cf8ef58a8bee97b4f5e781 100644 (file)
@@ -216,6 +216,7 @@ tr_sessionInitFull( const char *       configDir,
                     int                peerSocketTOS,
                     int                rpcIsEnabled,
                     uint16_t           rpcPort,
+                    int                rpcWhitelistIsEnabled,
                     const char *       rpcWhitelist,
                     int                rpcAuthIsEnabled,
                     const char *       rpcUsername,
@@ -294,7 +295,8 @@ tr_sessionInitFull( const char *       configDir,
     tr_statsInit( h );
 
     h->web = tr_webInit( h );
-    h->rpcServer = tr_rpcInit( h, rpcIsEnabled, rpcPort, rpcWhitelist,
+    h->rpcServer = tr_rpcInit( h, rpcIsEnabled, rpcPort,
+                               rpcWhitelistIsEnabled, rpcWhitelist,
                                rpcAuthIsEnabled, rpcUsername, rpcPassword );
 
     metainfoLookupRescan( h );
@@ -326,6 +328,7 @@ tr_sessionInit( const char * configDir,
                                TR_DEFAULT_PEER_SOCKET_TOS,
                                TR_DEFAULT_RPC_ENABLED,
                                TR_DEFAULT_RPC_PORT,
+                               TR_DEFAULT_RPC_WHITELIST_ENABLED,
                                TR_DEFAULT_RPC_WHITELIST,
                                FALSE,
                                "fnord",
@@ -1015,6 +1018,21 @@ tr_sessionGetRPCWhitelist( const tr_session * session )
     return tr_rpcGetWhitelist( session->rpcServer );
 }
 
+void
+tr_sessionSetRPCWhitelistEnabled( tr_session * session,
+                                  int          isEnabled )
+{
+    return tr_rpcSetWhitelistEnabled( session->rpcServer,
+                                      isEnabled );
+}
+
+int
+tr_sessionGetRPCWhitelistEnabled( const tr_session * session )
+{
+    return tr_rpcGetWhitelistEnabled( session->rpcServer );
+}
+
+
 void
 tr_sessionSetRPCPassword( tr_session * session,
                           const char * password )
index 4a86801a3d51480e28017b369652eaf828966a73..c41df91f96a395e84650e7c616e4385f68125acd 100644 (file)
@@ -131,6 +131,8 @@ tr_proxy_type;
 /** @see tr_sessionInitFull */
 #define TR_DEFAULT_RPC_WHITELIST            "127.0.0.1"
 /** @see tr_sessionInitFull */
+#define TR_DEFAULT_RPC_WHITELIST_ENABLED    0
+/** @see tr_sessionInitFull */
 #define TR_DEFAULT_PROXY_ENABLED            0
 /** @see tr_sessionInitFull */
 #define TR_DEFAULT_PROXY                    NULL
@@ -245,6 +247,7 @@ tr_encryption_mode;
  * @see TR_DEFAULT_RPC_ENABLED
  * @see TR_DEFAULT_RPC_PORT
  * @see TR_DEFAULT_RPC_WHITELIST
+ * @see TR_DEFAULT_RPC_WHITELIST_ENABLED
  * @see tr_sessionClose()
  */
 tr_handle * tr_sessionInitFull( const char *       configDir,
@@ -266,6 +269,7 @@ tr_handle * tr_sessionInitFull( const char *       configDir,
                                 int                peerSocketTOS,
                                 int                rpcIsEnabled,
                                 uint16_t           rpcPort,
+                                int                rpcWhitelistIsEnabled,
                                 const char *       rpcWhitelist,
                                 int                rpcPasswordIsEnabled,
                                 const char *       rpcUsername,
@@ -361,6 +365,11 @@ void   tr_sessionSetRPCWhitelist( tr_session * session,
     @see tr_sessionSetRPCWhitelist */
 char* tr_sessionGetRPCWhitelist( const tr_session * );
 
+void  tr_sessionSetRPCWhitelistEnabled( tr_session * session,
+                                        int          isEnabled );
+
+int   tr_sessionGetRPCWhitelistEnabled( const tr_session * session );
+
 void  tr_sessionSetRPCPassword( tr_session * session,
                                 const char * password );