コード例 #1
0
        public async Task LoginAndLogoutEventTest()
        {
            string sessionToken = string.Empty;
            APUser loggedIn     = null;
            var    user         = await UserHelper.CreateNewUserAsync();

            AppContext.UserContext.UserLoggedIn += (s, e) =>
            {
                Console.WriteLine("User is logged in.");
                sessionToken = e.SessionToken;
                loggedIn     = e.User;
            };
            AppContext.UserContext.UserLoggedOut += (s, e) =>
            {
                Console.WriteLine("User is logged out.");
                sessionToken = null;
                loggedIn     = null;
            };
            await AppContext.LoginAsync(new UsernamePasswordCredentials(user.Username, user.Password));

            Assert.IsTrue(sessionToken == AppContext.UserContext.SessionToken);
            Assert.IsTrue(loggedIn.Id == AppContext.UserContext.LoggedInUser.Id);
            await AppContext.LogoutAsync();

            Assert.IsNull(sessionToken);
            Assert.IsNull(loggedIn);
        }
コード例 #2
0
        public async Task InvalidTokenLogoutEventTest()
        {
            string sessionToken = string.Empty;
            APUser loggedIn     = null;
            var    user         = await UserHelper.CreateNewUserAsync();

            AppContext.UserContext.UserLoggedIn += (s, e) =>
            {
                Console.WriteLine("User is logged in.");
                sessionToken = e.SessionToken;
                loggedIn     = e.User;
            };
            AppContext.UserContext.UserLoggedOut += (s, e) =>
            {
                Console.WriteLine("User is logged out.");
                sessionToken = null;
                loggedIn     = null;
            };
            await AppContext.LoginAsync(new UsernamePasswordCredentials(user.Username, user.Password) { TimeoutInSeconds = 3 });

            Assert.IsTrue(sessionToken == AppContext.UserContext.SessionToken);
            Assert.IsTrue(loggedIn.Id == AppContext.UserContext.LoggedInUser.Id);
            await Utilities.Delay(5000);

            var isValid = await UserSession.IsValidAsync(AppContext.UserContext.SessionToken);

            Assert.IsFalse(isValid);
            Assert.IsNull(sessionToken);
            Assert.IsNull(loggedIn);
        }
コード例 #3
0
        public async Task CreateUserAsyncTest()
        {
            var user = new APUser()
            {
                Username    = "******" + Unique.String,        // ensure unique user name
                Email       = "john.doe@" + Unique.String + ".com",     // unique but useless email address
                Password    = "******",
                DateOfBirth = DateTime.Today.AddYears(-25),
                FirstName   = "John",
                LastName    = "Doe",
                Phone       = "987-654-3210",
                Location    = new Geocode(18, 19)
            };



            // Create user
            var request = new CreateUserRequest()
            {
                User = user
            };
            var response = await request.ExecuteAsync();

            ApiHelper.EnsureValidResponse(response);
            Assert.IsNotNull(response.User, "User in response is null.");
            Assert.IsTrue(string.IsNullOrWhiteSpace(response.User.Id) == false);
            Console.WriteLine("Created user with id {0}.", response.User.Id);
        }
コード例 #4
0
        public static async Task<APUser> CreateNewUserAsync(APUser user = null, bool returnPassword = true)
        {
            // Create user
            user = user ?? new APUser()
            {
                Username = "******" + Unique.String,                  // ensure unique user name
                Email = "john.doe@" + Unique.String + ".com",           // unique but useless email address
                Password = "******",
                DateOfBirth = DateTime.Today.AddYears(-25),
                FirstName = "John",
                LastName = "Doe",
                Phone = "987-654-3210",
                Location = new Geocode(18, 19)
            };

            Console.WriteLine("Creating new user with username {0}.", user.Username);

            var createRequest = new CreateUserRequest() { User = user };
            var createResponse = await createRequest.ExecuteAsync(); 
            var created = createResponse.User;
            Assert.IsNotNull(created, "Initial user creation failed.");
            Console.WriteLine("Created new user with username {0} and id {1}.", created.Username, created.Id);
            // Setup the password
            if( returnPassword == true )
                created.Password = user.Password;
            return created;
        }
