private async Task _queueInboxDelivery(string targetUrl, APEntity entity) { await DeliverToActivityPubTask.Make(new DeliverToActivityPubData { ObjectId = entity.Id, TargetInbox = targetUrl }, _connection); }
private void _queueInboxDelivery(string targetUrl, APEntity entity) { _context.EventQueue.Add( DeliverToActivityPubTask.Make(new DeliverToActivityPubData { ObjectId = entity.Id, TargetInbox = targetUrl })); }
public async Task <IActionResult> SharedInbox() { var userId = await _verifier.Verify(Request.Scheme + "://" + Request.Host.ToUriComponent() + Request.Path, HttpContext); if (userId == null) { return(Unauthorized()); } var reader = new StreamReader(Request.Body); var data = ASObject.Parse(await reader.ReadToEndAsync()); if (!EntityData.IsActivity(data)) { return(StatusCode(403, "Not an activity?")); } await _connection.OpenAsync(); using (var transaction = _connection.BeginTransaction()) { APEntity resultEntity; if (data["actor"].Any((a) => a.Id == userId)) { var temporaryStore = new StagingEntityStore(_entityStore); resultEntity = await _entityFlattener.FlattenAndStore(temporaryStore, data, false); await temporaryStore.TrimDown((new Uri(new Uri(userId), "/")).ToString()); await temporaryStore.CommitChanges(); } else { resultEntity = await _entityStore.GetEntity(data.Id, true); if (resultEntity == null) { return(StatusCode(202)); } data = resultEntity.Data; } var users = await _deliveryService.GetUsersForSharedInbox(data); foreach (var user in users) { await DeliverToActivityPubTask.Make(new DeliverToActivityPubData { ObjectId = resultEntity.Id, TargetInbox = user.Data["inbox"].First().Id }, _connection); } transaction.Commit(); return(StatusCode(202)); } }
public async Task <IActionResult> SharedInbox() { var userId = await _verifier.Verify(Request.Scheme + "://" + Request.Host.ToUriComponent() + Request.Path, HttpContext); if (userId == null) { return(Unauthorized()); } var reader = new StreamReader(Request.Body); var data = ASObject.Parse(await reader.ReadToEndAsync()); if (!_entityConfiguration.IsActivity(data)) { return(StatusCode(403, "Not an activity?")); } if (!data["actor"].Any((a) => (string)a.Primitive == userId)) { return(StatusCode(403, "Invalid signature!")); } var temporaryStore = new StagingEntityStore(_entityStore); var resultEntity = await _entityFlattener.FlattenAndStore(temporaryStore, data, false); temporaryStore.TrimDown((new Uri(new Uri(userId), "/")).ToString()); await temporaryStore.CommitChanges(); // shouuuuld be safe var users = await _deliveryService.GetUsersForSharedInbox(data); foreach (var user in users) { if (user.IsOwner) { _context.EventQueue.Add(DeliverToActivityPubTask.Make(new DeliverToActivityPubData { ObjectId = resultEntity.Id, TargetInbox = (string)user.Data["inbox"].First().Primitive })); } } await _context.SaveChangesAsync(); return(StatusCode(202)); }