Example #1
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /* {
             *      "execFun": "GetDialogs",
             *      "data": {
             *          "msgCount": "2"
             *      }
             *  }
             */
            #endregion

            OutputSocketMessage          output = new OutputSocketMessage("getMsg", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();

            GetDialogsInfo info = DeserializeObject.ParseJSON <GetDialogsInfo>(val, output, out rez);
            if (info == null)
            {
                return(rez);
            }

            using (var db = new RaidaContext())
            {
                Members owner = db.Members.First(it => it.login.Equals(myLogin));

                // ReSharper disable once SuggestVarOrType_Elsewhere
                List <OutGetMsgInfo> list = new List <OutGetMsgInfo>();
                //I'am consist in this dialogs
                List <MemberInGroup> mg = db.MemberInGroup.Include(g => g.group)
                                          .ThenInclude(s => s.Shares).ThenInclude(own => own.owner)
                                          .Where(it => it.member.login.Equals(myLogin))
                                          .ToList();

                mg.ForEach(it => {
                    string groupName = it.group.group_name_part;
                    if (it.group.one_to_one)
                    {
                        groupName = db.MemberInGroup.Include(m => m.member).FirstOrDefault(mig => mig.group == it.group && mig.member != owner)?.member.nick_name;
                    }
                    OutGetMsgInfo group = new OutGetMsgInfo(it.group.group_id, groupName, it.group.one_to_one, it.group.privated);
                    //Add all message in dialog
                    it.group.Shares.OrderBy(s => s.sending_date)
                    .Take(info.msgCount)
                    .ToList()
                    .ForEach(msg => group.messages.Add(new OneMessageInfo(msg.id, Encoding.Unicode.GetString(msg.file_data), msg.current_fragment, msg.total_fragment, msg.sending_date, msg.owner.nick_name, msg.owner.login)));

                    //Add users where consist in dialog
                    db.MemberInGroup.Include(m => m.member).Where(mig => mig.groupId.Equals(it.groupId))
                    .ForEachAsync(memb => group.members.Add(memb.member.login));

                    list.Add(group);
                });

                output.data = list;
            }

            rez.msgForOwner = output;
            return(rez);
        }
Example #2
0
        private void TimerTickCleanup()
        {
            long dateNow = CurrentTime;

            using (var db = new RaidaContext())
            {
                //Cleanup 'death_date' message
                db.Shares.Where(it => it.death_date <= dateNow)
                .ToList()
                .ForEach(delegate(Shares s)
                {
                    db.Shares.Remove(s);
                }
                         );

                //Cleanup blocked transactions
                db.Transactions.Where(it => it.rollbackTime <= dateNow).ToList()
                .ForEach(delegate(Transactions t)
                {
                    db.Transactions.Remove(t);
                }
                         );

                db.SaveChanges();
            }
        }
Example #3
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /* {
             *      "execFun": "GetMsg",
             *      "data": {
             *          "dialogId": "788FEFAD0ED24436AD73D968685110E8",
             *          "msgCount": "2",
             *          "offset": "0"
             *      }
             *  }
             */
            #endregion

            OutputSocketMessage          output = new OutputSocketMessage("getMsg", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();

            GetMsgInfo info = DeserializeObject.ParseJSON <GetMsgInfo>(val, output, out rez);
            if (info == null)
            {
                return(rez);
            }

            using (var db = new RaidaContext())
            {
                Members owner = db.Members.First(it => it.login.Equals(myLogin));

                if (db.MemberInGroup.Include(g => g.group).Any(it => it.member.login.Equals(myLogin) && it.groupId == info.dialogId))
                {
                    MemberInGroup mg = db.MemberInGroup.Include(g => g.group).ThenInclude(s => s.Shares).Where(it => it.member.login.Equals(myLogin) && it.groupId == info.dialogId).First();

                    string groupName = mg.group.group_name_part;
                    if (mg.group.one_to_one)
                    {
                        groupName = db.MemberInGroup.Include(m => m.member).FirstOrDefault(mig => mig.group == mg.group && mig.member != owner)?.member.nick_name;
                    }
                    OutGetMsgInfo groupMsg = new OutGetMsgInfo(mg.group.group_id, groupName, mg.group.one_to_one, mg.group.privated);
                    mg.group.Shares.Where(it => it.death_date > SystemClock.GetInstance().CurrentTime)
                    .OrderBy(s => s.sending_date)
                    .Skip(info.offset)
                    .Take(info.msgCount)
                    .ToList()
                    .ForEach(msg => groupMsg.messages.Add(new OneMessageInfo(msg.id, Encoding.Unicode.GetString(msg.file_data), msg.current_fragment, msg.total_fragment, msg.sending_date, msg.owner.nick_name, msg.owner.login)));

                    output.data = groupMsg;
                }
                else
                {
                    output.success  = false;
                    output.msgError = "Dialog is not found";
                }
            }

            rez.msgForOwner = output;
            return(rez);
        }
