コード例 #1
0
        public async override Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context)
        {
            var formData = await context.Request.ReadFormAsync();

            if (!formData.Any())
            {
                context.Response.RenderEmbeddedResource("WispCloud.Templates.Files.OAuth2AuthorizationForm.html");
                context.RequestCompleted();
                return;
            }

            var login    = formData["login"];
            var password = formData["password"];

            var user = context.GetWispContext().Data.Accounts.FirstOrDefault(x => x.Login == login && x.Active);

            Try.Condition(user != null && user.ComparePasword(password), "The user name or password is incorrect;");

            var authentication = context.OwinContext.Authentication;

            authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
            authentication.SignIn(GetBearerIdentity(user));

            context.RequestCompleted();
            return;
        }
コード例 #2
0
        public Account CheckForAccessOverSlave(Account slaveAccount, AccountAccessRoles role)
        {
            //Admin can do anything
            if (UserContext.CurrentUser.Role == AccountRole.Admin)
            {
                return(slaveAccount);
            }

            //Master can read anything
            if (UserContext.CurrentUser.Role == AccountRole.Master && role == AccountAccessRoles.Read)
            {
                return(slaveAccount);
            }

            //You have all access rights for yourself
            if (UserContext.CurrentUser.Login == slaveAccount.Login)
            {
                return(slaveAccount);
            }

            var accessLevel = GetCurrentAccountAccess(slaveAccount.Login);

            Try.Condition(accessLevel != null && accessLevel.Role >= role, NotEnoughPrivilegeText);
            return(slaveAccount);
        }
コード例 #3
0
        public DateTime LastCycleDate()
        {
            Try.Condition(Constants.ContainsKey("LastCycle"), $"Не найдено значение константы LastCycle");
            var secValue = Constants["LastCycle"].Value;

            return(new DateTime(2017, 1, 1, 3, 0, 0).AddSeconds(secValue));
        }
コード例 #4
0
        public Loyalty NewLoyalty(Loyalty data)
        {
            _rightsManager.CheckRole(AccountRole.Admin);

            var loyalAcc = UserContext.Accounts.GetOrFail(data.LoyalName);//_userManager.FindById(data.LoyalName);

            Try.Condition(loyalAcc.Role.IsCompany(), $"{loyalAcc.Login} не является компанией");

            var check = UserContext.Data.Loyalties.Where(x =>
                                                         x.LoyalName == loyalAcc.Login && x.Insurance == data.Insurance);

            Try.Condition(!check.Any(), $"Компания уже обслуживает данную страховку");
            Try.Condition(data.MinLevel < 4 && data.MinLevel > 0, $"Значения MinLevel разрешены в диапазоне [1:3]");

            var loyalty = new Loyalty(loyalAcc, data.Insurance);

            loyalty.MinLevel = data.MinLevel;

            UserContext.Data.Loyalties.Add(loyalty);
            UserContext.Data.SaveChanges();

            var issuerAcc = GetIssuerFromType(data.Insurance);

            UserContext.AddGameEvent(issuerAcc.Login, GameEventType.Insurance,
                                     $"Вашу страховку теперь обслуживает {loyalAcc.DisplayName}", true);

            UserContext.AddGameEvent(loyalAcc.Login, GameEventType.Insurance,
                                     $"Вы начали обслуживать страховку {loyalty.Insurance}", true);

            return(loyalty);
        }
コード例 #5
0
        public Account Registration(RegistrationClientData clientData)
        {
            _rightsManager.CheckRole(AccountRole.Admin);
            var existing = Get(clientData.Login);

            if (clientData.Status != AccountStatus.Blocked)
            {
                clientData.Status = AccountStatus.Active;
            }

            if (existing != null)
            {
                return(SetAccountProperties(clientData));
            }

            var newUser = new Account(clientData.Login, AccountRole.Person);

            var result = _userManager.Create(newUser, clientData.Password);

            Try.Condition(result.Succeeded, $"Не удалось создать счет {clientData.Login}, {result.Errors.FirstOrDefault()}");
            UserContext.Data.SaveChanges();

            UserContext.AddGameEvent(clientData.Login, GameEventType.None, $"Аккаунт создан");
            return(SetAccountProperties(clientData));
        }
