Exemplo n.º 1
0
        public async Task <TaskResult <PlanetInvite> > CreateInvite(ulong Planet_Id, ulong userid, string token, int hours)
        {
            AuthToken authToken = await Context.AuthTokens.FindAsync(token);

            // Return the same if the token is for the wrong user to prevent someone
            // from knowing if they cracked another user's token. This is basically
            // impossible to happen by chance but better safe than sorry in the case that
            // the literal impossible odds occur, more likely someone gets a stolen token
            // but is not aware of the owner but I'll shut up now - Spike
            if (authToken == null || authToken.User_Id != userid)
            {
                return(new TaskResult <PlanetInvite>(false, "Failed to authorize user.", null));
            }

            ServerPlanet planet = await ServerPlanet.FindAsync(Planet_Id, Mapper);

            if (!(await planet.AuthorizedAsync(authToken, PlanetPermissions.Invite)))
            {
                return(new TaskResult <PlanetInvite>(false, "You are not authorized to do this.", null));
            }

            PlanetInvite invite = new PlanetInvite()
            {
                Planet_Id = Planet_Id,
                Issuer_Id = userid,
                Time      = DateTime.UtcNow,
                Hours     = hours
            };
            Random random = new Random();

            const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

            string code = new string(Enumerable.Repeat(chars, 8).Select(s => s[random.Next(s.Length)]).ToArray());

            PlanetInvite test = await Context.PlanetInvites.FirstOrDefaultAsync(x => x.Code == code);

            while (test != null)
            {
                code = new string(Enumerable.Repeat(chars, 8).Select(s => s[random.Next(s.Length)]).ToArray());
                test = await Context.PlanetInvites.Where(x => x.Code == code).FirstOrDefaultAsync();
            }

            invite.Code = code;

            if (hours == 0)
            {
                invite.Hours = null;
            }

            await Context.PlanetInvites.AddAsync(invite);

            await Context.SaveChangesAsync();

            return(new TaskResult <PlanetInvite>(true, $"Successfully created invite", invite));
        }
Exemplo n.º 2
0
        public async Task <TaskResult> Join(string code, ulong userid, string token)
        {
            AuthToken authToken = await Context.AuthTokens.FindAsync(token);

            // Return the same if the token is for the wrong user to prevent someone
            // from knowing if they cracked another user's token. This is basically
            // impossible to happen by chance but better safe than sorry in the case that
            // the literal impossible odds occur, more likely someone gets a stolen token
            // but is not aware of the owner but I'll shut up now - Spike
            if (authToken == null || authToken.User_Id != userid)
            {
                return(new TaskResult(false, $"Incorrect token!"));
            }

            PlanetInvite invite = await Context.PlanetInvites.FindAsync(code);

            if (invite == null)
            {
                return(new TaskResult(false, $"Code is not found!"));
            }

            PlanetBan ban = await Context.PlanetBans.FirstOrDefaultAsync(x => x.User_Id == userid && x.Planet_Id == invite.Planet_Id);

            if (ban != null)
            {
                return(new TaskResult(false, $"User is banned from this planet!"));
            }

            PlanetMember mem = await Context.PlanetMembers.FirstOrDefaultAsync(x => x.User_Id == userid && x.Planet_Id == invite.Planet_Id);

            if (mem != null)
            {
                return(new TaskResult(false, $"User is already in this planet!"));
            }

            Planet planet = await Context.Planets.FirstOrDefaultAsync(x => x.Id == invite.Planet_Id);

            if (!planet.Public)
            {
                return(new TaskResult(false, $"Planet is set to private!"));
            }

            PlanetMember member = new PlanetMember()
            {
                User_Id   = userid,
                Planet_Id = invite.Planet_Id,
            };

            await Context.PlanetMembers.AddAsync(member);

            await Context.SaveChangesAsync();

            return(new TaskResult(true, $"Joined Planet"));
        }
