public void Register() { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString2"].ConnectionString); con.Open(); String InserirConta = "INSERT INTO Contas (Nome,DatadeNascimento,CodigoPostal,Localidade,Morada,Email,ENotificar,Palavrapasse,DatadeCriacao,UltimoLogin,Confirmada) values (@Nome,@DatadeNascimento,@CodigoPostal,@Localidade,@Morada,@Email,@ENotificar,@Palavrapasse,@DatadeCriacao,@UltimoLogin,@Confirmada)"; SqlCommand comandoInserirConta = new SqlCommand(InserirConta, con); comandoInserirConta.Parameters.AddWithValue("@Nome", TextBoxName.Text); string[] DatadeNascimentoarray = TextBoxDateofBirth.Text.Split('/'); DateTime DatadeNascimento = new DateTime(Int32.Parse(DatadeNascimentoarray[2]), Int32.Parse(DatadeNascimentoarray[1]), Int32.Parse(DatadeNascimentoarray[0])); comandoInserirConta.Parameters.AddWithValue("@DatadeNascimento", DatadeNascimento); comandoInserirConta.Parameters.AddWithValue("@CodigoPostal", TextBoxZIPCode.Text); comandoInserirConta.Parameters.AddWithValue("@Localidade", DropDownListLocal.SelectedItem.ToString()); comandoInserirConta.Parameters.AddWithValue("@Morada", TextBoxHomeAdress.Text); comandoInserirConta.Parameters.AddWithValue("@Email", TextBoxEmail.Text); comandoInserirConta.Parameters.AddWithValue("@ENotificar", CheckBoxENotificar.Checked); comandoInserirConta.Parameters.AddWithValue("@Palavrapasse", TextBoxPassword.Text); DateTime DatadeCriacao2 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second); comandoInserirConta.Parameters.AddWithValue("@DatadeCriacao", DatadeCriacao2); comandoInserirConta.Parameters.AddWithValue("@Confirmada", false); comandoInserirConta.Parameters.AddWithValue("@UltimoLogin", DatadeCriacao2); comandoInserirConta.ExecuteNonQuery(); String GetIddaContaInserida = "SELECT Id_Contas FROM Contas WHERE Email=@Email"; SqlCommand comandoGetIddaContaInserida = new SqlCommand(GetIddaContaInserida, con); comandoGetIddaContaInserida.Parameters.AddWithValue("@Email", TextBoxEmail.Text); int IddaContaInserida = Int32.Parse(comandoGetIddaContaInserida.ExecuteScalar().ToString()); GeradordeCodigos Gerador = new GeradordeCodigos(); string CodigodeConfirmacao = ""; int CodigosEncontrados = 1; do { CodigodeConfirmacao = Gerador.GerarCodigo(50); //Verificar que o código de confirmação não existe, o que é extremamente improvável String ProcurarporCodigodeConfirmacao = "SELECT COUNT(*) FROM ContasCodigosdeConfirmacao WHERE CodigodeConfirmacao=@CodigodeConfirmacao"; SqlCommand comandoProcurarporCodigodeConfirmacao = new SqlCommand(ProcurarporCodigodeConfirmacao, con); comandoProcurarporCodigodeConfirmacao.Parameters.AddWithValue("@CodigodeConfirmacao", CodigodeConfirmacao); CodigosEncontrados = Convert.ToInt32(comandoProcurarporCodigodeConfirmacao.ExecuteScalar()); } while (CodigosEncontrados != 0); //Enviar o código para o e-email associado à conta registada SmtpClient smtpClient = new SmtpClient("smtp-mail.outlook.com", 25); smtpClient.Port = 587; smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new System.Net.NetworkCredential("*****@*****.**", "abc123IO"); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.EnableSsl = true; MailMessage mail = new MailMessage("*****@*****.**", "*****@*****.**"); mail.Subject = "Confirme a sua conta"; Uri uri = new Uri("http://*****:*****@FKId_Contas, @CodigodeConfirmacao, 0, 'false', GETDATE())"; SqlCommand comandoInserirCodigodeConfirmacao = new SqlCommand(InserirCodigodeConfirmacao, con); comandoInserirCodigodeConfirmacao.Parameters.AddWithValue("@FKId_Contas", IddaContaInserida); comandoInserirCodigodeConfirmacao.Parameters.AddWithValue("@CodigodeConfirmacao", CodigodeConfirmacao); comandoInserirCodigodeConfirmacao.ExecuteNonQuery(); } catch { //Quando a conta de e-mail [email protected] é bloqueada por suspeitas de spam, o programa entra no catch. É um problema básico em que me basta fazer login e confirmar a minha identidade //por telemóvel. Session["EmailporConfirmarFalhanoEnvio"] = 1; } Response.Redirect("Confirmar.aspx?c=" + 1.ToString()); con.Close(); }
protected void ButtonEntrar_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString2"].ConnectionString); con.Open(); String VerificarLogin = "******"; SqlCommand comandoVerificarLogin = new SqlCommand(VerificarLogin, con); comandoVerificarLogin.Parameters.AddWithValue("@Email", TextBoxEmail.Text); SqlDataReader dr = comandoVerificarLogin.ExecuteReader(); int Count = 0; int Id_Contas = 0; bool Confirmada = false; while (dr.Read()) { Count = Int32.Parse(dr["Count"].ToString()); Id_Contas = Int32.Parse(dr["Id_Contas"].ToString()); Confirmada = bool.Parse(dr["Confirmada"].ToString()); } dr.Close(); bool canlogin = true; if (Session["PasswordsErradas"] != null) { if (Int32.Parse(Session["PasswordsErradas"].ToString()) >= 3) { canlogin = Validate(); } } if (canlogin == false) { ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('O captcha está errado.');", true); } //Se o utilizador for obrigado a preencher o captcha, e se o tiver preenchido corretamente if (canlogin) { //Se o email inserido estiver associado a uma conta if (Count == 0) { ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('Este Email não existe.');", true); } else { //Se a conta estiver confirmada if (Confirmada == false) { Session["EmailporConfirmar"] = TextBoxEmail.Text; ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", " alert('Esta conta ainda não foi confirmada. Verifique o seu e-mail, enviámos-lhe uma mensagem sobre como confirmar a sua conta. Caso necessário, peça o reenvio do e-mail de confirmação.'); window.location.href = 'RecuperarConta.aspx';", true); } else { String ProcurarEstadodeBloqueio = "SELECT COUNT(*) FROM ContasBloqueios WHERE FKId_Contas=@FKId_Contas and Estado=1"; SqlCommand comandoProcurarEstadodeBloqueio = new SqlCommand(ProcurarEstadodeBloqueio, con); comandoProcurarEstadodeBloqueio.Parameters.AddWithValue("@FKId_Contas", Id_Contas); int Bloqueada = 0; if (comandoProcurarEstadodeBloqueio.ExecuteScalar() != null) { Bloqueada = Int32.Parse(comandoProcurarEstadodeBloqueio.ExecuteScalar().ToString()); } //Se a conta não estiver bloqueada if (Bloqueada == 1) { //Inserir a tentativa de login String InserirTentativadeLogin = "******"; SqlCommand comandoInserirTentativadeLogin = new SqlCommand(InserirTentativadeLogin, con); comandoInserirTentativadeLogin.Parameters.AddWithValue("@FKId_Contas", Id_Contas); comandoInserirTentativadeLogin.ExecuteNonQuery(); ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('Esta conta foi bloqueada devido a demasiadas tentativas de login seguidas e sem sucesso. Verifique o seu e-mail, enviámos-lhe um e-mail para poder desbloquear a sua conta.');", true); } else { String Autenticar = "SELECT COUNT(*) FROM Contas WHERE Email=@Email and Palavrapasse=@Palavrapasse"; SqlCommand comandoAutenticar = new SqlCommand(Autenticar, con); comandoAutenticar.Parameters.AddWithValue("@Email", TextBoxEmail.Text); comandoAutenticar.Parameters.AddWithValue("@Palavrapasse", TextBoxPassword.Text); int temp2 = Convert.ToInt32(comandoAutenticar.ExecuteScalar()); //Se a palavra-passe inserida estiver correta if (temp2 == 1) { //Inserir a tentativa de login String InserirTentativadeLogin = "******"; SqlCommand comandoInserirTentativadeLogin = new SqlCommand(InserirTentativadeLogin, con); comandoInserirTentativadeLogin.Parameters.AddWithValue("@FKId_Contas", Id_Contas); comandoInserirTentativadeLogin.ExecuteNonQuery(); //Criar as sessões de utilizador String ProcurarNomeporId = "SELECT Nome FROM Contas WHERE Id_Contas=@Id_Contas"; SqlCommand comandoProcurarNomeporId = new SqlCommand(ProcurarNomeporId, con); comandoProcurarNomeporId.Parameters.AddWithValue("@Id_Contas", Id_Contas); string Nome = comandoProcurarNomeporId.ExecuteScalar().ToString(); Session["Utilizador"] = null; Session["Nome_Utilizador"] = null; Session["Email_Utilizador"] = null; Session["ListadeCompras"] = null; Session["EmailporConfirmar"] = null; Session["EmailporConfirmarFalhanoEnvio"] = null; Session["SenhaporMudar"] = null; Session["Utilizador"] = Id_Contas; Session["Nome_Utilizador"] = Nome; Session["Email_Utilizador"] = TextBoxEmail.Text; //Se o utilizador tiver qualquer lista de compras guardada, o servidor irá criar a sua sessão de compras //Obter a lista de compras atual String ProcurarListadeCompras = "SELECT Id_ListasdeCompras FROM ListasdeCompras WHERE FKId_Contas=@FKId_Contas and Estado='guardada'"; SqlCommand comandoProcurarListadeCompras = new SqlCommand(ProcurarListadeCompras, con); comandoProcurarListadeCompras.Parameters.AddWithValue("@FKId_Contas", Id_Contas); int IdListasdeCompras; if (comandoProcurarListadeCompras.ExecuteScalar() == null) { IdListasdeCompras = 0; } else { IdListasdeCompras = Int32.Parse(comandoProcurarListadeCompras.ExecuteScalar().ToString()); } if (IdListasdeCompras > 0) { //Obter o Id de todos os artigos nessa lista de compras String ProcurarArtigosnaListadeCompras = "SELECT FKId_ProdutosVariedades FROM ListasdeComprasEntradas WHERE FKId_ListasdeCompras=@FKId_ListasdeCompras"; SqlCommand comandoProcurarArtigosnaListadeCompras = new SqlCommand(ProcurarArtigosnaListadeCompras, con); comandoProcurarArtigosnaListadeCompras.Parameters.AddWithValue("@FKId_ListasdeCompras", IdListasdeCompras); List <int> IdArtigosnaListadeCompras = new List <int>(); SqlDataReader dr3 = comandoProcurarArtigosnaListadeCompras.ExecuteReader(); while (dr3.Read()) { IdArtigosnaListadeCompras.Add(Int32.Parse(dr3["FKId_ProdutosVariedades"].ToString())); } dr3.Close(); ListadeItensdoCarrodeCompras lista = new ListadeItensdoCarrodeCompras(); for (int i = 0; i < IdArtigosnaListadeCompras.Count; i++) { //Através do Id, obter a informação dos artigos e carregá-la para a variável de sessão String ProcurarAtributosdoArtigo = "SELECT * FROM ListasdeComprasEntradas left join ProdutosVariedades on ListasdeComprasEntradas.FKId_ProdutosVariedades = ProdutosVariedades.Id_ProdutosVariedades left join Produtos on ProdutosVariedades.FKId_Produtos = Produtos.Id_Produtos where ListasdeComprasEntradas.FKId_ProdutosVariedades=@FKId_ProdutosVariedades"; SqlCommand comandoProcurarAtributosdoArtigo = new SqlCommand(ProcurarAtributosdoArtigo, con); comandoProcurarAtributosdoArtigo.Parameters.AddWithValue("@FKId_ProdutosVariedades", IdArtigosnaListadeCompras[i]); SqlDataReader dr4 = comandoProcurarAtributosdoArtigo.ExecuteReader(); while (dr4.Read()) { ItemdoCarrodeCompras item = new ItemdoCarrodeCompras(Int32.Parse(dr4["Id_Produtos"].ToString()), Int32.Parse(dr4["Id_ProdutosVariedades"].ToString()), dr4["Nome"].ToString(), dr4["Marca"].ToString(), dr4["Quantidade"].ToString(), float.Parse(dr4["PrecoTotal"].ToString()), Int32.Parse(dr4["Unidades"].ToString())); lista.additem(item); } dr4.Close(); } Session["ListadeCompras"] = lista; } Response.Redirect("Produtos.aspx"); } //Se a palavra-passe estiver errada else { if (Session["PasswordsErradas"] == null) { Session["PasswordsErradas"] = 1; } else { Session["PasswordsErradas"] = Int32.Parse(Session["PasswordsErradas"].ToString()) + 1; } //Inserir a tentativa de login String InserirTentativadeLogin = "******"; SqlCommand comandoInserirTentativadeLogin = new SqlCommand(InserirTentativadeLogin, con); comandoInserirTentativadeLogin.Parameters.AddWithValue("@FKId_Contas", Id_Contas); comandoInserirTentativadeLogin.ExecuteNonQuery(); ///Ver as 10 últimas tentativas de login desta conta, nas últimas 24 horas String ProcurarTentativadeLogin = "******"; SqlCommand comandoProcurarTentativadeLogin = new SqlCommand(ProcurarTentativadeLogin, con); comandoProcurarTentativadeLogin.Parameters.AddWithValue("@Email", TextBoxEmail.Text); DateTime DatadeValidadedaContagem = DateTime.Now.AddDays(-1); comandoProcurarTentativadeLogin.Parameters.AddWithValue("@Data", DatadeValidadedaContagem); SqlDataReader dr3 = comandoProcurarTentativadeLogin.ExecuteReader(); int numerodetentativassemsucesso = 0; while (dr3.Read()) { if (Int16.Parse(dr3["Autenticado"].ToString()) != 1) { numerodetentativassemsucesso++; } else { numerodetentativassemsucesso -= 10; } } dr3.Close(); //Se a conta tiver sido vítima de 10 tentativas de login erradas, seguidas e num período de 24 horas, bloqueá-la if (numerodetentativassemsucesso == 10) { //Inserir o bloqueamento da conta na base de dados String InserirBloqueio = "INSERT INTO ContasBloqueios (FKId_Contas, Data, Estado) VALUES (@Id_Contas, @Data, @Estado)"; SqlCommand comandoInserirBloqueio = new SqlCommand(InserirBloqueio, con); comandoInserirBloqueio.Parameters.AddWithValue("@Id_Contas", Id_Contas); comandoInserirBloqueio.Parameters.AddWithValue("@Data", DateTime.Now); comandoInserirBloqueio.Parameters.AddWithValue("@Estado", 1); comandoInserirBloqueio.ExecuteNonQuery(); //Inserir o código associado ao bloqueio na base de dados, confirmando que este não se repete com qualquer outro código existente GeradordeCodigos Gerador = new GeradordeCodigos(); string CodigodeConfirmacao = ""; int CodigosEncontrados = 1; do { CodigodeConfirmacao = Gerador.GerarCodigo(50); String ProcurarporCodigodeConfirmacao = "SELECT COUNT(*) FROM ContasCodigosdeConfirmacao WHERE CodigodeConfirmacao=@CodigodeConfirmacao"; SqlCommand comandoProcurarporCodigodeConfirmacao = new SqlCommand(ProcurarporCodigodeConfirmacao, con); comandoProcurarporCodigodeConfirmacao.Parameters.AddWithValue("@CodigodeConfirmacao", CodigodeConfirmacao); CodigosEncontrados = Convert.ToInt32(comandoProcurarporCodigodeConfirmacao.ExecuteScalar()); } while (CodigosEncontrados != 0); try { //Enviar o código para o e-email associado à conta bloqueada SmtpClient smtpClient = new SmtpClient("smtp-mail.outlook.com", 25); smtpClient.EnableSsl = true; smtpClient.Port = 587; smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new NetworkCredential("*****@*****.**", "abc123IO"); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; MailMessage mail = new MailMessage("*****@*****.**", "*****@*****.**"); mail.Subject = "A sua conta foi bloqueada."; Uri uri = new Uri("http://*****:*****@FKId_Contas,@CodigodeConfirmacao, 1, 'false', GETDATE())"; SqlCommand comandoInserirCodigodeConfirmacao = new SqlCommand(InserirCodigodeConfirmacao, con); comandoInserirCodigodeConfirmacao.Parameters.AddWithValue("@FKId_Contas", Id_Contas); comandoInserirCodigodeConfirmacao.Parameters.AddWithValue("@CodigodeConfirmacao", CodigodeConfirmacao); comandoInserirCodigodeConfirmacao.ExecuteNonQuery(); ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('Esta conta foi bloqueada devido a demasiadas tentativas de login seguidas e sem sucesso. Enviámos-lhe um e-mail para poder desbloquear a sua conta.');", true); } catch { //Quando a conta de e-mail [email protected] é bloqueada por suspeitas de spam, o programa entra no catch. É um problema básico em que me basta fazer login e confirmar a minha identidade //por telemóvel. ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('Esta conta foi bloqueada devido a demasiadas tentativas de login seguidas e sem sucesso. Por outro lado não foi possível enviar-lhe um e-mail para poder desbloquear a sua conta, iremos enviar-lhe assim que possível. Pedimos desculpas pelo incómodo.');", true); } } else { ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('A palavra-passe está errada.');", true); } } } } } } }
protected void ButtonEnviarConfirmacao_Click(object sender, EventArgs e) { if (ProcurarEmail(TextBoxEnviarConfirmacao.Text)) { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString2"].ConnectionString); con.Open(); //Verificar que a conta ainda não foi confirmada String ProcurarConfirmacaodaConta = "SELECT COUNT(*) FROM Contas WHERE Email=@Email and Confirmada='false'"; SqlCommand comandoProcurarConfirmacaodaConta = new SqlCommand(ProcurarConfirmacaodaConta, con); comandoProcurarConfirmacaodaConta.Parameters.AddWithValue("@Email", TextBoxEnviarConfirmacao.Text); int temp = Int32.Parse(comandoProcurarConfirmacaodaConta.ExecuteScalar().ToString()); if (temp == 0) { ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('A conta associada a este endereço de e-mail já foi confirmada.');", true); } else { String GetIddaConta = "SELECT Id_Contas FROM Contas WHERE Email=@Email"; SqlCommand comandoGetIddaConta = new SqlCommand(GetIddaConta, con); comandoGetIddaConta.Parameters.AddWithValue("@Email", TextBoxEnviarConfirmacao.Text); int IddaConta = Int32.Parse(comandoGetIddaConta.ExecuteScalar().ToString()); //Verificar que não se enviou nenhum e-mail à mesma conta, com o mesmo objetivo de confirmar a conta, à menos de 5 minutos String EvitarSpamdeEmail = "SELECT COUNT(*) FROM ContasCodigosdeConfirmacao WHERE FKId_Contas=@FKId_Contas AND Objetivo='0' AND Usado='false' AND Data>DATEADD(minute, -5, GETDATE())"; SqlCommand comandoEvitarSpamdeEmail = new SqlCommand(EvitarSpamdeEmail, con); comandoEvitarSpamdeEmail.Parameters.AddWithValue("@FKId_Contas", IddaConta); int temp2 = Convert.ToInt32(comandoEvitarSpamdeEmail.ExecuteScalar()); if (temp2 > 0) { ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('Espere 5 minutos antes de pedir um novo e-mail de confirmação.');", true); } else { //Gerar o código de confirmação, certificando-se de que o código não existe na base de dados GeradordeCodigos Gerador = new GeradordeCodigos(); string CodigodeConfirmacao = ""; int CodigosEncontrados = 1; do { CodigodeConfirmacao = Gerador.GerarCodigo(50); //Verificar que o código de confirmação não existe, o que é extremamente improvável String ProcurarporCodigodeConfirmacao = "SELECT COUNT(*) FROM ContasCodigosdeConfirmacao WHERE CodigodeConfirmacao=@CodigodeConfirmacao"; SqlCommand comandoProcurarporCodigodeConfirmacao = new SqlCommand(ProcurarporCodigodeConfirmacao, con); comandoProcurarporCodigodeConfirmacao.Parameters.AddWithValue("@CodigodeConfirmacao", CodigodeConfirmacao); CodigosEncontrados = Convert.ToInt32(comandoProcurarporCodigodeConfirmacao.ExecuteScalar()); } while (CodigosEncontrados != 0); //Enviar o código de confirmação para o e-email SmtpClient smtpClient = new SmtpClient("smtp-mail.outlook.com", 25); smtpClient.Port = 587; smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new System.Net.NetworkCredential("*****@*****.**", "abc123IO"); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.EnableSsl = true; MailMessage mail = new MailMessage("*****@*****.**", "*****@*****.**"); mail.Subject = "Confirme a sua conta."; Uri uri = new Uri("http://*****:*****@FKId_Contas and Objetivo='0'"; SqlCommand comandoInvalidarCodigodeConfirmacao = new SqlCommand(InvalidarCodigodeConfirmacao, con); comandoInvalidarCodigodeConfirmacao.Parameters.AddWithValue("@FKId_Contas", IddaConta); comandoInvalidarCodigodeConfirmacao.ExecuteNonQuery(); //Inserir o código de confirmação String InserirCodigodeConfirmacao = "INSERT INTO ContasCodigosdeConfirmacao (FKId_Contas, CodigodeConfirmacao, Objetivo, Usado, Data) values (@FKId_Contas, @CodigodeConfirmacao, 0, 'false', GETDATE())"; SqlCommand comandoInserirCodigodeConfirmacao = new SqlCommand(InserirCodigodeConfirmacao, con); comandoInserirCodigodeConfirmacao.Parameters.AddWithValue("@FKId_Contas", IddaConta); comandoInserirCodigodeConfirmacao.Parameters.AddWithValue("@CodigodeConfirmacao", CodigodeConfirmacao); comandoInserirCodigodeConfirmacao.ExecuteNonQuery(); ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('E-mail enviado.');", true); } catch { //Caso não seja possível enviar o e-mail, avisar o utilizador. //Quando a conta de e-mail [email protected] é bloqueada por suspeitas de spam, o programa entra no catch. É um problema básico em que me basta fazer login e confirmar a minha identidade //por telemóvel. ClientScript.RegisterStartupScript(this.GetType(), "Aviso", "alert('De momento não é possível enviar-lhe um e-mail de confirmação, por favor tente mais tarde. Pedimos desculpas pelo incómodo.');", true); } } } con.Close(); } }