コード例 #6
0
        public void CheckRoleInInstallation(long installationID, InInstallationRoles role)
        {
            CheckUser();
            CheckInstallationExistsAndActive(installationID);
            var installationAcces = GetInstallationAcces(installationID);

            Try.Condition(installationAcces != null && (role & installationAcces.Role) > 0, NotEnoughRightsMessageText);
        }
コード例 #7
0
        public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
        {
            Uri uri;

            Try.Condition(Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out uri), "Bad redirect uri;");
            context.Validated();
            return(Task.FromResult(0));
        }
コード例 #8
0
 public override void Validate()
 {
     Try.NotEmpty(Seller, $"Поле {nameof(Seller)} не должно быть пустым");
     Try.NotEmpty(Receiver, $"Поле {nameof(Receiver)} не должно быть пустым");
     Try.NotEmpty(ReceiverPass, $"Поле {nameof(ReceiverPass)} не должно быть пустым");
     Try.Condition(Price >= 0, $"Сумма покупки должна быть неотрицательной");
     Try.Condition(Index >= 0, $"Сумма покупки должна быть неотрицательной");
 }
コード例 #9
0
        //public UserSettings Settings { get; set; }

        public override void Validate()
        {
            Try.NotEmpty(Login, "Пустое поле Login");
            //Try.NotEmpty(Password, "Пустое поле Password");

            Try.Condition(Cash == null || Cash >= 0, "Поле Cash должно быть неотрицательным");
            Try.Condition(SalaryLevel == null || SalaryLevel >= 0, "Поле SalaryLevel должно быть неотрицательным");
            Try.Condition(SalaryLevel == null || SalaryLevel <= 3, "Поле SalaryLevel должно быть в диапазоне 0 -3");
            Try.Condition(InsuranceLevel == null || InsuranceLevel >= 0, "Поле InsuranceLevel должно быть неотрицательным");
        }
コード例 #10
0
        public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            Try.Condition(!string.IsNullOrEmpty(context.UserName) && !string.IsNullOrEmpty(context.Password), "The user name or password is incorrect;");

            var user = context.GetWispContext().Data.Accounts.FirstOrDefault(x => x.Login == context.UserName && x.Active);

            Try.Condition(user != null && user.ComparePasword(context.Password), "The user name or password is incorrect;");

            context.Validated(GetBearerIdentity(user));

            return(Task.FromResult(0));
        }
コード例 #11
0
        public void DeleteConstant(string name)
        {
            UserContext.Rights.CheckRole(AccountRole.Admin);

            Try.Condition(Constants.ContainsKey(name), $"Не найдена константа: {name}.");
            Constants.Remove(name);

            var c = UserContext.Data.Constants.First(x => x.Name == name);

            UserContext.Data.Constants.Remove(c);
            UserContext.Data.SaveChanges();
        }
コード例 #12
0
        public void RemoveInsuranceHolder(string user)
        {
            var userAccount = UserContext.Accounts.GetOrFail(user);

            Try.Condition(userAccount.Insurance != InsuranceType.None, $"У пользователя {user} нет страховки");

            var corpAccount = GetIssuerFromType(userAccount.Insurance);

            _rightsManager.CheckForAccessOverSlave(corpAccount, AccountAccessRoles.Withdraw);

            RemoveInsuranceHolder_Checked(userAccount, corpAccount);
        }
