├── .gitattributes ├── .gitignore ├── .hgignore ├── .hgtags ├── Deploy_To_Git.ps1 ├── License.txt ├── README.md ├── build.bat ├── build ├── FunnelWebExtensibility.nuspec ├── build.proj └── lib │ ├── ICSharpCode.SharpZipLib.dll │ ├── MSBuild.Community.Tasks.Targets │ ├── MSBuild.Community.Tasks.dll │ ├── MSBuild.Community.Tasks.xml │ ├── MSBuild.Community.Tasks.xsd │ ├── MSBuild.Deployment.Tasks.Targets │ ├── MSBuild.Deployment.Tasks.XML │ ├── MSBuild.Deployment.Tasks.dll │ ├── MSBuild.Deployment.Tasks.xsd │ ├── MSBuild.Mercurial.dll │ ├── MSBuild.Mercurial.tasks │ └── NUnitReport.xsl ├── docs ├── Breaking Changes.md ├── Change Log.md ├── Requirements.md └── Setup Instructions.md ├── lib ├── Akismet │ └── Joel.Net.Akismet.dll ├── Cassini │ ├── WebDev.WebHost40.dll │ ├── WebDev.WebServer40.EXE │ ├── WebDev.WebServer40.exe.config │ └── WebDev.WebServer40.exe.manifest ├── NUnit │ ├── Exe │ │ ├── NUnitFitTests.html │ │ ├── NUnitTests.config │ │ ├── NUnitTests.nunit │ │ ├── agent.conf │ │ ├── agent.log.conf │ │ ├── framework │ │ │ ├── nunit.framework.dll │ │ │ ├── nunit.framework.xml │ │ │ ├── nunit.mocks.dll │ │ │ └── pnunit.framework.dll │ │ ├── launcher.log.conf │ │ ├── lib │ │ │ ├── Failure.png │ │ │ ├── Ignored.png │ │ │ ├── Inconclusive.png │ │ │ ├── Skipped.png │ │ │ ├── Success.png │ │ │ ├── fit.dll │ │ │ ├── log4net.dll │ │ │ ├── nunit-console-runner.dll │ │ │ ├── nunit-gui-runner.dll │ │ │ ├── nunit.core.dll │ │ │ ├── nunit.core.interfaces.dll │ │ │ ├── nunit.fixtures.dll │ │ │ ├── nunit.uiexception.dll │ │ │ ├── nunit.uikit.dll │ │ │ └── nunit.util.dll │ │ ├── nunit-agent-x86.exe │ │ ├── nunit-agent-x86.exe.config │ │ ├── nunit-agent.exe │ │ ├── nunit-agent.exe.config │ │ ├── nunit-console-x86.exe │ │ ├── nunit-console-x86.exe.config │ │ ├── nunit-console.exe │ │ ├── nunit-console.exe.config │ │ ├── nunit-x86.exe │ │ ├── nunit-x86.exe.config │ │ ├── nunit.exe │ │ ├── nunit.exe.config │ │ ├── nunit.framework.dll │ │ ├── pnunit-agent.exe │ │ ├── pnunit-agent.exe.config │ │ ├── pnunit-launcher.exe │ │ ├── pnunit-launcher.exe.config │ │ ├── pnunit.framework.dll │ │ ├── pnunit.tests.dll │ │ ├── runFile.exe │ │ ├── runFile.exe.config │ │ ├── runpnunit.bat │ │ ├── test.conf │ │ └── tests │ │ │ ├── loadtest-assembly.dll │ │ │ ├── mock-assembly.dll │ │ │ ├── nonamespace-assembly.dll │ │ │ ├── nunit-console.tests.dll │ │ │ ├── nunit-gui.tests.dll │ │ │ ├── nunit.core.tests.dll │ │ │ ├── nunit.fixtures.tests.dll │ │ │ ├── nunit.framework.dll │ │ │ ├── nunit.framework.tests.dll │ │ │ ├── nunit.mocks.tests.dll │ │ │ ├── nunit.uiexception.tests.dll │ │ │ ├── nunit.uikit.tests.dll │ │ │ ├── nunit.util.tests.dll │ │ │ ├── test-assembly.dll │ │ │ ├── test-utilities.dll │ │ │ └── timing-tests.dll │ ├── nunit.framework.dll │ └── nunit.framework.xml ├── RouteDebug-Binary │ └── RouteDebug.dll └── Watin │ ├── Interop.SHDocVw.dll │ ├── Microsoft.mshtml.dll │ ├── WatiN.Core.UnitTests.dll │ ├── WatiN.Core.UnitTests.dll.config │ ├── WatiN.Core.dll │ └── WatiN.Core.xml └── src ├── .nuget ├── NuGet.Config ├── NuGet.exe ├── NuGet.targets └── packages.config ├── FunnelWeb.Extensions.CommentNotification ├── CommentPostedListener.cs ├── Extension.cs ├── FunnelWeb.Extensions.CommentNotification.csproj ├── FunnelWeb.Extensions.CommentNotification.ncrunchproject ├── Properties │ └── AssemblyInfo.cs └── packages.config ├── FunnelWeb.Tests ├── App.config ├── Core │ ├── Filters │ │ └── FunnelWebRequestFilterTests.cs │ ├── Repositories │ │ └── FileRepositoryTests.cs │ └── Utilities │ │ └── HttpRequestExtensionsTest.cs ├── DatabaseDeployer │ ├── DatabaseModuleTests.cs │ ├── DatabaseUpgradeDetectorTests.cs │ └── FunnelWebScriptProviderTests.cs ├── FunnelWeb.Tests.VisualState.xml ├── FunnelWeb.Tests.csproj ├── FunnelWeb.Tests.ncrunchproject ├── FunnelWeb.Tests.nunit ├── Helpers │ ├── ITemporaryDatabase.cs │ ├── QueryIntegrationTest.cs │ ├── Requires.cs │ ├── RouteExtensions.cs │ ├── Specification.cs │ ├── SqlCeIntegrationTest.cs │ ├── SqlCeTemporaryDatabase.cs │ └── ThenAttribute.cs ├── Integration │ ├── CanDeployDatabase.cs │ ├── Queries │ │ ├── EntryByNameAndRevisionQueryLoadsSpecifiedRevisionAsLatest.cs │ │ ├── EntryByNameAndRevisionQueryMatchesEntryByName.cs │ │ ├── EntryByNameQueryMatchesEntryByName.cs │ │ ├── EntryByNameQueryMatchesEntryByNameThatHasComments.cs │ │ ├── GetCommentsQueryReturnsComments.cs │ │ ├── GetEntriesQueryByTagReturnsEntryWithWithRequestedTagOnly.cs │ │ ├── GetEntriesQueryCanReturnAllStatuses.cs │ │ ├── GetEntriesQueryDoesNotReturnPrivate.cs │ │ ├── GetEntriesQueryReturnsEntry.cs │ │ ├── GetEntriesQueryReturnsEntryWithTags.cs │ │ ├── GetFullEntriesQueryReturnsEntriesWithComments.cs │ │ ├── SearchEntriesQueryDoesNotReturnPrivate.cs │ │ ├── SearchEntriesQueryTests.cs │ │ └── SearchTagsByNameQueryReturnsTag.cs │ └── UpdateCommentCountTest.cs ├── LifetimeJustifications.cs ├── Properties │ └── AssemblyInfo.cs ├── TestResult.xml ├── Web │ ├── Application │ │ ├── ActionResults │ │ │ └── XmlActionResultTests.cs │ │ ├── Binders │ │ │ ├── ArrayBinderTests.cs │ │ │ └── ImplicitAssignmentBinderTests.cs │ │ ├── Extensions │ │ │ ├── HtmlHelperBuilder.cs │ │ │ └── MarkupExtensionsTests.cs │ │ ├── Markup │ │ │ └── MarkdownTests.cs │ │ └── Mime │ │ │ └── RegistryMimeTypeLookupTests.cs │ ├── Areas │ │ └── Admin │ │ │ └── Controllers │ │ │ ├── AdminControllerTests.cs │ │ │ ├── UploadControllerTests.cs │ │ │ └── WikiAdminControllerTests.cs │ ├── Controllers │ │ ├── ControllerTests.cs │ │ ├── FeedControllerTests.cs │ │ ├── TagControllerTests.cs │ │ └── WikiControllerTests.cs │ ├── Model │ │ ├── Repositories │ │ │ └── FileRepositoryTests.cs │ │ └── Strings │ │ │ └── PageNameTests.cs │ └── RoutingTests.cs └── packages.config ├── FunnelWeb.Wcf ├── AutofacConfigurableServiceHostFactory.cs ├── FunnelWeb.Wcf.csproj └── Properties │ └── AssemblyInfo.cs ├── FunnelWeb.Web ├── App_Start │ ├── BundleConfig.cs │ ├── FilterConfig.cs │ └── RouteConfig.cs ├── Application │ ├── Authentication │ │ ├── AuthenticationModule.cs │ │ └── FunnelWebRoleProvider.cs │ ├── CacheStaticFilesHttpModule.cs │ ├── Extensibility.cs │ ├── Extensions │ │ ├── MarkupExtensions.cs │ │ ├── MobileExtensions.cs │ │ ├── ViewDataDictionaryExtensions.cs │ │ └── WebViewPageExtensions.cs │ ├── ForceLowercaseUrlHttpModule.cs │ ├── Markup │ │ ├── ContentRenderer.cs │ │ ├── HtmlFormatter.cs │ │ ├── IContentEnricher.cs │ │ ├── IContentFormatter.cs │ │ ├── IContentRenderer.cs │ │ ├── InputSanitizer.cs │ │ ├── MacroEnricher.cs │ │ ├── Macros │ │ │ ├── IMacroExecutor.cs │ │ │ ├── MacroView.cs │ │ │ └── RazorMacroExecutor.cs │ │ ├── MarkdownFormatter.cs │ │ ├── MarkdownNetByBrianJeremy.cs │ │ └── MarkupModule.cs │ ├── MetaWeblog │ │ ├── IMetaWeblog.cs │ │ ├── MetaWeblog.cs │ │ ├── MetaWeblogRouteHandler.cs │ │ ├── MetaWeblogSettings.cs │ │ ├── Structs.cs │ │ └── wlwmanifest.xml │ ├── Mime │ │ ├── MimeSupportModule.cs │ │ └── RegistryMimeTypeLookup.cs │ ├── Mvc │ │ ├── ActionResults │ │ │ ├── FeedResult.cs │ │ │ ├── PageTemplateActionResult.cs │ │ │ └── XmlActionResult.cs │ │ ├── Binders │ │ │ ├── ArrayBinder.cs │ │ │ ├── BindersModule.cs │ │ │ ├── EntryRevisionBinder.cs │ │ │ ├── ImplicitAssignmentBinder.cs │ │ │ └── UploadBinder.cs │ │ ├── FileUpload.cs │ │ ├── FunnelWebControllerFactory.cs │ │ ├── FunnelWebViewEngine.cs │ │ ├── HtmlHelperExtensions.cs │ │ ├── HyphenatedRouteHandler.cs │ │ ├── LowercaseRoute.cs │ │ ├── MvcExtensions.cs │ │ ├── NotFromValuesListConstraint.cs │ │ ├── RedirectRoute.cs │ │ ├── RegexRoutes.cs │ │ ├── RouteCollectionExtension.cs │ │ ├── UrlHelperExtension.cs │ │ ├── ValidUrlAttribute.cs │ │ ├── ViewBundleRegistrar.cs │ │ └── WebAbstractionsModule.cs │ ├── Pingbacks │ │ ├── PingbackHandler.cs │ │ ├── XmlRpcFaultException.cs │ │ └── XmlRpcHandler.cs │ ├── RequireUpdatedDatabaseHttpModule.cs │ ├── RequireUpgradeFilter.cs │ ├── Spam │ │ ├── AkismetSpamChecker.cs │ │ ├── ISpamChecker.cs │ │ └── SpamModule.cs │ └── Themes │ │ ├── IThemeProvider.cs │ │ ├── ThemeProvider.cs │ │ └── ThemesModule.cs ├── Areas │ └── Admin │ │ ├── AdminAreaRegistration.cs │ │ ├── BundleConfig.cs │ │ ├── Controllers │ │ ├── AdminController.cs │ │ ├── InstallController.cs │ │ ├── LoginController.cs │ │ ├── SqlAuthenticationController.cs │ │ ├── UploadController.cs │ │ └── WikiAdminController.cs │ │ ├── RouteConfig.cs │ │ ├── Scripts │ │ └── Views │ │ │ └── WikiAdmin │ │ │ └── Edit.js │ │ └── Views │ │ ├── Admin │ │ ├── BlogMLImport.cshtml │ │ ├── BlogMLImportModel.cs │ │ ├── Comments.cshtml │ │ ├── CommentsModel.cs │ │ ├── Index.cshtml │ │ ├── IndexModel.cs │ │ ├── PageList.cshtml │ │ ├── PageListModel.cs │ │ ├── Pingbacks.cshtml │ │ ├── PingbacksModel.cs │ │ ├── Settings.cshtml │ │ ├── Task.cshtml │ │ ├── TaskModel.cs │ │ ├── Tasks.cshtml │ │ └── TasksModel.cs │ │ ├── Install │ │ ├── ExtensionVersion.cs │ │ ├── Index.cshtml │ │ ├── IndexModel.cs │ │ ├── UpgradeModel.cs │ │ └── UpgradeReport.cshtml │ │ ├── Login │ │ ├── Login.cshtml │ │ └── LoginModel.cs │ │ ├── Shared │ │ └── _Private.cshtml │ │ ├── SqlAuthentication │ │ ├── AddRole.cshtml │ │ ├── AddRoleModel.cs │ │ ├── Index.cshtml │ │ ├── IndexModel.cs │ │ ├── NewAccount.cshtml │ │ ├── NewUser.cs │ │ ├── Setup.cshtml │ │ └── SetupModel.cs │ │ ├── Upload │ │ ├── Index.cshtml │ │ └── IndexModel.cs │ │ ├── Web.config │ │ ├── WikiAdmin │ │ └── Edit.cshtml │ │ └── _ViewStart.cshtml ├── Content │ ├── Images │ │ ├── Busy.gif │ │ ├── FileTypes │ │ │ ├── Document.png │ │ │ ├── Installer.png │ │ │ ├── Link.png │ │ │ ├── Zip.png │ │ │ ├── bmp.png │ │ │ ├── cs.png │ │ │ ├── csproj.png │ │ │ ├── default.png │ │ │ ├── dir.png │ │ │ ├── doc.png │ │ │ ├── docx.png │ │ │ ├── gif.png │ │ │ ├── jpg.png │ │ │ ├── png.png │ │ │ ├── pps.png │ │ │ ├── ppsx.png │ │ │ ├── ppt.png │ │ │ ├── pptx.png │ │ │ ├── rar.png │ │ │ ├── sln.png │ │ │ ├── tar.png │ │ │ ├── xls.png │ │ │ └── xlsx.png │ │ ├── PaulStovell.png │ │ ├── editorbuttons.png │ │ ├── external.png │ │ ├── fail.png │ │ ├── success.png │ │ ├── title.png │ │ └── transparent.gif │ ├── Prettify │ │ ├── Themes │ │ │ ├── desert.css │ │ │ ├── sons-of-obsidian.css │ │ │ └── sunburst.css │ │ └── prettify.css │ ├── Resources │ │ ├── Humans.txt │ │ ├── Robots.txt │ │ ├── Status.html │ │ ├── favicon.ico │ │ └── favicon.png │ └── themes │ │ └── base │ │ ├── Admin.css │ │ ├── Base.css │ │ ├── Mobile.css │ │ ├── TagEditor.css │ │ ├── images │ │ ├── del_sprite_tagComplete.png │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_2e83ff_256x240.png │ │ ├── ui-icons_454545_256x240.png │ │ ├── ui-icons_888888_256x240.png │ │ └── ui-icons_cd0a0a_256x240.png │ │ ├── jquery-ui.css │ │ ├── jquery.ui.accordion.css │ │ ├── jquery.ui.all.css │ │ ├── jquery.ui.autocomplete.css │ │ ├── jquery.ui.base.css │ │ ├── jquery.ui.button.css │ │ ├── jquery.ui.core.css │ │ ├── jquery.ui.datepicker.css │ │ ├── jquery.ui.dialog.css │ │ ├── jquery.ui.menu.css │ │ ├── jquery.ui.progressbar.css │ │ ├── jquery.ui.resizable.css │ │ ├── jquery.ui.selectable.css │ │ ├── jquery.ui.slider.css │ │ ├── jquery.ui.spinner.css │ │ ├── jquery.ui.tabs.css │ │ ├── jquery.ui.theme.css │ │ ├── jquery.ui.tooltip.css │ │ └── minified │ │ ├── images │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_2e83ff_256x240.png │ │ ├── ui-icons_454545_256x240.png │ │ ├── ui-icons_888888_256x240.png │ │ └── ui-icons_cd0a0a_256x240.png │ │ ├── jquery-ui.min.css │ │ ├── jquery.ui.accordion.min.css │ │ ├── jquery.ui.autocomplete.min.css │ │ ├── jquery.ui.button.min.css │ │ ├── jquery.ui.core.min.css │ │ ├── jquery.ui.datepicker.min.css │ │ ├── jquery.ui.dialog.min.css │ │ ├── jquery.ui.menu.min.css │ │ ├── jquery.ui.progressbar.min.css │ │ ├── jquery.ui.resizable.min.css │ │ ├── jquery.ui.selectable.min.css │ │ ├── jquery.ui.slider.min.css │ │ ├── jquery.ui.spinner.min.css │ │ ├── jquery.ui.tabs.min.css │ │ ├── jquery.ui.theme.min.css │ │ └── jquery.ui.tooltip.min.css ├── Controllers │ ├── FeedController.cs │ ├── MetaWeblogController.cs │ ├── ResourceController.cs │ ├── TagController.cs │ ├── TaggedController.cs │ └── WikiController.cs ├── FunnelWeb.Web.csproj ├── Global.asax ├── Global.asax.cs ├── Macros │ └── TwitterStream.cshtml ├── Models │ └── Paginator.cs ├── My.config ├── Properties │ └── AssemblyInfo.cs ├── Scripts │ ├── Prettify │ │ ├── lang-apollo.js │ │ ├── lang-clj.js │ │ ├── lang-css.js │ │ ├── lang-go.js │ │ ├── lang-hs.js │ │ ├── lang-lisp.js │ │ ├── lang-lua.js │ │ ├── lang-ml.js │ │ ├── lang-n.js │ │ ├── lang-proto.js │ │ ├── lang-scala.js │ │ ├── lang-sql.js │ │ ├── lang-tex.js │ │ ├── lang-vb.js │ │ ├── lang-vhdl.js │ │ ├── lang-wiki.js │ │ ├── lang-xq.js │ │ ├── lang-yaml.js │ │ └── prettify.js │ ├── disqus-count.js │ ├── jquery-1.8.2.intellisense.js │ ├── jquery-1.8.2.js │ ├── jquery-1.8.2.min.js │ ├── jquery-ui-1.9.0.js │ ├── jquery-ui-1.9.0.min.js │ ├── jquery.validate-vsdoc.js │ ├── jquery.validate.js │ ├── jquery.validate.min.js │ ├── jsdate.js │ ├── showdown.js │ ├── showdown.min.js │ ├── site.js │ ├── taggy.js │ └── wmd.js ├── Themes │ ├── AaronPowell │ │ └── Content │ │ │ └── Styles │ │ │ └── Theme.css │ ├── Clean │ │ └── Content │ │ │ └── Styles │ │ │ └── Theme.css │ ├── Default │ │ └── Content │ │ │ └── Styles │ │ │ └── Theme.css │ ├── Evolve │ │ └── Content │ │ │ ├── Images │ │ │ └── background.png │ │ │ └── Styles │ │ │ └── Theme.css │ ├── MattHamilton │ │ └── Content │ │ │ └── Styles │ │ │ ├── Theme.css │ │ │ └── Title.png │ ├── Official │ │ └── Content │ │ │ ├── Images │ │ │ └── header.png │ │ │ └── Styles │ │ │ └── Theme.css │ ├── Pastel │ │ └── Content │ │ │ └── Styles │ │ │ ├── Bar.png │ │ │ └── Theme.css │ ├── RainbowAfro │ │ └── Content │ │ │ └── Styles │ │ │ ├── Bar.png │ │ │ ├── Header.jpg │ │ │ └── Theme.css │ └── Twitter │ │ └── Content │ │ └── Styles │ │ ├── Background.png │ │ ├── Bar.png │ │ └── Theme.css ├── Views │ ├── Shared │ │ ├── DisplayTemplates │ │ │ ├── Comment.cshtml │ │ │ ├── Comments.cshtml │ │ │ ├── EntrySummaries.cshtml │ │ │ ├── EntrySummary.cshtml │ │ │ ├── FacebookLike.cshtml │ │ │ ├── Paginator.cshtml │ │ │ ├── Pingbacks.cshtml │ │ │ ├── PublishedDate.cshtml │ │ │ └── TagsList.cshtml │ │ ├── EditorTemplates │ │ │ ├── Markdown.cshtml │ │ │ └── Tags.cshtml │ │ ├── PageTemplates │ │ │ └── Default.cshtml │ │ ├── _Disqus.cshtml │ │ ├── _EditComments.cshtml │ │ ├── _EntryTools.cshtml │ │ ├── _Mobile.cshtml │ │ ├── _PrivateEntryNotification.cshtml │ │ └── _Public.cshtml │ ├── Tagged │ │ └── Index.cshtml │ ├── Web.config │ ├── Wiki │ │ ├── Page.cshtml │ │ ├── PageModel.cs │ │ ├── Pingbacks.cshtml │ │ ├── Recent.cshtml │ │ ├── RecentModel.cs │ │ ├── Revisions.cshtml │ │ ├── RevisionsModel.cs │ │ ├── Search.cshtml │ │ ├── SearchModel.cs │ │ ├── SiteMap.cshtml │ │ └── SiteMapModel.cs │ └── _ViewStart.cshtml ├── Web.Debug.config ├── Web.Release.config ├── Web.config ├── _bin_deployableAssemblies │ ├── amd64 │ │ ├── Microsoft.VC90.CRT │ │ │ ├── Microsoft.VC90.CRT.manifest │ │ │ ├── README_ENU.txt │ │ │ └── msvcr90.dll │ │ ├── sqlceca40.dll │ │ ├── sqlcecompact40.dll │ │ ├── sqlceer40EN.dll │ │ ├── sqlceme40.dll │ │ ├── sqlceqp40.dll │ │ └── sqlcese40.dll │ └── x86 │ │ ├── Microsoft.VC90.CRT │ │ ├── Microsoft.VC90.CRT.manifest │ │ ├── README_ENU.txt │ │ └── msvcr90.dll │ │ ├── sqlceca40.dll │ │ ├── sqlcecompact40.dll │ │ ├── sqlceer40EN.dll │ │ ├── sqlceme40.dll │ │ ├── sqlceqp40.dll │ │ └── sqlcese40.dll └── packages.config ├── FunnelWeb.ncrunchsolution ├── FunnelWeb.sln ├── FunnelWeb.sln.DotSettings ├── FunnelWeb ├── Authentication │ ├── IAuthenticator.cs │ ├── IFunnelWebMembership.cs │ ├── IRoleProvider.cs │ └── Internal │ │ ├── FormsAuthenticator.cs │ │ ├── FormsFunnelWebMembership.cs │ │ ├── FormsRoleProvider.cs │ │ ├── SqlAuthenticator.cs │ │ ├── SqlFunnelWebMembership.cs │ │ └── SqlRoleProvider.cs ├── DatabaseDeployer │ ├── ApplicationDatabase.cs │ ├── DatabaseModule.cs │ ├── DatabaseUpgradeDetector.cs │ ├── FunnelWebScriptProvider.cs │ ├── IApplicationDatabase.cs │ ├── IConnectionStringSettings.cs │ ├── IDatabaseUpgradeDetector.cs │ ├── Infrastructure │ │ ├── FunnelWebJournal.cs │ │ └── FunnelWebNHibernateExtensions.cs │ ├── ScriptedExtension.cs │ └── Scripts │ │ ├── Script0001.sql │ │ ├── Script0001_sqlce.sql │ │ ├── Script0002.sql │ │ ├── Script0003.sql │ │ ├── Script0004.sql │ │ ├── Script0005.sql │ │ ├── Script0006.sql │ │ ├── Script0007.sql │ │ ├── Script0008.sql │ │ ├── Script0008_sqlce.sql │ │ ├── Script0009.sql │ │ ├── Script0010.sql │ │ ├── Script0010_sqlce.sql │ │ ├── Script0011.sql │ │ ├── Script0012.sql │ │ ├── Script0013.sql │ │ ├── Script0014.sql │ │ ├── Script0015.sql │ │ ├── Script0016.sql │ │ ├── Script0016_sqlce.sql │ │ ├── Script0017.sql │ │ ├── Script0018.sql │ │ ├── Script0019.sql │ │ ├── Script0020.sql │ │ ├── Script0020_sqlce.sql │ │ ├── Script0021.sql │ │ ├── Script0021_sqlce.sql │ │ ├── Script0022.sql │ │ ├── Script0022_sqlce.sql │ │ ├── Script0023.sql │ │ ├── Script0023_sqlce.sql │ │ ├── Script0024.sql │ │ ├── Script0024_sqlce.sql │ │ ├── Script0025.sql │ │ ├── Script0025_sqlce.sql │ │ ├── Script0026.sql │ │ ├── Script0026_sqlce.sql │ │ ├── Script0027.sql │ │ ├── Script0027_sqlce.sql │ │ ├── Script0028.sql │ │ ├── Script0029.sql │ │ ├── Script0030.sql │ │ ├── Script0031.sql │ │ └── Script0032.sql ├── Eventing │ ├── EventingModule.cs │ └── INotifier.cs ├── ExtensionsModule.cs ├── Filters │ └── FunnelWebRequestAttribute.cs ├── FunnelWeb.csproj ├── FunnelWeb.ncrunchproject ├── FunnelWebExtensionAttribute.cs ├── FunnelWebExtensionLoadException.asax.cs ├── IFunnelWebExtension.cs ├── IFunnelWebExtensionMetaData.cs ├── IRequireDatabaseScripts.cs ├── Model │ ├── Authentication │ │ ├── Mappings │ │ │ ├── RoleMapping.cs │ │ │ └── UserMapping.cs │ │ ├── Role.cs │ │ └── User.cs │ ├── Comment.cs │ ├── Entry.cs │ ├── EntryRevision.cs │ ├── EntryStatus.cs │ ├── EntrySummary.cs │ ├── FileItem.cs │ ├── Formats.cs │ ├── Mappings │ │ ├── CommentMapping.cs │ │ ├── EntryMapping.cs │ │ ├── PingbackMapping.cs │ │ ├── RedirectMapping.cs │ │ ├── RevisionFilter.cs │ │ ├── RevisionMapping.cs │ │ ├── SettingMapping.cs │ │ ├── TagMapping.cs │ │ ├── TaskStateMapping.cs │ │ └── UserTypes │ │ │ └── PageNameUserType.cs │ ├── Pingback.cs │ ├── Redirect.cs │ ├── Repositories │ │ ├── IAdminRepository.cs │ │ ├── ITaskStateRepository.cs │ │ ├── Internal │ │ │ ├── AdminRepository.cs │ │ │ └── TaskStateRepository.cs │ │ └── RepositoriesModule.cs │ ├── Revision.cs │ ├── Setting.cs │ ├── Strings │ │ ├── EnforcedString.cs │ │ ├── EnforcedStringLengthAttribute.cs │ │ └── PageName.cs │ ├── Tag.cs │ ├── TaskState.cs │ └── TaskStatus.cs ├── Mvc │ ├── HintSize.cs │ └── HintSizeAttribute.cs ├── Properties │ └── AssemblyInfo.cs ├── Providers │ ├── Database │ │ ├── IDatabaseProvider.cs │ │ ├── Sql │ │ │ ├── ProfiledClientBatchingBatcherFactory.cs │ │ │ ├── ProfiledSqlClientBatchingBatcher.cs │ │ │ ├── ProfiledSqlClientBatchingBatcherFactory.cs │ │ │ ├── ProfiledSqlClientDriver.cs │ │ │ ├── ProfiledSqlDbCommand.cs │ │ │ ├── ProfiledSqlDbConnection.cs │ │ │ └── ProfiledSqlDbTransaction.cs │ │ ├── SqlCe │ │ │ ├── FunnelWebCe40Dialect.cs │ │ │ └── FunnelWebSqlServerCeDriver.cs │ │ ├── SqlCeDatabaseProvider.cs │ │ └── SqlDatabaseProvider.cs │ ├── File │ │ ├── AzureBlobFileRepository.cs │ │ ├── FileRepository.cs │ │ ├── FileRepositoryBase.cs │ │ └── IFileRepository.cs │ ├── IProviderInfo.cs │ ├── InternalProviderRegistrationModule.cs │ ├── ProviderInfo.cs │ └── ProviderMetaData.cs ├── Repositories │ ├── Alias.cs │ ├── EntriesSortColumn.cs │ ├── Filters.cs │ ├── ICommand.cs │ ├── IPagedQuery.cs │ ├── IQuery.cs │ ├── IRepository.cs │ ├── NHibernateRepository.cs │ ├── PagedResult.cs │ ├── Projections │ │ ├── EntryRevisionProjections.cs │ │ └── EntrySummaryProjections.cs │ └── Queries │ │ ├── EntryByNameAndRevisionQuery.cs │ │ ├── EntryByNameQuery.cs │ │ ├── FullTextSearchEntriesQuery.cs │ │ ├── GetAllCommentsQuery.cs │ │ ├── GetCommentsQuery.cs │ │ ├── GetEntriesByTagQuery.cs │ │ ├── GetEntriesQuery.cs │ │ ├── GetEntryWithPingbacksQuery.cs │ │ ├── GetFullEntriesQuery.cs │ │ ├── GetSpamQuery.cs │ │ ├── SearchTagsByNameQuery.cs │ │ ├── SimpleSearchEntriesQuery.cs │ │ └── SwitchingSearchEntriesQuery.cs ├── RoutableFunnelWebExtension.cs ├── Settings │ ├── AppHarborSettings.cs │ ├── ConnectionStringSettings.cs │ ├── FunnelWebSettings.cs │ ├── IAppHarborSettings.cs │ ├── IConfigSettings.cs │ ├── ISettings.cs │ ├── ISettingsProvider.cs │ ├── SettingStorageAttribute.cs │ ├── SettingsModule.cs │ ├── SettingsProvider.cs │ ├── SqlAuthenticationSettings.cs │ ├── StorageLocation.cs │ └── XmlConfigSettings.cs ├── Tasks │ ├── BlogMLImport.cs │ ├── ITask.cs │ ├── ITaskExecutor.cs │ ├── TaskExecutor.cs │ ├── TaskModule.cs │ └── TaskStep.cs ├── Utilities │ ├── HttpRequestExtensions.cs │ ├── IMimeTypeLookup.cs │ ├── NumericExtensions.cs │ ├── StreamExtensions.cs │ └── StringExtensions.cs ├── app.config └── packages.config └── Information ├── SolutionInfo.cs └── VersionInfo.cs /.hgtags: -------------------------------------------------------------------------------- 1 | 32f5104617c7ac012f01f87c3bffadd2c16147dd 2.1-RC1 2 | 4b476290ec1d37da1d596196b16d930f8b185ad8 2.1-RTW 3 | 304c9cea6ba588c552a909312875616917d9af9c 2-1-0-1 4 | 4499cf017a0ac6b14b893b8f078e3f53607a035b 2-1-0-644 5 | 304c9cea6ba588c552a909312875616917d9af9c 2-1-0-1 6 | 0000000000000000000000000000000000000000 2-1-0-1 7 | 4499cf017a0ac6b14b893b8f078e3f53607a035b 2-1-0-644 8 | 00861f5f523525f6ee91edb992085039ea8878a1 2-1-0-644 9 | -------------------------------------------------------------------------------- /build.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | set appversion=1.0.1.0 4 | set framework=v4.0.30319 5 | 6 | "%SystemDrive%\Windows\Microsoft.NET\Framework\%framework%\MSBuild.exe" build\Build.proj /t:Build /p:build_number=%appversion% /v:m 7 | echo Done 8 | 9 | if (%1)==(NOPAUSE) goto :eof 10 | pause 11 | -------------------------------------------------------------------------------- /build/FunnelWebExtensibility.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FunnelWeb.Extensibility 5 | 1.0 6 | FunnelWeb.Core 7 | FunnelWeb Team 8 | Paul Stovell,Aaron Powell,Matt Hamilton,Jake Ginnivan 9 | http://funnelwebblog.com 10 | false 11 | This package enables you to create a FunnelWeb extension. 12 | 13 | en-AU 14 | Blog,Extension 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /build/lib/ICSharpCode.SharpZipLib.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/build/lib/ICSharpCode.SharpZipLib.dll -------------------------------------------------------------------------------- /build/lib/MSBuild.Community.Tasks.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/build/lib/MSBuild.Community.Tasks.dll -------------------------------------------------------------------------------- /build/lib/MSBuild.Deployment.Tasks.Targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /build/lib/MSBuild.Deployment.Tasks.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/build/lib/MSBuild.Deployment.Tasks.dll -------------------------------------------------------------------------------- /build/lib/MSBuild.Mercurial.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/build/lib/MSBuild.Mercurial.dll -------------------------------------------------------------------------------- /docs/Breaking Changes.md: -------------------------------------------------------------------------------- 1 | v1.0 -> v2.0 Breaking Changes 2 | 3 | - Custom Themes 4 | - Due to a data layer update, the Model used by many of the views has changed. Review all custom views, Entry is now EntryRevision, which is a projection from Entry and revision. 5 | - Any view that references Entry.Revision you should just be able to remove the .Revision as the revision properties you need are on EntryRevision 6 | 7 | - Tagged & Sql Auth are no longer extensions, before deploying new version delete: 8 | - Views\Extensions\SqlAuthentication 9 | - Views\Extensions\Tagged 10 | - bin\Extensions\FunnelWeb.Extensions.SqlAuthentication.dll 11 | - bin\Extensions\FunnelWeb.Extensions.TaggedPages.dll 12 | 13 | - There are quite a few other dependencies that are no longer needed, delete the bin folder before deploying to clean all these out 14 | 15 | - Login Settings and connection string is now in My.config. So put your settings in My.config, then overwrite web.config with the current version. -------------------------------------------------------------------------------- /docs/Requirements.md: -------------------------------------------------------------------------------- 1 | To Build FunnelWeb you require (incomplete list): 2 | 3 | http://www.microsoft.com/download/en/details.aspx?id=17876 - Sql CE 4.0 (For unit tests) 4 | -------------------------------------------------------------------------------- /docs/Setup Instructions.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/docs/Setup Instructions.md -------------------------------------------------------------------------------- /lib/Akismet/Joel.Net.Akismet.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/Akismet/Joel.Net.Akismet.dll -------------------------------------------------------------------------------- /lib/Cassini/WebDev.WebHost40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/Cassini/WebDev.WebHost40.dll -------------------------------------------------------------------------------- /lib/Cassini/WebDev.WebServer40.EXE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/Cassini/WebDev.WebServer40.EXE -------------------------------------------------------------------------------- /lib/Cassini/WebDev.WebServer40.exe.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /lib/Cassini/WebDev.WebServer40.exe.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | WebServer 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /lib/NUnit/Exe/NUnitTests.nunit: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /lib/NUnit/Exe/agent.conf: -------------------------------------------------------------------------------- 1 | 2 | 8080 3 | . 4 | -------------------------------------------------------------------------------- /lib/NUnit/Exe/agent.log.conf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /lib/NUnit/Exe/framework/nunit.framework.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/framework/nunit.framework.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/framework/nunit.mocks.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/framework/nunit.mocks.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/framework/pnunit.framework.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/framework/pnunit.framework.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/launcher.log.conf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/Failure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/Failure.png -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/Ignored.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/Ignored.png -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/Inconclusive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/Inconclusive.png -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/Skipped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/Skipped.png -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/Success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/Success.png -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/fit.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/fit.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/log4net.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/log4net.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/nunit-console-runner.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/nunit-console-runner.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/nunit-gui-runner.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/nunit-gui-runner.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/nunit.core.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/nunit.core.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/nunit.core.interfaces.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/nunit.core.interfaces.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/nunit.fixtures.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/nunit.fixtures.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/nunit.uiexception.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/nunit.uiexception.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/nunit.uikit.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/nunit.uikit.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/lib/nunit.util.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/lib/nunit.util.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/nunit-agent-x86.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/nunit-agent-x86.exe -------------------------------------------------------------------------------- /lib/NUnit/Exe/nunit-agent.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/nunit-agent.exe -------------------------------------------------------------------------------- /lib/NUnit/Exe/nunit-console-x86.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/nunit-console-x86.exe -------------------------------------------------------------------------------- /lib/NUnit/Exe/nunit-console.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/nunit-console.exe -------------------------------------------------------------------------------- /lib/NUnit/Exe/nunit-x86.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/nunit-x86.exe -------------------------------------------------------------------------------- /lib/NUnit/Exe/nunit.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/nunit.exe -------------------------------------------------------------------------------- /lib/NUnit/Exe/nunit.framework.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/nunit.framework.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/pnunit-agent.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/pnunit-agent.exe -------------------------------------------------------------------------------- /lib/NUnit/Exe/pnunit-launcher.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/pnunit-launcher.exe -------------------------------------------------------------------------------- /lib/NUnit/Exe/pnunit.framework.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/pnunit.framework.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/pnunit.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/pnunit.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/runFile.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/runFile.exe -------------------------------------------------------------------------------- /lib/NUnit/Exe/runpnunit.bat: -------------------------------------------------------------------------------- 1 | start pnunit-agent agent.conf 2 | pnunit-launcher test.conf -------------------------------------------------------------------------------- /lib/NUnit/Exe/test.conf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Testing 6 | 7 | 8 | Testing 9 | pnunit.tests.dll 10 | TestLibraries.Testing.EqualTo19 11 | localhost:8080 12 | 13 | ..\server 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/loadtest-assembly.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/loadtest-assembly.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/mock-assembly.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/mock-assembly.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nonamespace-assembly.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nonamespace-assembly.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit-console.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit-console.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit-gui.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit-gui.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit.core.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit.core.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit.fixtures.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit.fixtures.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit.framework.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit.framework.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit.framework.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit.framework.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit.mocks.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit.mocks.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit.uiexception.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit.uiexception.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit.uikit.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit.uikit.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/nunit.util.tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/nunit.util.tests.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/test-assembly.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/test-assembly.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/test-utilities.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/test-utilities.dll -------------------------------------------------------------------------------- /lib/NUnit/Exe/tests/timing-tests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/Exe/tests/timing-tests.dll -------------------------------------------------------------------------------- /lib/NUnit/nunit.framework.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/NUnit/nunit.framework.dll -------------------------------------------------------------------------------- /lib/RouteDebug-Binary/RouteDebug.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/RouteDebug-Binary/RouteDebug.dll -------------------------------------------------------------------------------- /lib/Watin/Interop.SHDocVw.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/Watin/Interop.SHDocVw.dll -------------------------------------------------------------------------------- /lib/Watin/Microsoft.mshtml.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/Watin/Microsoft.mshtml.dll -------------------------------------------------------------------------------- /lib/Watin/WatiN.Core.UnitTests.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/Watin/WatiN.Core.UnitTests.dll -------------------------------------------------------------------------------- /lib/Watin/WatiN.Core.UnitTests.dll.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /lib/Watin/WatiN.Core.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/lib/Watin/WatiN.Core.dll -------------------------------------------------------------------------------- /src/.nuget/NuGet.Config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/.nuget/NuGet.exe -------------------------------------------------------------------------------- /src/.nuget/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /src/FunnelWeb.Extensions.CommentNotification/Extension.cs: -------------------------------------------------------------------------------- 1 | using Autofac; 2 | using FunnelWeb.Eventing; 3 | 4 | namespace FunnelWeb.Extensions.CommentNotification 5 | { 6 | [FunnelWebExtension(FullName = "Comment Notifications via Email", Publisher = "FunnelWeb", SupportLink = "http://code.google.com/p/funnelweb")] 7 | public class Extension : IFunnelWebExtension 8 | { 9 | public void Initialize(ContainerBuilder builder) 10 | { 11 | builder.RegisterType().As().InstancePerLifetimeScope(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Extensions.CommentNotification/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | 3 | [assembly: AssemblyTitle("FunnelWeb.Extensions.CommentNotification")] 4 | [assembly: AssemblyDescription("A FunnelWeb extension that sends emails when comments are posted.")] -------------------------------------------------------------------------------- /src/FunnelWeb.Extensions.CommentNotification/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/DatabaseDeployer/DatabaseModuleTests.cs: -------------------------------------------------------------------------------- 1 | using Autofac; 2 | using FunnelWeb.DatabaseDeployer; 3 | using NUnit.Framework; 4 | 5 | namespace FunnelWeb.Tests.DatabaseDeployer 6 | { 7 | [TestFixture] 8 | public class DatabaseModuleTests 9 | { 10 | private IContainer container; 11 | 12 | [SetUp] 13 | public void SetUp() 14 | { 15 | var builder = new ContainerBuilder(); 16 | builder.RegisterModule(new DatabaseModule()); 17 | container = builder.Build(); 18 | } 19 | 20 | [Test] 21 | public void RegistersCorrectTypes() 22 | { 23 | Assert.IsTrue(container.IsRegistered()); 24 | Assert.IsTrue(container.IsRegistered()); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/FunnelWeb.Tests.nunit: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/Helpers/ITemporaryDatabase.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using DbUp.Helpers; 3 | using FunnelWeb.DatabaseDeployer; 4 | using FunnelWeb.Repositories; 5 | using NHibernate; 6 | 7 | namespace FunnelWeb.Tests.Helpers 8 | { 9 | public interface ITemporaryDatabase : IDisposable, IConnectionStringSettings 10 | { 11 | void WithRepository(Action callback); 12 | void WithSession(Action callback); 13 | AdHocSqlRunner AdHoc { get; } 14 | void CreateAndDeploy(); 15 | ScriptedExtension ScriptProviderFor(T extensionWithScripts) where T : IRequireDatabaseScripts; 16 | } 17 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/Helpers/QueryIntegrationTest.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | 3 | namespace FunnelWeb.Tests.Helpers 4 | { 5 | public abstract class QueryIntegrationTest 6 | { 7 | private readonly TheDatabase requirements; 8 | private static SqlCeTemporaryDatabase SqlCeDatabase { get; set; } 9 | 10 | protected QueryIntegrationTest(TheDatabase requirements) 11 | { 12 | this.requirements = requirements; 13 | } 14 | 15 | [Test] 16 | public void RunTestQuery() 17 | { 18 | Database = SqlCeDatabase; 19 | TestQuery(); 20 | } 21 | 22 | protected ITemporaryDatabase Database { get; private set; } 23 | 24 | public abstract void TestQuery(); 25 | 26 | [SetUp] 27 | public void SetUp() 28 | { 29 | if ((requirements & TheDatabase.MustBeFresh) == TheDatabase.MustBeFresh || SqlCeDatabase == null) 30 | { 31 | SqlCeDatabase = new SqlCeTemporaryDatabase(); 32 | SqlCeDatabase.CreateAndDeploy(); 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/Helpers/Requires.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Tests.Helpers 4 | { 5 | [Flags] 6 | public enum TheDatabase 7 | { 8 | CanBeDirty = 0, 9 | MustBeFresh = 1 10 | } 11 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/Helpers/Specification.cs: -------------------------------------------------------------------------------- 1 |  2 | using NUnit.Framework; 3 | 4 | namespace FunnelWeb.Tests.Helpers 5 | { 6 | [TestFixture] 7 | public abstract class Specification 8 | { 9 | protected TSubject Subject { get; private set; } 10 | 11 | public abstract TSubject Given(); 12 | 13 | public abstract void When(); 14 | 15 | [SetUp] 16 | public void Initialize() 17 | { 18 | Subject = Given(); 19 | When(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/Helpers/SqlCeIntegrationTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using NUnit.Framework; 3 | 4 | namespace FunnelWeb.Tests.Helpers 5 | { 6 | public abstract class SqlCeIntegrationTest 7 | { 8 | private readonly TheDatabase requirements; 9 | protected static SqlCeTemporaryDatabase Database { get; private set; } 10 | 11 | protected SqlCeIntegrationTest(TheDatabase requirements) 12 | { 13 | this.requirements = requirements; 14 | } 15 | 16 | [SetUp] 17 | public void SetUp() 18 | { 19 | if ((requirements & TheDatabase.MustBeFresh) == TheDatabase.MustBeFresh || Database == null) 20 | { 21 | Database = new SqlCeTemporaryDatabase(); 22 | Database.CreateAndDeploy(); 23 | } 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/Helpers/ThenAttribute.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | 3 | namespace FunnelWeb.Tests.Helpers 4 | { 5 | public class ThenAttribute : TestAttribute 6 | { 7 | 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/Integration/CanDeployDatabase.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using FunnelWeb.Tests.Helpers; 3 | using NUnit.Framework; 4 | 5 | namespace FunnelWeb.Tests.Integration 6 | { 7 | [TestFixture] 8 | public class DatabaseDeploymentTests : SqlCeIntegrationTest 9 | { 10 | public DatabaseDeploymentTests() : base(TheDatabase.MustBeFresh) 11 | { 12 | } 13 | 14 | [Test] 15 | public void TablesAreCreated() 16 | { 17 | var tables = Database.AdHoc.ExecuteReader("select * from INFORMATION_SCHEMA.Tables order by [TABLE_NAME] desc"); 18 | 19 | Assert.IsNotNull(tables.FirstOrDefault(table => table["TABLE_NAME"] == "Entry")); 20 | Assert.IsNotNull(tables.FirstOrDefault(table => table["TABLE_NAME"] == "Revision")); 21 | Assert.IsNotNull(tables.FirstOrDefault(table => table["TABLE_NAME"] == "Comment")); 22 | Assert.IsNotNull(tables.FirstOrDefault(table => table["TABLE_NAME"] == "SchemaVersions")); 23 | Assert.IsNotNull(tables.FirstOrDefault(table => table["TABLE_NAME"] == "Tag")); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | 3 | [assembly: AssemblyTitle("FunnelWeb.Tests")] 4 | [assembly: AssemblyDescription("Unit tests for all FunnelWeb code")] -------------------------------------------------------------------------------- /src/FunnelWeb.Tests/Web/Application/Mime/RegistryMimeTypeLookupTests.cs: -------------------------------------------------------------------------------- 1 | using FunnelWeb.Web.Application.Mime; 2 | using NUnit.Framework; 3 | 4 | namespace FunnelWeb.Tests.Web.Application.Mime 5 | { 6 | public class RegistryMimeTypeLookupTests 7 | { 8 | [TestFixture] 9 | public class WhenMimeTypeRequested 10 | { 11 | [Test] 12 | public void ShouldReturnMimeTypeFromRegistry() 13 | { 14 | var lookup = new RegistryMimeTypeLookup(); 15 | Assert.AreEqual("image/jpeg", lookup.GetMimeType("Hello.jpg")); 16 | Assert.AreEqual("image/png", lookup.GetMimeType("Hello.png")); 17 | Assert.AreEqual("text/plain", lookup.GetMimeType("C:\\Hello.txt")); 18 | Assert.AreEqual("image/jpeg", lookup.GetMimeType("../Green.jpg")); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/FunnelWeb.Wcf/AutofacConfigurableServiceHostFactory.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ServiceModel; 3 | using Autofac.Integration.Wcf; 4 | using Microsoft.ServiceModel.Http; 5 | 6 | namespace FunnelWeb.Extensions.WcfDemo 7 | { 8 | public class AutofacConfigurableServiceHostFactory : AutofacServiceHostFactory, IConfigurableServiceHostFactory 9 | { 10 | // Methods 11 | protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 12 | { 13 | return new WebHttpServiceHost(serviceType, Configuration, baseAddresses); 14 | } 15 | 16 | public HttpHostConfiguration Configuration { get; set; } 17 | } 18 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/App_Start/FilterConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | 3 | namespace FunnelWeb.Web.App_Start 4 | { 5 | public class FilterConfig 6 | { 7 | public static void RegisterGlobalFilters(GlobalFilterCollection filters) 8 | { 9 | filters.Add(new HandleErrorAttribute()); 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/CacheStaticFilesHttpModule.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Web; 4 | 5 | namespace FunnelWeb.Web.Application 6 | { 7 | public class CacheStaticFilesHttpModule : IHttpModule 8 | { 9 | public void Init(HttpApplication context) 10 | { 11 | context.BeginRequest += BeginRequest; 12 | } 13 | 14 | private static void BeginRequest(object sender, EventArgs e) 15 | { 16 | var context = HttpContext.Current; 17 | 18 | var path = context.Request.FilePath; 19 | var extensions = new[] { ".js", ".css", ".jpg", ".jpeg", ".gif", ".ico", ".png" }; 20 | if (extensions.Any(ext => path.EndsWith(ext, StringComparison.InvariantCultureIgnoreCase))) 21 | { 22 | context.Response.Cache.SetExpires(DateTime.Now.AddDays(90)); 23 | } 24 | } 25 | 26 | public void Dispose() 27 | { 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Extensions/MobileExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Web; 3 | 4 | namespace FunnelWeb.Web.Application.Extensions 5 | { 6 | public static class MobileExtensions 7 | { 8 | public static bool UserAgentContains(this HttpContextBase c, string agentToFind) 9 | { 10 | return ((c.Request.UserAgent ?? "").IndexOf(agentToFind, StringComparison.OrdinalIgnoreCase) > 0); 11 | } 12 | 13 | public static bool IsMobileDevice(this HttpContextBase c) 14 | { 15 | return c.Request.Browser.IsMobileDevice 16 | || c.UserAgentContains("Android") 17 | || c.UserAgentContains("iPhone") 18 | || c.UserAgentContains("Windows Phone"); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Extensions/ViewDataDictionaryExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.Web.Mvc; 3 | 4 | namespace FunnelWeb.Web.Application.Extensions 5 | { 6 | public static class ViewDataDictionaryExtensions 7 | { 8 | public static bool IsLoggedIn(this ViewDataDictionary viewData) 9 | { 10 | return HttpContext.Current.User.Identity.IsAuthenticated; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Markup/HtmlFormatter.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Web.Application.Markup 2 | { 3 | public class HtmlFormatter : IContentFormatter 4 | { 5 | public string Format(string content) 6 | { 7 | return content; 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Markup/IContentEnricher.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | 3 | namespace FunnelWeb.Web.Application.Markup 4 | { 5 | public interface IContentEnricher 6 | { 7 | string Enrich(string content, bool isContentTrusted, HtmlHelper html); 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Markup/IContentFormatter.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Web.Application.Markup 2 | { 3 | public interface IContentFormatter 4 | { 5 | string Format(string content); 6 | } 7 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Markup/IContentRenderer.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | 3 | namespace FunnelWeb.Web.Application.Markup 4 | { 5 | /// 6 | /// Renders content (trusted or untrusted) by resolving a formatter that matches the given content format (e.g., HTML vs. Markdown). 7 | /// 8 | public interface IContentRenderer 9 | { 10 | string RenderTrusted(string content, string format, HtmlHelper html); 11 | string RenderUntrusted(string content, string format, HtmlHelper html); 12 | } 13 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Markup/Macros/IMacroExecutor.cs: -------------------------------------------------------------------------------- 1 | using System.Text; 2 | using System.Web.Mvc; 3 | 4 | namespace FunnelWeb.Web.Application.Markup.Macros 5 | { 6 | public interface IMacroExecutor 7 | { 8 | StringBuilder ExecuteMacro(string templateContent, HtmlHelper html); 9 | } 10 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Markup/Macros/MacroView.cs: -------------------------------------------------------------------------------- 1 | using System.Text; 2 | using System.Web.Mvc; 3 | 4 | namespace FunnelWeb.Web.Application.Markup.Macros 5 | { 6 | public class MacroView 7 | { 8 | private StringBuilder output; 9 | 10 | public HtmlHelper Html { get; set; } 11 | 12 | public void Initialize(StringBuilder writer) 13 | { 14 | output = writer; 15 | } 16 | 17 | protected virtual void WriteLiteral(object o) 18 | { 19 | output.Append(o); 20 | } 21 | 22 | protected virtual void Write(object o) 23 | { 24 | output.Append(o); 25 | } 26 | 27 | public virtual void Execute() 28 | { 29 | 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/MetaWeblog/MetaWeblogRouteHandler.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.Web.Mvc; 3 | using System.Web.Routing; 4 | 5 | namespace FunnelWeb.Web.Application.MetaWeblog 6 | { 7 | public class MetaWeblogRouteHandler : IRouteHandler 8 | { 9 | public IHttpHandler GetHttpHandler(RequestContext requestContext) 10 | { 11 | return DependencyResolver.Current.GetService(); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/MetaWeblog/MetaWeblogSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using FunnelWeb.Settings; 3 | 4 | namespace FunnelWeb.Web.Application.MetaWeblog 5 | { 6 | public class MetaWeblogSettings : ISettings 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mime/MimeSupportModule.cs: -------------------------------------------------------------------------------- 1 | using Autofac; 2 | using FunnelWeb.Utilities; 3 | 4 | namespace FunnelWeb.Web.Application.Mime 5 | { 6 | public class MimeSupportModule : Module 7 | { 8 | protected override void Load(ContainerBuilder builder) 9 | { 10 | builder.RegisterType().As().SingleInstance(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/ActionResults/PageTemplateActionResult.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | 3 | namespace FunnelWeb.Web.Application.Mvc.ActionResults 4 | { 5 | public class PageTemplateActionResult : ActionResult 6 | { 7 | private readonly string _actionName; 8 | private readonly string _pageTemplate; 9 | 10 | public PageTemplateActionResult(string pageTemplate = null, string actionName = null) 11 | { 12 | _actionName = actionName; 13 | _pageTemplate = "PageTemplates/" + (pageTemplate ?? "Default"); 14 | } 15 | 16 | public override void ExecuteResult(ControllerContext context) 17 | { 18 | new ViewResult 19 | { 20 | MasterName = _pageTemplate, 21 | ViewData = context.Controller.ViewData, 22 | ViewName = _actionName, 23 | TempData = context.Controller.TempData, 24 | }.ExecuteResult(context); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/Binders/BindersModule.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using Autofac; 3 | using FunnelWeb.Model; 4 | using FunnelWeb.Model.Strings; 5 | 6 | namespace FunnelWeb.Web.Application.Mvc.Binders 7 | { 8 | public class BindersModule : Module 9 | { 10 | private readonly ModelBinderDictionary binders; 11 | 12 | public BindersModule(ModelBinderDictionary binders) 13 | { 14 | this.binders = binders; 15 | } 16 | 17 | protected override void Load(ContainerBuilder builder) 18 | { 19 | binders.Add(typeof(PageName), new ImplicitAssignmentBinder()); 20 | binders.Add(typeof(int[]), new ArrayBinder()); 21 | binders.Add(typeof(FileUpload), new UploadBinder()); 22 | binders.Add(typeof (EntryRevision), new EntryRevisionBinder()); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/Binders/EntryRevisionBinder.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using FunnelWeb.Model; 3 | 4 | namespace FunnelWeb.Web.Application.Mvc.Binders 5 | { 6 | [ModelBinder(typeof(EntryRevision))] 7 | public class EntryRevisionBinder : DefaultModelBinder 8 | { 9 | public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 10 | { 11 | var model = base.BindModel(controllerContext, bindingContext) as EntryRevision; 12 | model.TagsCommaSeparated = 13 | controllerContext.HttpContext.Request["SelectedTags-Ids"]; 14 | return model; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/Binders/UploadBinder.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | 3 | namespace FunnelWeb.Web.Application.Mvc.Binders 4 | { 5 | public class UploadBinder : IModelBinder 6 | { 7 | public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 8 | { 9 | var files = controllerContext.HttpContext.Request.Files; 10 | var file = files.Get(bindingContext.ModelName); 11 | 12 | if (file == null) 13 | return null; 14 | return new FileUpload(file); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/FileUpload.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Web; 3 | 4 | namespace FunnelWeb.Web.Application.Mvc 5 | { 6 | public class FileUpload 7 | { 8 | private readonly HttpPostedFileBase postedFile; 9 | 10 | public FileUpload(HttpPostedFileBase postedFile) 11 | { 12 | this.postedFile = postedFile; 13 | } 14 | 15 | public string FileName 16 | { 17 | get { return Path.GetFileName(postedFile.FileName); } 18 | } 19 | 20 | public void SaveTo(string fullPath) 21 | { 22 | postedFile.SaveAs(fullPath); 23 | } 24 | 25 | public Stream Stream { get { return postedFile.InputStream; } } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/FunnelWebControllerFactory.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Web.Mvc; 3 | using System.Web.Routing; 4 | using Autofac; 5 | 6 | namespace FunnelWeb.Web.Application.Mvc 7 | { 8 | public class FunnelWebControllerFactory : DefaultControllerFactory 9 | { 10 | private readonly IContainer _container; 11 | 12 | public FunnelWebControllerFactory(IContainer container) 13 | { 14 | _container = container; 15 | } 16 | protected override Type GetControllerType(RequestContext requestContext, string controllerName) 17 | { 18 | var controller = base.GetControllerType(requestContext, controllerName); 19 | if (controller == null) 20 | { 21 | object x; 22 | if (_container.TryResolveNamed(controllerName, typeof(IController), out x)) 23 | controller = x.GetType(); 24 | } 25 | 26 | return controller; 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/HtmlHelperExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq.Expressions; 3 | using System.Web.Mvc; 4 | 5 | namespace FunnelWeb.Web.Application.Mvc 6 | { 7 | public static class HtmlHelperExtensions 8 | { 9 | public static string FieldNameFor(this HtmlHelper html, Expression> expression) 10 | { 11 | return html.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression)); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/HyphenatedRouteHandler.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.Web.Mvc; 3 | using System.Web.Routing; 4 | 5 | namespace FunnelWeb.Web.Application.Mvc 6 | { 7 | public class HyphenatedRouteHandler : MvcRouteHandler 8 | { 9 | protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 10 | { 11 | requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", ""); 12 | requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", ""); 13 | return base.GetHttpHandler(requestContext); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/MvcExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | 3 | namespace FunnelWeb.Web.Application.Mvc 4 | { 5 | public static class MvcExtensions 6 | { 7 | public static FlashResult AndFlash(this TResult result, string messageFormat, params object[] args) where TResult : ActionResult 8 | { 9 | return new FlashResult(result, string.Format(messageFormat, args)); 10 | } 11 | 12 | public class FlashResult : ActionResult where TResult : ActionResult 13 | { 14 | private readonly TResult result; 15 | private readonly string message; 16 | 17 | public FlashResult(TResult result, string message) 18 | { 19 | this.result = result; 20 | this.message = message; 21 | } 22 | 23 | public override void ExecuteResult(ControllerContext context) 24 | { 25 | context.Controller.TempData["Flash"] = message; 26 | result.ExecuteResult(context); 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/UrlHelperExtension.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Web; 3 | using System.Web.Mvc; 4 | 5 | namespace FunnelWeb.Web.Application.Mvc 6 | { 7 | public static class UrlHelperExtension 8 | { 9 | public static string Absolute(this UrlHelper url, string relativeOrAbsolute) 10 | { 11 | var uri = new Uri(relativeOrAbsolute, UriKind.RelativeOrAbsolute); 12 | if (uri.IsAbsoluteUri) 13 | { 14 | return relativeOrAbsolute; 15 | } 16 | // At this point, we know the url is relative. 17 | string absolute = VirtualPathUtility.ToAbsolute(relativeOrAbsolute); 18 | return absolute; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/ValidUrlAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | 4 | namespace FunnelWeb.Web.Application.Mvc 5 | { 6 | public class ValidUrlAttribute : ValidationAttribute 7 | { 8 | public override bool IsValid(object value) 9 | { 10 | var text = (value ?? string.Empty).ToString(); 11 | if (text.Length == 0) 12 | return true; 13 | 14 | Uri uri; 15 | return Uri.TryCreate(text, UriKind.Absolute, out uri); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Mvc/WebAbstractionsModule.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using Autofac; 3 | 4 | namespace FunnelWeb.Web.Application.Mvc 5 | { 6 | public class WebAbstractionsModule : Module 7 | { 8 | protected override void Load(ContainerBuilder builder) 9 | { 10 | base.Load(builder); 11 | 12 | builder.Register(x => new HttpContextWrapper(HttpContext.Current)) 13 | .InstancePerLifetimeScope(); 14 | 15 | builder.Register(x => new HttpContextWrapper(HttpContext.Current).Request) 16 | .InstancePerLifetimeScope(); 17 | 18 | builder.Register(x => new HttpServerUtilityWrapper(HttpContext.Current.Server)) 19 | .InstancePerLifetimeScope(); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Pingbacks/XmlRpcFaultException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Web.Application.Pingbacks 4 | { 5 | public class XmlRpcFaultException : Exception 6 | { 7 | private readonly int faultCode; 8 | private readonly string faultMessage; 9 | 10 | public XmlRpcFaultException(int faultCode, string faultMessage) 11 | { 12 | this.faultCode = faultCode; 13 | this.faultMessage = faultMessage; 14 | } 15 | 16 | public string FaultMessage 17 | { 18 | get { return faultMessage; } 19 | } 20 | 21 | public int FaultCode 22 | { 23 | get { return faultCode; } 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Spam/ISpamChecker.cs: -------------------------------------------------------------------------------- 1 | using FunnelWeb.Model; 2 | 3 | namespace FunnelWeb.Web.Application.Spam 4 | { 5 | public interface ISpamChecker 6 | { 7 | void Verify(Comment comment); 8 | void Verify(Pingback pingback); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Spam/SpamModule.cs: -------------------------------------------------------------------------------- 1 | using Autofac; 2 | 3 | namespace FunnelWeb.Web.Application.Spam 4 | { 5 | public class SpamModule : Module 6 | { 7 | protected override void Load(ContainerBuilder builder) 8 | { 9 | builder.RegisterType().As() 10 | .InstancePerDependency(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Themes/IThemeProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Web.Application.Themes 4 | { 5 | public interface IThemeProvider 6 | { 7 | string[] GetThemes(); 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Themes/ThemeProvider.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Linq; 3 | using System.Web; 4 | 5 | namespace FunnelWeb.Web.Application.Themes 6 | { 7 | public class ThemeProvider : IThemeProvider 8 | { 9 | public string[] GetThemes() 10 | { 11 | var themeFolder = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/Themes")); 12 | var themes = themeFolder.GetDirectories().Select(x => x.Name).OrderBy(x => x).ToArray(); 13 | return themes; 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Application/Themes/ThemesModule.cs: -------------------------------------------------------------------------------- 1 | using Autofac; 2 | 3 | namespace FunnelWeb.Web.Application.Themes 4 | { 5 | public class ThemesModule : Module 6 | { 7 | protected override void Load(ContainerBuilder builder) 8 | { 9 | base.Load(builder); 10 | 11 | builder.RegisterType().As().InstancePerDependency(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/BundleConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Web; 2 | using System.Web.Mvc; 3 | using System.Web.Optimization; 4 | using FunnelWeb.Web.Application.Mvc; 5 | 6 | namespace FunnelWeb.Web.Areas.Admin 7 | { 8 | internal static class BundleConfig 9 | { 10 | // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725 11 | internal static void RegisterBundles(BundleCollection bundles, AreaRegistrationContext context, HttpContextBase httpContext) 12 | { 13 | ViewBundleRegistrar.RegisterViewBundlesForArea(bundles, context, httpContext); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Scripts/Views/WikiAdmin/Edit.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | var preview = $("#wmd-preview"); 4 | 5 | if (preview.length) { 6 | 7 | function enablePrettyPrinting() { 8 | 9 | var doPrettyPrint = false; 10 | 11 | preview.children("pre").each(function () { 12 | $(this).attr("class", "prettyprint"); 13 | doPrettyPrint = true; 14 | }); 15 | 16 | if (doPrettyPrint) prettyPrint(); 17 | } 18 | 19 | $('#apply-pretty-print').click(enablePrettyPrinting); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Admin/BlogMLImportModel.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.ComponentModel.DataAnnotations; 3 | using FunnelWeb.Web.Application; 4 | using FunnelWeb.Web.Application.Mvc; 5 | 6 | namespace FunnelWeb.Web.Areas.Admin.Views.Admin 7 | { 8 | public class BlogMLImportModel 9 | { 10 | [DisplayName("File")] 11 | [Required] 12 | [Description("Select the BlogML file you wish to upload.")] 13 | public FileUpload File { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Admin/CommentsModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FunnelWeb.Model; 3 | using FunnelWeb.Repositories; 4 | using FunnelWeb.Web.Models; 5 | 6 | namespace FunnelWeb.Web.Areas.Admin.Views.Admin 7 | { 8 | public class CommentsModel 9 | { 10 | public CommentsModel(int pageNumber, PagedResult comments) 11 | { 12 | PageNumber = pageNumber; 13 | Comments = comments; 14 | 15 | Paginator = new Paginator 16 | { 17 | ActionName = "Comments", 18 | CurrentPage = pageNumber, 19 | TotalPages = comments.TotalPages 20 | }; 21 | } 22 | 23 | public IEnumerable Comments { get; set; } 24 | public int PageNumber { get; set; } 25 | public Paginator Paginator { get; set; } 26 | } 27 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Admin/IndexModel.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Web.Areas.Admin.Views.Admin 2 | { 3 | public class IndexModel 4 | { 5 | public IndexModel() 6 | { 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Admin/PageListModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FunnelWeb.Model; 3 | 4 | namespace FunnelWeb.Web.Areas.Admin.Views.Admin 5 | { 6 | public class PageListModel 7 | { 8 | public PageListModel(IEnumerable entries) 9 | { 10 | Entries = entries; 11 | } 12 | 13 | public IEnumerable Entries { get; set; } 14 | public bool SortAscending { get; set; } 15 | } 16 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Admin/Pingbacks.cshtml: -------------------------------------------------------------------------------- 1 | @model FunnelWeb.Web.Areas.Admin.Views.Admin.PingbacksModel 2 | @{ 3 | ViewBag.Title = "FunnelWeb Administration - Pingbacks"; 4 | Layout = "~/Areas/Admin/Views/Shared/_Private.cshtml"; 5 | } 6 | 7 |

