From 7945ade96194625c0bb20301aef35a1a5484005d Mon Sep 17 00:00:00 2001 From: Uncled1023 Date: Thu, 31 Jan 2019 23:43:23 -0800 Subject: [PATCH] Added .net core piwik tracking api to most entry points --- .../V1/Controllers/AccountAPIv1Controller.cs | 2 ++ .../V1/Controllers/PasteAPIv1Controller.cs | 2 ++ .../V1/Controllers/ShortenAPIv1Controller.cs | 2 ++ .../V1/Controllers/UploadAPIv1Controller.cs | 2 ++ .../About/Controllers/AboutController.cs | 1 + .../Abuse/Controllers/AbuseController.cs | 1 + .../Admin/Controllers/AdminController.cs | 4 +++ .../Areas/Blog/Controllers/BlogController.cs | 6 ++++- .../Contact/Controllers/ContactController.cs | 1 + .../Error/Controllers/ErrorController.cs | 6 +++++ Teknik/Areas/FAQ/Controllers/FAQController.cs | 1 + .../Areas/Help/Controllers/HelpController.cs | 1 + .../Areas/Home/Controllers/HomeController.cs | 1 + .../Paste/Controllers/PasteController.cs | 5 +++- .../Podcast/Controllers/PodcastController.cs | 3 +++ .../Privacy/Controllers/PrivacyController.cs | 1 + Teknik/Areas/RSS/Controllers/RSSController.cs | 3 +++ .../Controllers/ShortenerController.cs | 2 ++ .../Stats/Controllers/StatsController.cs | 1 + Teknik/Areas/TOS/Controllers/TOSController.cs | 1 + .../Upload/Controllers/UploadController.cs | 3 +++ .../Areas/User/Controllers/UserController.cs | 23 +++++++++++++++--- .../Vault/Controllers/VaultController.cs | 4 +++ Teknik/Controllers/DefaultController.cs | 3 ++- Teknik/Startup.cs | 4 +-- Tracking/Tracking.csproj | 8 ++++-- Tracking/lib/Piwik.Tracker.dll | Bin 0 -> 29184 bytes 27 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 Tracking/lib/Piwik.Tracker.dll diff --git a/Teknik/Areas/API/V1/Controllers/AccountAPIv1Controller.cs b/Teknik/Areas/API/V1/Controllers/AccountAPIv1Controller.cs index 22a5d42..47c3a7e 100644 --- a/Teknik/Areas/API/V1/Controllers/AccountAPIv1Controller.cs +++ b/Teknik/Areas/API/V1/Controllers/AccountAPIv1Controller.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Teknik.Configuration; using Teknik.Data; +using Teknik.Filters; using Teknik.Logging; namespace Teknik.Areas.API.V1.Controllers @@ -18,6 +19,7 @@ namespace Teknik.Areas.API.V1.Controllers public AccountAPIv1Controller(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [HttpGet] + [ServiceFilter(typeof(TrackPageView))] public IActionResult GetClaims() { return new JsonResult(from c in User.Claims select new { c.Type, c.Value }); diff --git a/Teknik/Areas/API/V1/Controllers/PasteAPIv1Controller.cs b/Teknik/Areas/API/V1/Controllers/PasteAPIv1Controller.cs index 98ae271..e008be2 100644 --- a/Teknik/Areas/API/V1/Controllers/PasteAPIv1Controller.cs +++ b/Teknik/Areas/API/V1/Controllers/PasteAPIv1Controller.cs @@ -12,6 +12,7 @@ using Teknik.Areas.Users.Models; using Teknik.Areas.Users.Utility; using Teknik.Configuration; using Teknik.Data; +using Teknik.Filters; using Teknik.Logging; using Teknik.Utilities; @@ -24,6 +25,7 @@ namespace Teknik.Areas.API.V1.Controllers [HttpPost] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Paste(PasteAPIv1Model model) { try diff --git a/Teknik/Areas/API/V1/Controllers/ShortenAPIv1Controller.cs b/Teknik/Areas/API/V1/Controllers/ShortenAPIv1Controller.cs index e19689e..e566855 100644 --- a/Teknik/Areas/API/V1/Controllers/ShortenAPIv1Controller.cs +++ b/Teknik/Areas/API/V1/Controllers/ShortenAPIv1Controller.cs @@ -13,6 +13,7 @@ using Teknik.Areas.Users.Models; using Teknik.Areas.Users.Utility; using Teknik.Configuration; using Teknik.Data; +using Teknik.Filters; using Teknik.Logging; using Teknik.Utilities; @@ -25,6 +26,7 @@ namespace Teknik.Areas.API.V1.Controllers [HttpPost] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Shorten(ShortenAPIv1Model model) { try diff --git a/Teknik/Areas/API/V1/Controllers/UploadAPIv1Controller.cs b/Teknik/Areas/API/V1/Controllers/UploadAPIv1Controller.cs index 0f59c62..908f7a0 100644 --- a/Teknik/Areas/API/V1/Controllers/UploadAPIv1Controller.cs +++ b/Teknik/Areas/API/V1/Controllers/UploadAPIv1Controller.cs @@ -17,6 +17,7 @@ using Teknik.Areas.Users.Models; using Teknik.Areas.Users.Utility; using Teknik.Configuration; using Teknik.Data; +using Teknik.Filters; using Teknik.Logging; using Teknik.Utilities; @@ -29,6 +30,7 @@ namespace Teknik.Areas.API.V1.Controllers [HttpPost] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task Upload(UploadAPIv1Model model) { try diff --git a/Teknik/Areas/About/Controllers/AboutController.cs b/Teknik/Areas/About/Controllers/AboutController.cs index aae20e8..633ccc4 100644 --- a/Teknik/Areas/About/Controllers/AboutController.cs +++ b/Teknik/Areas/About/Controllers/AboutController.cs @@ -22,6 +22,7 @@ namespace Teknik.Areas.About.Controllers public AboutController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index([FromServices] Config config) { ViewBag.Title = "About"; diff --git a/Teknik/Areas/Abuse/Controllers/AbuseController.cs b/Teknik/Areas/Abuse/Controllers/AbuseController.cs index 0a4cb6a..c1d927a 100644 --- a/Teknik/Areas/Abuse/Controllers/AbuseController.cs +++ b/Teknik/Areas/Abuse/Controllers/AbuseController.cs @@ -22,6 +22,7 @@ namespace Teknik.Areas.Abuse.Controllers public AbuseController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { ViewBag.Title = "Abuse Reporting"; diff --git a/Teknik/Areas/Admin/Controllers/AdminController.cs b/Teknik/Areas/Admin/Controllers/AdminController.cs index 0065e7d..2323b76 100644 --- a/Teknik/Areas/Admin/Controllers/AdminController.cs +++ b/Teknik/Areas/Admin/Controllers/AdminController.cs @@ -29,6 +29,7 @@ namespace Teknik.Areas.Admin.Controllers public AdminController(ILogger logger, Config config, TeknikEntities dbContext) : base (logger, config, dbContext) { } [HttpGet] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Dashboard() { DashboardViewModel model = new DashboardViewModel(); @@ -36,6 +37,7 @@ namespace Teknik.Areas.Admin.Controllers } [HttpGet] + [ServiceFilter(typeof(TrackPageView))] public IActionResult UserSearch() { UserSearchViewModel model = new UserSearchViewModel(); @@ -43,6 +45,7 @@ namespace Teknik.Areas.Admin.Controllers } [HttpGet] + [ServiceFilter(typeof(TrackPageView))] public async Task UserInfo(string username) { if (UserHelper.UserExists(_dbContext, username)) @@ -63,6 +66,7 @@ namespace Teknik.Areas.Admin.Controllers } [HttpGet] + [ServiceFilter(typeof(TrackPageView))] public IActionResult UploadSearch() { UploadSearchViewModel model = new UploadSearchViewModel(); diff --git a/Teknik/Areas/Blog/Controllers/BlogController.cs b/Teknik/Areas/Blog/Controllers/BlogController.cs index 46d8496..be44033 100644 --- a/Teknik/Areas/Blog/Controllers/BlogController.cs +++ b/Teknik/Areas/Blog/Controllers/BlogController.cs @@ -30,6 +30,7 @@ namespace Teknik.Areas.Blog.Controllers public BlogController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Blog(string username) { BlogViewModel model = new BlogViewModel(); @@ -119,6 +120,7 @@ namespace Teknik.Areas.Blog.Controllers #region Posts [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Post(string username, int id) { if (string.IsNullOrEmpty(username)) @@ -160,7 +162,8 @@ namespace Teknik.Areas.Blog.Controllers model.ErrorMessage = "Blog Post does not exist."; return View("~/Areas/Blog/Views/Blog/ViewPost.cshtml", model); } - + + [ServiceFilter(typeof(TrackPageView))] public IActionResult NewPost(string username, int blogID) { if (string.IsNullOrEmpty(username)) @@ -200,6 +203,7 @@ namespace Teknik.Areas.Blog.Controllers return View("~/Areas/Blog/Views/Blog/Blog.cshtml", model); } + [ServiceFilter(typeof(TrackPageView))] public IActionResult EditPost(string username, int id) { if (string.IsNullOrEmpty(username)) diff --git a/Teknik/Areas/Contact/Controllers/ContactController.cs b/Teknik/Areas/Contact/Controllers/ContactController.cs index 3d0d0a3..f33b887 100644 --- a/Teknik/Areas/Contact/Controllers/ContactController.cs +++ b/Teknik/Areas/Contact/Controllers/ContactController.cs @@ -26,6 +26,7 @@ namespace Teknik.Areas.Contact.Controllers public ContactController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { ViewBag.Title = "Contact Us"; diff --git a/Teknik/Areas/Error/Controllers/ErrorController.cs b/Teknik/Areas/Error/Controllers/ErrorController.cs index 72f56ac..587a098 100644 --- a/Teknik/Areas/Error/Controllers/ErrorController.cs +++ b/Teknik/Areas/Error/Controllers/ErrorController.cs @@ -28,6 +28,7 @@ namespace Teknik.Areas.Error.Controllers public ErrorController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult HttpError(int statusCode) { switch (statusCode) @@ -44,6 +45,7 @@ namespace Teknik.Areas.Error.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult HttpGeneral(int statusCode) { ViewBag.Title = statusCode; @@ -57,6 +59,7 @@ namespace Teknik.Areas.Error.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Http401() { Response.StatusCode = StatusCodes.Status401Unauthorized; @@ -73,6 +76,7 @@ namespace Teknik.Areas.Error.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Http403() { Response.StatusCode = StatusCodes.Status403Forbidden; @@ -89,6 +93,7 @@ namespace Teknik.Areas.Error.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Http404() { Response.StatusCode = StatusCodes.Status404NotFound; @@ -105,6 +110,7 @@ namespace Teknik.Areas.Error.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Http500(Exception exception) { try diff --git a/Teknik/Areas/FAQ/Controllers/FAQController.cs b/Teknik/Areas/FAQ/Controllers/FAQController.cs index 3cb3ae8..700f459 100644 --- a/Teknik/Areas/FAQ/Controllers/FAQController.cs +++ b/Teknik/Areas/FAQ/Controllers/FAQController.cs @@ -18,6 +18,7 @@ namespace Teknik.Areas.FAQ.Controllers public FAQController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { ViewBag.Title = "Frequently Asked Questions"; diff --git a/Teknik/Areas/Help/Controllers/HelpController.cs b/Teknik/Areas/Help/Controllers/HelpController.cs index 7709146..37a0ade 100644 --- a/Teknik/Areas/Help/Controllers/HelpController.cs +++ b/Teknik/Areas/Help/Controllers/HelpController.cs @@ -14,6 +14,7 @@ namespace Teknik.Areas.Help.Controllers { [Authorize] [Area("Help")] + [ServiceFilter(typeof(TrackPageView))] public class HelpController : DefaultController { public HelpController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } diff --git a/Teknik/Areas/Home/Controllers/HomeController.cs b/Teknik/Areas/Home/Controllers/HomeController.cs index 6c633f4..53d1030 100644 --- a/Teknik/Areas/Home/Controllers/HomeController.cs +++ b/Teknik/Areas/Home/Controllers/HomeController.cs @@ -23,6 +23,7 @@ namespace Teknik.Areas.Home.Controllers public HomeController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { HomeViewModel model = new HomeViewModel(); diff --git a/Teknik/Areas/Paste/Controllers/PasteController.cs b/Teknik/Areas/Paste/Controllers/PasteController.cs index 4d98b1e..95c381f 100644 --- a/Teknik/Areas/Paste/Controllers/PasteController.cs +++ b/Teknik/Areas/Paste/Controllers/PasteController.cs @@ -31,6 +31,7 @@ namespace Teknik.Areas.Paste.Controllers public PasteController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { ViewBag.Title = "Pastebin"; @@ -40,6 +41,7 @@ namespace Teknik.Areas.Paste.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task ViewPaste(string type, string url, string password) { Models.Paste paste = _dbContext.Pastes.Where(p => p.Url == url).FirstOrDefault(); @@ -202,7 +204,8 @@ namespace Teknik.Areas.Paste.Controllers } return View("~/Areas/Paste/Views/Paste/Index.cshtml", model); } - + + [ServiceFilter(typeof(TrackPageView))] public async Task Edit(string url, string password) { Models.Paste paste = _dbContext.Pastes.Where(p => p.Url == url).FirstOrDefault(); diff --git a/Teknik/Areas/Podcast/Controllers/PodcastController.cs b/Teknik/Areas/Podcast/Controllers/PodcastController.cs index 9037fb8..2410652 100644 --- a/Teknik/Areas/Podcast/Controllers/PodcastController.cs +++ b/Teknik/Areas/Podcast/Controllers/PodcastController.cs @@ -29,6 +29,7 @@ namespace Teknik.Areas.Podcast.Controllers public PodcastController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { MainViewModel model = new MainViewModel(); @@ -63,6 +64,7 @@ namespace Teknik.Areas.Podcast.Controllers #region Podcasts [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult View(int episode) { PodcastViewModel model = new PodcastViewModel(); @@ -84,6 +86,7 @@ namespace Teknik.Areas.Podcast.Controllers [HttpGet] [AllowAnonymous] [ResponseCache(Duration = 31536000, Location = ResponseCacheLocation.Any)] + [ServiceFilter(typeof(TrackDownload))] public IActionResult Download(int episode, string fileName) { string path = string.Empty; diff --git a/Teknik/Areas/Privacy/Controllers/PrivacyController.cs b/Teknik/Areas/Privacy/Controllers/PrivacyController.cs index 8e22fee..51e7c2b 100644 --- a/Teknik/Areas/Privacy/Controllers/PrivacyController.cs +++ b/Teknik/Areas/Privacy/Controllers/PrivacyController.cs @@ -18,6 +18,7 @@ namespace Teknik.Areas.Privacy.Controllers public PrivacyController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { ViewBag.Title = "Privacy Policy"; diff --git a/Teknik/Areas/RSS/Controllers/RSSController.cs b/Teknik/Areas/RSS/Controllers/RSSController.cs index 1fb2de8..a0e3b7d 100644 --- a/Teknik/Areas/RSS/Controllers/RSSController.cs +++ b/Teknik/Areas/RSS/Controllers/RSSController.cs @@ -32,6 +32,7 @@ namespace Teknik.Areas.RSS.Controllers public RSSController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task Index() { Response.ContentType = "application/rss+xml"; @@ -49,6 +50,7 @@ namespace Teknik.Areas.RSS.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task Blog(string username) { Response.ContentType = "application/rss+xml"; @@ -154,6 +156,7 @@ namespace Teknik.Areas.RSS.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task Podcast() { Response.ContentType = "application/rss+xml"; diff --git a/Teknik/Areas/Shortener/Controllers/ShortenerController.cs b/Teknik/Areas/Shortener/Controllers/ShortenerController.cs index 816a249..9ea3bad 100644 --- a/Teknik/Areas/Shortener/Controllers/ShortenerController.cs +++ b/Teknik/Areas/Shortener/Controllers/ShortenerController.cs @@ -24,6 +24,7 @@ namespace Teknik.Areas.Shortener.Controllers public ShortenerController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { ViewBag.Title = "Url Shortener"; @@ -32,6 +33,7 @@ namespace Teknik.Areas.Shortener.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult RedirectToUrl(string url) { ShortenedUrl shortUrl = _dbContext.ShortenedUrls.Where(s => s.ShortUrl == url).FirstOrDefault(); diff --git a/Teknik/Areas/Stats/Controllers/StatsController.cs b/Teknik/Areas/Stats/Controllers/StatsController.cs index 24ea056..656aaa3 100644 --- a/Teknik/Areas/Stats/Controllers/StatsController.cs +++ b/Teknik/Areas/Stats/Controllers/StatsController.cs @@ -24,6 +24,7 @@ namespace Teknik.Areas.Stats.Controllers public StatsController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { ViewBag.Title = "System Statistics"; diff --git a/Teknik/Areas/TOS/Controllers/TOSController.cs b/Teknik/Areas/TOS/Controllers/TOSController.cs index 7dafdee..068ea9e 100644 --- a/Teknik/Areas/TOS/Controllers/TOSController.cs +++ b/Teknik/Areas/TOS/Controllers/TOSController.cs @@ -18,6 +18,7 @@ namespace Teknik.Areas.TOS.Controllers public TOSController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Index() { ViewBag.Title = "Terms of Service"; diff --git a/Teknik/Areas/Upload/Controllers/UploadController.cs b/Teknik/Areas/Upload/Controllers/UploadController.cs index 4fd07cb..c1c2269 100644 --- a/Teknik/Areas/Upload/Controllers/UploadController.cs +++ b/Teknik/Areas/Upload/Controllers/UploadController.cs @@ -33,6 +33,7 @@ namespace Teknik.Areas.Upload.Controllers [HttpGet] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task Index() { ViewBag.Title = "Upload Files"; @@ -180,6 +181,8 @@ namespace Teknik.Areas.Upload.Controllers [HttpGet] [AllowAnonymous] + [ServiceFilter(typeof(TrackDownload))] + [ServiceFilter(typeof(TrackPageView))] [ResponseCache(Duration = 31536000, Location = ResponseCacheLocation.Any)] public async Task Download(string file) { diff --git a/Teknik/Areas/User/Controllers/UserController.cs b/Teknik/Areas/User/Controllers/UserController.cs index 8c9c951..3d40e10 100644 --- a/Teknik/Areas/User/Controllers/UserController.cs +++ b/Teknik/Areas/User/Controllers/UserController.cs @@ -62,6 +62,7 @@ namespace Teknik.Areas.Users.Controllers } [HttpGet] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Login(string returnUrl) { // Let's double check their email and git accounts to make sure they exist @@ -85,6 +86,7 @@ namespace Teknik.Areas.Users.Controllers } [HttpGet] + [ServiceFilter(typeof(TrackPageView))] public async Task Logout() { // these are the sub & sid to signout @@ -98,6 +100,7 @@ namespace Teknik.Areas.Users.Controllers } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult GetPremium() { ViewBag.Title = "Get a Premium Account"; @@ -109,6 +112,7 @@ namespace Teknik.Areas.Users.Controllers [HttpGet] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult Register(string inviteCode, string ReturnUrl) { RegisterViewModel model = new RegisterViewModel(); @@ -202,6 +206,7 @@ namespace Teknik.Areas.Users.Controllers // GET: Profile/Profile [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task ViewProfile(string username) { if (string.IsNullOrEmpty(username)) @@ -259,6 +264,7 @@ namespace Teknik.Areas.Users.Controllers return View(model); } + [ServiceFilter(typeof(TrackPageView))] public IActionResult ViewServiceData() { string username = User.Identity.Name; @@ -297,11 +303,13 @@ namespace Teknik.Areas.Users.Controllers return View(model); } + [ServiceFilter(typeof(TrackPageView))] public IActionResult Settings() { return Redirect(Url.SubRouteUrl("account", "User.ProfileSettings")); } - + + [ServiceFilter(typeof(TrackPageView))] public IActionResult ProfileSettings() { string username = User.Identity.Name; @@ -326,6 +334,7 @@ namespace Teknik.Areas.Users.Controllers return new StatusCodeResult(StatusCodes.Status403Forbidden); } + [ServiceFilter(typeof(TrackPageView))] public IActionResult AccountSettings() { string username = User.Identity.Name; @@ -347,6 +356,7 @@ namespace Teknik.Areas.Users.Controllers return new StatusCodeResult(StatusCodes.Status403Forbidden); } + [ServiceFilter(typeof(TrackPageView))] public async Task SecuritySettings() { string username = User.Identity.Name; @@ -389,6 +399,7 @@ namespace Teknik.Areas.Users.Controllers return new StatusCodeResult(StatusCodes.Status403Forbidden); } + [ServiceFilter(typeof(TrackPageView))] public async Task DeveloperSettings() { string username = User.Identity.Name; @@ -436,6 +447,7 @@ namespace Teknik.Areas.Users.Controllers return new StatusCodeResult(StatusCodes.Status403Forbidden); } + [ServiceFilter(typeof(TrackPageView))] public IActionResult InviteSettings() { string username = User.Identity.Name; @@ -480,7 +492,8 @@ namespace Teknik.Areas.Users.Controllers return new StatusCodeResult(StatusCodes.Status403Forbidden); } - + + [ServiceFilter(typeof(TrackPageView))] public IActionResult BlogSettings() { string username = User.Identity.Name; @@ -503,7 +516,8 @@ namespace Teknik.Areas.Users.Controllers return new StatusCodeResult(StatusCodes.Status403Forbidden); } - + + [ServiceFilter(typeof(TrackPageView))] public IActionResult UploadSettings() { string username = User.Identity.Name; @@ -530,6 +544,7 @@ namespace Teknik.Areas.Users.Controllers [HttpGet] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task ViewRawPGP(string username) { ViewBag.Title = username + "'s Public Key"; @@ -824,6 +839,7 @@ namespace Teknik.Areas.Users.Controllers [HttpGet] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult ResetPassword(string username) { ResetPasswordViewModel model = new ResetPasswordViewModel(); @@ -867,6 +883,7 @@ namespace Teknik.Areas.Users.Controllers [HttpGet] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task VerifyResetPassword(string username, string code) { bool verified = true; diff --git a/Teknik/Areas/Vault/Controllers/VaultController.cs b/Teknik/Areas/Vault/Controllers/VaultController.cs index f8f733a..2c81143 100644 --- a/Teknik/Areas/Vault/Controllers/VaultController.cs +++ b/Teknik/Areas/Vault/Controllers/VaultController.cs @@ -34,6 +34,7 @@ namespace Teknik.Areas.Vault.Controllers public VaultController(ILogger logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public async Task ViewVault(string id) { Models.Vault foundVault = _dbContext.Vaults.Where(v => v.Url == id).FirstOrDefault(); @@ -135,6 +136,7 @@ namespace Teknik.Areas.Vault.Controllers [HttpGet] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult NewVault() { ViewBag.Title = "Create Vault"; @@ -145,6 +147,7 @@ namespace Teknik.Areas.Vault.Controllers [HttpGet] [AllowAnonymous] + [ServiceFilter(typeof(TrackPageView))] public IActionResult NewVaultFromService(string type, string items) { ViewBag.Title = "Create Vault"; @@ -181,6 +184,7 @@ namespace Teknik.Areas.Vault.Controllers } [HttpGet] + [ServiceFilter(typeof(TrackPageView))] public IActionResult EditVault(string url, string type, string items) { ViewBag.Title = "Edit Vault"; diff --git a/Teknik/Controllers/DefaultController.cs b/Teknik/Controllers/DefaultController.cs index 8052f7e..9423c29 100644 --- a/Teknik/Controllers/DefaultController.cs +++ b/Teknik/Controllers/DefaultController.cs @@ -24,8 +24,9 @@ using Teknik.Utilities; namespace Teknik.Controllers { - [CORSActionFilter] [Area("Default")] + [CORSActionFilter] + [ResponseCache(Duration = 3600, Location = ResponseCacheLocation.Any)] public class DefaultController : Controller { protected string Subdomain diff --git a/Teknik/Startup.cs b/Teknik/Startup.cs index bafc878..02be972 100644 --- a/Teknik/Startup.cs +++ b/Teknik/Startup.cs @@ -97,9 +97,9 @@ namespace Teknik }); // Add Tracking Filter scopes - //services.AddScoped(); + services.AddScoped(); //services.AddScoped(); - //services.AddScoped(); + services.AddScoped(); // Create the Database Context services.AddDbContext(options => options diff --git a/Tracking/Tracking.csproj b/Tracking/Tracking.csproj index ceec358..0513e9a 100644 --- a/Tracking/Tracking.csproj +++ b/Tracking/Tracking.csproj @@ -7,13 +7,17 @@ win-x86;win-x64;linux-x64;linux-arm;osx-x64 + + + + - - lib\Piwik.Tracker.NetStandard1.4.dll + + lib\Piwik.Tracker.dll diff --git a/Tracking/lib/Piwik.Tracker.dll b/Tracking/lib/Piwik.Tracker.dll new file mode 100644 index 0000000000000000000000000000000000000000..61ed1bcb4f93d0e2fa584cf2f23e04df3c2fc2bf GIT binary patch literal 29184 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 MU;cj={@Wh-zj`M``2YX_ literal 0 HcmV?d00001