diff --git a/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj new file mode 100644 index 000000000..797ae59ec --- /dev/null +++ b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj @@ -0,0 +1,61 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {6CB3EB30-F725-45C0-9742-42599BA8E8D2} + Library + Properties + Orchard.Tests.Packages + Orchard.Tests.Packages + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Properties/AssemblyInfo.cs b/src/Orchard.Tests.Packages/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..f593d1b89 --- /dev/null +++ b/src/Orchard.Tests.Packages/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Orchard.Tests.Packages")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft IT")] +[assembly: AssemblyProduct("Orchard.Tests.Packages")] +[assembly: AssemblyCopyright("Copyright © Microsoft IT 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("48eebfb4-714d-4859-829a-15fbe7e1bc9f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Orchard.Tests/DataUtility.cs b/src/Orchard.Tests/DataUtility.cs index 35a2dabda..1e20f7690 100644 --- a/src/Orchard.Tests/DataUtility.cs +++ b/src/Orchard.Tests/DataUtility.cs @@ -28,7 +28,7 @@ namespace Orchard.Tests { private static void AddAlterations(AutoMappingAlterationCollection alterations, Type[] types) { foreach (var assembly in types.Select(t => t.Assembly).Distinct()) { alterations.Add(new AutoMappingOverrideAlteration(assembly)); - } + } } public static ISessionFactory CreateSessionFactory(params Type[] types) { diff --git a/src/Orchard.Tests/Models/DefaultModelBuilderTests.cs b/src/Orchard.Tests/Models/DefaultModelBuilderTests.cs index 28db73b28..c5c90c591 100644 --- a/src/Orchard.Tests/Models/DefaultModelBuilderTests.cs +++ b/src/Orchard.Tests/Models/DefaultModelBuilderTests.cs @@ -2,9 +2,12 @@ using Autofac; using Autofac.Builder; using Autofac.Modules; +using NHibernate; using NUnit.Framework; +using Orchard.Data; using Orchard.Models; using Orchard.Models.Driver; +using Orchard.Models.Records; using Orchard.Tests.Models.Stubs; namespace Orchard.Tests.Models { @@ -12,6 +15,23 @@ namespace Orchard.Tests.Models { public class DefaultModelBuilderTests { private IContainer _container; private IModelManager _manager; + private ISessionFactory _sessionFactory; + private ISession _session; + + [TestFixtureSetUp] + public void InitFixture() { + var databaseFileName = System.IO.Path.GetTempFileName(); + _sessionFactory = DataUtility.CreateSessionFactory( + databaseFileName, + typeof(ModelRecord), + typeof(ModelTypeRecord), + typeof(GammaRecord)); + } + + [TestFixtureTearDown] + public void TermFixture() { + + } [SetUp] public void Init() { @@ -20,17 +40,35 @@ namespace Orchard.Tests.Models { builder.Register().As(); builder.Register().As(); builder.Register().As(); + builder.Register().As(); builder.Register().As(); builder.Register().As(); + builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); + + _session = _sessionFactory.OpenSession(); + builder.Register(new TestSessionLocator(_session)).As(); + _container = builder.Build(); _manager = _container.Resolve(); } + public class TestSessionLocator : ISessionLocator { + private readonly ISession _session; + + public TestSessionLocator(ISession session) { + _session = session; + } + + public ISession For(Type entityType) { + return _session; + } + } + [Test] public void AlphaDriverShouldWeldItsPart() { var foo = _manager.New("alpha"); - + Assert.That(foo.Is(), Is.True); Assert.That(foo.As(), Is.Not.Null); Assert.That(foo.Is(), Is.False); @@ -46,7 +84,7 @@ namespace Orchard.Tests.Models { [Test, ExpectedException(typeof(InvalidCastException))] public void StronglyTypedNewShouldThrowCastExceptionIfNull() { - var foo = _manager.New("alpha"); + _manager.New("alpha"); } [Test] @@ -60,5 +98,59 @@ namespace Orchard.Tests.Models { Assert.That(beta.Is(), Is.False); } + [Test] + public void GetByIdShouldDetermineTypeAndLoadParts() { + var modelRecord = CreateModelRecord("alpha"); + + var model = _manager.Get(modelRecord.Id); + Assert.That(model.ModelType, Is.EqualTo("alpha")); + Assert.That(model.Id, Is.EqualTo(modelRecord.Id)); + } + + + [Test] + public void ModelPartWithRecordShouldCallRepositoryToPopulate() { + + var modelRecord = CreateModelRecord("gamma"); + + var model = _manager.Get(modelRecord.Id); + + // create a gamma record + var gamma = new GammaRecord { + Model = _container.Resolve>().Get(model.Id), + Frap = "foo" + }; + + _container.Resolve>().Create(gamma); + _session.Flush(); + _session.Clear(); + + // re-fetch from database + model = _manager.Get(modelRecord.Id); + + Assert.That(model.ModelType, Is.EqualTo("gamma")); + Assert.That(model.Id, Is.EqualTo(modelRecord.Id)); + Assert.That(model.Is(), Is.True); + Assert.That(model.As().Record, Is.Not.Null); + Assert.That(model.As().Record.Model.Id, Is.EqualTo(model.Id)); + + } + + + private ModelRecord CreateModelRecord(string modelType) { + var modelRepository = _container.Resolve>(); + var modelTypeRepository = _container.Resolve>(); + + var modelRecord = new ModelRecord { ModelType = new ModelTypeRecord { Name = modelType } }; + modelTypeRepository.Create(modelRecord.ModelType); + modelRepository.Create(modelRecord); + + _session.Flush(); + _session.Clear(); + return modelRecord; + } + + + } } diff --git a/src/Orchard.Tests/Models/Stubs/AlphaDriver.cs b/src/Orchard.Tests/Models/Stubs/AlphaDriver.cs index 4bb8dacdf..b9911bd3e 100644 --- a/src/Orchard.Tests/Models/Stubs/AlphaDriver.cs +++ b/src/Orchard.Tests/Models/Stubs/AlphaDriver.cs @@ -1,7 +1,7 @@ using Orchard.Models.Driver; namespace Orchard.Tests.Models.Stubs { - public class AlphaDriver : ModelDriverBase { + public class AlphaDriver : ModelDriver { protected override void New(NewModelContext context) { if (context.ModelType == "alpha") { WeldModelPart(context); diff --git a/src/Orchard.Tests/Models/Stubs/BetaDriver.cs b/src/Orchard.Tests/Models/Stubs/BetaDriver.cs index 4004ccfbe..d872aed16 100644 --- a/src/Orchard.Tests/Models/Stubs/BetaDriver.cs +++ b/src/Orchard.Tests/Models/Stubs/BetaDriver.cs @@ -5,7 +5,7 @@ using System.Text; using Orchard.Models.Driver; namespace Orchard.Tests.Models.Stubs { - public class BetaDriver : ModelDriverBase { + public class BetaDriver : ModelDriver { protected override void New(NewModelContext context) { if (context.ModelType == "beta") { WeldModelPart(context); diff --git a/src/Orchard.Tests/Models/Stubs/FlavoredDriver.cs b/src/Orchard.Tests/Models/Stubs/FlavoredDriver.cs index 24a7c1bc1..8acaa662a 100644 --- a/src/Orchard.Tests/Models/Stubs/FlavoredDriver.cs +++ b/src/Orchard.Tests/Models/Stubs/FlavoredDriver.cs @@ -1,7 +1,7 @@ using Orchard.Models.Driver; namespace Orchard.Tests.Models.Stubs { - public class FlavoredDriver : ModelDriverBase { + public class FlavoredDriver : ModelDriver { protected override void New(NewModelContext context) { if (context.ModelType == "beta" || context.ModelType == "alpha") { WeldModelPart(context); diff --git a/src/Orchard.Tests/Models/Stubs/StyledDriver.cs b/src/Orchard.Tests/Models/Stubs/StyledDriver.cs index 870f34172..2ce06faba 100644 --- a/src/Orchard.Tests/Models/Stubs/StyledDriver.cs +++ b/src/Orchard.Tests/Models/Stubs/StyledDriver.cs @@ -1,7 +1,7 @@ using Orchard.Models.Driver; namespace Orchard.Tests.Models.Stubs { - public class StyledDriver : ModelDriverBase { + public class StyledDriver : ModelDriver { protected override void New(NewModelContext context) { if (context.ModelType == "alpha") { WeldModelPart(context); diff --git a/src/Orchard.Tests/Orchard.Tests.csproj b/src/Orchard.Tests/Orchard.Tests.csproj index 583864430..9b51841ab 100644 --- a/src/Orchard.Tests/Orchard.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Tests.csproj @@ -111,6 +111,7 @@ + @@ -130,8 +131,6 @@ - - @@ -142,6 +141,9 @@ + + + + + + + $(ProjectDir)\..\Manifests + + + + + + + + + + + + False + True + 40373 + / + + + False + False + + + False + + + + + \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Users/Properties/AssemblyInfo.cs b/src/Orchard.Web/Packages/Orchard.Users/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..ccf4d4dd1 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Orchard.Users")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft IT")] +[assembly: AssemblyProduct("Orchard.Users")] +[assembly: AssemblyCopyright("Copyright © Microsoft IT 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("700045c0-0c7d-44f9-9b09-ca4364d1e9fb")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Web.config b/src/Orchard.Web/Packages/Orchard.Users/Views/Web.config new file mode 100644 index 000000000..e065d8735 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Web.config @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Orchard.Web/Packages/Orchard.Users/Web.config b/src/Orchard.Web/Packages/Orchard.Users/Web.config new file mode 100644 index 000000000..d38df4e6d --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Web.config @@ -0,0 +1,205 @@ + + + + + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Orchard.Web/Web.config b/src/Orchard.Web/Web.config index 33fa0a895..8718a7a46 100644 --- a/src/Orchard.Web/Web.config +++ b/src/Orchard.Web/Web.config @@ -61,10 +61,10 @@ - + - + />--> + @@ -96,6 +98,7 @@ + diff --git a/src/Orchard.sln b/src/Orchard.sln index 4ea384516..0fccd4d78 100644 --- a/src/Orchard.sln +++ b/src/Orchard.sln @@ -25,6 +25,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.XmlRpc", "Orchard.W EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.XmlRpc.Tests", "Orchard.Web\Packages\Orchard.XmlRpc.Tests\Orchard.XmlRpc.Tests.csproj", "{58506223-CB7D-474F-B936-6E17D53B0FB8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Users", "Orchard.Web\Packages\Orchard.Users\Orchard.Users.csproj", "{79AED36E-ABD0-4747-93D3-8722B042454B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Tests.Packages", "Orchard.Tests.Packages\Orchard.Tests.Packages.csproj", "{6CB3EB30-F725-45C0-9742-42599BA8E8D2}" +EndProject Global GlobalSection(TeamFoundationVersionControl) = preSolution SccNumberOfProjects = 9 @@ -130,6 +134,14 @@ Global {58506223-CB7D-474F-B936-6E17D53B0FB8}.Debug|Any CPU.Build.0 = Debug|Any CPU {58506223-CB7D-474F-B936-6E17D53B0FB8}.Release|Any CPU.ActiveCfg = Release|Any CPU {58506223-CB7D-474F-B936-6E17D53B0FB8}.Release|Any CPU.Build.0 = Release|Any CPU + {79AED36E-ABD0-4747-93D3-8722B042454B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79AED36E-ABD0-4747-93D3-8722B042454B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79AED36E-ABD0-4747-93D3-8722B042454B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79AED36E-ABD0-4747-93D3-8722B042454B}.Release|Any CPU.Build.0 = Release|Any CPU + {6CB3EB30-F725-45C0-9742-42599BA8E8D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6CB3EB30-F725-45C0-9742-42599BA8E8D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CB3EB30-F725-45C0-9742-42599BA8E8D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6CB3EB30-F725-45C0-9742-42599BA8E8D2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -142,5 +154,6 @@ Global {15CFEF40-F2C2-44DD-ADAF-18A26DA2320C} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} {0DC6B598-6D03-4923-A6C2-274D09854117} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} {58506223-CB7D-474F-B936-6E17D53B0FB8} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} + {79AED36E-ABD0-4747-93D3-8722B042454B} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} EndGlobalSection EndGlobal diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs index b0486063c..df64225e7 100644 --- a/src/Orchard/Environment/DefaultOrchardHost.cs +++ b/src/Orchard/Environment/DefaultOrchardHost.cs @@ -36,6 +36,7 @@ namespace Orchard.Environment { _current = runtime; _controllerBuilder.SetControllerFactory(new OrchardControllerFactory()); + ServiceLocator.SetLocator(t=>_containerProvider.RequestContainer.Resolve(t)); } protected virtual void EndRequest() { diff --git a/src/Orchard/Environment/ServiceLocator.cs b/src/Orchard/Environment/ServiceLocator.cs new file mode 100644 index 000000000..8575503ac --- /dev/null +++ b/src/Orchard/Environment/ServiceLocator.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Orchard.Environment { + public static class ServiceLocator { + private static Func _locator; + + public static void SetLocator(Func locator) { + _locator = locator; + } + + public static T Resolve() { + return (T)_locator(typeof(T)); + } + + } +} diff --git a/src/Orchard/Models/DefaultModelManager.cs b/src/Orchard/Models/DefaultModelManager.cs index df261808d..f4ce2aea0 100644 --- a/src/Orchard/Models/DefaultModelManager.cs +++ b/src/Orchard/Models/DefaultModelManager.cs @@ -1,16 +1,23 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using Orchard.Data; using Orchard.Models.Driver; +using Orchard.Models.Records; namespace Orchard.Models { public class DefaultModelManager : IModelManager { private readonly IEnumerable _drivers; + private readonly IRepository _modelRepository; - public DefaultModelManager(IEnumerable drivers) { + public DefaultModelManager( + IEnumerable drivers, + IRepository modelRepository) { _drivers = drivers; + _modelRepository = modelRepository; } public virtual IModel New(string modelType) { - + // create a new kernel for the model instance var context = new NewModelContext { ModelType = modelType, @@ -18,12 +25,34 @@ namespace Orchard.Models { }; // invoke drivers to weld aspects onto kernel - foreach(var driver in _drivers) { + foreach (var driver in _drivers) { driver.New(context); } // composite result is returned return context.Instance; } + + public virtual IModel Get(int id) { + // obtain root record to determine the model type + var modelRecord = _modelRepository.Get(id); + + // create a context with a new instance to load + var context = new LoadModelContext { + Id = modelRecord.Id, + ModelType = modelRecord.ModelType.Name, + Instance = New(modelRecord.ModelType.Name) + }; + + // set the id + context.Instance.As().Id = context.Id; + + // invoke drivers to weld aspects onto kernel + foreach (var driver in _drivers) { + driver.Load(context); + } + + return context.Instance; + } } } diff --git a/src/Orchard/Models/Driver/IModelDriver.cs b/src/Orchard/Models/Driver/IModelDriver.cs index db1655b96..986b3d41d 100644 --- a/src/Orchard/Models/Driver/IModelDriver.cs +++ b/src/Orchard/Models/Driver/IModelDriver.cs @@ -1,27 +1,6 @@ -using Orchard.Logging; - -namespace Orchard.Models.Driver { +namespace Orchard.Models.Driver { public interface IModelDriver : IDependency { void New(NewModelContext context); - } - - public abstract class ModelDriverBase : IModelDriver { - protected ModelDriverBase() { - Logger = NullLogger.Instance; - } - - public ILogger Logger{ get; set;} - - void IModelDriver.New(NewModelContext context) {New(context);} - - protected virtual void New(NewModelContext context) { - } - - protected void WeldModelPart(NewModelContext context) where TPart : class,IModel,new() { - var newPart = new TPart(); - newPart.Weld(context.Instance); - context.Instance = newPart; - } - + void Load(LoadModelContext context); } } \ No newline at end of file diff --git a/src/Orchard/Models/Driver/ModelDriver.cs b/src/Orchard/Models/Driver/ModelDriver.cs new file mode 100644 index 000000000..d08d4f4cd --- /dev/null +++ b/src/Orchard/Models/Driver/ModelDriver.cs @@ -0,0 +1,43 @@ +using Orchard.Data; +using Orchard.Logging; + +namespace Orchard.Models.Driver { + public class ModelDriver : IModelDriver { + protected ModelDriver() { + Logger = NullLogger.Instance; + } + + public ILogger Logger{ get; set;} + + void IModelDriver.New(NewModelContext context) {New(context);} + void IModelDriver.Load(LoadModelContext context) {Load(context);} + + protected virtual void New(NewModelContext context) { + } + + protected virtual void Load(LoadModelContext context) { + } + + protected void WeldModelPart(NewModelContext context) where TPart : class,IModel,new() { + var newPart = new TPart(); + newPart.Weld(context.Instance); + context.Instance = newPart; + } + } + + public class ModelDriver : ModelDriver { + private readonly IRepository _repository; + + public ModelDriver(IRepository repository) { + _repository = repository; + } + + protected override void Load(LoadModelContext context) { + var instance = context.Instance.As>(); + if (instance != null) + instance.Record = _repository.Get(context.Id); + + base.Load(context); + } + } +} \ No newline at end of file diff --git a/src/Orchard/Models/Driver/NewModelContext.cs b/src/Orchard/Models/Driver/NewModelContext.cs index cdf1fda30..23b21affc 100644 --- a/src/Orchard/Models/Driver/NewModelContext.cs +++ b/src/Orchard/Models/Driver/NewModelContext.cs @@ -3,4 +3,9 @@ namespace Orchard.Models.Driver { public string ModelType { get; set; } public IModel Instance { get; set; } } + public class LoadModelContext { + public int Id { get; set; } + public string ModelType { get; set; } + public IModel Instance { get; set; } + } } diff --git a/src/Orchard/Models/IModelManager.cs b/src/Orchard/Models/IModelManager.cs index 7d9fbff22..09fb476bb 100644 --- a/src/Orchard/Models/IModelManager.cs +++ b/src/Orchard/Models/IModelManager.cs @@ -1,5 +1,6 @@ namespace Orchard.Models { public interface IModelManager { IModel New(string modelType); + IModel Get(int id); } } diff --git a/src/Orchard/Models/ModelPart.cs b/src/Orchard/Models/ModelPart.cs index 569137317..55f630376 100644 --- a/src/Orchard/Models/ModelPart.cs +++ b/src/Orchard/Models/ModelPart.cs @@ -30,4 +30,14 @@ namespace Orchard.Models { return Root.WeldedAs(); } } -} \ No newline at end of file + + public class ModelPart : ModelPart { + private TRecord _record; + + public TRecord Record { + get { return _record; } + set {_record = value;} + } + + } +} diff --git a/src/Orchard/Models/Records/ModelRecord.cs b/src/Orchard/Models/Records/ModelRecord.cs new file mode 100644 index 000000000..5936ebf8c --- /dev/null +++ b/src/Orchard/Models/Records/ModelRecord.cs @@ -0,0 +1,6 @@ +namespace Orchard.Models.Records { + public class ModelRecord { + public virtual int Id { get; set; } + public virtual ModelTypeRecord ModelType { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard/Models/Records/ModelTypeRecord.cs b/src/Orchard/Models/Records/ModelTypeRecord.cs new file mode 100644 index 000000000..8473431f0 --- /dev/null +++ b/src/Orchard/Models/Records/ModelTypeRecord.cs @@ -0,0 +1,6 @@ +namespace Orchard.Models.Records { + public class ModelTypeRecord { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } +} diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index c77e9bac3..5c1bbfd5d 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -60,6 +60,7 @@ ..\..\lib\linqnhibernate\NHibernate.Linq.dll + 3.5 @@ -114,6 +115,7 @@ + @@ -123,6 +125,7 @@ + @@ -130,6 +133,8 @@ + + @@ -146,9 +151,12 @@ + + + diff --git a/src/Orchard/Security/IMembershipService.cs b/src/Orchard/Security/IMembershipService.cs new file mode 100644 index 000000000..5848d464e --- /dev/null +++ b/src/Orchard/Security/IMembershipService.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web.Security; + +namespace Orchard.Security { + public interface IMembershipService : IDependency { + void ReadSettings(MembershipSettings settings); + } + + public class MembershipSettings { + public bool EnablePasswordRetrieval { get; set; } + public bool EnablePasswordReset { get; set; } + public bool RequiresQuestionAndAnswer { get; set; } + public int MaxInvalidPasswordAttempts { get; set; } + public int PasswordAttemptWindow { get; set; } + public bool RequiresUniqueEmail { get; set; } + public MembershipPasswordFormat PasswordFormat { get; set; } + public int MinRequiredPasswordLength { get; set; } + public int MinRequiredNonAlphanumericCharacters { get; set; } + public string PasswordStrengthRegularExpression { get; set; } + } +} diff --git a/src/Orchard/Security/IUser.cs b/src/Orchard/Security/IUser.cs index 7bd273538..cf63320bf 100644 --- a/src/Orchard/Security/IUser.cs +++ b/src/Orchard/Security/IUser.cs @@ -5,6 +5,7 @@ namespace Orchard.Security { /// Interface provided by the "user" model. /// public interface IUser : IModel { - string Name { get; } + string UserName { get; } + string Email { get; } } } diff --git a/src/Orchard/Security/Providers/OrchardMembershipProvider.cs b/src/Orchard/Security/Providers/OrchardMembershipProvider.cs new file mode 100644 index 000000000..833d46907 --- /dev/null +++ b/src/Orchard/Security/Providers/OrchardMembershipProvider.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using System.Web.Security; +using Orchard.Environment; + +namespace Orchard.Security.Providers { + public class OrchardMembershipProvider : MembershipProvider { + public OrchardMembershipProvider() { + int x =5; + } + + static IMembershipService GetService() { + return ServiceLocator.Resolve(); + } + + static MembershipSettings GetSettings() { + var settings = new MembershipSettings { + EnablePasswordRetrieval = false, + EnablePasswordReset = true, + RequiresQuestionAndAnswer = true, + RequiresUniqueEmail = true, + MaxInvalidPasswordAttempts = 5, + PasswordAttemptWindow = 10, + MinRequiredPasswordLength = 7, + MinRequiredNonAlphanumericCharacters = 1, + PasswordStrengthRegularExpression = "", + PasswordFormat = MembershipPasswordFormat.Hashed, + }; + GetService().ReadSettings(settings); + return settings; + } + + + public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) { + throw new NotImplementedException(); + } + + public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) { + throw new NotImplementedException(); + } + + public override string GetPassword(string username, string answer) { + throw new NotImplementedException(); + } + + public override bool ChangePassword(string username, string oldPassword, string newPassword) { + throw new NotImplementedException(); + } + + public override string ResetPassword(string username, string answer) { + throw new NotImplementedException(); + } + + public override void UpdateUser(MembershipUser user) { + throw new NotImplementedException(); + } + + public override bool ValidateUser(string username, string password) { + throw new NotImplementedException(); + } + + public override bool UnlockUser(string userName) { + throw new NotImplementedException(); + } + + public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) { + throw new NotImplementedException(); + } + + public override MembershipUser GetUser(string username, bool userIsOnline) { + throw new NotImplementedException(); + } + + public override string GetUserNameByEmail(string email) { + throw new NotImplementedException(); + } + + public override bool DeleteUser(string username, bool deleteAllRelatedData) { + throw new NotImplementedException(); + } + + public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) { + throw new NotImplementedException(); + } + + public override int GetNumberOfUsersOnline() { + throw new NotImplementedException(); + } + + public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) { + throw new NotImplementedException(); + } + + public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) { + throw new NotImplementedException(); + } + + public override string ApplicationName { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override bool EnablePasswordRetrieval { get { return GetSettings().EnablePasswordRetrieval; } } + public override bool EnablePasswordReset { get { return GetSettings().EnablePasswordReset; } } + public override bool RequiresQuestionAndAnswer { get { return GetSettings().RequiresQuestionAndAnswer; } } + public override int MaxInvalidPasswordAttempts { get { return GetSettings().MaxInvalidPasswordAttempts; } } + public override int PasswordAttemptWindow { get { return GetSettings().PasswordAttemptWindow; } } + public override bool RequiresUniqueEmail { get { return GetSettings().RequiresUniqueEmail; } } + public override MembershipPasswordFormat PasswordFormat { get { return GetSettings().PasswordFormat; } } + public override int MinRequiredPasswordLength { get { return GetSettings().MinRequiredPasswordLength; } } + public override int MinRequiredNonAlphanumericCharacters { get { return GetSettings().MinRequiredNonAlphanumericCharacters; } } + public override string PasswordStrengthRegularExpression { get { return GetSettings().PasswordStrengthRegularExpression; } } + } +} diff --git a/src/Orchard/Security/Providers/OrchardRoleProvider.cs b/src/Orchard/Security/Providers/OrchardRoleProvider.cs new file mode 100644 index 000000000..f20d7fdec --- /dev/null +++ b/src/Orchard/Security/Providers/OrchardRoleProvider.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web.Security; + +namespace Orchard.Security.Providers { + public class OrchardRoleProvider : RoleProvider { + public override bool IsUserInRole(string username, string roleName) { + throw new NotImplementedException(); + } + + public override string[] GetRolesForUser(string username) { + throw new NotImplementedException(); + } + + public override void CreateRole(string roleName) { + throw new NotImplementedException(); + } + + public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) { + throw new NotImplementedException(); + } + + public override bool RoleExists(string roleName) { + throw new NotImplementedException(); + } + + public override void AddUsersToRoles(string[] usernames, string[] roleNames) { + throw new NotImplementedException(); + } + + public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) { + throw new NotImplementedException(); + } + + public override string[] GetUsersInRole(string roleName) { + throw new NotImplementedException(); + } + + public override string[] GetAllRoles() { + throw new NotImplementedException(); + } + + public override string[] FindUsersInRole(string roleName, string usernameToMatch) { + throw new NotImplementedException(); + } + + public override string ApplicationName { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + } +}