James Valleroy e719b1ed49
shadowsocksserver: Add separate app for Shadowsocks server
Closes: #729.

Tests:

- Install Shadowsocks Server. Install Shadowsocks Client, and set the
  server to localhost, and set the same password as the server. Use
  curl to connect to local SOCKS proxy on port 1080 and fetch a
  website.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
[sunil: Update some docstring comments for shadowsocks clients]
[sunil: Use the term Censorship instead of network filters]
[sunil: Prevent enabling both apps when setup is re-run]
[sunil: Update typehint for a privileged method to be minimal]
[sunil: Accept connections from external IPs too]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2023-05-23 13:58:39 -07:00

56 lines
1.7 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""FreedomBox app for configuring Shadowsocks Client."""
from django.contrib import messages
from django.utils.translation import gettext_lazy as _
from plinth import views
from . import privileged
from .forms import ShadowsocksForm
class ShadowsocksAppView(views.AppView):
"""Configuration view for Shadowsocks Client and SOCKS5 proxy."""
app_id = 'shadowsocks'
form_class = ShadowsocksForm
def get_initial(self, *args, **kwargs):
"""Get initial values for form."""
status = super().get_initial()
try:
status.update(privileged.get_config())
except Exception:
status.update({
'server': '',
'server_port': 8388,
'password': '',
'method': 'chacha20-ietf-poly1305',
})
return status
def form_valid(self, form):
"""Configure Shadowsocks."""
old_status = form.initial
new_status = form.cleaned_data
if old_status['server'] != new_status['server'] or \
old_status['server_port'] != new_status['server_port'] or \
old_status['password'] != new_status['password'] or \
old_status['method'] != new_status['method']:
new_config = {
'local_address': '::0',
'local_port': 1080,
'server': new_status['server'],
'server_port': new_status['server_port'],
'password': new_status['password'],
'method': new_status['method'],
}
privileged.merge_config(new_config)
messages.success(self.request, _('Configuration updated'))
return super().form_valid(form)