Example #4
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /* {
             *      "execFun": "OrganizationAddMember",
             *      "data": {
             *          "login": "******",
             *          "password": "******",
             *          "nickName": "Serj",
             *          "transactionId": "80f7efc032cd4a2c97f89fca11ad3701"
             *      }
             *  }
             */
            #endregion

            OutputSocketMessage          output = new OutputSocketMessage("OrganizationAddMember", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();

            using (var db = new RaidaContext())
            {
                Members owner = db.Members.Include(o => o.organization).First(it => it.login.Equals(myLogin));
                if (owner.organization != null && owner.organization.owner == owner)
                {
                    Registration registration = new Registration();
                    rez = registration.Execute(val, myLogin, actId);
                    rez.msgForOwner.callFunction = "OrganizationAddMember";
                    if (rez.msgForOwner.success)
                    {
                        try
                        {
                            RegistrationInfo info         = DeserializeObject.ParseJSON <RegistrationInfo>(val, output, out rez);
                            Organizations    organization = db.Organizations.Include(m => m.members).First(it => it == owner.organization);
                            Members          newMember    = db.Members.First(it => it.login.Equals(info.login.Trim(), StringComparison.CurrentCultureIgnoreCase));
                            newMember.organization = organization;
                            organization.members.Add(newMember);

                            db.SaveChanges();
                            output.data     = new { newMember.login, nickName = newMember.nick_name };
                            rez.msgForOwner = output;
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.Message);
                        }
                    }
                }
                else
                {
                    output.success  = false;
                    output.msgError = "You a not consist in organization or a not organization owner";
                    rez.msgForOwner = output;
                }
            }

            return(rez);
        }
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /*
             * {
             *  "execFun": "rollbacktransaction",
             *  "data": {
             *      "transactionId": "80f7efc032dd4a7c97f69fca51ad3001"
             *  }
             * }
             */
            #endregion

            OutputSocketMessage          output = new OutputSocketMessage("rollbackTransaction", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();

            TransactionInfo info = DeserializeObject.ParseJSON <TransactionInfo>(val, output, out rez);
            if (info == null)
            {
                return(rez);
            }
            Guid transId = info.transactionId;

            output.data = new { transactionId = transId };
            //long dateNow = DateTimeOffset.Now.ToUnixTimeSeconds();
            long dateNow = SystemClock.GetInstance().CurrentTime;

            using (var db = new RaidaContext())
            {
                Members owner = db.Members.FirstOrDefault(it => it.login == myLogin);

                if (!db.Transactions.Any(it => it.transactionId == transId))
                {
                    output.success  = false;
                    output.msgError = "This transaction is not found";
                }
                else if (!(db.Transactions.Any(it => it.transactionId == transId && it.owner == owner)))
                {
                    output.success  = false;
                    output.msgError = "You not owner for this transaction";
                }
                else if (!(db.Transactions.Any(it => it.transactionId == transId && it.owner == owner && it.rollbackTime > dateNow)))
                {
                    output.success  = false;
                    output.msgError = "This transaction is blocked";
                }
                else
                {
                    Transaction.rollbackTransaction(transId, owner);
                }
            }

            rez.msgForOwner = output;
            return(rez);
        }
Example #6
0
        /// <summary>
        /// Get all users in dialog with me
        /// </summary>
        /// <param name="db"></param>
        /// <param name="user"></param>
        /// <returns>List of user logins</returns>
        public static List <string> GetMyReferenceUser(RaidaContext db, Members user)
        {
            List <string> users = new List <string>();

            user.MemberInGroup.ToList().ForEach(it =>
            {
                db.MemberInGroup.Include(m => m.member).Where(mig => mig.groupId.Equals(it.groupId))
                .ForEachAsync(mem => users.Add(mem.member.login));
            });
            users = users.Distinct().Where(it => !it.Equals(user.login)).ToList();
            return(users);
        }
Example #7
0
        public async void Sync()
        {
            List <InputInfo> syncDataList = new List <InputInfo>();

            (privateKey, publicKey) = CryptoUtils.GenerateRSAKeys();

            using (var db = new RaidaContext())
            {
                OneTableHash actualInfo = new OneTableHash()
                {
                    PublicKey = publicKey
                };

                await db.Members.Include(it => it.MemberInGroup).ForEachAsync(it => {
                    actualInfo.ActualMembers.Add(GetHash(it));
                });

                await db.Groups.ForEachAsync(it => {
                    actualInfo.ActualGroups.Add(GetHash(it));
                });

                await db.MemberInGroup.ForEachAsync(it => {
                    actualInfo.ActualMinG.Add(GetHash(it));
                });

                try
                {
                    foreach (string serverUrl in MainConfig.TrustedServers)
                    {
                        InputSyncData responseMember = await $"{serverUrl}/api/sync".PostJsonAsync(actualInfo).ReceiveJson <InputSyncData>();
                        InputInfo     tmpInfo        = DecryptResponse <InputInfo>(responseMember);
                        tmpInfo.ServerURL = serverUrl;
                        syncDataList.Add(tmpInfo);
                    }
                }
                catch (Exception ex)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    //Console.WriteLine(ex.Message);
                    Console.WriteLine("Error of synchronize data from trust server");
                    Console.ResetColor();
                    Console.ReadLine();
                }

                if (syncDataList.Count > 0)
                {
                    InputInfo correctData = IntersectData(syncDataList);
                    SyncronizeBase(correctData, db);
                    DetectIncorrectServer(correctData, syncDataList);
                }
            }
        }
Example #8
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /*
             * {
             *  "execFun": "SetDialogPrivate",
             *  "data": {
             *      "publicId": "18A0CA0657DE4FB09CDC86008B2A8EBE",
             *      "privated": "false"
             *  }
             * }
             */
            #endregion

            OutputSocketMessage          output = new OutputSocketMessage("SetDialogPrivate", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();

            SetDialogPrivateInfo info = DeserializeObject.ParseJSON <SetDialogPrivateInfo>(val, output, out rez);
            if (info == null)
            {
                return(rez);
            }

            using (var db = new RaidaContext())
            {
                Members owner = db.Members.First(it => it.login.Equals(myLogin));
                if (db.Groups.Any(it => it.group_id == info.publicId && it.owner == owner))
                {
                    Groups group = db.Groups.First(it => it.group_id == info.publicId && it.owner == owner);
                    group.privated = info.privated;
                    db.SaveChanges();
                    output.data = new { dialogId = group.group_id, group.privated };

                    List <MemberInGroup> membersInGroup = db.MemberInGroup.Include(m => m.member).Where(it => it.group == group && it.member != owner).ToList();
                    membersInGroup.ForEach(it => rez.forUserLogin.Add(it.member.login));
                    rez.msgForOther = output;
                }
                else
                {
                    output.success  = false;
                    output.msgError = "This dialog not found or you not owner";
                    rez.msgForOwner = output;
                    return(rez);
                }
            }


            rez.msgForOwner = output;
            return(rez);
        }
