mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-01-28 08:03:36 +00:00
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>
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""FreedomBox app for configuring Shadowsocks Server."""
|
|
|
|
import random
|
|
import string
|
|
|
|
from django.contrib import messages
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from plinth import views
|
|
|
|
from . import privileged
|
|
from .forms import ShadowsocksServerForm
|
|
|
|
|
|
class ShadowsocksServerAppView(views.AppView):
|
|
"""Configuration view for Shadowsocks Server."""
|
|
|
|
app_id = 'shadowsocksserver'
|
|
form_class = ShadowsocksServerForm
|
|
|
|
def get_initial(self, *args, **kwargs):
|
|
"""Get initial values for form."""
|
|
status = super().get_initial()
|
|
try:
|
|
status.update(privileged.get_config())
|
|
except Exception:
|
|
# If we cannot read the configuration for some reason, generate a
|
|
# new random password.
|
|
password = ''.join(
|
|
random.choice(string.ascii_letters) for _ in range(12))
|
|
status.update({
|
|
'password': password,
|
|
'method': 'chacha20-ietf-poly1305',
|
|
})
|
|
|
|
return status
|
|
|
|
def form_valid(self, form):
|
|
"""Configure Shadowsocks Server."""
|
|
old_status = form.initial
|
|
new_status = form.cleaned_data
|
|
|
|
if old_status['password'] != new_status['password'] or \
|
|
old_status['method'] != new_status['method']:
|
|
new_config = {
|
|
'password': new_status['password'],
|
|
'method': new_status['method'],
|
|
}
|
|
|
|
privileged.merge_config(new_config)
|
|
messages.success(self.request, _('Configuration updated'))
|
|
|
|
return super().form_valid(form)
|