diff options
Diffstat (limited to 'test/web')
| -rw-r--r-- | test/web/activity_pub/activity_pub_controller_test.exs | 46 | ||||
| -rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 40 | ||||
| -rw-r--r-- | test/web/activity_pub/transmogrifier_test.exs | 181 | ||||
| -rw-r--r-- | test/web/activity_pub/views/object_view_test.exs | 17 | ||||
| -rw-r--r-- | test/web/activity_pub/views/user_view_test.exs | 18 | ||||
| -rw-r--r-- | test/web/http_sigs/http_sig_test.exs | 154 | ||||
| -rw-r--r-- | test/web/http_sigs/priv.key | 15 | ||||
| -rw-r--r-- | test/web/http_sigs/pub.key | 6 | ||||
| -rw-r--r-- | test/web/ostatus/ostatus_test.exs | 7 | ||||
| -rw-r--r-- | test/web/twitter_api/representers/object_representer_test.exs | 20 | 
10 files changed, 496 insertions, 8 deletions
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs new file mode 100644 index 000000000..957687c43 --- /dev/null +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -0,0 +1,46 @@ +defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do +  use Pleroma.Web.ConnCase +  import Pleroma.Factory +  alias Pleroma.Web.ActivityPub.{UserView, ObjectView} +  alias Pleroma.{Repo, User} + +  describe "/users/:nickname" do +    test "it returns a json representation of the user", %{conn: conn} do +      user = insert(:user) + +      conn = conn +      |> put_req_header("accept", "application/activity+json") +      |> get("/users/#{user.nickname}") + +      user = Repo.get(User, user.id) + +      assert json_response(conn, 200) == UserView.render("user.json", %{user: user}) +    end +  end + +  describe "/object/:uuid" do +    test "it returns a json representation of the object", %{conn: conn} do +      note = insert(:note) +      uuid = String.split(note.data["id"], "/") |> List.last + +      conn = conn +      |> put_req_header("accept", "application/activity+json") +      |> get("/objects/#{uuid}") + +      assert json_response(conn, 200) == ObjectView.render("object.json", %{object: note}) +    end +  end + +  describe "/users/:nickname/inbox" do +    test "it inserts an incoming activity into the database", %{conn: conn} do +      data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode! + +      conn = conn +      |> assign(:valid_signature, true) +      |> put_req_header("content-type", "application/activity+json") +      |> post("/users/doesntmatter/inbox", data) + +      assert "ok" == json_response(conn, 200) +    end +  end +end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index f423ea8be..4aeabc596 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -7,6 +7,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    import Pleroma.Factory +  describe "building a user from his ap id" do +    test "it returns a user" do +      user_id = "http://mastodon.example.org/users/admin" +      {:ok, user} = ActivityPub.make_user_from_ap_id(user_id) +      assert user.ap_id == user_id +      assert user.nickname == "admin@mastodon.example.org" +      assert user.info["source_data"] +      assert user.info["ap_enabled"] +      assert user.follower_address == "http://mastodon.example.org/users/admin/followers" +    end +  end +    describe "insertion" do      test "returns the activity if one with the same id is already in" do        activity = insert(:note_activity) @@ -50,9 +62,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    describe "create activities" do      test "removes doubled 'to' recipients" do -      {:ok, activity} = ActivityPub.create(["user1", "user1", "user2"], %User{ap_id: "1"}, "", %{}) +      {:ok, activity} = ActivityPub.create(%{to: ["user1", "user1", "user2"], actor: %User{ap_id: "1"}, context: "", object: %{}})        assert activity.data["to"] == ["user1", "user2"]        assert activity.actor == "1" +      assert activity.recipients == ["user1", "user2"]      end    end @@ -252,6 +265,31 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      end    end +  describe "fetching an object" do +    test "it fetches an object" do +      {:ok, object} = ActivityPub.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") +      assert activity = Activity.get_create_activity_by_object_ap_id(object.data["id"]) +      assert activity.data["id"] + +      {:ok, object_again} = ActivityPub.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") + +      assert [attachment] = object.data["attachment"] +      assert is_list(attachment["url"]) + +      assert object == object_again +    end + +    test "it works with objects only available via Ostatus" do +      {:ok, object} = ActivityPub.fetch_object_from_id("https://shitposter.club/notice/2827873") +      assert activity = Activity.get_create_activity_by_object_ap_id(object.data["id"]) +      assert activity.data["id"] + +      {:ok, object_again} = ActivityPub.fetch_object_from_id("https://shitposter.club/notice/2827873") + +      assert object == object_again +    end +  end +    describe "following / unfollowing" do      test "creates a follow activity" do        follower = insert(:user) diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs new file mode 100644 index 000000000..96dd63057 --- /dev/null +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -0,0 +1,181 @@ +defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do +  use Pleroma.DataCase +  alias Pleroma.Web.ActivityPub.Transmogrifier +  alias Pleroma.Activity +  alias Pleroma.User +  alias Pleroma.Repo +  import Ecto.Query + +  import Pleroma.Factory +  alias Pleroma.Web.CommonAPI + +  describe "handle_incoming" do +    test "it ignores an incoming notice if we already have it" do +      activity = insert(:note_activity) + +      data = File.read!("test/fixtures/mastodon-post-activity.json") +      |> Poison.decode! +      |> Map.put("object", activity.data["object"]) + +      {:ok, returned_activity} = Transmogrifier.handle_incoming(data) + +      assert activity == returned_activity +    end + +    test "it fetches replied-to activities if we don't have them" do +      data = File.read!("test/fixtures/mastodon-post-activity.json") +      |> Poison.decode! + +      object = data["object"] +      |> Map.put("inReplyTo", "https://shitposter.club/notice/2827873") + +      data = data +      |> Map.put("object", object) + +      {:ok, returned_activity} = Transmogrifier.handle_incoming(data) + +      assert Activity.get_create_activity_by_object_ap_id("tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment") +    end + +    test "it works for incoming notices" do +      data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode! + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +      assert data["id"] == "http://mastodon.example.org/users/admin/statuses/99512778738411822/activity" +      assert data["context"] == "tag:mastodon.example.org,2018-02-12:objectId=20:objectType=Conversation" +      assert data["to"] == ["https://www.w3.org/ns/activitystreams#Public"] +      assert data["cc"] == [ +        "http://mastodon.example.org/users/admin/followers", +        "http://localtesting.pleroma.lol/users/lain" +      ] +      assert data["actor"] == "http://mastodon.example.org/users/admin" + +      object = data["object"] +      assert object["id"] == "http://mastodon.example.org/users/admin/statuses/99512778738411822" + +      assert object["to"] == ["https://www.w3.org/ns/activitystreams#Public"] +      assert object["cc"] == [ +        "http://mastodon.example.org/users/admin/followers", +        "http://localtesting.pleroma.lol/users/lain" +      ] +      assert object["actor"] == "http://mastodon.example.org/users/admin" +      assert object["attributedTo"] == "http://mastodon.example.org/users/admin" +      assert object["context"] == "tag:mastodon.example.org,2018-02-12:objectId=20:objectType=Conversation" +      assert object["sensitive"] == true +    end + +    test "it works for incoming follow requests" do +      user = insert(:user) +      data = File.read!("test/fixtures/mastodon-follow-activity.json") |> Poison.decode! +      |> Map.put("object", user.ap_id) + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      assert data["actor"] == "http://mastodon.example.org/users/admin" +      assert data["type"] == "Follow" +      assert data["id"] == "http://mastodon.example.org/users/admin#follows/2" +      assert User.following?(User.get_by_ap_id(data["actor"]), user) +    end + +    test "it works for incoming likes" do +      user = insert(:user) +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) + +      data = File.read!("test/fixtures/mastodon-like.json") |> Poison.decode! +      |> Map.put("object", activity.data["object"]["id"]) + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      assert data["actor"] == "http://mastodon.example.org/users/admin" +      assert data["type"] == "Like" +      assert data["id"] == "http://mastodon.example.org/users/admin#likes/2" +      assert data["object"] == activity.data["object"]["id"] +    end + +    test "it works for incoming announces" do +      data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode! + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      assert data["actor"] == "http://mastodon.example.org/users/admin" +      assert data["type"] == "Announce" +      assert data["id"] == "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" +      assert data["object"] == "http://mastodon.example.org/users/admin/statuses/99541947525187367" + +      assert Activity.get_create_activity_by_object_ap_id(data["object"]) +    end + +    test "it works for incoming announces with an existing activity" do +      user = insert(:user) +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) + +      data = File.read!("test/fixtures/mastodon-announce.json") +      |> Poison.decode! +      |> Map.put("object", activity.data["object"]["id"]) + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      assert data["actor"] == "http://mastodon.example.org/users/admin" +      assert data["type"] == "Announce" +      assert data["id"] == "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" +      assert data["object"] == activity.data["object"]["id"] + +      assert Activity.get_create_activity_by_object_ap_id(data["object"]).id == activity.id +    end +  end + +  describe "prepare outgoing" do +    test "it turns mentions into tags" do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey, @#{other_user.nickname}, how are ya? #2hu"}) + +      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) +      object = modified["object"] + +      expected_mention = %{ +        "href" => other_user.ap_id, +        "name" => "@#{other_user.nickname}", +        "type" => "Mention" +      } + +      expected_tag = %{ +        "href" => Pleroma.Web.Endpoint.url <> "/tags/2hu", +        "type" => "Hashtag", +        "name" => "#2hu" +      } + +      assert Enum.member?(object["tag"], expected_tag) +      assert Enum.member?(object["tag"], expected_mention) +    end + +    test "it adds the sensitive property" do +      user = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "#nsfw hey"}) +      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) + +      assert modified["object"]["sensitive"] +    end + +    test "it adds the json-ld context and the conversation property" do +      user = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) +      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) + +      assert modified["@context"] == "https://www.w3.org/ns/activitystreams" +      assert modified["object"]["conversation"] == modified["context"] +    end + +    test "it sets the 'attributedTo' property to the actor of the object if it doesn't have one" do +      user = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) +      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) + +      assert modified["object"]["actor"] == modified["object"]["attributedTo"] +    end +  end +end diff --git a/test/web/activity_pub/views/object_view_test.exs b/test/web/activity_pub/views/object_view_test.exs new file mode 100644 index 000000000..6a1311be7 --- /dev/null +++ b/test/web/activity_pub/views/object_view_test.exs @@ -0,0 +1,17 @@ +defmodule Pleroma.Web.ActivityPub.ObjectViewTest do +  use Pleroma.DataCase +  import Pleroma.Factory + +  alias Pleroma.Web.ActivityPub.ObjectView + +  test "renders a note object" do +    note = insert(:note) + +    result = ObjectView.render("object.json", %{object: note}) + +    assert result["id"] == note.data["id"] +    assert result["to"] == note.data["to"] +    assert result["content"] == note.data["content"] +    assert result["type"] == "Note" +  end +end diff --git a/test/web/activity_pub/views/user_view_test.exs b/test/web/activity_pub/views/user_view_test.exs new file mode 100644 index 000000000..0c64e62c3 --- /dev/null +++ b/test/web/activity_pub/views/user_view_test.exs @@ -0,0 +1,18 @@ +defmodule Pleroma.Web.ActivityPub.UserViewTest do +  use Pleroma.DataCase +  import Pleroma.Factory + +  alias Pleroma.Web.ActivityPub.UserView + +  test "Renders a user, including the public key" do +    user = insert(:user) +    {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user) + +    result = UserView.render("user.json", %{user: user}) + +    assert result["id"] == user.ap_id +    assert result["preferredUsername"] == user.nickname + +    assert String.contains?(result["publicKey"]["publicKeyPem"], "BEGIN RSA PUBLIC KEY") +  end +end diff --git a/test/web/http_sigs/http_sig_test.exs b/test/web/http_sigs/http_sig_test.exs new file mode 100644 index 000000000..fd568a67a --- /dev/null +++ b/test/web/http_sigs/http_sig_test.exs @@ -0,0 +1,154 @@ +# http signatures +# Test data from https://tools.ietf.org/html/draft-cavage-http-signatures-08#appendix-C +defmodule Pleroma.Web.HTTPSignaturesTest do +  use Pleroma.DataCase +  alias Pleroma.Web.HTTPSignatures +  import Pleroma.Factory + +  @private_key (hd(:public_key.pem_decode(File.read!("test/web/http_sigs/priv.key"))) +    |> :public_key.pem_entry_decode()) + +  @public_key (hd(:public_key.pem_decode(File.read!("test/web/http_sigs/pub.key"))) +    |> :public_key.pem_entry_decode()) + +  @headers %{ +    "(request-target)" => "post /foo?param=value&pet=dog", +    "host" => "example.com", +    "date" => "Thu, 05 Jan 2014 21:31:40 GMT", +    "content-type" => "application/json", +    "digest" => "SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=", +    "content-length" => "18" +  } + +  @body "{\"hello\": \"world\"}" + +  @default_signature """ +  keyId="Test",algorithm="rsa-sha256",signature="jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w=" +  """ + +  @basic_signature """ +  keyId="Test",algorithm="rsa-sha256",headers="(request-target) host date",signature="HUxc9BS3P/kPhSmJo+0pQ4IsCo007vkv6bUm4Qehrx+B1Eo4Mq5/6KylET72ZpMUS80XvjlOPjKzxfeTQj4DiKbAzwJAb4HX3qX6obQTa00/qPDXlMepD2JtTw33yNnm/0xV7fQuvILN/ys+378Ysi082+4xBQFwvhNvSoVsGv4=" +  """ + +  @all_headers_signature """ +  keyId="Test",algorithm="rsa-sha256",headers="(request-target) host date content-type digest content-length",signature="Ef7MlxLXoBovhil3AlyjtBwAL9g4TN3tibLj7uuNB3CROat/9KaeQ4hW2NiJ+pZ6HQEOx9vYZAyi+7cmIkmJszJCut5kQLAwuX+Ms/mUFvpKlSo9StS2bMXDBNjOh4Auj774GFj4gwjS+3NhFeoqyr/MuN6HsEnkvn6zdgfE2i0=" +  """ + +  test "split up a signature" do +    expected = %{ +      "keyId" => "Test", +      "algorithm" => "rsa-sha256", +      "signature" => "jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w=", +      "headers" => ["date"] +    } + +    assert HTTPSignatures.split_signature(@default_signature) == expected +  end + +  test "validates the default case" do +    signature = HTTPSignatures.split_signature(@default_signature) +    assert HTTPSignatures.validate(@headers, signature, @public_key) +  end + +  test "validates the basic case" do +    signature = HTTPSignatures.split_signature(@basic_signature) +    assert HTTPSignatures.validate(@headers, signature, @public_key) +  end + +  test "validates the all-headers case" do +    signature = HTTPSignatures.split_signature(@all_headers_signature) +    assert HTTPSignatures.validate(@headers, signature, @public_key) +  end + +  test "it contructs a signing string" do +    expected = "date: Thu, 05 Jan 2014 21:31:40 GMT\ncontent-length: 18" +    assert expected == HTTPSignatures.build_signing_string(@headers, ["date", "content-length"]) +  end + +  test "it validates a conn" do +    public_key_pem = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnGb42rPZIapY4Hfhxrgn\nxKVJczBkfDviCrrYaYjfGxawSw93dWTUlenCVTymJo8meBlFgIQ70ar4rUbzl6GX\nMYvRdku072d1WpglNHXkjKPkXQgngFDrh2sGKtNB/cEtJcAPRO8OiCgPFqRtMiNM\nc8VdPfPdZuHEIZsJ/aUM38EnqHi9YnVDQik2xxDe3wPghOhqjxUM6eLC9jrjI+7i\naIaEygUdyst9qVg8e2FGQlwAeS2Eh8ygCxn+bBlT5OyV59jSzbYfbhtF2qnWHtZy\nkL7KOOwhIfGs7O9SoR2ZVpTEQ4HthNzainIe/6iCR5HGrao/T8dygweXFYRv+k5A\nPQIDAQAB\n-----END PUBLIC KEY-----\n" +    [public_key] = :public_key.pem_decode(public_key_pem) + +    public_key = public_key +    |> :public_key.pem_entry_decode() + +    conn = %{ +      req_headers: [ +        {"host", "localtesting.pleroma.lol"}, +        {"connection", "close"}, +        {"content-length", "2316"}, +        {"user-agent", "http.rb/2.2.2 (Mastodon/2.1.0.rc3; +http://mastodon.example.org/)"}, +        {"date", "Sun, 10 Dec 2017 14:23:49 GMT"}, +        {"digest", "SHA-256=x/bHADMW8qRrq2NdPb5P9fl0lYpKXXpe5h5maCIL0nM="}, +        {"content-type", "application/activity+json"}, +        {"(request-target)", "post /users/demiurge/inbox"}, +        {"signature", "keyId=\"http://mastodon.example.org/users/admin#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"i0FQvr51sj9BoWAKydySUAO1RDxZmNY6g7M62IA7VesbRSdFZZj9/fZapLp6YSuvxUF0h80ZcBEq9GzUDY3Chi9lx6yjpUAS2eKb+Am/hY3aswhnAfYd6FmIdEHzsMrpdKIRqO+rpQ2tR05LwiGEHJPGS0p528NvyVxrxMT5H5yZS5RnxY5X2HmTKEgKYYcvujdv7JWvsfH88xeRS7Jlq5aDZkmXvqoR4wFyfgnwJMPLel8P/BUbn8BcXglH/cunR0LUP7sflTxEz+Rv5qg+9yB8zgBsB4C0233WpcJxjeD6Dkq0EcoJObBR56F8dcb7NQtUDu7x6xxzcgSd7dHm5w==\""}] +    } + +    assert HTTPSignatures.validate_conn(conn, public_key) +  end + +  test "it validates a conn and fetches the key" do +    conn = %{ +      params: %{"actor" => "http://mastodon.example.org/users/admin"}, +      req_headers: [ +        {"host", "localtesting.pleroma.lol"}, +        {"x-forwarded-for", "127.0.0.1"}, +        {"connection", "close"}, +        {"content-length", "2307"}, +        {"user-agent", "http.rb/2.2.2 (Mastodon/2.1.0.rc3; +http://mastodon.example.org/)"}, +        {"date", "Sun, 11 Feb 2018 17:12:01 GMT"}, +        {"digest", "SHA-256=UXsAnMtR9c7mi1FOf6HRMtPgGI1yi2e9nqB/j4rZ99I="}, +        {"content-type", "application/activity+json"}, +        {"signature", "keyId=\"http://mastodon.example.org/users/admin#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"qXKqpQXUpC3d9bZi2ioEeAqP8nRMD021CzH1h6/w+LRk4Hj31ARJHDwQM+QwHltwaLDUepshMfz2WHSXAoLmzWtvv7xRwY+mRqe+NGk1GhxVZ/LSrO/Vp7rYfDpfdVtkn36LU7/Bzwxvvaa4ZWYltbFsRBL0oUrqsfmJFswNCQIG01BB52BAhGSCORHKtQyzo1IZHdxl8y80pzp/+FOK2SmHkqWkP9QbaU1qTZzckL01+7M5btMW48xs9zurEqC2sM5gdWMQSZyL6isTV5tmkTZrY8gUFPBJQZgihK44v3qgfWojYaOwM8ATpiv7NG8wKN/IX7clDLRMA8xqKRCOKw==\""}, +        {"(request-target)", "post /users/demiurge/inbox"} +      ] +    } + +    assert HTTPSignatures.validate_conn(conn) +  end + +  test "validate this" do +    conn = %{ +      params: %{"actor" => "https://niu.moe/users/rye"}, +      req_headers: [ +        {"x-forwarded-for", "149.202.73.191"}, +        {"host", "testing.pleroma.lol"}, +        {"x-cluster-client-ip", "149.202.73.191"}, +        {"connection", "upgrade"}, +        {"content-length", "2396"}, +        {"user-agent", "http.rb/3.0.0 (Mastodon/2.2.0; +https://niu.moe/)"}, +        {"date", "Sun, 18 Feb 2018 20:31:51 GMT"}, +        {"digest", "SHA-256=dzH+vLyhxxALoe9RJdMl4hbEV9bGAZnSfddHQzeidTU="}, +        {"content-type", "application/activity+json"}, +        {"signature", "keyId=\"https://niu.moe/users/rye#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"wtxDg4kIpW7nsnUcVJhBk6SgJeDZOocr8yjsnpDRqE52lR47SH6X7G16r7L1AUJdlnbfx7oqcvomoIJoHB3ghP6kRnZW6MyTMZ2jPoi3g0iC5RDqv6oAmDSO14iw6U+cqZbb3P/odS5LkbThF0UNXcfenVNfsKosIJycFjhNQc54IPCDXYq/7SArEKJp8XwEgzmiC2MdxlkVIUSTQYfjM4EG533cwlZocw1mw72e5mm/owTa80BUZAr0OOuhoWARJV9btMb02ZyAF6SCSoGPTA37wHyfM1Dk88NHf7Z0Aov/Fl65dpRM+XyoxdkpkrhDfH9qAx4iuV2VEWddQDiXHA==\""}, +        {"(request-target)", "post /inbox"} +      ] +    } +    assert HTTPSignatures.validate_conn(conn) +  end + +  test "validate this too" do +    conn = %{ +      params: %{"actor" => "https://niu.moe/users/rye"}, +      req_headers: [ +        {"x-forwarded-for", "149.202.73.191"}, +        {"host", "testing.pleroma.lol"}, +        {"x-cluster-client-ip", "149.202.73.191"}, +        {"connection", "upgrade"}, +        {"content-length", "2342"}, +        {"user-agent", "http.rb/3.0.0 (Mastodon/2.2.0; +https://niu.moe/)"}, +        {"date", "Sun, 18 Feb 2018 21:44:46 GMT"}, +        {"digest", "SHA-256=vS8uDOJlyAu78cF3k5EzrvaU9iilHCX3chP37gs5sS8="}, +        {"content-type", "application/activity+json"}, +        {"signature", "keyId=\"https://niu.moe/users/rye#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"IN6fHD8pLiDEf35dOaRHzJKc1wBYh3/Yq0ItaNGxUSbJTd2xMjigZbcsVKzvgYYjglDDN+disGNeD+OBKwMqkXWaWe/lyMc9wHvCH5NMhpn/A7qGLY8yToSt4vh8ytSkZKO6B97yC+Nvy6Fz/yMbvKtFycIvSXCq417cMmY6f/aG+rtMUlTbKO5gXzC7SUgGJCtBPCh1xZzu5/w0pdqdjO46ePNeR6JyJSLLV4hfo3+p2n7SRraxM4ePVCUZqhwS9LPt3Zdhy3ut+IXCZgMVIZggQFM+zXLtcXY5HgFCsFQr5WQDu+YkhWciNWtKFnWfAsnsg5sC330lZ/0Z8Z91yA==\""}, +        {"(request-target)", "post /inbox"} +      ]} +    assert HTTPSignatures.validate_conn(conn) +  end + +  test "it generates a signature" do +    user = insert(:user) +    assert HTTPSignatures.sign(user, %{host: "mastodon.example.org"}) =~ "keyId=\"" +  end +end diff --git a/test/web/http_sigs/priv.key b/test/web/http_sigs/priv.key new file mode 100644 index 000000000..425518a06 --- /dev/null +++ b/test/web/http_sigs/priv.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF +NUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6Z4UMR7EOcpfdUE9Hf3m/hs+F +UR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJwoYi+1hqp1fIekaxsyQIDAQAB +AoGBAJR8ZkCUvx5kzv+utdl7T5MnordT1TvoXXJGXK7ZZ+UuvMNUCdN2QPc4sBiA +QWvLw1cSKt5DsKZ8UETpYPy8pPYnnDEz2dDYiaew9+xEpubyeW2oH4Zx71wqBtOK +kqwrXa/pzdpiucRRjk6vE6YY7EBBs/g7uanVpGibOVAEsqH1AkEA7DkjVH28WDUg +f1nqvfn2Kj6CT7nIcE3jGJsZZ7zlZmBmHFDONMLUrXR/Zm3pR5m0tCmBqa5RK95u +412jt1dPIwJBANJT3v8pnkth48bQo/fKel6uEYyboRtA5/uHuHkZ6FQF7OUkGogc +mSJluOdc5t6hI1VsLn0QZEjQZMEOWr+wKSMCQQCC4kXJEsHAve77oP6HtG/IiEn7 +kpyUXRNvFsDE0czpJJBvL/aRFUJxuRK91jhjC68sA7NsKMGg5OXb5I5Jj36xAkEA +gIT7aFOYBFwGgQAQkWNKLvySgKbAZRTeLBacpHMuQdl1DfdntvAyqpAZ0lY0RKmW +G6aFKaqQfOXKCyWoUiVknQJAXrlgySFci/2ueKlIE1QqIiLSZ8V8OlpFLRnb1pzI +7U1yQXnTAEFYM560yJlzUpOb1V4cScGd365tiSMvxLOvTA== +-----END RSA PRIVATE KEY----- diff --git a/test/web/http_sigs/pub.key b/test/web/http_sigs/pub.key new file mode 100644 index 000000000..b3bbf6cb9 --- /dev/null +++ b/test/web/http_sigs/pub.key @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3 +6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6 +Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw +oYi+1hqp1fIekaxsyQIDAQAB +-----END PUBLIC KEY----- diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs index 1f10ea4d2..1dd381ac4 100644 --- a/test/web/ostatus/ostatus_test.exs +++ b/test/web/ostatus/ostatus_test.exs @@ -355,13 +355,6 @@ defmodule Pleroma.Web.OStatusTest do      end    end -  test "insert or update a user from given data" do -    user = insert(:user, %{nickname: "nick@name.de"}) -    data = %{ ap_id: user.ap_id <> "xxx", name: user.name, nickname: user.nickname } - -    assert {:ok, %User{}} = OStatus.insert_or_update_user(data) -  end -    test "it doesn't add nil in the do field" do      incoming = File.read!("test/fixtures/nil_mention_entry.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) diff --git a/test/web/twitter_api/representers/object_representer_test.exs b/test/web/twitter_api/representers/object_representer_test.exs index 791b30237..ac8184407 100644 --- a/test/web/twitter_api/representers/object_representer_test.exs +++ b/test/web/twitter_api/representers/object_representer_test.exs @@ -28,4 +28,24 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ObjectReprenterTest do      assert expected_object == ObjectRepresenter.to_map(object)    end + +  test "represents mastodon-style attachments" do +    object = %Object{ +      id: nil, +      data: %{ +        "mediaType" => "image/png", +        "name" => "blabla", "type" => "Document", +        "url" => "http://mastodon.example.org/system/media_attachments/files/000/000/001/original/8619f31c6edec470.png" +      } +    } + +    expected_object = %{ +      url: "http://mastodon.example.org/system/media_attachments/files/000/000/001/original/8619f31c6edec470.png", +      mimetype: "image/png", +      oembed: false, +      id: nil +    } + +    assert expected_object == ObjectRepresenter.to_map(object) +  end  end  | 
