Skip to content

Commit 3558bbf

Browse files
committed
[ADDED] option to manually configure tor socks port
1 parent 49579f4 commit 3558bbf

File tree

3 files changed

+127
-33
lines changed

3 files changed

+127
-33
lines changed

lib/screens/dojo_configure.dart

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -300,16 +300,6 @@ class _DojoCardState extends State<DojoCard> {
300300
color: getTorIconColor(model.torStatus),
301301
),
302302
onPressed: () {
303-
// showTorPanel(context);
304-
305-
Navigator.push(
306-
context,
307-
new MaterialPageRoute(
308-
builder: (c) {
309-
return DojoConfigureScreen();
310-
},
311-
fullscreenDialog: true));
312-
// showDojoPanel(context);
313303
},
314304
);
315305
},

lib/widgets/port_selector.dart

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter/services.dart';
3+
import 'package:sentinelx/channels/network_channel.dart';
4+
import 'package:sentinelx/models/db/prefs_store.dart';
5+
6+
class PortSelector extends StatefulWidget {
7+
@override
8+
_PortSelectorState createState() => _PortSelectorState();
9+
}
10+
11+
class _PortSelectorState extends State<PortSelector> {
12+
TextEditingController _textEditingController = new TextEditingController();
13+
GlobalKey<FormState> _formKey = GlobalKey();
14+
15+
@override
16+
void initState() {
17+
super.initState();
18+
this.init();
19+
}
20+
21+
@override
22+
Widget build(BuildContext context) {
23+
return Card(
24+
child: Padding(
25+
padding: const EdgeInsets.symmetric(horizontal: 18),
26+
child: Column(
27+
crossAxisAlignment: CrossAxisAlignment.start,
28+
mainAxisSize: MainAxisSize.min,
29+
children: <Widget>[
30+
Padding(
31+
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 16),
32+
child: Text(
33+
'Enter Port number',
34+
)),
35+
Padding(
36+
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
37+
child: Row(
38+
children: <Widget>[
39+
Expanded(
40+
flex: 3,
41+
child: Form(
42+
key: _formKey,
43+
child: TextFormField(
44+
controller: _textEditingController,
45+
validator: (val) {
46+
RegExp regExp = new RegExp(
47+
r"^()([1-9]|[1-5]?[0-9]{2,4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5])$",
48+
multiLine: false,
49+
);
50+
if (regExp.hasMatch(val)) {
51+
return null;
52+
} else {
53+
return "Invalid port range";
54+
}
55+
},
56+
decoration: InputDecoration(),
57+
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
58+
keyboardType: TextInputType.number,
59+
maxLength: 5,
60+
autofocus: true,
61+
),
62+
),
63+
),
64+
Expanded(
65+
flex: 1,
66+
child: FlatButton(child: Text("Set Port"), onPressed: setPort),
67+
)
68+
],
69+
),
70+
),
71+
SizedBox(height: 10),
72+
],
73+
),
74+
),
75+
);
76+
}
77+
78+
void setPort() async {
79+
if (_formKey.currentState.validate()) {
80+
var portString = _textEditingController.text.toString();
81+
var port = int.parse(portString);
82+
PrefsStore().put(PrefsStore.TOR_PORT, port);
83+
await NetworkChannel().setTorPort(port);
84+
Navigator.of(context).pop();
85+
}
86+
}
87+
88+
void init() async {
89+
await Future.delayed(Duration(milliseconds: 500));
90+
var port = await PrefsStore().getInt(PrefsStore.TOR_PORT);
91+
if (port == null) {
92+
} else {
93+
_textEditingController.text = port.toString();
94+
}
95+
}
96+
}

lib/widgets/tor_control_panel.dart

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:sentinelx/channels/network_channel.dart';
55
import 'package:sentinelx/models/db/prefs_store.dart';
66
import 'package:sentinelx/shared_state/network_state.dart';
77
import 'package:sentinelx/utils/utils.dart';
8+
import 'package:sentinelx/widgets/port_selector.dart';
89
import 'package:sentinelx/widgets/sentinelx_icons.dart';
910