コード例 #13
0
        public void Implant(ImplantClientData data)
        {
            var receiverAcc = UserContext.Accounts.GetOrFail(data.Receiver, data.ReceiverPass);
            var sellerAcc   = UserContext.Accounts.GetOrFail(data.Seller);
            var parentAcc   = UserContext.Accounts.Get(sellerAcc.ParentID) ?? sellerAcc;

            _rightsManager.CheckForAccessOverSlave(sellerAcc, AccountAccessRoles.Withdraw);
            Try.Condition(parentAcc.Role.IsCompany(), $"Продавать импланты может только компания");
            Try.Condition(receiverAcc.Role == AccountRole.Person, $"Получать импланты может только персона");

            int indexCost = data.Index;

            if (receiverAcc.Insurance == InsuranceType.SuperVip ||
                parentAcc == UserContext.Insurances.GetIssuerFromType(receiverAcc.Insurance))
            {
                var discount = UserContext.Constants.GetDiscount(receiverAcc.EffectiveLevel);
                indexCost = (int)Math.Ceiling(indexCost * (1 - discount));
            }

            Try.Condition(parentAcc.Index >= indexCost, $"Недостаточно индекса");

            data.Description = ParseImplantDescription(data.Description, indexCost > 0);

            var tdata = new TransferClientData(receiverAcc.Login, sellerAcc.Login, data.Price)
            {
                Description = data.Description
            };

            var trList = P2BTransfer(receiverAcc, sellerAcc, tdata);

            using (var dbTransact = UserContext.Data.Database.BeginTransaction())
            {
                UserContext.Data.BeginFastSave();
                trList.ForEach(TransactiontoDb);
                parentAcc.Index -= indexCost;
                dbTransact.Commit();
            }

            if (indexCost > 0)
            {
                if (parentAcc != sellerAcc)
                {
                    UserContext.AddGameEvent(parentAcc.Login, GameEventType.Index,
                                             $"Имплант за {indexCost} индекса установлен магазином {sellerAcc.Fullname}", true);
                }

                UserContext.AddGameEvent(sellerAcc.Login, GameEventType.Index,
                                         $"Имплант за {indexCost} индекса установлен {receiverAcc.Fullname}", true);

                UserContext.AddGameEvent(receiverAcc.Login, GameEventType.Index,
                                         $"Получен имплант от {sellerAcc.Fullname}", true);
            }
        }
コード例 #14
0
        //Транзакции между юолицами и прочие, особых правил нет
        private List <Transaction> B2BTransfer(Account sender, Account receiver, TransferClientData data)
        {
            Try.Condition(sender.Cash >= data.Amount, $"Недостаточно средств");
            var transaction = new Transaction(sender, receiver, data.Amount);

            transaction.Comment = data.Description;
            var ret = new List <Transaction> {
                transaction
            };

            return(ret);
        }
コード例 #15
0
        private void SetInsuranceHolder_Checked(Account userAccount, int level, InsuranceType t, bool isStolen = false)
        {
            Try.Condition((userAccount.Role & AccountRole.Person) > 0,
                          $"Только персоны могут быть держателями страховки");

            var oldIssuer = GetIssuerFromType(userAccount.Insurance);
            var newIssuer = GetIssuerFromType(t);

            if (!isStolen)
            {
                var price    = (int)UserContext.Constants.GetInsuranceCost(t, level);
                var priceOld = (int)UserContext.Constants.GetInsuranceCost(t, userAccount.InsuranceLevel);
                if (userAccount.Insurance == t)
                {
                    price = Math.Max(0, price - priceOld);
                }

                Try.Condition(newIssuer.InsurancePoints >= price, $"Не хватает очков страховки");
                newIssuer.InsurancePoints -= price;
                UserContext.Accounts.Update(newIssuer);

                var txtverb = userAccount.Insurance == t ? "изменение" : "выдачу";
                UserContext.AddGameEvent(newIssuer.Login, GameEventType.Index,
                                         $"Потрачено {price} очков на {txtverb} страховки {userAccount.DisplayName}", true);
            }

            //Отменить старую страховку, если была
            if (oldIssuer != null && userAccount.Insurance != t)
            {
                UserContext.AddGameEvent(oldIssuer.Login, GameEventType.Insurance,
                                         $"{userAccount.DisplayName} отказался от вашей страховки", true);

                UserContext.AddGameEvent(userAccount.Login, GameEventType.Insurance,
                                         $"Вы отказались от страховки {t}", true);
            }

            userAccount.Insurance      = t;
            userAccount.InsuranceLevel = level;
            UserContext.Accounts.Update(userAccount);

            //if(!isStolen)
            //    UserContext.AddGameEvent(newIssuer.Login, GameEventType.Insurance,
            //        $"Выдана страховка {userAccount.DisplayName}" +
            //        $"уровня {userAccount.InsuranceLevel}");

            UserContext.AddGameEvent(userAccount.Login, GameEventType.Insurance,
                                     $"Выдана страховка {userAccount.Insurance} " +
                                     $"уровня {userAccount.InsuranceLevel}", true);

            UpdateInsuranceInAlice(userAccount);
        }
