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); }
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(); } }
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); }
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); }
/// <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); }
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); } } }
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); }
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()); }
/* { "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); }
/// <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); }); }
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); }
/// <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(); } }
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(); } } }
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); } }
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); }
/// <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 }); } }
/* { "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); }
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); }
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(); }
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); }
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; } }
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); }
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); }
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); }