Pingbacks

8 | 9 | @foreach (var pingback in Model.Pingbacks) { 10 | 11 | 12 | 17 | 21 | 22 |
13 | @Html.Encode(pingback.Entry.Title)
14 | @Html.Encode(pingback.TargetTitle) | 15 | @Html.Encode(pingback.TargetUri) 16 |
18 | @Html.ActionLink("Delete", "DeletePingback", "Admin", new { Area = "Admin", pingback.Id }, null) 19 | @Html.ActionLink(pingback.IsSpam ? "Unspam" : "Spam", "TogglePingbackSpam", "Admin", new { Area = "Admin", pingback.Id }, null) 20 |
23 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Admin/PingbacksModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FunnelWeb.Model; 3 | 4 | namespace FunnelWeb.Web.Areas.Admin.Views.Admin 5 | { 6 | public class PingbacksModel 7 | { 8 | public PingbacksModel(IEnumerable pingbacks) 9 | { 10 | Pingbacks = pingbacks; 11 | } 12 | 13 | public IEnumerable Pingbacks { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Admin/TaskModel.cs: -------------------------------------------------------------------------------- 1 | using FunnelWeb.Model; 2 | 3 | namespace FunnelWeb.Web.Areas.Admin.Views.Admin 4 | { 5 | public class TaskModel 6 | { 7 | public TaskState State { get; set; } 8 | 9 | public TaskModel(TaskState state) 10 | { 11 | State = state; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Admin/Tasks.cshtml: -------------------------------------------------------------------------------- 1 | @model FunnelWeb.Web.Areas.Admin.Views.Admin.TasksModel 2 | @{ 3 | ViewBag.Title = "FunnelWeb Administration - Task List"; 4 | Layout = "~/Areas/Admin/Views/Shared/_Private.cshtml"; 5 | } 6 | 7 |

Tasks

8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | @foreach (var task in Model.Tasks) 21 | { 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | } 30 | 31 |
TaskArgumentsStartedProgressStatus
@Html.ActionLink(task.TaskName, "Task", "Admin", new { Area = "Admin", id = task.Id }, new { })@task.Arguments@Html.Date(task.Started)@task.ProgressEstimate%@task.Status
32 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Admin/TasksModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FunnelWeb.Model; 3 | 4 | namespace FunnelWeb.Web.Areas.Admin.Views.Admin 5 | { 6 | public class TasksModel 7 | { 8 | public List Tasks { get; set; } 9 | 10 | public TasksModel(List tasks) 11 | { 12 | Tasks = tasks; 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Install/ExtensionVersion.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Web.Areas.Admin.Views.Install 2 | { 3 | public class ExtensionVersion 4 | { 5 | public string ExtensionName { get; set; } 6 | public int CurrentVersion { get; set; } 7 | public int NewVersion { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Install/UpgradeModel.cs: -------------------------------------------------------------------------------- 1 | using DbUp.Engine; 2 | 3 | namespace FunnelWeb.Web.Areas.Admin.Views.Install 4 | { 5 | public class UpgradeModel 6 | { 7 | public UpgradeModel(DatabaseUpgradeResult[] results, string log) 8 | { 9 | Results = results; 10 | Log = log; 11 | } 12 | 13 | public string Log { get; set; } 14 | public DatabaseUpgradeResult[] Results { get; set; } 15 | } 16 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Install/UpgradeReport.cshtml: -------------------------------------------------------------------------------- 1 | @model FunnelWeb.Web.Areas.Admin.Views.Install.UpgradeModel 2 | @{ 3 | ViewBag.Title = "FunnelWeb Installation Report"; 4 | Layout = "~/Areas/Admin/Views/Shared/_Private.cshtml"; 5 | } 6 | 7 |

FunnelWeb Upgrade Report

8 | 9 | @if (Model.Results.All(x => x.Successful)) 10 | { 11 |

The upgrade completed successfully. @Model.Results.Sum(x => x.Scripts.Count()) scripts were run.

12 |

Woohoo!

13 | } 14 | else 15 | { 16 |

The upgrade failed. Please review the logs below to resolve the issue.

17 |

18 | @Html.AdminActionLink("Back to upgrade page", "Index", "Install") 19 |

20 | } 21 | 22 | @if (Model.Results.Any(x => x.Error != null)) 23 | { 24 |

Log

25 | 26 |
@Model.Log
27 | } 28 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/Login/LoginModel.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using FunnelWeb.Mvc; 3 | 4 | namespace FunnelWeb.Web.Areas.Admin.Views.Login 5 | { 6 | public class LoginModel 7 | { 8 | public bool? DatabaseIssue { get; set; } 9 | public bool? ConfigFileMissing { get; set; } 10 | public string ReturnUrl { get; set; } 11 | 12 | [Required] 13 | [StringLength(100)] 14 | [HintSize(HintSize.Medium)] 15 | public string Username { get; set; } 16 | 17 | [Required] 18 | [StringLength(100)] 19 | [HintSize(HintSize.Medium)] 20 | public string Password { get; set; } 21 | } 22 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/SqlAuthentication/AddRole.cshtml: -------------------------------------------------------------------------------- 1 | @model FunnelWeb.Web.Areas.Admin.Views.SqlAuthentication.AddRoleModel 2 |

3 | Sql Authentication Provider Setup

4 | @using (Html.BeginForm("NewAccount", "SqlAuthentication", FormMethod.Post)) 5 | { 6 |

7 | Add User (@Model.User.Name) To Role

8 | foreach (var role in Model.Roles) 9 | { 10 | @Html.ActionLink(role.Name, "AddUserToRole", new { userId = Model.User.Id, roleId = role.Id })
11 | } 12 | 13 |
14 | @Html.ActionLink("Finished", "Index") 15 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/SqlAuthentication/AddRoleModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using FunnelWeb.Model.Authentication; 4 | 5 | namespace FunnelWeb.Web.Areas.Admin.Views.SqlAuthentication 6 | { 7 | public class AddRoleModel 8 | { 9 | public User User { get; set; } 10 | public IList Roles { get; set; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/SqlAuthentication/IndexModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using FunnelWeb.Model.Authentication; 4 | 5 | namespace FunnelWeb.Web.Areas.Admin.Views.SqlAuthentication 6 | { 7 | public class IndexModel 8 | { 9 | public bool IsUsingSqlAuthentication { get; set; } 10 | 11 | public IEnumerable Users { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/SqlAuthentication/NewUser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using FunnelWeb.Model.Authentication; 3 | using System.ComponentModel; 4 | 5 | namespace FunnelWeb.Web.Areas.Admin.Views.SqlAuthentication 6 | { 7 | public class NewUser : User 8 | { 9 | [DisplayName("Repeat Password")] 10 | public virtual string RepeatPassword { get; set; } 11 | } 12 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Areas/Admin/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "~/Areas/Admin/Views/Shared/_Private.cshtml"; 3 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/Busy.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/Busy.gif -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/Document.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/Document.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/Installer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/Installer.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/Link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/Link.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/Zip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/Zip.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/bmp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/bmp.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/cs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/cs.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/csproj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/csproj.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/default.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/dir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/dir.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/doc.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/docx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/docx.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/gif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/gif.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/jpg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/jpg.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/png.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/png.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/pps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/pps.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/ppsx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/ppsx.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/ppt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/ppt.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/pptx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/pptx.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/rar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/rar.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/sln.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/sln.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/tar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/tar.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/xls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/xls.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/FileTypes/xlsx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/FileTypes/xlsx.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/PaulStovell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/PaulStovell.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/editorbuttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/editorbuttons.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/external.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/external.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/fail.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/success.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/title.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Images/transparent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Images/transparent.gif -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Prettify/prettify.css: -------------------------------------------------------------------------------- 1 | .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Resources/Robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | Sitemap: /sitemap 4 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Resources/Status.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Status 7 | 8 | 9 | 10 | 11 |

Online

12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Resources/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Resources/favicon.ico -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/Resources/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/Resources/favicon.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/del_sprite_tagComplete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/del_sprite_tagComplete.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/jquery.ui.all.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.8.20 3 | * 4 | * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Theming 9 | */ 10 | @import "jquery.ui.base.css"; 11 | @import "jquery.ui.theme.css"; 12 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/jquery.ui.base.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.8.20 3 | * 4 | * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Theming 9 | */ 10 | @import url("jquery.ui.core.css"); 11 | 12 | @import url("jquery.ui.accordion.css"); 13 | @import url("jquery.ui.autocomplete.css"); 14 | @import url("jquery.ui.button.css"); 15 | @import url("jquery.ui.datepicker.css"); 16 | @import url("jquery.ui.dialog.css"); 17 | @import url("jquery.ui.progressbar.css"); 18 | @import url("jquery.ui.resizable.css"); 19 | @import url("jquery.ui.selectable.css"); 20 | @import url("jquery.ui.slider.css"); 21 | @import url("jquery.ui.tabs.css"); 22 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/jquery.ui.progressbar.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Progressbar 1.8.20 3 | * 4 | * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Progressbar#theming 9 | */ 10 | .ui-progressbar { height:2em; text-align: left; overflow: hidden; } 11 | .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/jquery.ui.selectable.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Selectable 1.8.20 3 | * 4 | * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Selectable#theming 9 | */ 10 | .ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } 11 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/jquery.ui.tooltip.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Tooltip 1.9.0 3 | * http://jqueryui.com 4 | * 5 | * Copyright 2012 jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | */ 9 | .ui-tooltip { 10 | padding:8px; 11 | position:absolute; 12 | z-index:9999; 13 | -o-box-shadow: 0 0 5px #aaa; 14 | -moz-box-shadow: 0 0 5px #aaa; 15 | -webkit-box-shadow: 0 0 5px #aaa; 16 | box-shadow: 0 0 5px #aaa; 17 | } 18 | /* Fades and background-images don't work well together in IE6, drop the image */ 19 | * html .ui-tooltip { 20 | background-image: none; 21 | } 22 | body .ui-tooltip { border-width:2px; } 23 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Content/themes/base/minified/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.accordion.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.8.20 - 2012-04-30 2 | * https://github.com/jquery/jquery-ui 3 | * Includes: jquery.ui.accordion.css 4 | * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ 5 | .ui-accordion{width:100%}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1}.ui-accordion .ui-accordion-li-fix{display:inline}.ui-accordion .ui-accordion-header-active{border-bottom:0!important}.ui-accordion .ui-accordion-header a{display:block;font-size:1em;padding:.5em .5em .5em .7em}.ui-accordion-icons .ui-accordion-header a{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;margin-top:-2px;position:relative;top:1px;margin-bottom:2px;overflow:auto;display:none;zoom:1}.ui-accordion .ui-accordion-content-active{display:block} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.autocomplete.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.8.20 - 2012-04-30 2 | * https://github.com/jquery/jquery-ui 3 | * Includes: jquery.ui.autocomplete.css 4 | * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ 5 | .ui-autocomplete{position:absolute;cursor:default}* html .ui-autocomplete{width:1px}.ui-menu{list-style:none;padding:2px;margin:0;display:block;float:left}.ui-menu .ui-menu{margin-top:-3px}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;float:left;clear:left;width:100%}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:.2em .4em;line-height:1.5;zoom:1}.ui-menu .ui-menu-item a.ui-state-hover,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.core.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.8.20 - 2012-04-30 2 | * https://github.com/jquery/jquery-ui 3 | * Includes: jquery.ui.core.css 4 | * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ 5 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute!important;clip:rect(1px);clip:rect(1px,1px,1px,1px)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.menu.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.9.0 - 2012-10-05 2 | * http://jqueryui.com 3 | * Includes: jquery.ui.menu.css 4 | * Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ 5 | .ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;width:100%}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;zoom:1;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.progressbar.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.8.20 - 2012-04-30 2 | * https://github.com/jquery/jquery-ui 3 | * Includes: jquery.ui.progressbar.css 4 | * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ 5 | .ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.resizable.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.8.20 - 2012-04-30 2 | * https://github.com/jquery/jquery-ui 3 | * Includes: jquery.ui.resizable.css 4 | * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ 5 | .ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.selectable.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.8.20 - 2012-04-30 2 | * https://github.com/jquery/jquery-ui 3 | * Includes: jquery.ui.selectable.css 4 | * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ 5 | .ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.slider.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.8.20 - 2012-04-30 2 | * https://github.com/jquery/jquery-ui 3 | * Includes: jquery.ui.slider.css 4 | * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ 5 | .ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.spinner.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.9.0 - 2012-10-05 2 | * http://jqueryui.com 3 | * Includes: jquery.ui.spinner.css 4 | * Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ 5 | .ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;z-index:100;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}span.ui-spinner{background:none}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.tabs.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.8.20 - 2012-04-30 2 | * https://github.com/jquery/jquery-ui 3 | * Includes: jquery.ui.tabs.css 4 | * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ 5 | .ui-tabs{position:relative;padding:.2em;zoom:1}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:1px;margin:0 .2em 1px 0;border-bottom:0!important;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{margin-bottom:0;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-state-processing a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tabs .ui-tabs-hide{display:none!important} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Content/themes/base/minified/jquery.ui.tooltip.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.9.0 - 2012-10-05 2 | * http://jqueryui.com 3 | * Includes: jquery.ui.tooltip.css 4 | * Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */ 5 | .ui-tooltip{padding:8px;position:absolute;z-index:9999;-o-box-shadow:0 0 5px #aaa;-moz-box-shadow:0 0 5px #aaa;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}* html .ui-tooltip{background-image:none}body .ui-tooltip{border-width:2px} -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Controllers/TagController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Web.Mvc; 4 | using FunnelWeb.Model; 5 | using FunnelWeb.Repositories; 6 | using FunnelWeb.Repositories.Queries; 7 | 8 | namespace FunnelWeb.Web.Controllers 9 | { 10 | [Authorize] 11 | public class TagController : Controller 12 | { 13 | private readonly IRepository _repo; 14 | 15 | public TagController(IRepository repo) 16 | { 17 | _repo = repo; 18 | } 19 | 20 | [HttpGet] 21 | public ActionResult Index(string tagName = null) 22 | { 23 | var tags = _repo.Find(new SearchTagsByNameQuery(tagName)); 24 | 25 | return Json(tags.Select(x => new { Id = x.Id, Name = x.Name }), JsonRequestBehavior.AllowGet); 26 | } 27 | 28 | public ActionResult Tag(string tagName) 29 | { 30 | var tag = _repo.FindFirstOrDefault(new SearchTagsByNameQuery(tagName)); 31 | 32 | return Json(tag); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Controllers/TaggedController.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using FunnelWeb.Filters; 3 | using FunnelWeb.Model; 4 | using FunnelWeb.Repositories; 5 | using FunnelWeb.Repositories.Queries; 6 | 7 | namespace FunnelWeb.Web.Controllers 8 | { 9 | [FunnelWebRequest] 10 | public class TaggedController : Controller 11 | { 12 | private readonly IRepository repository; 13 | 14 | public TaggedController(IRepository repository) 15 | { 16 | this.repository = repository; 17 | } 18 | 19 | public ActionResult Index(string tag) 20 | { 21 | var tagItems = repository.Find(new GetEntriesByTagQuery(tag, EntryStatus.PublicBlog), 0, 30); 22 | ViewBag.Tag = tag; 23 | return View(tagItems); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Global.asax: -------------------------------------------------------------------------------- 1 | <%@ Application Codebehind="Global.asax.cs" Inherits="FunnelWeb.Web.MvcApplication" Language="C#" %> 2 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Models/Paginator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Web.Models 4 | { 5 | public class Paginator 6 | { 7 | public string ActionName { get; set; } 8 | public int CurrentPage { get; set; } 9 | public int TotalPages { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/My.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Web; 3 | using FunnelWeb.Web; 4 | 5 | [assembly: AssemblyTitle("FunnelWeb.Web")] 6 | [assembly: AssemblyDescription("ASP.NET MVC assembly for FunnelWeb")] 7 | 8 | [assembly: PreApplicationStartMethod(typeof(MvcApplication), "BeforeApplicationStart")] -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-apollo.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-apollo.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-css.js: -------------------------------------------------------------------------------- 1 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", 2 | /^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); 3 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-go.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-go.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-hs.js: -------------------------------------------------------------------------------- 1 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null,"\t\n \r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^\n\f\r'\\]|\\[^&])'?/,null,"'"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^(?:--+[^\n\f\r]*|{-(?:[^-]|-+[^}-])*-})/],["kwd",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^\d'A-Za-z]|$)/, 2 | null],["pln",/^(?:[A-Z][\w']*\.)*[A-Za-z][\w']*/],["pun",/^[^\d\t-\r "'A-Za-z]+/]]),["hs"]); 3 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-lisp.js: -------------------------------------------------------------------------------- 1 | var a=null; 2 | PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,a,"("],["clo",/^\)+/,a,")"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \xa0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,a], 3 | ["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["cl","el","lisp","scm"]); 4 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-lua.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-lua.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-ml.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-ml.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-proto.js: -------------------------------------------------------------------------------- 1 | PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]); 2 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-scala.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-scala.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-sql.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-sql.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-tex.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-tex.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-vb.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-vb.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-vhdl.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-vhdl.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-wiki.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Scripts/Prettify/lang-wiki.js -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/Prettify/lang-yaml.js: -------------------------------------------------------------------------------- 1 | var a=null; 2 | PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:>?|]+/,a,":|>?"],["dec",/^%(?:YAML|TAG)[^\n\r#]+/,a,"%"],["typ",/^&\S+/,a,"&"],["typ",/^!\S*/,a,"!"],["str",/^"(?:[^"\\]|\\.)*(?:"|$)/,a,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,a,"'"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^\s+/,a," \t\r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\n\r]|$)/],["pun",/^-/],["kwd",/^\w+:[\n\r ]/],["pln",/^\w+/]]),["yaml","yml"]); 3 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Scripts/disqus-count.js: -------------------------------------------------------------------------------- 1 | (function (window, document) { 2 | var s = document.createElement('script'); s.async = true; 3 | s.type = 'text/javascript'; 4 | s.src = 'http://' + window.disqus_shortname + '.disqus.com/count.js'; 5 | (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s); 6 | })(window, document); -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Themes/Evolve/Content/Images/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Themes/Evolve/Content/Images/background.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Themes/MattHamilton/Content/Styles/Title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Themes/MattHamilton/Content/Styles/Title.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Themes/Official/Content/Images/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Themes/Official/Content/Images/header.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Themes/Pastel/Content/Styles/Bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Themes/Pastel/Content/Styles/Bar.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Themes/RainbowAfro/Content/Styles/Bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Themes/RainbowAfro/Content/Styles/Bar.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Themes/RainbowAfro/Content/Styles/Header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Themes/RainbowAfro/Content/Styles/Header.jpg -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Themes/Twitter/Content/Styles/Background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Themes/Twitter/Content/Styles/Background.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Themes/Twitter/Content/Styles/Bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/Themes/Twitter/Content/Styles/Bar.png -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/DisplayTemplates/Comment.cshtml: -------------------------------------------------------------------------------- 1 | @model Comment 2 | 3 |
4 | 5 |
6 | @Html.Encode(Model.AuthorName) 7 |
8 | @Html.UrlLink(Model.AuthorUrl, Model.AuthorName, "fn url") 9 |
10 |
11 |
@Html.Date(Model.Posted) 12 | @Html.CommentedAtRevision(Model, (EntryRevision)ViewBag.Entry) 13 | @if (ViewData.IsLoggedIn()) 14 | { 15 | @Html.ActionLink(Model.IsSpam ? "Unspam" : "Spam", "ToggleSpam", "Admin", new { Area = "Admin", id = Model.Id }, null) 16 | } 17 |
18 | @Html.RenderUntrusted(Model.Body, Formats.Markdown) 19 |
20 |
21 |
22 |
-------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/DisplayTemplates/Comments.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 |
3 |
4 | 5 |

6 | Comments

7 | @if (!Model.Any() && !Html.Settings().EnableDisqusCommenting) 8 | { 9 |
10 |

11 | No comments yet. Be the first!

12 |
13 | } 14 | @foreach (var comment in Model.Where(x => !x.IsSpam)) 15 | { 16 | @Html.DisplayFor(_ => comment, new {ViewBag.Entry}) 17 | } 18 |
19 |
-------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/DisplayTemplates/EntrySummaries.cshtml: -------------------------------------------------------------------------------- 1 | @model FunnelWeb.Repositories.PagedResult 2 | @if (!Model.Any()) 3 | { 4 |

No posts have been published yet.

5 | if (ViewData.IsLoggedIn()) 6 | { 7 |

8 | Use the @Html.AdminActionLink("New Post", "Edit", "WikiAdmin") link at the top of 9 | the page to create a post.

10 | } 11 | } 12 | else 13 | { 14 |
15 | @foreach (var entry in Model) 16 | { 17 | @Html.DisplayFor(x => entry) 18 | } 19 |
20 |
21 |
22 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/DisplayTemplates/FacebookLike.cshtml: -------------------------------------------------------------------------------- 1 | @using FunnelWeb.Utilities 2 | @model bool 3 | 4 | @if (Model) 5 | { 6 | 10 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/DisplayTemplates/Paginator.cshtml: -------------------------------------------------------------------------------- 1 | @model FunnelWeb.Web.Models.Paginator 2 | @if (Model.TotalPages > 1) { 3 |
4 | Page: 5 | @for (var i = 0; i < Model.TotalPages; i++) 6 | { 7 | 8 | @if (i == Model.CurrentPage) 9 | { 10 | @MvcHtmlString.Create((i + 1).ToString()) 11 | } 12 | else if (i == 0) 13 | { 14 | @Html.ActionLink((i + 1).ToString(), Model.ActionName) 15 | } 16 | else 17 | { 18 | @Html.ActionLink((i + 1).ToString(), Model.ActionName, new { pageNumber = i }) 19 | } 20 | 21 | } 22 |
23 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/DisplayTemplates/Pingbacks.cshtml: -------------------------------------------------------------------------------- 1 | @using FunnelWeb.Model.Strings 2 | @model IList 3 | 4 | @if (Model.Count > 0) 5 | { 6 |
7 |

Trackbacks

8 | 14 | @if ((int)ViewData["PingbackCount"] > Model.Count) 15 | { 16 | @Html.ActionLink(string.Format("View all {0} Trackbacks", (int)ViewData["PingbackCount"]), "Pingbacks", "Wiki", new { page = (PageName)ViewData["Name"] }, null) 17 | } 18 |
19 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/DisplayTemplates/PublishedDate.cshtml: -------------------------------------------------------------------------------- 1 | @model DateTime 2 | 3 |
4 | @Model.ToLocalTime().ToString("MMM d") 5 | @Model.ToLocalTime().ToString("yyyy") 6 |
-------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/DisplayTemplates/TagsList.cshtml: -------------------------------------------------------------------------------- 1 | @model string 2 | 3 | @foreach (var tag in (Model??"").Split(new[]{","}, StringSplitOptions.RemoveEmptyEntries)) 4 | { 5 | @Html.ActionLink(tag, "Index", "Tagged", new { tag }, new { title = "Posts tagged " + tag, @class = "tag " + @Html.CssKeywordsForTag(tag) }) 6 | } 7 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/EditorTemplates/Markdown.cshtml: -------------------------------------------------------------------------------- 1 | @model String 2 | 3 |
4 |
5 | 6 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/EditorTemplates/Tags.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | 3 | @{ 4 | @Scripts.Render("~/bundles/jquery") 5 | @Scripts.Render("~/bundles/jqueryui") 6 | @Scripts.Render("~/bundles/taggy") 7 | } 8 | 9 |
10 |
    11 | @foreach (var tag in Model) { 12 |
  • @tag.Name
  • 13 | } 14 |
  • 15 | 16 |
    17 |
  • 18 |
19 | x.Id))" name="@Html.FieldNameFor(x => Model)-Ids" /> 20 |
21 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/_Disqus.cshtml: -------------------------------------------------------------------------------- 1 | 
2 | 10 | 11 | blog comments powered by 12 | Disqus 13 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Shared/_PrivateEntryNotification.cshtml: -------------------------------------------------------------------------------- 1 | @using FunnelWeb.Model.Strings 2 | @model PageName 3 | 4 |
5 | This is a private page. Only logged in users will be able to see 6 | it. 7 | @Html.ActionLink("Edit this page ", "Edit", "WikiAdmin", new { Area = "Admin", page = Model }, new { }) 8 | to make it public. 9 |
-------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Tagged/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model IEnumerable 2 | 3 | @using System.Linq 4 | 5 |

Posts tagged with @ViewBag.Tag

6 | 7 | @if (@Model.Any()) 8 | { 9 | @Html.DisplayFor(x => Model) 10 | } 11 | else { 12 |

Aww snap! That tag isn't being used anyway

13 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Wiki/Page.cshtml: -------------------------------------------------------------------------------- 1 | @model FunnelWeb.Web.Views.Wiki.PageModel 2 | @{ 3 | ViewBag.Title = Model.Entry.MetaTitle; 4 | } 5 | 6 |
7 | @Html.RenderTrusted(Model.Entry.Body, Model.Entry.Format) 8 |
-------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Wiki/Pingbacks.cshtml: -------------------------------------------------------------------------------- 1 | @model Entry 2 | @{ 3 | ViewBag.Title = string.Format("Trackbacks for {0}", Model.MetaTitle); 4 | } 5 | 6 |

@Model.Title - Trackbacks

7 | 13 |
14 | @Html.ActionLink("Back to post", "Page", "Wiki", new{page = Model.Name}, null) -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Wiki/Recent.cshtml: -------------------------------------------------------------------------------- 1 | @model FunnelWeb.Web.Views.Wiki.RecentModel 2 | @section Meta 3 | { 4 | 5 | 6 | } 7 | @section Summary 8 | { 9 | @Html.RenderTrusted(Html.Settings().Introduction, Formats.Markdown) 10 | } 11 | 12 |

@Model.Title

13 | 14 | @Html.DisplayFor(x => x.Results) 15 | 16 | @Html.DisplayFor(x => x.Paginator) 17 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Wiki/RecentModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | using FunnelWeb.Model; 4 | using FunnelWeb.Repositories; 5 | using FunnelWeb.Web.Models; 6 | 7 | namespace FunnelWeb.Web.Views.Wiki 8 | { 9 | public class RecentModel 10 | { 11 | public RecentModel(string title, PagedResult results, string actionName) 12 | { 13 | Title = title; 14 | Results = results; 15 | ActionName = actionName; 16 | 17 | Paginator = new Paginator 18 | { 19 | ActionName = actionName, 20 | CurrentPage = Results.Page, 21 | TotalPages = Results.TotalPages 22 | }; 23 | } 24 | 25 | public string Title { get; set; } 26 | [UIHint("EntrySummaries")] 27 | public PagedResult Results { get; set; } 28 | public string ActionName { get; set; } 29 | 30 | public Paginator Paginator { get; set; } 31 | } 32 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Wiki/RevisionsModel.cs: -------------------------------------------------------------------------------- 1 | using FunnelWeb.Model; 2 | using FunnelWeb.Model.Strings; 3 | 4 | namespace FunnelWeb.Web.Views.Wiki 5 | { 6 | public class RevisionsModel 7 | { 8 | public RevisionsModel(PageName page, Entry entry) 9 | { 10 | Page = page; 11 | Entry = entry; 12 | } 13 | 14 | public PageName Page { get; set; } 15 | public Entry Entry { get; set; } 16 | } 17 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Wiki/SearchModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FunnelWeb.Model; 3 | using FunnelWeb.Repositories; 4 | 5 | namespace FunnelWeb.Web.Views.Wiki 6 | { 7 | public class SearchModel 8 | { 9 | public SearchModel(string searchText, bool is404, PagedResult results) 10 | { 11 | SearchText = searchText; 12 | Is404 = is404; 13 | Results = results; 14 | } 15 | 16 | public string SearchText { get; set; } 17 | public bool Is404 { get; set; } 18 | public PagedResult Results { get; set; } 19 | } 20 | } -------------------------------------------------------------------------------- /src/FunnelWeb.Web/Views/Wiki/SiteMap.cshtml: -------------------------------------------------------------------------------- 1 | 2 | @model FunnelWeb.Web.Views.Wiki.SiteMapModel 3 | @{ 4 | Layout = ""; 5 | } 6 | 7 | 8 | @Html.Qualify("/") 9 | @DateTime.UtcNow.ToString("yyyy-MM-dd") 10 | daily 11 | 1.0 12 | 13 | @foreach (var item in Model.Entries) { 14 | 15 | @Html.Qualify(Html.ActionUrl("Page", "Wiki", new { page = item.Name })) 16 | @item.Revised.ToString("yyyy-MM-dd") 17 | @Model.GetChangeFrequency(item) 18 | @Model.Prioritize(item).ToString("n3") 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/Microsoft.VC90.CRT/README_ENU.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/Microsoft.VC90.CRT/README_ENU.txt -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/Microsoft.VC90.CRT/msvcr90.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/Microsoft.VC90.CRT/msvcr90.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlceca40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlceca40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlcecompact40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlcecompact40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlceer40EN.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlceer40EN.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlceme40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlceme40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlceqp40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlceqp40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlcese40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/amd64/sqlcese40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/x86/Microsoft.VC90.CRT/README_ENU.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/x86/Microsoft.VC90.CRT/README_ENU.txt -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/x86/Microsoft.VC90.CRT/msvcr90.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/x86/Microsoft.VC90.CRT/msvcr90.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlceca40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlceca40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlcecompact40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlcecompact40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlceer40EN.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlceer40EN.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlceme40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlceme40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlceqp40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlceqp40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlcese40.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funnelweblog/FunnelWeb/32f561e9bf991c141edd485905a6212ba194bd91/src/FunnelWeb.Web/_bin_deployableAssemblies/x86/sqlcese40.dll -------------------------------------------------------------------------------- /src/FunnelWeb.ncrunchsolution: -------------------------------------------------------------------------------- 1 | 2 | 1 3 | False 4 | false 5 | UseDynamicAnalysis 6 | UseStaticAnalysis 7 | UseStaticAnalysis 8 | UseStaticAnalysis 9 | Run all tests automatically:BFRydWU=;Run all tests manually:BUZhbHNl;Run impacted tests automatically, others manually (experimental!):CklzSW1wYWN0ZWQ=;Run pinned tests automatically, others manually:CElzUGlubmVk 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/FunnelWeb.sln.DotSettings: -------------------------------------------------------------------------------- 1 |  2 | <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="" Suffix="" Style="AaBb_AaBb" /><ExtraRule Prefix="" Suffix="" Style="aa_bb" /></Policy> 3 | <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> 4 | <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> -------------------------------------------------------------------------------- /src/FunnelWeb/Authentication/IAuthenticator.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Authentication 2 | { 3 | public interface IAuthenticator 4 | { 5 | string GetName(); 6 | bool AuthenticateAndLogin(string username, string password); 7 | void Logout(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/FunnelWeb/Authentication/IFunnelWebMembership.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using FunnelWeb.Model.Authentication; 4 | 5 | namespace FunnelWeb.Authentication 6 | { 7 | public interface IFunnelWebMembership 8 | { 9 | bool HasAdminAccount(); 10 | User CreateAccount(string name, string email, string username, string password); 11 | IEnumerable GetUsers(); 12 | } 13 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Authentication/IRoleProvider.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Authentication 2 | { 3 | public interface IRoleProvider 4 | { 5 | bool IsUserInRole(string username, string roleName); 6 | string[] GetRolesForUser(string username); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/FunnelWeb/Authentication/Internal/FormsRoleProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Authentication.Internal 4 | { 5 | public class FormsRoleProvider : IRoleProvider 6 | { 7 | public bool IsUserInRole(string username, string roleName) 8 | { 9 | return true; 10 | } 11 | 12 | public string[] GetRolesForUser(string username) 13 | { 14 | return new[] {"Admin", "Moderator"}; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/DatabaseModule.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Autofac; 3 | 4 | namespace FunnelWeb.DatabaseDeployer 5 | { 6 | public class DatabaseModule : Module 7 | { 8 | protected override void Load(ContainerBuilder builder) 9 | { 10 | base.Load(builder); 11 | 12 | builder.RegisterType() 13 | .As() 14 | .SingleInstance(); 15 | 16 | builder 17 | .RegisterType() 18 | .As() 19 | .SingleInstance(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/IConnectionStringSettings.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.DatabaseDeployer 2 | { 3 | public interface IConnectionStringSettings 4 | { 5 | string DatabaseProvider { get; set; } 6 | string ConnectionString { get; set; } 7 | string Schema { get; set; } 8 | string ReadOnlyReason { get; } 9 | } 10 | } -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/IDatabaseUpgradeDetector.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.DatabaseDeployer 2 | { 3 | public interface IDatabaseUpgradeDetector 4 | { 5 | bool UpdateNeeded(); 6 | void Reset(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/ScriptedExtension.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using DbUp.Engine; 3 | 4 | namespace FunnelWeb.DatabaseDeployer 5 | { 6 | public class ScriptedExtension 7 | { 8 | private readonly string sourceIdentifier; 9 | private readonly Assembly sourceAssembly; 10 | private readonly IScriptProvider scriptProvider; 11 | 12 | public ScriptedExtension(string sourceIdentifier, Assembly sourceAssembly, IScriptProvider scriptProvider) 13 | { 14 | this.sourceIdentifier = sourceIdentifier; 15 | this.sourceAssembly = sourceAssembly; 16 | this.scriptProvider = scriptProvider; 17 | } 18 | 19 | public Assembly SourceAssembly 20 | { 21 | get { return sourceAssembly; } 22 | } 23 | 24 | public string SourceIdentifier 25 | { 26 | get { return sourceIdentifier; } 27 | } 28 | 29 | public IScriptProvider ScriptProvider 30 | { 31 | get { return scriptProvider; } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0001.sql: -------------------------------------------------------------------------------- 1 | create table $schema$.[SchemaVersions] ( 2 | [SchemaVersionID] int identity(1,1) not null constraint [PK_SchemaVersions_SchemaVersionID] primary key, 3 | [VersionNumber] int not null, 4 | [SourceIdentifier] nvarchar(255) not null, 5 | [ScriptName] nvarchar(255) not null, 6 | [Applied] datetime not null 7 | ) 8 | go 9 | 10 | create procedure $schema$.[GetCurrentVersionNumber] 11 | as 12 | begin 13 | select max([VersionNumber]) from $schema$.[SchemaVersions] 14 | end 15 | go 16 | 17 | create procedure $schema$.[RecordVersionUpgrade] 18 | ( 19 | @versionNumber int, 20 | @sourceIdentifier nvarchar(255), 21 | @scriptName nvarchar(255) 22 | ) 23 | as 24 | begin 25 | insert into $schema$.[SchemaVersions]([VersionNumber], [SourceIdentifier], [ScriptName], [Applied]) 26 | values (@versionNumber, @sourceIdentifier, @scriptName, getdate()) 27 | end 28 | go 29 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0001_sqlce.sql: -------------------------------------------------------------------------------- 1 | create table $schema$.[SchemaVersions] ( 2 | [SchemaVersionID] int identity(1,1) not null constraint [PK_SchemaVersions_SchemaVersionID] primary key nonclustered, 3 | [VersionNumber] int not null, 4 | [SourceIdentifier] nvarchar(255) not null, 5 | [ScriptName] nvarchar(255) not null, 6 | [Applied] datetime not null 7 | ) 8 | go 9 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0003.sql: -------------------------------------------------------------------------------- 1 | -- Initial setup data 2 | 3 | insert into $schema$.[Feed]([Name], [Title]) values ('default', 'Blog Feed'); 4 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0005.sql: -------------------------------------------------------------------------------- 1 | -- Settings and Statistics 2 | 3 | create table $schema$.[Redirect] 4 | ( 5 | [Id] int identity(1,1) not null constraint [PK_Redirect_Id] primary key, 6 | [From] nvarchar(255) not null, 7 | [To] nvarchar(255) not null 8 | ) 9 | go 10 | 11 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0006.sql: -------------------------------------------------------------------------------- 1 | -- Ability to enable/disable discussion on certain threads 2 | 3 | alter table $schema$.[Entry] 4 | add [IsDiscussionEnabled] bit not null default(1) 5 | go 6 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0007.sql: -------------------------------------------------------------------------------- 1 | -- Ability to manually set the description and keywords for META tags in the final pages 2 | 3 | alter table $schema$.[Entry] 4 | add [MetaDescription] nvarchar(500) not null default('') 5 | go 6 | 7 | alter table $schema$.[Entry] 8 | add [MetaKeywords] nvarchar(500) not null default('') 9 | go 10 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0008.sql: -------------------------------------------------------------------------------- 1 | declare @hasFullText int 2 | select @hasFullText = convert(int, SERVERPROPERTY('IsFullTextInstalled')) 3 | 4 | if (@hasFullText = 1) 5 | begin 6 | begin try 7 | exec sp_fulltext_catalog 'FTCatalog', 'create' 8 | exec sp_fulltext_table '$schema$.[Entry]', 'create', 'FTCatalog', 'PK_Entry_Id' 9 | exec sp_fulltext_column '$schema$.[Entry]', 'Name', 'add', 0x0409 10 | exec sp_fulltext_column '$schema$.[Entry]', 'Title', 'add', 0x0409 11 | exec sp_fulltext_column '$schema$.[Entry]', 'Summary', 'add', 0x0409 12 | exec sp_fulltext_column '$schema$.[Entry]', 'MetaDescription', 'add', 0x0409 13 | exec sp_fulltext_column '$schema$.[Entry]', 'MetaKeywords', 'add', 0x0409 14 | exec sp_fulltext_table '$schema$.[Entry]', 'activate' 15 | exec sp_fulltext_catalog 'FTCatalog', 'start_full' 16 | exec sp_fulltext_table '$schema$.[Entry]', 'start_change_tracking' 17 | exec sp_fulltext_table '$schema$.[Entry]', 'start_background_updateindex' 18 | end try 19 | begin catch 20 | --Full text not installed 21 | PRINT 'Full text catalog not installed' 22 | end catch 23 | end -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0008_sqlce.sql: -------------------------------------------------------------------------------- 1 | --Script 8 sets up full text index which is not supported by sql ce, need to have something in script, so leave select 1 in 2 | select 1 -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0009.sql: -------------------------------------------------------------------------------- 1 | alter table $schema$.[Entry] 2 | add [MetaTitle] nvarchar(255) not null default('') 3 | go 4 | 5 | update $schema$.[Entry] set [MetaTitle] = [Title] 6 | go 7 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0010.sql: -------------------------------------------------------------------------------- 1 | declare @hasFullText bit 2 | declare @hasFullTextIndex bit 3 | select @hasFullText = convert(int, SERVERPROPERTY('IsFullTextInstalled')) 4 | SELECT @hasFullTextIndex = OBJECTPROPERTY(OBJECT_ID('$schema$.[Entry]'), 'TableHasActiveFulltextIndex') 5 | if (@hasFullText = 1 AND @hasFullTextIndex = 1) 6 | begin 7 | begin try 8 | exec sp_fulltext_table '$schema$.[Revision]', 'create', 'FTCatalog', 'PK_Revision_Id' 9 | exec sp_fulltext_column '$schema$.[Revision]', 'Body', 'add', 0x0409 10 | exec sp_fulltext_table '$schema$.[Revision]', 'activate' 11 | exec sp_fulltext_catalog 'FTCatalog', 'start_full' 12 | exec sp_fulltext_table '$schema$.[Revision]', 'start_change_tracking' 13 | exec sp_fulltext_table '$schema$.[Revision]', 'start_background_updateindex' 14 | end try 15 | begin catch 16 | --Full text not installed 17 | PRINT 'Full text catalog not installed' 18 | end catch 19 | end 20 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0010_sqlce.sql: -------------------------------------------------------------------------------- 1 | --Script 10 works on FullTextIndex, need to have something in script, so leave select 1 in 2 | select 1 -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0011.sql: -------------------------------------------------------------------------------- 1 | create table $schema$.Pingback 2 | ( 3 | [Id] int identity(1,1) not null constraint [PK_Pingback_Id] primary key, 4 | [EntryId] int not null, 5 | [TargetUri] nvarchar(255) not null, 6 | [TargetTitle] nvarchar(255) not null, 7 | [IsSpam] bit not null 8 | ) 9 | go 10 | 11 | alter table $schema$.[Pingback] add constraint [FK_Pingback_Entry] foreign key([EntryId]) 12 | references $schema$.[Entry] ([Id]) 13 | go 14 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0012.sql: -------------------------------------------------------------------------------- 1 | insert into $schema$.[Setting]([Name], [DisplayName], [Value], [Description]) values ('spam-blacklist', 'Spam Blacklist', 'casino', 'Comments with these words (case-insensitive) will automatically be marked as spam, in addition to Akismet.'); 2 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0013.sql: -------------------------------------------------------------------------------- 1 | insert into $schema$.[Setting]([Name], [DisplayName], [Value], [Description]) values ('default-page', 'Default Page', 'blog', 'Page name: When users visit the root (/) of your site, it will be equivalent to visiting the page you specify here.'); 2 | go 3 | insert into $schema$.[Setting]([Name], [DisplayName], [Value], [Description]) values ('ui-footer', 'Footer', '

Powered by FunnelWeb, the blog engine of real developers.

', 'HTML: This will appear at the bottom of the page - use it to add copyright information, links to any web hosts, people or technologies that helped you to build the site, and so on.'); 4 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0014.sql: -------------------------------------------------------------------------------- 1 | insert into $schema$.[Setting]([Name], [DisplayName], [Value], [Description]) values ('ui-theme', 'Theme', 'Clean', 'Theme being used by the blog at the moment'); -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0015.sql: -------------------------------------------------------------------------------- 1 | alter table $schema$.[Revision] 2 | add [Format] nvarchar(20) not null default('Markdown') 3 | go 4 | 5 | alter table $schema$.[Entry] 6 | add [HideChrome] bit not null default(0) 7 | go 8 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0017.sql: -------------------------------------------------------------------------------- 1 | -- This table records the status of a long-running task 2 | create table $schema$.[TaskState] 3 | ( 4 | [Id] int identity not null constraint [PK_LongRunningTask_Id] primary key, 5 | [TaskName] nvarchar(50) not null, 6 | [Arguments] nvarchar(max) not null, 7 | [ProgressEstimate] int, 8 | [Status] nvarchar(30), 9 | [OutputLog] nvarchar(max) not null, 10 | [Started] datetime not null, 11 | [Updated] datetime not null 12 | ) 13 | go 14 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0018.sql: -------------------------------------------------------------------------------- 1 | -- Can't even remember what these columns were meant to be used for... 2 | 3 | alter table $schema$.[Entry] 4 | drop column [IsVisible] 5 | go 6 | 7 | alter table $schema$.[Revision] 8 | drop column [IsVisible] 9 | go 10 | 11 | alter table $schema$.[Revision] 12 | drop column [ChangeSummary] 13 | go 14 | 15 | alter table $schema$.[Comment] 16 | drop column [AuthorCompany] 17 | go 18 | 19 | -- 50 was a nice size, but when we import from other blog engines they may have used large URL's 20 | alter table $schema$.[Entry] 21 | alter column [Name] nvarchar(100) 22 | go 23 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0019.sql: -------------------------------------------------------------------------------- 1 | alter table $schema$.[Entry] 2 | add [PageTemplate] nvarchar(20) null 3 | go 4 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0020.sql: -------------------------------------------------------------------------------- 1 | drop procedure $schema$.[GetCurrentVersionNumber] 2 | go 3 | 4 | create procedure $schema$.[GetCurrentVersionNumber] 5 | @sourceIdentifier nvarchar(255) 6 | as 7 | begin 8 | select max(VersionNumber) from $schema$.[SchemaVersions] where [SourceIdentifier] = @sourceIdentifier 9 | end 10 | go 11 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0020_sqlce.sql: -------------------------------------------------------------------------------- 1 | --SqlCe support added after journal no longer uses procedures to keep track of scripts, don't need this script 2 | select 1 -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0021.sql: -------------------------------------------------------------------------------- 1 | --Latest Revision Id already exists, lets just extend it a little and make use of it 2 | 3 | alter table $schema$.[Entry] add 4 | [RevisionNumber] int NULL, 5 | [Body] nvarchar(max) NULL 6 | go 7 | 8 | update $schema$.[Entry] set 9 | [LatestRevisionId] = (select top 1 [Id] from $schema$.[Revision] where [EntryId] = [Entry].[Id] order by [Revised] desc), 10 | [RevisionNumber] = (select top 1 [RevisionNumber] from $schema$.[Revision] where [EntryId] = [Entry].[Id] order by [Revised] desc), 11 | [Body] = (select top 1 [Body] from $schema$.[Revision] where [EntryId] = [Entry].[Id] order by [Revised] desc) 12 | go 13 | 14 | alter table $schema$.[Entry] alter column [LatestRevisionId] int not null 15 | go 16 | alter table $schema$.[Entry] alter column [RevisionNumber] int not null 17 | go 18 | alter table $schema$.[Entry] alter column [Body] nvarchar(max) not null 19 | go 20 | 21 | alter table $schema$.[Revision] 22 | drop column [Tags] 23 | go -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0021_sqlce.sql: -------------------------------------------------------------------------------- 1 | --SqlCe support was added after this script was created, no data migration necessary 2 | 3 | alter table $schema$.[Revision] 4 | drop column [Tags] 5 | go -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0022.sql: -------------------------------------------------------------------------------- 1 | declare @hasFullText bit 2 | declare @hasFullTextIndex bit 3 | select @hasFullText = convert(int, SERVERPROPERTY('IsFullTextInstalled')) 4 | select @hasFullTextIndex = OBJECTPROPERTY(OBJECT_ID('$schema$.[Entry]'), 'TableHasActiveFulltextIndex') 5 | 6 | if (@hasFullText = 1 AND @hasFullTextIndex = 1) 7 | begin 8 | begin try 9 | exec sp_fulltext_column '$schema$.[Entry]', 'Body', 'add', 0x0409 10 | end try 11 | begin catch 12 | --Full text not installed 13 | print 'Full text catalog not installed' 14 | end catch 15 | end 16 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0022_sqlce.sql: -------------------------------------------------------------------------------- 1 | --SqlCe doesnt support full text indexes 2 | select 1 -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0024.sql: -------------------------------------------------------------------------------- 1 | alter table $schema$.[Entry] add 2 | [Author] varchar(100) null, 3 | [RevisionAuthor] varchar(100) null 4 | go 5 | alter table $schema$.[Revision] add 6 | [Author] varchar(100) null 7 | go 8 | 9 | update $schema$.[Entry] set 10 | [Author] = (select top 1 [Value] from $schema$.[Setting] where [Name] = 'search-author'), 11 | [RevisionAuthor] = (select top 1 [Value] from $schema$.[Setting] where [Name] = 'search-author') 12 | go 13 | 14 | update $schema$.[Revision] set 15 | [Author] = (select top 1 [Value] from $schema$.[Setting] where [Name] = 'search-author') 16 | go 17 | 18 | alter table $schema$.[Entry] alter column [Author] varchar(100) not null 19 | go 20 | 21 | alter table $schema$.[Entry] alter column [RevisionAuthor] varchar(100) not null 22 | go 23 | 24 | alter table $schema$.[Revision] alter column [Author] varchar(100) not null 25 | go -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0024_sqlce.sql: -------------------------------------------------------------------------------- 1 | --Script 29 will set these columns to not null (sqlce support added when script 29 was created) 2 | alter table $schema$.[Entry] add 3 | [Author] nvarchar(100) null, 4 | [RevisionAuthor] nvarchar(100) null 5 | go 6 | alter table $schema$.[Revision] add 7 | [Author] nvarchar(100) null 8 | go 9 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0025_sqlce.sql: -------------------------------------------------------------------------------- 1 | alter table $schema$.[Comment] drop constraint [FK_Comment_Comment] 2 | go 3 | 4 | create table $schema$.[Tmp_Comment] 5 | ( 6 | [Id] int NOT NULL IDENTITY (1, 1), 7 | [Body] nvarchar(MAX) NOT NULL, 8 | [AuthorName] nvarchar(100) NOT NULL, 9 | [AuthorEmail] nvarchar(100) NOT NULL, 10 | [AuthorUrl] nvarchar(100) NOT NULL, 11 | [AuthorIp] nvarchar(39) NULL, 12 | [Posted] datetime NOT NULL, 13 | [EntryId] int NOT NULL, 14 | [EntryRevisionNumber] int NULL, 15 | [Status] int NOT NULL 16 | ) 17 | go 18 | 19 | --SqlCe doesnt need data migration at this point, or fixes that are in Script25 for normal Sql 20 | 21 | drop table $schema$.[Comment] 22 | go 23 | 24 | execute sp_rename N'$schema$.Tmp_Comment', N'Comment', 'OBJECT' 25 | go 26 | 27 | 28 | alter table $schema$.[Comment] add constraint 29 | PK_Comment_Id primary key ([Id]) 30 | go 31 | 32 | alter table $schema$.[Comment] add constraint 33 | FK_Comment_Comment foreign key ([EntryId]) references $schema$.[Entry]([Id]) 34 | on update no action 35 | on delete no action 36 | go 37 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0027_sqlce.sql: -------------------------------------------------------------------------------- 1 | --Adding in a few other revision fields into entry table 2 | alter table $schema$.[Entry] add 3 | [LastRevised] datetime null, 4 | [LatestRevisionFormat] nvarchar(20) null, 5 | [TagsCommaSeparated] nvarchar(255) null 6 | go 7 | 8 | --sqlce doesnt need data migration yet 9 | 10 | update $schema$.[Entry] set [TagsCommaSeparated] = '' where [TagsCommaSeparated] is null 11 | go 12 | 13 | alter table $schema$.[Entry] alter column [LastRevised] datetime not null 14 | go 15 | alter table $schema$.[Entry] alter column [LatestRevisionFormat] nvarchar(20) not null 16 | go 17 | alter table $schema$.[Entry] alter column [TagsCommaSeparated] nvarchar(255) not null 18 | go 19 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0028.sql: -------------------------------------------------------------------------------- 1 | alter table $schema$.[Pingback] add 2 | [Received] datetime null 3 | go 4 | 5 | update $schema$.[Pingback] set 6 | [Received] = getdate() 7 | go 8 | 9 | alter table $schema$.[Pingback] alter column [Received] datetime not null 10 | go 11 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0029.sql: -------------------------------------------------------------------------------- 1 | alter table $schema$.[Entry] alter column [Author] nvarchar(100) not null 2 | go 3 | 4 | alter table $schema$.[Entry] alter column [RevisionAuthor] nvarchar(100) not null 5 | go 6 | 7 | alter table $schema$.[Revision] alter column [Author] nvarchar(100) not null 8 | go 9 | 10 | alter table $schema$.[Entry] add 11 | [CommentCount] int null 12 | go 13 | 14 | update $schema$.[Entry] set [CommentCount] = 0 15 | go 16 | -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0030.sql: -------------------------------------------------------------------------------- 1 | UPDATE $schema$.[Tag] SET Name = REPLACE(Name, ' ', '') 2 | go 3 | UPDATE $schema$.[Entry] SET [TagsCommaSeparated] = REPLACE([TagsCommaSeparated], ' ', '') 4 | go -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0031.sql: -------------------------------------------------------------------------------- 1 | insert into $schema$.[Setting]( 2 | [Name], 3 | [DisplayName], 4 | [Value], 5 | [Description] 6 | ) 7 | values ( 8 | 'enable-disqus-comments', 9 | 'Enable Disque Comments', 10 | 'False', 11 | 'Enable the Disqus commenting system. Note - this will still require the theme to also use Disqus.' 12 | ); -------------------------------------------------------------------------------- /src/FunnelWeb/DatabaseDeployer/Scripts/Script0032.sql: -------------------------------------------------------------------------------- 1 | insert into $schema$.[Setting]( 2 | [Name], 3 | [DisplayName], 4 | [Value], 5 | [Description] 6 | ) 7 | values ( 8 | 'disqus-shortname', 9 | 'Shortname for Disqus', 10 | '', 11 | 'The shortname of your Disqus comments, configured on the Disqus website.' 12 | ); -------------------------------------------------------------------------------- /src/FunnelWeb/Eventing/EventingModule.cs: -------------------------------------------------------------------------------- 1 | using Autofac; 2 | 3 | namespace FunnelWeb.Eventing 4 | { 5 | public class EventingModule : Module 6 | { 7 | protected override void Load(ContainerBuilder builder) 8 | { 9 | base.Load(builder); 10 | 11 | builder.RegisterType().As().InstancePerLifetimeScope(); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/FunnelWeb/FunnelWeb.ncrunchproject: -------------------------------------------------------------------------------- 1 | 2 | false 3 | false 4 | false 5 | true 6 | false 7 | false 8 | false 9 | false 10 | true 11 | true 12 | false 13 | true 14 | true 15 | 60000 16 | 17 | 18 | AutoDetect 19 | -------------------------------------------------------------------------------- /src/FunnelWeb/FunnelWebExtensionAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.Composition; 3 | 4 | namespace FunnelWeb 5 | { 6 | [MetadataAttribute] 7 | [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 8 | public class FunnelWebExtensionAttribute : ExportAttribute 9 | { 10 | public FunnelWebExtensionAttribute() 11 | : base(typeof(IFunnelWebExtension)) 12 | { 13 | 14 | } 15 | 16 | public string FullName { get; set; } 17 | public string SupportLink { get; set; } 18 | public string Publisher { get; set; } 19 | } 20 | } -------------------------------------------------------------------------------- /src/FunnelWeb/IFunnelWebExtension.cs: -------------------------------------------------------------------------------- 1 | using Autofac; 2 | 3 | namespace FunnelWeb 4 | { 5 | /// 6 | /// An extensibility point for FunnelWeb 7 | /// 8 | public interface IFunnelWebExtension 9 | { 10 | /// 11 | /// Initializes the extension, the Autofac container is also provided so that you can include items for DI 12 | /// 13 | /// The builder. 14 | void Initialize(ContainerBuilder builder); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/FunnelWeb/IFunnelWebExtensionMetaData.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb 2 | { 3 | public interface IFunnelWebExtensionMetaData 4 | { 5 | string FullName { get; } 6 | string SupportLink { get; } 7 | string Publisher { get; } 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb/IRequireDatabaseScripts.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb 2 | { 3 | public interface IRequireDatabaseScripts 4 | { 5 | /// 6 | /// This identifier is used to figure out which of your scripts have already been run. Once you set this, 7 | /// never, never, never change it. 8 | /// 9 | string SourceIdentifier { get; } 10 | 11 | /// 12 | /// For example FunnelWeb.Extensions.MYEXTENSION.Scripts.Script{0}.sql 13 | /// Script version will have 4 digits. 14 | /// 15 | string ScriptNameFormat { get; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Authentication/Mappings/RoleMapping.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using FluentNHibernate.Mapping; 3 | 4 | namespace FunnelWeb.Model.Authentication.Mappings 5 | { 6 | public class RoleMapping : ClassMap 7 | { 8 | public RoleMapping() 9 | { 10 | Id(x => x.Id).GeneratedBy.Identity(); 11 | Map(x => x.Name); 12 | 13 | HasManyToMany(x => x.Users) 14 | .AsBag() 15 | .Table("UserRoles") 16 | .ParentKeyColumn("RoleId") 17 | .ChildKeyColumn("UserId") 18 | .Cascade.All(); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Authentication/Mappings/UserMapping.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using FluentNHibernate.Mapping; 3 | 4 | namespace FunnelWeb.Model.Authentication.Mappings 5 | { 6 | public class UserMapping : ClassMap 7 | { 8 | public UserMapping() 9 | { 10 | Id(x => x.Id).GeneratedBy.Identity(); 11 | Map(x => x.Name); 12 | Map(x => x.Username); 13 | Map(x => x.Email); 14 | Map(x => x.Password); 15 | HasManyToMany(x => x.Roles) 16 | .AsBag() 17 | .Table("UserRoles") 18 | .ParentKeyColumn("UserId") 19 | .ChildKeyColumn("RoleId") 20 | .Inverse() 21 | .Cascade.None(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Authentication/Role.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace FunnelWeb.Model.Authentication 5 | { 6 | public class Role 7 | { 8 | public virtual int Id { get; protected set; } 9 | public virtual string Name { get; set; } 10 | public virtual IList Users { get; protected set; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Authentication/User.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace FunnelWeb.Model.Authentication 5 | { 6 | public class User 7 | { 8 | public User() 9 | { 10 | Roles = new List(); 11 | } 12 | 13 | public virtual int Id { get; protected set; } 14 | public virtual string Name { get; set; } 15 | public virtual string Email { get; set; } 16 | public virtual string Username { get; set; } 17 | public virtual string Password { get; set; } 18 | public virtual IList Roles { get; protected set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Comment.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Model 4 | { 5 | public class Comment 6 | { 7 | public virtual int Id { get; set; } 8 | 9 | public virtual string Body { get; set; } 10 | public virtual string AuthorName { get; set; } 11 | public virtual string AuthorUrl { get; set; } 12 | public virtual string AuthorEmail { get; set; } 13 | public virtual string AuthorIp { get; set; } 14 | public virtual Entry Entry { get; set; } 15 | public virtual DateTime Posted { get; set; } 16 | public virtual int Status { get; set; } 17 | public virtual int EntryRevisionNumber { get; set; } 18 | 19 | public virtual bool IsSpam 20 | { 21 | get { return Status == 0; } 22 | set { Status = value ? 0 : 1; } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/EntryStatus.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Model 2 | { 3 | public static class EntryStatus 4 | { 5 | public static readonly string All = "All"; 6 | public static readonly string Private = "Private"; 7 | public static readonly string PublicBlog = "Public-Blog"; 8 | public static readonly string PublicPage = "Public-Page"; 9 | } 10 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Model/EntrySummary.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | using FunnelWeb.Model.Strings; 4 | 5 | namespace FunnelWeb.Model 6 | { 7 | public class EntrySummary 8 | { 9 | public virtual int Id { get; set; } 10 | 11 | public virtual PageName Name { get; set; } 12 | public virtual string Title { get; set; } 13 | 14 | [DataType("Markdown")] 15 | public virtual string Summary { get; set; } 16 | 17 | public virtual string Status { get; set; } 18 | 19 | public virtual int CommentCount { get; set; } 20 | public virtual string MetaDescription { get; set; } 21 | [DataType("PublishedDate")] 22 | public virtual DateTime Published { get; set; } 23 | public virtual DateTime LastRevised { get; set; } 24 | 25 | [DataType("TagsList")] 26 | public virtual string TagsCommaSeparated { get; set; } 27 | 28 | } 29 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Model/FileItem.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Model 2 | { 3 | public class FileItem 4 | { 5 | public string Image { get; set; } 6 | public string Name { get; set; } 7 | public string Path { get; set; } 8 | public bool IsDirectory { get; set; } 9 | public string Extension { get; set; } 10 | public string FileSize { get; set; } 11 | public string Modified { get; set; } 12 | public bool IsPathAbsolute { get; set; } 13 | } 14 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Formats.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Model 2 | { 3 | public static class Formats 4 | { 5 | public static readonly string Markdown = "Markdown"; 6 | public static readonly string Html = "Html"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Mappings/CommentMapping.cs: -------------------------------------------------------------------------------- 1 | using FluentNHibernate.Mapping; 2 | 3 | namespace FunnelWeb.Model.Mappings 4 | { 5 | public class CommentMapping : ClassMap 6 | { 7 | public CommentMapping() 8 | { 9 | Id(x => x.Id); 10 | Map(x => x.AuthorEmail); 11 | Map(x => x.AuthorName); 12 | Map(x => x.AuthorUrl); 13 | Map(x => x.Body); 14 | Map(x => x.Status); 15 | Map(x => x.Posted); 16 | Map(x => x.AuthorIp); 17 | Map(x => x.EntryRevisionNumber); 18 | 19 | References(x => x.Entry, "EntryId"); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Mappings/PingbackMapping.cs: -------------------------------------------------------------------------------- 1 | using FluentNHibernate.Mapping; 2 | 3 | namespace FunnelWeb.Model.Mappings 4 | { 5 | public class PingbackMapping : ClassMap 6 | { 7 | public PingbackMapping() 8 | { 9 | Id(x => x.Id); 10 | Map(x => x.IsSpam); 11 | Map(x => x.TargetTitle); 12 | Map(x => x.TargetUri); 13 | Map(x => x.Received); 14 | References(x => x.Entry, "EntryId"); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Mappings/RedirectMapping.cs: -------------------------------------------------------------------------------- 1 | using FluentNHibernate.Mapping; 2 | 3 | namespace FunnelWeb.Model.Mappings 4 | { 5 | public class RedirectMapping : ClassMap 6 | { 7 | public RedirectMapping() 8 | { 9 | Id(x => x.Id); 10 | Map(x => x.From, "[From]"); 11 | Map(x => x.To, "[To]"); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Mappings/RevisionFilter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using FluentNHibernate.Mapping; 4 | 5 | namespace FunnelWeb.Model.Mappings 6 | { 7 | public class RevisionFilter : FilterDefinition 8 | { 9 | public RevisionFilter() 10 | { 11 | WithName("RevisionFilter") 12 | .AddParameter("revisionNumber", NHibernate.NHibernateUtil.Int32); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Mappings/RevisionMapping.cs: -------------------------------------------------------------------------------- 1 | using FluentNHibernate.Mapping; 2 | 3 | namespace FunnelWeb.Model.Mappings 4 | { 5 | public class RevisionMapping : ClassMap 6 | { 7 | public RevisionMapping() 8 | { 9 | Id(x => x.Id); 10 | Map(x => x.Body).Length(int.MaxValue); 11 | Map(x => x.Reason); 12 | Map(x => x.Revised); 13 | Map(x => x.RevisionNumber); 14 | Map(x => x.Status); 15 | Map(x => x.Format); 16 | Map(x => x.Author); 17 | References(x => x.Entry, "EntryId"); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Mappings/SettingMapping.cs: -------------------------------------------------------------------------------- 1 | using FluentNHibernate.Mapping; 2 | using FunnelWeb.Model.Mappings.UserTypes; 3 | 4 | namespace FunnelWeb.Model.Mappings 5 | { 6 | public class SettingMapping : ClassMap 7 | { 8 | public SettingMapping() 9 | { 10 | Id(x => x.Id); 11 | Map(x => x.Description); 12 | Map(x => x.DisplayName); 13 | Map(x => x.Name).CustomType(); 14 | Map(x => x.Value); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Mappings/TagMapping.cs: -------------------------------------------------------------------------------- 1 | using FluentNHibernate.Mapping; 2 | 3 | namespace FunnelWeb.Model.Mappings 4 | { 5 | public class TagMapping : ClassMap 6 | { 7 | public TagMapping() 8 | { 9 | Id(x => x.Id); 10 | Map(x => x.Name); 11 | HasManyToMany(x => x.Entries) 12 | .Table("TagItem") 13 | .ParentKeyColumn("TagId") 14 | .ChildKeyColumn("EntryId") 15 | .Inverse() 16 | .LazyLoad(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Mappings/TaskStateMapping.cs: -------------------------------------------------------------------------------- 1 | using FluentNHibernate.Mapping; 2 | 3 | namespace FunnelWeb.Model.Mappings 4 | { 5 | public class TaskStateMapping : ClassMap 6 | { 7 | public TaskStateMapping() 8 | { 9 | Id(x => x.Id); 10 | Map(x => x.TaskName); 11 | Map(x => x.Status); 12 | Map(x => x.Started); 13 | Map(x => x.ProgressEstimate); 14 | Map(x => x.OutputLog); 15 | Map(x => x.Updated); 16 | Map(x => x.Arguments); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Pingback.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Model 4 | { 5 | public class Pingback 6 | { 7 | public virtual int Id { get; protected set; } 8 | public virtual Entry Entry { get; set; } 9 | public virtual string TargetUri { get; set; } 10 | public virtual string TargetTitle { get; set; } 11 | public virtual bool IsSpam { get; set; } 12 | public virtual DateTime Received { get; set; } 13 | } 14 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Redirect.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Model 2 | { 3 | public class Redirect 4 | { 5 | public virtual int Id { get; set; } 6 | public virtual string From { get; set; } 7 | public virtual string To { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Repositories/IAdminRepository.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using System.Collections.Generic; 3 | 4 | namespace FunnelWeb.Model.Repositories 5 | { 6 | public interface IAdminRepository 7 | { 8 | IQueryable GetSettings(); 9 | 10 | void Save(IEnumerable settings); 11 | void UpdateCommentCountFor(int entryId); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Repositories/ITaskStateRepository.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | 3 | namespace FunnelWeb.Model.Repositories 4 | { 5 | public interface ITaskStateRepository 6 | { 7 | TaskState Get(int id); 8 | IQueryable GetAll(); 9 | void Save(TaskState state); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Repositories/Internal/TaskStateRepository.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using NHibernate; 3 | using NHibernate.Linq; 4 | 5 | namespace FunnelWeb.Model.Repositories.Internal 6 | { 7 | public class TaskStateRepository : ITaskStateRepository 8 | { 9 | private readonly ISession session; 10 | 11 | public TaskStateRepository(ISession session) 12 | { 13 | this.session = session; 14 | } 15 | 16 | public TaskState Get(int id) 17 | { 18 | return session.Load(id); 19 | } 20 | 21 | public IQueryable GetAll() 22 | { 23 | return session.Query(); 24 | } 25 | 26 | public void Save(TaskState state) 27 | { 28 | session.SaveOrUpdate(state); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Setting.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using FunnelWeb.Model.Strings; 3 | 4 | namespace FunnelWeb.Model 5 | { 6 | public class Setting 7 | { 8 | public virtual int Id { get; set; } 9 | public virtual PageName Name { get; set; } 10 | public virtual string DisplayName { get; set; } 11 | public virtual string Description { get; set; } 12 | public virtual string Value { get; set; } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/FunnelWeb/Model/Strings/EnforcedStringLengthAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | 4 | namespace FunnelWeb.Model.Strings 5 | { 6 | /// 7 | /// StringLength does a explicit cast to string, so it will not work with FunnelWeb's EnforcedString class 8 | /// 9 | [AttributeUsage(AttributeTargets.Property)] 10 | public class EnforcedStringLengthAttribute : StringLengthAttribute 11 | { 12 | public EnforcedStringLengthAttribute(int maximumLength) : base(maximumLength) 13 | { 14 | } 15 | 16 | public override bool IsValid(object value) 17 | { 18 | var enforcedString = (EnforcedString)value; 19 | 20 | return base.IsValid(enforcedString.ToString()); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Model/TaskStatus.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Model 2 | { 3 | public enum TaskStatus 4 | { 5 | Running = 1, 6 | Failed = 2, 7 | Success = 3 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Mvc/HintSize.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Mvc 4 | { 5 | public enum HintSize 6 | { 7 | Small, 8 | Medium, 9 | Large 10 | } 11 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Mvc/HintSizeAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Mvc 4 | { 5 | [AttributeUsage(AttributeTargets.Property)] 6 | public class HintSizeAttribute : Attribute 7 | { 8 | public HintSizeAttribute(HintSize size) 9 | { 10 | Size = size; 11 | } 12 | 13 | public HintSize Size { get; private set; } 14 | } 15 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | 3 | [assembly: AssemblyTitle("FunnelWeb")] 4 | [assembly: AssemblyDescription("Code domain model, repositories and extensbility support for FunnelWeb")] -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/Database/Sql/ProfiledClientBatchingBatcherFactory.cs: -------------------------------------------------------------------------------- 1 | using NHibernate; 2 | using NHibernate.AdoNet; 3 | using NHibernate.Engine; 4 | 5 | namespace FunnelWeb.Providers.Database.Sql 6 | { 7 | public class ProfiledClientBatchingBatcherFactory : IBatcherFactory 8 | { 9 | public virtual IBatcher CreateBatcher(ConnectionManager connectionManager, IInterceptor interceptor) 10 | { 11 | return new ProfiledSqlClientBatchingBatcher(connectionManager, interceptor); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/Database/Sql/ProfiledSqlClientBatchingBatcherFactory.cs: -------------------------------------------------------------------------------- 1 | using NHibernate; 2 | using NHibernate.AdoNet; 3 | using NHibernate.Engine; 4 | 5 | namespace FunnelWeb.Providers.Database.Sql 6 | { 7 | public class ProfiledSqlClientBatchingBatcherFactory : IBatcherFactory 8 | { 9 | public virtual IBatcher CreateBatcher(ConnectionManager connectionManager, IInterceptor interceptor) 10 | { 11 | return new ProfiledSqlClientBatchingBatcher(connectionManager, interceptor); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/Database/Sql/ProfiledSqlClientDriver.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Data; 3 | using System.Data.SqlClient; 4 | using NHibernate.AdoNet; 5 | using NHibernate.Driver; 6 | using StackExchange.Profiling; 7 | 8 | namespace FunnelWeb.Providers.Database.Sql 9 | { 10 | public class ProfiledSqlClientDriver : Sql2008ClientDriver, IEmbeddedBatcherFactoryProvider 11 | { 12 | public override IDbConnection CreateConnection() 13 | { 14 | return new ProfiledSqlDbConnection( 15 | new SqlConnection(), 16 | MiniProfiler.Current); 17 | } 18 | 19 | public override IDbCommand CreateCommand() 20 | { 21 | return new ProfiledSqlDbCommand( 22 | new SqlCommand(), 23 | null, 24 | MiniProfiler.Current); 25 | } 26 | 27 | Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass 28 | { 29 | get { return typeof(ProfiledClientBatchingBatcherFactory); } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/Database/Sql/ProfiledSqlDbCommand.cs: -------------------------------------------------------------------------------- 1 | using System.Data.Common; 2 | using System.Data.SqlClient; 3 | using StackExchange.Profiling; 4 | using StackExchange.Profiling.Data; 5 | 6 | namespace FunnelWeb.Providers.Database.Sql 7 | { 8 | public class ProfiledSqlDbCommand : ProfiledDbCommand 9 | { 10 | public ProfiledSqlDbCommand(SqlCommand cmd, DbConnection conn, MiniProfiler profiler) 11 | : base(cmd, conn, profiler) 12 | { 13 | Command = cmd; 14 | } 15 | 16 | public SqlCommand Command { get; set; } 17 | 18 | private DbTransaction trans; 19 | 20 | protected override DbTransaction DbTransaction 21 | { 22 | get { return trans; } 23 | set 24 | { 25 | trans = value; 26 | var profiledSqlDbTransaction = value as ProfiledSqlDbTransaction; 27 | Command.Transaction = profiledSqlDbTransaction == null ? (SqlTransaction)value : profiledSqlDbTransaction.Transaction; 28 | } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/Database/Sql/ProfiledSqlDbConnection.cs: -------------------------------------------------------------------------------- 1 | using System.Data; 2 | using System.Data.Common; 3 | using System.Data.SqlClient; 4 | using StackExchange.Profiling; 5 | using StackExchange.Profiling.Data; 6 | 7 | namespace FunnelWeb.Providers.Database.Sql 8 | { 9 | public class ProfiledSqlDbConnection : ProfiledDbConnection 10 | { 11 | public ProfiledSqlDbConnection(SqlConnection connection, MiniProfiler profiler) 12 | : base(connection, profiler) 13 | { 14 | Connection = connection; 15 | } 16 | 17 | public SqlConnection Connection { get; set; } 18 | 19 | protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) 20 | { 21 | return new ProfiledSqlDbTransaction(Connection.BeginTransaction(isolationLevel), this); 22 | } 23 | 24 | } 25 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/Database/Sql/ProfiledSqlDbTransaction.cs: -------------------------------------------------------------------------------- 1 | using System.Data.SqlClient; 2 | using StackExchange.Profiling.Data; 3 | 4 | namespace FunnelWeb.Providers.Database.Sql 5 | { 6 | public class ProfiledSqlDbTransaction : ProfiledDbTransaction 7 | { 8 | public ProfiledSqlDbTransaction(SqlTransaction transaction, ProfiledDbConnection connection) 9 | : base(transaction, connection) 10 | { 11 | Transaction = transaction; 12 | } 13 | 14 | public SqlTransaction Transaction { get; set; } 15 | } 16 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/Database/SqlCe/FunnelWebCe40Dialect.cs: -------------------------------------------------------------------------------- 1 | using NHibernate; 2 | using NHibernate.Dialect; 3 | using NHibernate.Dialect.Function; 4 | 5 | namespace FunnelWeb.Providers.Database.SqlCe 6 | { 7 | public class FunnelWebMsSqlCe40Dialect : MsSqlCe40Dialect 8 | { 9 | public FunnelWebMsSqlCe40Dialect() 10 | { 11 | RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")")); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/Database/SqlCe/FunnelWebSqlServerCeDriver.cs: -------------------------------------------------------------------------------- 1 | using System.Data; 2 | using System.Data.SqlServerCe; 3 | using NHibernate.Driver; 4 | using NHibernate.SqlTypes; 5 | 6 | namespace FunnelWeb.Providers.Database.SqlCe 7 | { 8 | 9 | /// 10 | /// Overridden Nhibernate SQL CE Driver, 11 | /// so that ntext fields are not truncated at 4000 characters 12 | /// 13 | public class FunnelWebSqlServerCeDriver : SqlServerCeDriver 14 | { 15 | protected override void InitializeParameter(IDbDataParameter dbParam,string name,SqlType sqlType) 16 | { 17 | base.InitializeParameter(dbParam, name, sqlType); 18 | 19 | var stringType = sqlType as StringSqlType; 20 | if (stringType != null && stringType.LengthDefined && stringType.Length > 4000) 21 | { 22 | var parameter = (SqlCeParameter)dbParam; 23 | parameter.SqlDbType = SqlDbType.NText; 24 | } 25 | 26 | } 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/File/IFileRepository.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Web.Mvc; 3 | using FunnelWeb.Model; 4 | 5 | namespace FunnelWeb.Providers.File 6 | { 7 | public interface IFileRepository 8 | { 9 | bool IsFile(string path); 10 | FileItem[] GetItems(string path); 11 | 12 | void Move(string oldPath, string newPath); 13 | void Delete(string filePath); 14 | 15 | void CreateDirectory(string path, string name); 16 | void Save(Stream inputStream, string path, bool unzip); 17 | ActionResult Render(string path); 18 | } 19 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/IProviderInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FunnelWeb.Providers 4 | { 5 | public interface IProviderInfo 6 | { 7 | IEnumerable Keys { get; } 8 | T GetProviderByName(string key); 9 | IProviderMetadata GetMetaData(string key); 10 | } 11 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Providers/ProviderMetaData.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Providers 2 | { 3 | public interface IProviderMetadata 4 | { 5 | string Name { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/Alias.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Repositories 4 | { 5 | public static class Alias 6 | { 7 | public static T For() 8 | { 9 | return default(T); 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/EntriesSortColumn.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Repositories 4 | { 5 | public enum EntriesSortColumn 6 | { 7 | Slug, 8 | Title, 9 | Comments, 10 | Published 11 | } 12 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/Filters.cs: -------------------------------------------------------------------------------- 1 | using FunnelWeb.Model; 2 | using NHibernate; 3 | 4 | namespace FunnelWeb.Repositories 5 | { 6 | public static class Filters 7 | { 8 | public static IQueryOver ApplyEntryStatusFilter(this IQueryOver query, string entryStatus) 9 | { 10 | if (entryStatus != EntryStatus.All) 11 | { 12 | if (entryStatus == null) 13 | query.Where(e => e.Status != EntryStatus.Private); 14 | else 15 | query.Where(e => e.Status == entryStatus); 16 | } 17 | 18 | return query; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/ICommand.cs: -------------------------------------------------------------------------------- 1 | using NHibernate; 2 | 3 | namespace FunnelWeb.Repositories 4 | { 5 | public interface ICommand 6 | { 7 | void Execute(ISession session); 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/IPagedQuery.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using FunnelWeb.Providers.Database; 3 | using NHibernate; 4 | 5 | namespace FunnelWeb.Repositories 6 | { 7 | public interface IPagedQuery 8 | { 9 | PagedResult Execute(ISession session, IDatabaseProvider databaseProvider, int skip, int take); 10 | } 11 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/IQuery.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FunnelWeb.Providers.Database; 3 | using NHibernate; 4 | 5 | namespace FunnelWeb.Repositories 6 | { 7 | public interface IQuery 8 | { 9 | IEnumerable Execute(ISession session, IDatabaseProvider databaseProvider); 10 | } 11 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/IRepository.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FunnelWeb.Repositories 4 | { 5 | public interface IRepository 6 | { 7 | TEntity Get(object id); 8 | IEnumerable FindAll() where TEntity : class; 9 | IEnumerable Find(IQuery query) where TEntity : class; 10 | PagedResult Find(IPagedQuery query, int pageNumber, int itemsPerPage) where TEntity : class; 11 | TEntity FindFirst(IQuery query) where TEntity : class; 12 | TEntity FindFirstOrDefault(IQuery query) where TEntity : class; 13 | TEntity FindFirstOrDefault(IPagedQuery query) where TEntity : class; 14 | void Execute(ICommand command); 15 | void Add(object entity); 16 | void Remove(object entity); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/Queries/GetAllCommentsQuery.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using FunnelWeb.Model; 3 | using FunnelWeb.Providers.Database; 4 | using NHibernate; 5 | using NHibernate.Criterion; 6 | 7 | namespace FunnelWeb.Repositories.Queries 8 | { 9 | public class GetAllCommentsQuery : IPagedQuery 10 | { 11 | public PagedResult Execute(ISession session, IDatabaseProvider databaseProvider, int skip, int take) 12 | { 13 | var total = session 14 | .QueryOver() 15 | .ToRowCountQuery() 16 | .FutureValue(); 17 | 18 | var results = session 19 | .QueryOver() 20 | .Fetch(x => x.Entry).Eager() 21 | .OrderBy(x => x.Posted).Desc() 22 | .Skip(skip) 23 | .Take(take) 24 | .List(); 25 | 26 | return new PagedResult(results, total.Value, skip, take); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/Queries/GetCommentsQuery.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using FunnelWeb.Model; 3 | using FunnelWeb.Providers.Database; 4 | using NHibernate; 5 | using NHibernate.Criterion; 6 | 7 | namespace FunnelWeb.Repositories.Queries 8 | { 9 | public class GetCommentsQuery : IPagedQuery 10 | { 11 | public PagedResult Execute(ISession session, IDatabaseProvider databaseProvider, int skip, int take) 12 | { 13 | var total = session 14 | .QueryOver() 15 | .ToRowCountQuery() 16 | .FutureValue(); 17 | 18 | var results = session 19 | .QueryOver() 20 | .Fetch(x => x.Entry).Eager() 21 | .OrderBy(x => x.Posted).Desc() 22 | .Where(x => x.Status != 0) 23 | .Skip(skip) 24 | .Take(take) 25 | .List(); 26 | 27 | return new PagedResult(results, total.Value, skip, take); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/Queries/GetEntryWithPingbacksQuery.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using FunnelWeb.Model; 4 | using FunnelWeb.Providers.Database; 5 | using NHibernate; 6 | 7 | namespace FunnelWeb.Repositories.Queries 8 | { 9 | public class GetEntryWithPingbacksQuery : IQuery 10 | { 11 | private readonly string name; 12 | 13 | public GetEntryWithPingbacksQuery(string name) 14 | { 15 | this.name = name; 16 | } 17 | 18 | public IEnumerable Execute(ISession session, IDatabaseProvider databaseProvider) 19 | { 20 | return session 21 | .QueryOver() 22 | .Where(e => e.Name == name) 23 | .JoinQueryOver(p => p.Pingbacks) 24 | .List(); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/Queries/GetSpamQuery.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using FunnelWeb.Model; 4 | using FunnelWeb.Providers.Database; 5 | using NHibernate; 6 | using NHibernate.Linq; 7 | 8 | namespace FunnelWeb.Repositories.Queries 9 | { 10 | public class GetSpamQuery : IQuery 11 | { 12 | public IEnumerable Execute(ISession session, IDatabaseProvider databaseProvider) 13 | { 14 | return session 15 | .Query() 16 | .Where(x => x.Status == 0); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Repositories/Queries/SearchTagsByNameQuery.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using FunnelWeb.Model; 4 | using FunnelWeb.Providers.Database; 5 | using NHibernate; 6 | using NHibernate.Criterion; 7 | 8 | namespace FunnelWeb.Repositories.Queries 9 | { 10 | public class SearchTagsByNameQuery :IQuery 11 | { 12 | private readonly string tagName; 13 | 14 | public SearchTagsByNameQuery(string tagName) 15 | { 16 | this.tagName = tagName; 17 | } 18 | 19 | public string TagName 20 | { 21 | get { return tagName; } 22 | } 23 | 24 | public IEnumerable Execute(ISession session, IDatabaseProvider databaseProvider) 25 | { 26 | return session 27 | .QueryOver() 28 | .WhereRestrictionOn(tag => tag.Name).IsLike(TagName, MatchMode.Anywhere) 29 | .List(); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/FunnelWeb/Settings/AppHarborSettings.cs: -------------------------------------------------------------------------------- 1 | using System.Configuration; 2 | using System.Web.Configuration; 3 | 4 | namespace FunnelWeb.Settings 5 | { 6 | public class AppHarborSettings : IAppHarborSettings 7 | { 8 | public string SqlServerConnectionString 9 | { 10 | get 11 | { 12 | var apphbConnectionString = ConfigurationManager.AppSettings["SQLSERVER_CONNECTION_STRING"]; 13 | 14 | if (string.IsNullOrWhiteSpace(apphbConnectionString)) 15 | return null; 16 | 17 | return apphbConnectionString; 18 | } 19 | set 20 | { 21 | var config = WebConfigurationManager.OpenWebConfiguration("~"); 22 | config.AppSettings.Settings["SQLSERVER_CONNECTION_STRING"].Value = value; 23 | config.Save(ConfigurationSaveMode.Modified); 24 | ConfigurationManager.RefreshSection("appSettings"); 25 | } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Settings/IAppHarborSettings.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Settings 2 | { 3 | public interface IAppHarborSettings 4 | { 5 | string SqlServerConnectionString { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Settings/ISettings.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Settings 2 | { 3 | public interface ISettings 4 | { 5 | } 6 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Settings/ISettingsProvider.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Settings 2 | { 3 | public interface ISettingsProvider 4 | { 5 | T GetSettings() where T : ISettings; 6 | T GetDefaultSettings() where T : ISettings; 7 | void SaveSettings(T settings) where T : ISettings; 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Settings/SettingStorageAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FunnelWeb.Settings 4 | { 5 | [AttributeUsage(AttributeTargets.Property)] 6 | public class SettingStorageAttribute : Attribute 7 | { 8 | private readonly StorageLocation location; 9 | private readonly string key; 10 | 11 | public SettingStorageAttribute(StorageLocation location) : this(location, null) 12 | { 13 | } 14 | 15 | public SettingStorageAttribute(StorageLocation location, string key) 16 | { 17 | this.location = location; 18 | this.key = key; 19 | } 20 | 21 | public StorageLocation Location 22 | { 23 | get { return location; } 24 | } 25 | 26 | public string Key 27 | { 28 | get { return key; } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Settings/SqlAuthenticationSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | 4 | namespace FunnelWeb.Settings 5 | { 6 | public class SqlAuthSettings : ISettings 7 | { 8 | [DisplayName("Sql Authentication Enabled")] 9 | [DefaultValue(false)] 10 | [Description("True if sql authentication is enabled")] 11 | [SettingStorage(StorageLocation.Database, "sql-authentication")] 12 | public bool SqlAuthenticationEnabled { get; set; } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/FunnelWeb/Settings/StorageLocation.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Settings 2 | { 3 | public enum StorageLocation 4 | { 5 | Database 6 | } 7 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Tasks/ITask.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FunnelWeb.Tasks 4 | { 5 | public interface ITask 6 | { 7 | IEnumerable Execute(Dictionary properties); 8 | } 9 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Tasks/ITaskExecutor.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Tasks 2 | { 3 | public interface ITaskExecutor where TTask : ITask 4 | { 5 | int Execute(object arguments); 6 | } 7 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Tasks/TaskModule.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Autofac; 3 | 4 | namespace FunnelWeb.Tasks 5 | { 6 | public class TasksModule : Module 7 | { 8 | protected override void Load(ContainerBuilder builder) 9 | { 10 | base.Load(builder); 11 | 12 | builder.RegisterAssemblyTypes(typeof (TasksModule).Assembly) 13 | .AssignableTo() 14 | .InstancePerDependency(); 15 | 16 | builder.RegisterGeneric(typeof (TaskExecutor<>)).As(typeof (ITaskExecutor<>)) 17 | .SingleInstance(); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Tasks/TaskStep.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Tasks 2 | { 3 | public class TaskStep 4 | { 5 | private readonly int? progressEstimate; 6 | private readonly string logMessage; 7 | 8 | public TaskStep(string logMessageFormat, params object[] args) : this(null, logMessageFormat, args) 9 | { 10 | } 11 | 12 | public TaskStep(int? progressEstimate, string logMessageFormat, params object[] args) 13 | { 14 | this.progressEstimate = progressEstimate; 15 | logMessage = string.Format(logMessageFormat, args); 16 | } 17 | 18 | public int? ProgressEstimate 19 | { 20 | get { return progressEstimate; } 21 | } 22 | 23 | public string LogMessage 24 | { 25 | get { return logMessage; } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /src/FunnelWeb/Utilities/IMimeTypeLookup.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Utilities 2 | { 3 | public interface IMimeTypeLookup 4 | { 5 | string GetMimeType(string fileNameOrPathWithExtension); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/FunnelWeb/Utilities/NumericExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace FunnelWeb.Utilities 2 | { 3 | public static class NumericExtensions 4 | { 5 | private const long Kilobyte = 1024; 6 | private const long Megabyte = 1024 * Kilobyte; 7 | private const long Gigabyte = 1024 * Megabyte; 8 | private const long Terabyte = 1024 * Gigabyte; 9 | 10 | public static string ToFileSizeString(this long bytes) 11 | { 12 | if (bytes > Terabyte) return (bytes / Terabyte).ToString("0.00 TB"); 13 | if (bytes > Gigabyte) return (bytes / Gigabyte).ToString("0.00 GB"); 14 | if (bytes > Megabyte) return (bytes / Megabyte).ToString("0.00 MB"); 15 | if (bytes > Kilobyte) return (bytes / Kilobyte).ToString("0.00 KB"); 16 | return bytes + " bytes"; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/FunnelWeb/Utilities/StringExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | 3 | namespace FunnelWeb.Utilities 4 | { 5 | public static class StringExtensions 6 | { 7 | public static string Slugify(this string value) 8 | { 9 | // http://stackoverflow.com/questions/2920744/url-slugify-alrogithm-in-c 10 | 11 | var bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(value); 12 | value = System.Text.Encoding.ASCII.GetString(bytes).ToLower(); 13 | 14 | //// invalid chars 15 | value = Regex.Replace(value, @"[^a-z0-9\s-]", ""); 16 | //// convert multiple spaces into one space 17 | value = Regex.Replace(value, @"\s+", " ").Trim(); 18 | //// cut and trim 19 | value = value.Substring(0, value.Length <= 45 ? value.Length : 45).Trim(); 20 | value = Regex.Replace(value, @"\s", "-"); // hyphens 21 | return value; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/FunnelWeb/app.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/Information/SolutionInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | [assembly: AssemblyConfiguration("")] 5 | [assembly: AssemblyCompany("FunnelWeb")] 6 | [assembly: AssemblyProduct("FunnelWeb")] 7 | [assembly: AssemblyCopyright("Copyright © FunnelWeb Contributors 2010")] 8 | [assembly: ComVisible(false)] 9 | -------------------------------------------------------------------------------- /src/Information/VersionInfo.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.18010 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Reflection; 13 | using System.Runtime.CompilerServices; 14 | using System.Runtime.InteropServices; 15 | 16 | [assembly: AssemblyVersion("2.3.0.0")] 17 | [assembly: AssemblyFileVersion("2.3.0.0")] 18 | 19 | 20 | --------------------------------------------------------------------------------