示例#1
0
        public void DefaultValuesAreSet()
        {
            this.CallBasicModuleInit();

            MailModule.SetDefaultValue(nameof(MailModule.MailMapper.CheckServerCertificate), "false");
            Assert.False(MailModule.MailMapper.CheckServerCertificate);
        }
示例#2
0
        public void MissingInitializationLeedsToErrors()
        {
            var exportResponse = MailModule.GetMessageByCorrelationId("ss");
            var responseError  = JsonConvert.DeserializeObject <Response <Error> >(exportResponse);

            Assert.Equal(typeof(ApplicationException).Name, responseError.Content.ExceptionType);
        }
示例#3
0
 public void TimeoutIsSet()
 {
     this.CallBasicModuleInit();
     Assert.True(MailModule.MailMapper.RequestTimeout == 30000);
     MailModule.SetRequestTimeout(20);
     Assert.True(MailModule.MailMapper.RequestTimeout == 20000);
 }
示例#4
0
    private void OnClickItem()
    {
        if (isOpened == false)
        {
            isOpened = true;
            if (!NGUITools.GetActive(mStateOpen.gameObject))
            {
                NGUITools.SetActive(mStateOpen.gameObject, true);
            }
            if (NGUITools.GetActive(mStateClose.gameObject))
            {
                NGUITools.SetActive(mStateClose.gameObject, false);
            }
            MailActionParam param = new MailActionParam();
            param.mailid = mMaildata.mailid;
            Net.Instance.DoAction((int)Message.MESSAGE_ID.ID_MSG_MAIL_STATE_OPENED, param);
        }
        MailModule module = ModuleManager.Instance.FindModule <MailModule>();

        module.SelectedMail = this;
        ShowMailContent(mMaildata);
        UIWindow MailUI     = WindowManager.Instance.GetUI("mail");
        UIButton mDeleteBtn = MailUI.FindComponent <UIButton>("background/mGiveUpBtn");
        UIButton mPickBtn   = MailUI.FindComponent <UIButton>("background/mGetBtn");

        UIAtlasHelper.SetButtonImage(mDeleteBtn, "common:btn_blue_4word", true);
        if (mMaildata.itemcnt > 0 && mMaildata.mItemsList != null && !isPicked)
        {
            UIAtlasHelper.SetButtonImage(mPickBtn, "common:btn_yellow_4word", true);
        }
    }
示例#5
0
        public async Task SendMailWithAttachmentSucceedsAsync()
        {
            this.CallBasicModuleInit();

            var response = MailModule.StartSendMail(
                MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_SENDER_MAIL),
                new[]
            {
                MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_RECIPIENT_MAIL_1),
            },
                "test",
                "test",
                "<b>test</b>",
                new[]
            {
                "assets/favicon-32x32.png",
                "assets/fake_log.txt",
            });
            var successResponse = JsonConvert.DeserializeObject <Response <string> >(response);

            Assert.True(!string.IsNullOrWhiteSpace(successResponse.CorrelationKey));

            var messageStoreResult = await this.WaitForMessageStoreAsync(successResponse.CorrelationKey);

            Assert.IsType <Response <string> >(JsonConvert.DeserializeObject <Response <string> >(messageStoreResult));
        }
示例#6
0
    private void OnPickBtnClick()
    {
        MailModule module = ModuleManager.Instance.FindModule <MailModule>();

        if (module.SelectedMail != null && module.SelectedMail.mMaildata.mItemsList != null && module.SelectedMail.mMaildata.itemcnt != 0)
        {
            module.SelectedMail.OnPickItem();
        }
    }
示例#7
0
 private string CallBasicModuleInit()
 {
     return(MailModule.Initialize(
                "test.test.com",
                465,
                "test",
                "test",
                30));
 }
示例#8
0
 private void CallBasicModuleInit()
 {
     MailModule.Initialize(
         Constants.MailServer.SmtpHostName,
         Constants.MailServer.SmtpPort,
         MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_PROVIDER_USER_NAME.ToString()),
         MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_PROVIDER_USER_PASS.ToString()),
         30);
 }
示例#9
0
    private void OnDeleteBtnClick()
    {
        MailModule module = ModuleManager.Instance.FindModule <MailModule>();

        if (module.SelectedMail != null)
        {
            module.SelectedMail.OnDeleteItem();
        }
        UIAtlasHelper.SetButtonImage(mDeleteBtn, "common:anniuhui", true);
    }
示例#10
0
        public void SetDefaultValueInputsAreValidated()
        {
            var mock = new Mock <IMailMapper>();

            this.CallBasicModuleInit();
            MailModule.MailMapper = mock.Object;

            Assert.Contains(nameof(ArgumentException), MailModule.SetDefaultValue(string.Empty, "some text"));
            Assert.Contains(nameof(ArgumentException), MailModule.SetDefaultValue("some text", string.Empty));
        }
示例#11
0
文件: MailUI.cs 项目: nmbswls/CSCI529
    public override void Init()
    {
        pCardMdl   = GameMain.GetInstance().GetModule <CardDeckModule>();
        pUIMgr     = GameMain.GetInstance().GetModule <IUIMgr>();
        pRoleMgr   = GameMain.GetInstance().GetModule <RoleModule>();
        pMailMgr   = GameMain.GetInstance().GetModule <MailModule>();
        pResLoader = GameMain.GetInstance().GetModule <ResLoader>();

        //load emails;
        pMailMgr.checkMailListLoaded();
    }
示例#12
0
        public MailModuleTests()
        {
            // https://colinmackay.scot/2007/06/16/unit-testing-a-static-class/
            Type            staticType = typeof(MailModule);
            ConstructorInfo ci         = staticType.TypeInitializer;

            object[] parameters = new object[0];
            ci.Invoke(null, parameters);

            MailModule.SetDebugOutput(true);
        }
示例#13
0
        public void RequestForCorrelationKeyReturnsErrorIfEntryIsNotFound()
        {
            this.CallBasicModuleInit();
            MailModule.SetDebugOutput(true);
            MailModule.SetRequestTimeout(10);
            var result = MailModule.GetMessageByCorrelationId("test");

            var errorResponse = JsonConvert.DeserializeObject <Response <Error> >(result);

            Assert.False(errorResponse.IsSuccess);
            Assert.Equal(typeof(KeyNotFoundException).Name, errorResponse.Content.ExceptionType);
        }