1011
showTorPanel(BuildContext context) {
@@ -27,6 +28,7 @@ class TorControlPanel extends StatefulWidget {
2728
class _TorControlPanelState extends State<TorControlPanel> {
2829
bool torOnStartup = false;
2930
bool isDojoEnabled = false;
31+
int port = -1;
3032

3133
@override
3234
Widget build(BuildContext context) {
@@ -53,15 +55,11 @@ class _TorControlPanelState extends State<TorControlPanel> {
5355
children: <Widget>[
5456
Text(
5557
"Tor Routing",
56-
style: Theme.of(context)
57-
.textTheme
58-
.title
59-
.copyWith(fontSize: 16),
58+
style: Theme.of(context).textTheme.title.copyWith(fontSize: 16),
6059
),
6160
Consumer<NetworkState>(
6261
builder: (context, model, c) {
63-
bool isRunning =
64-
model.torStatus == TorStatus.CONNECTED;
62+
bool isRunning = model.torStatus == TorStatus.CONNECTED;
6563
return FlatButton(
6664
onPressed: () {
6765
startOrStopTor(isRunning);
@@ -118,19 +116,32 @@ class _TorControlPanelState extends State<TorControlPanel> {
118116
),
119117
),
120118
Divider(),
119+
ListTile(
120+
onTap: () {
121+
showModalBottomSheet(context: context, isScrollControlled: true, builder: (context) => PortSelector());
122+
},
123+
title: Text("SOCKS Port"),
124+
trailing: Padding(
125+
padding: EdgeInsets.symmetric(horizontal: 24),
126+
child: Text(port==-1 ? "auto": "$port" ),
127+
),
128+
),
129+
Divider(),
121130
ListTile(
122131
title: Text("View tor logs"),
123132
onTap: showLogs,
124133
),
125-
isDojoEnabled ? ListTile(
126-
subtitle: Text(
127-
"Note: Tor cannot be disabled if dojo is active",
128-
style: Theme.of(context).textTheme.subtitle.copyWith(fontSize: 12),
129-
textAlign: TextAlign.center,
130-
),
131-
selected: true,
132-
onTap: showLogs,
133-
) : SizedBox.shrink(),
134+
isDojoEnabled
135+
? ListTile(
136+
subtitle: Text(
137+
"Note: Tor cannot be disabled if dojo is active",
138+
style: Theme.of(context).textTheme.subtitle.copyWith(fontSize: 12),
139+
textAlign: TextAlign.center,
140+
),
141+
selected: true,
142+
onTap: showLogs,
143+
)
144+
: SizedBox.shrink(),
134145
],
135146
),
136147
)
@@ -159,9 +170,11 @@ class _TorControlPanelState extends State<TorControlPanel> {
159170

160171
void init() async {
161172
String data = await PrefsStore().getString(PrefsStore.DOJO);
173+
int portPref = await PrefsStore().getInt(PrefsStore.TOR_PORT);
162174
if (data != null && data != "") {
163175
setState(() {
164176
isDojoEnabled = true;
177+
port = portPref;
165178
});
166179
}
167180
}
@@ -179,8 +192,7 @@ class _TorControlPanelState extends State<TorControlPanel> {
179192
crossAxisAlignment: CrossAxisAlignment.start,
180193
children: <Widget>[
181194
Padding(
182-
padding: const EdgeInsets.symmetric(
183-
vertical: 16, horizontal: 14),
195+
padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 14),
184196
child: Text(
185197
"Tor Logs",
186198
style: Theme.of(context).textTheme.caption,
@@ -213,8 +225,7 @@ class _TorLogViewerState extends State<TorLogViewer> {
213225
super.initState();
214226

215227
NetworkChannel().listenToTorLogs().stream.listen((event) {
216-
if (log.split("\n").last == event ||
217-
NetworkChannel().status == TorStatus.DISCONNECTED) {
228+
if (log.split("\n").last == event || NetworkChannel().status == TorStatus.DISCONNECTED) {
218229
return;
219230
}
220231
setState(() {
@@ -234,10 +245,7 @@ class _TorLogViewerState extends State<TorLogViewer> {
234245
child: Text(
235246
"$log",
236247
textAlign: TextAlign.left,
237-
style: TextStyle(
238-
fontSize: 12,
239-
color: Theme.of(context).textTheme.subtitle.color,
240-
fontWeight: FontWeight.w300),
248+
style: TextStyle(fontSize: 12, color: Theme.of(context).textTheme.subtitle.color, fontWeight: FontWeight.w300),
241249
),
242250
)),
243251
);

0 commit comments

Comments
 (0)