/// <summary> /// Toss the message in the message base /// </summary> /// <param name="network">Network to use</param> public override void Toss(string network) { Message m = new Message(); m.Area = Text.Area.ToUpper(); m.DateTime = FidonetHelpers.ParseDatetime(Timestamp); m.MessageFrom = FromUser; m.MessageTo = DestUser; m.Subject = Subject; m.FidoId = Text.MsgId; m.FidoReplyTo = Text.ReplyId; m.TearLine = Text.Tear; m.OriginLine = Text.Origin; m.OrigZone = orig.zone; m.OrigNet = orig.net; m.OrigNode = orig.node; m.OrigPoint = orig.point; m.DestZone = dest.zone; m.DestNet = dest.net; m.DestNode = dest.node; m.DestPoint = dest.point; m.Attributes = attr.Binary; m.Body = string.Join('\n', Text.Lines); Console.WriteLine($"Processing message for area: {m.Area}"); using (bbsContext db = new bbsContext()) { db.Messages.Add(m); db.SaveChanges(); foreach (string s in Text.SeenBy) { db.MessagesSeenBy.Add(new MessageSeenBy() { MessageId = m.Id, SeenBy = s }); } foreach (string s in Text.Path) { db.MessagePaths.Add(new MessagePath() { MessageId = m.Id, Path = s }); } db.SaveChanges(); } }
/// <summary> /// Reads the message and the page template /// </summary> /// <param name="name">template name</param> protected override void ReadText(string name) { Message msg; using (bbsContext bbs = new bbsContext()) { msg = bbs.GetMessageById(Params[1]); if (bbs.SetMessageRead(msg.Id, client.username)) { msg.TimesRead++; bbs.SaveChanges(); } } base.ReadText(name); Data.Header = Data.Header.Replace("$msgid$", Params[1]) .Replace("$msgdatetime$", msg.DateTime.ToString("G")) .Replace("$msgfrom$", msg.MessageFrom) .Replace("$msgto$", msg.MessageTo) .Replace("$msgorig$", new FidoAddress(msg.OrigZone, msg.OrigNet, msg.OrigNode, msg.OrigPoint).address4D) .Replace("$msgdest$", new FidoAddress(msg.DestZone, msg.DestNet, msg.DestNode, msg.DestPoint).address4D) .Replace("$msgsubj$", msg.Subject); Header = Data.GetHeaderRows(); Text = TextHelper.SplitString(msg.Body); if (!string.IsNullOrWhiteSpace(msg.TearLine)) { Text.Add($"--- {msg.TearLine}"); } if (!string.IsNullOrWhiteSpace(msg.OriginLine)) { Text.Add($" * Origin: {msg.OriginLine}"); } }
/// <summary> /// check if retyped password match the first inserted /// </summary> /// <param name="msg"></param> protected void handleWaitForConfirm(string msg) { if (password == msg) { using (bbsContext bbs = new bbsContext()) { user = bbs.GetUserByUsername(user.Userid); user.SetPassword(password); bbs.SaveChanges(); } EventLogger.Write( string.Format("Password changed successfully for user '{0}'", user.Userid), client.Remote); LnWrite(catalog.GetString("Password changed successfully.")); Writeln(); client.inputMode = EInputMode.LineMode; client.status = EClientStatus.LoggedIn; status = states.WaitForContinue; } else { LnWrite(catalog.GetString("The two passwords do not match.")); LnWrite(catalog.GetString("New password") + ": "); status = states.WaitForNewPassword; } }
/// <summary> /// Changes the local for the session and the user (if logged in) /// </summary> /// <param name="msg"></param> public override void HandleMessage(string msg) { if (string.IsNullOrWhiteSpace(msg) && KeyLength > 0) { msg = TextHelper.Truncate(Text[currentLine], KeyLength).Trim(); } base.HandleMessage(msg); string l; if (codes.TryGetValue(msg.ToUpper(), out l)) { client.locale = l; if (client.status == EClientStatus.LoggedIn) { using (bbsContext bbs = new bbsContext()) { User user = bbs.GetUserByUsername(client.username); user.Locale = locale; bbs.SaveChanges(); } } client.screen = ScreenFactory.Create(client, server, Previous.ModuleName(), Previous.ModuleParams()); client.screen.Show(); } }
/// <summary> /// Writes message to error output and log table in database /// </summary> /// <param name="message"></param> /// <param name="level">severity level</param> /// <param name="remote">client remote address</param> public static void Write(string message, sbyte level, string remote) { using (bbsContext db = new bbsContext()) { db.Logs.Add(new Log() { Level = level, Description = message, Remote = remote }); db.SaveChanges(); } Console.Error.WriteLine("{0} {1} {2,-22} {3}", new object[] { DateTime.Now, level, remote, message }); }
/// <summary> /// Dialog events loop /// </summary> /// <param name="msg"></param> public override void HandleMessage(string msg) { switch (status) { case states.WaitForUsername: username = msg.Trim().ToUpper(); if (username == string.Empty) { break; } switch (username) { case "GUEST": client.screen = ScreenFactory.Create(client, server, "TextScreen", "@GuestAccess"); client.screen.Show(); break; case "NEW": client.screen = ScreenFactory.Create(client, server, "NewUser"); client.screen.Show(); break; case "LOGOUT": client.screen = ScreenFactory.Create(client, server, "Logout"); client.screen.Show(); break; default: LnWrite(catalog.GetString("Password") + ": "); status = states.WaitForPassword; client.inputMode = EInputMode.PasswordMode; break; } break; case states.WaitForPassword: string pwd = msg.Trim(); client.status = EClientStatus.Guest; client.inputMode = EInputMode.LineMode; bool success = false; using (bbsContext bbs = new bbsContext()) { User user = bbs.GetUserByUsername(username); if (user != null) { Login login = new Login() { UserId = username, From = client.Remote }; if (user.CheckPassword(pwd)) { // successful login success = true; user.LastLoginDate = DateTime.Now; user.LastLoginFrom = client.Remote; login.Success = true; bbs.Logins.Add(login); try { bbs.SaveChanges(); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.InnerException.Message); } EventLogger.Write(string.Format("Successful login for user '{0}'", username), client.Remote); client.status = EClientStatus.LoggedIn; if (string.IsNullOrWhiteSpace(client.locale)) { client.locale = user.Locale; } } else { login.Success = false; bbs.Logins.Add(login); bbs.SaveChanges(); EventLogger.Write(string.Format("Password failed for user '{0}'", username), client.Remote); } } else { EventLogger.Write(string.Format("Unknown user '{0}'", username), client.Remote); } } if (success) { client.username = username; client.screen = ScreenFactory.Create(client, server, "TextScreen", "@LoggedIn"); client.screen.Show(); } else { if (++tries >= maxtries) { client.screen = ScreenFactory.Create(client, server, "Logout"); client.screen.Show(); } else { LnWrite(catalog.GetString("Username or password incorrect. Please try again.")); LnWrite(catalog.GetString("Username") + ": "); status = states.WaitForUsername; } } break; default: break; } }
/// <summary> /// Dialog events loop /// </summary> /// <param name="msg"></param> public override void HandleMessage(string msg) { msg = msg.Trim(); if (string.IsNullOrWhiteSpace(msg)) { if (status == states.WaitForConfirm) { msg = catalog.GetString("Yes"); } else if (status != states.WaitForUsername) { return; } } switch (status) { case states.WaitForUsername: string username = msg.ToUpper(); bool success = false; switch (username) { case "": client.screen = ScreenFactory.Create(client, server, "LoginScreen"); client.screen.Show(); break; case "LOGOUT": client.screen = ScreenFactory.Create(client, server, "Logout"); client.screen.Show(); return; case "GUEST": case "NEW": break; default: if (user.AcceptableUsername(username)) { using (bbsContext bbs = new bbsContext()) { User test = bbs.GetUserByUsername(username); if (test == null) { success = true; } } } break; } if (success) { user.Userid = username; LnWrite(catalog.GetString("Password") + ": "); status = states.WaitForPassword; client.inputMode = EInputMode.PasswordMode; } else { LnWrite(catalog.GetString("This name is already in use. Try another.")); LnWrite(catalog.GetString("Username") + ": "); } break; case states.WaitForPassword: password = msg; if (user.AcceptablePassword(password)) { LnWrite(catalog.GetString("Confirm password") + ": "); status = states.WaitForConfirmPassword; } else { LnWrite(catalog.GetString("Password do not meet security criteria.")); LnWrite(catalog.GetString("Password") + ": "); status = states.WaitForPassword; } break; case states.WaitForConfirmPassword: if (password == msg) { user.SetPassword(password); client.status = EClientStatus.Guest; client.inputMode = EInputMode.LineMode; LnWrite(catalog.GetString("Your real name") + ": "); status = states.WaitForRealName; } else { LnWrite(catalog.GetString("The two passwords do not match. Try again.")); LnWrite(catalog.GetString("Password") + ": "); status = states.WaitForPassword; } break; case states.WaitForRealName: user.Realname = msg; LnWrite(catalog.GetString("Your city") + ": "); status = states.WaitForCity; break; case states.WaitForCity: user.City = msg; LnWrite(catalog.GetString("Your country") + ": "); status = states.WaitForNation; break; case states.WaitForNation: user.Nation = msg; LnWrite(catalog.GetString("Confirm new user creation? [{0}]/{1}", new object[] { catalog.GetString("Yes"), catalog.GetString("No") }) + ": "); status = states.WaitForConfirm; break; case states.WaitForConfirm: msg = msg.ToUpper(); if (msg == catalog.GetString("Yes").ToUpper()) { using (bbsContext bbs = new bbsContext()) { bbs.Users.Add(user); bbs.SaveChanges(); } string m = catalog.GetString("Created new user '{0}'", user.Userid); EventLogger.Write(m, client.Remote); } client.screen = ScreenFactory.Create(client, server, "LoginScreen"); client.screen.Show(); break; default: break; } }