private void LoadSettings()
        {
            subscriptionGuid = WebUtils.ParseGuidFromQueryString("s", subscriptionGuid);
            if (subscriptionGuid != Guid.Empty)
            {
                subscription = subscriptions.Fetch(subscriptionGuid);
                if ((subscription != null) && (subscription.SiteGuid == siteSettings.SiteGuid))
                {
                    subscriptions.Verify(subscription.SubscribeGuid, true, Guid.Empty);
                    if (subscription.UserGuid == Guid.Empty)
                    {
                        SiteUser user = SiteUser.GetByEmail(siteSettings, subscription.EmailAddress);
                        if (user != null)
                        {
                            subscription.UserGuid = user.UserGuid;
                            subscriptions.Save(subscription);
                        }
                    }

                    LetterInfo.UpdateSubscriberCount(subscription.LetterInfoGuid);
                }
                else
                {
                    subscription = null;
                }
            }
        }
示例#2
0
        private void DoUnsubscribe()
        {
            if (subscriptionGuid != Guid.Empty)
            {
                LetterSubscriber s = subscriptions.Fetch(subscriptionGuid);
                if (s == null)
                {
                    ShowNotFoundMessge();
                    return;
                }
                subscriptions.Delete(s);
                LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);
                lblUnsubscribe.Text = Resource.NewsletterUnsubscribeSuccess;

                btnUnsubscribeConfirm.Visible = false;
                lblUnsubscribe.Visible        = true;
                return;
            }

            LetterInfo letterInfo = new LetterInfo(letterInfoGuid);

            if (letterInfo.LetterInfoGuid == Guid.Empty)
            {
                ShowNotFoundMessge();
                return;
            }

            List <LetterSubscriber> userSubscriptions = subscriptions.GetListByUser(siteSettings.SiteGuid, userGuid);

            bool unsubscribed = false;

            foreach (LetterSubscriber s in userSubscriptions)
            {
                if (s.LetterInfoGuid == letterInfoGuid)
                {
                    subscriptions.Delete(s);
                    unsubscribed = true;
                    LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);
                }
            }

            if (unsubscribed)
            {
                lblUnsubscribe.Text = string.Format(CultureInfo.InvariantCulture,
                                                    Resource.NewsletterUnsubscribeSuccessFormatString,
                                                    letterInfo.Title);

                btnUnsubscribeConfirm.Visible = false;
                lblUnsubscribe.Visible        = true;
            }
            else
            {
                ShowNotFoundMessge();
            }
        }
示例#3
0
        /// <summary>
        /// people can subscribe to the newsletters without registering on the site. This method is used to attach those existing subscriptions to the user upon registration
        /// </summary>
        /// <param name="siteUser"></param>
        public static void ClaimExistingSubscriptions(SiteUser siteUser)
        {
            SubscriberRepository    subscriptions     = new SubscriberRepository();
            List <LetterSubscriber> userSubscriptions = subscriptions.GetListByEmail(siteUser.SiteGuid, siteUser.Email);

            foreach (LetterSubscriber s in userSubscriptions)
            {
                if (s.UserGuid != siteUser.UserGuid)
                {
                    s.UserGuid = siteUser.UserGuid;
                    subscriptions.Save(s);
                }

                if (!s.IsVerified)
                {
                    subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty);
                    LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);
                }
            }

            List <LetterSubscriber> memberSubscriptions = subscriptions.GetListByUser(siteUser.SiteGuid, siteUser.UserGuid);

            RemoveDuplicates(memberSubscriptions);

            // commented out 2012-11-16 since we now give the user a chance to opt in the registration
            // then we should not force him in if he chose not to opt in

            //if (memberSubscriptions.Count == 0)
            //{
            //    string ipAddress = SiteUtils.GetIP4Address();
            //    //user has no previous subscriptions and just registered
            //    // lets give him the site subscriptions that are configured for opting in new users by default
            //    List<LetterInfo> allNewsletters = LetterInfo.GetAll(siteUser.SiteGuid);
            //    foreach (LetterInfo l in allNewsletters)
            //    {
            //        if ((l.ProfileOptIn) && (l.AvailableToRoles.Contains("All Users;")))
            //        {
            //            LetterSubscriber s = new LetterSubscriber();
            //            s.SiteGuid = siteUser.SiteGuid;
            //            s.LetterInfoGuid = l.LetterInfoGuid;
            //            s.UserGuid = siteUser.UserGuid;
            //            s.EmailAddress = siteUser.Email;
            //            s.IsVerified = true;
            //            s.UseHtml = true;
            //            s.IpAddress = ipAddress;
            //            subscriptions.Save(s);

            //        }


            //    }

            //}
        }
示例#4
0
        private void RunTask()
        {
            // this is where the work gets done

            // Get a data table of up to 1000 users
            // who have not opted in but also have not previously
            // opted out and have valid email accounts and account is not locked
            DataTable dataTable = GetData();

            double completeRatio = .5;

            if (dataTable.Rows.Count == 0)
            {
                completeRatio = 1; //complete
                ReportStatus(completeRatio);
                return;
            }

            SubscriberRepository repository = new SubscriberRepository();

            int count = 0;

            foreach (DataRow row in dataTable.Rows)
            {
                Guid   userGuid = new Guid(row["UserGuid"].ToString());
                string email    = row["email"].ToString();

                LetterSubscriber s = new LetterSubscriber();
                s.SiteGuid       = SiteGuid;
                s.UserGuid       = userGuid;
                s.EmailAddress   = email;
                s.LetterInfoGuid = LetterInfoGuid;
                s.UseHtml        = true;
                s.IsVerified     = true;

                repository.Save(s);

                count += 1;

                if (count > 20)
                {
                    ReportStatus(completeRatio);
                    count = 0;
                }
            }

            LetterInfo.UpdateSubscriberCount(LetterInfoGuid);
            ReportStatus(completeRatio);

            // repeat until the table comes back with 0 rows
            RunTask();
        }
示例#5
0
        public static void VerifyExistingSubscriptions(SiteUser siteUser)
        {
            SubscriberRepository    subscriptions     = new SubscriberRepository();
            List <LetterSubscriber> userSubscriptions = subscriptions.GetListByUser(siteUser.SiteGuid, siteUser.UserGuid);

            foreach (LetterSubscriber s in userSubscriptions)
            {
                if (!s.IsVerified)
                {
                    subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty);
                    LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);
                }
            }
        }
示例#6
0
        private void DoSubscribe(LetterInfo letter, SiteUser siteUser)
        {
            LetterSubscriber s = new LetterSubscriber();

            s.SiteGuid       = siteSettings.SiteGuid;
            s.EmailAddress   = siteUser.Email;
            s.UserGuid       = siteUser.UserGuid;
            s.LetterInfoGuid = letter.LetterInfoGuid;
            s.UseHtml        = rbHtmlFormat.Checked;
            s.IsVerified     = (!siteSettings.UseSecureRegistration);
            s.IpAddress      = SiteUtils.GetIP4Address();
            subscriptions.Save(s);

            LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);
        }
        /// <summary>
        /// people can subscribe to the newsletters without registering on the site. This method is used to attach those existing subscriptions to the user upon registration
        /// </summary>
        /// <param name="siteUser"></param>
        public static void ClaimExistingSubscriptions(SiteUser siteUser)
        {
            SubscriberRepository    subscriptions     = new SubscriberRepository();
            List <LetterSubscriber> userSubscriptions = subscriptions.GetListByEmail(siteUser.SiteGuid, siteUser.Email);

            foreach (LetterSubscriber s in userSubscriptions)
            {
                if (s.UserGuid != siteUser.UserGuid)
                {
                    s.UserGuid = siteUser.UserGuid;
                    subscriptions.Save(s);
                }

                if (!s.IsVerified)
                {
                    subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty);
                    LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);
                }
            }

            RemoveDuplicates(userSubscriptions);

            if (userSubscriptions.Count == 0)
            {
                string ipAddress = SiteUtils.GetIP4Address();
                //user has no previous subscriptions and just registered
                // lets give him the site subscriptions that are configured for opting in new users by default
                List <LetterInfo> allNewsletters = LetterInfo.GetAll(siteUser.SiteGuid);
                foreach (LetterInfo l in allNewsletters)
                {
                    if ((l.ProfileOptIn) && (l.AvailableToRoles.Contains("All Users;")))
                    {
                        LetterSubscriber s = new LetterSubscriber();
                        s.SiteGuid       = siteUser.SiteGuid;
                        s.LetterInfoGuid = l.LetterInfoGuid;
                        s.UserGuid       = siteUser.UserGuid;
                        s.EmailAddress   = siteUser.Email;
                        s.IsVerified     = true;
                        s.UseHtml        = true;
                        s.IpAddress      = ipAddress;
                        subscriptions.Save(s);
                    }
                }
            }
        }
        void grdSubscribers_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
        {
            string strG = e.CommandArgument.ToString();

            switch (e.CommandName)
            {
            case "DeleteSubscriber":

                if (strG.Length == 36)
                {
                    Guid             subscriptionGuid = new Guid(strG);
                    LetterSubscriber s = subscriptions.Fetch(subscriptionGuid);
                    if (s != null)
                    {
                        subscriptions.Delete(s);
                    }

                    LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);

                    WebUtils.SetupRedirect(this, Request.RawUrl);
                }

                break;

            case "SendVerification":

                if (strG.Length == 36)
                {
                    Guid             subscriptionGuid = new Guid(strG);
                    LetterSubscriber s          = subscriptions.Fetch(subscriptionGuid);
                    LetterInfo       letterInfo = new LetterInfo(letterInfoGuid);

                    NewsletterHelper.SendSubscriberVerificationEmail(
                        SiteRoot,
                        s.EmailAddress,
                        s.SubscribeGuid,
                        letterInfo,
                        siteSettings);
                }

                WebUtils.SetupRedirect(this, Request.RawUrl);

                break;
            }
        }
