| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651 |
- //
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- // Copyright © 2006, 2007 Nauck IT KG http://www.nauck-it.de
- //
- // Author:
- // Daniel Nauck <d.nauck(at)nauck-it.de>
- //
- // Adapted to Sqlite by Marek Habersack <[email protected]>
- //
- #if NET_2_0
- using System;
- using System.Data;
- using System.Data.Common;
- using System.Collections.Generic;
- using System.Collections.Specialized;
- using System.Text;
- using System.Security.Cryptography;
- using System.Web.Hosting;
- using System.Web.Configuration;
- using System.Web.Security;
- using System.Configuration;
- using System.Configuration.Provider;
- using System.Diagnostics;
- using Mono.Data.Sqlite;
- namespace System.Web.Security
- {
- internal class SqliteMembershipProvider : MembershipProvider
- {
- private const string m_TableName = "Users";
- private string m_ConnectionString = string.Empty;
- private const int m_NewPasswordLength = 8;
- private bool machineKeyIsAutoGenerated;
-
- // Used when determining encryption key values.
- private MachineKeySection m_MachineKey = null;
- DbParameter AddParameter (DbCommand command, string parameterName, object parameterValue)
- {
- return AddParameter (command, parameterName, ParameterDirection.Input, parameterValue);
- }
- DbParameter AddParameter (DbCommand command, string parameterName, ParameterDirection direction, object parameterValue)
- {
- DbParameter dbp = command.CreateParameter ();
- dbp.ParameterName = parameterName;
- dbp.Value = parameterValue;
- dbp.Direction = direction;
- command.Parameters.Add (dbp);
- return dbp;
- }
- DbParameter AddParameter (DbCommand command, string parameterName, ParameterDirection direction, DbType type, object parameterValue)
- {
- DbParameter dbp = command.CreateParameter ();
- dbp.ParameterName = parameterName;
- dbp.Value = parameterValue;
- dbp.Direction = direction;
- dbp.DbType = type;
- command.Parameters.Add (dbp);
- return dbp;
- }
-
- /// <summary>
- /// System.Configuration.Provider.ProviderBase.Initialize Method.
- /// </summary>
- public override void Initialize(string name, NameValueCollection config)
- {
- // Initialize values from web.config.
- if (config == null)
- throw new ArgumentNullException("Config", Properties.Resources.ErrArgumentNull);
- if (string.IsNullOrEmpty(name))
- name = Properties.Resources.MembershipProviderDefaultName;
- if (string.IsNullOrEmpty(config["description"]))
- {
- config.Remove("description");
- config.Add("description", Properties.Resources.MembershipProviderDefaultDescription);
- }
- // Initialize the abstract base class.
- base.Initialize(name, config);
- m_ApplicationName = GetConfigValue(config["applicationName"], HostingEnvironment.ApplicationVirtualPath);
- m_MaxInvalidPasswordAttempts = Convert.ToInt32(GetConfigValue(config["maxInvalidPasswordAttempts"], "5"));
- m_PasswordAttemptWindow = Convert.ToInt32(GetConfigValue(config["passwordAttemptWindow"], "10"));
- m_MinRequiredNonAlphanumericCharacters = Convert.ToInt32(GetConfigValue(config["minRequiredNonAlphanumericCharacters"], "1"));
- m_MinRequiredPasswordLength = Convert.ToInt32(GetConfigValue(config["minRequiredPasswordLength"], "7"));
- m_PasswordStrengthRegularExpression = Convert.ToString(GetConfigValue(config["passwordStrengthRegularExpression"], ""));
- m_EnablePasswordReset = Convert.ToBoolean(GetConfigValue(config["enablePasswordReset"], "true"));
- m_EnablePasswordRetrieval = Convert.ToBoolean(GetConfigValue(config["enablePasswordRetrieval"], "true"));
- m_RequiresQuestionAndAnswer = Convert.ToBoolean(GetConfigValue(config["requiresQuestionAndAnswer"], "false"));
- m_RequiresUniqueEmail = Convert.ToBoolean(GetConfigValue(config["requiresUniqueEmail"], "true"));
- // Get password encryption type.
- string pwFormat = GetConfigValue(config["passwordFormat"], "Hashed");
- switch (pwFormat)
- {
- case "Hashed":
- m_PasswordFormat = MembershipPasswordFormat.Hashed;
- break;
- case "Encrypted":
- m_PasswordFormat = MembershipPasswordFormat.Encrypted;
- break;
- case "Clear":
- m_PasswordFormat = MembershipPasswordFormat.Clear;
- break;
- default:
- throw new ProviderException(Properties.Resources.ErrPwFormatNotSupported);
- }
- // Get connection string.
- string connStrName = config["connectionStringName"];
-
- if (string.IsNullOrEmpty(connStrName))
- {
- throw new ArgumentOutOfRangeException("ConnectionStringName", Properties.Resources.ErrArgumentNullOrEmpty);
- }
- else
- {
- ConnectionStringSettings ConnectionStringSettings = ConfigurationManager.ConnectionStrings[connStrName];
- if (ConnectionStringSettings == null || string.IsNullOrEmpty(ConnectionStringSettings.ConnectionString.Trim()))
- {
- throw new ProviderException(Properties.Resources.ErrConnectionStringNullOrEmpty);
- }
- m_ConnectionString = ConnectionStringSettings.ConnectionString;
- }
- // Get encryption and decryption key information from the configuration.
- System.Configuration.Configuration cfg = WebConfigurationManager.OpenWebConfiguration(HostingEnvironment.ApplicationVirtualPath);
- m_MachineKey = (MachineKeySection)cfg.GetSection("system.web/machineKey");
- if (!m_PasswordFormat.Equals(MembershipPasswordFormat.Clear))
- {
- if (m_MachineKey == null)
- throw new ArgumentNullException("system.web/machineKey", Properties.Resources.ErrArgumentNull);
- if (m_MachineKey.ValidationKey.Contains("AutoGenerate")) {
- machineKeyIsAutoGenerated = true;
- if (m_PasswordFormat.Equals (MembershipPasswordFormat.Encrypted))
- throw new ProviderException(Properties.Resources.ErrAutoGeneratedKeyNotSupported);
- }
- }
- }
- /// <summary>
- /// System.Web.Security.MembershipProvider properties.
- /// </summary>
- #region System.Web.Security.MembershipProvider properties
- private string m_ApplicationName = string.Empty;
- private bool m_EnablePasswordReset = false;
- private bool m_EnablePasswordRetrieval = false;
- private bool m_RequiresQuestionAndAnswer = false;
- private bool m_RequiresUniqueEmail = false;
- private int m_MaxInvalidPasswordAttempts = 0;
- private int m_PasswordAttemptWindow = 0;
- private MembershipPasswordFormat m_PasswordFormat = MembershipPasswordFormat.Clear;
- private int m_MinRequiredNonAlphanumericCharacters = 0;
- private int m_MinRequiredPasswordLength = 0;
- private string m_PasswordStrengthRegularExpression = string.Empty;
- public override string ApplicationName
- {
- get { return m_ApplicationName; }
- set { m_ApplicationName = value; }
- }
- public override bool EnablePasswordReset
- {
- get { return m_EnablePasswordReset; }
- }
- public override bool EnablePasswordRetrieval
- {
- get { return m_EnablePasswordRetrieval; }
- }
- public override bool RequiresQuestionAndAnswer
- {
- get { return m_RequiresQuestionAndAnswer; }
- }
- public override bool RequiresUniqueEmail
- {
- get { return m_RequiresUniqueEmail; }
- }
- public override int MaxInvalidPasswordAttempts
- {
- get { return m_MaxInvalidPasswordAttempts; }
- }
- public override int PasswordAttemptWindow
- {
- get { return m_PasswordAttemptWindow; }
- }
- public override MembershipPasswordFormat PasswordFormat
- {
- get { return m_PasswordFormat; }
- }
- public override int MinRequiredNonAlphanumericCharacters
- {
- get { return m_MinRequiredNonAlphanumericCharacters; }
- }
- public override int MinRequiredPasswordLength
- {
- get { return m_MinRequiredPasswordLength; }
- }
- public override string PasswordStrengthRegularExpression
- {
- get { return m_PasswordStrengthRegularExpression; }
- }
- #endregion
-
- /// <summary>
- /// System.Web.Security.MembershipProvider methods.
- /// </summary>
- #region System.Web.Security.MembershipProvider methods
- /// <summary>
- /// MembershipProvider.ChangePassword
- /// </summary>
- public override bool ChangePassword(string username, string oldPassword, string newPassword)
- {
- if (!ValidateUser(username, oldPassword))
- return false;
- ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, newPassword, true);
- OnValidatingPassword(args);
- if (args.Cancel)
- {
- if (args.FailureInformation != null)
- throw args.FailureInformation;
- else
- throw new MembershipPasswordException(Properties.Resources.ErrPasswordChangeCanceled);
- }
- int rowsAffected = 0;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"Password\" = @Password, \"LastPasswordChangedDate\" = @LastPasswordChangedDate WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Password", EncodePassword(newPassword));
- AddParameter (dbCommand,"@LastPasswordChangedDate", DateTime.Now);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- rowsAffected = dbCommand.ExecuteNonQuery();
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- if (rowsAffected > 0)
- return true;
- else
- return false;
- }
- /// <summary>
- /// MembershipProvider.ChangePasswordQuestionAndAnswer
- /// </summary>
- public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
- {
- if (!ValidateUser(username, password))
- return false;
- int rowsAffected = 0;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"PasswordQuestion\" = @PasswordQuestion, \"PasswordAnswer\" = @PasswordAnswer WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@PasswordQuestion", newPasswordQuestion);
- AddParameter (dbCommand,"@PasswordAnswer", EncodePassword(newPasswordAnswer));
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- rowsAffected = dbCommand.ExecuteNonQuery();
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- if (rowsAffected > 0)
- return true;
- else
- return false;
- }
- /// <summary>
- /// MembershipProvider.CreateUser
- /// </summary>
- public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved,
- object providerUserKey, out MembershipCreateStatus status)
- {
- ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, password, true);
- OnValidatingPassword(args);
- if (args.Cancel)
- {
- status = MembershipCreateStatus.InvalidPassword;
- return null;
- }
- if (RequiresUniqueEmail && string.IsNullOrEmpty(email))
- {
- status = MembershipCreateStatus.InvalidEmail;
- return null;
- }
- if (RequiresUniqueEmail && !string.IsNullOrEmpty(GetUserNameByEmail(email)))
- {
- status = MembershipCreateStatus.DuplicateEmail;
- return null;
- }
- if (GetUser(username, false) == null)
- {
- DateTime createDate = DateTime.Now;
- if (providerUserKey == null)
- {
- providerUserKey = Guid.NewGuid();
- }
- else
- {
- if (!(providerUserKey is Guid))
- {
- status = MembershipCreateStatus.InvalidProviderUserKey;
- return null;
- }
- }
-
- // Create user in database
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("INSERT INTO \"{0}\" (\"pId\", \"Username\", \"Password\", \"Email\", \"PasswordQuestion\", \"PasswordAnswer\", \"IsApproved\", \"CreationDate\", \"LastPasswordChangedDate\", \"LastActivityDate\", \"ApplicationName\", \"IsLockedOut\", \"LastLockedOutDate\", \"FailedPasswordAttemptCount\", \"FailedPasswordAttemptWindowStart\", \"FailedPasswordAnswerAttemptCount\", \"FailedPasswordAnswerAttemptWindowStart\") Values (@pId, @Username, @Password, @Email, @PasswordQuestion, @PasswordAnswer, @IsApproved, @CreationDate, @LastPasswordChangedDate, @LastActivityDate, @ApplicationName, @IsLockedOut, @LastLockedOutDate, @FailedPasswordAttemptCount, @FailedPasswordAttemptWindowStart, @FailedPasswordAnswerAttemptCount, @FailedPasswordAnswerAttemptWindowStart)", m_TableName);
- AddParameter (dbCommand,"@pId", providerUserKey);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@Password", EncodePassword(password));
- AddParameter (dbCommand,"@Email", email);
- AddParameter (dbCommand,"@PasswordQuestion", passwordQuestion);
- AddParameter (dbCommand,"@PasswordAnswer", EncodePassword(passwordAnswer));
- AddParameter (dbCommand,"@IsApproved", isApproved);
- AddParameter (dbCommand,"@CreationDate", createDate);
- AddParameter (dbCommand,"@LastPasswordChangedDate", createDate);
- AddParameter (dbCommand,"@LastActivityDate", createDate);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- AddParameter (dbCommand,"@IsLockedOut", false);
- AddParameter (dbCommand,"@LastLockedOutDate", createDate);
- AddParameter (dbCommand,"@FailedPasswordAttemptCount", 0);
- AddParameter (dbCommand,"@FailedPasswordAttemptWindowStart", createDate);
- AddParameter (dbCommand,"@FailedPasswordAnswerAttemptCount", 0);
- AddParameter (dbCommand,"@FailedPasswordAnswerAttemptWindowStart", createDate);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- if (dbCommand.ExecuteNonQuery() > 0)
- {
- status = MembershipCreateStatus.Success;
- }
- else
- {
- status = MembershipCreateStatus.UserRejected;
- }
- }
- catch (SqliteException e)
- {
- status = MembershipCreateStatus.ProviderError;
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- return GetUser(username, false);
- }
- }
- }
- else
- {
- status = MembershipCreateStatus.DuplicateUserName;
- }
- return null;
- }
- /// <summary>
- /// MembershipProvider.DeleteUser
- /// </summary>
- public override bool DeleteUser(string username, bool deleteAllRelatedData)
- {
- int rowsAffected = 0;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("DELETE FROM \"{0}\" WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- rowsAffected = dbCommand.ExecuteNonQuery();
- if (deleteAllRelatedData)
- {
- // Process commands to delete all data for the user in the database.
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- if (rowsAffected > 0)
- return true;
- else
- return false;
- }
- /// <summary>
- /// MembershipProvider.FindUsersByEmail
- /// </summary>
- public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
- {
- totalRecords = 0;
- MembershipUserCollection users = new MembershipUserCollection();
- // replace permitted wildcard characters
- emailToMatch = emailToMatch.Replace('*','%');
- emailToMatch = emailToMatch.Replace('?', '_');
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- // Get user count
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT Count(*) FROM \"{0}\" WHERE \"Email\" LIKE @Email AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Email", emailToMatch);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- Int32.TryParse(dbCommand.ExecuteScalar().ToString(), out totalRecords);
- if (totalRecords <= 0) { return users; }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- // Fetch user from database
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"pId\", \"Username\", \"Email\", \"PasswordQuestion\", \"Comment\", \"IsApproved\", \"IsLockedOut\", \"CreationDate\", \"LastLoginDate\", \"LastActivityDate\", \"LastPasswordChangedDate\", \"LastLockedOutDate\" FROM \"{0}\" WHERE \"Email\" LIKE @Email AND \"ApplicationName\" = @ApplicationName ORDER BY \"Username\" ASC LIMIT @MaxCount OFFSET @StartIndex", m_TableName);
- AddParameter (dbCommand,"@Email", emailToMatch);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- AddParameter (dbCommand,"@MaxCount", pageSize);
- AddParameter (dbCommand,"@StartIndex", pageSize * pageIndex);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- using (SqliteDataReader reader = dbCommand.ExecuteReader())
- {
- while (reader.Read())
- {
- MembershipUser u = GetUserFromReader(reader);
- users.Add(u);
- }
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- return users;
- }
- /// <summary>
- /// MembershipProvider.FindUsersByName
- /// </summary>
- public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
- {
- totalRecords = 0;
- MembershipUserCollection users = new MembershipUserCollection();
- // replace permitted wildcard characters
- usernameToMatch = usernameToMatch.Replace('*', '%');
- usernameToMatch = usernameToMatch.Replace('?', '_');
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- // Get user count
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT Count(*) FROM \"{0}\" WHERE \"Username\" LIKE @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Username", usernameToMatch);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- Int32.TryParse(dbCommand.ExecuteScalar().ToString(), out totalRecords);
- if (totalRecords <= 0) { return users; }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- // Fetch user from database
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"pId\", \"Username\", \"Email\", \"PasswordQuestion\", \"Comment\", \"IsApproved\", \"IsLockedOut\", \"CreationDate\", \"LastLoginDate\", \"LastActivityDate\", \"LastPasswordChangedDate\", \"LastLockedOutDate\" FROM \"{0}\" WHERE \"Username\" LIKE @Username AND \"ApplicationName\" = @ApplicationName ORDER BY \"Username\" ASC LIMIT @MaxCount OFFSET @StartIndex", m_TableName);
- AddParameter (dbCommand,"@Username", usernameToMatch);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- AddParameter (dbCommand,"@MaxCount", pageSize);
- AddParameter (dbCommand,"@StartIndex", pageSize * pageIndex);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- using (SqliteDataReader reader = dbCommand.ExecuteReader())
- {
- while (reader.Read())
- {
- MembershipUser u = GetUserFromReader(reader);
- users.Add(u);
- }
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- return users;
- }
- /// <summary>
- /// MembershipProvider.GetAllUsers
- /// </summary>
- public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
- {
- totalRecords = 0;
- MembershipUserCollection users = new MembershipUserCollection();
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- // Get user count
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT Count(*) FROM \"{0}\" WHERE \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- Int32.TryParse(dbCommand.ExecuteScalar().ToString(), out totalRecords);
- if (totalRecords <= 0) { return users; }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw e;
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- // Fetch user from database
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"pId\", \"Username\", \"Email\", \"PasswordQuestion\", \"Comment\", \"IsApproved\", \"IsLockedOut\", \"CreationDate\", \"LastLoginDate\", \"LastActivityDate\", \"LastPasswordChangedDate\", \"LastLockedOutDate\" FROM \"{0}\" WHERE \"ApplicationName\" = @ApplicationName ORDER BY \"Username\" ASC LIMIT @MaxCount OFFSET @StartIndex", m_TableName);
-
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- AddParameter (dbCommand,"@MaxCount", pageSize);
- AddParameter (dbCommand,"@StartIndex", pageSize * pageIndex);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- using (SqliteDataReader reader = dbCommand.ExecuteReader())
- {
- while (reader.Read())
- {
- MembershipUser u = GetUserFromReader(reader);
- users.Add(u);
- }
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- return users;
- }
- /// <summary>
- /// MembershipProvider.GetNumberOfUsersOnline
- /// </summary>
- public override int GetNumberOfUsersOnline()
- {
- int numOnline = 0;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- TimeSpan onlineSpan = new TimeSpan(0, System.Web.Security.Membership.UserIsOnlineTimeWindow, 0);
- DateTime compareTime = DateTime.Now.Subtract(onlineSpan);
- dbCommand.CommandText = string.Format("SELECT Count(*) FROM \"{0}\" WHERE \"LastActivityDate\" > @CompareTime AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@CompareTime", compareTime);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- numOnline = (int)dbCommand.ExecuteScalar();
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- return numOnline;
- }
- /// <summary>
- /// MembershipProvider.GetPassword
- /// </summary>
- public override string GetPassword(string username, string answer)
- {
- if (!EnablePasswordRetrieval)
- {
- throw new ProviderException(Properties.Resources.ErrPasswordRetrievalNotEnabled);
- }
- if (PasswordFormat == MembershipPasswordFormat.Hashed)
- {
- throw new ProviderException(Properties.Resources.ErrCantRetrieveHashedPw);
- }
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"Password\", \"PasswordAnswer\", \"IsLockedOut\" FROM \"{0}\" WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- using (SqliteDataReader reader = dbCommand.ExecuteReader())
- {
- if (reader.HasRows)
- {
- reader.Read();
- string password = reader.GetString(0);
- string passwordAnswer = reader.GetString(1);
- bool isLockedOut = reader.GetBoolean(2);
- reader.Close();
- if (isLockedOut)
- throw new MembershipPasswordException(Properties.Resources.ErrUserIsLoggedOut);
- if (m_RequiresQuestionAndAnswer && !CheckPassword(answer, passwordAnswer))
- {
- UpdateFailureCount(username, FailureType.PasswordAnswer);
- throw new MembershipPasswordException(Properties.Resources.ErrIncorrectPasswordAnswer);
- }
- if (m_PasswordFormat == MembershipPasswordFormat.Encrypted)
- {
- password = UnEncodePassword(password);
- }
- return password;
- }
- else
- {
- throw new MembershipPasswordException(Properties.Resources.ErrUserNotFound);
- }
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- }
- /// <summary>
- /// MembershipProvider.GetUser
- /// </summary>
- public override MembershipUser GetUser(string username, bool userIsOnline)
- {
- MembershipUser u = null;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"pId\", \"Username\", \"Email\", \"PasswordQuestion\", \"Comment\", \"IsApproved\", \"IsLockedOut\", \"CreationDate\", \"LastLoginDate\", \"LastActivityDate\", \"LastPasswordChangedDate\", \"LastLockedOutDate\" FROM \"{0}\" WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- using (SqliteDataReader reader = dbCommand.ExecuteReader())
- {
- if (reader.HasRows)
- {
- reader.Read();
- u = GetUserFromReader(reader);
- if (userIsOnline)
- {
- // Update user online status
- using (SqliteCommand dbUpdateCommand = dbConn.CreateCommand())
- {
- dbUpdateCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"LastActivityDate\" = @LastActivityDate WHERE \"pId\" = @pId", m_TableName);
- AddParameter (dbUpdateCommand, "@LastActivityDate", DateTime.Now);
- AddParameter (dbUpdateCommand, "@pId", u.ProviderUserKey);
- dbUpdateCommand.Prepare();
- dbUpdateCommand.ExecuteNonQuery();
- }
- }
- }
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- return u;
- }
- /// <summary>
- /// MembershipProvider.GetUser
- /// </summary>
- public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
- {
- MembershipUser u = null;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"pId\", \"Username\", \"Email\", \"PasswordQuestion\", \"Comment\", \"IsApproved\", \"IsLockedOut\", \"CreationDate\", \"LastLoginDate\", \"LastActivityDate\", \"LastPasswordChangedDate\", \"LastLockedOutDate\" FROM \"{0}\" WHERE \"pId\" = @pId", m_TableName);
- AddParameter (dbCommand,"@pId", providerUserKey);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- using (SqliteDataReader reader = dbCommand.ExecuteReader())
- {
- if (reader.HasRows)
- {
- reader.Read();
- u = GetUserFromReader(reader);
- if (userIsOnline)
- {
- // Update user online status
- using (SqliteCommand dbUpdateCommand = dbConn.CreateCommand())
- {
- dbUpdateCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"LastActivityDate\" = @LastActivityDate WHERE \"pId\" = @pId", m_TableName);
- AddParameter (dbUpdateCommand, "@LastActivityDate", DateTime.Now);
- AddParameter (dbUpdateCommand, "@pId", u.ProviderUserKey);
- dbUpdateCommand.Prepare();
- dbUpdateCommand.ExecuteNonQuery();
- }
- }
- }
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- return u;
- }
- /// <summary>
- /// MembershipProvider.GetUserNameByEmail
- /// </summary>
- public override string GetUserNameByEmail(string email)
- {
- string username = string.Empty;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"Username\" FROM \"{0}\" WHERE \"Email\" = @Email AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Email", email);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- username = (dbCommand.ExecuteScalar() as string) ?? string.Empty;
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- return username;
- }
- /// <summary>
- /// MembershipProvider.ResetPassword
- /// </summary>
- public override string ResetPassword(string username, string answer)
- {
- if (!m_EnablePasswordReset)
- {
- throw new NotSupportedException(Properties.Resources.ErrPasswordResetNotEnabled);
- }
- if (string.IsNullOrEmpty(answer) && m_RequiresQuestionAndAnswer)
- {
- UpdateFailureCount(username, FailureType.PasswordAnswer);
- throw new ProviderException(Properties.Resources.ErrPasswordAnswerRequired);
- }
- string newPassword = Membership.GeneratePassword(m_NewPasswordLength, m_MinRequiredNonAlphanumericCharacters);
- ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, newPassword, true);
- OnValidatingPassword(args);
- if (args.Cancel)
- {
- if (args.FailureInformation != null)
- throw args.FailureInformation;
- else
- throw new MembershipPasswordException(Properties.Resources.ErrPasswordResetCanceled);
- }
- int rowsAffected = 0;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"PasswordAnswer\", \"IsLockedOut\" FROM \"{0}\" WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- string passwordAnswer = string.Empty;
- dbConn.Open();
- dbCommand.Prepare();
- using (SqliteDataReader reader = dbCommand.ExecuteReader())
- {
- if (reader.HasRows)
- {
- reader.Read();
- passwordAnswer = reader.GetString(0);
- bool isLockedOut = reader.GetBoolean(1);
- reader.Close();
- if (isLockedOut)
- throw new MembershipPasswordException(Properties.Resources.ErrUserIsLoggedOut);
- if (m_RequiresQuestionAndAnswer && !CheckPassword(answer, passwordAnswer))
- {
- UpdateFailureCount(username, FailureType.PasswordAnswer);
- throw new MembershipPasswordException(Properties.Resources.ErrIncorrectPasswordAnswer);
- }
- }
- else
- {
- throw new MembershipPasswordException(Properties.Resources.ErrUserNotFound);
- }
- }
- // Reset Password
- using (SqliteCommand dbUpdateCommand = dbConn.CreateCommand())
- {
- dbUpdateCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"Password\" = @Password, \"LastPasswordChangedDate\" = @LastPasswordChangedDate WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName AND \"IsLockedOut\" = @IsLockedOut", m_TableName);
- AddParameter (dbUpdateCommand, "@Password", EncodePassword(newPassword));
- AddParameter (dbUpdateCommand, "@LastPasswordChangedDate", DateTime.Now);
- AddParameter (dbUpdateCommand, "@Username", username);
- AddParameter (dbUpdateCommand, "@ApplicationName", m_ApplicationName);
- AddParameter (dbUpdateCommand, "@IsLockedOut", false);
- dbUpdateCommand.Prepare();
- rowsAffected = dbUpdateCommand.ExecuteNonQuery();
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- if (rowsAffected > 0)
- return newPassword;
-
- else
- throw new MembershipPasswordException(Properties.Resources.ErrPasswordResetAborted);
- }
- /// <summary>
- /// MembershipProvider.UnlockUser
- /// </summary>
- public override bool UnlockUser(string userName)
- {
- int rowsAffected = 0;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"IsLockedOut\" = @IsLockedOut, \"LastLockedOutDate\" = @LastLockedOutDate WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@IsLockedOut", false);
- AddParameter (dbCommand,"@LastLockedOutDate", DateTime.Now);
- AddParameter (dbCommand,"@Username", userName);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- rowsAffected = dbCommand.ExecuteNonQuery();
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- if (rowsAffected > 0)
- return true;
- else
- return false;
- }
- /// <summary>
- /// MembershipProvider.UpdateUser
- /// </summary>
- public override void UpdateUser(MembershipUser user)
- {
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"Email\" = @Email, \"Comment\" = @Comment, \"IsApproved\" = @IsApproved WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Email", user.Email);
- AddParameter (dbCommand,"@Comment", user.Comment);
- AddParameter (dbCommand,"@IsApproved", user.IsApproved);
- AddParameter (dbCommand,"@Username", user.UserName);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- dbCommand.ExecuteNonQuery();
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- }
- /// <summary>
- /// MembershipProvider.ValidateUser
- /// </summary>
- public override bool ValidateUser(string username, string password)
- {
- string dbPassword = string.Empty;
- bool dbIsApproved = false;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- // Fetch user data from database
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"Password\", \"IsApproved\" FROM \"{0}\" WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName AND \"IsLockedOut\" = @IsLockedOut", m_TableName);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- AddParameter (dbCommand,"@IsLockedOut", false);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- using (SqliteDataReader reader = dbCommand.ExecuteReader())
- {
- if (reader.HasRows)
- {
- reader.Read();
- dbPassword = reader.GetString(0);
- dbIsApproved = reader.GetBoolean(1);
- }
- else
- {
- return false;
- }
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- if (CheckPassword(password, dbPassword))
- {
- if (dbIsApproved)
- {
- // Update last login date
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"LastLoginDate\" = @LastLoginDate WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@LastLoginDate", DateTime.Now);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- dbCommand.ExecuteNonQuery();
- return true;
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- }
- return false;
- }
- }
- #endregion
- #region private methods
- /// <summary>
- /// A helper function to retrieve config values from the configuration file.
- /// </summary>
- /// <param name="configValue"></param>
- /// <param name="defaultValue"></param>
- /// <returns></returns>
- private string GetConfigValue(string configValue, string defaultValue)
- {
- if (string.IsNullOrEmpty(configValue))
- return defaultValue;
- return configValue;
- }
- /// <summary>
- /// A helper function that takes the current row from the SqliteDataReader
- /// and hydrates a MembershipUser from the values. Called by the
- /// MembershipUser.GetUser implementation.
- /// </summary>
- /// <param name="reader">SqliteDataReader object</param>
- /// <returns>MembershipUser object</returns>
- private MembershipUser GetUserFromReader(SqliteDataReader reader)
- {
- object providerUserKey = reader.GetValue(0);
- string username = reader.GetString(1);
- string email = string.Empty;
- if (!reader.IsDBNull(2))
- email = reader.GetString(2);
- string passwordQuestion = string.Empty;
- if (!reader.IsDBNull(3))
- passwordQuestion = reader.GetString(3);
-
- string comment = string.Empty;
- if (!reader.IsDBNull(4))
- comment = reader.GetString(4);
- bool isApproved = reader.GetBoolean(5);
- bool isLockedOut = reader.GetBoolean(6);
- DateTime creationDate = reader.GetDateTime(7);
- DateTime lastLoginDate = new DateTime();
- if (!reader.IsDBNull(8))
- lastLoginDate = reader.GetDateTime(8);
- DateTime lastActivityDate = reader.GetDateTime(9);
- DateTime lastPasswordChangedDate = reader.GetDateTime(10);
- DateTime lastLockedOutDate = new DateTime();
- if (!reader.IsDBNull(11))
- lastLockedOutDate = reader.GetDateTime(11);
- MembershipUser u = new MembershipUser(this.Name,
- username,
- providerUserKey,
- email,
- passwordQuestion,
- comment,
- isApproved,
- isLockedOut,
- creationDate,
- lastLoginDate,
- lastActivityDate,
- lastPasswordChangedDate,
- lastLockedOutDate);
-
- return u;
- }
- /// <summary>
- /// Compares password values based on the MembershipPasswordFormat.
- /// </summary>
- /// <param name="password"></param>
- /// <param name="dbpassword"></param>
- /// <returns></returns>
- private bool CheckPassword(string password, string dbpassword)
- {
- string pass1 = password;
- string pass2 = dbpassword;
- switch (PasswordFormat)
- {
- case MembershipPasswordFormat.Encrypted:
- pass2 = UnEncodePassword(dbpassword);
- break;
- case MembershipPasswordFormat.Hashed:
- pass1 = EncodePassword(password);
- break;
- default:
- break;
- }
- if (pass1.Equals(pass2))
- return true;
- else
- return false;
- }
- /// <summary>
- /// Encrypts, Hashes, or leaves the password clear based on the PasswordFormat.
- /// </summary>
- /// <param name="password"></param>
- /// <returns></returns>
- private string EncodePassword(string password)
- {
- if (string.IsNullOrEmpty(password))
- return password;
- string encodedPassword = password;
- switch (PasswordFormat)
- {
- case MembershipPasswordFormat.Clear:
- break;
- case MembershipPasswordFormat.Encrypted:
- encodedPassword = Convert.ToBase64String(EncryptPassword(Encoding.Unicode.GetBytes(password)));
- break;
- case MembershipPasswordFormat.Hashed:
- HMACSHA1 hash = new HMACSHA1();
- if (machineKeyIsAutoGenerated)
- hash.Key = MachineKeySectionUtils.ValidationKeyBytes ();
- else
- hash.Key = HexToByte(m_MachineKey.ValidationKey);
- encodedPassword = Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password)));
- break;
- default:
- throw new ProviderException(Properties.Resources.ErrPwFormatNotSupported);
- }
- return encodedPassword;
- }
- /// <summary>
- /// Decrypts or leaves the password clear based on the PasswordFormat.
- /// </summary>
- /// <param name="encodedPassword"></param>
- /// <returns></returns>
- private string UnEncodePassword(string encodedPassword)
- {
- string password = encodedPassword;
- switch (PasswordFormat)
- {
- case MembershipPasswordFormat.Clear:
- break;
- case MembershipPasswordFormat.Encrypted:
- password = Encoding.Unicode.GetString(DecryptPassword(Convert.FromBase64String(password)));
- break;
- case MembershipPasswordFormat.Hashed:
- throw new ProviderException(Properties.Resources.ErrCantDecodeHashedPw);
- default:
- throw new ProviderException(Properties.Resources.ErrPwFormatNotSupported);
- }
- return password;
- }
- /// <summary>
- /// Converts a hexadecimal string to a byte array. Used to convert encryption
- /// key values from the configuration.
- /// </summary>
- /// <param name="hexString"></param>
- /// <returns></returns>
- private byte[] HexToByte(string hexString)
- {
- byte[] returnBytes = new byte[hexString.Length / 2];
- for (int i = 0; i < returnBytes.Length; i++)
- returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
- return returnBytes;
- }
- /// <summary>
- /// A helper method that performs the checks and updates associated with
- /// password failure tracking.
- /// </summary>
- /// <param name="username"></param>
- /// <param name="failType"></param>
- private void UpdateFailureCount(string username, FailureType failType)
- {
- DateTime windowStart = new DateTime();
- int failureCount = 0;
- using (SqliteConnection dbConn = new SqliteConnection(m_ConnectionString))
- {
- // Fetch user data from database
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- dbCommand.CommandText = string.Format("SELECT \"FailedPasswordAttemptCount\", \"FailedPasswordAttemptWindowStart\", \"FailedPasswordAnswerAttemptCount\", \"FailedPasswordAnswerAttemptWindowStart\" FROM \"{0}\" WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- try
- {
- dbConn.Open();
- dbCommand.Prepare();
- using (SqliteDataReader reader = dbCommand.ExecuteReader())
- {
- if (reader.HasRows)
- {
- reader.Read();
- if (failType.Equals(FailureType.Password))
- {
- failureCount = reader.GetInt32(0);
- windowStart = reader.GetDateTime(1);
- }
- else if (failType.Equals(FailureType.PasswordAnswer))
- {
- failureCount = reader.GetInt32(2);
- windowStart = reader.GetDateTime(3);
- }
- }
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- // Calculate failture count and update database
- using (SqliteCommand dbCommand = dbConn.CreateCommand())
- {
- DateTime windowEnd = windowStart.AddMinutes(m_PasswordAttemptWindow);
- try
- {
- if (failureCount == 0 || DateTime.Now > windowEnd)
- {
- // First password failure or outside of PasswordAttemptWindow.
- // Start a new password failure count from 1 and a new window starting now.
- if (failType.Equals(FailureType.Password))
- {
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"FailedPasswordAttemptCount\" = @Count, \"FailedPasswordAttemptWindowStart\" = @WindowStart WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- }
- else if (failType.Equals(FailureType.PasswordAnswer))
- {
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"FailedPasswordAnswerAttemptCount\" = @Count, \"FailedPasswordAnswerAttemptWindowStart\" = @WindowStart WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- }
- AddParameter (dbCommand,"@Count", 1);
- AddParameter (dbCommand,"@WindowStart", DateTime.Now);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- if (dbCommand.ExecuteNonQuery() < 0)
- throw new ProviderException(Properties.Resources.ErrCantUpdateFailtureCountAndWindowStart);
- }
- else
- {
- failureCount++;
- if (failureCount >= m_MaxInvalidPasswordAttempts)
- {
- // Password attempts have exceeded the failure threshold. Lock out
- // the user.
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"IsLockedOut\" = @IsLockedOut, \"LastLockedOutDate\" = @LastLockedOutDate WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- AddParameter (dbCommand,"@IsLockedOut", true);
- AddParameter (dbCommand,"@LastLockedOutDate", DateTime.Now);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- if (dbCommand.ExecuteNonQuery() < 0)
- throw new ProviderException(string.Format(Properties.Resources.ErrCantLogoutUser, username));
- }
- else
- {
- // Password attempts have not exceeded the failure threshold. Update
- // the failure counts. Leave the window the same.
- if (failType.Equals(FailureType.Password))
- {
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"FailedPasswordAttemptCount\" = @Count WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- }
- else if (failType.Equals(FailureType.PasswordAnswer))
- {
- dbCommand.CommandText = string.Format("UPDATE \"{0}\" SET \"FailedPasswordAnswerAttemptCount\" = @Count WHERE \"Username\" = @Username AND \"ApplicationName\" = @ApplicationName", m_TableName);
- }
- AddParameter (dbCommand,"@Count", failureCount);
- AddParameter (dbCommand,"@Username", username);
- AddParameter (dbCommand,"@ApplicationName", m_ApplicationName);
- if (dbCommand.ExecuteNonQuery() < 0)
- throw new ProviderException(Properties.Resources.ErrCantUpdateFailtureCount);
- }
- }
- }
- catch (SqliteException e)
- {
- Trace.WriteLine(e.ToString());
- throw new ProviderException(Properties.Resources.ErrOperationAborted);
- }
- finally
- {
- if (dbConn != null)
- dbConn.Close();
- }
- }
- }
- }
- private enum FailureType
- {
- Password,
- PasswordAnswer
- }
- #endregion
- }
- }
- #endif
|