From a244080613fd3a42fe98d244d6c5cf052f3c353d Mon Sep 17 00:00:00 2001 From: SohailQureshi Date: Sun, 3 Feb 2019 07:59:44 +0000 Subject: [PATCH 01/27] 1. Profile image added to NavBar 2. Framework-Nav.css updated for profile image --- .gitignore | 1 + .../Styles/Framework/framework-nav.css | 9 + Portal.CMS.Web/Portal.CMS.Web.csproj | 5 +- Portal.CMS.Web/Views/Shared/_NavBar.cshtml | 18 +- Portal.CMS.Web/Web.config | 166 +++++++++--------- 5 files changed, 114 insertions(+), 85 deletions(-) diff --git a/.gitignore b/.gitignore index 5a2bcc2..b7d25f0 100644 --- a/.gitignore +++ b/.gitignore @@ -212,3 +212,4 @@ GeneratedArtifacts/ _Pvt_Extensions/ ModelManifest.xml /Portal.CMS.Web/Areas/Admin/Content/Media +/Portal.CMS.Web/Areas/Profile/Content/Media/Avatars/media-*.png diff --git a/Portal.CMS.Web/Content/Styles/Framework/framework-nav.css b/Portal.CMS.Web/Content/Styles/Framework/framework-nav.css index 3599daf..5825d0d 100644 --- a/Portal.CMS.Web/Content/Styles/Framework/framework-nav.css +++ b/Portal.CMS.Web/Content/Styles/Framework/framework-nav.css @@ -64,4 +64,13 @@ { padding: inherit; } +} + +.navbar-profileImage { + width: 22px; + height: 22px; + border-radius: 50%; + border: solid 1px gray; + margin: 0; + padding: 0; } \ No newline at end of file diff --git a/Portal.CMS.Web/Portal.CMS.Web.csproj b/Portal.CMS.Web/Portal.CMS.Web.csproj index 8eb47e4..c1fee9f 100644 --- a/Portal.CMS.Web/Portal.CMS.Web.csproj +++ b/Portal.CMS.Web/Portal.CMS.Web.csproj @@ -16,7 +16,7 @@ Properties Portal.CMS.Web Portal.CMS.Web - v4.6.2 + v4.6.1 false true @@ -129,7 +129,6 @@ - ..\packages\System.Net.Http.4.3.3\lib\net46\System.Net.Http.dll @@ -154,7 +153,6 @@ - ..\packages\Microsoft.AspNet.WebPages.3.2.6\lib\net45\System.Web.Helpers.dll @@ -195,7 +193,6 @@ ..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll - ..\packages\WebActivatorEx.2.2.0\lib\net40\WebActivatorEx.dll True diff --git a/Portal.CMS.Web/Views/Shared/_NavBar.cshtml b/Portal.CMS.Web/Views/Shared/_NavBar.cshtml index 594214d..065c8b5 100644 --- a/Portal.CMS.Web/Views/Shared/_NavBar.cshtml +++ b/Portal.CMS.Web/Views/Shared/_NavBar.cshtml @@ -38,9 +38,23 @@ { @if (isLoggedIn) - { + { - } - else - { + } + else + { - } + } \ No newline at end of file From 89448dbccb93858224753806f52a578661f1f6ab Mon Sep 17 00:00:00 2001 From: Suhail Qureshi Date: Sat, 23 Feb 2019 14:05:03 +0000 Subject: [PATCH 21/27] Fixed unable to logout issue --- .../Controllers/LoginController.cs | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/PortalCMS.Web/Areas/Authentication/Controllers/LoginController.cs b/PortalCMS.Web/Areas/Authentication/Controllers/LoginController.cs index 60c2397..6a00ebd 100644 --- a/PortalCMS.Web/Areas/Authentication/Controllers/LoginController.cs +++ b/PortalCMS.Web/Areas/Authentication/Controllers/LoginController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; +using Microsoft.Owin.Security; using PortalCMS.Services.Authentication; using PortalCMS.Web.Areas.Authentication.ViewModel.Login; using PortalCMS.Web.Areas.Authentication.ViewModels.Login; @@ -7,6 +8,7 @@ using System; using System.Linq; using System.Threading.Tasks; +using System.Web; using System.Web.Mvc; namespace PortalCMS.Web.Areas.Authentication.Controllers @@ -146,15 +148,29 @@ public async Task VerifyCode(VerifyCodeViewModel model) [HttpGet] public ActionResult Logout() { - CurrentUser.LastLogoutDate = DateTime.Now; - UserManager.Update(CurrentUser); - Session.Clear(); + if (User.Identity.IsAuthenticated == true) + { + var user = UserManager.FindById(User.Identity.GetUserId()); + user.LastLogoutDate = DateTime.Now; + UserManager.Update(user); + } + + AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); + Session.Abandon(); return RedirectToAction("Index", "Home", new { area = "" }); } #region Private methods + private IAuthenticationManager AuthenticationManager + { + get + { + return HttpContext.GetOwinContext().Authentication; + } + } + private ActionResult RedirectToLocal(string returnUrl) { if (Url.IsLocalUrl(returnUrl)) From 73d69110f9e765f994d08a6ec9fcc7e6f294639f Mon Sep 17 00:00:00 2001 From: Dilbert Date: Tue, 26 Feb 2019 18:15:17 +0000 Subject: [PATCH 22/27] Delete Web.Release.config --- PortalCMS.Web/Web.Release.config | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 PortalCMS.Web/Web.Release.config diff --git a/PortalCMS.Web/Web.Release.config b/PortalCMS.Web/Web.Release.config deleted file mode 100644 index 437928e..0000000 --- a/PortalCMS.Web/Web.Release.config +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 377286ddc052ae68da64aedce6ce73280c24c514 Mon Sep 17 00:00:00 2001 From: Suhail Qureshi Date: Tue, 26 Feb 2019 23:33:42 +0000 Subject: [PATCH 23/27] Admin page changes --- .../UserManager/DetailsViewModel.cs | 31 +++---- .../Admin/Views/Dashboard/_LatestPost.cshtml | 2 +- .../Admin/Views/Dashboard/_MyAccount.cshtml | 1 - .../Admin/Views/UserManager/Index.cshtml | 82 ++++++++++++------- .../PublishProfiles/FolderProfile.pubxml | 2 +- 5 files changed, 72 insertions(+), 46 deletions(-) diff --git a/PortalCMS.Web/Areas/Admin/ViewModels/UserManager/DetailsViewModel.cs b/PortalCMS.Web/Areas/Admin/ViewModels/UserManager/DetailsViewModel.cs index 14b7dfa..41f10a0 100644 --- a/PortalCMS.Web/Areas/Admin/ViewModels/UserManager/DetailsViewModel.cs +++ b/PortalCMS.Web/Areas/Admin/ViewModels/UserManager/DetailsViewModel.cs @@ -4,24 +4,25 @@ namespace PortalCMS.Web.Areas.Admin.ViewModels.UserManager { - public class DetailsViewModel - { - public string UserId { get; set; } + public class DetailsViewModel + { + public string UserId { get; set; } - [DisplayName("Email")] - [Required] - public string EmailAddress { get; set; } + [Required] + [DisplayName("Email")] + public string EmailAddress { get; set; } - [DisplayName("First Name")] - [Required] - public string GivenName { get; set; } + [Required] + [DisplayName("First Name")] + public string GivenName { get; set; } - [DisplayName("Last Name")] - [Required] - public string FamilyName { get; set; } + [Required] + [DisplayName("Last Name")] + public string FamilyName { get; set; } - public DateTime DateAdded { get; set; } + [DisplayName("Registered")] + public DateTime DateAdded { get; set; } - public DateTime DateUpdated { get; set; } - } + public DateTime DateUpdated { get; set; } + } } \ No newline at end of file diff --git a/PortalCMS.Web/Areas/Admin/Views/Dashboard/_LatestPost.cshtml b/PortalCMS.Web/Areas/Admin/Views/Dashboard/_LatestPost.cshtml index bd71ce8..3fe3484 100644 --- a/PortalCMS.Web/Areas/Admin/Views/Dashboard/_LatestPost.cshtml +++ b/PortalCMS.Web/Areas/Admin/Views/Dashboard/_LatestPost.cshtml @@ -23,7 +23,7 @@ else {
-
+
Latest Post

No Posts Found

diff --git a/PortalCMS.Web/Areas/Admin/Views/Dashboard/_MyAccount.cshtml b/PortalCMS.Web/Areas/Admin/Views/Dashboard/_MyAccount.cshtml index 5909e85..f7c3b02 100644 --- a/PortalCMS.Web/Areas/Admin/Views/Dashboard/_MyAccount.cshtml +++ b/PortalCMS.Web/Areas/Admin/Views/Dashboard/_MyAccount.cshtml @@ -8,7 +8,6 @@

@UserHelper.FullName

-

@UserHelper.Email