示例#9
0
        public static void RemoveDuplicates(List <LetterSubscriber> userSubscriptions)
        {
            SubscriberRepository    subscriptions      = new SubscriberRepository();
            List <LetterSubscriber> cleanSubscriptions = new List <LetterSubscriber>();
            List <LetterSubscriber> duplicates         = new List <LetterSubscriber>();

            foreach (LetterSubscriber s in userSubscriptions)
            {
                if (!ContainsSubscription(cleanSubscriptions, s.LetterInfoGuid))
                {
                    cleanSubscriptions.Add(s);
                }
                else
                {
                    duplicates.Add(s);
                }
            }

            foreach (LetterSubscriber s in duplicates)
            {
                subscriptions.Delete(s, false);
                LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);
            }
        }
        void grdSubscribers_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
        {
            switch (e.CommandName)
            {
            case "DeleteSubscriber":

                string strG = e.CommandArgument.ToString();
                if (strG.Length == 36)
                {
                    Guid             subscriptionGuid = new Guid(strG);
                    LetterSubscriber s = subscriptions.Fetch(subscriptionGuid);
                    if (s != null)
                    {
                        subscriptions.Delete(s);
                    }

                    LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);

                    WebUtils.SetupRedirect(this, Request.RawUrl);
                }

                break;
            }
        }
