private void ChangeAdminSettings()
        {
            string username = Request.Params["ctl00$MainContent$AdminUsernameTB"];
            string email = Request.Params["ctl00$MainContent$AdminEmailTB"];
            string password = Request.Params["ctl00$MainContent$PasswordTB"];
            string confirm = Request.Params["ctl00$MainContent$ConfirmTB"];

            ConnectorDataContext db = new ConnectorDataContext();

            Stopwatch w = Stopwatch.StartNew();
            User admin = db.Users.Where(u => u.isAdmin).Single();
            w.Stop();
            ILog log = LogManager.GetLogger("QueryLogger");
            log.Info(" Elapsed time: " + w.Elapsed + ", select the admin to change his settings");
            bool changePassword = true;

            if (ChangePasswordCB.Checked)
                if (password.Equals(confirm))
                    admin.password = db.Encrypt(password);
                else
                {
                    ErrorPA.Attributes.Add("class", "error");
                    ErrorPA.InnerText = "Passwords do not match.";
                    changePassword = false;
                }

            if (changePassword)
            {
                Stopwatch w2 = Stopwatch.StartNew();
                bool usr = db.Users.Any(u => (u.username == username || u.email == email) && !u.isAdmin);
                w2.Stop();
                ILog log2 = LogManager.GetLogger("QueryLogger");
                log2.Info(" Elapsed time: " + w2.Elapsed + ", check if there is an user with admin's username or email");
                if (!usr)
                {
                    admin.username = username;
                    admin.email = email;

                    Stopwatch w3 = Stopwatch.StartNew();
                    db.SubmitChanges();
                    w3.Stop();
                    ILog log3 = LogManager.GetLogger("QueryLogger");
                    log3.Info(" Elapsed time: " + w3.Elapsed + ", change admin settings");
                    ErrorPA.Attributes.Add("class", "confirm");
                    ErrorPA.InnerText = "Data stored";
                }
                else
                {
                    ErrorPA.Attributes.Add("class", "error");
                    ErrorPA.InnerText = "Username or email already exist.";
                }
            }
        }
        private void SaveUsers()
        {
            ConnectorDataContext db = new ConnectorDataContext();

            XmlDocument requestXml = new XmlDocument();
            requestXml.Load(new XmlTextReader(new StreamReader(Request.InputStream)));

            List<string> mailError = new List<string>();

            foreach (XmlNode item in requestXml.SelectNodes("//users/user"))
            {
                try
                {
                    String passwd = Membership.GeneratePassword(10, 2);
                    User user = new User()
                    {
                        username = item.InnerText,
                        email = item.InnerText,
                        password = db.Encrypt(passwd)
                    };
                    Stopwatch w = Stopwatch.StartNew();
                    db.Users.InsertOnSubmit(user);
                    w.Stop();
                    ILog log = LogManager.GetLogger("QueryLogger");
                    log.Info(" Elapsed time: " + w.Elapsed + ", insert the user in a pending state");

                    if (WebUtility.SendEmail(item.InnerText, "SocialCDE invitation", GetBody(item.InnerText, passwd), true))
                    {
                        Stopwatch w1 = Stopwatch.StartNew();
                        db.SubmitChanges();
                        w1.Stop();
                        ILog log1 = LogManager.GetLogger("QueryLogger");
                        log1.Info(" Elapsed time: " + w1.Elapsed + ", send mail for registration");
                    }
                    else
                        mailError.Add(item.InnerText);
                }
                catch
                {
                    mailError.Add(item.InnerText);
                }
            }

            XElement root = new XElement("Root");
            foreach (string item in mailError)
                root.Add(new XElement("NotSent", item));

            Response.Clear();
            Response.ContentType = "text/xml";
            Response.Write(new XDocument(root));
            Response.End();
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            ConnectorDataContext db = new ConnectorDataContext();

            String token = Request.QueryString["token"];
            Setting recoveringToken = null;
            Setting recoveringTime = null;

            try
            {
                Stopwatch w = Stopwatch.StartNew();
                recoveringTime = db.Settings.Where(s => s.key == "RecoveringTime").Single();
                w.Stop();
                ILog log = LogManager.GetLogger("QueryLogger");
                log.Info(" Elapsed time: " + w.Elapsed + ", select the 'recovering time' key from settings");
                Stopwatch w1 = Stopwatch.StartNew();
                recoveringToken = db.Settings.Where(s => s.key == "RecoveringToken").Single();
                w1.Stop();
                ILog log1 = LogManager.GetLogger("QueryLogger");
                log1.Info(" Elapsed time: " + w1.Elapsed + ", select the 'recovering token' key from settings");
            }
            catch { }

            if (Request.RequestType == "GET")
            {
                if (String.IsNullOrEmpty(token))
                {
                    if (recoveringTime == null || DateTime.Parse(recoveringTime.value) < DateTime.UtcNow - new TimeSpan(0, 5, 0))
                    {
                        String newToken = GenerateToken();

                        Stopwatch w2 = Stopwatch.StartNew();
                        String to = db.Users.Where(u => u.isAdmin).Single().email;
                        w2.Stop();
                        ILog log2 = LogManager.GetLogger("QueryLogger");
                        log2.Info(" Elapsed time: " + w2.Elapsed + ", select the admin's email");

                        if (WebUtility.SendEmail(to, "Password recovering", GetBody(newToken), true))
                        {
                            if (recoveringToken != null)
                            {
                                recoveringToken.value = newToken;
                                recoveringTime.value = DateTime.UtcNow.ToString();
                            }
                            else
                            {
                                Stopwatch w3 = Stopwatch.StartNew();
                                db.Settings.InsertAllOnSubmit(
                                    new List<Setting>(){
                                new Setting () {
                                    key = "RecoveringToken",
                                    value = newToken
                                },
                                new Setting () {
                                    key = "RecoveringTime",
                                    value = DateTime.UtcNow.ToString()
                                }});
                                w3.Stop();
                                ILog log3 = LogManager.GetLogger("QueryLogger");
                                log3.Info(" Elapsed time: " + w3.Elapsed + ", insert new setting in a pending state(password recovering)");
                            }
                            Stopwatch w4 = Stopwatch.StartNew();
                            db.SubmitChanges();
                            w4.Stop();
                            ILog log4 = LogManager.GetLogger("QueryLogger");
                            log4.Info(" Elapsed time: " + w4.Elapsed + ", insert new settings");
                            Response.Redirect("Login.aspx?type=confirm&message=Email sent, check your email inbox.");
                        }
                        else
                            Response.Redirect("Login.aspx?type=error&message=Is not possible recover the password, the smtp server is not set.");
                    }
                    else
                        Response.Redirect("Login.aspx?type=error&message=You have sent a request less than 5 minutes ago. Please, try again later.");
                }
                else
                {
                    if (recoveringToken == null || recoveringToken.value != token)
                        Response.Redirect("Login.aspx?type=error&message=Wrong token.");
                }
            }
            else if (Request.RequestType == "POST")
            {
                Stopwatch w5 = Stopwatch.StartNew();
                db.Users.Where(u => u.isAdmin).Single().password = db.Encrypt(Request.Params["ctl00$MainContent$PasswordTB"]);
                w5.Stop();
                ILog log5 = LogManager.GetLogger("QueryLogger");
                log5.Info(" Elapsed time: " + w5.Elapsed + ", select admin's password");
                Stopwatch w6 = Stopwatch.StartNew();
                db.Settings.DeleteAllOnSubmit(db.Settings.Where(s => s.key == "RecoveringToken" || s.key == "RecoveringTime"));
                db.SubmitChanges();
                w6.Stop();
                ILog log6 = LogManager.GetLogger("QueryLogger");
                log6.Info(" Elapsed time: " + w6.Elapsed + ", password changed");
                Response.Redirect("Login.aspx?type=confirm&message=Password changed successfully.");
            }
        }
        public int SubscribeUser(String email, String password, String username)
        {
            Contract.Requires(!String.IsNullOrEmpty(email));
            Contract.Requires(!String.IsNullOrEmpty(password));
            Contract.Requires(!String.IsNullOrEmpty(username));

            ConnectorDataContext db = new ConnectorDataContext();
            User user;
            try
            {
                Stopwatch w = Stopwatch.StartNew();
                user = db.Users.Where(u => u.email == email).Single();
                w.Stop();
                ILog log = LogManager.GetLogger("QueryLogger");
                log.Info(" Elapsed time: " + w.Elapsed + ", user email: " + email + ", select the user to subscribe him");
            }
            catch (InvalidOperationException)
            {
                return 1;
            }

            if (user.password != db.Encrypt(password))
                return 2;

            if (!IsAvailable(username))
                return 3;

            user.username = username;
            user.active = true;

            Stopwatch w1 = Stopwatch.StartNew();
            int sInstance = db.ServiceInstances.Where(si => si.Service.name == "SocialTFS").Single().id;
            w1.Stop();
            ILog log1 = LogManager.GetLogger("QueryLogger");
            log1.Info(" Elapsed time: " + w1.Elapsed + ", select the service instance with name 'SocialTFS'");

            Registration registration = new Registration()
            {
                User = user,
                serviceInstance = sInstance,
                nameOnService = username,
                idOnService = username
            };
            Stopwatch w2 = Stopwatch.StartNew();
            db.Registrations.InsertOnSubmit(registration);
            db.SubmitChanges();
            w2.Stop();
            ILog log2 = LogManager.GetLogger("QueryLogger");
            log2.Info(" Elapsed time: " + w2.Elapsed + ", service instance's id: " + sInstance + ", name and id on service: " + username + ", insert a new registration");

            Stopwatch w3 = Stopwatch.StartNew();
            db.ChosenFeatures.InsertOnSubmit(new ChosenFeature()
            {
                Registration = registration,
                feature = FeaturesType.Post.ToString(),
                lastDownload = new DateTime(1900, 1, 1)
            });
            db.SubmitChanges();
            w3.Stop();
            ILog log3 = LogManager.GetLogger("QueryLogger");
            log3.Info(" Elapsed time: " + w3.Elapsed + ", feature: " + FeaturesType.Post.ToString() + ", last download: " + new DateTime(1900, 1, 1) + ", insert a new Chosen feature");

            return 0;
        }
        public bool ChangePassword(String username, String oldPassword, String newPassword)
        {
            Contract.Requires(!String.IsNullOrEmpty(username));
            Contract.Requires(!String.IsNullOrEmpty(oldPassword));
            Contract.Requires(!String.IsNullOrEmpty(newPassword));

            ConnectorDataContext db = new ConnectorDataContext();

            User user = CheckCredentials(db, username, oldPassword);
            if (user == null)
                return false;

            Stopwatch w = Stopwatch.StartNew();
            user.password = db.Encrypt(newPassword);
            db.SubmitChanges();
            w.Stop();
            ILog log = LogManager.GetLogger("QueryLogger");
            log.Info(" Elapsed time: " + w.Elapsed + ", change password");
            return true;
        }
        private User CheckCredentials(ConnectorDataContext db, String username, String password)
        {
            Contract.Requires(!String.IsNullOrEmpty(username));
            Contract.Requires(!String.IsNullOrEmpty(password));

            try
            {
                Stopwatch w = Stopwatch.StartNew();
                User user = db.Users.Where(u => u.username == username && u.password == db.Encrypt(password) && u.active).Single();
                w.Stop();
                ILog log = LogManager.GetLogger("QueryLogger");
                log.Info(" Elapsed time: " + w.Elapsed + ", username: "******", password: ****** , check credentials");
                return user;
            }
            catch (InvalidOperationException)
            {
                return null;
            }
        }