Beispiel #1
0
        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);
        }
Beispiel #2
0
        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"));
            }
        }