total rebase
[anni] / lib / pleroma / web / endpoint.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.Endpoint do
6   use Phoenix.Endpoint, otp_app: :pleroma
7
8   require Pleroma.Constants
9
10   alias Pleroma.Config
11
12   socket("/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler,
13     longpoll: false,
14     websocket: [
15       path: "/",
16       compress: false,
17       error_handler: {Pleroma.Web.MastodonAPI.WebsocketHandler, :handle_error, []},
18       fullsweep_after: 20
19     ]
20   )
21
22   socket("/socket", Pleroma.Web.UserSocket,
23     websocket: [
24       path: "/websocket",
25       serializer: [
26         {Phoenix.Socket.V1.JSONSerializer, "~> 1.0.0"},
27         {Phoenix.Socket.V2.JSONSerializer, "~> 2.0.0"}
28       ],
29       timeout: 60_000,
30       transport_log: false,
31       compress: false,
32       fullsweep_after: 20
33     ],
34     longpoll: false
35   )
36
37   socket("/live", Phoenix.LiveView.Socket)
38
39   plug(Plug.Telemetry, event_prefix: [:phoenix, :endpoint])
40
41   plug(Pleroma.Web.Plugs.SetLocalePlug)
42   plug(CORSPlug)
43   plug(Pleroma.Web.Plugs.HTTPSecurityPlug)
44   plug(Pleroma.Web.Plugs.UploadedMedia)
45
46   @static_cache_control "public, max-age=1209600"
47   @static_cache_disabled "public, no-cache"
48
49   # InstanceStatic needs to be before Plug.Static to be able to override shipped-static files
50   # If you're adding new paths to `only:` you'll need to configure them in InstanceStatic as well
51   # Cache-control headers are duplicated in case we turn off etags in the future
52   plug(
53     Pleroma.Web.Plugs.InstanceStatic,
54     at: "/",
55     from: :pleroma,
56     only: ["emoji", "images"],
57     gzip: true,
58     cache_control_for_etags: @static_cache_control,
59     headers: %{
60       "cache-control" => @static_cache_control
61     }
62   )
63
64   plug(Pleroma.Web.Plugs.InstanceStatic,
65     at: "/",
66     gzip: true,
67     cache_control_for_etags: @static_cache_disabled,
68     headers: %{
69       "cache-control" => @static_cache_disabled
70     }
71   )
72
73   plug(Pleroma.Web.Plugs.FrontendStatic,
74     at: "/",
75     frontend_type: :primary,
76     only: ["index.html"],
77     gzip: true,
78     cache_control_for_etags: @static_cache_disabled,
79     headers: %{
80       "cache-control" => @static_cache_disabled
81     }
82   )
83
84   plug(Pleroma.Web.Plugs.FrontendStatic,
85     at: "/",
86     frontend_type: :primary,
87     gzip: true,
88     cache_control_for_etags: @static_cache_control,
89     headers: %{
90       "cache-control" => @static_cache_control
91     }
92   )
93
94   plug(Plug.Static.IndexHtml, at: "/pleroma/admin/")
95
96   plug(Pleroma.Web.Plugs.FrontendStatic,
97     at: "/pleroma/admin",
98     frontend_type: :admin,
99     gzip: true,
100     cache_control_for_etags: @static_cache_disabled,
101     headers: %{
102       "cache-control" => @static_cache_disabled
103     }
104   )
105
106   # Serve at "/" the static files from "priv/static" directory.
107   #
108   # You should set gzip to true if you are running phoenix.digest
109   # when deploying your static files in production.
110   plug(
111     Plug.Static,
112     at: "/",
113     from: :pleroma,
114     only: Pleroma.Constants.static_only_files(),
115     # credo:disable-for-previous-line Credo.Check.Readability.MaxLineLength
116     gzip: true,
117     cache_control_for_etags: @static_cache_disabled,
118     headers: %{
119       "cache-control" => @static_cache_disabled
120     }
121   )
122
123   plug(Plug.Static,
124     at: "/pleroma/admin/",
125     from: {:pleroma, "priv/static/adminfe/"}
126   )
127
128   # Code reloading can be explicitly enabled under the
129   # :code_reloader configuration of your endpoint.
130   if code_reloading? do
131     plug(Phoenix.CodeReloader)
132   end
133
134   plug(Pleroma.Web.Plugs.TrailingFormatPlug)
135   plug(Plug.RequestId)
136   plug(Plug.Logger, log: :debug)
137
138   plug(Plug.Parsers,
139     parsers: [:urlencoded, Pleroma.Web.Multipart, :json],
140     pass: ["*/*"],
141     json_decoder: Jason,
142     # Note: this is compile-time only, won't work for database-config
143     length: Config.get([:instance, :upload_limit]),
144     body_reader: {Pleroma.Web.Plugs.DigestPlug, :read_body, []}
145   )
146
147   plug(Plug.MethodOverride)
148   plug(Plug.Head)
149
150   secure_cookies = Config.get([__MODULE__, :secure_cookie_flag])
151
152   cookie_name =
153     if secure_cookies,
154       do: "__Host-pleroma_key",
155       else: "pleroma_key"
156
157   extra =
158     Config.get([__MODULE__, :extra_cookie_attrs])
159     |> Enum.join(";")
160
161   # The session will be stored in the cookie and signed,
162   # this means its contents can be read but not tampered with.
163   # Set :encryption_salt if you would also like to encrypt it.
164   plug(
165     Plug.Session,
166     store: :cookie,
167     key: cookie_name,
168     signing_salt: Config.get([__MODULE__, :signing_salt], "CqaoopA2"),
169     http_only: true,
170     secure: secure_cookies,
171     extra: extra
172   )
173
174   plug(Pleroma.Web.Plugs.RemoteIp)
175
176   plug(Pleroma.Web.Router)
177
178   @doc """
179   Dynamically loads configuration from the system environment
180   on startup.
181
182   It receives the endpoint configuration from the config files
183   and must return the updated configuration.
184   """
185   def load_from_system_env(config) do
186     port = System.get_env("PORT") || raise "expected the PORT environment variable to be set"
187     {:ok, Keyword.put(config, :http, [:inet6, port: port])}
188   end
189
190   def websocket_url do
191     String.replace_leading(url(), "http", "ws")
192   end
193 end