コード例 #16
0
        public void SetInsuranceHolder(SetInsuranceClientData data)
        {
            var companyAcc = _rightsManager.CheckForAccessOverSlave(data.Company, AccountAccessRoles.Withdraw);

            var userAccount = UserContext.Accounts.GetOrFail(data.Holder, data.Password);

            Try.Condition(_associations.ContainsKey(companyAcc.Login), $"{companyAcc.Login} не выпускает страховки");
            var t = _associations[companyAcc.Login];

            var level = data.Level ?? 0; //t.SetLevel()

            Try.Condition(CheckInsuranceLevel(level, t), $"Неверный уровень страховки {level}");

            SetInsuranceHolder_Checked(userAccount, level, t);
        }
コード例 #17
0
        public List <Transaction> GetHistory(string login, int take, int skip)
        {
            var user = UserContext.Accounts.GetOrFail(login);

            Try.Condition(skip >= 0, $"Поле {nameof(skip)} не должно быть отрицательным");
            Try.Condition(take >= 0, $"Поле {nameof(take)} не должно быть отрицательным");

            _rightsManager.CheckForAccessOverSlave(user, AccountAccessRoles.Read);

            var ret = UserContext.Data.Transactions
                      .Where(x => x.Receiver == user.Login || x.Sender == user.Login)
                      .OrderByDescending(x => x.Time).Skip(skip).Take(take).ToList();

            ret.ForEach(x => { x.HideIfRequired(); });
            return(ret.ToList());
        }
コード例 #18
0
        public Account CutAccountIndex(string login, int index)
        {
            CheckRole(AccountRole.Master);

            var editAccount = UserContext.Accounts.GetOrFail(login);

            Try.Condition(editAccount.Index >= index, "Недостаточно индекса");

            editAccount.Index -= index;
            UserContext.Accounts.Update(editAccount);

            UserContext.AddGameEvent(editAccount.Login, GameEventType.Index,
                                     $"Списано {index} индекса");

            return(editAccount);
        }
コード例 #19
0
        public Constant NewConstant(string text, string name, float value)
        {
            UserContext.Rights.CheckRole(AccountRole.Admin);
            Try.Condition(!Constants.ContainsKey(name), $"Эта константа уже существует: {name}.");
            var c = new Constant
            {
                Description = text,
                Value       = value,
                Name        = name
            };

            Constants.Add(name, c);
            UserContext.Data.Constants.Add(c);
            UserContext.Data.SaveChanges();
            return(c);
        }
コード例 #20
0
        public void StealInsurance(StealInsuranceClientData data)
        {
            _rightsManager.CheckRole(AccountRole.Admin);

            var loserAccount    = UserContext.Accounts.GetOrFail(data.Loser);
            var receiverAccount = UserContext.Accounts.GetOrFail(data.Receiver);

            Try.Condition(receiverAccount.EffectiveLevel <= loserAccount.EffectiveLevel,
                          "Ваша страховка лучше, чем у жертвы");

            Try.Condition(loserAccount.Insurance != InsuranceType.None,
                          $"У пользователя {loserAccount.Login} нет страховки");

            receiverAccount.InsuranceHidden = true;
            SetInsuranceHolder_Checked(receiverAccount, loserAccount.InsuranceLevel, loserAccount.Insurance, true);
            RemoveInsuranceHolder(loserAccount.Login);
        }