コード例 #5
0
        public static async Task <APUser> CreateNewUserAsync(APUser user = null, bool returnPassword = true)
        {
            // Create user
            user = user ?? new APUser()
            {
                Username    = "******" + Unique.String,              // ensure unique user name
                Email       = "john.doe@" + Unique.String + ".com",     // unique but useless email address
                Password    = "******",
                DateOfBirth = DateTime.Today.AddYears(-25),
                FirstName   = "John",
                LastName    = "Doe",
                Phone       = "987-654-3210",
                Location    = new Geocode(18, 19)
            };

            Console.WriteLine("Creating new user with username {0}.", user.Username);

            var createRequest = new CreateUserRequest()
            {
                User = user
            };
            var createResponse = await createRequest.ExecuteAsync();

            var created = createResponse.User;

            Assert.IsNotNull(created, "Initial user creation failed.");
            Console.WriteLine("Created new user with username {0} and id {1}.", created.Username, created.Id);
            // Setup the password
            if (returnPassword == true)
            {
                created.Password = user.Password;
            }
            return(created);
        }
コード例 #6
0
        internal static void ReadJson(APUser user, JObject json)
        {
            /*
             * "__groups": [
             *          {
             *                  "groupid": "12345",
             *                  "name": "group name"
             *          }
             */
            JToken value;

            if (json.TryGetValue("__groups", out value) == false)
            {
                return;
            }
            if (value.Type != JTokenType.Array)
            {
                return;
            }
            foreach (JObject groupJson in value.Values <JObject>())
            {
                var groupInfo = ParseGroupInfo(groupJson);
                if (groupInfo != null)
                {
                    user.Groups.Add(groupInfo);
                }
            }
        }
コード例 #7
0
 public static void MatchUsers(APUser user1, APUser user2)
 {
     Assert.IsTrue(user1.Username == user2.Username, "Usernames do not match.");
     Assert.IsTrue(user1.FirstName == user2.FirstName, "First names do not match.");
     Assert.IsTrue(user1.LastName == user2.LastName, "Last names do not match.");
     Assert.IsTrue(user1.Email == user2.Email, "Email addresses do not match.");
     Assert.IsTrue(user1.Phone == user2.Phone, "Phone numbers do not match.");
     Assert.IsTrue(user1.DateOfBirth == user2.DateOfBirth, "Date of births do not match.");
     Assert.IsTrue(user1.Location.Equals(user2.Location), "Locations do not match.");
 }
コード例 #8
0
 public APUser GetUser()
 {
     /*
      If local user is not available, check local store and get from there.
      If not available in local store then return null.
      */
     if (_localUser == null)
         _localUser = GetLocalUser();
     return _localUser;
 }
コード例 #9
0
        public static void MatchUsers(APUser user1, APUser user2)
        {
            Assert.IsTrue(user1.Username == user2.Username, "Usernames do not match.");
            Assert.IsTrue(user1.FirstName == user2.FirstName, "First names do not match.");
            Assert.IsTrue(user1.LastName == user2.LastName, "Last names do not match.");
            Assert.IsTrue(user1.Email == user2.Email, "Email addresses do not match.");
            Assert.IsTrue(user1.Phone == user2.Phone, "Phone numbers do not match.");
            Assert.IsTrue(user1.DateOfBirth == user2.DateOfBirth, "Date of births do not match.");
            Assert.IsTrue(user1.Location.Equals(user2.Location), "Locations do not match.");

        }
コード例 #10
0
 public APUser GetUser()
 {
     /*
      * If local user is not available, check local store and get from there.
      * If not available in local store then return null.
      */
     if (_localUser == null)
     {
         _localUser = GetLocalUser();
     }
     return(_localUser);
 }
コード例 #11
0
        public void SetUser(APUser user)
        {
            var context = GetOperationContext();
            // Remove the existing extension.
            var existing = context.Extensions.Find<UserExtension>();
            if (existing != null)
                context.Extensions.Remove(existing);
            // If user is not null, then update with latest content.
            if (user != null)
                context.Extensions.Add(new UserExtension(user));


        }