示例#14
0
 protected override void OnOpen(object param = null)
 {
     base.OnOpen();
     EventDelegate.Add(mReturnBtn.onClick, OnReturnBtnClick);
     EventDelegate.Add(mDeleteBtn.onClick, OnDeleteBtnClick);
     EventDelegate.Add(mPickBtn.onClick, OnPickBtnClick);
     OnCreateMailItem();
     mScrollBar.value    = 0.0f;
     itemScrollBar.value = 0.0f;
     NGUITools.SetActive(MailContent.gameObject, false);
     NGUITools.SetActive(mEmpty.gameObject, true);
     mGrid.Reposition();
     mGrid.repositionNow = true;
     MailModule module = ModuleManager.Instance.FindModule <MailModule>();
 }
示例#15
0
        private void button1_Click(object sender, EventArgs e)
        {
            var confirmResult = MessageBox.Show($@"Send Report To Distribution List?", @"Confirm Send",
                                                MessageBoxButtons.YesNo);

            if (confirmResult == DialogResult.No)
            {
                return;
            }
            distributionProcessTxt.Visible = true;
            distributionProcessTxt.Text   += @"Creating Report...";
            var attachment = ExportToExcel();

            distributionProcessTxt.Text += $@"Done!{Environment.NewLine}";
            if (!string.IsNullOrEmpty(attachment))
            {
                List <string> to;
                using (var db = new AlisDbContext())
                {
                    to = db.Distributions.Where(d => d.DistFlag).Select(d => d.EmailAddress).ToList();
                }
                if (to.Any())
                {
                    distributionProcessTxt.Text += @"Sending Mails To Distribution List...";
                    var body = $@"Hello, 
Attached the daily batches error report for:
Date: {DateTime.Today:D}
Environment: {Global.SavedCredentials.Name}
DB: {Global.SavedCredentials.Db}";
                    MailModule.SendEmailFromAccount(
                        new Microsoft.Office.Interop.Outlook.Application(),
                        $@"Daily Report - {Global.SavedCredentials.Name}, {Global.SavedCredentials.Db} - {
                                DateTime.Today
                            :D}",
                        to,
                        body,
                        "*****@*****.**",
                        attachment);
                    MessageBox.Show(@"Mail Sent!");
                }
                else
                {
                    distributionProcessTxt.Text +=
                        $@"Empty Distribution List, Mail Was Not Sent, Please Add Receipients On Settings.";
                }
            }
            distributionProcessTxt.Visible = false;
        }
示例#16
0
    protected override void OnClose()
    {
        base.OnClose();
        MailModule module = ModuleManager.Instance.FindModule <MailModule>();

        if (module.SelectedMail != null)
        {
            module.SelectedMail = null;
        }
        UIAtlasHelper.SetButtonImage(mDeleteBtn, "common:anniuhui", true);
        UIAtlasHelper.SetButtonImage(mPickBtn, "common:anniuhui", true);
        EventDelegate.Remove(mReturnBtn.onClick, OnReturnBtnClick);
        EventDelegate.Remove(mDeleteBtn.onClick, OnDeleteBtnClick);
        EventDelegate.Remove(mPickBtn.onClick, OnPickBtnClick);
        ObjectCommon.DestoryChildren(mGrid.gameObject);
    }
示例#17
0
    protected override void OnRespond(respond_load_mail respond, object userdata)
    {
        MailModule module = ModuleManager.Instance.FindModule <MailModule>();

        module.mMailsList.Clear();
        if (respond.mail_lists == null)
        {
            return;
        }
        if (respond.mail_lists.MailList == null)
        {
            return;
        }
        if (respond.mail_lists.MailList.Count <= 0)
        {
            return;
        }
        List <role_mail_s> rolemails = respond.mail_lists.MailList;

        for (int i = 0; i < respond.mail_lists.MailList.Count; ++i)
        {
            MailsData mail = new MailsData();
            mail.mailid     = respond.mail_lists.MailList[i].mailid;
            mail.content    = respond.mail_lists.MailList[i].content;
            mail.itemcnt    = respond.mail_lists.MailList[i].itemcnt;
            mail.sendname   = respond.mail_lists.MailList[i].sendname;
            mail.start_time = respond.mail_lists.MailList[i].start_time;
            mail.state      = respond.mail_lists.MailList[i].state;
            mail.title      = respond.mail_lists.MailList[i].title;
            if (respond.mail_lists.MailList[i].itemlist != null)
            {
                if (respond.mail_lists.MailList[i].itemlist.ItemList.Count > 0)
                {
                    for (int j = 0; j < respond.mail_lists.MailList[i].itemlist.ItemList.Count; ++j)
                    {
                        MailItemList mailItem = new MailItemList();
                        mailItem.resid = respond.mail_lists.MailList[i].itemlist.ItemList[j].resid;
                        mailItem.num   = respond.mail_lists.MailList[i].itemlist.ItemList[j].num;
                        mail.mItemsList.Add(mailItem);
                    }
                }
            }
            module.mMailsList.Add(mail);
        }
        WindowManager.Instance.OpenUI("mail");
    }
示例#18
0
    private bool OnCreateMailItem()
    {
        MailModule module = ModuleManager.Instance.FindModule <MailModule>();

        if (module.mMailsList.Count > 0)
        {
            for (int id = 0; id < module.mMailsList.Count; id++)
            {
                if (module.mMailsList[id].state != 0)
                {
                    mMailItemNode = MailItemManager.Instance.CreateMailItem(module.mMailsList[id]);
                }
            }
            return(true);
        }
        return(false);
    }
示例#19
0
        public void SendMailSucceeds()
        {
            this.CallBasicModuleInit();

            var response = MailModule.SendMail(
                MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_SENDER_MAIL),
                new[]
            {
                MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_RECIPIENT_MAIL_1),
                MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_RECIPIENT_MAIL_2),
                MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_RECIPIENT_MAIL_3),
            },
                "test",
                "test \\U+1F601",
                "<b>test</b> \\U+1F601");

            Assert.True(JsonConvert.DeserializeObject <Response <string> >(response).IsSuccess);
        }
示例#20
0
        private async Task <string> WaitForMessageStoreAsync(string correlationKey)
        {
            var messageStoreResult = string.Empty;

            for (int i = 0; i <= 10; i++)
            {
                messageStoreResult = MailModule.GetMessageByCorrelationId(correlationKey);
                if (messageStoreResult.Contains(nameof(KeyNotFoundException)))
                {
                    await Task.Delay(1000);
                }
                else
                {
                    break;
                }
            }

            return(messageStoreResult);
        }