示例#11
0
        void btnSavePreferences_Click(object sender, EventArgs e)
        {
            foreach (LetterInfo availableSubscription in siteAvailableSubscriptions)
            {
                string controlID = "chk" + availableSubscription.LetterInfoGuid.ToString();

                if (Request.Params.Get(controlID) != null)
                {
                    if (!IsSubscribed(availableSubscription.LetterInfoGuid))
                    {
                        //subscribe
                        LetterSubscriber subscriber = new LetterSubscriber();
                        subscriber.SiteGuid       = siteSettings.SiteGuid;
                        subscriber.LetterInfoGuid = availableSubscription.LetterInfoGuid;
                        subscriber.UserGuid       = siteUser.UserGuid;
                        subscriber.EmailAddress   = siteUser.Email.ToLower();
                        subscriber.IsVerified     = true;
                        subscriber.UseHtml        = rbHtmlFormat.Checked;
                        subscriber.IpAddress      = SiteUtils.GetIP4Address();
                        subscriptions.Save(subscriber);

                        LetterInfo.UpdateSubscriberCount(availableSubscription.LetterInfoGuid);
                    }
                    else
                    {
                        // user is subscribed already
                        foreach (LetterSubscriber s in userSubscriptions)
                        {
                            if (s.LetterInfoGuid == availableSubscription.LetterInfoGuid)
                            {
                                if (s.UseHtml != rbHtmlFormat.Checked)
                                {
                                    s.UseHtml = rbHtmlFormat.Checked;
                                    subscriptions.Save(s);
                                }
                                if (!s.IsVerified)
                                {
                                    subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty);
                                    LetterInfo.UpdateSubscriberCount(availableSubscription.LetterInfoGuid);
                                }
                            }
                        }
                    }
                }
                else
                {
                    if (IsSubscribed(availableSubscription.LetterInfoGuid))
                    {
                        // unsubscribe
                        foreach (LetterSubscriber s in userSubscriptions)
                        {
                            if (s.LetterInfoGuid == availableSubscription.LetterInfoGuid)
                            {
                                subscriptions.Delete(s);
                            }
                        }


                        LetterInfo.UpdateSubscriberCount(availableSubscription.LetterInfoGuid);
                    }
                }
            }

            GetSubscriptions();
            BindPreferences();
            lblUnverifiedWarning.Visible = false;
            //btnSavePreferences.Text = Resource.NewsletterSavePreferencesButton;
            System.Threading.Thread.Sleep(1000);

            UpdatePanel1.Update();
        }
