예제 #1
0
        /// <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();
            }
        }
예제 #2
0
        /// <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}");
            }
        }
예제 #3
0
 /// <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;
     }
 }
예제 #4
0
        /// <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();
            }
        }
예제 #5
0
 /// <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 });
 }
예제 #6
0
        /// <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;
            }
        }
예제 #7
0
        /// <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;
            }
        }