/// <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> /// Fills the messages area list /// </summary> protected override void AddList() { if (Params.Length < 2) { return; // There is no area filter } string area = Params[1].Trim().ToUpper(); string filter = Params.Length > 2 ? Params[2].Trim().ToUpper() : string.Empty; string fmt = "{0,5} {1,1} {2,1} {3,-30} {4}"; using (bbsContext bbs = new bbsContext()) { User user = bbs.GetUserByUsername(client.username); List <Message> list = bbs.GetAllMessagesInArea(area).ToList(); foreach (Message m in list) { Text.Add(TextHelper.Truncate(string.Format(fmt, new object[] { m.Id, m.IsNew(user.LastLoginDate) ? "N" : "", m.IsRead(client.username) ? "" : "U", TextHelper.Truncate(m.MessageFrom, 30), m.Subject }), client.screenWidth)); Data.Actions.Add(m.Id.ToString(), new Parser.BBSCodeResult.Action() { module = "MessageScreen", data = string.Format("@MessageScreen;{0}", m.Id) }); } } KeyLength = 5; }
/// <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> /// Complete constructor /// </summary> /// <param name="c">Client reference</param> /// <param name="s">Server reference</param> /// <param name="text">Text to parse and optional parameters separated by semicolon</param> /// <param name="prev">Link to caller screen</param> public ChangePassword(IBBSClient c, IServer s, string text, IScreen prev) : base(c, s, text, prev) { status = states.WaitForOldPassword; using (bbsContext bbs = new bbsContext()) user = bbs.GetUserByUsername(client.username); InitCatalog(); }
/// <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> /// Fills the messages area list /// </summary> protected override void AddList() { string fmt = "{0,-20} {1,4} {2,4} {3,4} {4}"; using (bbsContext bbs = new bbsContext()) { User user = bbs.GetUserByUsername(client.username); List <MessageArea> list = bbs.GetMessageAllowedAreasByGroup( Params.Length > 1 ? Params[1] : string.Empty, client.username).ToList(); foreach (MessageArea area in list) { Text.Add(TextHelper.Truncate(string.Format(fmt, new object[] { area.Id, area.MessagesCount, area.NewMessagesCount(user.LastLoginDate), area.UnreadMessagesCount(user.Userid), area.Description }), client.screenWidth)); Data.Actions.Add(area.Id, new Parser.BBSCodeResult.Action() { module = "MessagesList", data = string.Format("@MessagesList;{0}", area.Id) }); } } KeyLength = 20; }
/// <summary> /// Fills the user's logins list /// </summary> protected override void AddList() { using (bbsContext bbs = new bbsContext()) { foreach (var login in bbs.Logins.Where(l => l.UserId == client.username)) { Text.Add(TextHelper.Truncate(string.Format("{0,-20:G} {1} {2}", login.DateTime, login.Success ? "*" : " ", login.From), client.screenWidth)); } } }
/// <summary> /// Fills the registered users list /// </summary> protected override void AddList() { using (bbsContext bbs = new bbsContext()) { foreach (var user in bbs.Users) { Text.Add(TextHelper.Truncate(string.Format("{0,-30} {1:d} {2}", user.Userid, user.Registered.Date, user.City.Trim() + ", " + user.Nation), client.screenWidth)); } } }
/// <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> /// 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> /// Dialog event loop /// </summary> /// <param name="msg"></param> public override void HandleMessage(string msg) { msg = msg.Trim(); if (string.IsNullOrWhiteSpace(msg) && status != states.WaitForContinue) { return; } switch (status) { case states.WaitForUsername: msg = msg.ToUpper(); if (msg == "EXIT") { ShowNext(); return; } using (bbsContext bbs = new bbsContext()) user = bbs.GetUserByUsername(msg); if (user == null) { LnWrite(catalog.GetString("User '{0}' is not found.", msg)); LnWrite(catalog.GetString("Username") + ": "); } else { LnWrite(catalog.GetString("New password") + ": "); client.inputMode = EInputMode.PasswordMode; status = states.WaitForNewPassword; } break; case states.WaitForNewPassword: handleWaitForNewPassword(msg); break; case states.WaitForConfirm: handleWaitForConfirm(msg); break; case states.WaitForContinue: ShowNext(); break; default: break; } }
/// <summary> /// Fills area groups list /// </summary> protected override void AddList() { string fmt = "{0,-20} {1,3} {2}"; using (bbsContext bbs = new bbsContext()) { List <MessageAreasGroup> list = bbs.GetAllowedMessageAreasGroup(client.username).ToList(); foreach (MessageAreasGroup group in list) { Text.Add(TextHelper.Truncate(string.Format(fmt, group.Id, group.MessageAreas.Count, group.Description), client.screenWidth)); Data.Actions.Add(group.Id, new Parser.BBSCodeResult.Action() { module = "MessageAreas", data = "@MessageAreas;" + group.Id }); } } KeyLength = 20; }
/// <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> /// Exit a parse tree produced by <see cref="BBSCodeParser.bbsCodeElement"/>. /// </summary> /// <param name="context">The parse tree.</param> public override void ExitBbsCodeElement([NotNull] BBSCodeParser.BbsCodeElementContext context) { string tagName = context.children[1].GetText().Trim().ToUpper(); Tags tag; if (TagsTable.TryGetValue(tagName, out tag)) { Attributes attr = AttributesTable.GetAttributes(tag); string value; string value1; switch (tag) { case Tags.CLS: if (attr.TryGetValue("FORECOLOR", out value)) { ANSI.pushForeColor(value); } if (attr.TryGetValue("BACKCOLOR", out value)) { ANSI.pushBackColor(value); } Parsed.TextConcat(ANSI.ClearScreen()); Parsed.TextPop(true); break; case Tags.BLINK: ANSI.ResetMode(ANSICodes.Modes.Blink); Parsed.TextConcat(ANSI.WriteMode()); Parsed.TextPop(true); break; case Tags.REVERSE: ANSI.ResetMode(ANSICodes.Modes.Reverse); Parsed.TextConcat(ANSI.WriteMode()); Parsed.TextPop(true); break; case Tags.BOLD: ANSI.ResetMode(ANSICodes.Modes.Bold); Parsed.TextConcat(ANSI.WriteMode()); Parsed.TextPop(true); break; case Tags.UNDERLINE: ANSI.ResetMode(ANSICodes.Modes.Underline); Parsed.TextConcat(ANSI.WriteMode()); Parsed.TextPop(true); break; case Tags.COLOR: ANSI.popForeColor(); Parsed.TextConcat(ANSI.WriteMode()); Parsed.TextPop(true); break; case Tags.BACKCOLOR: ANSI.popBackColor(); Parsed.TextConcat(ANSI.WriteMode()); Parsed.TextPop(true); break; case Tags.P: Parsed.TextAssign(string.Join('\n', TextHelper.WordWrap(Parsed.Parsed, Client.screenWidth).ToArray())); Parsed.TextPop(true); break; case Tags.MOVE: if (!attr.TryGetValue("ROW", out value)) { value = "0"; } if (!attr.TryGetValue("COL", out value1)) { value1 = "0"; } Parsed.TextConcat(ANSI.Move(value1, value)); Parsed.TextPop(true); break; case Tags.FIGGLE: if (!attr.TryGetValue("FONT", out value)) { value = "standard"; } try { Parsed.TextAssign(Figgle.FiggleFonts.Lookup(value.ToLower()).Render(Parsed.Parsed)); } catch (Exception) { } Parsed.TextPop(true); break; case Tags.ACTION: action = new BBSCodeResult.Action(attr); if (!string.IsNullOrWhiteSpace(action.requires)) { if (string.IsNullOrWhiteSpace(Client.username)) { Parsed.TextPop(true); return; } using (bbsContext bbs = new bbsContext()) { User user = bbs.GetUserByUsername(Client.username); bool allowed = user.HasRights(action.requires); Parsed.TextPop(allowed); if (!allowed) { return; } } } else { Parsed.TextPop(true); } if (!Parsed.Actions.TryAdd(action.key, action)) { EventLogger.Write(string.Format("Error adding action '{0}' in '{1}'", action.key, FileName), 0); } break; case Tags.BEEP: Parsed.TextConcat((char)7); Parsed.TextPop(true); break; case Tags.HR: Parsed.TextConcat(TextHelper.HR('-', Client.screenWidth)); Parsed.TextPop(true); break; case Tags.HEADER: if (attr.TryGetValue("BACKCOLOR", out value)) { Parsed.HeaderBackground = ANSI.GetColorByName(value, true); } Parsed.Header = Parsed.Parsed; Parsed.TextClear(); break; case Tags.FOOTER: if (attr.TryGetValue("BACKCOLOR", out value)) { Parsed.FooterBackground = ANSI.GetColorByName(value, true); } Parsed.Footer = Parsed.Parsed; Parsed.TextClear(); break; case Tags.BODY: if (attr.TryGetValue("ALTERNATECOLOR", out value)) { Parsed.BodyAlternateBackground = ANSI.GetColorByName(value, true); } if (attr.TryGetValue("FOCUSEDCOLOR", out value)) { Parsed.BodyFocusedBackground = ANSI.GetColorByName(value, true); } Parsed.Body = Parsed.Parsed; Parsed.TextClear(); break; case Tags.HIDDEN: Parsed.TextClear(); break; case Tags.H1: Parsed.TextAssign(string.Join('\n', ANSI.Header(Parsed.Parsed, 1, Client.screenWidth).ToArray())); Parsed.TextPop(true); break; case Tags.H2: Parsed.TextAssign(string.Join('\n', ANSI.Header(Parsed.Parsed, 2, Client.screenWidth).ToArray())); Parsed.TextPop(true); break; case Tags.H3: Parsed.TextAssign(string.Join('\n', ANSI.Header(Parsed.Parsed, 3, Client.screenWidth).ToArray())); Parsed.TextPop(true); break; case Tags.H4: Parsed.TextAssign(string.Join('\n', ANSI.Header(Parsed.Parsed, 1, Client.screenWidth).ToArray())); Parsed.TextPop(true); 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; } }