diff --git a/PortalCMS.Web/Areas/Admin/Views/UserManager/Index.cshtml b/PortalCMS.Web/Areas/Admin/Views/UserManager/Index.cshtml index 7cd6a3a..5fdc01f 100644 --- a/PortalCMS.Web/Areas/Admin/Views/UserManager/Index.cshtml +++ b/PortalCMS.Web/Areas/Admin/Views/UserManager/Index.cshtml @@ -10,34 +10,60 @@ @foreach (var user in Model.Users) {
-
- -
-
- User Avatar -
-
-

@user.GivenName @user.FamilyName

-

@user.Email

-
-
- - @if (user.Id == UserHelper.Id) - { -
- Details - Roles -
- } - else - { -
- Details - Roles - Delete -
- } -
+
+
+ + @if (user.EmailConfirmed) + { + @user.Email + } + else + { + @user.Email + } + +
+
+
+ User Avatar +
+
+

@user.GivenName @user.FamilyName

+ +

+ Registered:@string.Format("{0:dd-MMM-yyyy HH:mm}", @user.RegistrationDate) +

+ +

+ Last Updated:@string.Format("{0:dd-MMM-yyyy HH:mm}", @user.LastUpdatedDate) +

+ +

+ Last Login:@string.Format("{0:dd-MMM-yyyy HH:mm}", @user.LastLoginDate) +

+ +

+ Last Logout:@string.Format("{0:dd-MMM-yyyy HH:mm}", @user.LastLogoutDate) +

+
+
+ + @if (user.Id == UserHelper.Id) + { +
+ Details + Roles +
+ } + else + { +
+ Details + Roles + Delete +
+ } +
}
\ No newline at end of file diff --git a/PortalCMS.Web/Properties/PublishProfiles/FolderProfile.pubxml b/PortalCMS.Web/Properties/PublishProfiles/FolderProfile.pubxml index 3bd8d0e..4711219 100644 --- a/PortalCMS.Web/Properties/PublishProfiles/FolderProfile.pubxml +++ b/PortalCMS.Web/Properties/PublishProfiles/FolderProfile.pubxml @@ -12,7 +12,7 @@ by editing this MSBuild file. In order to learn more about this please visit htt True True - C:\inetpub\wwwroot\MENTORDOJO\PortalCMS.v13\Published + C:\inetpub\wwwroot\MENTORDOJO\PortalCMS.v14\Published True \ No newline at end of file From 1d813c677c0314265e28d9d662308b9752b71630 Mon Sep 17 00:00:00 2001 From: Suhail Qureshi Date: Wed, 27 Feb 2019 18:45:32 +0000 Subject: [PATCH 24/27] Recaptcha added to registration page --- PortalCMS.Entities/Seed/PageSeed.cs | 2 +- PortalCMS.Library/Captcha/Captcha.cs | 75 ------- PortalCMS.Library/PortalCMS.Library.csproj | 10 +- .../ReCaptcha/ReCaptchaValidationResult.cs | 20 ++ .../ReCaptcha/ReCaptchaValidator.cs | 34 +++ PortalCMS.Library/packages.config | 4 + .../Areas/Admin/Content/Images/recaptcha.png | Bin 0 -> 33938 bytes .../Controllers/SettingManagerController.cs | 10 +- .../SettingManager/SetupViewModel.cs | 6 + .../Admin/Views/Dashboard/_LatestPost.cshtml | 4 +- .../Admin/Views/Dashboard/_Welcome.cshtml | 5 +- .../Admin/Views/SettingManager/_Setup.cshtml | 197 ++++++++++-------- .../Controllers/RegistrationController.cs | 65 ++++-- .../Registration/RegisterViewModel.cs | 14 +- .../Registration/_RegistrationForm.cshtml | 15 +- .../_RegistrationSimpleForm.cshtml | 38 ++++ PortalCMS.Web/PortalCMS.Web.csproj | 11 +- PortalCMS.Web/Views/Shared/_Layout.cshtml | 19 +- PortalCMS.Web/Web.config | 4 +- PortalCMS.Web/packages.config | 2 +- 20 files changed, 316 insertions(+), 219 deletions(-) delete mode 100644 PortalCMS.Library/Captcha/Captcha.cs create mode 100644 PortalCMS.Library/ReCaptcha/ReCaptchaValidationResult.cs create mode 100644 PortalCMS.Library/ReCaptcha/ReCaptchaValidator.cs create mode 100644 PortalCMS.Library/packages.config create mode 100644 PortalCMS.Web/Areas/Admin/Content/Images/recaptcha.png create mode 100644 PortalCMS.Web/Areas/Authentication/Views/Registration/_RegistrationSimpleForm.cshtml diff --git a/PortalCMS.Entities/Seed/PageSeed.cs b/PortalCMS.Entities/Seed/PageSeed.cs index c255487..b803610 100644 --- a/PortalCMS.Entities/Seed/PageSeed.cs +++ b/PortalCMS.Entities/Seed/PageSeed.cs @@ -21,7 +21,7 @@ public static void Seed(PortalDbContext context) DateUpdated = DateTime.Now, PageAssociations = new List { - new PageAssociation { PageSection = new PageSection { PageSectionBody = "

PortalCMS 1.3

Your website is now ready to use, to start register your first account. The first account registered becomes the owner.

Register AccountLearn More...
" },}, + new PageAssociation { PageSection = new PageSection { PageSectionBody = "

PortalCMS 1.3

Your website is now ready to use, to start register your first account. The first account registered becomes the owner.

Register Account
" },}, new PageAssociation { PageSection = new PageSection { PageSectionBody = "

Getting Started

We try to make it as simple to get started as possible, but there will always be a bit of a learning curve. Read on to learn about some quick ways to get started.

Add Content

The \"Add\" button in the bottom right of your screen allows you to add Sections and Components to your Page

Edit Content

Click on any text or images to change them completely. Or look in the top left of a Section for more controls.

Write Blog Posts

Write a blog Post by clicking \"Add\" in the bottom right of your screen. Or Edit the sample post.

Use the Admin Panel

Click on the Admin Cog in the bottom right of your screen to get into the Admin Panel.

Upload Media

Click on the \"Add\" button in the bottom right of your screen to upload your own Images.

Delete Content

Click on the Cog in the top left of each Section to delete it and start off with a fresh clean Page.

" },}, } }); diff --git a/PortalCMS.Library/Captcha/Captcha.cs b/PortalCMS.Library/Captcha/Captcha.cs deleted file mode 100644 index e94741f..0000000 --- a/PortalCMS.Library/Captcha/Captcha.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.Drawing; - -namespace PortalCMS.Library -{ - public class Captcha - { - public string CapImage { get; set; } - - [Display(Name = "Verification Code")] - [Required(ErrorMessage = "Verification code is required.")] - [Compare("CapImageText", ErrorMessage = "Captcha code Invalid")] - public string CaptchaCodeText { get; set; } - - public string CapImageText { get; set; } - - public Captcha() - { - string imageText = VerificationTextGenerator(); - - CaptchaCodeText = string.Empty; - CapImageText = imageText; - CapImage = "data:image/png;base64," + Convert.ToBase64String(GetCaptchaImage(imageText)); - } - - private string VerificationTextGenerator() - { - string allChar = "0,1,2,3,4,5,6,7,8,9"; - string[] allCharArray = allChar.Split(','); - string randomCode = ""; - int temp = -1; - Random rand = new Random(); - for (int i = 0; i < 4; i++) - { - if (temp != -1) - { - rand = new Random(i * temp * ((int)DateTime.Now.Ticks)); - } - int t = rand.Next(10); - temp = t; - randomCode += allCharArray[t]; - } - return randomCode; - } - - private byte[] GetCaptchaImage(string checkCode) - { - Bitmap image = new Bitmap(Convert.ToInt32(Math.Ceiling((decimal)(checkCode.Length * 15))), 25); - Graphics g = Graphics.FromImage(image); - try - { - Random random = new Random(); - g.Clear(Color.AliceBlue); - Font font = new Font("Comic Sans MS", 14, FontStyle.Bold); - string str = ""; - System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); - for (int i = 0; i < checkCode.Length; i++) - { - str = str + checkCode.Substring(i, 1); - } - g.DrawString(str, font, new SolidBrush(Color.Blue), 0, 0); - g.Flush(); - System.IO.MemoryStream ms = new System.IO.MemoryStream(); - image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); - return ms.ToArray(); - } - finally - { - g.Dispose(); - image.Dispose(); - } - } - } -} \ No newline at end of file diff --git a/PortalCMS.Library/PortalCMS.Library.csproj b/PortalCMS.Library/PortalCMS.Library.csproj index c50aa38..3fb54a7 100644 --- a/PortalCMS.Library/PortalCMS.Library.csproj +++ b/PortalCMS.Library/PortalCMS.Library.csproj @@ -31,6 +31,9 @@ 4 + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + @@ -44,11 +47,14 @@ - + + - + + + \ No newline at end of file diff --git a/PortalCMS.Library/ReCaptcha/ReCaptchaValidationResult.cs b/PortalCMS.Library/ReCaptcha/ReCaptchaValidationResult.cs new file mode 100644 index 0000000..b81ee6f --- /dev/null +++ b/PortalCMS.Library/ReCaptcha/ReCaptchaValidationResult.cs @@ -0,0 +1,20 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace PortalCMS.Library.ReCaptcha +{ + public class ReCaptchaValidationResult + { + [JsonProperty("success")] + public bool Success { get; set; } + + [JsonProperty("challenge_ts")] + public string TimeStamp { get; set; } + + [JsonProperty("hostname")] + public string HostName { get; set; } + + [JsonProperty("error-codes")] + public List ErrorCodes { get; set; } + } +} diff --git a/PortalCMS.Library/ReCaptcha/ReCaptchaValidator.cs b/PortalCMS.Library/ReCaptcha/ReCaptchaValidator.cs new file mode 100644 index 0000000..95eccc8 --- /dev/null +++ b/PortalCMS.Library/ReCaptcha/ReCaptchaValidator.cs @@ -0,0 +1,34 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; + +namespace PortalCMS.Library.ReCaptcha +{ + public class ReCaptchaValidator + { + public static ReCaptchaValidationResult IsValidAsync(string captchaResponse, string secretKey) + { + if (string.IsNullOrWhiteSpace(captchaResponse) || string.IsNullOrWhiteSpace(secretKey)) + { + return new ReCaptchaValidationResult{ Success = false }; + } + + HttpClient httpClient = new HttpClient(); + httpClient.BaseAddress = new Uri("https://www.google.com"); + + var values = new List>(); + values.Add(new KeyValuePair("secret", secretKey)); + values.Add(new KeyValuePair ("response", captchaResponse)); + + FormUrlEncodedContent content = new FormUrlEncodedContent(values); + HttpResponseMessage response = httpClient.PostAsync("/recaptcha/api/siteverify", content).Result; + + string verificationResponse = response.Content.ReadAsStringAsync().Result; + var verificationResult = JsonConvert.DeserializeObject(verificationResponse); + + return verificationResult; + } + } +} diff --git a/PortalCMS.Library/packages.config b/PortalCMS.Library/packages.config new file mode 100644 index 0000000..466ab76 --- /dev/null +++ b/PortalCMS.Library/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/PortalCMS.Web/Areas/Admin/Content/Images/recaptcha.png b/PortalCMS.Web/Areas/Admin/Content/Images/recaptcha.png new file mode 100644 index 0000000000000000000000000000000000000000..54a89e8041dcd4a7882437d1b1a2a75d48a68a4a GIT binary patch literal 33938 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 BzeE54 literal 0 HcmV?d00001 diff --git a/PortalCMS.Web/Areas/Admin/Controllers/SettingManagerController.cs b/PortalCMS.Web/Areas/Admin/Controllers/SettingManagerController.cs index 9bea9fa..a4d3dba 100644 --- a/PortalCMS.Web/Areas/Admin/Controllers/SettingManagerController.cs +++ b/PortalCMS.Web/Areas/Admin/Controllers/SettingManagerController.cs @@ -40,7 +40,9 @@ public ActionResult Setup() GoogleAnalyticsId = SettingHelper.Get("Google Analytics Tracking ID"), EmailFromAddress = SettingHelper.Get("Email From Address"), SendGridApiKey = SettingHelper.Get("SendGrid ApiKey"), - CDNAddress = SettingHelper.Get("CDN Address") + CDNAddress = SettingHelper.Get("CDN Address"), + RecaptchaSiteKey = SettingHelper.Get("Recaptcha Site Key"), + RecaptchaSecretKey = SettingHelper.Get("Recaptcha Secret Key"), }; if (string.IsNullOrWhiteSpace(model.EmailFromAddress)) @@ -91,6 +93,12 @@ public async Task Setup(SetupViewModel model, HttpPostedFileBase A await _settingService.EditAsync("CDN Address", model.CDNAddress); Session.Remove("Setting-CDN Address"); + await _settingService.EditAsync("Recaptcha Site Key", model.RecaptchaSiteKey); + Session.Remove("Setting-Recaptcha Site Key"); + + await _settingService.EditAsync("Recaptcha Secret Key", model.RecaptchaSecretKey); + Session.Remove("Setting-Recaptcha Secret Key"); + return Content("Refresh"); } diff --git a/PortalCMS.Web/Areas/Admin/ViewModels/SettingManager/SetupViewModel.cs b/PortalCMS.Web/Areas/Admin/ViewModels/SettingManager/SetupViewModel.cs index c3563ab..a83f266 100644 --- a/PortalCMS.Web/Areas/Admin/ViewModels/SettingManager/SetupViewModel.cs +++ b/PortalCMS.Web/Areas/Admin/ViewModels/SettingManager/SetupViewModel.cs @@ -28,6 +28,12 @@ public class SetupViewModel [DisplayName("SendGrid API Key")] public string SendGridApiKey { get; set; } + [DisplayName("Recaptcha Site Key")] + public string RecaptchaSiteKey { get; set; } + + [DisplayName("Recaptcha Secret Key")] + public string RecaptchaSecretKey { get; set; } + [DisplayName("CDN Address")] public string CDNAddress { get; set; } } diff --git a/PortalCMS.Web/Areas/Admin/Views/Dashboard/_LatestPost.cshtml b/PortalCMS.Web/Areas/Admin/Views/Dashboard/_LatestPost.cshtml index 3fe3484..50b70ce 100644 --- a/PortalCMS.Web/Areas/Admin/Views/Dashboard/_LatestPost.cshtml +++ b/PortalCMS.Web/Areas/Admin/Views/Dashboard/_LatestPost.cshtml @@ -30,7 +30,9 @@ else

You haven't created any Posts yet, but don't worry as soon as you do it will show up on your Dashboard.

diff --git a/PortalCMS.Web/Areas/Admin/Views/Dashboard/_Welcome.cshtml b/PortalCMS.Web/Areas/Admin/Views/Dashboard/_Welcome.cshtml index eae619a..a78a79b 100644 --- a/PortalCMS.Web/Areas/Admin/Views/Dashboard/_Welcome.cshtml +++ b/PortalCMS.Web/Areas/Admin/Views/Dashboard/_Welcome.cshtml @@ -5,9 +5,8 @@

Portal CMS is a fully featured and responsive content management system with integrated page builder.

Start building your website by adding Media, Posts and Pages!

- \ No newline at end of file diff --git a/PortalCMS.Web/Areas/Admin/Views/SettingManager/_Setup.cshtml b/PortalCMS.Web/Areas/Admin/Views/SettingManager/_Setup.cshtml index 411931e..67670e9 100644 --- a/PortalCMS.Web/Areas/Admin/Views/SettingManager/_Setup.cshtml +++ b/PortalCMS.Web/Areas/Admin/Views/SettingManager/_Setup.cshtml @@ -1,98 +1,119 @@ @model PortalCMS.Web.Areas.Admin.ViewModels.SettingManager.SetupViewModel @{ - Layout = ""; + Layout = ""; } @using (Html.BeginForm("Setup", "SettingManager", FormMethod.Post)) { - @Html.AntiForgeryToken() - - - -
-
-

Welcome to Portal CMS

-

There are a few small details you may wish to configure now to get your site setup.

- -
- - - @Html.ValidationMessage("WebsiteName") -
- @Html.LabelFor(x => x.WebsiteName) - @Html.TextBoxFor(x => x.WebsiteName) -
- -
- @Html.LabelFor(x => x.AttachedLogo) - -
- -
- @Html.LabelFor(x => x.AttachedIcon) - -
- -
- @Html.LabelFor(x => x.WebsiteDescription) - @Html.TextBoxFor(x => x.WebsiteDescription) -
+ @Html.AntiForgeryToken() + + + +
+
+

Welcome to Portal CMS

+

There are a few small details you may wish to configure now to get your site setup.

+ +
+ + + @Html.ValidationMessage("WebsiteName") +
+ @Html.LabelFor(x => x.WebsiteName) + @Html.TextBoxFor(x => x.WebsiteName) +
+ +
+ @Html.LabelFor(x => x.AttachedLogo) + +
+ +
+ @Html.LabelFor(x => x.AttachedIcon) + +
+ +
+ @Html.LabelFor(x => x.WebsiteDescription) + @Html.TextBoxFor(x => x.WebsiteDescription) +
+
+ +
+

SendGrid Email Delivery

+

SendGrid is a reliable and easy to use method of email delivery, You can send 12,000 emails for free every month. Learn More about SendGrid.

+
+ +
+ @Html.LabelFor(x => x.EmailFromAddress) + @Html.TextBoxFor(x => x.EmailFromAddress)
-
-

SendGrid Email Delivery

-

SendGrid is a reliable and easy to use method of email delivery, You can send 12,000 emails for free every month. Learn More about SendGrid.

-
- -
- @Html.LabelFor(x => x.EmailFromAddress) - @Html.TextBoxFor(x => x.EmailFromAddress) -
-
- @Html.LabelFor(x => x.SendGridApiKey) - @Html.TextBoxFor(x => x.SendGridApiKey) -
-
-
-

Google Analytics Integration

-

Portal CMS collects its own Analytics to give you real time and useful information about how your website is being used. You can also configure Portal CMS to use Google Analytics.

-
- -
- @Html.LabelFor(x => x.GoogleAnalyticsId) - @Html.TextBoxFor(x => x.GoogleAnalyticsId) -
-
-
-

Content Delivery Network

-

Portal CMS can utilise a Content Delivery Network that is setup to cache the content of your website. When configured Portal CMS will load your Uploaded Images from the CDN.

-
- -
- @Html.LabelFor(x => x.CDNAddress) - @Html.TextBoxFor(x => x.CDNAddress) -
-
-
- - -} \ No newline at end of file +
+ @Html.LabelFor(x => x.SendGridApiKey) + @Html.TextBoxFor(x => x.SendGridApiKey) +
+
+ +
+

Recaptcha Integration

+

ReCAPTCHA is a free Google service that protects your website from spam and abuse by using Application Programming Interface(API) key pairs

+
+ + +
+ @Html.LabelFor(x => x.RecaptchaSiteKey) + @Html.TextBoxFor(x => x.RecaptchaSiteKey) +
+
+ @Html.LabelFor(x => x.RecaptchaSecretKey) + @Html.TextBoxFor(x => x.RecaptchaSecretKey) +
+
+ +
+

Google Analytics Integration

+

Portal CMS collects its own Analytics to give you real time and useful information about how your website is being used. You can also configure Portal CMS to use Google Analytics.

+
+ +
+ @Html.LabelFor(x => x.GoogleAnalyticsId) + @Html.TextBoxFor(x => x.GoogleAnalyticsId) +
+
+ +
+

Content Delivery Network

+

Portal CMS can utilise a Content Delivery Network that is setup to cache the content of your website. When configured Portal CMS will load your Uploaded Images from the CDN.

+
+ +
+ @Html.LabelFor(x => x.CDNAddress) + @Html.TextBoxFor(x => x.CDNAddress) +
+
+
+ + +} diff --git a/PortalCMS.Web/Areas/Authentication/Controllers/RegistrationController.cs b/PortalCMS.Web/Areas/Authentication/Controllers/RegistrationController.cs index 43917e9..0779f75 100644 --- a/PortalCMS.Web/Areas/Authentication/Controllers/RegistrationController.cs +++ b/PortalCMS.Web/Areas/Authentication/Controllers/RegistrationController.cs @@ -1,8 +1,11 @@ using Microsoft.AspNet.Identity; +using PortalCMS.Library.ExtensionMethods; +using PortalCMS.Library.ReCaptcha; using PortalCMS.Services.Authentication; using PortalCMS.Web.Architecture.Helpers; using PortalCMS.Web.Areas.Authentication.ViewModels.Registration; using PortalCMS.Web.Controllers.Base; +using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Web.Mvc; @@ -27,22 +30,65 @@ public RegistrationController(IUserService userService, IRoleService roleService public ActionResult Index() { var model = new RegisterViewModel(); + if(string.IsNullOrEmpty(SettingHelper.Get("Recaptcha Site Key"))) + { + return View("_RegistrationSimpleForm", model); + } + return View("_RegistrationForm", model); } + [HttpPost] + [ValidateAntiForgeryToken] + public async Task RegisterSimple(RegisterViewModel model) + { + if (ModelState.IsValid && string.IsNullOrEmpty(SettingHelper.Get("Recaptcha Site Key"))) + { + return await ProcessRegistration("_RegistrationSimpleForm", model); + } + + return View("_RegistrationSimpleForm", model); + } + [HttpPost] [ValidateAntiForgeryToken] public async Task Register(RegisterViewModel model) { - if (!ModelState.IsValid) + string captchaResponse = Request.Form["g-Recaptcha-Response"]; + string secretKey = @SettingHelper.Get("Recaptcha Secret Key"); + + try + { + var result = ReCaptchaValidator.IsValidAsync(captchaResponse, secretKey); + if (result.Success && ModelState.IsValid && SettingHelper.Get("Recaptcha Site Key").HasValue()) + { + return await ProcessRegistration("_RegistrationForm", model); + } + + if (!result.Success) + { + foreach (string err in result.ErrorCodes) + { + ModelState.AddModelError("", err); + } + } + } + catch(Exception ex) { - //when the view is redisplayed the old value will be used. One workaround is to remove the value from the ModelState. - ModelState.Remove("HumanCheck.CapImageText"); - ModelState.Remove("HumanCheck.CaptchaCodeText"); - model.HumanCheck = new Library.Captcha(); - return View("_RegistrationForm", model); + var msg = ex.Message; } + return View("_RegistrationForm", model); + } + + /// + /// + /// + /// + /// + /// + private async Task ProcessRegistration(string viewName, RegisterViewModel model) + { // First registration saved will be the administrator var isAdministrator = (await _userService.CountAsync() < 1); var userId = await _registrationService.RegisterAsync(model.EmailAddress, model.Password, model.GivenName, model.FamilyName, isAdministrator); @@ -51,12 +97,7 @@ public async Task Register(RegisterViewModel model) { case true: ModelState.AddModelError("RegistrationError", "Unable to complete registration - please try again!"); - - //when the view is redisplayed the old value will be used. One workaround is to remove the value from the ModelState. - ModelState.Remove("HumanCheck.CapImageText"); - ModelState.Remove("HumanCheck.CaptchaCodeText"); - model.HumanCheck = new Library.Captcha(); - return View("_RegistrationForm", model); + return View(viewName, model); default: if (isAdministrator) diff --git a/PortalCMS.Web/Areas/Authentication/ViewModel/Registration/RegisterViewModel.cs b/PortalCMS.Web/Areas/Authentication/ViewModel/Registration/RegisterViewModel.cs index 2cc0afa..7a28a6b 100644 --- a/PortalCMS.Web/Areas/Authentication/ViewModel/Registration/RegisterViewModel.cs +++ b/PortalCMS.Web/Areas/Authentication/ViewModel/Registration/RegisterViewModel.cs @@ -6,27 +6,19 @@ namespace PortalCMS.Web.Areas.Authentication.ViewModels.Registration { public class RegisterViewModel { - [DisplayName("Email")] [Required] + [DisplayName("Email")] public string EmailAddress { get; set; } - [DisplayName("Password")] [Required] + [DisplayName("Password")] public string Password { get; set; } - [DisplayName("First Name")] [Required] + [DisplayName("First Name")] public string GivenName { get; set; } [DisplayName("Last Name")] - [Required] public string FamilyName { get; set; } - - public Captcha HumanCheck { get; set; } - - public RegisterViewModel() - { - this.HumanCheck = new Captcha(); - } } } \ No newline at end of file diff --git a/PortalCMS.Web/Areas/Authentication/Views/Registration/_RegistrationForm.cshtml b/PortalCMS.Web/Areas/Authentication/Views/Registration/_RegistrationForm.cshtml index c496e0f..54ca90a 100644 --- a/PortalCMS.Web/Areas/Authentication/Views/Registration/_RegistrationForm.cshtml +++ b/PortalCMS.Web/Areas/Authentication/Views/Registration/_RegistrationForm.cshtml @@ -1,8 +1,8 @@ @model PortalCMS.Web.Areas.Authentication.ViewModels.Registration.RegisterViewModel @{ Layout = ""; + bool recapture = string.IsNullOrEmpty(SettingHelper.Get("Recaptcha Secret Key")); } - @using (Html.BeginForm("Register", "Registration", FormMethod.Post, new { area = "Authentication" })) { @Html.AntiForgeryToken() @@ -32,18 +32,11 @@ @Html.PasswordFor(x => x.Password, new { placeholder = "Password" })
-
- @Html.ValidationMessage("HumanCheck.CaptchaCodeText") -
- @Html.LabelFor(x => x.HumanCheck.CapImageText) - @Html.HiddenFor(x => x.HumanCheck.CapImageText) - @Html.TextBoxFor(x => x.HumanCheck.CaptchaCodeText, new { placeholder = "Image Text" }) -
- -
+
-} \ No newline at end of file +} + diff --git a/PortalCMS.Web/Areas/Authentication/Views/Registration/_RegistrationSimpleForm.cshtml b/PortalCMS.Web/Areas/Authentication/Views/Registration/_RegistrationSimpleForm.cshtml new file mode 100644 index 0000000..c839197 --- /dev/null +++ b/PortalCMS.Web/Areas/Authentication/Views/Registration/_RegistrationSimpleForm.cshtml @@ -0,0 +1,38 @@ +@model PortalCMS.Web.Areas.Authentication.ViewModels.Registration.RegisterViewModel +@{ + Layout = ""; +} +@using (Html.BeginForm("RegisterSimple", "Registration", FormMethod.Post, new { area = "Authentication" })) +{ + @Html.AntiForgeryToken() + + @Html.ValidationMessage("GivenName") +
+ @Html.LabelFor(x => x.GivenName) + @Html.TextBoxFor(x => x.GivenName, new { placeholder = "First Name" }) +
+ + @Html.ValidationMessage("FamilyName") +
+ @Html.LabelFor(x => x.FamilyName) + @Html.TextBoxFor(x => x.FamilyName, new { placeholder = "Last Name" }) +
+ + @Html.ValidationMessage("EmailAddress") + @Html.ValidationMessage("EmailAddressUsed") +
+ @Html.LabelFor(x => x.EmailAddress) + @Html.TextBoxFor(x => x.EmailAddress, new { placeholder = "Email Address" }) +
+ + @Html.ValidationMessage("Password") +
+ @Html.LabelFor(x => x.Password) + @Html.PasswordFor(x => x.Password, new { placeholder = "Password" }) +
+ +
+ + +
+} diff --git a/PortalCMS.Web/PortalCMS.Web.csproj b/PortalCMS.Web/PortalCMS.Web.csproj index d74f549..3510f2f 100644 --- a/PortalCMS.Web/PortalCMS.Web.csproj +++ b/PortalCMS.Web/PortalCMS.Web.csproj @@ -113,12 +113,15 @@ ..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll - - ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll ..\packages\Owin.Security.Providers.LinkedIn.2.25.0\lib\net45\Owin.Security.Providers.LinkedIn.dll + + ..\packages\RecaptchaNet.2.1.0\lib\net451\Recaptcha.Web.dll + ..\packages\RestSharp.106.6.7\lib\net452\RestSharp.dll @@ -360,8 +363,9 @@ - + + @@ -811,6 +815,7 @@ + diff --git a/PortalCMS.Web/Views/Shared/_Layout.cshtml b/PortalCMS.Web/Views/Shared/_Layout.cshtml index d071959..624d35c 100644 --- a/PortalCMS.Web/Views/Shared/_Layout.cshtml +++ b/PortalCMS.Web/Views/Shared/_Layout.cshtml @@ -43,15 +43,18 @@ @Html.Partial("_Analytics") - @Html.AntiForgeryToken() + @Html.AntiForgeryToken() - @Html.Partial("_NavBar") - @RenderBody() + @Html.Partial("_NavBar") + @RenderBody() - @Scripts.Render("~/Plugins/Bootstrap/Scripts") - @Scripts.Render("~/Plugins/Popover/Scripts") - @Scripts.Render("~/Plugins/Confirmation/Scripts") - @Scripts.Render("~/Resources/JavaScript/Framework") - @RenderSection("DOMScripts", false) + @Scripts.Render("~/Plugins/Bootstrap/Scripts") + @Scripts.Render("~/Plugins/Popover/Scripts") + @Scripts.Render("~/Plugins/Confirmation/Scripts") + @Scripts.Render("~/Resources/JavaScript/Framework") + + + + @RenderSection("DOMScripts", false) \ No newline at end of file diff --git a/PortalCMS.Web/Web.config b/PortalCMS.Web/Web.config index 74880f7..2747a75 100644 --- a/PortalCMS.Web/Web.config +++ b/PortalCMS.Web/Web.config @@ -321,7 +321,7 @@ - + @@ -345,7 +345,7 @@ - + diff --git a/PortalCMS.Web/packages.config b/PortalCMS.Web/packages.config index 0c9da77..b6118ac 100644 --- a/PortalCMS.Web/packages.config +++ b/PortalCMS.Web/packages.config @@ -28,7 +28,7 @@ - + From 22ce5fdc91aa1631993b6b36864188c318258981 Mon Sep 17 00:00:00 2001 From: Suhail Qureshi Date: Thu, 28 Feb 2019 10:13:44 +0000 Subject: [PATCH 25/27] Fixed unable to blog bug --- PortalCMS.Entities/PortalDbContext.cs | 24 +++++++++---------- .../Authentication/UserService.cs | 6 ++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/PortalCMS.Entities/PortalDbContext.cs b/PortalCMS.Entities/PortalDbContext.cs index de429aa..96ef937 100644 --- a/PortalCMS.Entities/PortalDbContext.cs +++ b/PortalCMS.Entities/PortalDbContext.cs @@ -3,6 +3,7 @@ using PortalCMS.Entities.Entities.Models; using System.Data.Common; using System.Data.Entity; +using System.Data.Entity.ModelConfiguration; using System.Data.Entity.ModelConfiguration.Conventions; namespace PortalCMS.Entities @@ -72,24 +73,23 @@ public PortalDbContext() : base("name=PortalDbConnection") protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); - modelBuilder.Conventions.Remove(); #region Rename identity tables - modelBuilder.Entity() - .ToTable("User"); + //// Add this - so that IdentityUser can share a table with ApplicationUser + modelBuilder.Entity().ToTable("User"); + EntityTypeConfiguration tableUsers = modelBuilder.Entity().ToTable("User"); - modelBuilder.Entity() - .ToTable("UserRole"); + // EF won't let us swap out IdentityUserRole for ApplicationUserRole here: + modelBuilder.Entity().HasMany((ApplicationUser u) => u.Roles); + modelBuilder.Entity().HasKey((IdentityUserRole r) => new { r.UserId, r.RoleId }).ToTable("UserRoles"); - modelBuilder.Entity() - .ToTable("UserLogin"); + //// Add this - so that IdentityRole can share a table with ApplicationRole + modelBuilder.Entity().ToTable("UserRole"); + EntityTypeConfiguration tableRoles = modelBuilder.Entity().ToTable("UserRole"); - modelBuilder.Entity() - .ToTable("UserClaim"); - - modelBuilder.Entity() - .ToTable("Role"); + modelBuilder.Entity().ToTable("UserClaim"); + modelBuilder.Entity().ToTable("UserLogin"); #endregion } diff --git a/PortalCMS.Services/Authentication/UserService.cs b/PortalCMS.Services/Authentication/UserService.cs index e694016..6530e99 100644 --- a/PortalCMS.Services/Authentication/UserService.cs +++ b/PortalCMS.Services/Authentication/UserService.cs @@ -2,6 +2,7 @@ using PortalCMS.Entities.Entities; using PortalCMS.Entities.Entities.Models; using PortalCMS.Repositories.Base; +using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; @@ -53,12 +54,11 @@ public async Task> GetByRoleAsync(List role { var results = new List(); - foreach (var user in await base.DbContext.Users.ToListAsync()) + foreach (var user in UserManager.Users) { foreach (var roleName in roleNames) { - var role = await RoleManager.FindByNameAsync(roleName); - if (user.Roles.Any(x => x.RoleId == role.Id)) + if (await UserManager.IsInRoleAsync(user.Id, roleName)) results.Add(user); } } From 0948b490432c0bce4f3d57c645a8e3463aae64f4 Mon Sep 17 00:00:00 2001 From: Suhail Qureshi Date: Thu, 28 Feb 2019 16:15:36 +0000 Subject: [PATCH 26/27] Minor bug fixes to do with blog... --- PortalCMS.Entities/PortalDbContext.cs | 16 ++++------------ PortalCMS.Web/Areas/Blog/Views/Read/Index.cshtml | 2 +- PortalCMS.Web/PortalCMS.Web.csproj | 8 ++++---- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/PortalCMS.Entities/PortalDbContext.cs b/PortalCMS.Entities/PortalDbContext.cs index 96ef937..63f421b 100644 --- a/PortalCMS.Entities/PortalDbContext.cs +++ b/PortalCMS.Entities/PortalDbContext.cs @@ -73,23 +73,15 @@ public PortalDbContext() : base("name=PortalDbConnection") protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); + modelBuilder.Conventions.Remove(); #region Rename identity tables - //// Add this - so that IdentityUser can share a table with ApplicationUser modelBuilder.Entity().ToTable("User"); - EntityTypeConfiguration tableUsers = modelBuilder.Entity().ToTable("User"); - - // EF won't let us swap out IdentityUserRole for ApplicationUserRole here: - modelBuilder.Entity().HasMany((ApplicationUser u) => u.Roles); - modelBuilder.Entity().HasKey((IdentityUserRole r) => new { r.UserId, r.RoleId }).ToTable("UserRoles"); - - //// Add this - so that IdentityRole can share a table with ApplicationRole - modelBuilder.Entity().ToTable("UserRole"); - EntityTypeConfiguration tableRoles = modelBuilder.Entity().ToTable("UserRole"); - - modelBuilder.Entity().ToTable("UserClaim"); + modelBuilder.Entity().ToTable("UserRole"); modelBuilder.Entity().ToTable("UserLogin"); + modelBuilder.Entity().ToTable("UserClaim"); + modelBuilder.Entity().ToTable("Role"); #endregion } diff --git a/PortalCMS.Web/Areas/Blog/Views/Read/Index.cshtml b/PortalCMS.Web/Areas/Blog/Views/Read/Index.cshtml index b5a7f2e..a1d9a10 100644 --- a/PortalCMS.Web/Areas/Blog/Views/Read/Index.cshtml +++ b/PortalCMS.Web/Areas/Blog/Views/Read/Index.cshtml @@ -107,7 +107,7 @@ @if (Model.Author != null) {
- Author Avatar + Author Avatar

Author: @Model.Author.GivenName @Model.Author.FamilyName

Updated: @Model.CurrentPost.DateUpdated.ToString("dd MMM yyyy HH:mm")

diff --git a/PortalCMS.Web/PortalCMS.Web.csproj b/PortalCMS.Web/PortalCMS.Web.csproj index 3510f2f..5fded2d 100644 --- a/PortalCMS.Web/PortalCMS.Web.csproj +++ b/PortalCMS.Web/PortalCMS.Web.csproj @@ -478,10 +478,6 @@ Web.config - - Web.config - Designer - @@ -817,6 +813,10 @@ + + Web.config + Designer + 10.0 From b434498d69c37e376bf5d8f68824269773aaf7fe Mon Sep 17 00:00:00 2001 From: Suhail Qureshi Date: Thu, 28 Feb 2019 23:51:25 +0000 Subject: [PATCH 27/27] Housekeep changes --- .../Entities/Models/ApplicationUser.cs | 1 - .../Entities/Models/IdentityConfig.cs | 45 -- .../DropAndMigrateDatabaseToLatestVersion.cs | 29 -- .../Environments/DefaultInitialiser.cs | 6 - .../MigrateDatabaseToLatestVersion.cs | 19 - ...82_Column name change for keys.Designer.cs | 29 -- ...02061751282_Column name change for keys.cs | 475 ------------------ ...061751282_Column name change for keys.resx | 126 ----- ... changed to Name in Role table.Designer.cs | 29 -- ...d RoeName changed to Name in Role table.cs | 48 -- ...RoeName changed to Name in Role table.resx | 126 ----- .../Migrations/Configuration.cs | 49 -- PortalCMS.Entities/PortalCMS.Entities.csproj | 8 +- PortalCMS.Entities/PortalDbContext.cs | 12 +- PortalCMS.Web/Web.config | 1 - 15 files changed, 12 insertions(+), 991 deletions(-) delete mode 100644 PortalCMS.Entities/Initialisers/DropAndMigrateDatabaseToLatestVersion.cs delete mode 100644 PortalCMS.Entities/Initialisers/Environments/DefaultInitialiser.cs delete mode 100644 PortalCMS.Entities/Initialisers/MigrateDatabaseToLatestVersion.cs delete mode 100644 PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.Designer.cs delete mode 100644 PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.cs delete mode 100644 PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.resx delete mode 100644 PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.Designer.cs delete mode 100644 PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.cs delete mode 100644 PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.resx delete mode 100644 PortalCMS.Entities/Migrations/Configuration.cs diff --git a/PortalCMS.Entities/Entities/Models/ApplicationUser.cs b/PortalCMS.Entities/Entities/Models/ApplicationUser.cs index b2d753c..267e721 100644 --- a/PortalCMS.Entities/Entities/Models/ApplicationUser.cs +++ b/PortalCMS.Entities/Entities/Models/ApplicationUser.cs @@ -10,7 +10,6 @@ namespace PortalCMS.Entities.Entities.Models { - // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more. public class ApplicationUser : IdentityUser { [Required] diff --git a/PortalCMS.Entities/Entities/Models/IdentityConfig.cs b/PortalCMS.Entities/Entities/Models/IdentityConfig.cs index 97a070f..3377f32 100644 --- a/PortalCMS.Entities/Entities/Models/IdentityConfig.cs +++ b/PortalCMS.Entities/Entities/Models/IdentityConfig.cs @@ -119,51 +119,6 @@ public Task SendAsync(IdentityMessage message) } } - // This is useful if you do not want to tear down the database each time you run the application. - // public class ApplicationDbInitializer : DropCreateDatabaseAlways - // This example shows you how to create a new database if the Model changes - public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges - { - protected override void Seed(PortalDbContext context) - { - InitializeIdentityForEF(context); - base.Seed(context); - } - - //Create User=Admin@Admin.com with password=Admin@123456 in the Admin role - public static void InitializeIdentityForEF(PortalDbContext db) - { - var userManager = HttpContext.Current.GetOwinContext().GetUserManager(); - var roleManager = HttpContext.Current.GetOwinContext().Get(); - const string name = "admin@example.com"; - const string password = "Admin@123456"; - const string roleName = "Admin"; - - //Create Role Admin if it does not exist - var role = roleManager.FindByName(roleName); - if (role == null) - { - role = new ApplicationRole(roleName); - var roleresult = roleManager.Create(role); - } - - var user = userManager.FindByName(name); - if (user == null) - { - user = new ApplicationUser { UserName = name, Email = name }; - var result = userManager.Create(user, password); - result = userManager.SetLockoutEnabled(user.Id, false); - } - - // Add user admin to Role Admin if not already added - var rolesForUser = userManager.GetRoles(user.Id); - if (!rolesForUser.Contains(role.Name)) - { - var result = userManager.AddToRole(user.Id, role.Name); - } - } - } - // Configure the application sign-in manager which is used in this application. public class ApplicationSignInManager : SignInManager { diff --git a/PortalCMS.Entities/Initialisers/DropAndMigrateDatabaseToLatestVersion.cs b/PortalCMS.Entities/Initialisers/DropAndMigrateDatabaseToLatestVersion.cs deleted file mode 100644 index 496422a..0000000 --- a/PortalCMS.Entities/Initialisers/DropAndMigrateDatabaseToLatestVersion.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace PortalCMS.Entities.Initialisers -{ - using System.Data.Entity; - using System.Data.Entity.Migrations; - - public class DropAndMigrateDatabaseToLatestVersion : IDatabaseInitializer where TContext : DbContext, new() where TMigrationsConfiguration : DbMigrationsConfiguration, new() - { - private readonly TMigrationsConfiguration config; - - public DropAndMigrateDatabaseToLatestVersion() - { - config = new TMigrationsConfiguration(); - } - - public void InitializeDatabase(TContext context) - { - context.Database.Delete(); - - var migrator = new DbMigrator(config); - migrator.Update(); - - Seed(context); - } - - public virtual void Seed(TContext context) - { - } - } -} \ No newline at end of file diff --git a/PortalCMS.Entities/Initialisers/Environments/DefaultInitialiser.cs b/PortalCMS.Entities/Initialisers/Environments/DefaultInitialiser.cs deleted file mode 100644 index 105cc42..0000000 --- a/PortalCMS.Entities/Initialisers/Environments/DefaultInitialiser.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace PortalCMS.Entities.Initialisers.Environments -{ - internal class DefaultInitialiser : MigrateDatabaseToLatestVersion - { - } -} \ No newline at end of file diff --git a/PortalCMS.Entities/Initialisers/MigrateDatabaseToLatestVersion.cs b/PortalCMS.Entities/Initialisers/MigrateDatabaseToLatestVersion.cs deleted file mode 100644 index 2c206b1..0000000 --- a/PortalCMS.Entities/Initialisers/MigrateDatabaseToLatestVersion.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace PortalCMS.Entities.Initialisers -{ - using PortalCMS.Entities.Migrations; - using System.Data.Entity; - - internal class MigrateDatabaseToLatestVersion : MigrateDatabaseToLatestVersion - { - public override void InitializeDatabase(PortalDbContext context) - { - base.InitializeDatabase(context); - - Seed(context); - } - - public virtual void Seed(PortalDbContext context) - { - } - } -} \ No newline at end of file diff --git a/PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.Designer.cs b/PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.Designer.cs deleted file mode 100644 index 00e1f11..0000000 --- a/PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.Designer.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -namespace Portal.CMS.Entities.Migrations -{ - using System.CodeDom.Compiler; - using System.Data.Entity.Migrations; - using System.Data.Entity.Migrations.Infrastructure; - using System.Resources; - - [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] - public sealed partial class Columnnamechangeforkeys : IMigrationMetadata - { - private readonly ResourceManager Resources = new ResourceManager(typeof(Columnnamechangeforkeys)); - - string IMigrationMetadata.Id - { - get { return "201902061751282_Column name change for keys"; } - } - - string IMigrationMetadata.Source - { - get { return null; } - } - - string IMigrationMetadata.Target - { - get { return Resources.GetString("Target"); } - } - } -} diff --git a/PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.cs b/PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.cs deleted file mode 100644 index 1467fed..0000000 --- a/PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.cs +++ /dev/null @@ -1,475 +0,0 @@ -namespace Portal.CMS.Entities.Migrations -{ - using System; - using System.Data.Entity.Migrations; - - public partial class Columnnamechangeforkeys : DbMigration - { - public override void Up() - { - CreateTable( - "dbo.AnalyticPageViews", - c => new - { - AnalyticPageViewId = c.Int(nullable: false, identity: true), - IPAddress = c.String(nullable: false), - UserAgent = c.String(nullable: false), - Controller = c.String(nullable: false), - Action = c.String(nullable: false), - DateAdded = c.DateTime(nullable: false), - Area = c.String(), - ReferredUrl = c.String(), - UserId = c.Int(nullable: false), - }) - .PrimaryKey(t => t.AnalyticPageViewId); - - CreateTable( - "dbo.AnalyticPostViews", - c => new - { - AnalyticPageViewId = c.Int(nullable: false, identity: true), - IPAddress = c.String(nullable: false), - UserAgent = c.String(nullable: false), - PostId = c.Int(nullable: false), - DateAdded = c.DateTime(nullable: false), - ReferredUrl = c.String(), - UserId = c.Int(nullable: false), - }) - .PrimaryKey(t => t.AnalyticPageViewId) - .ForeignKey("dbo.Posts", t => t.PostId, cascadeDelete: true) - .Index(t => t.PostId); - - CreateTable( - "dbo.CopyItems", - c => new - { - CopyId = c.Int(nullable: false, identity: true), - CopyName = c.String(nullable: false), - CopyBody = c.String(), - DateAdded = c.DateTime(nullable: false), - DateUpdated = c.DateTime(nullable: false), - }) - .PrimaryKey(t => t.CopyId); - - CreateTable( - "dbo.Fonts", - c => new - { - FontId = c.Int(nullable: false, identity: true), - FontName = c.String(nullable: false), - FontType = c.String(nullable: false), - FontPath = c.String(nullable: false), - DateAdded = c.DateTime(nullable: false), - DateUpdated = c.DateTime(nullable: false), - }) - .PrimaryKey(t => t.FontId); - - CreateTable( - "dbo.Images", - c => new - { - ImageId = c.Int(nullable: false, identity: true), - ImageCategory = c.Int(nullable: false), - ImagePath = c.String(), - }) - .PrimaryKey(t => t.ImageId); - - CreateTable( - "dbo.MenuItemRoles", - c => new - { - MenuItemRoleId = c.Int(nullable: false, identity: true), - MenuItemId = c.Int(nullable: false), - RoleId = c.Int(nullable: false), - }) - .PrimaryKey(t => t.MenuItemRoleId) - .ForeignKey("dbo.MenuItems", t => t.MenuItemId, cascadeDelete: true) - .ForeignKey("dbo.Roles", t => t.RoleId, cascadeDelete: true) - .Index(t => t.MenuItemId) - .Index(t => t.RoleId); - - CreateTable( - "dbo.MenuItems", - c => new - { - MenuItemId = c.Int(nullable: false, identity: true), - MenuId = c.Int(nullable: false), - LinkText = c.String(nullable: false), - LinkIcon = c.String(), - LinkURL = c.String(nullable: false), - }) - .PrimaryKey(t => t.MenuItemId) - .ForeignKey("dbo.MenuSystems", t => t.MenuId, cascadeDelete: true) - .Index(t => t.MenuId); - - CreateTable( - "dbo.MenuSystems", - c => new - { - MenuId = c.Int(nullable: false, identity: true), - MenuName = c.String(nullable: false), - }) - .PrimaryKey(t => t.MenuId); - - CreateTable( - "dbo.Roles", - c => new - { - RoleId = c.Int(nullable: false, identity: true), - RoleName = c.String(nullable: false), - IsAssignable = c.Boolean(nullable: false), - }) - .PrimaryKey(t => t.RoleId); - - CreateTable( - "dbo.PageAssociationRoles", - c => new - { - PageAssociationRoleId = c.Int(nullable: false, identity: true), - PageAssociationId = c.Int(nullable: false), - RoleId = c.Int(nullable: false), - }) - .PrimaryKey(t => t.PageAssociationRoleId) - .ForeignKey("dbo.PageAssociations", t => t.PageAssociationId, cascadeDelete: true) - .ForeignKey("dbo.Roles", t => t.RoleId, cascadeDelete: true) - .Index(t => t.PageAssociationId) - .Index(t => t.RoleId); - - CreateTable( - "dbo.PageAssociations", - c => new - { - PageAssociationId = c.Int(nullable: false, identity: true), - PageId = c.Int(nullable: false), - PageSectionId = c.Int(), - PagePartialId = c.Int(), - PageAssociationOrder = c.Int(nullable: false), - }) - .PrimaryKey(t => t.PageAssociationId) - .ForeignKey("dbo.Pages", t => t.PageId, cascadeDelete: true) - .ForeignKey("dbo.PagePartials", t => t.PagePartialId) - .ForeignKey("dbo.PageSections", t => t.PageSectionId) - .Index(t => t.PageId) - .Index(t => t.PageSectionId) - .Index(t => t.PagePartialId); - - CreateTable( - "dbo.Pages", - c => new - { - PageId = c.Int(nullable: false, identity: true), - PageName = c.String(nullable: false), - PageArea = c.String(), - PageController = c.String(nullable: false), - PageAction = c.String(nullable: false), - DateAdded = c.DateTime(nullable: false), - DateUpdated = c.DateTime(nullable: false), - }) - .PrimaryKey(t => t.PageId); - - CreateTable( - "dbo.PageRoles", - c => new - { - PageRoleId = c.Int(nullable: false, identity: true), - PageId = c.Int(nullable: false), - RoleId = c.Int(nullable: false), - }) - .PrimaryKey(t => t.PageRoleId) - .ForeignKey("dbo.Pages", t => t.PageId, cascadeDelete: true) - .ForeignKey("dbo.Roles", t => t.RoleId, cascadeDelete: true) - .Index(t => t.PageId) - .Index(t => t.RoleId); - - CreateTable( - "dbo.PagePartials", - c => new - { - PagePartialId = c.Int(nullable: false, identity: true), - RouteArea = c.String(), - RouteController = c.String(nullable: false), - RouteAction = c.String(nullable: false), - }) - .PrimaryKey(t => t.PagePartialId); - - CreateTable( - "dbo.PageSections", - c => new - { - PageSectionId = c.Int(nullable: false, identity: true), - PageSectionBody = c.String(), - }) - .PrimaryKey(t => t.PageSectionId); - - CreateTable( - "dbo.PageSectionBackups", - c => new - { - PageSectionBackupId = c.Int(nullable: false, identity: true), - PageSectionId = c.Int(nullable: false), - PageSectionBody = c.String(), - DateAdded = c.DateTime(nullable: false), - }) - .PrimaryKey(t => t.PageSectionBackupId) - .ForeignKey("dbo.PageSections", t => t.PageSectionId, cascadeDelete: true) - .Index(t => t.PageSectionId); - - CreateTable( - "dbo.PageComponentTypes", - c => new - { - PageComponentTypeId = c.Int(nullable: false, identity: true), - PageComponentTypeName = c.String(nullable: false), - PageComponentTypeCategory = c.Int(nullable: false), - PageComponentBody = c.String(nullable: false), - }) - .PrimaryKey(t => t.PageComponentTypeId); - - CreateTable( - "dbo.PageSectionTypes", - c => new - { - PageSectionTypeId = c.Int(nullable: false, identity: true), - PageSectionTypeName = c.String(nullable: false), - PageSectionTypeBody = c.String(nullable: false), - PageSectionTypeCategory = c.Int(nullable: false), - PageSectionTypeOrder = c.Int(nullable: false), - }) - .PrimaryKey(t => t.PageSectionTypeId); - - CreateTable( - "dbo.PostCategories", - c => new - { - PostCategoryId = c.Int(nullable: false, identity: true), - PostCategoryName = c.String(nullable: false), - }) - .PrimaryKey(t => t.PostCategoryId); - - CreateTable( - "dbo.Posts", - c => new - { - PostId = c.Int(nullable: false, identity: true), - PostTitle = c.String(nullable: false), - PostDescription = c.String(nullable: false), - PostBody = c.String(nullable: false), - PostAuthorUserId = c.Int(nullable: false), - DateAdded = c.DateTime(nullable: false), - DateUpdated = c.DateTime(nullable: false), - PostCategoryId = c.Int(nullable: false), - IsPublished = c.Boolean(nullable: false), - }) - .PrimaryKey(t => t.PostId) - .ForeignKey("dbo.PostCategories", t => t.PostCategoryId, cascadeDelete: true) - .Index(t => t.PostCategoryId); - - CreateTable( - "dbo.PostComments", - c => new - { - PostCommentId = c.Int(nullable: false, identity: true), - UserId = c.Int(nullable: false), - PostId = c.Int(nullable: false), - CommentBody = c.String(nullable: false), - DateAdded = c.DateTime(nullable: false), - }) - .PrimaryKey(t => t.PostCommentId) - .ForeignKey("dbo.Posts", t => t.PostId, cascadeDelete: true) - .ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true) - .Index(t => t.UserId) - .Index(t => t.PostId); - - CreateTable( - "dbo.Users", - c => new - { - Id = c.Int(nullable: false, identity: true), - Email = c.String(nullable: false), - Password = c.String(nullable: false), - GivenName = c.String(nullable: false), - FamilyName = c.String(nullable: false), - DateAdded = c.DateTime(nullable: false), - DateUpdated = c.DateTime(nullable: false), - AvatarImagePath = c.String(), - Bio = c.String(), - }) - .PrimaryKey(t => t.Id); - - CreateTable( - "dbo.UserRoles", - c => new - { - Id = c.Int(nullable: false, identity: true), - UserId = c.Int(nullable: false), - RoleId = c.Int(nullable: false), - }) - .PrimaryKey(t => t.Id) - .ForeignKey("dbo.Roles", t => t.RoleId, cascadeDelete: true) - .ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true) - .Index(t => t.UserId) - .Index(t => t.RoleId); - - CreateTable( - "dbo.PostImages", - c => new - { - PostImageId = c.Int(nullable: false, identity: true), - PostImageType = c.Int(nullable: false), - PostId = c.Int(nullable: false), - ImageId = c.Int(nullable: false), - }) - .PrimaryKey(t => t.PostImageId) - .ForeignKey("dbo.Images", t => t.ImageId, cascadeDelete: true) - .ForeignKey("dbo.Posts", t => t.PostId, cascadeDelete: true) - .Index(t => t.PostId) - .Index(t => t.ImageId); - - CreateTable( - "dbo.PostRoles", - c => new - { - PostRoleId = c.Int(nullable: false, identity: true), - PostId = c.Int(nullable: false), - RoleId = c.Int(nullable: false), - }) - .PrimaryKey(t => t.PostRoleId) - .ForeignKey("dbo.Posts", t => t.PostId, cascadeDelete: true) - .ForeignKey("dbo.Roles", t => t.RoleId, cascadeDelete: true) - .Index(t => t.PostId) - .Index(t => t.RoleId); - - CreateTable( - "dbo.Settings", - c => new - { - SettingId = c.Int(nullable: false, identity: true), - SettingName = c.String(nullable: false), - SettingValue = c.String(), - }) - .PrimaryKey(t => t.SettingId); - - CreateTable( - "dbo.CustomThemes", - c => new - { - ThemeId = c.Int(nullable: false, identity: true), - ThemeName = c.String(nullable: false), - IsDefault = c.Boolean(nullable: false), - TitleFontId = c.Int(), - TextFontId = c.Int(), - TitleLargeFontSize = c.Int(nullable: false), - TitleMediumFontSize = c.Int(nullable: false), - TitleSmallFontSize = c.Int(nullable: false), - TitleTinyFontSize = c.Int(nullable: false), - TextStandardFontSize = c.Int(nullable: false), - PageBackgroundColour = c.String(nullable: false), - MenuBackgroundColour = c.String(nullable: false), - MenuTextColour = c.String(nullable: false), - DateAdded = c.DateTime(nullable: false), - DateUpdated = c.DateTime(nullable: false), - }) - .PrimaryKey(t => t.ThemeId) - .ForeignKey("dbo.Fonts", t => t.TextFontId) - .ForeignKey("dbo.Fonts", t => t.TitleFontId) - .Index(t => t.TitleFontId) - .Index(t => t.TextFontId); - - CreateTable( - "dbo.UserTokens", - c => new - { - UserTokenId = c.Int(nullable: false, identity: true), - UserTokenType = c.Int(nullable: false), - Token = c.String(nullable: false), - UserId = c.Int(nullable: false), - DateAdded = c.DateTime(nullable: false), - DateRedeemed = c.DateTime(), - }) - .PrimaryKey(t => t.UserTokenId) - .ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true) - .Index(t => t.UserId); - - } - - public override void Down() - { - DropForeignKey("dbo.UserTokens", "UserId", "dbo.Users"); - DropForeignKey("dbo.CustomThemes", "TitleFontId", "dbo.Fonts"); - DropForeignKey("dbo.CustomThemes", "TextFontId", "dbo.Fonts"); - DropForeignKey("dbo.AnalyticPostViews", "PostId", "dbo.Posts"); - DropForeignKey("dbo.PostRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.PostRoles", "PostId", "dbo.Posts"); - DropForeignKey("dbo.PostImages", "PostId", "dbo.Posts"); - DropForeignKey("dbo.PostImages", "ImageId", "dbo.Images"); - DropForeignKey("dbo.PostComments", "UserId", "dbo.Users"); - DropForeignKey("dbo.UserRoles", "UserId", "dbo.Users"); - DropForeignKey("dbo.UserRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.PostComments", "PostId", "dbo.Posts"); - DropForeignKey("dbo.Posts", "PostCategoryId", "dbo.PostCategories"); - DropForeignKey("dbo.PageAssociationRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.PageAssociationRoles", "PageAssociationId", "dbo.PageAssociations"); - DropForeignKey("dbo.PageAssociations", "PageSectionId", "dbo.PageSections"); - DropForeignKey("dbo.PageSectionBackups", "PageSectionId", "dbo.PageSections"); - DropForeignKey("dbo.PageAssociations", "PagePartialId", "dbo.PagePartials"); - DropForeignKey("dbo.PageAssociations", "PageId", "dbo.Pages"); - DropForeignKey("dbo.PageRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.PageRoles", "PageId", "dbo.Pages"); - DropForeignKey("dbo.MenuItemRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.MenuItemRoles", "MenuItemId", "dbo.MenuItems"); - DropForeignKey("dbo.MenuItems", "MenuId", "dbo.MenuSystems"); - DropIndex("dbo.UserTokens", new[] { "UserId" }); - DropIndex("dbo.CustomThemes", new[] { "TextFontId" }); - DropIndex("dbo.CustomThemes", new[] { "TitleFontId" }); - DropIndex("dbo.PostRoles", new[] { "RoleId" }); - DropIndex("dbo.PostRoles", new[] { "PostId" }); - DropIndex("dbo.PostImages", new[] { "ImageId" }); - DropIndex("dbo.PostImages", new[] { "PostId" }); - DropIndex("dbo.UserRoles", new[] { "RoleId" }); - DropIndex("dbo.UserRoles", new[] { "UserId" }); - DropIndex("dbo.PostComments", new[] { "PostId" }); - DropIndex("dbo.PostComments", new[] { "UserId" }); - DropIndex("dbo.Posts", new[] { "PostCategoryId" }); - DropIndex("dbo.PageSectionBackups", new[] { "PageSectionId" }); - DropIndex("dbo.PageRoles", new[] { "RoleId" }); - DropIndex("dbo.PageRoles", new[] { "PageId" }); - DropIndex("dbo.PageAssociations", new[] { "PagePartialId" }); - DropIndex("dbo.PageAssociations", new[] { "PageSectionId" }); - DropIndex("dbo.PageAssociations", new[] { "PageId" }); - DropIndex("dbo.PageAssociationRoles", new[] { "RoleId" }); - DropIndex("dbo.PageAssociationRoles", new[] { "PageAssociationId" }); - DropIndex("dbo.MenuItems", new[] { "MenuId" }); - DropIndex("dbo.MenuItemRoles", new[] { "RoleId" }); - DropIndex("dbo.MenuItemRoles", new[] { "MenuItemId" }); - DropIndex("dbo.AnalyticPostViews", new[] { "PostId" }); - DropTable("dbo.UserTokens"); - DropTable("dbo.CustomThemes"); - DropTable("dbo.Settings"); - DropTable("dbo.PostRoles"); - DropTable("dbo.PostImages"); - DropTable("dbo.UserRoles"); - DropTable("dbo.Users"); - DropTable("dbo.PostComments"); - DropTable("dbo.Posts"); - DropTable("dbo.PostCategories"); - DropTable("dbo.PageSectionTypes"); - DropTable("dbo.PageComponentTypes"); - DropTable("dbo.PageSectionBackups"); - DropTable("dbo.PageSections"); - DropTable("dbo.PagePartials"); - DropTable("dbo.PageRoles"); - DropTable("dbo.Pages"); - DropTable("dbo.PageAssociations"); - DropTable("dbo.PageAssociationRoles"); - DropTable("dbo.Roles"); - DropTable("dbo.MenuSystems"); - DropTable("dbo.MenuItems"); - DropTable("dbo.MenuItemRoles"); - DropTable("dbo.Images"); - DropTable("dbo.Fonts"); - DropTable("dbo.CopyItems"); - DropTable("dbo.AnalyticPostViews"); - DropTable("dbo.AnalyticPageViews"); - } - } -} diff --git a/PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.resx b/PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.resx deleted file mode 100644 index 0593d79..0000000 --- a/PortalCMS.Entities/Migrations/201902061751282_Column name change for keys.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 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 - - - dbo - - \ No newline at end of file diff --git a/PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.Designer.cs b/PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.Designer.cs deleted file mode 100644 index c8a7ae1..0000000 --- a/PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.Designer.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -namespace Portal.CMS.Entities.Migrations -{ - using System.CodeDom.Compiler; - using System.Data.Entity.Migrations; - using System.Data.Entity.Migrations.Infrastructure; - using System.Resources; - - [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] - public sealed partial class KeychangedtIDandRoeNamechangedtoNameinRoletable : IMigrationMetadata - { - private readonly ResourceManager Resources = new ResourceManager(typeof(KeychangedtIDandRoeNamechangedtoNameinRoletable)); - - string IMigrationMetadata.Id - { - get { return "201902062009062_Key changed t IDand RoeName changed to Name in Role table"; } - } - - string IMigrationMetadata.Source - { - get { return null; } - } - - string IMigrationMetadata.Target - { - get { return Resources.GetString("Target"); } - } - } -} diff --git a/PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.cs b/PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.cs deleted file mode 100644 index d8b60ab..0000000 --- a/PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace Portal.CMS.Entities.Migrations -{ - using System; - using System.Data.Entity.Migrations; - - public partial class KeychangedtIDandRoeNamechangedtoNameinRoletable : DbMigration - { - public override void Up() - { - DropForeignKey("dbo.MenuItemRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.PageRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.PageAssociationRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.UserRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.PostRoles", "RoleId", "dbo.Roles"); - DropPrimaryKey("dbo.Roles"); - AddColumn("dbo.Roles", "Id", c => c.Int(nullable: false, identity: true)); - AddColumn("dbo.Roles", "Name", c => c.String(nullable: false)); - AddPrimaryKey("dbo.Roles", "Id"); - AddForeignKey("dbo.MenuItemRoles", "RoleId", "dbo.Roles", "Id", cascadeDelete: true); - AddForeignKey("dbo.PageRoles", "RoleId", "dbo.Roles", "Id", cascadeDelete: true); - AddForeignKey("dbo.PageAssociationRoles", "RoleId", "dbo.Roles", "Id", cascadeDelete: true); - AddForeignKey("dbo.UserRoles", "RoleId", "dbo.Roles", "Id", cascadeDelete: true); - AddForeignKey("dbo.PostRoles", "RoleId", "dbo.Roles", "Id", cascadeDelete: true); - DropColumn("dbo.Roles", "RoleId"); - DropColumn("dbo.Roles", "RoleName"); - } - - public override void Down() - { - AddColumn("dbo.Roles", "RoleName", c => c.String(nullable: false)); - AddColumn("dbo.Roles", "RoleId", c => c.Int(nullable: false, identity: true)); - DropForeignKey("dbo.PostRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.UserRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.PageAssociationRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.PageRoles", "RoleId", "dbo.Roles"); - DropForeignKey("dbo.MenuItemRoles", "RoleId", "dbo.Roles"); - DropPrimaryKey("dbo.Roles"); - DropColumn("dbo.Roles", "Name"); - DropColumn("dbo.Roles", "Id"); - AddPrimaryKey("dbo.Roles", "RoleId"); - AddForeignKey("dbo.PostRoles", "RoleId", "dbo.Roles", "RoleId", cascadeDelete: true); - AddForeignKey("dbo.UserRoles", "RoleId", "dbo.Roles", "RoleId", cascadeDelete: true); - AddForeignKey("dbo.PageAssociationRoles", "RoleId", "dbo.Roles", "RoleId", cascadeDelete: true); - AddForeignKey("dbo.PageRoles", "RoleId", "dbo.Roles", "RoleId", cascadeDelete: true); - AddForeignKey("dbo.MenuItemRoles", "RoleId", "dbo.Roles", "RoleId", cascadeDelete: true); - } - } -} diff --git a/PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.resx b/PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.resx deleted file mode 100644 index 1a91bea..0000000 --- a/PortalCMS.Entities/Migrations/201902062009062_Key changed t IDand RoeName changed to Name in Role table.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 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 - - - dbo - - \ No newline at end of file diff --git a/PortalCMS.Entities/Migrations/Configuration.cs b/PortalCMS.Entities/Migrations/Configuration.cs deleted file mode 100644 index 5541f1c..0000000 --- a/PortalCMS.Entities/Migrations/Configuration.cs +++ /dev/null @@ -1,49 +0,0 @@ -namespace PortalCMS.Entities.Migrations -{ - using Seed; - using System.Data.Entity.Migrations; - - internal sealed class Configuration : DbMigrationsConfiguration - { - public Configuration() - { - AutomaticMigrationsEnabled = true; - } - - protected override void Seed(PortalCMS.Entities.PortalDbContext context) - { - ThemeSeed.Seed(context); - context.SaveChanges(); - - RoleSeed.Seed(context); - context.SaveChanges(); - - SettingSeed.Seed(context); - context.SaveChanges(); - - PostCategorySeed.Seed(context); - context.SaveChanges(); - - PageSectionTypeSeed.Seed(context); - context.SaveChanges(); - - PageComponentTypeSeed.Seed(context); - context.SaveChanges(); - - MediaSeed.Seed(context); - context.SaveChanges(); - - CopySeed.Seed(context); - context.SaveChanges(); - - MenuSeed.Seed(context); - context.SaveChanges(); - - PageSeed.Seed(context); - context.SaveChanges(); - - //PostSeed.Seed(context); - //context.SaveChanges(); - } - } -} \ No newline at end of file diff --git a/PortalCMS.Entities/PortalCMS.Entities.csproj b/PortalCMS.Entities/PortalCMS.Entities.csproj index 27225bb..ec1cea3 100644 --- a/PortalCMS.Entities/PortalCMS.Entities.csproj +++ b/PortalCMS.Entities/PortalCMS.Entities.csproj @@ -126,10 +126,6 @@ - - - - @@ -145,7 +141,9 @@ - + + Designer + Designer diff --git a/PortalCMS.Entities/PortalDbContext.cs b/PortalCMS.Entities/PortalDbContext.cs index 63f421b..1e1b24e 100644 --- a/PortalCMS.Entities/PortalDbContext.cs +++ b/PortalCMS.Entities/PortalDbContext.cs @@ -3,7 +3,6 @@ using PortalCMS.Entities.Entities.Models; using System.Data.Common; using System.Data.Entity; -using System.Data.Entity.ModelConfiguration; using System.Data.Entity.ModelConfiguration.Conventions; namespace PortalCMS.Entities @@ -14,6 +13,7 @@ public class PortalDbContext : IdentityDbContext public PortalDbContext(DbConnection connection) : base(connection, true) { + Database.SetInitializer(null); } public PortalDbContext() : base("name=PortalDbConnection") @@ -77,11 +77,17 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder) #region Rename identity tables + // Add this - so that IdentityUser can share a table with ApplicationUser modelBuilder.Entity().ToTable("User"); - modelBuilder.Entity().ToTable("UserRole"); + modelBuilder.Entity().ToTable("User"); + + // Add this - so that IdentityRole can share a table with ApplicationRole + modelBuilder.Entity().ToTable("UserRole"); + modelBuilder.Entity().ToTable("UserRole"); + + modelBuilder.Entity().ToTable("UserRoles"); modelBuilder.Entity().ToTable("UserLogin"); modelBuilder.Entity().ToTable("UserClaim"); - modelBuilder.Entity().ToTable("Role"); #endregion } diff --git a/PortalCMS.Web/Web.config b/PortalCMS.Web/Web.config index 2747a75..a6d2666 100644 --- a/PortalCMS.Web/Web.config +++ b/PortalCMS.Web/Web.config @@ -13,7 +13,6 @@ -