Exemplo n.º 3
0
        public async Task <TaskResult <PlanetInvite> > CreateInvite(ulong Planet_Id, string token, int hours)
        {
            AuthToken authToken = await Context.AuthTokens.FindAsync(token);

            if (authToken == null)
            {
                return(new TaskResult <PlanetInvite>(false, "Failed to authorize user.", null));
            }

            ServerPlanet planet = await ServerPlanet.FindAsync(Planet_Id);

            if (!(await planet.AuthorizedAsync(authToken, PlanetPermissions.Invite)))
            {
                return(new TaskResult <PlanetInvite>(false, "You are not authorized to do this.", null));
            }

            PlanetInvite invite = new PlanetInvite()
            {
                Id        = IdManager.Generate(),
                Planet_Id = Planet_Id,
                Issuer_Id = authToken.User_Id,
                Time      = DateTime.UtcNow,
                Hours     = hours
            };

            Random random = new Random();

            const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

            string code = new string(Enumerable.Repeat(chars, 8).Select(s => s[random.Next(s.Length)]).ToArray());

            PlanetInvite test = await Context.PlanetInvites.FirstOrDefaultAsync(x => x.Code == code);

            while (test != null)
            {
                code = new string(Enumerable.Repeat(chars, 8).Select(s => s[random.Next(s.Length)]).ToArray());
                test = await Context.PlanetInvites.Where(x => x.Code == code).FirstOrDefaultAsync();
            }

            invite.Code = code;

            if (hours == 0)
            {
                invite.Hours = null;
            }

            await Context.PlanetInvites.AddAsync(invite);

            await Context.SaveChangesAsync();

            return(new TaskResult <PlanetInvite>(true, $"Successfully created invite", invite));
        }
Exemplo n.º 4
0
        /// <summary>
        /// Returns the planet name using an invite code as authorization
        /// </summary>
        public async Task <TaskResult <string> > GetPlanetName(string invite_code)
        {
            PlanetInvite invite = await Context.PlanetInvites.FirstOrDefaultAsync(x => x.Code == invite_code);

            if (invite == null)
            {
                return(new TaskResult <string>(false, "Could not find invite.", null));
            }

            ServerPlanet planet = await Context.Planets.FindAsync(invite.Planet_Id);

            if (planet == null)
            {
                return(new TaskResult <string>(false, $"Could not find planet {invite.Planet_Id}", null));
            }

            return(new TaskResult <string>(true, $"Success", planet.Name));
        }
Exemplo n.º 5
0
        public async Task <TaskResult <ClientPlanetInvite> > GetInvite(string code, ulong userid)
        {
            PlanetInvite invite = await Context.PlanetInvites.FirstOrDefaultAsync(x => x.Code == code);


            if (invite.IsPermanent() == false)
            {
                if (DateTime.UtcNow > invite.Time.AddMinutes((double)invite.Hours))
                {
                    Context.PlanetInvites.Remove(invite);

                    await Context.SaveChangesAsync();

                    return(new TaskResult <ClientPlanetInvite>(false, $"Invite is expired", null));
                }
            }

            PlanetBan ban = await Context.PlanetBans.FirstOrDefaultAsync(x => x.User_Id == userid && x.Planet_Id == invite.Planet_Id);

            if (ban != null)
            {
                return(new TaskResult <ClientPlanetInvite>(false, $"User is banned from this planet!", null));
            }

            PlanetMember member = await Context.PlanetMembers.FirstOrDefaultAsync(x => x.User_Id == userid && x.Planet_Id == invite.Planet_Id);

            if (member != null)
            {
                return(new TaskResult <ClientPlanetInvite>(false, $"User is already in this planet!", null));
            }

            ClientPlanetInvite clientinvite = ClientPlanetInvite.FromBase(invite, Mapper);

            Planet planet = await Context.Planets.FirstOrDefaultAsync(x => x.Id == invite.Planet_Id);

            if (!planet.Public)
            {
                return(new TaskResult <ClientPlanetInvite>(false, $"Planet is set to private!", null));
            }

            clientinvite.PlanetName = planet.Name;

            return(new TaskResult <ClientPlanetInvite>(true, $"Successfully got invite", clientinvite));
        }