コード例 #12
0
 public void SetUser(APUser user)
 {
     if (user == null)
     {
         this.GetSession()[SessionKeys.ForUser()] = null;
     }
     else
     {
         var serializer = ObjectFactory.Build<IJsonSerializer>();
         var bytes = serializer.Serialize(user);
         this.GetSession()[SessionKeys.ForUser()] = bytes;
     }
 }
コード例 #13
0
 public void SetUser(APUser user)
 {
     if (user == null)
     {
         this.GetSession()[SessionKeys.ForUser()] = null;
     }
     else
     {
         var serializer = ObjectFactory.Build <IJsonSerializer>();
         var bytes      = serializer.Serialize(user);
         this.GetSession()[SessionKeys.ForUser()] = bytes;
     }
 }
コード例 #14
0
 public void SetUser(APUser user)
 {
     if (user == null)
     {
         this.LocalStorage.Remove(NamingConvention.LocalUserKey());
     }
     else
     {
         var bytes = this.Serializer.Serialize(user);
         var json  = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
         this.LocalStorage.SetValue(NamingConvention.LocalUserKey(), json);
     }
     _localUser = user;
 }
コード例 #15
0
 public void SetUser(APUser user)
 {
     if (user == null)
     {
         this.LocalStorage.Remove(NamingConvention.LocalUserKey());
     }
     else
     {
         var bytes = this.Serializer.Serialize(user);
         var json = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
         this.LocalStorage.SetValue(NamingConvention.LocalUserKey(), json);
     }
     _localUser = user;
 }
コード例 #16
0
        public void SetUser(APUser user)
        {
            var context = GetOperationContext();
            // Remove the existing extension.
            var existing = context.Extensions.Find <UserExtension>();

            if (existing != null)
            {
                context.Extensions.Remove(existing);
            }
            // If user is not null, then update with latest content.
            if (user != null)
            {
                context.Extensions.Add(new UserExtension(user));
            }
        }
コード例 #17
0
        public async Task CreateUserAsyncTest()
        {
            var user = new APUser()
            {
                Username    = "******" + Unique.String,              // ensure unique user name
                Email       = "john.doe@" + Unique.String + ".com",     // unique but useless email address
                Password    = "******",
                DateOfBirth = DateTime.Today.AddYears(-25),
                FirstName   = "John",
                LastName    = "Doe",
                Phone       = "987-654-3210",
                Location    = new Geocode(18, 19)
            };

            user.SetAttribute("attr1", "value1");
            await user.SaveAsync();
        }
コード例 #18
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 (model.Password != model.VerifyPassword)
            {
                ModelState.AddModelError("", "Passwords don't match!");
            }

            if (!ModelState.IsValid)
            {
                return(View("Register", model));
            }

            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 _context.Users.CountAsync() == 1)
            {
                await _userManager.AddClaimAsync(apuser, new Claim("admin", "true"));

                await _context.SaveChangesAsync();
            }

            await _signInManager.SignInAsync(apuser, false);

            return(RedirectToActionPermanent("Index", "Settings"));
        }
コード例 #19
0
        private APUser GetLocalUser()
        {
            var userJson = this.LocalStorage.GetValue(NamingConvention.LocalUserKey());

            if (string.IsNullOrWhiteSpace(userJson) == true)
            {
                return(null);
            }
            APUser user = null;

            if (this.Serializer.TryDeserialize(userJson, out user) == true)
            {
                return(user);
            }
            else
            {
                return(null);
            }
        }
コード例 #20
0
        public async Task CreateUserAsyncTest()
        {
            var user = new APUser()
            {
                Username = "******" + Unique.String,                  // ensure unique user name
                Email = "john.doe@" + Unique.String + ".com",           // unique but useless email address
                Password = "******",
                DateOfBirth = DateTime.Today.AddYears(-25),
                FirstName = "John",
                LastName = "Doe",
                Phone = "987-654-3210",
                Location = new Geocode(18, 19)
            };

            

            // Create user
            var request = new CreateUserRequest() { User = user };
            var response = await request.ExecuteAsync();
            ApiHelper.EnsureValidResponse(response);
            Assert.IsNotNull(response.User, "User in response is null.");
            Assert.IsTrue(string.IsNullOrWhiteSpace(response.User.Id) == false);
            Console.WriteLine("Created user with id {0}.", response.User.Id);
        }
コード例 #21
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"));
            }
        }
