diff --git a/CHANGELOG.md b/CHANGELOG.md index a3824e8b7..9513a54fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed - SSH frontend, to be potentially re-enabled via a bridge rather than wired into the main system +- Gopher frontend, as above ## 2.5.2 diff --git a/config/config.exs b/config/config.exs index 850a42eea..ea0b23360 100644 --- a/config/config.exs +++ b/config/config.exs @@ -97,7 +97,6 @@ config :pleroma, :uri_schemes, "http", "dat", "dweb", - "gopher", "hyper", "ipfs", "ipns", @@ -474,11 +473,6 @@ config :phoenix, :json_library, Jason config :phoenix, :filter_parameters, ["password", "confirm"] -config :pleroma, :gopher, - enabled: false, - ip: {0, 0, 0, 0}, - port: 9999 - config :pleroma, Pleroma.Web.Metadata, providers: [ Pleroma.Web.Metadata.Providers.OpenGraph, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index caa7f2edc..3b8f8cc52 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -833,15 +833,6 @@ To enable them, both the `rum_enabled` flag has to be set and the following spec This will probably take a long time. -## Alternative client protocols - -### :gopher -* `enabled`: Enables the gopher interface -* `ip`: IP address to bind to -* `port`: Port to bind to -* `dstport`: Port advertised in urls (optional, defaults to `port`) - - ## Authentication ### :admin_token diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index 952579c7f..d37454d2c 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -107,8 +107,7 @@ defmodule Pleroma.Application do ] ++ task_children(@mix_env) ++ dont_run_in_test(@mix_env) ++ - shout_child(shout_enabled?()) ++ - [Pleroma.Gopher.Server] + shout_child(shout_enabled?()) # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html # for other strategies and supported options diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex index 5371aae7a..99d49f995 100644 --- a/lib/pleroma/config/transfer_task.ex +++ b/lib/pleroma/config/transfer_task.ex @@ -29,8 +29,7 @@ defmodule Pleroma.Config.TransferTask do do: [ {:pleroma, Pleroma.Captcha, [:seconds_valid]}, {:pleroma, Pleroma.Upload, [:proxy_remote]}, - {:pleroma, :instance, [:upload_limit]}, - {:pleroma, :gopher, [:enabled]} + {:pleroma, :instance, [:upload_limit]} ] def start_link(restart_pleroma? \\ true) do diff --git a/lib/pleroma/gopher/server.ex b/lib/pleroma/gopher/server.ex deleted file mode 100644 index 1b85c49f5..000000000 --- a/lib/pleroma/gopher/server.ex +++ /dev/null @@ -1,162 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2021 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Gopher.Server do - use GenServer - require Logger - - def start_link(_) do - config = Pleroma.Config.get(:gopher, []) - ip = Keyword.get(config, :ip, {0, 0, 0, 0}) - port = Keyword.get(config, :port, 1234) - - if Keyword.get(config, :enabled, false) do - GenServer.start_link(__MODULE__, [ip, port], []) - else - Logger.info("Gopher server disabled") - :ignore - end - end - - def init([ip, port]) do - Logger.info("Starting gopher server on #{port}") - - :ranch.start_listener( - :gopher, - 100, - :ranch_tcp, - [ip: ip, port: port], - __MODULE__.ProtocolHandler, - [] - ) - - {:ok, %{ip: ip, port: port}} - end -end - -defmodule Pleroma.Gopher.Server.ProtocolHandler do - alias Pleroma.Activity - alias Pleroma.HTML - alias Pleroma.Object - alias Pleroma.User - alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.ActivityPub.Visibility - - def start_link(ref, socket, transport, opts) do - pid = spawn_link(__MODULE__, :init, [ref, socket, transport, opts]) - {:ok, pid} - end - - def init(ref, socket, transport, [] = _Opts) do - :ok = :ranch.accept_ack(ref) - loop(socket, transport) - end - - def info(text) do - text = String.replace(text, ~r/[\t\n]/, "") - - String.split(text, "\r") - |> Enum.map(fn text -> - "i#{text}\tfake\t(NULL)\t0\r\n" - end) - |> Enum.join("") - end - - def link(name, selector, type \\ 1) do - address = Pleroma.Web.Endpoint.host() - port = Pleroma.Config.get([:gopher, :port], 1234) - dstport = Pleroma.Config.get([:gopher, :dstport], port) - "#{type}#{name}\t#{selector}\t#{address}\t#{dstport}\r\n" - end - - def render_activities(activities) do - activities - |> Enum.reverse() - |> Enum.map(fn activity -> - user = User.get_cached_by_ap_id(activity.data["actor"]) - - object = Object.normalize(activity, fetch: false) - like_count = object.data["like_count"] || 0 - announcement_count = object.data["announcement_count"] || 0 - - link("Post ##{activity.id} by #{user.nickname}", "/notices/#{activity.id}") <> - info("#{like_count} likes, #{announcement_count} repeats") <> - "i\tfake\t(NULL)\t0\r\n" <> - info(HTML.strip_tags(String.replace(object.data["content"], "
", "\r"))) - end) - |> Enum.join("i\tfake\t(NULL)\t0\r\n") - end - - def response("") do - info("Welcome to #{Pleroma.Config.get([:instance, :name], "Pleroma")}!") <> - link("Public Timeline", "/main/public") <> - link("Federated Timeline", "/main/all") <> ".\r\n" - end - - def response("/main/public") do - posts = - %{type: ["Create"], local_only: true} - |> ActivityPub.fetch_public_activities() - |> render_activities() - - info("Welcome to the Public Timeline!") <> posts <> ".\r\n" - end - - def response("/main/all") do - posts = - %{type: ["Create"]} - |> ActivityPub.fetch_public_activities() - |> render_activities() - - info("Welcome to the Federated Timeline!") <> posts <> ".\r\n" - end - - def response("/notices/" <> id) do - with %Activity{} = activity <- Activity.get_by_id(id), - true <- Visibility.is_public?(activity) do - activities = - ActivityPub.fetch_activities_for_context(activity.data["context"]) - |> render_activities - - user = User.get_cached_by_ap_id(activity.data["actor"]) - - info("Post #{activity.id} by #{user.nickname}") <> - link("More posts by #{user.nickname}", "/users/#{user.nickname}") <> activities <> ".\r\n" - else - _e -> - info("Not public") <> ".\r\n" - end - end - - def response("/users/" <> nickname) do - with %User{} = user <- User.get_cached_by_nickname(nickname) do - params = %{ - type: ["Create"], - actor_id: user.ap_id - } - - activities = - params - |> ActivityPub.fetch_public_activities() - |> render_activities() - - info("Posts by #{user.nickname}") <> activities <> ".\r\n" - else - _e -> - info("No such user") <> ".\r\n" - end - end - - def loop(socket, transport) do - case transport.recv(socket, 0, 5000) do - {:ok, data} -> - data = String.trim_trailing(data, "\r\n") - transport.send(socket, response(data)) - :ok = transport.close(socket) - - _ -> - :ok = transport.close(socket) - end - end -end diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex index 019296291..c36271654 100644 --- a/lib/pleroma/web/mastodon_api/views/instance_view.ex +++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex @@ -68,9 +68,6 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do if Config.get([:media_proxy, :enabled]) do "media_proxy" end, - if Config.get([:gopher, :enabled]) do - "gopher" - end, # backwards compat if Config.get([:shout, :enabled]) do "chat"