示例#12
0
        private void DoSubscribe(LetterInfo letter, string email)
        {
            if (email == "*****@*****.**")
            {
                return;
            }                                           //I've been seeing a lot of this from a bot

            LetterSubscriber s = subscriptions.Fetch(siteSettings.SiteGuid, letter.LetterInfoGuid, email);

            bool needToSendVerification = false;

            if (s == null)
            {
                s                = new LetterSubscriber();
                s.SiteGuid       = siteSettings.SiteGuid;
                s.EmailAddress   = email;
                s.LetterInfoGuid = letter.LetterInfoGuid;
                if (showFormatOptions)
                {
                    s.UseHtml = rbHtmlFormat.Checked;
                }
                else
                {
                    s.UseHtml = htmlIsDefault;
                }

                if ((currentUser != null) && (string.Equals(currentUser.Email, email, StringComparison.InvariantCultureIgnoreCase)))
                {
                    s.UserGuid   = currentUser.UserGuid;
                    s.IsVerified = true;
                }
                else
                {
                    // user is not authenticated but may still exist
                    // attach userguid but don't flag as verified
                    // because we don't know that the user who submited the form is the account owner
                    SiteUser siteUser = SiteUser.GetByEmail(siteSettings, email);
                    if (siteUser != null)
                    {
                        s.UserGuid = siteUser.UserGuid;
                    }
                }
                s.IpAddress = SiteUtils.GetIP4Address();
                subscriptions.Save(s);

                LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);

                if (WebConfigSettings.LogNewsletterSubscriptions)
                {
                    log.Info(s.EmailAddress + " just subscribed to newsletter " + letter.Title);
                }


                if (!s.IsVerified)
                {
                    needToSendVerification = true;
                }
            }
            else
            {
                // we found an existing subscription

                if (!s.IsVerified)
                {
                    // if the current authenticated user has the same email mark it as verified
                    if ((currentUser != null) && (string.Equals(currentUser.Email, email, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        s.UserGuid = currentUser.UserGuid;
                        if (showFormatOptions)
                        {
                            s.UseHtml = rbHtmlFormat.Checked;
                        }
                        subscriptions.Save(s);
                        subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty);
                    }
                    else if (s.BeginUtc < DateTime.UtcNow.AddDays(-WebConfigSettings.NewsletterReVerifcationAfterDays))
                    {
                        // if the user never verifed before and its been at least x days go ahead and send another chance to verify
                        needToSendVerification = true;
                        // TODO: maybe we should log this in case some spam script is using the same email over and over
                        // or maybe we should add a verification sent count on subscription
                    }
                }
            }

            //added 2012-05-16 to support intranet scenarios where verification is not required
            if (!WebConfigSettings.NewsletterRequireVerification)
            {
                if (!s.IsVerified)
                {
                    s.IsVerified = true;
                    subscriptions.Save(s);
                }
                needToSendVerification = false;
            }

            if (needToSendVerification)
            {
                NewsletterHelper.SendSubscriberVerificationEmail(
                    siteRoot,
                    email,
                    s.SubscribeGuid,
                    letter,
                    siteSettings);
            }
        }
        private void DoSubscribe(LetterInfo letter, string email)
        {
            LetterSubscriber s = subscriptions.Fetch(siteSettings.SiteGuid, letter.LetterInfoGuid, email);

            bool needToSendVerification = false;

            if (s == null)
            {
                s                = new LetterSubscriber();
                s.SiteGuid       = siteSettings.SiteGuid;
                s.EmailAddress   = email;
                s.LetterInfoGuid = letter.LetterInfoGuid;
                if (showFormatOptions)
                {
                    s.UseHtml = rbHtmlFormat.Checked;
                }
                else
                {
                    s.UseHtml = htmlIsDefault;
                }

                if ((currentUser != null) && (string.Equals(currentUser.Email, email, StringComparison.InvariantCultureIgnoreCase)))
                {
                    s.UserGuid   = currentUser.UserGuid;
                    s.IsVerified = true;
                }
                else
                {
                    // user is not authenticated but may still exist
                    // attach userguid but don't flag as verified
                    // because we don't know that the user who submited the form is the account owner
                    SiteUser siteUser = SiteUser.GetByEmail(siteSettings, email);
                    if (siteUser != null)
                    {
                        s.UserGuid = siteUser.UserGuid;
                    }
                }
                s.IpAddress = SiteUtils.GetIP4Address();
                subscriptions.Save(s);

                LetterInfo.UpdateSubscriberCount(s.LetterInfoGuid);

                if (!s.IsVerified)
                {
                    needToSendVerification = true;
                }
            }
            else
            {
                // we found an existing subscription

                if (!s.IsVerified)
                {
                    // if the current authenticated user has the same email mark it as verified
                    if ((currentUser != null) && (string.Equals(currentUser.Email, email, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        s.UserGuid = currentUser.UserGuid;
                        if (showFormatOptions)
                        {
                            s.UseHtml = rbHtmlFormat.Checked;
                        }
                        subscriptions.Save(s);
                        subscriptions.Verify(s.SubscribeGuid, true, Guid.Empty);
                    }
                    else if (s.BeginUtc < DateTime.UtcNow.AddDays(-WebConfigSettings.NewsletterReVerifcationAfterDays))
                    {
                        // if the user never verifed before and its been at least x days go ahead and send another chance to verify
                        needToSendVerification = true;
                        // TODO: maybe we should log this in case some spam script is using the same email over and over
                        // or maybe we should add a verification sent count on subscription
                    }
                }
            }

            if (needToSendVerification)
            {
                string verificationTemplate = ResourceHelper.GetMessageTemplate(SiteUtils.GetDefaultCulture(), "NewsletterVerificationEmailMessage.config");
                string confirmLink          = siteRoot + "/eletter/Confirm.aspx?s=" + s.SubscribeGuid.ToString();
                string messageBody          = verificationTemplate.Replace("{NewsletterName}", letter.Title).Replace("{ConfirmationLink}", confirmLink).Replace("{SiteLink}", siteRoot);
                string subject = string.Format(CultureInfo.InvariantCulture, Resource.NewsletterVerifySubjectFormat, letter.Title);

                EmailMessageTask messageTask = new EmailMessageTask(SiteUtils.GetSmtpSettings());
                messageTask.SiteGuid = siteSettings.SiteGuid;
                if (letter.FromAddress.Length > 0)
                {
                    messageTask.EmailFrom = letter.FromAddress;
                }
                else
                {
                    messageTask.EmailFrom = siteSettings.DefaultEmailFromAddress;
                }
                messageTask.EmailTo  = email;
                messageTask.Subject  = subject;
                messageTask.TextBody = messageBody;


                messageTask.QueueTask();
                WebTaskManager.StartOrResumeTasks();
            }
        }