Exemplo n.º 6
0
        public async Task <TaskResult> Join(string code, string token)
        {
            AuthToken authToken = await Context.AuthTokens.FindAsync(token);

            if (authToken == null)
            {
                return(new TaskResult(false, $"Unable to authorize"));
            }

            ulong user_id = authToken.User_Id;

            PlanetInvite invite = await Context.PlanetInvites.FirstOrDefaultAsync(x => x.Code == code);

            if (invite == null)
            {
                return(new TaskResult(false, $"Invite code not found!"));
            }

            if (await Context.PlanetBans.AnyAsync(x => x.User_Id == user_id && x.Planet_Id == invite.Planet_Id))
            {
                return(new TaskResult(false, $"User is banned from this planet!"));
            }

            if (await Context.PlanetMembers.AnyAsync(x => x.User_Id == user_id && x.Planet_Id == invite.Planet_Id))
            {
                return(new TaskResult(false, $"User is already in this planet!"));
            }

            ServerPlanet planet = await ServerPlanet.FindAsync(invite.Planet_Id);

            if (!planet.Public)
            {
                return(new TaskResult(false, $"Planet is set to private!"));
            }

            User user = await Context.Users.FindAsync(user_id);

            await planet.AddMemberAsync(user, Context);

            return(new TaskResult(true, $"Successfully joined planet."));
        }
Exemplo n.º 7
0
        public async Task <LocalRedirectResult> Join(string code, ulong userid, string token)
        {
            AuthToken authToken = await Context.AuthTokens.FindAsync(token);

            // Return the same if the token is for the wrong user to prevent someone
            // from knowing if they cracked another user's token. This is basically
            // impossible to happen by chance but better safe than sorry in the case that
            // the literal impossible odds occur, more likely someone gets a stolen token
            // but is not aware of the owner but I'll shut up now - Spike
            if (authToken == null || authToken.User_Id != userid)
            {
                return(new LocalRedirectResult("/"));
            }

            PlanetInvite invite = await Context.PlanetInvites.Where(x => x.Code == code).FirstOrDefaultAsync();

            if (invite == null)
            {
                return(new LocalRedirectResult("/"));
            }

            PlanetMember mem = await Context.PlanetMembers.Where(x => x.User_Id == userid && x.Planet_Id == invite.Planet_Id).FirstOrDefaultAsync();

            if (mem != null)
            {
                return(new LocalRedirectResult("/"));
            }

            PlanetMember member = new PlanetMember()
            {
                User_Id   = userid,
                Planet_Id = invite.Planet_Id,
            };

            await Context.PlanetMembers.AddAsync(member);

            await Context.SaveChangesAsync();

            return(new LocalRedirectResult("/"));
        }
Exemplo n.º 8
0
        public async Task <TaskResult <ClientPlanetInvite> > GetInvite(string code)
        {
            PlanetInvite invite = await Context.PlanetInvites.Where(x => x.Code == code).FirstOrDefaultAsync();

            if (invite.IsPermanent() == false)
            {
                if (DateTime.UtcNow > invite.Time.AddMinutes((double)invite.Hours))
                {
                    Context.PlanetInvites.Remove(invite);

                    await Context.SaveChangesAsync();

                    return(new TaskResult <ClientPlanetInvite>(false, $"Invite is expired", null));
                }
            }

            ClientPlanetInvite clientinvite = ClientPlanetInvite.FromBase(invite, Mapper);

            Planet planet = await Context.Planets.Where(x => x.Id == invite.Planet_Id).FirstOrDefaultAsync();

            clientinvite.PlanetName = planet.Name;

            return(new TaskResult <ClientPlanetInvite>(true, $"Successfully got invite", clientinvite));
        }