示例#21
0
        public void SendMailWithAttachmentSucceeds()
        {
            this.CallBasicModuleInit();

            var response = MailModule.SendMail(
                MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_SENDER_MAIL),
                new[]
            {
                MBTHelper.ConvertMaskedSecretToRealValue(Secrets.MAIL_RECIPIENT_MAIL_1),
            },
                "test",
                "test",
                "<b>test</b>",
                new[]
            {
                "assets/favicon-32x32.png",
                "assets/fake_log.txt",
            });

            Assert.True(JsonConvert.DeserializeObject <Response <string> >(response).IsSuccess);
        }
示例#22
0
    protected override void OnRespond(respond_mail_state respond, object userdata)
    {
        if (respond.result == (int)ERROR_CODE.ERR_MAIL_PICK_OK)
        {
            MailModule module = ModuleManager.Instance.FindModule <MailModule>();
            if (module.SelectedMail != null)
            {
                module.SelectedMail.isPicked = true;
                UIWindow MailUI    = WindowManager.Instance.GetUI("mail");
                UIButton mPickBtn  = MailUI.FindComponent <UIButton>("background/mGetBtn");
                UIGrid   mItemGrid = MailUI.FindComponent <UIGrid>("Open/ItemGridBK/Scroll View/UIGrid");

                UIAtlasHelper.SetButtonImage(mPickBtn, "common:anniuhui", true);
                ObjectCommon.DestoryChildren(mItemGrid.gameObject);
                for (int i = 0; i < module.SelectedMail.mMaildata.mItemsList.Count; i++)
                {
                    PopTipManager.Instance.AddGetItemTip(module.SelectedMail.mMaildata.mItemsList[i].resid, module.SelectedMail.mMaildata.mItemsList[i].num);
                }
            }
        }
    }
示例#23
0
        public void SendMailSucceeds()
        {
            var mock = new Mock <IMailMapper>();

            mock.Setup(
                x => x.SendMail(
                    It.IsAny <string>(),
                    It.IsAny <IEnumerable <string> >(),
                    It.IsAny <string>(),
                    It.IsAny <string>(),
                    It.IsAny <string>(),
                    null)).Returns("ok");

            mock.Setup(
                x => x.SendMail(
                    It.IsAny <string>(),
                    It.IsAny <IEnumerable <string> >(),
                    It.IsAny <string>(),
                    It.IsAny <string>(),
                    It.IsAny <string>(),
                    It.IsAny <IEnumerable <string> >())).Returns("ok");

            this.CallBasicModuleInit();
            MailModule.MailMapper = mock.Object;

            Assert.True(MailModule.SendMail(
                            "test",
                            new[] { "test" },
                            "test",
                            "test",
                            "test") == "ok");

            Assert.True(MailModule.SendMail(
                            "test",
                            new[] { "test" },
                            "test",
                            "test",
                            "test",
                            new[] { "test" }) == "ok");
        }
示例#24
0
    public void OnDeleteItem()
    {
        if (NGUITools.GetActive(this.gameObject))
        {
            NGUITools.SetActive(this.gameObject, false);
        }
        UIWindow MailUI = WindowManager.Instance.GetUI("mail");
        UIGrid   mGrid  = MailUI.FindComponent <UIGrid>("ScrollView/UIGrid");

        mGrid.Reposition();
        mGrid.repositionNow = true;
        if (mMaildata.state != 0)
        {
            MailActionParam param = new MailActionParam();
            param.mailid = mMaildata.mailid;
            Net.Instance.DoAction((int)Message.MESSAGE_ID.ID_MSG_MAIL_STATE_DELETE, param);
        }
        MailModule module = ModuleManager.Instance.FindModule <MailModule>();

        module.SelectedMail = null;
        HideMailContent();
    }
示例#25
0
        public void InitializationValuesAreValidated()
        {
            var mock = new Mock <IMailMapper>();

            this.CallBasicModuleInit();
            MailModule.MailMapper = mock.Object;

            Assert.Contains("smtpServer", MailModule.Initialize(
                                string.Empty,
                                0,
                                string.Empty,
                                string.Empty,
                                0));
            Assert.Contains("smtpPort", MailModule.Initialize(
                                "test",
                                0,
                                string.Empty,
                                string.Empty,
                                0));
            Assert.Contains("smtpUserName", MailModule.Initialize(
                                "test",
                                1,
                                string.Empty,
                                string.Empty,
                                0));
            Assert.Contains("smtpPassword", MailModule.Initialize(
                                "test",
                                1,
                                "test",
                                string.Empty,
                                0));
            Assert.Contains("timeout", MailModule.Initialize(
                                "test",
                                1,
                                "test",
                                "test",
                                0));
        }
示例#26
0
        public void SendMailInputsAreValidated()
        {
            var mock = new Mock <IMailMapper>();

            this.CallBasicModuleInit();
            MailModule.MailMapper = mock.Object;

            Assert.Contains("sender", MailModule.SendMail(
                                string.Empty,
                                new[] { string.Empty },
                                string.Empty,
                                string.Empty,
                                string.Empty));
            Assert.Contains("recipients", MailModule.SendMail(
                                "test",
                                new[] { string.Empty },
                                string.Empty,
                                string.Empty,
                                string.Empty));
            Assert.Contains("subject", MailModule.SendMail(
                                "test",
                                new[] { "test" },
                                string.Empty,
                                string.Empty,
                                string.Empty));
            Assert.Contains("textBody", MailModule.SendMail(
                                "test",
                                new[] { "test" },
                                "test",
                                string.Empty,
                                string.Empty));
            Assert.Contains("htmlBody", MailModule.SendMail(
                                "test",
                                new[] { "test" },
                                "test",
                                string.Empty,
                                string.Empty));
        }