コード例 #21
0
        public float Transfer(TransferClientData data)
        {
            var receiverAcc = UserContext.Accounts.GetOrFail(data.Receiver, true); //Разрешен Alias
            var senderAcc   = UserContext.Accounts.GetOrFail(data.Sender);

            Try.Condition(receiverAcc.Login != senderAcc.Login, "Нельзя переводить самому себе");

            _rightsManager.CheckForAccessOverSlave(senderAcc, AccountAccessRoles.Withdraw);
            data.Description = data.Description ?? "";

            var trList = new List <Transaction>();

            //Разные виды налогообложения
            if (receiverAcc.Role == AccountRole.Person && senderAcc.Role == AccountRole.Person)
            {
                trList = P2PTransfer(senderAcc, receiverAcc, data);
            }
            else if (receiverAcc.Role.IsCompany() && senderAcc.Role == AccountRole.Person)
            {
                trList = P2BTransfer(senderAcc, receiverAcc, data);
            }
            else
            {
                trList = B2BTransfer(senderAcc, receiverAcc, data);
            }

            //Анонимные транзакции
            if (data.Receiver.ToLower() == receiverAcc.Alias.ToLower() && receiverAcc.Role == AccountRole.Person)
            {
                trList.ForEach(x => {
                    if (x.ReceiverAccount.Login == receiverAcc.Login)
                    {
                        x.Type |= TransactionType.Anonymous;
                    }
                });
            }

            using (var dbTransact = UserContext.Data.Database.BeginTransaction())
            {
                UserContext.Data.BeginFastSave();
                trList.ForEach(TransactiontoDb);
                dbTransact.Commit();
            }
            return(senderAcc.Cash);
        }
コード例 #22
0
        public Constant EditConstant(ConstantClientData data)
        {
            UserContext.Rights.CheckRole(AccountRole.Admin);

            Try.Condition(Constants.ContainsKey(data.Name), $"Не найдена константа: {data.Name}.");
            var c = Constants[data.Name];

            if (!String.IsNullOrEmpty(data.Description))
            {
                c.Description = data.Description;
            }

            c.Value = data.Value;

            var dbconst = UserContext.Data.Constants.Find(data.Name);

            dbconst.Description = c.Description;
            dbconst.Value       = c.Value;
            UserContext.Data.SaveChanges();
            return(c);
        }
コード例 #23
0
        //Транзакции между физлицами
        //Налог платит отправитель в зависимости от разницы страховок
        private List <Transaction> P2PTransfer(Account sender, Account receiver, TransferClientData data)
        {
            Try.Condition(sender.Cash >= data.Amount, $"Недостаточно средств");
            var ret = new List <Transaction>();
            var tax = GetP2pTax(sender, receiver);

            if (tax > 0)
            {
                var master = UserContext.Accounts.GetOrFail("admin");
                var t      = new Transaction(sender, master, data.Amount * tax);
                t.Comment = $"Налог на транзакции физлиц в размере {tax * 100}%";
                t.Type    = TransactionType.Tax;
                ret.Add(t);
            }
            var transaction = new Transaction(sender, receiver, data.Amount * (1 - tax));

            transaction.Comment = data.Description;

            ret.Add(transaction);
            return(ret);
        }
コード例 #24
0
        void SetGroupProperties(List <Group> allGroups, List <PowerBar> allPowerBars,
                                Group editedGroup, GroupClientData clientData)
        {
            if (clientData.Name != null)
            {
                editedGroup.Name = clientData.Name;
            }
            if (clientData.ShortName != null)
            {
                editedGroup.ShortName = clientData.ShortName;
            }

            if (editedGroup.IsMainGroupInInstallation)
            {
                Try.Condition(!clientData.ParentGroupID.HasValue, $"Cant set {nameof(clientData.ParentGroupID)} for main group;");
                Try.Condition(clientData.GroupIDs == null, $"Cant set {nameof(clientData.GroupIDs)} for main group;");
                Try.Condition(clientData.PowerBarSNs == null, $"Cant set {nameof(clientData.PowerBarSNs)} for main group;");
            }
            else
            {
                if (clientData.ParentGroupID.HasValue)
                {
                    var mainGroup = allGroups.FirstOrDefault(x => x.IsMainGroupInInstallation);
                    Try.NotNull(mainGroup, "Main group not found;", false);

                    editedGroup.ParentGroupID = (clientData.ParentGroupID.Value == 0 || clientData.ParentGroupID.Value == mainGroup.GroupID)
                        ? null : clientData.ParentGroupID;
                }

                if (clientData.GroupIDs != null)
                {
                    SetGroups(allGroups, editedGroup, clientData.GroupIDs);
                }

                if (clientData.PowerBarSNs != null)
                {
                    SetPowerBars(allPowerBars, editedGroup, clientData.PowerBarSNs);
                }
            }
        }
