Update activitiypub.extend.php

This commit is contained in:
Namhyeon Go 2022-07-01 00:53:39 +09:00 committed by GitHub
parent c837c5ead5
commit ec410f8578
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,8 +6,11 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// References:
// * https://www.w3.org/TR/activitypub/
// * https://github.com/w3c/activitypub/issues/194
// * https://docs.joinmastodon.org/spec/webfinger/
define("ACTIVITYPUB_INSTANCE_ID", md5_file(G5_DATA_PATH . "/dbconfig.php"));
define("ACTIVITYPUB_HOST", (empty(G5_DOMAIN) ? $_SERVER['HTTP_HOST'] : G5_DOMAIN));
define("ACTIVITYPUB_URL", (empty(G5_URL) ? "http://" . ACTIVITYPUB_INSTANCE_ID . ".local" : G5_URL));
define("ACTIVITYPUB_DATA_URL", ACTIVITYPUB_URL . '/' . G5_DATA_DIR);
define("ACTIVITYPUB_G5_TABLENAME", G5_TABLE_PREFIX . "apstreams");
@ -173,17 +176,16 @@ function activitypub_send_to_inbox($object) {
"Accept" => "application/ld+json; profile=\"" . NAMESPACE_ACTIVITYSTREAMS . "\"",
"Authorization" => "Bearer " . $attr['accesstoken']
),
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true
CURLOPT_SSL_VERIFYPEER => false
));
$response = curl_exec($ch);
$remote_user_ctx = json_decode($response, true);
$remote_user_ctx = json_decode(curl_exec($ch), true);
// inbox 주소 찾기
$remote_inbox_url = $remote_user_ctx['inbox']
if (empty($remote_inbox_url))
$remote_inbox_url = $remote_user_ctx['inbox'];
if (empty($remote_inbox_url)) {
$remote_inbox_url = $remote_user_ctx['endpoints']['sharedInbox'];
}
// inbox 주소가 없으면 건너뛰기
if (empty($remote_inbox_url)) continue;
@ -197,13 +199,10 @@ function activitypub_send_to_inbox($object) {
"Authorization" => "Bearer " . $attr['accesstoken']
),
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_POST => true,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $rawdata
));
$response = curl_exec($ch);
$remote_inbox_ctx = json_decode($response, true);
// TODO
@ -261,6 +260,79 @@ class _GNUBOARD_ActivityPub {
header("Content-Type: application/ld+json; profile=\"" . NAMESPACE_ACTIVITYSTREAMS . "\"");
}
public static function webfinger() {
$params = array(
"resource" => $_GET['resource']
);
if (empty($params['resource'])) {
return activitypub_json_encode(array("message" => "Resource could not empty"));
}
$resource = $params['resource'];
$resource_type = '';
$resource_value = '';
$pos = strpos($resource, ':');
if ($pos !== false) {
$resource_type = substr($resource, 0, $pos);
$resource_value = substr($resource, $pos + 1);
}
switch($resource_type) {
case "acct":
// 값 분리
list($mb_id, $host) = explode('@', $resource_value);
// 호스트가 일치하지 않는 경우
if ($host != ACTIVITYPUB_HOST) {
return activitypub_json_encode(array("message" => "Invalid host"));
}
// 회원 정보 확인
$mb = get_member($mb_id);
if (empty($mb['mb_id'])) {
return activitypub_json_encode(array("message" => "Not registered user"));
}
// 응답 본문 생성
$context = array(
"subject" => $params['resource'],
"aliases" => array(
activitypub_get_url("user", array("mb_id" => $mb['mb_id']))
),
"links" => array(
array(
"rel" => "http://webfinger.net/rel/profile-page",
"type" => "text/html",
"href" => G5_BBS_URL . "/profile.php?mb_id=" . $mb['mb_id']
),
array(
"rel" => "self",
"type" => "application/activity+json",
"href" => activitypub_get_url("user", array("mb_id" => $mb['mb_id']))
),
array(
"rel" => "http://ostatus.org/schema/1.0/subscribe",
"href" => activitypub_get_url("ostatus", array("mb_id" => $mb['mb_id'], "uri" => "{uri}"))
)
)
);
// 응답 본문 출력
return activitypub_json_encode($context);
break;
case "http":
return activitypub_json_encode(array("message" => "Not implemented"));
break;
default:
return activitypub_json_encode(array("message" => "Not supported resource type"));
break;
}
}
public static function user() {
$mb = get_member($_GET['mb_id']);
@ -282,7 +354,7 @@ class _GNUBOARD_ActivityPub {
"liked" => activitypub_get_url("liked", array("mb_id" => $mb['mb_id'])),
"icon" => array(
activitypub_get_icon($mb)
)
),
"endpoints" => array(
"sharedInbox" => activitypub_get_url("inbox")
)
@ -598,6 +670,14 @@ class _GNUBOARD_ActivityPub {
$route = $_GET['route'];
switch ($route) {
// 액펍(ActivityPub)과 웹핑거(WebFinger)는 다른 개념이지만, 여기서는 액펍(ActivityPub) 전용으로 사용한다.
// 액펍(ActivityPub)에서 사용자를 조회하기 전단계에서 이뤄지는 요청이다.
case "activitypub.webfinger":
_GNUBOARD_ActivityPub::open();
echo _GNUBOARD_ActivityPub::webfinger();
_GNUBOARD_ActivityPub::close();
break;
case "activitypub.user":
_GNUBOARD_ActivityPub::open();
echo _GNUBOARD_ActivityPub::user();