示例#27
0
        internal static async Task CorpSearch(ICommandContext context, string name)
        {
            var reason       = LogCat.CorpSearch.ToString();
            var corpIDLookup = await APIHelper.ESIAPI.SearchCorporationId(reason, name);

            if (corpIDLookup == null || corpIDLookup.corporation == null)
            {
                await APIHelper.DiscordAPI.ReplyMessageAsync(context, LM.Get("corpNotFound"));

                return;
            }
            var corporationData = await APIHelper.ESIAPI.GetCorporationData(reason, corpIDLookup.corporation[0]);

            var allianceData = await APIHelper.ESIAPI.GetAllianceData(reason, corporationData.alliance_id);

            var ceo = await APIHelper.ESIAPI.GetCharacterData(reason, corporationData.ceo_id);

            var alliance       = allianceData?.name ?? LM.Get("None");
            var allianceTicker = allianceData != null ? $"[{allianceData?.ticker}]" : "";

            var lite = await APIHelper.ZKillAPI.GetLiteCorporationData(corpIDLookup.corporation[0]);

            var zkillContent = await APIHelper.ZKillAPI.GetCorporationData(corpIDLookup.corporation[0], !lite.hasSupers);

            var textNames  = $"{LM.Get("Corporation")}:\n{LM.Get("Alliance")}:\n{LM.Get("CEO")}\n{LM.Get("Pilots")}";
            var textValues = $"{corporationData.name}[{corporationData.ticker}]\n{alliance}{allianceTicker}\n[{ceo.name}](https://zkillboard.com/character/{corporationData.ceo_id}/)\n{corporationData.member_count}";

            var supersCount   = zkillContent == null ? "???" : (zkillContent.hasSupers ? zkillContent.supers?.titans?.data?.Length.ToString() ?? "0" : "0");
            var titansCount   = zkillContent == null ? "???" : (zkillContent.hasSupers ? zkillContent.supers?.supercarriers?.data?.Length.ToString() ?? "0" : "0");
            var system        = zkillContent?.topLists?.FirstOrDefault(a => a.type == "solarSystem")?.values?.FirstOrDefault()?.solarSystemName ?? "???";
            var textPvpNames  = $"{LM.Get("Dangerous")}:\n{LM.Get("FleetCHance2")}:\n{LM.Get("corpSoloKills")}\n{LM.Get("corpTotalKills")}\n{LM.Get("corpKnownSupers")}\n{LM.Get("corpActiveSystem")}";
            var textPvpValues = $"{zkillContent?.dangerRatio ?? 0}%\n{zkillContent?.gangRatio ?? 0}%\n{zkillContent?.soloKills ?? 0}\n{zkillContent?.shipsDestroyed ?? 0}\n{supersCount}/{titansCount}\n{system}";


            var sList = await MailModule.PrepareBodyMessage(corporationData.description);

            var desc = sList[0];

            if (desc.Length > 1024)
            {
                desc = desc.Substring(0, 1023);
            }
            desc = string.IsNullOrWhiteSpace(desc) ? "-" : desc;
            var builder = new EmbedBuilder()
                          .WithDescription(
                $"[zKillboard](https://zkillboard.com/corporation/{corpIDLookup.corporation[0]}) / [EVEWho](https://evewho.com/corp/{HttpUtility.UrlEncode(corporationData.name)})")
                          .WithColor(new Color(0x4286F4))
                          .WithThumbnailUrl($"https://image.eveonline.com/Corporation/{corpIDLookup.corporation[0]}_64.png")
                          .WithAuthor(author =>
            {
                author
                .WithName($"{corporationData.name}");
            })
                          .AddField(LM.Get("corpGeneralInfo"), textNames, true)
                          .AddField("-", textValues, true)
                          .AddField(LM.Get("corpPvpInfo"), textPvpNames, true)
                          .AddField("-", textPvpValues, true)
                          .AddField(LM.Get("corpDescription"), desc)
            ;

            var embed = builder.Build();


            await APIHelper.DiscordAPI.ReplyMessageAsync(context, " ", embed);

            await LogHelper.LogInfo($"Sending {context.Message.Author} Corporation Info Request", LogCat.CorpSearch);
        }