コード例 #22
0
        public async Task <IActionResult> DoBadgeToken([FromBody] BadgeTokenModel model)
        {
            var user = await _userManager.FindByNameAsync(model.Username);

            if (user == null)
            {
                user = new APUser {
                    UserName = model.Username, Email = model.Username + "@badge.local"
                };
                await _userManager.CreateAsync(user, model.Password);

                var uobj = model.Username;
                var name = model.Username;

                var obj = new ASObject();
                obj["type"].Add(new ASTerm("Person"));
                obj["preferredUsername"].Add(new ASTerm(name));
                obj["name"].Add(new ASTerm(name));

                var id = await _entityData.UriFor(_entityStore, obj);

                obj["id"].Add(new ASTerm(id));

                var inbox = await _newCollection("inbox", id);

                var outbox = await _newCollection("outbox", id);

                var following = await _newCollection("following", id);

                var followers = await _newCollection("followers", id);

                var likes = await _newCollection("likes", id);

                var blocks = await _newCollection("blocks", id);

                var blocked = await _newCollection("blocked", id);

                var blocksData = blocks.Data;
                blocksData["_blocked"].Add(new ASTerm(blocked.Id));
                blocks.Data = blocksData;

                obj["following"].Add(new ASTerm(following.Id));
                obj["followers"].Add(new ASTerm(followers.Id));
                obj["blocks"].Add(new ASTerm(blocks.Id));
                obj["likes"].Add(new ASTerm(likes.Id));
                obj["inbox"].Add(new ASTerm(inbox.Id));
                obj["outbox"].Add(new ASTerm(outbox.Id));

                var userEntity = await _entityStore.StoreEntity(APEntity.From(obj, true));

                await _entityStore.CommitChanges();

                _context.UserActorPermissions.Add(new UserActorPermission {
                    UserId = user.Id, ActorId = userEntity.Id, IsAdmin = true
                });
                await _context.SaveChangesAsync();
            }
            var u = await _signInManager.PasswordSignInAsync(model.Username, model.Password, false, false);

            if (!u.Succeeded)
            {
                return(Unauthorized());
            }

            var firstActor = await _context.UserActorPermissions.FirstOrDefaultAsync(a => a.User == user);

            var claims = new Claim[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, user.Id),
                new Claim(JwtTokenSettings.ActorClaim, firstActor.ActorId)
            };

            var jwt = new JwtSecurityToken(
                issuer: _tokenSettings.Issuer,
                audience: _tokenSettings.Audience,
                claims: claims,
                notBefore: DateTime.UtcNow,
                expires: DateTime.UtcNow.Add(TimeSpan.FromDays(7)),
                signingCredentials: _tokenSettings.Credentials
                );

            var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);

            return(Json(new BadgeTokenResponse {
                Actor = firstActor.ActorId, Token = encodedJwt
            }));
        }
コード例 #23
0
 public UserExtension(APUser user)
 {
     this.User = user;
 }
コード例 #24
0
 public void SetUser(APUser user)
 {
     _user = user;
 }
コード例 #25
0
        internal static void ReadJson(APUser user, JObject json)
        {
            /*
            "__groups": [
			{
				"groupid": "12345",
				"name": "group name"
			}
            */
            JToken value;
            if (json.TryGetValue("__groups", out value) == false) return;
            if (value.Type != JTokenType.Array) return;
            foreach (JObject groupJson in value.Values<JObject>()) 
            {
                var groupInfo = ParseGroupInfo(groupJson);
                if (groupInfo != null)
                    user.Groups.Add(groupInfo);
            }

        }
コード例 #26
0
 public void SetUser(APUser user)
 {
     _user = user;
 }
コード例 #27
0
 public async Task CreateUserAsyncTest()
 {
     var user = new APUser()
     {
         Username = "******" + Unique.String,                  // ensure unique user name
         Email = "john.doe@" + Unique.String + ".com",           // unique but useless email address
         Password = "******",
         DateOfBirth = DateTime.Today.AddYears(-25),
         FirstName = "John",
         LastName = "Doe",
         Phone = "987-654-3210",
         Location = new Geocode(18, 19)
     };
     user.SetAttribute("attr1", "value1");
     await user.SaveAsync();
 }