Example #9
0
        public IActionResult Start([FromBody] OneTableHash data)
        {
            if (ModelState.IsValid)
            {
                using (var db = new RaidaContext())
                {
                    List <SyncMemberInfo> syncData = db.Members.Select(it => new SyncMemberInfo()
                    {
                        Descript = it.description_fragment,
                        LastUse  = it.last_use,
                        Login    = it.login,
                        NickName = it.nick_name,
                        Password = it.pass,
                        Online   = it.online,
                        Photo    = it.photo_fragment,
                        Hash     = SyncData.GetHash(it)
                    }).ToList();
                    var memberInfo = CollectionData(data.ActualMembers, syncData);

                    List <SyncGroupInfo> syncDataGroup = db.Groups.Select(it => new SyncGroupInfo()
                    {
                        Id         = it.group_id,
                        Name       = it.group_name_part,
                        PeerToPeer = it.one_to_one,
                        Photo      = it.photo_fragment,
                        Privated   = it.privated,
                        Owner      = it.owner.login,
                        Hash       = SyncData.GetHash(it)
                    }).ToList();
                    var groupInfo = CollectionData(data.ActualGroups, syncDataGroup);


                    List <SyncMembInGroupInfo> syncDataMiG = db.MemberInGroup.Include(m => m.member).ToList().Select(
                        it =>
                        new SyncMembInGroupInfo()
                    {
                        GroupId = it.groupId,
                        Login   = it.member.login,
                        Hash    = SyncData.GetHash(it)
                    }).ToList();
                    var mingInfo = CollectionData(data.ActualMinG, syncDataMiG);

                    var objRez = CryptoUtils.EncryptDataAES(new { memberInfo, groupInfo, mingInfo });
                    objRez.key = CryptoUtils.EncryptKeyRSA(data.PublicKey, objRez.key);

                    return(new ObjectResult(new { objRez.key, objRez.code }));
                }
            }

            return(NotFound());
        }
Example #10
0
        /* { "execFun": "registration",
         *      "data": {
         *          "login": "******",
         *          "password": "******",
         *          "nickName": "gosha",
         *          "transactionId": "80f7efc032dd4a7c97f69fca51ad3001"
         *      }
         *  }
         */

        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            OutputSocketMessage          output = new OutputSocketMessage("registration", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();


            RegistrationInfo info = DeserializeObject.ParseJSON <RegistrationInfo>(val, output, out rez);

            if (info == null)
            {
                return(rez);
            }

            using (var db = new RaidaContext())
            {
                if (db.Members.Any(it => it.login.Equals(info.login.Trim(), StringComparison.CurrentCultureIgnoreCase)))
                {
                    output.success  = false;
                    output.msgError = "This login already exists";
                }
                else
                {
                    Guid privateId = Guid.NewGuid();
                    while (db.Members.Any(it => it.private_id == privateId))
                    {
                        privateId = Guid.NewGuid();
                    }

                    info.password = Argon2.Hash(info.password, 1, 512, 8); //Hashing password
                    Members member = new Members
                    {
                        private_id           = privateId,
                        login                = info.login.Trim().ToLower(),
                        pass                 = info.password,
                        nick_name            = info.nickName,
                        last_use             = SystemClock.GetInstance().CurrentTime,
                        description_fragment = "",
                        photo_fragment       = "",
                        kb_bandwidth_used    = 0,
                        online               = false,
                    };
                    db.Members.Add(member);
                    Transaction.saveTransaction(db, info.transactionId, Transaction.TABLE_NAME.MEMBERS, privateId.ToString(), member);

                    db.SaveChanges();
                }
            }

            rez.msgForOwner = output;
            return(rez);
        }
Example #11
0
        /// <summary>
        /// Send all users info about changed my info
        /// </summary>
        /// <param name="db"></param>
        /// <param name="user"></param>
        private void SendMessageOfChangeUser(RaidaContext db, Members user)
        {
            var response = new
            {
                callFunction = "changeUserInfo",
                data         = new { itself = false, user = new UserInfo(user.login, user.nick_name, user.photo_fragment, user.online) }
            };
            List <string> users = DeserializeObject.GetMyReferenceUser(db, user);

            mClients.Where(it => users.Contains(it.login)).ToList().ForEach(it =>
            {
                SendMessage(it.client, response);
            });
        }
Example #12
0
        public static void saveTransaction(RaidaContext db, Guid transactionId, String tableName, String rowId, Members owner)
        {
            long DiffRoll = MainConfig.TransactionRollback; //How long seconds rollback access

            Int64 rollback = SystemClock.GetInstance().CurrentTime + DiffRoll;

            Transactions newTransaction = new Transactions {
                transactionId = transactionId,
                tableName     = tableName,
                tableRowId    = rowId,
                rollbackTime  = rollback,
                owner         = owner
            };

            db.Transactions.Add(newTransaction);
        }
Example #13
0
        /// <summary>
        /// Remove all message above limit
        /// </summary>
        /// <param name="group">Check dialog</param>
        public static void removeMessageAboveLimit(Groups group)
        {
            int           limit = MainConfig.LimitMsgForDialog;
            List <Shares> extra = group.Shares.ToList();

            using (var db = new RaidaContext())
            {
                extra.OrderByDescending(it => it.sending_date)
                .Skip(limit)
                .ToList()
                .ForEach(delegate(Shares s)
                {
                    db.Shares.Remove(s);
                });

                db.SaveChanges();
            }
        }