示例#28
0
        private async Task <bool> OnRequestReceived(HttpListenerRequestEventArgs context)
        {
            if (!Settings.Config.ModuleHRM)
            {
                return(false);
            }

            var request  = context.Request;
            var response = context.Response;

            try
            {
                var extPort = Settings.WebServerModule.WebExternalPort;
                var port    = Settings.WebServerModule.WebListenPort;

                if (request.Url.LocalPath == "/callback.php" || request.Url.LocalPath == $"{extPort}/callback.php" || request.Url.LocalPath == $"{port}/callback.php")
                {
                    var clientID = Settings.WebServerModule.CcpAppClientId;
                    var secret   = Settings.WebServerModule.CcpAppSecret;

                    var prms  = request.Url.Query.TrimStart('?').Split('&');
                    var code  = prms[0].Split('=')[1];
                    var state = prms.Length > 1 ? prms[1].Split('=')[1] : null;

                    //not an HRM query
                    if (state != "matahari")
                    {
                        return(false);
                    }

                    //have code
                    var result = await WebAuthModule.GetCharacterIdFromCode(code, clientID, secret);

                    var characterId = result == null ? 0 : Convert.ToInt32(result[0]);


                    if (result == null || await CheckAccess(characterId) == false)
                    {
                        await WebServerModule.WriteResponce(WebServerModule.GetAccessDeniedPage("HRM Module", LM.Get("accessDenied")), response);

                        return(true);
                    }

                    var authCode = WebAuthModule.GetUniqID();
                    await SQLHelper.SQLiteDataInsertOrUpdate("hrmAuth", new Dictionary <string, object> {
                        { "id", result[0] }, { "time", DateTime.Now }, { "code", authCode }
                    });

                    //redirect to timers
                    await response.RedirectAsync(new Uri(WebServerModule.GetHRMMainURL(authCode)));

                    return(true);
                }

                if (request.Url.LocalPath.StartsWith("/hrm.php") || request.Url.LocalPath.StartsWith($"{extPort}/hrm.php") || request.Url.LocalPath.StartsWith($"{port}/hrm.php"))
                {
                    if (string.IsNullOrWhiteSpace(request.Url.Query))
                    {
                        //redirect to auth
                        await response.RedirectAsync(new Uri(WebServerModule.GetHRMAuthURL()));

                        return(true);
                    }

                    var prms = request.Url.Query.TrimStart('?').Split('&');
                    if (prms.Length < 3)
                    {
                        await WebServerModule.WriteResponce(LM.Get("AccessDenied"), response);

                        return(true);
                    }

                    var data     = prms.FirstOrDefault(a => a.StartsWith("data")).Split('=')[1];
                    var authCode = prms.FirstOrDefault(a => a.StartsWith("id")).Split('=')[1];
                    var state    = prms.FirstOrDefault(a => a.StartsWith("state")).Split('=')[1];
                    var page     = Convert.ToInt32(prms.FirstOrDefault(a => a.StartsWith("page"))?.Split('=')[1] ?? "0");

                    if (state != "matahari")
                    {
                        if (IsNoRedirect(data))
                        {
                            await WebServerModule.WriteResponce(LM.Get("pleaseReauth"), response);
                        }
                        else
                        {
                            await response.RedirectAsync(new Uri(WebServerModule.GetWebSiteUrl()));
                        }
                        return(true);
                    }

                    var chId = await SQLHelper.SQLiteDataQuery <string>("hrmAuth", "id", "code", authCode);

                    var rChar = string.IsNullOrEmpty(chId) ? null : await APIHelper.ESIAPI.GetCharacterData(Reason, chId, true);

                    if (rChar == null)
                    {
                        if (IsNoRedirect(data))
                        {
                            await WebServerModule.WriteResponce(LM.Get("pleaseReauth"), response);
                        }
                        else
                        {
                            await response.RedirectAsync(new Uri(WebServerModule.GetWebSiteUrl()));
                        }
                        return(true);
                    }

                    var characterId = Convert.ToInt32(chId);


                    //have charId - had to check it
                    //check in db
                    var timeout = Settings.HRMModule.AuthTimeoutInMinutes;
                    if (timeout != 0)
                    {
                        var result = await SQLHelper.SQLiteDataQuery <string>("hrmAuth", "time", "id", chId);

                        if (result == null || (DateTime.Now - DateTime.Parse(result)).TotalMinutes > timeout)
                        {
                            if (IsNoRedirect(data))
                            {
                                await WebServerModule.WriteResponce(LM.Get("pleaseReauth"), response);
                            }
                            //redirect to auth
                            else
                            {
                                await response.RedirectAsync(new Uri(WebServerModule.GetHRMAuthURL()));
                            }
                            return(true);
                        }
                        //prolong session
                        if (data == "0" || data.StartsWith("inspect"))
                        {
                            await SQLHelper.SQLiteDataUpdate("hrmAuth", "time", DateTime.Now, "code", authCode);
                        }
                    }

                    if (await CheckAccess(characterId) == false)
                    {
                        if (IsNoRedirect(data))
                        {
                            await WebServerModule.WriteResponce(LM.Get("pleaseReauth"), response);
                        }
                        else
                        {
                            await WebServerModule.WriteResponce(WebServerModule.GetAccessDeniedPage("HRM Module", LM.Get("accessDenied")), response);
                        }
                        return(true);
                    }

                    switch (data)
                    {
                    //main page
                    case "0":
                    {
                        var membersHtml = await GenerateMembersListHtml(authCode);

                        var awaitingHtml = await GenerateAwaitingListHtml(authCode);

                        var text = File.ReadAllText(SettingsManager.FileTemplateHRM_Main).Replace("{header}", LM.Get("hrmTemplateHeader"))
                                   .Replace("{loggedInAs}", LM.Get("loggedInAs", rChar.name))
                                   .Replace("{charId}", characterId.ToString())
                                   .Replace("{LogOutUrl}", WebServerModule.GetWebSiteUrl())
                                   .Replace("{LogOut}", LM.Get("LogOut"))
                                   .Replace("{locale}", LM.Locale)
                                   .Replace("{membersContent}", membersHtml)
                                   .Replace("{awaitingContent}", awaitingHtml)
                                   .Replace("{membersHeader}", LM.Get("hrmMembersHeader"))
                                   .Replace("{awaitingHeader}", LM.Get("hrmAwaitingHeader"))
                        ;
                        await WebServerModule.WriteResponce(text, response);
                    }
                    break;

                    case var s when s.StartsWith("inspect"):
                    {
                        try
                        {
                            if (!int.TryParse(data.Replace("inspect", ""), out var inspectCharId))
                            {
                                await response.RedirectAsync(new Uri(WebServerModule.GetHRMAuthURL()));

                                return(true);
                            }

                            var iChar = await APIHelper.ESIAPI.GetCharacterData(Reason, inspectCharId, true);

                            var iCorp = await APIHelper.ESIAPI.GetCorporationData(Reason, iChar.corporation_id, true);

                            var iAlly = iCorp.alliance_id.HasValue ? await APIHelper.ESIAPI.GetAllianceData(Reason, iCorp.alliance_id.Value, true) : null;

                            var userTokenEntity = await SQLHelper.UserTokensGetEntry(inspectCharId);

                            var hasToken = userTokenEntity != null;

                            var corpHistoryHtml = await GenerateCorpHistory(inspectCharId);

                            var text = File.ReadAllText(SettingsManager.FileTemplateHRM_Inspect).Replace("{header}", LM.Get("hrmInspectingHeader", iChar.name))
                                       .Replace("{loggedInAs}", LM.Get("loggedInAs", rChar.name))
                                       .Replace("{charId}", characterId.ToString())
                                       .Replace("{LogOutUrl}", WebServerModule.GetWebSiteUrl())
                                       .Replace("{LogOut}", LM.Get("LogOut"))
                                       .Replace("{locale}", LM.Locale)
                                       .Replace("{imgCorp}", $"https://image.eveonline.com/Corporation/{iChar.corporation_id}_64.png")
                                       .Replace("{imgAlly}", $"https://image.eveonline.com/Alliance/{iCorp.alliance_id ?? 0}_64.png")
                                       .Replace("{imgChar}", $"https://image.eveonline.com/Character/{inspectCharId}_256.jpg")
                                       .Replace("{zkillChar}", $"http://www.zkillboard.com/character/{inspectCharId}")
                                       .Replace("{zkillCorp}", $"http://www.zkillboard.com/corporation/{iChar.corporation_id}")
                                       .Replace("{zkillAlly}", $"http://www.zkillboard.com/alliance/{iCorp.alliance_id ?? 0}")
                                       .Replace("{charName}", iChar.name)
                                       .Replace("{charCorpName}", $"{iCorp.name} [{iCorp.ticker}]")
                                       .Replace("{charAllyName}", $"{iAlly?.name} [{iAlly?.ticker}]")
                                       .Replace("{charBirthday}", $"{iChar.birthday.ToString(Settings.Config.ShortTimeFormat)}")
                                       .Replace("{corpHistoryTable}", corpHistoryHtml)
                                       .Replace("{disableAlly}", iAlly == null ? "d-none" : null)
                                       .Replace("{Close}", LM.Get("Close"))
                                       .Replace("{secStatus}", iChar.security_status.HasValue ? Math.Round(iChar.security_status.Value, 1).ToString("0.0") : null)
                                       .Replace("{mailHeader}", LM.Get("mailHeader"))
                                       .Replace("{backUrl}", WebServerModule.GetHRMMainURL(authCode))
                                       .Replace("{Back}", LM.Get("Back"))

                                       .Replace("{hrmInspectChar}", LM.Get("hrmInspectChar"))
                                       .Replace("{hrmInspectCorp}", LM.Get("hrmInspectCorp"))
                                       .Replace("{hrmInspectAlly}", LM.Get("hrmInspectAlly"))
                                       .Replace("{hrmInspectSS}", LM.Get("hrmInspectSS"))
                                       .Replace("{hrmInspectBirth}", LM.Get("hrmInspectBirth"))


                                       .Replace("{tabLastYearStats}", LM.Get("hrmTabLastYearStats"))
                                       .Replace("{tabJournal}", LM.Get("hrmTabJournal"))
                                       .Replace("{tabTransfers}", LM.Get("hrmTabTransfers"))
                                       .Replace("{tabContracts}", LM.Get("hrmTabContracts"))
                                       .Replace("{tabMail}", LM.Get("hrmTabMail"))
                                       .Replace("{tabCorpHistory}", LM.Get("hrmTabCorpHistory"))
                                       .Replace("{tabContacts}", LM.Get("hrmTabContacts"))

                                       .Replace("{mailListUrl}", WebServerModule.GetHRM_AjaxMailListURL(inspectCharId, authCode))
                                       .Replace("{transactListUrl}", WebServerModule.GetHRM_AjaxTransactListURL(inspectCharId, authCode))
                                       .Replace("{journalListUrl}", WebServerModule.GetHRM_AjaxJournalListURL(inspectCharId, authCode))
                                       .Replace("{lysListUrl}", WebServerModule.GetHRM_AjaxLysListURL(inspectCharId, authCode))
                                       .Replace("{contractsListUrl}", WebServerModule.GetHRM_AjaxContractsListURL(inspectCharId, authCode))
                                       .Replace("{contactsListUrl}", WebServerModule.GetHRM_AjaxContactsListURL(inspectCharId, authCode))

                                       .Replace("{disableMail}", SettingsManager.HasReadMailScope(userTokenEntity.PermissionsList) ? null : "d-none")
                                       .Replace("{allowMailBool}", SettingsManager.HasReadMailScope(userTokenEntity.PermissionsList) ? "true" : "false")
                                       .Replace("{disableWallet}", SettingsManager.HasCharWalletScope(userTokenEntity.PermissionsList) ? null : "d-none")
                                       .Replace("{allowWalletBool}", SettingsManager.HasCharWalletScope(userTokenEntity.PermissionsList) ? "true" : "false")
                                       .Replace("{disableCharStats}", SettingsManager.HasCharWalletScope(userTokenEntity.PermissionsList) ? null : "d-none")
                                       .Replace("{allowCharStatsBool}", SettingsManager.HasCharWalletScope(userTokenEntity.PermissionsList) ? "true" : "false")
                                       .Replace("{disableContracts}", SettingsManager.HasCharWalletScope(userTokenEntity.PermissionsList) ? null : "d-none")
                                       .Replace("{allowContractsBool}", SettingsManager.HasCharWalletScope(userTokenEntity.PermissionsList) ? "true" : "false")
                                       .Replace("{disableContacts}", SettingsManager.HasCharContactsScope(userTokenEntity.PermissionsList) ? null : "d-none")
                                       .Replace("{allowContactsBool}", SettingsManager.HasCharContactsScope(userTokenEntity.PermissionsList) ? "true" : "false")
                                       .Replace("{disableSP}", SettingsManager.HasCharSkillsScope(userTokenEntity.PermissionsList) ? null : "d-none")
                            ;

                            //private info
                            if (hasToken)
                            {
                                var token = await APIHelper.ESIAPI.RefreshToken(userTokenEntity.RefreshToken, Settings.WebServerModule.CcpAppClientId,
                                                                                Settings.WebServerModule.CcpAppSecret);

                                if (SettingsManager.HasReadMailScope(userTokenEntity.PermissionsList))
                                {
                                    var total = await GetMailPagesCount(token, inspectCharId);

                                    text = text.Replace("totalMailPages!!", total.ToString());
                                }

                                if (SettingsManager.HasCharWalletScope(userTokenEntity.PermissionsList))
                                {
                                    var total = await GetCharTransactPagesCount(token, inspectCharId);

                                    text  = text.Replace("totalTransactPages!!", total.ToString());
                                    total = await GetCharJournalPagesCount(token, inspectCharId);

                                    text = text.Replace("totalJournalPages!!", total.ToString());
                                }

                                if (SettingsManager.HasCharStatsScope(userTokenEntity.PermissionsList))
                                {
                                    var total = GetCharJournalPagesCount();
                                    text = text.Replace("totalLysPages!!", total.ToString());
                                }

                                if (SettingsManager.HasCharContractsScope(userTokenEntity.PermissionsList))
                                {
                                    var total = await GetCharContractsPagesCount(token, inspectCharId);

                                    text = text.Replace("totalcontractsPages!!", total.ToString());
                                }
                                if (SettingsManager.HasCharContactsScope(userTokenEntity.PermissionsList))
                                {
                                    var total = await GetCharContactsPagesCount(token, inspectCharId);

                                    text = text.Replace("totalcontactsPages!!", total.ToString());
                                }

                                if (SettingsManager.HasCharSkillsScope(userTokenEntity.PermissionsList))
                                {
                                    var skills = await APIHelper.ESIAPI.GetCharSkills(Reason, inspectCharId, token);

                                    text = text.Replace("{totalSP}", skills.total_sp.ToString("N0"));
                                }
                            }

                            text = text.Replace("totalMailPages!!", "0");
                            text = text.Replace("totalTransactPages!!", "0");
                            text = text.Replace("totalJournalPages!!", "0");
                            text = text.Replace("totalLysPages!!", "0");
                            text = text.Replace("totalcontractsPages!!", "0");
                            text = text.Replace("totalcontactsPages!!", "0");
                            text = text.Replace("{totalSP}", "0");


                            await WebServerModule.WriteResponce(text, response);
                        }
                        catch (Exception ex)
                        {
                            await LogHelper.LogEx("Inspection Error", ex, Category);

                            await WebServerModule.WriteResponce(WebServerModule.GetAccessDeniedPage("HRM Module", LM.Get("accessDenied")), response);

                            return(true);
                        }
                    }
                    break;

                    case var s when s.StartsWith("maillist"):
                    {
                        var values = data.Replace("maillist", "");
                        if (!int.TryParse(values, out var inspectCharId))
                        {
                            return(true);
                        }
                        var userTokenEntity = await SQLHelper.UserTokensGetEntry(inspectCharId);

                        var hasToken = userTokenEntity != null;
                        if (hasToken && page > 0)
                        {
                            var token = await APIHelper.ESIAPI.RefreshToken(userTokenEntity.RefreshToken, Settings.WebServerModule.CcpAppClientId,
                                                                            Settings.WebServerModule.CcpAppSecret);

                            var mailHtml = await GenerateMailHtml(token, inspectCharId, authCode, page);

                            var text = File.ReadAllText(SettingsManager.FileTemplateHRM_Table)
                                       .Replace("{table}", mailHtml);

                            await WebServerModule.WriteResponce(text, response);
                        }
                    }
                    break;

                    case var s when s.StartsWith("transactlist"):
                    {
                        var values = data.Replace("transactlist", "");
                        if (!int.TryParse(values, out var inspectCharId))
                        {
                            return(true);
                        }
                        var userTokenEntity = await SQLHelper.UserTokensGetEntry(inspectCharId);

                        var hasToken = userTokenEntity != null;
                        if (hasToken && page > 0)
                        {
                            var token = await APIHelper.ESIAPI.RefreshToken(userTokenEntity.RefreshToken, Settings.WebServerModule.CcpAppClientId,
                                                                            Settings.WebServerModule.CcpAppSecret);

                            var html = await GenerateTransactionsHtml(token, inspectCharId, page);

                            var text = File.ReadAllText(SettingsManager.FileTemplateHRM_Table)
                                       .Replace("{table}", html);

                            await WebServerModule.WriteResponce(text, response);
                        }
                    }
                    break;

                    case var s when s.StartsWith("journallist"):
                    {
                        var values = data.Replace("journallist", "");
                        if (!int.TryParse(values, out var inspectCharId))
                        {
                            return(true);
                        }
                        var userTokenEntity = await SQLHelper.UserTokensGetEntry(inspectCharId);

                        var hasToken = userTokenEntity != null;
                        if (hasToken && page > 0)
                        {
                            var token = await APIHelper.ESIAPI.RefreshToken(userTokenEntity.RefreshToken, Settings.WebServerModule.CcpAppClientId,
                                                                            Settings.WebServerModule.CcpAppSecret);

                            var html = await GenerateJournalHtml(token, inspectCharId, page);

                            var text = File.ReadAllText(SettingsManager.FileTemplateHRM_Table)
                                       .Replace("{table}", html);

                            await WebServerModule.WriteResponce(text, response);
                        }
                    }
                    break;

                    case var s when s.StartsWith("contracts"):
                    {
                        var values = data.Replace("contracts", "");
                        if (!int.TryParse(values, out var inspectCharId))
                        {
                            return(true);
                        }
                        var userTokenEntity = await SQLHelper.UserTokensGetEntry(inspectCharId);

                        var hasToken = userTokenEntity != null;
                        if (hasToken && page > 0)
                        {
                            var token = await APIHelper.ESIAPI.RefreshToken(userTokenEntity.RefreshToken, Settings.WebServerModule.CcpAppClientId,
                                                                            Settings.WebServerModule.CcpAppSecret);

                            var html = await GenerateContractsHtml(token, inspectCharId, page);

                            var text = File.ReadAllText(SettingsManager.FileTemplateHRM_Table)
                                       .Replace("{table}", html);

                            await WebServerModule.WriteResponce(text, response);
                        }
                    }
                    break;

                    case var s when s.StartsWith("contacts"):
                    {
                        var values = data.Replace("contacts", "");
                        if (!int.TryParse(values, out var inspectCharId))
                        {
                            return(true);
                        }
                        var userTokenEntity = await SQLHelper.UserTokensGetEntry(inspectCharId);

                        var hasToken = userTokenEntity != null;
                        if (hasToken && page > 0)
                        {
                            var token = await APIHelper.ESIAPI.RefreshToken(userTokenEntity.RefreshToken, Settings.WebServerModule.CcpAppClientId,
                                                                            Settings.WebServerModule.CcpAppSecret);

                            var html = await GenerateContactsHtml(token, inspectCharId, page);

                            var text = File.ReadAllText(SettingsManager.FileTemplateHRM_Table)
                                       .Replace("{table}", html);

                            await WebServerModule.WriteResponce(text, response);
                        }
                    }
                    break;

                    case var s when s.StartsWith("lys"):
                    {
                        var values = data.Replace("lys", "");
                        if (!int.TryParse(values, out var inspectCharId))
                        {
                            return(true);
                        }
                        var userTokenEntity = await SQLHelper.UserTokensGetEntry(inspectCharId);

                        var hasToken = userTokenEntity != null;
                        if (hasToken && page > 0)
                        {
                            var token = await APIHelper.ESIAPI.RefreshToken(userTokenEntity.RefreshToken, Settings.WebServerModule.CcpAppClientId,
                                                                            Settings.WebServerModule.CcpAppSecret);

                            var html = await GenerateLysHtml(token, inspectCharId, page);

                            var text = File.ReadAllText(SettingsManager.FileTemplateHRM_Table)
                                       .Replace("{table}", html);

                            await WebServerModule.WriteResponce(text, response);
                        }
                    }
                    break;

                    case var s when s.StartsWith("mail"):
                    {
                        try
                        {
                            var values = data.Replace("mail", "").Split('_');
                            if (!int.TryParse(values[0], out var mailBodyId))
                            {
                                return(true);
                            }
                            var inspectCharacterId = Convert.ToInt32(values[1]);
                            var userTokenEntity    = await SQLHelper.UserTokensGetEntry(inspectCharacterId);

                            var token = await APIHelper.ESIAPI.RefreshToken(userTokenEntity.RefreshToken, Settings.WebServerModule.CcpAppClientId,
                                                                            Settings.WebServerModule.CcpAppSecret);

                            var mail = await APIHelper.ESIAPI.GetMail(Reason, inspectCharacterId, token, mailBodyId);

                            if (mail != null)
                            {
                                var from = await APIHelper.ESIAPI.GetCharacterData(Reason, mail.@from);

                                var corpHistory = await APIHelper.ESIAPI.GetCharCorpHistory(Reason, mail.@from);

                                var date     = DateTime.Parse(mail.timestamp);
                                var corp     = corpHistory.OrderByDescending(a => a.Date).FirstOrDefault(a => date >= a.Date);
                                var fromCorp = corp == null ? null : await APIHelper.ESIAPI.GetCorporationData(Reason, corp.corporation_id);

                                var corpText = fromCorp == null ? null : $" - {fromCorp.name}[{fromCorp.ticker}]";
                                //var msg = Regex.Replace(mail.body, @"<font size\s*=\s*"".+?""", @"<font ");
                                var msg = await MailModule.PrepareBodyMessage(mail.body);

                                var text = File.ReadAllText(SettingsManager.FileTemplateHRM_MailBody)
                                           .Replace("{DateHeader}", LM.Get("mailDateHeader"))
                                           .Replace("{SubjectHeader}", LM.Get("mailSubjectHeader"))
                                           .Replace("{FromHeader}", LM.Get("mailFromHeader"))
                                           .Replace("{TextHeader}", LM.Get("mailTextHeader"))
                                           .Replace("{mailDate}", date.ToString(Settings.Config.ShortTimeFormat))
                                           .Replace("{mailSubject}", mail.subject)
                                           .Replace("{maiFrom}", $"{@from?.name}{corpText}")
                                           .Replace("{mailText}", msg)
                                ;

                                await WebServerModule.WriteResponce(text, response);
                            }
                        }
                        catch (Exception ex)
                        {
                            await LogHelper.LogEx("Inspection Mail Body Error", ex, Category);

                            if (IsNoRedirect(data))
                            {
                                await WebServerModule.WriteResponce(LM.Get("pleaseReauth"), response);
                            }
                            else
                            {
                                await WebServerModule.WriteResponce(WebServerModule.GetAccessDeniedPage("HRM Module", LM.Get("accessDenied")), response);
                            }
                            return(true);
                        }
                    }
                    break;
                    }

                    return(true);
                }
            }
            catch (Exception ex)
            {
                await response.WriteContentAsync("ERROR: Server error");

                await LogHelper.LogEx(ex.Message, ex, Category);
            }

            return(false);
        }