コード例 #25
0
        public List <InsuranceHolderServerData> GetInsuranceHolders(string login)
        {
            var ret = new List <InsuranceHolderServerData>();
            var acc = _rightsManager.CheckForAccessOverSlave(login, AccountAccessRoles.Read);

            Try.Condition(_associations.ContainsKey(acc.Login), $"{acc.Login} не выпускает страховки");

            var t    = _associations[acc.Login];
            var list = UserContext.Data.Accounts.Where(x => x.Insurance == t);

            foreach (var user in list.Where(x => !x.InsuranceHidden))
            {
                var h = new InsuranceHolderServerData(user.Login, acc.Login)
                {
                    InsuranceLevel = user.InsuranceLevel,
                    Insurance      = t,
                    UserFullname   = user.Fullname ?? ""
                };
                ret.Add(h);
            }
            return(ret.OrderBy(x => x.UserFullname).ToList());
        }
コード例 #26
0
        //Транзакции юрлицам, налог платит получатель
        //Работают страховки
        private List <Transaction> P2BTransfer(Account sender, Account receiver, TransferClientData data)
        {
            var ret      = new List <Transaction>();
            var level    = _insuranceManager.CheckInsuranceGrade(sender, receiver);
            var discount = _constantManager.GetDiscount(level);

            Try.Condition(sender.Cash >= data.Amount * (1 - discount), $"Недостаточно средств");

            if (discount == 0)
            {
                var master = UserContext.Accounts.GetOrFail("admin");
                var t      = new Transaction(receiver, master, data.Amount * 0.5f);
                t.Comment = $"Налог на доходные предприятия в размере 50%";
                t.Type    = TransactionType.Tax;
                ret.Add(t);
            }
            var transaction = new Transaction(sender, receiver, data.Amount * (1 - discount));

            transaction.Comment = data.Description + $" номинал {data.Amount} скидка {discount * 100}%";
            ret.Add(transaction);
            return(ret);
        }
コード例 #27
0
        public void ChangePassword(ChangePasswordClientData clientData)
        {
            var account = GetOrFail(clientData.Login);

            IdentityResult result;

            if (account.Login != UserContext.CurrentUser.Login)
            {
                //Only Administrators can change user account password
                _rightsManager.CheckRole(AccountRole.Admin);

                result = _userManager.NewPassword(account.Login, clientData.NewPassword);
            }
            else
            {
                result = _userManager.ChangePassword(account.Login, clientData.CurrentPassword,
                                                     clientData.NewPassword);
            }

            Try.Condition(result.Succeeded, $"Ошибка обновления персонажа: {result.Errors.FirstOrDefault()}");

            UserContext.AddGameEvent(account.Login, GameEventType.None, $"Изменен пароль");
        }
コード例 #28
0
        public void Update(Account account)
        {
            var result = _userManager.Update(account);

            Try.Condition(result.Succeeded, $"Ошибка обновления персонажа: {result.Errors.FirstOrDefault()}");
        }
コード例 #29
0
 string GetLogin(HubCallerContext context)
 {
     Try.Condition(context.User.Identity.IsAuthenticated, HttpStatusCode.Unauthorized);
     return(context.User.Identity.Name);
 }
コード例 #30
0
 public override void Validate()
 {
     Try.NotEmpty(Sender, $"Поле {nameof(Sender)} не должно быть пустым");
     Try.NotEmpty(Receiver, $"Поле {nameof(Receiver)} не должно быть пустым");
     Try.Condition(Amount >= 1, $"Сумма транзакции должна быть не менее 1 кр");
 }