public override async Task <bool> Handle() { if (MainObject.Type == "https://www.w3.org/ns/activitystreams#Follow") { if (Actor.Data["manuallyApprovesFollowers"].Any(a => !(bool)a.Primitive)) { var accept = new ASObject(); accept.Type.Add("https://www.w3.org/ns/activitystreams#Accept"); accept.Replace("actor", ASTerm.MakeId(Actor.Id)); accept.Replace("object", ASTerm.MakeId(MainObject.Id)); accept["to"].AddRange(MainObject.Data["actor"]); var claims = new ClaimsPrincipal(); var id = new ClaimsIdentity(); id.AddClaim(new Claim(JwtTokenSettings.ActorClaim, Actor.Id)); claims.AddIdentity(id); var handler = ActivatorUtilities.CreateInstance <GetEntityMiddleware.GetEntityHandler>(_serviceProvider, claims, EntityStore); var outbox = await EntityStore.GetEntity(Actor.Data["outbox"].First().Id, false); await handler.ClientToServer(outbox, accept); } return(true); } if (MainObject.Type != "https://www.w3.org/ns/activitystreams#Like" && MainObject.Type != "https://www.w3.org/ns/activitystreams#Announce") { return(true); } var toFollowOrLike = await EntityStore.GetEntity(MainObject.Data["object"].Single().Id, false); if (toFollowOrLike == null) { await GetEntityTask.Make(MainObject.Data["object"].Single().Id, _connection); return(true); } // sent to not the owner, so not updating! if (toFollowOrLike.Data["attributedTo"].Single().Id != Actor.Id) { return(true); } string collectionId = null, objectToAdd = null; switch (MainObject.Type) { case "https://www.w3.org/ns/activitystreams#Like": collectionId = toFollowOrLike.Data["likes"].SingleOrDefault()?.Id; objectToAdd = MainObject.Id; break; case "https://www.w3.org/ns/activitystreams#Announce": collectionId = toFollowOrLike.Data["shares"].SingleOrDefault()?.Id; objectToAdd = MainObject.Id; break; } if (collectionId == null) { return(true); // no way to store followers/likse } var collection = await EntityStore.GetEntity(collectionId, false); var entityToAdd = await EntityStore.GetEntity(objectToAdd, true); if (entityToAdd == null) { throw new InvalidOperationException("Can't like or announce a non-existant object!"); } await _collection.AddToCollection(collection, entityToAdd); return(true); }
public async Task <IActionResult> DoRegister(RegisterViewModel model) { if (!_configuration.GetSection("Kroeg").GetValue <bool>("CanRegister")) { return(NotFound()); } var apuser = new APUser { Username = model.Username, Email = model.Email }; if ((await _relevantEntities.FindEntitiesWithPreferredUsername(model.Username)).Count > 0) { ModelState.AddModelError("", "Username is already in use!"); } if (model.Password != model.VerifyPassword) { ModelState.AddModelError("", "Passwords don't match!"); } if (!ModelState.IsValid) { return(View("Register", model)); } await _connection.OpenAsync(); using (var trans = _connection.BeginTransaction()) { var result = await _userManager.CreateAsync(apuser, model.Password); if (!result.Succeeded) { ModelState.AddModelError("", result.Errors.First().Description); } if (!ModelState.IsValid) { return(View("Register", model)); } if (await _connection.ExecuteAsync("select count(*) from \"Users\"") == 1) { // await _userManager.AddClaimAsync(apuser, new Claim("admin", "true")); } await _signInManager.SignInAsync(apuser, false); var user = model.Username; var obj = new ASObject(); obj.Type.Add("https://www.w3.org/ns/activitystreams#Person"); obj["preferredUsername"].Add(ASTerm.MakePrimitive(user)); obj["name"].Add(ASTerm.MakePrimitive(user)); var create = new ASObject(); create.Type.Add("https://www.w3.org/ns/activitystreams#Create"); create["object"].Add(ASTerm.MakeSubObject(obj)); create["to"].Add(ASTerm.MakeId("https://www.w3.org/ns/activitystreams#Public")); Console.WriteLine($"--- creating actor. Unflattened:\n{create.Serialize().ToString(Formatting.Indented)}"); var apo = await _entityFlattener.FlattenAndStore(_entityStore, create); Console.WriteLine($"Flat: {apo.Data.Serialize().ToString(Formatting.Indented)}\n----"); var handler = new CreateActorHandler(_entityStore, apo, null, null, User, _collectionTools, _entityConfiguration, _connection); handler.UserOverride = apuser.Id; await handler.Handle(); var resultUser = await _entityStore.GetEntity(handler.MainObject.Data["object"].First().Id, false); var outbox = await _entityStore.GetEntity(resultUser.Data["outbox"].First().Id, false); var delivery = new DeliveryHandler(_entityStore, handler.MainObject, resultUser, outbox, User, _collectionTools, _provider.GetRequiredService <DeliveryService>()); await delivery.Handle(); trans.Commit(); return(RedirectToActionPermanent("Index", "Settings")); } }