示例#29
0
        /// <summary>
        /// Process Ip.
        /// </summary>
        /// <param name="source"></param>
        /// <param name="e"></param>
        private static void ProcessIp(object source, ElapsedEventArgs e)
        {
            try
            {
                // Send any unsent mail.
                for (var i = 0; i < MailMessages.Count; i++)
                {
                    var message = MailMessages[i];
                    if (MailModule.Send(MailModule.SmtpHost, MailModule.SmtpPort, message, MailModule.EnableSsl).Count == 0)
                    {
                        MailMessages.Remove(message);
                    }
                }

                // Create a web client to gather data.
                using (var wc = new WebClient())
                {
                    // Call out to the Service Host for the external ip being used by the current network.
                    WebResponse = Support.GetJsonContent <WebResponse>(wc.DownloadString(MailModule.ServiceHost));

                    // If the response is null or empty send an email to the admin(s) to check for errors.
                    if (WebResponse == null)
                    {
                        File.AppendAllText(LogFilePath + $@"{ DateTime.Now:(yyyy-MM-dd)}.log", $@"{DateTime.Now} - An error occured: The web response from {MailModule.ServiceHost} was '{null}'.{Environment.NewLine}{Environment.NewLine}");

                        // Prepare mail message to send.
                        var message = new MailMessage(MailModule.EmailFrom, MailModule.EmailTo, "What Is My Ip - Error!", $"External IP Web Response was '{null}'.");

                        // Send mail.
                        // Flag service to resend if an error occured when sending mail.
                        ResendToAddresses = MailModule.Send(MailModule.SmtpHost, MailModule.SmtpPort, message, MailModule.EnableSsl);

                        // Queue previously unsent mail.
                        if (ResendToAddresses.Count > 0)
                        {
                            MailMessages.Add(message);
                        }
                        else
                        {
                            // Write to logs.
                            File.AppendAllText(LogFilePath + $@"{DateTime.Now:(yyyy-MM-dd)}.log", $@"{DateTime.Now} - Email sent out to: {MailModule.EmailTo}{Environment.NewLine}");
                        }

                        foreach (var address in ResendToAddresses)
                        {
                            File.AppendAllText(LogFilePath + $@"{DateTime.Now:(yyyy-MM-dd)}.log", $@"{DateTime.Now} - Email failed to send out to: {address}{Environment.NewLine}");
                        }

                        // Clear Addresses.
                        ResendToAddresses.Clear();
                    }
                }

                // Check for a response.
                if (WebResponse != null)
                {
                    // If current ip is null, which should not happen unless the registry entry is not set properly,
                    // then parse the web response and update the registry.
                    if (CurrentExternalIp == null)
                    {
                        CurrentExternalIp = NewExternalIpAddress = IPAddress.Parse(WebResponse.IpAddress);

                        // Push to registry.
                        UpdateCurrentExternalIpRegistryEntry();

                        // TODO: Saving in not working.
                        //SaveSettings();
                    }
                    else
                    {
                        NewExternalIpAddress = IPAddress.Parse(WebResponse.IpAddress);
                    }

                    // Process new ip, if changed.
                    if (!CurrentExternalIp.Equals(NewExternalIpAddress))
                    {
                        CurrentExternalIp = NewExternalIpAddress;

                        // Push to registry.
                        UpdateCurrentExternalIpRegistryEntry();

                        // TODO: Saving in not working.
                        //SaveSettings();

                        if (ModulesController.IsIisEnabled)
                        {
                            // Update IIS FTP firewall settings.
                            IISModule.SetFtpExternalFirewallIp(NewExternalIpAddress);
                        }

                        // Prepare mail message to send.
                        var message = new MailMessage(MailModule.EmailFrom, MailModule.EmailTo, "What Is My Ip - IP Address Change!", $"External IP changed to: {WebResponse.IpAddress}");

                        // Send Mail.
                        // Flag service to resend if an error occured when sending mail.
                        ResendToAddresses = MailModule.Send(MailModule.SmtpHost, MailModule.SmtpPort, message, MailModule.EnableSsl);

                        // Queue previously unsent mail.
                        if (ResendToAddresses.Count > 0)
                        {
                            MailMessages.Add(message);
                        }
                        else
                        {
                            // Write to logs.
                            File.AppendAllText(LogFilePath + $@"{DateTime.Now:(yyyy-MM-dd)}.log", $@"{DateTime.Now} - Email sent out to: {MailModule.EmailTo}{Environment.NewLine}");
                        }

                        foreach (var address in ResendToAddresses)
                        {
                            File.AppendAllText(LogFilePath + $@"{DateTime.Now:(yyyy-MM-dd)}.log", $@"{DateTime.Now} - Email failed to send out to: {address}{Environment.NewLine}");
                        }

                        // Clear Addresses.
                        ResendToAddresses.Clear();
                    }

                    WebResponse = null;
                }
            }
            catch (Exception ex)
            {
                // Output exception details.
                if (!string.IsNullOrWhiteSpace(LogFilePath))
                {
                    File.AppendAllText(LogFilePath + $@"{ DateTime.Now:(yyyy-MM-dd)}.log", $@"{DateTime.Now} - An error occured: {ex}{Environment.NewLine}{Environment.NewLine}");
                }
                else
                {
                    throw;
                }
            }
        }