PlumeでURIに空白等を含めたい
この問題がある。
Mastodonに届くペイロードはこんな感じ:
code:json
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"Emoji":"toot:Emoji","Hashtag":"as:Hashtag","atomUri":"ostatus:atomUri","conversation":"ostatus:conversation","featured":"toot:featured","focalPoint":{"@container":"@list","@id":"toot:focalPoint"},"inReplyToAtomUri":"ostatus:inReplyToAtomUri","manuallyApprovesFollowers":"as:manuallyApprovesFollowers","movedTo":"as:movedTo","ostatus":"http://ostatus.org#","sensitive":"as:sensitive","toot":"http://joinmastodon.org/ns#"}],"actor":"https://plume01.localhost/@/admin/","cc":["http://localhost:3000/users/user02","http://localhost:3000/users/admin","https://plume02.localhost/@/admin/"],"id":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-04/activity","object":{"attributedTo":["https://plume01.localhost/@/admin/","https://plume01.localhost/~/Plume01ブログ/"],"cc":["http://localhost:3000/users/user02","http://localhost:3000/users/admin","https://plume02.localhost/@/admin/"],"content":"","id":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-04/","license":"CC-BY-SA","name":"Plume01 Article 2021-09-05-04","published":"2021-09-05T06:54:33.281647Z","source":{"content":"","mediaType":"text/markdown"},"summary":"","tag":[],"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Article","url":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-04/"},"signature":{"created":"2021-09-05T06:54:33.323286500+00:00","creator":"https://plume01.localhost/@/admin/#main-key","signatureValue":"uDk92wPxePJ8hnsrXOyubRWMX4UmqW4O5L5+GBYKzJWtBT10iSO2Rm1joYa+0orxOZnTz0VDynSdrh2RamQ8LFAdFEzWMa+sIPExcv0st+B/oCL+qi9AdedyueOxRCneXiEgLLV2FUkACu+QF/OZWZG2QFDC2IXKV9YEhrwIhcqe9EGYK/npOGNGdOad4y7mfWH+pOvH/zSf7lT69f6dwOr4QnHywH/VfRMzujmBjU7c7hIZCmlIOXiW5XTb1zkaaP1CohZwL2yQR8qKConPCnPSuLbEb9Odp81yrZJd9GUqhkL4exHCMRhlVOks+SU3Pe/gawwz3zJMN9WB+LdCdg==","type":"RsaSignature2017"},"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Create"} Plume側のログ:
code:log
Sep 05 16:30:35.902 WARN plume_common::activity_pub: {"actor":"https://plume01.localhost/@/admin/","cc":["http://localhost:3000/users/user02","http://localhost:3000/users/admin","https://plume02.localhost/@/admin/"],"id":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-05/activity","object":{"attributedTo":["https://plume01.localhost/@/admin/","https://plume01.localhost/~/Plume01ブログ/"],"cc":["http://localhost:3000/users/user02","http://localhost:3000/users/admin","https://plume02.localhost/@/admin/"],"content":"","id":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-05/","license":"CC-BY-SA","name":"Plume01 Article 2021-09-05-05","published":"2021-09-05T07:30:35.836550Z","source":{"content":"","mediaType":"text/markdown"},"summary":"","tag":[],"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Article","url":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-05/"},"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Create"} object.urlがhttps://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-04/となっていてこれが問題を引き起こしているようだ。
object.urlはURIなのかIRIなのか?
仕様ではどうか?
https://www.w3.org/ns/activitystreamsを見ればいいかな。
Range: xsd:anyURI | Link
URIっぽいな。
Plumeはどういう積もりで送ってるか?
activitypubクレートの0.1.6のserde_json::to_value(activitypub::Activity)して処理している
Articleのurlはどこで設定しているのか?
broadcast関数に渡す時には既に設定されているはず。
Post::create_activity() -> Post::to_activity()
これかな?
code:rs
article.object_props.set_url_string(self.ap_url.clone())?;
ap_urlは仕様でURIじゃなくてIRIにしてた気がする。
idをap_urlから作ってるからそうだね。
なのでap_urlは変えずにパーセントエンコードしてurlに入れればよい。
違った。IRIはパスコンポーネントに空白を含められない。
のでスラッグを作る時に空白を何とかしないといけない。
Post::slug()だけを何とかすればよさそう。
違う。slugはそのまま、空白を含めたい。
plumeパッケージの場合はRocketのuri!マクロを使える
ブログはスラッグとap url(fqn)が同じになるようになってる
それをURIやIRIに使う時にだけエスケープする。
既存のap_urlフィールドには間違った値が含まれてることになるなあ。
結果:
code:Plume
Sep 05 16:41:50.804 WARN plume_common::activity_pub: {"actor":"https://plume01.localhost/@/admin/","cc":["http://localhost:3000/users/user02","http://localhost:3000/users/admin","https://plume02.localhost/@/admin/"],"id":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-06/activity","object":{"attributedTo":["https://plume01.localhost/@/admin/","https://plume01.localhost/~/Plume01ブログ/"],"cc":["http://localhost:3000/users/user02","http://localhost:3000/users/admin","https://plume02.localhost/@/admin/"],"content":"","id":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-06/","license":"CC-BY-SA","name":"Plume01 Article 2021-09-05-06","published":"2021-09-05T07:41:50.733813Z","source":{"content":"","mediaType":"text/markdown"},"summary":"","tag":[],"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Article","url":"https:%2F%2Fplume01.localhost%2F~%2FPlume01%E3%83%96%E3%83%AD%E3%82%B0%2FPlume01%20Article%202021-09-05-06%2F"},"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Create"} code:Mastodon
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"Emoji":"toot:Emoji","Hashtag":"as:Hashtag","atomUri":"ostatus:atomUri","conversation":"ostatus:conversation","featured":"toot:featured","focalPoint":{"@container":"@list","@id":"toot:focalPoint"},"inReplyToAtomUri":"ostatus:inReplyToAtomUri","manuallyApprovesFollowers":"as:manuallyApprovesFollowers","movedTo":"as:movedTo","ostatus":"http://ostatus.org#","sensitive":"as:sensitive","toot":"http://joinmastodon.org/ns#"}],"actor":"https://plume01.localhost/@/admin/","cc":["http://localhost:3000/users/user02","http://localhost:3000/users/admin","https://plume02.localhost/@/admin/"],"id":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-06/activity","object":{"attributedTo":["https://plume01.localhost/@/admin/","https://plume01.localhost/~/Plume01ブログ/"],"cc":["http://localhost:3000/users/user02","http://localhost:3000/users/admin","https://plume02.localhost/@/admin/"],"content":"","id":"https://plume01.localhost/~/Plume01ブログ/Plume01 Article 2021-09-05-06/","license":"CC-BY-SA","name":"Plume01 Article 2021-09-05-06","published":"2021-09-05T07:41:50.733813Z","source":{"content":"","mediaType":"text/markdown"},"summary":"","tag":[],"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Article","url":"https:%2F%2Fplume01.localhost%2F~%2FPlume01%E3%83%96%E3%83%AD%E3%82%B0%2FPlume01%20Article%202021-09-05-06%2F"},"signature":{"created":"2021-09-05T07:41:50.804940200+00:00","creator":"https://plume01.localhost/@/admin/#main-key","signatureValue":"RcenqZ7baY5jVR2k5NqFkyAHjOGXRYEpyL6sXa/lvRFgY7hPrAhMTqksO8bWz9Gx7bSrfWrgDQbEX56bPmpQ2G/QH5jfM3zhXp2i+qO1+vK/gaXx7ICCNmHdrEQwOG6zUyUYf5QwdlkXpdswjwlc2DElCSjDglQynPz/SD6+JO8aApGu69lEa8rOWhIX2KZg0CyU4518PHqMop4/UIA6AkcG7n2ZW0rIBDrvouQ3BT7Zhzka94lkThCIr1Ee+S0CVot51wFZtOODaOBW4D2iVuIXGOHShhLuJ/8F0ZPgNvx6Mwr9i7NX/zGCTQwnkWLJH+zGxIf4pItdlLtCJCWnfQ==","type":"RsaSignature2017"},"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Create"} スラッグはタイトルのままで、ap_urlを作る時だけパーセントエンコードしてみた
本当はURIじゃなくてIRIとして許可される文字列なら残したかったが
code:Plume
Sep 06 07:27:06.944 WARN plume_common::activity_pub: Object({"@context": Array([String("https://www.w3.org/ns/activitystreams"), String("https://w3id.org/security/v1"), Object({"Emoji": String("toot:Emoji"), "Hashtag": String("as:Hashtag"), "atomUri": String("ostatus:atomUri"), "conversation": String("ostatus:conversation"), "featured": String("toot:featured"), "focalPoint": Object({"@container": String("@list"), "@id": String("toot:focalPoint")}), "inReplyToAtomUri": String("ostatus:inReplyToAtomUri"), "manuallyApprovesFollowers": String("as:manuallyApprovesFollowers"), "movedTo": String("as:movedTo"), "ostatus": String("http://ostatus.org#"), "sensitive": String("as:sensitive"), "toot": String("http://joinmastodon.org/ns#")})]), "actor": String("https://plume01.localhost/@/admin/"), "cc": Array([String("http://localhost:3000/users/admin"), String("http://localhost:3000/users/user02"), String("https://plume02.localhost/@/admin/")]), "id": String("https://plume01.localhost/~/Plume01ブログ/Plume01%20Article%202021-09-06-01/activity"), "object": Object({"attributedTo": Array([String("https://plume01.localhost/@/admin/"), String("https://plume01.localhost/~/Plume01ブログ/")]), "cc": Array([String("http://localhost:3000/users/admin"), String("http://localhost:3000/users/user02"), String("https://plume02.localhost/@/admin/")]), "content": String(""), "id": String("https://plume01.localhost/~/Plume01ブログ/Plume01%20Article%202021-09-06-01/"), "license": String("CC-BY-SA"), "name": String("Plume01 Article 2021-09-06-01"), "published": String("2021-09-05T22:27:06.891637Z"), "source": Object({"content": String(""), "mediaType": String("text/markdown")}), "summary": String(""), "tag": Array([]), "to": Array([String("https://www.w3.org/ns/activitystreams#Public")]), "type": String("Article"), "url": String("https://plume01.localhost/~/Plume01ブログ/Plume01%20Article%202021-09-06-01/")}), "signature": Object({"created": String("2021-09-05T22:27:06.938166+00:00"), "creator": String("https://plume01.localhost/@/admin/#main-key"), "signatureValue": String("tVLnKr25nQZPuQ4YXW07mo5h86hgWtCf8r0D962Oq151oxk4h71yP9mEfDLnd0RZEFIcwSZ+0J58MLizL9WGYHhgP/bgkLRHh+NIaiVXg7CHUL0WarkLYQ1iHwiksV7AY8j/E78gbmExVET1BNiSG/gVFTEUg3zpzeul3CxFxTi9CkrIx9PIma6wYzmljUVIm4UElkqArkUedJ49HPCZ/rhwdCfMneNfZHUUZ95gMEzOumnS3I0zqTkyURxAZCJ/eIhAKkwAOm2d4S9Pbo+rVwASgGVqZopS62tNoueCJRYG9m8k3JdLLOMcFpIhdBW1M3oybr2+PE2w7oKp5u1siw=="), "type": String("RsaSignature2017")}), "to": Array([String("https://www.w3.org/ns/activitystreams#Public")]), "type": String("Create")}) code:Mastodon
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"Emoji":"toot:Emoji","Hashtag":"as:Hashtag","atomUri":"ostatus:atomUri","conversation":"ostatus:conversation","featured":"toot:featured","focalPoint":{"@container":"@list","@id":"toot:focalPoint"},"inReplyToAtomUri":"ostatus:inReplyToAtomUri","manuallyApprovesFollowers":"as:manuallyApprovesFollowers","movedTo":"as:movedTo","ostatus":"http://ostatus.org#","sensitive":"as:sensitive","toot":"http://joinmastodon.org/ns#"}],"actor":"https://plume01.localhost/@/admin/","cc":["http://localhost:3000/users/admin","http://localhost:3000/users/user02","https://plume02.localhost/@/admin/"],"id":"https://plume01.localhost/~/Plume01ブログ/Plume01%20Article%202021-09-06-01/activity","object":{"attributedTo":["https://plume01.localhost/@/admin/","https://plume01.localhost/~/Plume01ブログ/"],"cc":["http://localhost:3000/users/admin","http://localhost:3000/users/user02","https://plume02.localhost/@/admin/"],"content":"","id":"https://plume01.localhost/~/Plume01ブログ/Plume01%20Article%202021-09-06-01/","license":"CC-BY-SA","name":"Plume01 Article 2021-09-06-01","published":"2021-09-05T22:27:06.891637Z","source":{"content":"","mediaType":"text/markdown"},"summary":"","tag":[],"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Article","url":"https://plume01.localhost/~/Plume01ブログ/Plume01%20Article%202021-09-06-01/"},"signature":{"created":"2021-09-05T22:27:06.938166+00:00","creator":"https://plume01.localhost/@/admin/#main-key","signatureValue":"tVLnKr25nQZPuQ4YXW07mo5h86hgWtCf8r0D962Oq151oxk4h71yP9mEfDLnd0RZEFIcwSZ+0J58MLizL9WGYHhgP/bgkLRHh+NIaiVXg7CHUL0WarkLYQ1iHwiksV7AY8j/E78gbmExVET1BNiSG/gVFTEUg3zpzeul3CxFxTi9CkrIx9PIma6wYzmljUVIm4UElkqArkUedJ49HPCZ/rhwdCfMneNfZHUUZ95gMEzOumnS3I0zqTkyURxAZCJ/eIhAKkwAOm2d4S9Pbo+rVwASgGVqZopS62tNoueCJRYG9m8k3JdLLOMcFpIhdBW1M3oybr2+PE2w7oKp5u1siw==","type":"RsaSignature2017"},"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Create"} .localhostだと駄目だったけど.comとかにしたらリンクになった。OK
方針はOKなので、これをIRI対応させたい。
Mastodonはどう処理しているか?