public SubscriptionDTO(Subscription subscription, bool emailIncluded)
 {
     ApplicationName = subscription.ApplicationName;
     LogName = subscription.LogName;
     Description = subscription.Description;
     Verified = subscription.Verified;
     VerificationsSent = subscription.VerificationsSent;
     if (emailIncluded)
     {
         // ONLY INCLUDE EMAIL IF SPECIFIED
         EmailAddress = subscription.EmailAddress;
     }
     // DO NOT COPY API KEY
 }
 public SubscriptionDTO(Subscription subscription)
     : this(subscription, false)
 {
 }
 private void AddToSubscriberQueue(Subscription subscriber)
 {
     // Create the queue message.
     string queueMessageString =
         subscriber.ApplicationName + "," +
         subscriber.LogName;
     var queueMessage = new CloudQueueMessage(queueMessageString);
     subscribeQueue.AddMessage(queueMessage);
 }
        public ActionResult Verify(string ApplicationName, string LogName, string APIKey, string action)
        {
            Subscription subscriber = null;
            if (ModelState.IsValid)
            {
                subscriber = FindRow(ApplicationName, LogName);
                if (subscriber == null)
                {
                    ModelState.AddModelError(string.Empty, "No such subscription exists.");
                    subscriber = new Subscription()
                    {
                        ApplicationName = ApplicationName,
                        LogName = LogName
                    };
                    return View(subscriber);
                }

                if (!subscriber.APIKey.Equals(APIKey, StringComparison.InvariantCulture))
                {
                    ModelState.AddModelError(string.Empty, "Invalid ID, Cannot Verify.");
                    return View("Verification", model: null);
                }

                if (action.Equals("Confirm", StringComparison.InvariantCultureIgnoreCase))
                {
                    subscriber.Verified = true;
                    var replaceOperation = TableOperation.Replace(subscriber);
                    subscribersTable.Execute(replaceOperation);
                    return View("Verification", model: subscriber);
                }
                else
                {
                    subscriber.Verified = null;
                    var deleteOperation = TableOperation.Delete(subscriber);
                    subscribersTable.Execute(deleteOperation);
                    return View("Verification", model: subscriber);
                }
            }
            subscriber = new Subscription()
            {
                ApplicationName = ApplicationName,
                LogName = LogName,
                APIKey = APIKey
            };
            return View("Verification", model: subscriber);
        }
        public ActionResult Subscribe(Subscription subscriber)
        {
            if (ModelState.IsValid)
            {
                Subscription prevSubscriber = FindRow(subscriber.ApplicationName, subscriber.LogName);
                if (prevSubscriber == null)
                {
                    subscriber.APIKey = Guid.NewGuid().ToString();
                    subscriber.Verified = false;
                    subscriber.VerificationsSent = 0;
                    var insertOperation = TableOperation.Insert(subscriber);
                    subscribersTable.Execute(insertOperation);

                    AddToSubscriberQueue(subscriber);

                    return View("Confirmation", model:subscriber);
                }
                else if (!prevSubscriber.EmailAddress.Equals(subscriber.EmailAddress, StringComparison.InvariantCultureIgnoreCase)
                         || prevSubscriber.Verified == true)
                {
                    ModelState.AddModelError(string.Empty, "You attempted to subscribe an already subscribed App with that Log Name");
                }
                else
                {
                    AddToSubscriberQueue(prevSubscriber);
                    return View("Reconfirmation", model: prevSubscriber);
                }
            }

            return View(subscriber);
        }
        private static void SendEmail(Subscription subscriber)
        {
            string serviceName = RoleEnvironment.GetConfigurationSettingValue("ServiceName");
            var fromAddress = new MailAddress(
                RoleEnvironment.GetConfigurationSettingValue("ServiceGmailAddress") + "@gmail.com",
                serviceName
                );
            var toAddress = new MailAddress(subscriber.EmailAddress, subscriber.ApplicationName);
            string fromPassword = RoleEnvironment.GetConfigurationSettingValue("ServiceGmailPassword");
            string subject = String.Format(
                "Subscribe to {0}",
                serviceName
                );

            string subscribeURL = RoleEnvironment.GetConfigurationSettingValue("LoggingServiceURL") +
                "/Subscription/Verify?appName=" + subscriber.ApplicationName + "&logName=" + subscriber.LogName +
                "&apiKey=" + subscriber.APIKey;

            string body = String.Format(
                "<p>Click the link below to subscribe {0}'s Log <code>{1}</code> to {2}. " +
                "If you don't confirm your subscription, you won't be subscribed to the service.</p>" +
                "<a href=\"{3}\">Confirm Subscription</a>" +
                "<p>With each subscription comes an API Key, which functions as a password for all actions involving an application-specific log. " +
                "Thus for all requests requiring authentication (such as adding a snapshot to the logging service, editing a snapshot, or unsubscribing), this unique key " +
                "<strong><em>MUST</em></strong> be provided. If you lose this key, there is no way currently for you to recover or reset it." +
                "<p>Your API Key: <pre>{4}</pre></p>",
                subscriber.ApplicationName,
                subscriber.LogName,
                serviceName,
                subscribeURL,
                subscriber.APIKey
                );

            var smtp = new SmtpClient
            {
                Host = "smtp.gmail.com",
                Port = 587,
                EnableSsl = true,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
                Timeout = 20000
            };
            using (var message = new MailMessage(fromAddress, toAddress)
                   {
                       Subject = subject,
                       Body = body,
                       IsBodyHtml = true
                   }
                  )
            {
                smtp.Send(message);
            }
        }
        public HttpResponseMessage Subscribe(Subscription subscriber)
        {
            if (ModelState.IsValid)
            {
                Subscription prevSubscriber = FindRow(subscriber.ApplicationName, subscriber.LogName);
                if (prevSubscriber == null)
                {
                    subscriber.APIKey = Guid.NewGuid().ToString();
                    subscriber.Verified = false;
                    subscriber.VerificationsSent = 0;
                    var insertOperation = TableOperation.Insert(subscriber);
                    subscribersTable.Execute(insertOperation);

                    AddToSubscriberQueue(subscriber);

                    return Request.CreateResponse(
                        HttpStatusCode.OK,
                        new
                        {
                            Success = true,
                            Message = "Added to Subscriber Queue",
                            Subscription = new SubscriptionDTO(subscriber, true)
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }
                else if (!prevSubscriber.EmailAddress.Equals(subscriber.EmailAddress, StringComparison.InvariantCultureIgnoreCase)
                         || prevSubscriber.Verified == true)
                {
                    return Request.CreateResponse(
                        HttpStatusCode.OK,
                        new
                        {
                            Success = false,
                            Error = "You attempted to subscribe an already subscribed App with that Log Name",
                            Subscription = new SubscriptionDTO(subscriber, true)
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }
                else
                {
                    AddToSubscriberQueue(prevSubscriber);
                    return Request.CreateResponse(
                        HttpStatusCode.Accepted,
                        new
                        {
                            Success = true,
                            Message = "Re-added to subscriber queue",
                            Subscription = new SubscriptionDTO(prevSubscriber, true)
                        },
                        Configuration.Formatters.JsonFormatter
                        );
                }
            }

            List<string> errorList = ModelState.Values
                .SelectMany(m => m.Errors)
                .Select(e => e.ErrorMessage)
                .Where(s => !string.IsNullOrWhiteSpace(s))
                .ToList();
            return Request.CreateResponse(
                HttpStatusCode.OK,
                new
                {
                    Success = false,
                    Errors = errorList,
                    Subscription = new SubscriptionDTO(subscriber, true)
                },
                Configuration.Formatters.JsonFormatter
                );
        }