Example #14
0
        public static void rollbackTransaction(Guid transactionId, Members owner)
        {
            //long dateNow = DateTimeOffset.Now.ToUnixTimeSeconds();
            long dateNow = SystemClock.GetInstance().CurrentTime;

            using (var db = new RaidaContext())
            {
                if (db.Transactions.Any(it => it.transactionId == transactionId && it.owner == owner && it.rollbackTime > dateNow))
                {
                    List <Transactions> trans = db.Transactions.Where(it => it.transactionId == transactionId && it.owner == owner && it.rollbackTime > dateNow).ToList();
                    trans.ForEach(delegate(Transactions t)
                    {
                        ReflectionRemove(db, t.tableName.Trim(), t.tableRowId.Trim());
                    });
                    db.SaveChanges();
                }
            }
        }
Example #15
0
        public override void OnClientClosed(IClient client)
        {
            if (mClients.Any(it => it.client == client))
            {
                AuthSocketInfo cl = mClients.First(it => it.client == client);
                using (var db = new RaidaContext())
                {
                    Members user = db.Members.Include(m => m.MemberInGroup).First(it => it.login.Equals(cl.login));
                    user.online   = false;
                    user.last_use = SystemClock.GetInstance().CurrentTime;
                    db.SaveChanges();
                    //организовать отправку остальным клиентом
                    SendMessageOfChangeUser(db, user);
                }

                mClients.Remove(cl);
            }
        }
Example #16
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /* {
             *      "execFun": "GetUsers",
             *      "data": { }
             *  }
             */
            #endregion

            OutputSocketMessage          output = new OutputSocketMessage("getUsersInfo", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();

            using (var db = new RaidaContext())
            {
                List <MemberInGroup> mg = db.MemberInGroup.Include(g => g.group)
                                          .ThenInclude(own => own.owner)
                                          .Where(it => it.member.login.Equals(myLogin))
                                          .ToList();

                List <UserInfo> users = new List <UserInfo>();

                mg.ForEach(it => {
                    db.MemberInGroup.Include(m => m.member).Where(mig => mig.groupId.Equals(it.groupId))
                    .ForEachAsync(memb =>
                    {
                        users.Add(new UserInfo(
                                      memb.member.login,
                                      memb.member.nick_name,
                                      memb.member.photo_fragment.ToString(),
                                      memb.member.online));
                    });
                });

                users = users.Distinct().ToList();

                output.data = users;
            }

            rez.msgForOwner = output;
            return(rez);
        }
Example #17
0
        /// <summary>
        /// Reflection remove data from database
        /// </summary>
        /// <param name="db">DataBase context</param>
        /// <param name="entity">Name of class</param>
        /// <param name="remId">Remove key</param>
        private static void  ReflectionRemove(RaidaContext db, String entity, String remId)
        {
            //Подключаем к бд нужную таблицу
            var asob          = Assembly.GetAssembly(typeof(Members));
            var tEntity       = asob.GetType($"RAIDAChatNode.Model.Entity.{entity}", false, true);
            var method        = db.GetType().GetMember("Set").Cast <MethodInfo>().Where(x => x.IsGenericMethodDefinition).FirstOrDefault();
            var genericMethod = method.MakeGenericMethod(tEntity);
            var invokeSet     = genericMethod.Invoke(db, null);

            //Достаём контекст
            var eContext = db.GetType().GetProperty(entity).GetValue(db);

            //Получаем первичный ключ TESTING FOR MEMBERSINGROUP
            var key = tEntity.GetProperties()
                      .Where(x => x.GetCustomAttributes <KeyAttribute>() != null)
                      .FirstOrDefault();

            dynamic Id;

            if (key.PropertyType == typeof(Guid))
            {
                Id = Guid.Parse(remId);
            }
            else
            {
                Id = int.Parse(remId);
            }

            //Находим элемент
            var mFind = eContext.GetType().GetMethod("Find");
            var item  = mFind.Invoke(eContext, new object[] { new object[] { Id } });

            if (item != null)
            {
                //Удаляем его
                var mRemove = eContext.GetType().GetMethod("Remove");
                mRemove.Invoke(eContext, new object[] { item });
            }
        }
