示例#1
0
        public HUAuthenticationModule(IHUServerContext serverContext) : base("/a")
        {
            ServerContext = serverContext;

            Post("/register", async args =>
            {
                try
                {
                    var registration = this.Bind <RegistrationRequest>();

                    // Validate registration
                    if (registration.FullName == null)
                    {
                        return(new TextResponse("Invalid name")
                               .WithStatusCode(HttpStatusCode.BadRequest));
                    }
                    if (registration.GHAuthToken == null)
                    {
                        return(new TextResponse("Invalid auth token")
                               .WithStatusCode(HttpStatusCode.BadRequest));
                    }
                    // email:
                    if (!Regex.IsMatch(registration.HangoutsEmail, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase))
                    {
                        return(new TextResponse("Invalid email")
                               .WithStatusCode(HttpStatusCode.BadRequest));
                    }
                    // test the auth token to make sure it works
                    try
                    {
                        var ghClient         = new GitHubClient(new ProductHeaderValue(nameof(HUAuthenticationModule)));
                        ghClient.Credentials = new Credentials(registration.GHAuthToken);
                        var ghUser           = await ghClient.User.Current();
                        var um             = new UserManagerService(ServerContext);
                        var registeredUser = await um.RegisterUserAsync(registration, ghUser.Login);
                        if (registeredUser != null)
                        {
                            return(Response.AsJsonNet(registeredUser));
                        }
                    }
                    catch
                    {
                        return(HttpStatusCode.BadRequest);
                    }
                    return(HttpStatusCode.Unauthorized);
                }
                catch
                {
                    return(HttpStatusCode.BadRequest);
                }
            });
        }
示例#2
0
 public UserApiLoginValidator(IHUServerContext serverContext)
 {
     ServerContext = serverContext;
     UserManager   = new UserManagerService(ServerContext);
 }
示例#3
0
        public KonnectModule(IHUServerContext serverContext) : base("/a/k")
        {
            ServerContext = serverContext;

            this.RequiresClaims(x => x.Value == UserApiLoginValidator.StatelessAuthClaim.Value);
            RegisteredUser user   = null;
            string         apiKey = null;

            Before += (ctx) =>
            {
                apiKey = (string)Context?.Request.Query.apikey;
                if (apiKey != null)
                {
                    UserManager = new UserManagerService(ServerContext);
                    user        = UserManager.FindUserByApiKey(apiKey);
                }
                return(null);
            };

            Post("/ping", args =>
            {
                try
                {
                    var pingReq  = this.Bind <PingRequest>();
                    var connUser = ServerContext.ConnectedUsers.Find(x => x.DbUser.ApiKey == apiKey);
                    var loc      = new GeoCoordinate(pingReq.Latitude, pingReq.Longitude);
                    if (connUser == null)
                    {
                        connUser = new ConnectedUser(user);
                        connUser.Ping(loc);
                        ServerContext.ConnectedUsers.Add(connUser);
                    }
                    else
                    {
                        connUser.Ping(loc);
                    }
                    return(HttpStatusCode.OK);
                }
                catch
                {
                    return(HttpStatusCode.BadRequest);
                }
            });

            Post("/nearby/{dist}", args =>
            {
                try
                {
                    double distanceRange = (double)args.dist;
                    // get current user
                    var connUser = ServerContext.ConnectedUsers.Find(x => x.DbUser.ApiKey == apiKey);
                    if (connUser == null)
                    {
                        return(HttpStatusCode.BadRequest);
                    }
                    // var nearbyUsers = ServerContext.ConnectedUsers.FindAll(x => x != connUser && x.LastLocation != null && connUser.LastLocation.GetDistanceTo(x.LastLocation) < distanceRange);
                    var nearbyUsers = new List <ConnectedUser>();
                    foreach (var u in ServerContext.ConnectedUsers)
                    {
                        if (u != connUser && u.LastLocation != null)
                        {
                            var uDist = connUser.LastLocation.GetDistanceTo(u.LastLocation);
                            if (uDist < distanceRange)
                            {
                                nearbyUsers.Add(u);
                            }
                        }
                    }
                    return(Response.AsJsonNet(nearbyUsers.Select(x => new NearbyUser
                    {
                        Distance = connUser.LastLocation.GetDistanceTo(x.LastLocation),
                        UserId = x.DbUser.PublicUserId,
                        Name = x.DbUser.FullName
                    })));
                }
                catch
                {
                    return(HttpStatusCode.BadRequest);
                }
            });

            Post("/profile/{publicId}", async args =>
            {
                try
                {
                    var publicId = (string)args.publicId;
                    if (publicId == null)
                    {
                        return(HttpStatusCode.BadRequest);
                    }
                    var selectedUser = UserManager.FindUserByPublicId(publicId);
                    if (selectedUser == null)
                    {
                        return(HttpStatusCode.NotFound);
                    }
                    var ghClient   = new GitHubClient(new ProductHeaderValue(nameof(HUAuthenticationModule)));
                    var githubUser = await ghClient.User.Get(selectedUser.GitHubUsername);

                    var profile = new UserProfile
                    {
                        RepoCount      = githubUser.PublicRepos,
                        FullName       = selectedUser.FullName,
                        HangoutsEmail  = selectedUser.HangoutsEmail,
                        GitHubUsername = selectedUser.GitHubUsername,
                        GitHubBio      = githubUser.Bio,
                        Company        = githubUser.Company,
                        HomeLocation   = githubUser.Location
                    };
                    return(Response.AsJsonNet(profile));
                }
                catch
                {
                    return(HttpStatusCode.BadRequest);
                }
            });
        }
示例#4
0
 public HUEventLoop(IHUServerContext serverContext)
 {
     ServerContext = serverContext;
     var t = RunAsync();
 }
示例#5
0
 public UserManagerService(IHUServerContext serverContext)
 {
     ServerContext = serverContext;
     UserStore     = ServerContext.Database.GetCollection <RegisteredUser>(UserStoreDataKey);
 }