Merge branch 'features/favicons' into 'develop'
Add support for remote favicons See merge request pleroma/pleroma!2261
This commit is contained in:
commit
f4469dc741
@ -55,6 +55,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- Added `:reject_deletes` group to SimplePolicy
|
- Added `:reject_deletes` group to SimplePolicy
|
||||||
- MRF (`EmojiStealPolicy`): New MRF Policy which allows to automatically download emojis from remote instances
|
- MRF (`EmojiStealPolicy`): New MRF Policy which allows to automatically download emojis from remote instances
|
||||||
- Support pagination in emoji packs API (for packs and for files in pack)
|
- Support pagination in emoji packs API (for packs and for files in pack)
|
||||||
|
- Support for viewing instances favicons next to posts and accounts
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>API Changes</summary>
|
<summary>API Changes</summary>
|
||||||
@ -65,6 +66,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- Mastodon API: Add support for filtering replies in public and home timelines.
|
- Mastodon API: Add support for filtering replies in public and home timelines.
|
||||||
- Mastodon API: Support for `bot` field in `/api/v1/accounts/update_credentials`.
|
- Mastodon API: Support for `bot` field in `/api/v1/accounts/update_credentials`.
|
||||||
- Mastodon API: Support irreversible property for filters.
|
- Mastodon API: Support irreversible property for filters.
|
||||||
|
- Mastodon API: Add pleroma.favicon field to accounts.
|
||||||
- Admin API: endpoints for create/update/delete OAuth Apps.
|
- Admin API: endpoints for create/update/delete OAuth Apps.
|
||||||
- Admin API: endpoint for status view.
|
- Admin API: endpoint for status view.
|
||||||
- OTP: Add command to reload emoji packs
|
- OTP: Add command to reload emoji packs
|
||||||
|
@ -706,6 +706,8 @@ config :tzdata, :http_client, Pleroma.HTTP.Tzdata
|
|||||||
|
|
||||||
config :ex_aws, http_client: Pleroma.HTTP.ExAws
|
config :ex_aws, http_client: Pleroma.HTTP.ExAws
|
||||||
|
|
||||||
|
config :pleroma, :instances_favicons, enabled: false
|
||||||
|
|
||||||
# Import environment specific config. This must remain at the bottom
|
# Import environment specific config. This must remain at the bottom
|
||||||
# of this file so it overrides the configuration defined above.
|
# of this file so it overrides the configuration defined above.
|
||||||
import_config "#{Mix.env()}.exs"
|
import_config "#{Mix.env()}.exs"
|
||||||
|
@ -3448,5 +3448,18 @@ config :pleroma, :config_description, [
|
|||||||
suggestions: [false]
|
suggestions: [false]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
group: :pleroma,
|
||||||
|
key: :instances_favicons,
|
||||||
|
type: :group,
|
||||||
|
description: "Control favicons for instances",
|
||||||
|
children: [
|
||||||
|
%{
|
||||||
|
key: :enabled,
|
||||||
|
type: :boolean,
|
||||||
|
description: "Allow/disallow displaying and getting instances favicons"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -111,6 +111,8 @@ config :pleroma, Pleroma.Plugs.RemoteIp, enabled: false
|
|||||||
|
|
||||||
config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: true
|
config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: true
|
||||||
|
|
||||||
|
config :pleroma, :instances_favicons, enabled: true
|
||||||
|
|
||||||
if File.exists?("./config/test.secret.exs") do
|
if File.exists?("./config/test.secret.exs") do
|
||||||
import_config "test.secret.exs"
|
import_config "test.secret.exs"
|
||||||
else
|
else
|
||||||
|
@ -71,6 +71,7 @@ Has these additional fields under the `pleroma` object:
|
|||||||
- `unread_conversation_count`: The count of unread conversations. Only returned to the account owner.
|
- `unread_conversation_count`: The count of unread conversations. Only returned to the account owner.
|
||||||
- `unread_notifications_count`: The count of unread notifications. Only returned to the account owner.
|
- `unread_notifications_count`: The count of unread notifications. Only returned to the account owner.
|
||||||
- `notification_settings`: object, can be absent. See `/api/pleroma/notification_settings` for the parameters/keys returned.
|
- `notification_settings`: object, can be absent. See `/api/pleroma/notification_settings` for the parameters/keys returned.
|
||||||
|
- `favicon`: nullable URL string, Favicon image of the user's instance
|
||||||
|
|
||||||
### Source
|
### Source
|
||||||
|
|
||||||
|
@ -988,3 +988,9 @@ Note: setting `restrict_unauthenticated/timelines/local` to `true` has no practi
|
|||||||
## Pleroma.Web.ApiSpec.CastAndValidate
|
## Pleroma.Web.ApiSpec.CastAndValidate
|
||||||
|
|
||||||
* `:strict` a boolean, enables strict input validation (useful in development, not recommended in production). Defaults to `false`.
|
* `:strict` a boolean, enables strict input validation (useful in development, not recommended in production). Defaults to `false`.
|
||||||
|
|
||||||
|
## :instances_favicons
|
||||||
|
|
||||||
|
Control favicons for instances.
|
||||||
|
|
||||||
|
* `enabled`: Allow/disallow displaying and getting instances favicons
|
||||||
|
@ -17,6 +17,8 @@ defmodule Pleroma.Instances.Instance do
|
|||||||
schema "instances" do
|
schema "instances" do
|
||||||
field(:host, :string)
|
field(:host, :string)
|
||||||
field(:unreachable_since, :naive_datetime_usec)
|
field(:unreachable_since, :naive_datetime_usec)
|
||||||
|
field(:favicon, :string)
|
||||||
|
field(:favicon_updated_at, :naive_datetime)
|
||||||
|
|
||||||
timestamps()
|
timestamps()
|
||||||
end
|
end
|
||||||
@ -25,7 +27,7 @@ defmodule Pleroma.Instances.Instance do
|
|||||||
|
|
||||||
def changeset(struct, params \\ %{}) do
|
def changeset(struct, params \\ %{}) do
|
||||||
struct
|
struct
|
||||||
|> cast(params, [:host, :unreachable_since])
|
|> cast(params, [:host, :unreachable_since, :favicon, :favicon_updated_at])
|
||||||
|> validate_required([:host])
|
|> validate_required([:host])
|
||||||
|> unique_constraint(:host)
|
|> unique_constraint(:host)
|
||||||
end
|
end
|
||||||
@ -120,4 +122,48 @@ defmodule Pleroma.Instances.Instance do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp parse_datetime(datetime), do: datetime
|
defp parse_datetime(datetime), do: datetime
|
||||||
|
|
||||||
|
def get_or_update_favicon(%URI{host: host} = instance_uri) do
|
||||||
|
existing_record = Repo.get_by(Instance, %{host: host})
|
||||||
|
now = NaiveDateTime.utc_now()
|
||||||
|
|
||||||
|
if existing_record && existing_record.favicon_updated_at &&
|
||||||
|
NaiveDateTime.diff(now, existing_record.favicon_updated_at) < 86_400 do
|
||||||
|
existing_record.favicon
|
||||||
|
else
|
||||||
|
favicon = scrape_favicon(instance_uri)
|
||||||
|
|
||||||
|
if existing_record do
|
||||||
|
existing_record
|
||||||
|
|> changeset(%{favicon: favicon, favicon_updated_at: now})
|
||||||
|
|> Repo.update()
|
||||||
|
else
|
||||||
|
%Instance{}
|
||||||
|
|> changeset(%{host: host, favicon: favicon, favicon_updated_at: now})
|
||||||
|
|> Repo.insert()
|
||||||
|
end
|
||||||
|
|
||||||
|
favicon
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp scrape_favicon(%URI{} = instance_uri) do
|
||||||
|
try do
|
||||||
|
with {:ok, %Tesla.Env{body: html}} <-
|
||||||
|
Pleroma.HTTP.get(to_string(instance_uri), [{:Accept, "text/html"}]),
|
||||||
|
favicon_rel <-
|
||||||
|
html
|
||||||
|
|> Floki.parse_document!()
|
||||||
|
|> Floki.attribute("link[rel=icon]", "href")
|
||||||
|
|> List.first(),
|
||||||
|
favicon <- URI.merge(instance_uri, favicon_rel) |> to_string(),
|
||||||
|
true <- is_binary(favicon) do
|
||||||
|
favicon
|
||||||
|
else
|
||||||
|
_ -> nil
|
||||||
|
end
|
||||||
|
rescue
|
||||||
|
_ -> nil
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -102,6 +102,12 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
|
|||||||
type: :object,
|
type: :object,
|
||||||
description:
|
description:
|
||||||
"A generic map of settings for frontends. Opaque to the backend. Only returned in `verify_credentials` and `update_credentials`"
|
"A generic map of settings for frontends. Opaque to the backend. Only returned in `verify_credentials` and `update_credentials`"
|
||||||
|
},
|
||||||
|
favicon: %Schema{
|
||||||
|
type: :string,
|
||||||
|
format: :uri,
|
||||||
|
nullable: true,
|
||||||
|
description: "Favicon image of the user's instance"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -204,6 +204,18 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
|||||||
%{}
|
%{}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
favicon =
|
||||||
|
if Pleroma.Config.get([:instances_favicons, :enabled]) do
|
||||||
|
user
|
||||||
|
|> Map.get(:ap_id, "")
|
||||||
|
|> URI.parse()
|
||||||
|
|> URI.merge("/")
|
||||||
|
|> Pleroma.Instances.Instance.get_or_update_favicon()
|
||||||
|
|> MediaProxy.url()
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
%{
|
%{
|
||||||
id: to_string(user.id),
|
id: to_string(user.id),
|
||||||
username: username_from_nickname(user.nickname),
|
username: username_from_nickname(user.nickname),
|
||||||
@ -245,7 +257,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
|||||||
hide_favorites: user.hide_favorites,
|
hide_favorites: user.hide_favorites,
|
||||||
relationship: relationship,
|
relationship: relationship,
|
||||||
skip_thread_containment: user.skip_thread_containment,
|
skip_thread_containment: user.skip_thread_containment,
|
||||||
background_image: image_url(user.background) |> MediaProxy.url()
|
background_image: image_url(user.background) |> MediaProxy.url(),
|
||||||
|
favicon: favicon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|> maybe_put_role(user, opts[:for])
|
|> maybe_put_role(user, opts[:for])
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
defmodule Pleroma.Repo.Migrations.InstancesAddFavicon do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:instances) do
|
||||||
|
add(:favicon, :string)
|
||||||
|
add(:favicon_updated_at, :naive_datetime)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
301
test/fixtures/tesla_mock/https___osada.macgirvin.com.html
vendored
Normal file
301
test/fixtures/tesla_mock/https___osada.macgirvin.com.html
vendored
Normal file
@ -0,0 +1,301 @@
|
|||||||
|
<!DOCTYPE html >
|
||||||
|
<html prefix="og: http://ogp.me/ns#">
|
||||||
|
<head>
|
||||||
|
<title>Osada</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=0"/>
|
||||||
|
<meta property="generator" content="osada"/>
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/library/fork-awesome/css/fork-awesome.min.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/vendor/twbs/bootstrap/dist/css/bootstrap.min.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/library/bootstrap-tagsinput/bootstrap-tagsinput.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/view/css/bootstrap-red.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/library/datetimepicker/jquery.datetimepicker.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/library/tiptip/tipTip.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/library/jgrowl/jquery.jgrowl.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/library/jRange/jquery.range.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/view/css/conversation.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/view/css/widgets.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/view/css/colorbox.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/library/justifiedGallery/justifiedGallery.min.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/view/css/default.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/view/css/mod_home.css?v=2.3" type="text/css" media="screen">
|
||||||
|
<link rel="stylesheet" href="http://osada.macgirvin.com/view/theme/redbasic/php/style.pcss?v=2.3" type="text/css" media="screen">
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
var aStr = {
|
||||||
|
|
||||||
|
'delitem' : "Delete this item?",
|
||||||
|
'comment' : "Comment",
|
||||||
|
'showmore' : "<i class='fa fa-chevron-down'></i> show all",
|
||||||
|
'showfewer' : "<i class='fa fa-chevron-up'></i> show less",
|
||||||
|
'divgrowmore' : "<i class='fa fa-chevron-down'></i> expand",
|
||||||
|
'divgrowless' : "<i class='fa fa-chevron-up'></i> collapse",
|
||||||
|
'pwshort' : "Password too short",
|
||||||
|
'pwnomatch' : "Passwords do not match",
|
||||||
|
'everybody' : "everybody",
|
||||||
|
'passphrase' : "Secret Passphrase",
|
||||||
|
'passhint' : "Passphrase hint",
|
||||||
|
'permschange' : "Notice: Permissions have changed but have not yet been submitted.",
|
||||||
|
'closeAll' : "close all",
|
||||||
|
'nothingnew' : "Nothing new here",
|
||||||
|
'rating_desc' : "Rate This Channel (this is public)",
|
||||||
|
'rating_val' : "Rating",
|
||||||
|
'rating_text' : "Describe (optional)",
|
||||||
|
'submit' : "Submit",
|
||||||
|
'linkurl' : "Please enter a link URL",
|
||||||
|
'leavethispage' : "Unsaved changes. Are you sure you wish to leave this page?",
|
||||||
|
'location' : "Location",
|
||||||
|
'lovely' : "lovely",
|
||||||
|
'wonderful' : "wonderful",
|
||||||
|
'fantastic' : "fantastic",
|
||||||
|
'great' : "great",
|
||||||
|
'nick_invld1' : "Your chosen nickname was either already taken or not valid. Please use our suggestion (",
|
||||||
|
'nick_invld2' : ") or enter a new one.",
|
||||||
|
'nick_valid' : "Thank you, this nickname is valid.",
|
||||||
|
'name_empty' : "A channel name is required.",
|
||||||
|
'name_ok1' : "This is a ",
|
||||||
|
'name_ok2' : " channel name",
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
't01' : "",
|
||||||
|
't02' : "",
|
||||||
|
't03' : "ago",
|
||||||
|
't04' : "from now",
|
||||||
|
't05' : "less than a minute",
|
||||||
|
't06' : "about a minute",
|
||||||
|
't07' : "%d minutes",
|
||||||
|
't08' : "about an hour",
|
||||||
|
't09' : "about %d hours",
|
||||||
|
't10' : "a day",
|
||||||
|
't11' : "%d days",
|
||||||
|
't12' : "about a month",
|
||||||
|
't13' : "%d months",
|
||||||
|
't14' : "about a year",
|
||||||
|
't15' : "%d years",
|
||||||
|
't16' : " ",
|
||||||
|
't17' : "[]",
|
||||||
|
|
||||||
|
'monthNames' : [ "January","February","March","April","May","June","July","August","September","October","November","December" ],
|
||||||
|
'monthNamesShort' : [ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" ],
|
||||||
|
'dayNames' : ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
|
||||||
|
'dayNamesShort' : ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],
|
||||||
|
'today' : "today",
|
||||||
|
'month' : "month",
|
||||||
|
'week' : "week",
|
||||||
|
'day' : "day",
|
||||||
|
'allday' : "All day"
|
||||||
|
};
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="http://osada.macgirvin.com/view/js/jquery.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/justifiedGallery/jquery.justifiedGallery.min.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/sprintf.js/dist/sprintf.min.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/textcomplete/textcomplete.min.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/view/js/autocomplete.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/jquery.timeago.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/readmore.js/readmore.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/sticky-kit/sticky-kit.min.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/jgrowl/jquery.jgrowl_minimized.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/view/js/acl.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/view/js/webtoolkit.base64.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/jRange/jquery.range.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/colorbox/jquery.colorbox-min.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/jquery.AreYouSure/jquery.are-you-sure.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/tableofcontents/jquery.toc.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/imagesloaded/imagesloaded.pkgd.min.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/vendor/twbs/bootstrap/dist/js/bootstrap.bundle.min.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/bootbox/bootbox.min.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/bootstrap-tagsinput/bootstrap-tagsinput.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/datetimepicker/jquery.datetimepicker.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js?v=2.3"></script>
|
||||||
|
<script src="http://osada.macgirvin.com/view/theme/redbasic/js/redbasic.js?v=2.3"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var updateInterval = 80000;
|
||||||
|
var localUser = false;
|
||||||
|
var zid = null;
|
||||||
|
var justifiedGalleryActive = false;
|
||||||
|
var preloadImages = 0;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script>$(document).ready(function() { $("#nav-search-text").search_autocomplete('https://osada.macgirvin.com/acl');});</script><script src="http://osada.macgirvin.com/view/js/main.js?v=2.3"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header></header>
|
||||||
|
<nav class="navbar fixed-top navbar-expand-lg navbar-dark bg-dark"><div class="project-banner" title="Powered by Osada"><a href="https://osada.macgirvin.com/">☸</a></div>
|
||||||
|
<div class="d-lg-none pt-1 pb-1">
|
||||||
|
<a class="btn btn-primary btn-sm text-white" href="#" title="Sign in" id="login_nav_btn_collapse" data-toggle="modal" data-target="#nav-login">
|
||||||
|
Login
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="navbar-toggler-right">
|
||||||
|
<button id="expand-aside" type="button" class="d-lg-none navbar-toggler border-0" data-toggle="offcanvas" data-target="#region_1">
|
||||||
|
<i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i>
|
||||||
|
</button>
|
||||||
|
<button id="menu-btn" class="navbar-toggler border-0" type="button" data-toggle="collapse" data-target="#navbar-collapse-2">
|
||||||
|
<i class="fa fa-bars"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="collapse navbar-collapse" id="navbar-collapse-1">
|
||||||
|
<ul class="navbar-nav mr-auto">
|
||||||
|
<li class="nav-item d-lg-flex">
|
||||||
|
<a class="nav-link" href="#" title="Sign in" id="login_nav_btn" data-toggle="modal" data-target="#nav-login">
|
||||||
|
Login
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div id="banner" class="navbar-text"></div>
|
||||||
|
|
||||||
|
<ul id="nav-right" class="navbar-nav ml-auto">
|
||||||
|
<li class="nav-item collapse clearfix" id="nav-search">
|
||||||
|
<form class="form-inline" method="get" action="search" role="search">
|
||||||
|
<input class="form-control form-control-sm mt-1 mr-2" id="nav-search-text" type="text" value="" placeholder="@name, !forum, #tag, content" name="search" title="Search site @name, !forum, #tag, ?docs, content" onclick="this.submit();" onblur="closeMenu('nav-search'); openMenu('nav-search-btn');"/>
|
||||||
|
</form>
|
||||||
|
<div id="nav-search-spinner" class="spinner-wrapper">
|
||||||
|
<div class="spinner s"></div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" id="nav-search-btn">
|
||||||
|
<a class="nav-link" href="#nav-search" title="Search site @name, !forum, #tag, ?docs, content" onclick="openMenu('nav-search'); closeMenu('nav-search-btn'); $('#nav-search-text').focus(); return false;"><i class="fa fa-fw fa-search"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item dropdown" id="app-menu">
|
||||||
|
<a class="nav-link" href="#" data-toggle="dropdown"><i class="fa fa-fw fa-bars"></i></a>
|
||||||
|
<div id="dropdown-menu" class="dropdown-menu dropdown-menu-right">
|
||||||
|
<a class="dropdown-item" href="https://osada.macgirvin.com/directory"><i class="generic-icons-nav fa fa-fw fa-sitemap"></i>Directory</a>
|
||||||
|
|
||||||
|
|
||||||
|
<a class="dropdown-item" href="https://osada.macgirvin.com/lang"><i class="generic-icons-nav fa fa-fw fa-language"></i>Language</a>
|
||||||
|
|
||||||
|
|
||||||
|
<a class="dropdown-item" href="https://osada.macgirvin.com/search"><i class="generic-icons-nav fa fa-fw fa-search"></i>Search</a>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="collapse d-lg-none" id="navbar-collapse-2">
|
||||||
|
<div class="navbar-nav mr-auto">
|
||||||
|
<a class="nav-link" href="https://osada.macgirvin.com/directory"><i class="generic-icons-nav fa fa-fw fa-sitemap"></i>Directory</a>
|
||||||
|
|
||||||
|
|
||||||
|
<a class="nav-link" href="https://osada.macgirvin.com/lang"><i class="generic-icons-nav fa fa-fw fa-language"></i>Language</a>
|
||||||
|
|
||||||
|
|
||||||
|
<a class="nav-link" href="https://osada.macgirvin.com/search"><i class="generic-icons-nav fa fa-fw fa-search"></i>Search</a>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<main>
|
||||||
|
<aside id="region_1"><div class="aside_spacer"><div id="left_aside_wrapper"></div></div></aside>
|
||||||
|
<section id="region_2"><h1 class="home-welcome">Welcome to Osada</h1><form action="https://osada.macgirvin.com/" id="main-login" method="post">
|
||||||
|
<input type="hidden" name="auth-params" value="login"/>
|
||||||
|
<div id="login-main">
|
||||||
|
<div id="login-input" class="form-group">
|
||||||
|
<div id="id_username_wrapper" class="form-group">
|
||||||
|
<label for="id_username" id="label_username">Login/Email</label>
|
||||||
|
<input class="form-control" name="username" id="id_username" type="text" value="">
|
||||||
|
<small id="help_username" class="form-text text-muted"></small>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="id_password">Password</label>
|
||||||
|
<input class="form-control" type="password" name="password" id="id_password" value=""> <small id="help_password" class="form-text text-muted"></small>
|
||||||
|
</div>
|
||||||
|
<div id="remember_container" class="clearfix form-group checkbox">
|
||||||
|
<label for="id_remember">Remember me</label>
|
||||||
|
<div class="float-right"><input type="checkbox" name="remember" id="id_remember" value="1"/><label class="switchlabel" for="id_remember"> <span class="onoffswitch-inner" data-on="Yes" data-off="No"></span><span class="onoffswitch-switch"></span></label></div>
|
||||||
|
<small class="form-text text-muted"></small>
|
||||||
|
</div>
|
||||||
|
<button type="submit" name="submit" class="btn btn-block btn-primary">Login</button>
|
||||||
|
</div>
|
||||||
|
<div id="login-extra-links">
|
||||||
|
<a href="https://osada.macgirvin.com/pubsites" title="Create an account to access services and applications" id="register-link" class="pull-right">Register</a> <a href="lostpass" title="Forgot your password?" id="lost-password-link">Password Reset</a>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<a href="rmagic" class="btn btn-block btn-outline-success rmagic-button">Remote Authentication</a>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" name="0" value=""/>
|
||||||
|
</form>
|
||||||
|
<script type="text/javascript"> $(document).ready(function() { $("#id_username").focus();} );</script>
|
||||||
|
<div id="nav-login" class="modal" tabindex="-1" role="dialog">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h4 class="modal-title">Login</h4>
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<form action="https://osada.macgirvin.com/" id="main-login" method="post">
|
||||||
|
<input type="hidden" name="auth-params" value="login"/>
|
||||||
|
<div id="login-main">
|
||||||
|
<div id="login-input" class="form-group">
|
||||||
|
<div id="id_username_wrapper" class="form-group">
|
||||||
|
<label for="id_username" id="label_username">Login/Email</label>
|
||||||
|
<input class="form-control" name="username" id="id_username" type="text" value="">
|
||||||
|
<small id="help_username" class="form-text text-muted"></small>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="id_password">Password</label>
|
||||||
|
<input class="form-control" type="password" name="password" id="id_password" value=""> <small id="help_password" class="form-text text-muted"></small>
|
||||||
|
</div>
|
||||||
|
<div id="remember_me_container" class="clearfix form-group checkbox">
|
||||||
|
<label for="id_remember_me">Remember me</label>
|
||||||
|
<div class="float-right"><input type="checkbox" name="remember_me" id="id_remember_me" value="1"/><label class="switchlabel" for="id_remember_me"> <span class="onoffswitch-inner" data-on="Yes" data-off="No"></span><span class="onoffswitch-switch"></span></label></div>
|
||||||
|
<small class="form-text text-muted"></small>
|
||||||
|
</div>
|
||||||
|
<button type="submit" name="submit" class="btn btn-block btn-primary">Login</button>
|
||||||
|
</div>
|
||||||
|
<div id="login-extra-links">
|
||||||
|
<a href="https://osada.macgirvin.com/pubsites" title="Create an account to access services and applications" id="register-link" class="pull-right">Register</a> <a href="lostpass" title="Forgot your password?" id="lost-password-link">Password Reset</a>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<a href="rmagic" class="btn btn-block btn-outline-success rmagic-button">Remote Authentication</a>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" name="0" value=""/>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="page-footer"></div>
|
||||||
|
<div id="pause"></div>
|
||||||
|
</section>
|
||||||
|
<aside id="region_3" class="d-none d-xl-table-cell"><div class="aside_spacer"><div id="right_aside_wrapper"></div></div></aside>
|
||||||
|
</main>
|
||||||
|
<footer></footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<!--
|
||||||
|
FILE ARCHIVED ON 11:49:38 Jan 26, 2019 AND RETRIEVED FROM THE
|
||||||
|
INTERNET ARCHIVE ON 04:27:56 Mar 02, 2020.
|
||||||
|
|
||||||
|
CONTENT MAY BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)).
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
|
playback timings (ms):
|
||||||
|
exclusion.robots: 0.217
|
||||||
|
CDXLines.iter: 14.7 (3)
|
||||||
|
LoadShardBlock: 165.298 (3)
|
||||||
|
esindex: 0.01
|
||||||
|
PetaboxLoader3.datanode: 72.599 (4)
|
||||||
|
exclusion.robots.policy: 0.208
|
||||||
|
RedisCDXSource: 16.804
|
||||||
|
PetaboxLoader3.resolve: 146.316 (4)
|
||||||
|
captures_list: 199.59
|
||||||
|
load_resource: 56.473
|
||||||
|
-->
|
@ -1342,6 +1342,18 @@ defmodule HttpRequestMock do
|
|||||||
{:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/relay/relay.json")}}
|
{:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/relay/relay.json")}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get("http://localhost:4001/", _, "", Accept: "text/html") do
|
||||||
|
{:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/7369654.html")}}
|
||||||
|
end
|
||||||
|
|
||||||
|
def get("https://osada.macgirvin.com/", _, "", Accept: "text/html") do
|
||||||
|
{:ok,
|
||||||
|
%Tesla.Env{
|
||||||
|
status: 200,
|
||||||
|
body: File.read!("test/fixtures/tesla_mock/https___osada.macgirvin.com.html")
|
||||||
|
}}
|
||||||
|
end
|
||||||
|
|
||||||
def get(url, query, body, headers) do
|
def get(url, query, body, headers) do
|
||||||
{:error,
|
{:error,
|
||||||
"Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{
|
"Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
|
defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.DataCase
|
||||||
|
|
||||||
|
alias Pleroma.Config
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.UserRelationship
|
alias Pleroma.UserRelationship
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
@ -18,6 +19,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
|
|||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
|
||||||
|
setup do: clear_config([:instances_favicons, :enabled])
|
||||||
|
|
||||||
test "Represent a user account" do
|
test "Represent a user account" do
|
||||||
background_image = %{
|
background_image = %{
|
||||||
"url" => [%{"href" => "https://example.com/images/asuka_hospital.png"}]
|
"url" => [%{"href" => "https://example.com/images/asuka_hospital.png"}]
|
||||||
@ -75,6 +78,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
|
|||||||
pleroma: %{
|
pleroma: %{
|
||||||
ap_id: user.ap_id,
|
ap_id: user.ap_id,
|
||||||
background_image: "https://example.com/images/asuka_hospital.png",
|
background_image: "https://example.com/images/asuka_hospital.png",
|
||||||
|
favicon:
|
||||||
|
"https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/favicon-16x16.png",
|
||||||
confirmation_pending: false,
|
confirmation_pending: false,
|
||||||
tags: [],
|
tags: [],
|
||||||
is_admin: false,
|
is_admin: false,
|
||||||
@ -92,6 +97,23 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
|
|||||||
assert expected == AccountView.render("show.json", %{user: user})
|
assert expected == AccountView.render("show.json", %{user: user})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "Favicon is nil when :instances_favicons is disabled" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
Config.put([:instances_favicons, :enabled], true)
|
||||||
|
|
||||||
|
assert %{
|
||||||
|
pleroma: %{
|
||||||
|
favicon:
|
||||||
|
"https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/favicon-16x16.png"
|
||||||
|
}
|
||||||
|
} = AccountView.render("show.json", %{user: user})
|
||||||
|
|
||||||
|
Config.put([:instances_favicons, :enabled], false)
|
||||||
|
|
||||||
|
assert %{pleroma: %{favicon: nil}} = AccountView.render("show.json", %{user: user})
|
||||||
|
end
|
||||||
|
|
||||||
test "Represent the user account for the account owner" do
|
test "Represent the user account for the account owner" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
@ -152,6 +174,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
|
|||||||
pleroma: %{
|
pleroma: %{
|
||||||
ap_id: user.ap_id,
|
ap_id: user.ap_id,
|
||||||
background_image: nil,
|
background_image: nil,
|
||||||
|
favicon:
|
||||||
|
"https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/favicon-16x16.png",
|
||||||
confirmation_pending: false,
|
confirmation_pending: false,
|
||||||
tags: [],
|
tags: [],
|
||||||
is_admin: false,
|
is_admin: false,
|
||||||
|
Loading…
Reference in New Issue
Block a user