Example #18
0
        /* { "execFun": "authorization",
         *      "data": {
         *          "login": "******",
         *          "password": "******"
         *      }
         *  }
         */


        //Замутить обновление статуса онлайн-офлайн
        public AuthSocketInfo Execute(object data)
        {
            AuthSocketInfo output = new AuthSocketInfo();

            AuthInfo info;

            try
            {
                info = JsonConvert.DeserializeObject <AuthInfo>(data.ToString());

                using (var db = new RaidaContext())
                {
                    Members user = db.Members.FirstOrDefault(it => it.login.Equals(info.login.Trim(), StringComparison.CurrentCultureIgnoreCase) && Argon2.Verify(it.pass, info.password, null));
                    if (user != null)
                    {
                        output.auth     = true;
                        output.login    = user.login;
                        output.nickName = user.nick_name;
                        output.password = info.password;
                        output.photo    = user.photo_fragment;

                        user.online   = true;
                        user.last_use = SystemClock.GetInstance().CurrentTime;
                        db.SaveChanges();
                    }
                    else
                    {
                        output.auth = false;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message.ToString());
                output.auth = false;
            }
            return(output);
        }
Example #19
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /*
             * {
             *  "execFun": "createDialog",
             *  "data": {
             *      "name": "MeCloseGroup",
             *      "publicId": "48A0CA0657DE4FB09CDC86008B2A8EBE",
             *      "oneToOne": "false",
             *      "transactionId": "80f7efc032dd4a7c97f69fca51ad3100"
             *  }
             * }
             */
            #endregion

            OutputSocketMessage          output = new OutputSocketMessage("createDialog", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();

            GroupInfo info = DeserializeObject.ParseJSON <GroupInfo>(val, output, out rez);
            if (info == null)
            {
                return(rez);
            }

            using (var db = new RaidaContext())
            {
                if (db.Groups.Any(it => it.group_id == info.publicId))
                {
                    output.success  = false;
                    output.msgError = "Change the publicId";
                    rez.msgForOwner = output;
                    return(rez);
                }

                Members owner = db.Members.First(it => it.login.Equals(myLogin));

                Groups group = new Groups
                {
                    group_id        = info.publicId,
                    group_name_part = info.name,
                    owner           = owner,
                    photo_fragment  = "",
                    one_to_one      = info.oneToOne,
                    privated        = false
                };

                int newId = 1;
                if (db.MemberInGroup.Count() > 0)
                {
                    newId = db.MemberInGroup.OrderByDescending(it => it.Id).FirstOrDefault().Id + 1;
                }


                if (info.oneToOne)
                {
                    if (db.Members.Any(it => it.login.Equals(info.name.Trim().ToLower())))
                    {
                        group.group_name_part = "OneToOne";
                        Members rec = db.Members.First(it => it.login.Equals(info.name.Trim().ToLower()));

                        if (!db.MemberInGroup.Any(it => it.member == owner && db.MemberInGroup.Any(mg => mg.member == rec && it.group == mg.group && mg.group.one_to_one)))
                        {
                            MemberInGroup mg1 = new MemberInGroup
                            {
                                Id     = newId,
                                group  = group,
                                member = rec
                            };
                            db.MemberInGroup.Add(mg1);

                            Transaction.saveTransaction(db, info.transactionId, Transaction.TABLE_NAME.MEMBERS_IN_GROUP, mg1.Id.ToString(), owner);

                            newId++;
                            //rez.usersId.Add(info.login); Придумать ответ пользователю, которого добавили - а может он и не нужен
                        }
                        else
                        {
                            output.success  = false;
                            output.msgError = "This dialog exists";
                            rez.msgForOwner = output;
                            return(rez);
                        }
                    }
                    else
                    {
                        output.success  = false;
                        output.msgError = "User is not found";
                        rez.msgForOwner = output;
                        return(rez);
                    }
                }
                db.Groups.Add(group);
                MemberInGroup OwnerInMg = new MemberInGroup
                {
                    Id     = newId,
                    group  = group,
                    member = owner
                };
                db.MemberInGroup.Add(OwnerInMg);
                try {
                    db.SaveChanges();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                Transaction.saveTransaction(db, info.transactionId, Transaction.TABLE_NAME.GROUPS, info.publicId.ToString(), owner);
                Transaction.saveTransaction(db, info.transactionId, Transaction.TABLE_NAME.MEMBERS_IN_GROUP, OwnerInMg.Id.ToString(), owner);
            }
            output.data     = new { id = info.publicId, info.name, info.oneToOne };
            rez.msgForOwner = output;
            return(rez);
        }
Example #20
0
        private void SyncronizeBase(InputInfo correctData, RaidaContext db)
        {
            //Save\Update members table
            correctData.MemberInfo.NewRows.ForEach(it =>
            {
                correctData.MemberInfo.Actual.Add(GetHash(new { login = it.Login, nick_name = it.NickName }));
                if (db.Members.Any(m => m.login.Equals(it.Login)))
                {
                    //UPDATE
                    Members member              = db.Members.First(m => m.login.Equals(it.Login));
                    member.nick_name            = it.NickName;
                    member.description_fragment = it.Descript;
                    member.last_use             = it.LastUse;
                    member.online         = it.Online;
                    member.photo_fragment = it.Photo;
                }
                else
                {
                    //INSERT NEW
                    Guid privateId = Guid.NewGuid();
                    while (db.Members.Any(memb => memb.private_id == privateId))
                    {
                        privateId = Guid.NewGuid();
                    }

                    Members member = new Members
                    {
                        private_id           = privateId,
                        login                = it.Login.Trim().ToLower(),
                        pass                 = it.Password,
                        nick_name            = it.NickName,
                        last_use             = it.LastUse,
                        description_fragment = it.Descript,
                        photo_fragment       = it.Photo,
                        kb_bandwidth_used    = 0,
                        online               = it.Online,
                    };
                    db.Members.Add(member);
                }
            });
            db.SaveChanges();


            //Save\Update groups table
            correctData.GroupInfo.NewRows.ForEach(it =>
            {
                correctData.GroupInfo.Actual.Add(GetHash(new { group_id = it.Id, group_name_part = it.Name, one_to_one = it.PeerToPeer }));
                Members owner = db.Members.First(m => m.login.Equals(it.Owner));
                if (db.Groups.Any(g => g.group_id == it.Id))
                {
                    Groups group          = db.Groups.First(g => g.group_id == it.Id);
                    group.group_name_part = it.Name;
                    group.one_to_one      = it.PeerToPeer;
                    group.photo_fragment  = it.Photo;
                    group.privated        = it.Privated;
                    group.owner           = owner;
                }
                else
                {
                    Groups newGroup = new Groups()
                    {
                        group_id        = it.Id,
                        group_name_part = it.Name,
                        owner           = owner,
                        photo_fragment  = it.Photo,
                        one_to_one      = it.PeerToPeer,
                        privated        = it.Privated
                    };
                    db.Groups.Add(newGroup);
                }
            });
            db.SaveChanges();

            //Save member in groups
            correctData.MinGInfo.NewRows.ForEach(it =>
            {
                correctData.MinGInfo.Actual.Add(GetHash(new { groupId = it.GroupId, login = it.Login }));
                if (db.Members.Any(m => m.login.Equals(it.Login) && db.Groups.Any(g => g.group_id == it.GroupId)))
                {
                    Groups group   = db.Groups.First(gr => gr.group_id == it.GroupId);
                    Members member = db.Members.First(m => m.login.Equals(it.Login));

                    if (!db.MemberInGroup.Any(mig => mig.member.Equals(member) && mig.group.Equals(group))) //Find duplicate
                    {
                        int newId = 0;
                        if (db.MemberInGroup.Any())
                        {
                            newId = db.MemberInGroup.OrderByDescending(mig => mig.Id).FirstOrDefault().Id + 1;
                        }

                        MemberInGroup mg = new MemberInGroup
                        {
                            Id     = newId,
                            group  = group,
                            member = member
                        };
                        db.MemberInGroup.Add(mg);
                    }
                }
            });
            db.SaveChanges();

            //Remove not actual data in tables
            db.Members.ForEachAsync(it =>
            {
                if (!correctData.MemberInfo.Actual.Contains(GetHash(it)))
                {
                    db.Members.Remove(it);
                }
            });

            db.Groups.ForEachAsync(it =>
            {
                if (!correctData.GroupInfo.Actual.Contains(GetHash(it)))
                {
                    db.Groups.Remove(it);
                }
            });

            db.MemberInGroup.ForEachAsync(it =>
            {
                if (!correctData.MinGInfo.Actual.Contains(GetHash(it)))
                {
                    db.MemberInGroup.Remove(it);
                }
            });
            db.SaveChangesAsync();
        }
Example #21
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /* {
             *      "execFun": "ChangeUserInfo",
             *      "data": {
             *          "name":"String",
             *                                  "photo":"String",
             *                                  "about":"String",
             *                                  "changePass":"******",
             *                                  "oldPass":"******",
             *                                  "newPass":"******"
             *      }
             *  }
             */
            #endregion

            OutputSocketMessage          output         = new OutputSocketMessage("changeUserInfo", actId, true, "", new { });
            OutputSocketMessage          outputForOther = new OutputSocketMessage("changeUserInfo", Guid.Empty, true, "", new { });
            OutputSocketMessageWithUsers rez            = new OutputSocketMessageWithUsers();

            DTO.ChangeUserInfo info = DeserializeObject.ParseJSON <DTO.ChangeUserInfo>(val, output, out rez);
            if (info == null)
            {
                return(rez);
            }

            using (var db = new RaidaContext())
            {
                Members owner = db.Members.Include(m => m.MemberInGroup).FirstOrDefault(it => it.login.Equals(myLogin));

                owner.nick_name            = info.Name;
                owner.photo_fragment       = info.Photo;
                owner.description_fragment = info.About;
                if (info.ChangePass)
                {
                    if (Argon2.Verify(owner.pass, info.OldPass, null))
                    {
                        if (info.NewPass.Trim().Length > 5)
                        {
                            owner.pass = Argon2.Hash(info.NewPass, 1, 512, 8);
                        }
                        else
                        {
                            output.success  = false;
                            output.msgError = "Minimum length of password is 6 chars";
                        }
                    }
                    else
                    {
                        output.success  = false;
                        output.msgError = "Current password is not valid";
                    }
                }

                db.SaveChanges();

                var user = new UserInfo(owner.login, owner.nick_name, owner.photo_fragment, owner.online);

                output.data = new
                {
                    itself = true,
                    user
                };

                outputForOther.data = new
                {
                    itself = false,
                    user
                };

                rez.forUserLogin = DeserializeObject.GetMyReferenceUser(db, owner);
            }

            rez.msgForOwner = output;
            rez.msgForOther = outputForOther;
            return(rez);
        }
Example #22
0
        private void NextProcessing(IClient fromClient, InputSocketDataInfo inputObject)
        {
            OutputSocketMessage outputSocket;

            Type findClass = Type.GetType($"RAIDAChatNode.Reflections.{inputObject.execFun}", false, true);

            if (findClass != null)
            {
                if (findClass.Equals(typeof(Authorization)))
                {
                    AuthSocketInfo info = new Authorization().Execute(inputObject.data);
                    if (info.auth)
                    {
                        info.client = fromClient;
                        if (!mClients.Any(it => it.client.Equals(fromClient)))
                        {
                            mClients.Add(info);
                        }
                        outputSocket = new OutputSocketMessage(inputObject.execFun, inputObject.actId, true, "", new { info.nickName, info.login, img = info.photo });

                        //Организовать отправку остальным пользователям о подключении клиента

                        using (var db = new RaidaContext())
                        {
                            Members iam = db.Members.Include(m => m.MemberInGroup)
                                          .First(it => it.login.Equals(info.login));
                            SendMessageOfChangeUser(db, iam);
                        }

                        Console.WriteLine($"{JsonConvert.SerializeObject(outputSocket)}");
                        SendMessage(fromClient, outputSocket);
                        return;
                    }
                    else
                    {
                        Console.WriteLine("Invalid login or password");
                        outputSocket = new OutputSocketMessage(inputObject.execFun,
                                                               Guid.Empty,
                                                               false,
                                                               "Invalid login or password",
                                                               new { });
                        SendMessage(fromClient, outputSocket);
                        return;
                    }
                }
                else
                {
                    if (mClients.Any(it => it.client == fromClient) || findClass.Equals(typeof(Registration)))
                    {
                        IReflectionActions           execClass   = (IReflectionActions)Activator.CreateInstance(findClass);
                        AuthSocketInfo               currentUser = mClients.FirstOrDefault(it => it.client == fromClient);
                        OutputSocketMessageWithUsers response    = execClass.Execute(inputObject.data, currentUser?.login, inputObject.actId);

                        Console.WriteLine($"{JsonConvert.SerializeObject(response.msgForOwner)}");
                        SendMessage(fromClient, response.msgForOwner);

                        if (response.msgForOwner.success)
                        {
                            Action <AuthSocketInfo> action = delegate(AuthSocketInfo s) { SendMessage(s.client, response.msgForOther); };
                            mClients.Where(it => response.forUserLogin.Contains(it.login)).ToList().ForEach(it =>
                            {
                                Console.WriteLine($"SendFor {it}");
                                action(it);
                            });
                        }
                    }
                    else
                    {
                        Console.WriteLine("You are not authorized. To continue working you need to login.");

                        outputSocket = new OutputSocketMessage(inputObject.execFun,
                                                               Guid.Empty,
                                                               false,
                                                               "You are not authorized. To continue working you need to login.",
                                                               new { });
                        SendMessage(fromClient, outputSocket);
                        return;
                    }
                }
            }
            else
            {
                Console.WriteLine($"Function: '{inputObject.execFun}' not found");

                outputSocket = new OutputSocketMessage(inputObject.execFun,
                                                       Guid.Empty,
                                                       false,
                                                       $"Function: '{inputObject.execFun}' not found",
                                                       new { }
                                                       );
                SendMessage(fromClient, outputSocket);
                return;
            }
        }
Example #23
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /*
             *          {
             *              "execFun": "OrganizationCreate",
             *              "data": {
             *                  "publicId": "788FEFAD0ED24436AD73D968685110E8",
             *                  "name": "Organization Only One",
             *                  "transactionId": "80f7efc092da4a1c47f69fca51ad1100"
             *              }
             *          }
             */
            #endregion

            OutputSocketMessage          output = new OutputSocketMessage("OrganizationCreate", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();

            OrganizationCreateInfo info = DeserializeObject.ParseJSON <OrganizationCreateInfo>(val, output, out rez);
            if (info == null)
            {
                return(rez);
            }

            using (var db = new RaidaContext())
            {
                Members owner = db.Members.Include(o => o.organization).First(it => it.login.Equals(myLogin));
                if (owner.organization == null)
                {
                    if (!db.Organizations.Any(it => it.public_id == info.publicId))
                    {
                        Guid privateId = Guid.NewGuid();
                        while (db.Organizations.Any(it => it.private_id == privateId))
                        {
                            privateId = Guid.NewGuid();
                        }

                        Organizations newOrganiz = new Organizations
                        {
                            private_id    = privateId,
                            public_id     = info.publicId,
                            org_name_part = info.name,
                            kb_of_credit  = 0,
                            owner         = owner
                        };
                        newOrganiz.members.Add(owner);
                        db.Organizations.Add(newOrganiz);
                        Transaction.saveTransaction(db, info.transactionId, Transaction.TABLE_NAME.ORGANIZATIONS, newOrganiz.private_id.ToString(), owner);
                        db.SaveChanges();
                        output.data = new { publicId = newOrganiz.public_id, name = newOrganiz.org_name_part };
                    }
                    else
                    {
                        output.success  = false;
                        output.msgError = "Change the publicId";
                    }
                }
                else
                {
                    output.success  = false;
                    output.msgError = "You a have already organization";
                }
            }

            rez.msgForOwner = output;
            return(rez);
        }
Example #24
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /*
             *          {
             *              "execFun": "sendMsg",
             *              "data": {
             *                  "dialogId": "788FEFAD0ED24436AD73D968685110E8",
             *                  "textMsg": "test message for one user",
             *                  "guidMsg": "91D8333FA55B40AFB46CA63E214C93C8",
             *                  "curFrg":"1",
             *                  "totalFrg":"2",
             *                  "transactionId": "80f7efc032dd4a1c97f69fca51ad1100",
             *                  "deathDate": "2511450497620"
             *              }
             *          }
             */
            #endregion

            OutputSocketMessage          output      = new OutputSocketMessage("sendMsg", actId, true, "", new { });
            OutputSocketMessage          outputOther = new OutputSocketMessage("sendMsg", Guid.Empty, true, "", new { });
            OutputSocketMessageWithUsers rez         = new OutputSocketMessageWithUsers();

            InputMsgInfo info = DeserializeObject.ParseJSON <InputMsgInfo>(val, output, out rez);
            if (info == null)
            {
                return(rez);
            }

            using (var db = new RaidaContext())
            {
                Members owner = db.Members.First(it => it.login.Equals(myLogin));

                if (db.Groups.Any(it => it.group_id == info.dialogId && it.MemberInGroup.Any(mg => mg.group == it && mg.member == owner))) //Check created group and member in this group
                {
                    if (!db.Shares.Any(it => it.id == info.msgId))                                                                         //Check exist message with Id
                    {
                        Groups gr = db.Groups.Include(s => s.Shares).First(it => it.group_id == info.dialogId);
                        Console.WriteLine(SystemClock.GetInstance().CurrentTime.ToString());
                        Shares msg = new Shares
                        {
                            id               = info.msgId,
                            owner            = owner,
                            current_fragment = info.curFrg,
                            total_fragment   = info.totalFrg,
                            file_data        = Encoding.Unicode.GetBytes(info.textMsg),
                            file_extention   = "none",
                            kb_size          = 0,
                            sending_date     = SystemClock.GetInstance().CurrentTime, // DateTimeOffset.Now.ToUnixTimeSeconds(),
                            death_date       =
                                info.deathDate > 0
                                    ? DateConvert.validateTimestamp(SystemClock.GetInstance().CurrentTime + info.deathDate)
                                    : DateTimeOffset.Now.AddYears(2000).ToUnixTimeSeconds(),
                            to_group = gr
                        };
                        gr.Shares.Add(msg);
                        db.Shares.Add(msg);

                        Transaction.saveTransaction(db, info.transactionId, Transaction.TABLE_NAME.SHARES,
                                                    msg.id.ToString(), owner);

                        db.SaveChanges();

                        List <MemberInGroup> membersInGroup = db.MemberInGroup.Include(m => m.member)
                                                              .Where(it => it.group == gr && it.member != owner).ToList();
                        membersInGroup.ForEach(it => rez.forUserLogin.Add(it.member.login));

                        string groupNameForOwner = gr.group_name_part,
                               groupNameForOther = gr.group_name_part;

                        if (gr.one_to_one)
                        {
                            groupNameForOwner = membersInGroup.First(it => it.member != owner).member.nick_name;
                            groupNameForOther = owner.nick_name;
                        }

                        OneMessageInfo newMsg = new OneMessageInfo(msg.id, info.textMsg, msg.current_fragment,
                                                                   msg.total_fragment, msg.sending_date, owner.nick_name, msg.owner.login);

                        output.data = new OutGetMsgInfo(gr.group_id, groupNameForOwner, gr.one_to_one, gr.privated,
                                                        new List <OneMessageInfo>()
                        {
                            newMsg
                        });
                        outputOther.data = new OutGetMsgInfo(gr.group_id, groupNameForOther, gr.one_to_one, gr.privated,
                                                             new List <OneMessageInfo>()
                        {
                            newMsg
                        });

                        Transaction.removeMessageAboveLimit(gr);
                    }
                    else
                    {
                        output.success  = false;
                        output.msgError = "Message with this ID is exist";
                        output.data     = new { id = info.msgId };
                        rez.msgForOwner = output;
                        return(rez);
                    }
                }
                else
                {
                    output.success  = false;
                    output.msgError = "Dialog is not found";
                    rez.msgForOwner = output;
                    return(rez);
                }
            }

            rez.msgForOwner = output;
            rez.msgForOther = outputOther;
            return(rez);
        }
