diff --git a/src/Umbraco.Core/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs
index b8161b9480..81cec10f94 100644
--- a/src/Umbraco.Core/Constants-Conventions.cs
+++ b/src/Umbraco.Core/Constants-Conventions.cs
@@ -99,6 +99,10 @@ namespace Umbraco.Core
///
public static class Member
{
+ public static readonly string UmbracoMemberProviderName = "UmbracoMembershipProvider";
+
+ public static readonly string UmbracoRoleProviderName = "UmbracoRoleProvider";
+
///
/// Property alias for a Members Password Question
///
diff --git a/src/Umbraco.Core/Models/PagedResult.cs b/src/Umbraco.Core/Models/PagedResult.cs
new file mode 100644
index 0000000000..2e35da9a96
--- /dev/null
+++ b/src/Umbraco.Core/Models/PagedResult.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+
+namespace Umbraco.Core.Models
+{
+ ///
+ /// Represents a paged result for a model collection
+ ///
+ ///
+ [DataContract(Name = "pagedCollection", Namespace = "")]
+ public class PagedResult
+ {
+ public PagedResult(long totalItems, long pageNumber, long pageSize)
+ {
+ TotalItems = totalItems;
+ PageNumber = pageNumber;
+ PageSize = pageSize;
+
+ if (pageSize > 0)
+ {
+ TotalPages = (long) Math.Ceiling(totalItems/(Decimal) pageSize);
+ }
+ else
+ {
+ TotalPages = 1;
+ }
+ }
+
+ [DataMember(Name = "pageNumber")]
+ public long PageNumber { get; private set; }
+
+ [DataMember(Name = "pageSize")]
+ public long PageSize { get; private set; }
+
+ [DataMember(Name = "totalPages")]
+ public long TotalPages { get; private set; }
+
+ [DataMember(Name = "totalItems")]
+ public long TotalItems { get; private set; }
+
+ [DataMember(Name = "items")]
+ public IEnumerable Items { get; set; }
+
+ ///
+ /// Calculates the skip size based on the paged parameters specified
+ ///
+ ///
+ /// Returns 0 if the page number or page size is zero
+ ///
+ internal int SkipSize
+ {
+ get
+ {
+ if (PageNumber > 0 && PageSize > 0)
+ {
+ return Convert.ToInt32((PageNumber - 1)*PageSize);
+ }
+ return 0;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs
index eb10bf7f87..f249ca4577 100644
--- a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs
+++ b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Data;
using System.Linq;
+using System.Text.RegularExpressions;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.Rdbms;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
@@ -17,6 +18,19 @@ namespace Umbraco.Core.Persistence
internal static event CreateTableEventHandler NewTable;
+ ///
+ /// This will escape single @ symbols for peta poco values so it doesn't think it's a parameter
+ ///
+ ///
+ ///
+ ///
+ public static string EscapeAtSymbols(this Database db, string value)
+ {
+ //this fancy regex will only match a single @ not a double, etc...
+ var regex = new Regex("(?(this Database db)
where T : new()
{
diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs
index be959da07c..c0df447dfa 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs
@@ -11,5 +11,7 @@ namespace Umbraco.Core.Persistence.Repositories
///
///
IEnumerable GetByMemberGroup(string groupName);
+
+ IEnumerable GetMembersByEmails(params string[] emails);
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
index caa92f94ef..bd3bba2ccd 100644
--- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
@@ -404,6 +404,28 @@ namespace Umbraco.Core.Persistence.Repositories
return BuildFromDtos(dtos);
}
+ public IEnumerable GetMembersByEmails(params string[] emails)
+ {
+ var sql = GetBaseQuery(false);
+ if (emails.Any())
+ {
+ var statement = string.Join(" OR ",
+ emails.Select(x =>
+ string.Format(
+ "cmsMember.Email='{0}'",
+ //we have to escape the @ symbol for petapoco to work!! with 2 @@ symbols
+ Database.EscapeAtSymbols(x))));
+ sql.Where(statement);
+ }
+ sql.OrderByDescending(x => x.VersionDate);
+
+ var dtos =
+ Database.Fetch(
+ new PropertyDataRelator().Map, sql);
+
+ return BuildFromDtos(dtos);
+ }
+
private IMember BuildFromDto(List dtos)
{
if (dtos == null || dtos.Any() == false)
diff --git a/src/Umbraco.Core/Properties/AssemblyInfo.cs b/src/Umbraco.Core/Properties/AssemblyInfo.cs
index f58744b9f5..641fde43a1 100644
--- a/src/Umbraco.Core/Properties/AssemblyInfo.cs
+++ b/src/Umbraco.Core/Properties/AssemblyInfo.cs
@@ -43,4 +43,5 @@ using System.Security.Permissions;
[assembly: InternalsVisibleTo("Concorde.Sync")]
[assembly: InternalsVisibleTo("Umbraco.Belle")]
-[assembly: InternalsVisibleTo("Umbraco.VisualStudio")]
\ No newline at end of file
+[assembly: InternalsVisibleTo("Umbraco.VisualStudio")]
+[assembly: InternalsVisibleTo("umbraco.providers")]
\ No newline at end of file
diff --git a/src/Umbraco.Core/Services/IMemberService.cs b/src/Umbraco.Core/Services/IMemberService.cs
index a6a2a14424..343f1b47b5 100644
--- a/src/Umbraco.Core/Services/IMemberService.cs
+++ b/src/Umbraco.Core/Services/IMemberService.cs
@@ -35,5 +35,7 @@ namespace Umbraco.Core.Services
void Delete(IMember membershipUser);
void Save(IMember membershipUser);
+
+ IEnumerable GetMembersByEmails(params string[] emails);
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs
index 914ef70e60..21cce31400 100644
--- a/src/Umbraco.Core/Services/MemberService.cs
+++ b/src/Umbraco.Core/Services/MemberService.cs
@@ -108,6 +108,14 @@ namespace Umbraco.Core.Services
}
}
+ public IEnumerable GetMembersByEmails(params string[] emails)
+ {
+ using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
+ {
+ return repository.GetMembersByEmails(emails);
+ }
+ }
+
///
/// Gets a list of Members with a certain string property value
///
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index 5db9dd7d56..ff48c7bcc5 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -209,6 +209,7 @@
+
diff --git a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs
index b02ed4ecf2..0cc4146f85 100644
--- a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs
+++ b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Specialized;
using System.Configuration.Provider;
+using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
@@ -8,6 +9,7 @@ using System.Web.Hosting;
using System.Web.Security;
using Umbraco.Core;
using Umbraco.Core.Logging;
+using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Core.Models.Membership;
@@ -687,7 +689,16 @@ namespace Umbraco.Web.Security.Providers
///
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
- throw new System.NotImplementedException();
+ var byEmail = MemberService.GetMembersByEmails(emailToMatch).ToArray();
+ totalRecords = byEmail.Length;
+ var pagedResult = new PagedResult(totalRecords, pageIndex, pageSize);
+
+ var collection = new MembershipUserCollection();
+ foreach (var m in byEmail.Skip(pagedResult.SkipSize).Take(pageSize))
+ {
+ collection.Add(m.AsConcreteMembershipUser());
+ }
+ return collection;
}
#region Private methods
diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs
index 947330b292..b6c6a9be18 100644
--- a/src/umbraco.cms/businesslogic/member/Member.cs
+++ b/src/umbraco.cms/businesslogic/member/Member.cs
@@ -30,8 +30,8 @@ namespace umbraco.cms.businesslogic.member
public class Member : Content
{
#region Constants and static members
- public static readonly string UmbracoMemberProviderName = "UmbracoMembershipProvider";
- public static readonly string UmbracoRoleProviderName = "UmbracoRoleProvider";
+ public static readonly string UmbracoMemberProviderName = Constants.Conventions.Member.UmbracoMemberProviderName;
+ public static readonly string UmbracoRoleProviderName = Constants.Conventions.Member.UmbracoRoleProviderName;
public static readonly Guid _objectType = new Guid(Constants.ObjectTypes.Member);
private static readonly object m_Locker = new object();
diff --git a/src/umbraco.providers/members/MembersMembershipProvider.cs b/src/umbraco.providers/members/MembersMembershipProvider.cs
index 0572613d78..7c8fe8e63a 100644
--- a/src/umbraco.providers/members/MembersMembershipProvider.cs
+++ b/src/umbraco.providers/members/MembersMembershipProvider.cs
@@ -1,20 +1,26 @@
#region namespace
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Text;
using System.Web.Security;
using System.Configuration;
+using Umbraco.Core;
+using Umbraco.Core.Models;
using umbraco.BusinessLogic;
using System.Security.Cryptography;
using System.Web.Util;
using System.Collections.Specialized;
using System.Configuration.Provider;
using umbraco.cms.businesslogic;
-using umbraco.cms.businesslogic.member;
-
using System.Security;
using System.Security.Permissions;
using System.Runtime.CompilerServices;
+using Member = umbraco.cms.businesslogic.member.Member;
+using MemberType = umbraco.cms.businesslogic.member.MemberType;
+using Umbraco.Core.Models.Membership;
+using User = umbraco.BusinessLogic.User;
+
#endregion
namespace umbraco.providers.members
@@ -439,7 +445,16 @@ namespace umbraco.providers.members
///
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
- throw new Exception("The method or operation is not implemented.");
+ var byEmail = ApplicationContext.Current.Services.MemberService.GetMembersByEmails(emailToMatch).ToArray();
+ totalRecords = byEmail.Length;
+ var pagedResult = new PagedResult(totalRecords, pageIndex, pageSize);
+
+ var collection = new MembershipUserCollection();
+ foreach (var m in byEmail.Skip(pagedResult.SkipSize).Take(pageSize))
+ {
+ collection.Add(m.AsConcreteMembershipUser());
+ }
+ return collection;
}
///
@@ -751,7 +766,7 @@ namespace umbraco.providers.members
return null;
}
-
+
///
/// Verifies that the specified user name and password exist in the data source.
///
@@ -973,6 +988,7 @@ namespace umbraco.providers.members
DateTime.Now, DateTime.Now, DateTime.Now);
}
}
+
#endregion
}
}
diff --git a/src/umbraco.providers/umbraco.providers.csproj b/src/umbraco.providers/umbraco.providers.csproj
index 29e8df7ccc..7c6f3892eb 100644
--- a/src/umbraco.providers/umbraco.providers.csproj
+++ b/src/umbraco.providers/umbraco.providers.csproj
@@ -97,6 +97,10 @@
{ccd75ec3-63db-4184-b49d-51c1dd337230}
umbraco.cms
+
+ {31785bc3-256c-4613-b2f5-a1b0bdded8c1}
+ Umbraco.Core
+
{C7CB79F0-1C97-4B33-BFA7-00731B579AE2}
umbraco.datalayer
diff --git a/src/umbraco.sln b/src/umbraco.sln
index 2e6c017bee..0b7902d964 100644
--- a/src/umbraco.sln
+++ b/src/umbraco.sln
@@ -1,7 +1,5 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.20827.3
-MinimumVisualStudioVersion = 10.0.40219.1
+# Visual Studio 2012
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{2849E9D4-3B4E-40A3-A309-F3CB4F0E125F}"
ProjectSection(SolutionItems) = preProject
..\build\Build.bat = ..\build\Build.bat
@@ -159,4 +157,7 @@ Global
{73529637-28F5-419C-A6BB-D094E39DE614} = {DD32977B-EF54-475B-9A1B-B97A502C6E58}
{B555AAE6-0F56-442F-AC9F-EF497DB38DE7} = {DD32977B-EF54-475B-9A1B-B97A502C6E58}
EndGlobalSection
+ GlobalSection(Performance) = preSolution
+ HasPerformanceSessions = true
+ EndGlobalSection
EndGlobal