using System; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; using BirdsiteLive.ActivityPub; using Newtonsoft.Json; using Org.BouncyCastle.Bcpg; namespace BirdsiteLive.Domain { public interface IActivityPubService { Task GetUser(string objectId); Task PostDataAsync(T data, string targetHost, string actorUrl); } public class ActivityPubService : IActivityPubService { private readonly ICryptoService _cryptoService; #region Ctor public ActivityPubService(ICryptoService cryptoService) { _cryptoService = cryptoService; } #endregion public async Task GetUser(string objectId) { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); var result = await httpClient.GetAsync(objectId); var content = await result.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(content); } } public async Task PostDataAsync(T data, string targetHost, string actorUrl) { var json = JsonConvert.SerializeObject(data); var date = DateTime.UtcNow.ToUniversalTime(); var httpDate = date.ToString("r"); var signature = _cryptoService.SignAndGetSignatureHeader(date, actorUrl, targetHost); var client = new HttpClient(); var httpRequestMessage = new HttpRequestMessage { Method = HttpMethod.Post, RequestUri = new Uri($"https://{targetHost}/inbox"), Headers = { {"Host", targetHost}, {"Date", httpDate}, {"Signature", signature} }, Content = new StringContent(json, Encoding.UTF8, "application/ld+json") }; var response = await client.SendAsync(httpRequestMessage); return response.StatusCode; } } }