Example #25
0
        public OutputSocketMessageWithUsers Execute(object val, string myLogin, Guid actId)
        {
            #region Тестовые данные

            /*
             *          {
             *              "execFun": "addMemberInGroup",
             *              "data": {
             *                  "memberLogin": "******",
             *                  "groupId": "48A0CA0657DE4FB09CDC86008B2A8EBE",
             *                   "transactionId": "80f7efc032dd4a7c97f69fca51ad1100"
             *              }
             *          }
             */
            #endregion

            OutputSocketMessage          output = new OutputSocketMessage("addMemberInGroup", actId, true, "", new { });
            OutputSocketMessageWithUsers rez    = new OutputSocketMessageWithUsers();

            AddMemberInGroupInfo info = DeserializeObject.ParseJSON <AddMemberInGroupInfo>(val, output, out rez);
            if (info == null)
            {
                return(rez);
            }

            using (var db = new RaidaContext())
            {
                if (db.Members.Any(it => it.login.Equals(info.memberLogin.Trim(), StringComparison.CurrentCultureIgnoreCase)))
                {
                    Members owner = db.Members.First(it => it.login.Equals(myLogin));
                    if (db.MemberInGroup.Any(it => it.member == owner && it.groupId == info.groupId && !it.group.one_to_one))
                    {
                        Members user = db.Members.FirstOrDefault(it => it.login.Equals(info.memberLogin.Trim(), StringComparison.CurrentCultureIgnoreCase));
                        if (db.MemberInGroup.Any(it => it.groupId == info.groupId && it.member == user))
                        {
                            output.success  = false;
                            output.msgError = "This user already exists in this group";
                        }
                        else
                        {
                            Groups group = db.Groups.First(it => it.group_id == info.groupId);

                            if (group.privated)
                            {
                                output.success  = false;
                                output.msgError = "This group is private";
                                rez.msgForOwner = output;
                                return(rez);
                            }

                            int newId = 0;
                            if (db.MemberInGroup.Any())
                            {
                                newId = db.MemberInGroup.OrderByDescending(it => it.Id).FirstOrDefault().Id + 1;
                            }

                            MemberInGroup mg = new MemberInGroup
                            {
                                Id     = newId,
                                group  = group,
                                member = user
                            };
                            db.MemberInGroup.Add(mg);

                            Transaction.saveTransaction(db, info.transactionId, Transaction.TABLE_NAME.MEMBERS_IN_GROUP, mg.Id.ToString(), owner);

                            db.SaveChanges();

                            output.data = new { itself = true, newUser = new UserInfo(user.login, user.nick_name, user.photo_fragment, user.online), groupId = group.group_id };

                            var members = db.MemberInGroup.Include(ming => ming.member)
                                          .Where(it => it.groupId.Equals(group.group_id)).Select(x => x.member.login).ToList(); //Logins of all users in dialog
                            rez.forUserLogin = members.Where(it => !it.Equals(myLogin)).ToList();                               //Send all users in dialog, but not me

                            rez.msgForOther = new
                            {
                                callFunction = "AddMemberInGroup",
                                data         = new {
                                    id       = info.groupId,
                                    name     = group.group_name_part,
                                    oneToOne = group.one_to_one,
                                    members  = members,
                                    newUser  = new UserInfo(user.login, user.nick_name, user.photo_fragment, user.online)
                                }
                            };
                        }
                    }
                    else
                    {
                        output.success  = false;
                        output.msgError = "Group is not found";
                    }
                }
                else
                {
                    output.success  = false;
                    output.msgError = "User is not found";
                }
            }

            rez.msgForOwner = output;
            return(rez);
        }