j1_template_mde 2018.4.11 → 2018.4.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/_includes/themes/j1/layouts/content_generator_blog_archive.html +117 -110
- data/_includes/themes/j1/modules/navigator/generator.html +2 -2
- data/_includes/themes/j1/modules/navigator/procedures/sidebar.proc +88 -9
- data/_includes/themes/j1/procedures/collections/create_collection_article_preview.proc +5 -4
- data/_includes/themes/j1/procedures/global/get_page_path.proc +5 -3
- data/lib/j1/commands/generate.rb +3 -3
- data/lib/j1/version.rb +1 -1
- data/lib/j1_app/j1_auth_manager/auth_manager.rb +417 -78
- data/lib/j1_app/j1_auth_manager/config.rb +47 -0
- data/lib/j1_app/j1_auth_manager/helpers.rb +15 -11
- data/lib/j1_app/j1_auth_manager/views/_unused/iframe.erb +29 -0
- data/lib/j1_app/j1_auth_manager/views/_unused/modal_page.erb +136 -0
- data/lib/j1_app/j1_auth_manager/views/auth_manager_ui.erb +144 -0
- data/lib/j1_app/j1_auth_manager/warden_omniauth.rb +8 -6
- data/lib/j1_app/omniauth/strategies/disqus.rb +7 -7
- data/lib/j1_app/omniauth/strategies/facebook.rb +1 -1
- data/lib/j1_app/omniauth/strategies/github.rb +7 -7
- data/lib/j1_app/omniauth/strategies/patreon.rb +5 -4
- data/lib/j1_app/omniauth/strategies/twitter.rb +1 -1
- data/lib/starter_web/Gemfile +2 -2
- data/lib/starter_web/_config.yml +27 -19
- data/lib/starter_web/_data/modules/_unused/j1_navigator.yml +4 -4
- data/lib/starter_web/_data/modules/_unused/j1_navigator_menu.yml +24 -24
- data/lib/starter_web/_data/modules/j1_banner.yml +2 -2
- data/lib/starter_web/_data/modules/j1_cookiebar.yml +2 -2
- data/lib/starter_web/_data/modules/j1_footer.yml +4 -4
- data/lib/starter_web/_data/modules/j1_navigator.yml +18 -17
- data/lib/starter_web/_data/modules/j1_navigator_menu.yml +37 -64
- data/lib/starter_web/_data/modules/j1_panel.yml +15 -15
- data/lib/starter_web/_data/modules/j1_theme_switcher.yml +7 -7
- data/lib/starter_web/_rack/dot.gitignore +8 -6
- data/lib/starter_web/assets/images/master_header/aaron-burden-1280x600.png +0 -0
- data/lib/starter_web/assets/images/master_header/admin-dashboard-bootstrap.1280x600.png +0 -0
- data/lib/starter_web/assets/images/master_header/chuttersnap-1280x800.png +0 -0
- data/lib/starter_web/assets/images/master_header/clark-tibbs-do-something.1280x600.png +0 -0
- data/lib/starter_web/assets/images/master_header/clark-tibbs-do-something.1920x900.png +0 -0
- data/lib/starter_web/assets/images/master_header/homehead-default-1280x600.png +0 -0
- data/lib/starter_web/assets/images/master_header/homehead-default-1920x800.png +0 -0
- data/lib/starter_web/assets/images/master_header/ideas-start-here.1280x900.png +0 -0
- data/lib/starter_web/assets/images/master_header/maarten-van-den-heuvel.1280x600.png +0 -0
- data/lib/starter_web/assets/images/master_header/pagehead-default-1280x500.png +0 -0
- data/lib/starter_web/assets/images/master_header/pagehead-default-1920x600.png +0 -0
- data/lib/starter_web/assets/images/master_header/water-journal-1280x600.png +0 -0
- data/lib/starter_web/assets/themes/j1/core/css/bootstrap.css +895 -286
- data/lib/starter_web/assets/themes/j1/core/css/bootstrap.min.css +2 -2
- data/lib/starter_web/assets/themes/j1/core/js/adapter/navigator.js +9 -17
- data/lib/starter_web/collections/posts/{series → premium/series}/_posts/000_includes/attributes.asciidoc +5 -5
- data/lib/starter_web/collections/posts/{series → premium/series}/_posts/000_includes/documents/100-docker-using-shared-folders.asciidoc +0 -0
- data/lib/starter_web/collections/posts/{series → premium/series}/_posts/000_includes/documents/loop.sh +0 -0
- data/lib/starter_web/collections/posts/{series → premium/series}/_posts/000_includes/tables/debug_variables.asciidoc +2 -1
- data/lib/starter_web/collections/posts/premium/series/_posts/2018-11-01-docker-using-shared-folders.adoc +79 -0
- data/lib/starter_web/collections/posts/{series/_posts/2018-11-01-docker-using-shared-folders.adoc → premium/series/_posts/2018-11-01-docker-using-shared-folders.asciidoc} +15 -23
- data/lib/starter_web/collections/posts/{wikipedia → private/wikipedia}/_posts/2016-11-20-minneapolis.adoc +0 -0
- data/lib/starter_web/collections/posts/{wikipedia → private/wikipedia}/_posts/2016-11-24-narcisse-snake-pits.adoc +0 -0
- data/lib/starter_web/collections/posts/{wikipedia → private/wikipedia}/_posts/2016-11-26-columbia-river.adoc +0 -0
- data/lib/starter_web/collections/posts/{featured → public/featured}/_posts/0000-00-00-welcome-to-j1-template.adoc.erb +0 -0
- data/lib/starter_web/collections/posts/public/featured/_posts/000_includes/attributes.asciidoc +46 -0
- data/lib/starter_web/collections/posts/{featured → public/featured}/_posts/2017-05-01-confusion-about-base-url.adoc +5 -4
- data/lib/starter_web/collections/posts/{featured → public/featured}/_posts/2017-06-01-top-open-source-static-site-generators.adoc +0 -0
- data/lib/starter_web/collections/posts/{featured → public/featured}/_posts/2017-07-01-what-is-a-static-site.adoc +0 -0
- data/lib/starter_web/package.json +1 -1
- data/lib/starter_web/pages/{bookshelf → premium/bookshelf}/100_about_jekyll_collections.adoc +1 -1
- data/lib/starter_web/pages/{bookshelf → premium/bookshelf}/200_book_shelf_biography.adoc +1 -1
- data/lib/starter_web/pages/{bookshelf → premium/bookshelf}/300_book_shelf_fantasy.adoc +1 -1
- data/lib/starter_web/pages/{bookshelf → premium/bookshelf}/400_book_shelf_romance.adoc +1 -1
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/attributes.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/100_absolute_sizes.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/110_bs_grid_sizes.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/120_relative_sizes.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/200_rotate.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/300_flip.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/400_spin_pulsed.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/500_bw_color_palette.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/510_bs_color_palette.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/600_md_color_palette.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/601_md_color_palette_indigo.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/602_md_color_palette_pink.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/100_bs_sizes.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/100_relative_sizes.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/200_rotate.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/300_flip.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/400_spin_pulsed.asciidoc +0 -0
- data/lib/starter_web/pages/{previewer → private/previewer}/justified_gallery.html +1 -1
- data/lib/starter_web/pages/{previewer → private/previewer}/mdi_icons_preview.adoc +1 -1
- data/lib/starter_web/pages/{previewer → private/previewer}/twitter_emoji_preview.adoc +1 -1
- data/lib/starter_web/pages/{about → public/about}/about_site.adoc +1 -1
- data/lib/starter_web/pages/{blog → public/blog}/navigator/archive.html +11 -11
- data/lib/starter_web/pages/{blog/navigator/archive_by_category.html → public/blog/navigator/archive/categoryview.html} +11 -11
- data/lib/starter_web/pages/{blog/navigator/archive_by_date.html → public/blog/navigator/archive/dateview.html} +11 -12
- data/lib/starter_web/pages/{blog/navigator/archive_by_tag.html → public/blog/navigator/archive/tagview.html} +12 -12
- data/lib/starter_web/pages/{blog → public/blog}/navigator/index.html +0 -0
- data/lib/starter_web/pages/{legal → public/legal}/de/100_impress.adoc +1 -1
- data/lib/starter_web/pages/{legal → public/legal}/de/200_terms_of_use.adoc +1 -1
- data/lib/starter_web/pages/{legal → public/legal}/de/300_privacy.adoc +1 -1
- data/lib/starter_web/pages/{legal → public/legal}/de/400_license_agreement.adoc +1 -1
- data/lib/starter_web/pages/{legal → public/legal}/de/500_support.adoc +1 -1
- data/lib/starter_web/pages/{legal → public/legal}/en/100_impress.adoc +1 -1
- data/lib/starter_web/pages/{legal → public/legal}/en/200_terms_of_use.adoc +1 -1
- data/lib/starter_web/pages/{legal → public/legal}/en/300_privacy.adoc +1 -1
- data/lib/starter_web/pages/{legal → public/legal}/en/400_license_agreement.adoc +1 -1
- data/lib/starter_web/pages/{legal → public/legal}/en/500_support.adoc +1 -1
- data/lib/starter_web/pages/{panel/100_intro_panel.adoc → public/panels/intro_panel.adoc} +1 -1
- data/lib/starter_web/pages/public/previewer/000_includes/attributes.asciidoc +75 -0
- data/lib/starter_web/pages/{previewer → public/previewer}/bootstrap_theme.adoc +13 -8
- data/lib/starter_web/pages/{start → public/start}/000_includes/attributes.asciidoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/change_me_first.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/dm920hd.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/000_includes/attributes.asciidoc +4 -4
- data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/000_includes/tables/100_quickstart_installation_packages.asciidoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/100_linux_starter.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/200_macos_starter.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/300_windows_starter.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/quickstart.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/attributes.asciidoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/collections.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/configuration.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/directory_structure.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/jekyll_commandline.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/layout_inheritance.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/manage_pages.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/manage_posts.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/pagination.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/plugins.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/templates.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/variables.adoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/100_introduction.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/110_preparations.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/120_getting_started.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/_unused/20_j1_anatomy.asciidoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/_unused/30_j1_configure_your_site.asciidoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/_unused/40_j1_create_content.asciidoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/_unused/50_j1_customize_your_pages.asciidoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/read_me_first.adoc +1 -1
- data/lib/starter_web/pages/public/start/roundtrip/000_includes/attributes.asciidoc +90 -0
- data/lib/starter_web/pages/{start → public/start}/roundtrip/000_includes/documents/100_gistblock.asciidoc +0 -0
- data/lib/starter_web/pages/{start → public/start}/roundtrip/100_present_images.adoc +2 -3
- data/lib/starter_web/pages/{start → public/start}/roundtrip/200_cards.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/roundtrip/300_typography.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/roundtrip/400_icon_fonts.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/roundtrip/500_asciidoc_extensions.adoc +1 -1
- data/lib/starter_web/pages/{start → public/start}/roundtrip/600_themes.adoc +1 -1
- data/lib/starter_web/pages/{start/roundtrip/700_additional_modals.adoc → public/start/roundtrip/700_j1_modals.adoc} +25 -36
- data/lib/starter_web/pages/{teaser → public/teaser}/100_core.adoc +1 -1
- data/lib/starter_web/pages/{teaser → public/teaser}/200_components.adoc +1 -1
- data/lib/starter_web/pages/{teaser → public/teaser}/300_modules.adoc +1 -1
- metadata +115 -209
- data/lib/starter_web/apps/calendar/index.adoc +0 -71
- data/lib/starter_web/apps/link_checker/index.html +0 -24
- data/lib/starter_web/assets/apps/link-checker/assets/img/main/img22.jpg +0 -0
- data/lib/starter_web/assets/apps/link-checker/assets/img/main/img22.png +0 -0
- data/lib/starter_web/assets/apps/link-checker/index.html +0 -125
- data/lib/starter_web/assets/apps/link-checker/src/bootstrap/css/bootstrap.min.css +0 -1560
- data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -288
- data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/bootstrap/js/bootstrap.min.js +0 -7
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/LICENSE.md +0 -11
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/README.md +0 -105
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/css/font-awesome.css +0 -2337
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/css/font-awesome.min.css +0 -4
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/FontAwesome.otf +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.eot +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.svg +0 -2671
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.ttf +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.woff +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.woff2 +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/How_to_use_webfonts.html +0 -230
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular-demo.html +0 -372
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular.eot +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular.svg +0 -621
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular.ttf +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular.woff +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/specimen_files/Roboto-Regular-cleartype.png +0 -0
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/specimen_files/grid_12-825-55-15.css +0 -129
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/specimen_files/specimen_stylesheet.css +0 -396
- data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/stylesheet.css +0 -12
- data/lib/starter_web/assets/apps/link-checker/src/link-checker/css/link-checker.css +0 -87
- data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/backbone.1.3.2.js +0 -1920
- data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/backbone.min.js +0 -37
- data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/html5shiv.min.js +0 -4
- data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/iframeResizer.contentWindow.min.js +0 -9
- data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/jquery.min.js +0 -6
- data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/jsuri-1.1.1.min.js +0 -2
- data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/link-checker.js +0 -333
- data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/underscore.min.js +0 -31
- data/lib/starter_web/assets/images/master_header/aaron-burden-1200.jpg +0 -0
- data/lib/starter_web/assets/images/master_header/alexey-ruban-slider.jpg +0 -0
- data/lib/starter_web/assets/images/master_header/chuttersnap-1200.jpg +0 -0
- data/lib/starter_web/assets/images/master_header/clark-tibbs-do-something.jpg +0 -0
- data/lib/starter_web/assets/images/master_header/homehead-default-1200.jpg +0 -0
- data/lib/starter_web/assets/images/master_header/ideas-start-here.1200x800.png +0 -0
- data/lib/starter_web/assets/images/master_header/ideas-start-here.jpg +0 -0
- data/lib/starter_web/assets/images/master_header/maarten-van-den-heuvel-1200.jpg +0 -0
- data/lib/starter_web/assets/images/master_header/pagehead-default-1200.jpg +0 -0
- data/lib/starter_web/assets/images/master_header/stefan-stefancik-1200.jpg +0 -0
- data/lib/starter_web/assets/images/master_header/water-journal-1200.jpg +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/001_menubar_example.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/005_navbar.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/005_navigation_bar.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/006_navigation_side_bar.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/006_searchbar.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/007_sidebar.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/008_navbar_blank.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/010_nav_bar.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/010_top_search.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/012_top_search.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/015_quicklink_bar.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/017_side_bar.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/020_menu_bar.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/2-tier-architecture-1280x600.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/3-tier-architecture-1280x600.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/download_image_create_starter.800x600.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1-app-authclient-icon.1280x600.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1-app-authclient-signin.1280x700.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1-app-authclient-signout.1280x700.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1-disqus-comment-dialog.1280x500.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1_development_system-1280x600.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1_runtime_system-1280x600.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/rack_based_web_app-1280x600.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/rack_based_web_app.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/run_container_build_start_web.800x400.png +0 -0
- data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/run_starter_web.800x700.png +0 -0
- data/lib/starter_web/collections/posts/featured/_posts/000_includes/attributes.asciidoc +0 -15
- data/lib/starter_web/pages/about/about_you.adoc +0 -103
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/attributes.asciidoc +0 -72
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/documents/200_library_features.asciidoc +0 -285
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/001_menu_bar_example.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/005_navbar.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/005_navigation_bar.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/006_navigation_side_bar.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/006_searchbar.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/007_sidebar.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/008_navbar_blank.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/010_nav_bar.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/010_top_search.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/012_top_search.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/015_quicklink_bar.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/017_side_bar.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/020_menu_bar.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/400_master_header.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/410_text_header.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/411_text_header.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/412_header_anatomy.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/415_image_header_caption.png +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/snagit/412_header_anatomy.snag +0 -0
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/000_text_sizes.asciidoc +0 -50
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/410_common_header_parameters.asciidoc +0 -120
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/420_common_image_header_parameters.asciidoc +0 -52
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/421_additional_image_header_parameters.asciidoc +0 -36
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/430_video_header_parameters.asciidoc +0 -26
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/440_image_and_video_transitions.asciidoc +0 -36
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/450_image_and_video_header_defaults.asciidoc +0 -82
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/451_additional_image_and_video_header_defaults.asciidoc +0 -23
- data/lib/starter_web/pages/start/documentation/user_guide/100_header/100_header.adoc +0 -452
- data/lib/starter_web/pages/start/documentation/user_guide/240_auth_manager/000_includes/attributes.asciidoc +0 -119
- data/lib/starter_web/pages/start/documentation/user_guide/240_auth_manager/100_auth_manager.adoc +0 -539
- data/lib/starter_web/pages/start/roundtrip/000_includes/attributes.asciidoc +0 -49
|
@@ -58,9 +58,11 @@
|
|
|
58
58
|
|
|
59
59
|
{% comment %} extend path for posts|collections if collections_dir is used|set
|
|
60
60
|
-------------------------------------------------------------------------------- {% endcomment %}
|
|
61
|
-
{% if page.collection and site.collections_dir.size > 0 %}
|
|
62
|
-
{% capture
|
|
63
|
-
{% capture page_path %}{{source_path | remove_first:'/'}}/{{_page_path | prepend: site.collections_dir}}{% endcapture %}
|
|
61
|
+
{% if page.collection == 'posts' and site.collections_dir.size > 0 %}
|
|
62
|
+
{% capture page_path %}{{site.collections_dir}}{{_page_path}}{% endcapture %}
|
|
63
|
+
{% comment %} {% capture page_path %}{{source_path | remove_first:'/'}}/{{_page_path | prepend: site.collections_dir}}{% endcapture %} {% endcomment %}
|
|
64
|
+
{% elsif mode == 'absolute' %}
|
|
65
|
+
{% assign page_path=_page_path %}
|
|
64
66
|
{% else %}
|
|
65
67
|
{% capture page_path %}{{source_path | remove_first:'/'}}{{_page_path}}{% endcapture %}
|
|
66
68
|
{% endif %}
|
data/lib/j1/commands/generate.rb
CHANGED
|
@@ -38,7 +38,7 @@ module J1
|
|
|
38
38
|
|
|
39
39
|
def create_blank_site(path)
|
|
40
40
|
Dir.chdir(path) do
|
|
41
|
-
FileUtils.mkdir(%w(_layouts posts/featured/_posts _drafts))
|
|
41
|
+
FileUtils.mkdir(%w(_layouts posts/public/featured/_posts _drafts))
|
|
42
42
|
FileUtils.touch('index.html')
|
|
43
43
|
end
|
|
44
44
|
end
|
|
@@ -51,7 +51,7 @@ module J1
|
|
|
51
51
|
#
|
|
52
52
|
# Returns the filename of the sample post, as a String
|
|
53
53
|
def initialized_post_name
|
|
54
|
-
"collections/posts/featured/_posts/#{Time.now.strftime("%Y-%m-%d")}-welcome-to-j1-template.adoc"
|
|
54
|
+
"collections/posts/public/featured/_posts/#{Time.now.strftime("%Y-%m-%d")}-welcome-to-j1-template.adoc"
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
private
|
|
@@ -118,7 +118,7 @@ module J1
|
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
def scaffold_path
|
|
121
|
-
'collections/posts/featured/_posts/0000-00-00-welcome-to-j1-template.adoc.erb'
|
|
121
|
+
'collections/posts/public/featured/_posts/0000-00-00-welcome-to-j1-template.adoc.erb'
|
|
122
122
|
end
|
|
123
123
|
|
|
124
124
|
# After a generate blog has been created, print a success notification and
|
data/lib/j1/version.rb
CHANGED
|
@@ -4,21 +4,36 @@ module J1App
|
|
|
4
4
|
class AuthManager < Sinatra::Base
|
|
5
5
|
|
|
6
6
|
include J1App::Helpers
|
|
7
|
+
include J1App::GithubHelpers
|
|
8
|
+
|
|
9
|
+
# ==========================================================================
|
|
10
|
+
# Sinatra Framework settings
|
|
11
|
+
# ==========================================================================
|
|
12
|
+
|
|
13
|
+
# NOTE: https://stackoverflow.com/questions/7847536/sinatra-in-facebook-iframe
|
|
14
|
+
#
|
|
15
|
+
set :protection, :except => :frame_options
|
|
16
|
+
|
|
17
|
+
# Check: http://sinatrarb.com/intro.html
|
|
18
|
+
#
|
|
19
|
+
set :static_cache_control, [:public, :max_age => 10]
|
|
7
20
|
|
|
8
21
|
|
|
9
22
|
# ==========================================================================
|
|
10
|
-
# Base App and Framework settings
|
|
23
|
+
# Base App and Warden Framework settings
|
|
11
24
|
# ==========================================================================
|
|
12
25
|
|
|
13
26
|
j1_web_session = {
|
|
14
|
-
'authenticated' => '
|
|
27
|
+
'authenticated' => 'false',
|
|
15
28
|
'requested_page' => '/',
|
|
29
|
+
'users_allowed' => 'unknown',
|
|
16
30
|
'user_name' => 'unknown',
|
|
17
31
|
'user_id' => 'unknown',
|
|
18
32
|
'user_details' => 'unknown',
|
|
19
33
|
'user_pledges' => 'unknown',
|
|
20
34
|
'provider' => 'unknown',
|
|
21
35
|
'provider_url' => '/',
|
|
36
|
+
'permissions' => 'unknown',
|
|
22
37
|
'writer' => 'middleware'
|
|
23
38
|
}
|
|
24
39
|
|
|
@@ -129,14 +144,90 @@ module J1App
|
|
|
129
144
|
# --------------------------------------------------------------------------
|
|
130
145
|
use Rack::Logger
|
|
131
146
|
|
|
147
|
+
# Load user profiles, permissions, conditions and strategies
|
|
148
|
+
# --------------------------------------------------------------------------
|
|
149
|
+
# provider_permission = J1App.get_provider_permissions "disqus"
|
|
150
|
+
users = J1App.users
|
|
151
|
+
permissions = J1App.permissions
|
|
152
|
+
conditions = J1App.conditions
|
|
153
|
+
strategies = J1App.strategies
|
|
154
|
+
|
|
132
155
|
|
|
133
156
|
# ==========================================================================
|
|
134
157
|
# Sinatra (before) FILTER to preprocess all page requests
|
|
135
158
|
# ==========================================================================
|
|
136
159
|
|
|
137
|
-
#
|
|
160
|
+
# Prepare root (index) page for app detection
|
|
161
|
+
#
|
|
162
|
+
before '/' do
|
|
163
|
+
logger.info "ROOT PAGE: Prepare J1 web session data"
|
|
164
|
+
|
|
165
|
+
# read existing/current cookie 'j1.web.session' to update all data
|
|
166
|
+
# of j1_web_session (hash) otherwise set initial data
|
|
167
|
+
# ------------------------------------------------------------------------
|
|
168
|
+
unless env['HTTP_COOKIE'] == nil
|
|
169
|
+
if env['HTTP_COOKIE'].include? 'j1.web.session'
|
|
170
|
+
session_encoded = request.cookies['j1.web.session']
|
|
171
|
+
session_decoded = Base64.decode64(session_encoded)
|
|
172
|
+
j1_web_session = JSON.parse(session_decoded)
|
|
173
|
+
end
|
|
174
|
+
else
|
|
175
|
+
requested_page = env['REQUEST_URI']
|
|
176
|
+
j1_web_session['requested_page'] = "#{env['REQUEST_URI']}"
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Create|Initialize the J1 web session cookie
|
|
180
|
+
# ------------------------------------------------------------------------
|
|
181
|
+
if warden.authenticated?
|
|
182
|
+
user = warden.user
|
|
183
|
+
logger.info "ROOT PAGE: User detected as signed in at provider: #{user[:provider]}"
|
|
184
|
+
j1_web_session['authenticated'] = 'true'
|
|
185
|
+
j1_web_session['requested_page'] = '/'
|
|
186
|
+
j1_web_session['users_allowed'] = users["#{user[:provider]}"]
|
|
187
|
+
j1_web_session['user_name'] = user[:info]['nickname']
|
|
188
|
+
j1_web_session['user_id'] = user[:uid]
|
|
189
|
+
j1_web_session['provider'] = user[:provider]
|
|
190
|
+
j1_web_session['provider_url'] = J1App.provider_url user[:provider]
|
|
191
|
+
j1_web_session['permissions'] = J1App.get_provider_permissions "#{user[:provider]}"
|
|
192
|
+
if user[:provider] == 'patreon'
|
|
193
|
+
j1_web_session['user_details'] = user[:extra]['raw_info']['data']['attributes']
|
|
194
|
+
j1_web_session['user_pledges'] = user[:extra]['raw_info']['data']['relationships']['pledges'] unless user[:extra]['raw_info']['data']['relationships'].nil?
|
|
195
|
+
else
|
|
196
|
+
j1_web_session['user_pledges'] = 'unknown'
|
|
197
|
+
j1_web_session['provider'] = 'unknown'
|
|
198
|
+
end
|
|
199
|
+
else
|
|
200
|
+
logger.info "ROOT PAGE: User detected as signed out"
|
|
201
|
+
j1_web_session['authenticated'] = 'false'
|
|
202
|
+
j1_web_session['requested_page'] = '/'
|
|
203
|
+
j1_web_session['users_allowed'] = 'all'
|
|
204
|
+
j1_web_session['user_name'] = 'unknown'
|
|
205
|
+
j1_web_session['user_id'] = 'unknown'
|
|
206
|
+
j1_web_session['user_details'] = 'unknown'
|
|
207
|
+
j1_web_session['user_pledges'] = 'unknown'
|
|
208
|
+
j1_web_session['provider'] = 'unknown'
|
|
209
|
+
j1_web_session['provider_url'] = 'unknown'
|
|
210
|
+
j1_web_session['permissions'] = 'unknown'
|
|
211
|
+
end
|
|
212
|
+
j1_web_session['writer'] = 'middleware'
|
|
213
|
+
|
|
214
|
+
session_json = j1_web_session.to_json
|
|
215
|
+
session_encoded = Base64.encode64(session_json)
|
|
216
|
+
logger.info "ROOT PAGE: Write J1 web session data to cookie"
|
|
217
|
+
#logger.info "ROOT PAGE: write J1 web session data as: #{session_json}"
|
|
218
|
+
response.set_cookie(
|
|
219
|
+
'j1.web.session',
|
|
220
|
+
domain: false,
|
|
221
|
+
value: session_encoded.to_s,
|
|
222
|
+
path: '/'
|
|
223
|
+
)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# Check auth status for content of type "private" or "premium"
|
|
138
227
|
# --------------------------------------------------------------------------
|
|
139
|
-
before '
|
|
228
|
+
#before '/*' do
|
|
229
|
+
#before /\/\w+\/(public|private|premium)/ do
|
|
230
|
+
before '/(pages|posts)/*' do
|
|
140
231
|
|
|
141
232
|
# read existing/current cookie 'j1.web.session'
|
|
142
233
|
# to update all data of j1_web_session (hash)
|
|
@@ -145,7 +236,8 @@ module J1App
|
|
|
145
236
|
if env['HTTP_COOKIE'].include? 'j1.web.session'
|
|
146
237
|
session_encoded = request.cookies['j1.web.session']
|
|
147
238
|
session_decoded = Base64.decode64(session_encoded)
|
|
148
|
-
logger.info "BEFORE:
|
|
239
|
+
logger.info "BEFORE AUTHENTICATION: Read J1 web session data"
|
|
240
|
+
#logger.info "BEFORE AUTHENTICATION: Read J1 web session data as: #{session_decoded}"
|
|
149
241
|
j1_web_session = JSON.parse(session_decoded)
|
|
150
242
|
else
|
|
151
243
|
requested_page = env['REQUEST_URI']
|
|
@@ -154,9 +246,25 @@ module J1App
|
|
|
154
246
|
|
|
155
247
|
# Create|Initialize the J1 web session cookie
|
|
156
248
|
# ------------------------------------------------------------------------
|
|
157
|
-
|
|
249
|
+
if warden.authenticated?
|
|
250
|
+
user = warden.user
|
|
251
|
+
j1_web_session['authenticated'] = 'true'
|
|
252
|
+
j1_web_session['user_name'] = user[:info]['nickname']
|
|
253
|
+
j1_web_session['user_id'] = user[:uid]
|
|
254
|
+
j1_web_session['provider'] = user[:provider]
|
|
255
|
+
j1_web_session['provider_url'] = J1App.provider_url user[:provider]
|
|
256
|
+
j1_web_session['users_allowed'] = users["#{user[:provider]}"]
|
|
257
|
+
j1_web_session['permissions'] = J1App.get_provider_permissions "#{user[:provider]}"
|
|
258
|
+
if user[:provider] == 'patreon'
|
|
259
|
+
j1_web_session['user_details'] = user[:extra]['raw_info']['data']['attributes']
|
|
260
|
+
j1_web_session['user_pledges'] = user[:extra]['raw_info']['data']['relationships']['pledges'] unless user[:extra]['raw_info']['data']['relationships'].nil?
|
|
261
|
+
end
|
|
262
|
+
j1_web_session['writer'] = 'middleware'
|
|
263
|
+
end
|
|
264
|
+
|
|
158
265
|
session_json = j1_web_session.to_json
|
|
159
266
|
session_encoded = Base64.encode64(session_json)
|
|
267
|
+
logger.info "INITIALISATION: Write J1 web session data to cookie"
|
|
160
268
|
response.set_cookie(
|
|
161
269
|
'j1.web.session',
|
|
162
270
|
domain: false,
|
|
@@ -164,56 +272,104 @@ module J1App
|
|
|
164
272
|
path: '/'
|
|
165
273
|
)
|
|
166
274
|
|
|
167
|
-
#
|
|
275
|
+
# User state|content detection for implicit authentication
|
|
168
276
|
# ------------------------------------------------------------------------
|
|
169
|
-
#
|
|
170
|
-
# j1_web_session['provider_url'] = J1App.provider_url warden.user[:provider]
|
|
171
|
-
|
|
172
|
-
if warden.authenticated?
|
|
173
|
-
my_provider = warden.user[:provider]
|
|
174
|
-
provider_url = J1App.provider_url my_provider
|
|
175
|
-
j1_web_session['provider_url'] = provider_url
|
|
176
|
-
end
|
|
177
|
-
|
|
178
277
|
pass if authentication_enabled? == false
|
|
278
|
+
logger.info "AUTORISATION: Authentication enabled. Check for public content."
|
|
179
279
|
pass if public_content?
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
logger.info "STRATEGY: #{authentication_strategy}"
|
|
183
|
-
|
|
184
|
-
case authentication_strategy
|
|
185
|
-
when :org
|
|
186
|
-
warden.authenticate!
|
|
187
|
-
github_organization_authenticate! ENV['GITHUB_ORG_NAME']
|
|
188
|
-
logger.info "Hi There, #{j1_web_session[:user_name]}! You have access to the #{params['id']} organization."
|
|
189
|
-
when :team
|
|
190
|
-
warden.authenticate!
|
|
191
|
-
github_team_authenticate! ENV['GITHUB_TEAM_ID']
|
|
192
|
-
logger.info "Hi There, #{j1_web_session[:user_name]}! You have access to the #{params['id']} team."
|
|
193
|
-
when :teams
|
|
194
|
-
warden.authenticate!
|
|
195
|
-
github_teams_authenticate! ENV['GITHUB_TEAM_IDS'].split(',')
|
|
196
|
-
logger.info "Hi There, #{j1_web_session[:user_name]}! You have access to the #{params['id']} team."
|
|
197
|
-
when :member
|
|
198
|
-
logger.info 'STRATEGY: go for authentication'
|
|
199
|
-
|
|
200
|
-
# Set selected page for redirect
|
|
201
|
-
# ----------------------------------------------------------------------
|
|
202
|
-
logger.info "STRATEGY: set redirect to: #{j1_web_session['requested_page']}"
|
|
203
|
-
#j1_web_session['provider_url'] = J1App.provider_url warden.user[:provider]
|
|
204
|
-
j1_web_session['requested_page'] = env['REQUEST_URI']
|
|
205
|
-
j1_web_session['writer'] = 'middleware'
|
|
206
|
-
# write updated J1 session cookie
|
|
207
|
-
# session_json = j1_web_session.to_json
|
|
208
|
-
# session_encoded = Base64.encode64(session_json)
|
|
209
|
-
# logger.info "STRATEGY: write J1 web session data as: #{session_json}"
|
|
210
|
-
# response.set_cookie('j1.web.session', value: session_encoded.to_s)
|
|
211
|
-
warden.authenticate!
|
|
280
|
+
logger.info "AUTORISATION: Protected content detected. Check for authorisation."
|
|
212
281
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
282
|
+
env['REQUEST_URI'].scan(/(private|premium)/) do |match|
|
|
283
|
+
|
|
284
|
+
category = match[0]
|
|
285
|
+
logger.info "AUTORISATION: Content category detected: #{category}"
|
|
286
|
+
|
|
287
|
+
if warden.authenticated?
|
|
288
|
+
logger.info "AUTORISATION: User detected as signed in."
|
|
289
|
+
|
|
290
|
+
current_provider = warden.user[:provider]
|
|
291
|
+
provider_strategy = strategies["#{current_provider}"]
|
|
292
|
+
provider_url = J1App.provider_url current_provider
|
|
293
|
+
j1_web_session['provider_url'] = provider_url
|
|
294
|
+
j1_web_session['users_allowed'] = users["#{current_provider}"]
|
|
295
|
+
j1_web_session['permissions'] = J1App.get_provider_permissions "#{user[:provider]}"
|
|
296
|
+
|
|
297
|
+
logger.info "AUTORISATION: Current provider detected: #{current_provider}"
|
|
298
|
+
if permissions[category].include? current_provider
|
|
299
|
+
logger.info "AUTORISATION: Current provider #{current_provider} support category: #{category}"
|
|
300
|
+
else
|
|
301
|
+
logger.info "AUTORISATION: SignIn to provider #{permissions[category][0]} for category: #{category}"
|
|
302
|
+
warden.logout
|
|
303
|
+
session.clear
|
|
304
|
+
|
|
305
|
+
allowed_users = users["#{current_provider}"].join(',')
|
|
306
|
+
|
|
307
|
+
redirect "/access_protected_content?provider=#{permissions[category][0]}&category=#{category}&page=#{env['REQUEST_URI']}&allowed_users=#{allowed_users}"
|
|
308
|
+
# warden.authenticate! :"omni_#{permissions[category][0]}"
|
|
309
|
+
end
|
|
310
|
+
pass
|
|
311
|
+
else
|
|
312
|
+
logger.info "AUTORISATION: User detected as signed out."
|
|
313
|
+
default_provider = permissions[category][0]
|
|
314
|
+
logger.info "AUTORISATION: Set default provider: #{default_provider}"
|
|
315
|
+
|
|
316
|
+
authentication_strategy = strategies["#{default_provider}"]
|
|
317
|
+
logger.info "AUTHENTICATION: Set authentication strategy: #{authentication_strategy}"
|
|
318
|
+
logger.info "AUTHENTICATION: SignIn provider #{permissions[category][0]} for category: #{category}"
|
|
319
|
+
|
|
320
|
+
case authentication_strategy
|
|
321
|
+
when :org
|
|
322
|
+
warden.authenticate!
|
|
323
|
+
github_organization_authenticate! ENV['GITHUB_ORG_NAME']
|
|
324
|
+
logger.info "Hi There, #{j1_web_session[:user_name]}! You have access to the #{params['id']} organization."
|
|
325
|
+
when :team
|
|
326
|
+
warden.authenticate!
|
|
327
|
+
github_team_authenticate! ENV['GITHUB_TEAM_ID']
|
|
328
|
+
logger.info "Hi There, #{j1_web_session[:user_name]}! You have access to the #{params['id']} team."
|
|
329
|
+
when :teams
|
|
330
|
+
warden.authenticate!
|
|
331
|
+
github_teams_authenticate! ENV['GITHUB_TEAM_IDS'].split(',')
|
|
332
|
+
logger.info "Hi There, #{j1_web_session[:user_name]}! You have access to the #{params['id']} team."
|
|
333
|
+
when :member
|
|
334
|
+
|
|
335
|
+
if env['HTTP_COOKIE'].include? 'j1.web.session'
|
|
336
|
+
session_encoded = request.cookies['j1.web.session']
|
|
337
|
+
session_decoded = Base64.decode64(session_encoded)
|
|
338
|
+
logger.info "BEFORE AUTHENTICATION: Read J1 web session data"
|
|
339
|
+
#logger.info "BEFORE AUTHENTICATION: Read J1 web session data as: #{session_decoded}"
|
|
340
|
+
j1_web_session = JSON.parse(session_decoded)
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
# Get access to protected content
|
|
344
|
+
# ----------------------------------------------------------------------
|
|
345
|
+
logger.info "STRATEGY: set redirect to: #{j1_web_session['requested_page']}"
|
|
346
|
+
j1_web_session['provider_url'] = J1App.provider_url default_provider
|
|
347
|
+
j1_web_session['users_allowed'] = users["#{default_provider}"]
|
|
348
|
+
j1_web_session['permissions'] = J1App.get_provider_permissions "#{default_provider}"
|
|
349
|
+
j1_web_session['requested_page'] = env['REQUEST_URI']
|
|
350
|
+
j1_web_session['writer'] = 'middleware'
|
|
351
|
+
|
|
352
|
+
# write updated J1 session cookie
|
|
353
|
+
#
|
|
354
|
+
session_json = j1_web_session.to_json
|
|
355
|
+
session_encoded = Base64.encode64(session_json)
|
|
356
|
+
logger.info "STRATEGY: Write J1 web session data to cookie"
|
|
357
|
+
#logger.info "STRATEGY: write J1 web session data as: #{session_json}"
|
|
358
|
+
response.set_cookie(
|
|
359
|
+
'j1.web.session',
|
|
360
|
+
domain: false,
|
|
361
|
+
value: session_encoded.to_s,
|
|
362
|
+
path: '/'
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
allowed_users = users["#{default_provider}"].join(',')
|
|
366
|
+
redirect "/access_protected_content?provider=#{permissions[category][0]}&category=#{category}&page=#{env['REQUEST_URI']}&allowed_users=#{allowed_users}"
|
|
367
|
+
else
|
|
368
|
+
raise J1App::ConfigError
|
|
369
|
+
end
|
|
370
|
+
end
|
|
216
371
|
|
|
372
|
+
end
|
|
217
373
|
end
|
|
218
374
|
|
|
219
375
|
|
|
@@ -226,14 +382,33 @@ module J1App
|
|
|
226
382
|
get '/authentication' do
|
|
227
383
|
# collect (common) GET parameter|s
|
|
228
384
|
#
|
|
229
|
-
request
|
|
230
|
-
provider
|
|
385
|
+
request = params.fetch('request')
|
|
386
|
+
provider = params.fetch('provider')
|
|
231
387
|
|
|
232
388
|
if request === 'signin'
|
|
389
|
+
# collect (additional) GET parameter|s
|
|
390
|
+
# ----------------------------------------------------------------------
|
|
391
|
+
allowed_users = params.fetch('allowed_users')
|
|
392
|
+
|
|
393
|
+
j1_web_session['users_allowed'] = allowed_users
|
|
394
|
+
j1_web_session['writer'] = 'middleware'
|
|
395
|
+
|
|
396
|
+
# Write updated J1 session data to cookie
|
|
397
|
+
# --------------------------------------------------------------------
|
|
398
|
+
session_json = j1_web_session.to_json
|
|
399
|
+
session_encoded = Base64.encode64(session_json)
|
|
400
|
+
logger.info "SIGNIN: Write J1 web session data to cookie"
|
|
401
|
+
response.set_cookie(
|
|
402
|
+
'j1.web.session',
|
|
403
|
+
domain: false,
|
|
404
|
+
value: session_encoded.to_s,
|
|
405
|
+
path: '/'
|
|
406
|
+
)
|
|
407
|
+
|
|
233
408
|
if warden.authenticated?
|
|
234
409
|
logger.info "SIGNIN: #{warden.user[:info]['nickname']} already signed in"
|
|
235
410
|
else
|
|
236
|
-
logger.info "SIGNIN: going for
|
|
411
|
+
logger.info "SIGNIN: going for authentication at: #{provider}"
|
|
237
412
|
# Make (really) sure that old session is cleared before login
|
|
238
413
|
# --------------------------------------------------------------------
|
|
239
414
|
warden.logout
|
|
@@ -259,7 +434,8 @@ module J1App
|
|
|
259
434
|
if env['HTTP_COOKIE'].include? 'j1.web.session'
|
|
260
435
|
session_encoded = env['rack.request.cookie_hash']['j1.web.session']
|
|
261
436
|
session_decoded = Base64.decode64(session_encoded)
|
|
262
|
-
logger.info "SIGNOUT: read J1 web session data as: #{session_decoded}"
|
|
437
|
+
#logger.info "SIGNOUT: read J1 web session data as: #{session_decoded}"
|
|
438
|
+
logger.info "SIGNOUT: read J1 web session data"
|
|
263
439
|
j1_web_session = JSON.parse(session_decoded)
|
|
264
440
|
else
|
|
265
441
|
j1_web_session['requested_page'] = env['REQUEST_URI']
|
|
@@ -270,9 +446,11 @@ module J1App
|
|
|
270
446
|
j1_web_session['user_name'] = 'unknown'
|
|
271
447
|
j1_web_session['user_id'] = 'unknown'
|
|
272
448
|
j1_web_session['user_details'] = 'unknown'
|
|
449
|
+
j1_web_session['users_allowed'] = 'unknown'
|
|
273
450
|
j1_web_session['user_pledges'] = 'unknown'
|
|
274
451
|
j1_web_session['provider'] = 'unknown'
|
|
275
452
|
j1_web_session['provider_url'] = 'unknown'
|
|
453
|
+
j1_web_session['permissions'] = 'unknown'
|
|
276
454
|
j1_web_session['authenticated'] = 'false'
|
|
277
455
|
j1_web_session['writer'] = 'middleware'
|
|
278
456
|
|
|
@@ -280,13 +458,22 @@ module J1App
|
|
|
280
458
|
# --------------------------------------------------------------------
|
|
281
459
|
session_json = j1_web_session.to_json
|
|
282
460
|
session_encoded = Base64.encode64(session_json)
|
|
283
|
-
|
|
461
|
+
logger.info "SIGNOUT: Write J1 web session data to cookie"
|
|
462
|
+
response.set_cookie(
|
|
463
|
+
'j1.web.session',
|
|
464
|
+
domain: false,
|
|
465
|
+
value: session_encoded.to_s,
|
|
466
|
+
path: '/'
|
|
467
|
+
)
|
|
284
468
|
|
|
285
469
|
if provider_signout === 'true'
|
|
286
470
|
logger.info "SIGNOUT: for #{user} completely at provider: #{provider}"
|
|
287
471
|
redirect "#{provider_url}"
|
|
288
472
|
else
|
|
289
473
|
logger.info "SIGNOUT: for #{user} from current session at provider: #{provider}"
|
|
474
|
+
|
|
475
|
+
# If signed out, redirect ONLY for PUBLIC pages
|
|
476
|
+
# ------------------------------------------------------------------
|
|
290
477
|
if redirect_whitelisted?j1_web_session['requested_page']
|
|
291
478
|
logger.info 'SIGNOUT: redirect whitelisted'
|
|
292
479
|
logger.info "SIGNOUT: redirect to #{j1_web_session['requested_page']}"
|
|
@@ -302,14 +489,15 @@ module J1App
|
|
|
302
489
|
# (modal) is provided by the auth client if a user isn't signed in.
|
|
303
490
|
# Kept this alternative for cases something went wrong.
|
|
304
491
|
# --------------------------------------------------------------------
|
|
305
|
-
logger.info 'SIGNOUT: not signed in'
|
|
492
|
+
logger.info 'DEAD PATH SIGNOUT: not signed in'
|
|
306
493
|
|
|
307
494
|
# Read current J1 session cookie
|
|
308
495
|
# --------------------------------------------------------------------
|
|
309
496
|
if env['HTTP_COOKIE'].include? 'j1.web.session'
|
|
310
497
|
session_encoded = env['rack.request.cookie_hash']['j1.web.session']
|
|
311
498
|
session_decoded = Base64.decode64(session_encoded)
|
|
312
|
-
logger.info "SIGNOUT: read J1 web session data as: #{session_decoded}"
|
|
499
|
+
# logger.info "DEAD PATH SIGNOUT: read J1 web session data as: #{session_decoded}"
|
|
500
|
+
logger.info "DEAD PATH SIGNOUT: read J1 web session data"
|
|
313
501
|
j1_web_session = JSON.parse(session_decoded)
|
|
314
502
|
else
|
|
315
503
|
j1_web_session['requested_page'] = env['REQUEST_URI']
|
|
@@ -320,9 +508,11 @@ module J1App
|
|
|
320
508
|
j1_web_session['user_name'] = 'unknown'
|
|
321
509
|
j1_web_session['user_id'] = 'unknown'
|
|
322
510
|
j1_web_session['user_details'] = 'unknown'
|
|
511
|
+
j1_web_session['users_allowed'] = 'unknown'
|
|
323
512
|
j1_web_session['user_pledges'] = 'unknown'
|
|
324
513
|
j1_web_session['provider'] = 'unknown'
|
|
325
514
|
j1_web_session['provider_url'] = 'unknown'
|
|
515
|
+
j1_web_session['permissions'] = 'unknown'
|
|
326
516
|
j1_web_session['authenticated'] = 'false'
|
|
327
517
|
j1_web_session['writer'] = 'middleware'
|
|
328
518
|
|
|
@@ -330,8 +520,14 @@ module J1App
|
|
|
330
520
|
# --------------------------------------------------------------------
|
|
331
521
|
session_json = j1_web_session.to_json
|
|
332
522
|
session_encoded = Base64.encode64(session_json)
|
|
333
|
-
|
|
334
|
-
|
|
523
|
+
logger.info "DEAD PATH SIGNOUT: Write J1 web session data to cookie"
|
|
524
|
+
response.set_cookie(
|
|
525
|
+
'j1.web.session',
|
|
526
|
+
domain: false,
|
|
527
|
+
value: session_encoded.to_s,
|
|
528
|
+
path: '/'
|
|
529
|
+
)
|
|
530
|
+
logger.info "DEAD PATH SIGNOUT: redirect to #{j1_web_session['requested_page']}"
|
|
335
531
|
redirect j1_web_session['requested_page']
|
|
336
532
|
end
|
|
337
533
|
else
|
|
@@ -342,35 +538,82 @@ module J1App
|
|
|
342
538
|
# Post-processing ENDPOINT called after a user is authenticated
|
|
343
539
|
# --------------------------------------------------------------------------
|
|
344
540
|
get '/redirect_after_callback' do
|
|
345
|
-
user = warden.user
|
|
346
541
|
|
|
347
|
-
|
|
348
|
-
|
|
542
|
+
session_encoded = request.cookies['j1.web.session']
|
|
543
|
+
session_decoded = Base64.decode64(session_encoded)
|
|
544
|
+
j1_web_session = JSON.parse(session_decoded)
|
|
545
|
+
|
|
546
|
+
#logger.info "AFTER AUTHENTICATION: read J1 web session data as: #{j1_web_session}"
|
|
547
|
+
logger.info "AFTER AUTHENTICATION: read J1 web session data"
|
|
548
|
+
user = warden.user
|
|
349
549
|
j1_web_session['user_name'] = user[:info]['nickname']
|
|
350
550
|
j1_web_session['user_id'] = user[:uid]
|
|
551
|
+
j1_web_session['provider'] = user[:provider]
|
|
552
|
+
j1_web_session['permissions'] = J1App.get_provider_permissions "#{user[:provider]}"
|
|
553
|
+
j1_web_session['authenticated'] = 'true'
|
|
351
554
|
if user[:provider] == 'patreon'
|
|
352
555
|
j1_web_session['user_details'] = user[:extra]['raw_info']['data']['attributes']
|
|
353
556
|
j1_web_session['user_pledges'] = user[:extra]['raw_info']['data']['relationships']['pledges'] unless user[:extra]['raw_info']['data']['relationships'].nil?
|
|
557
|
+
else
|
|
558
|
+
j1_web_session['user_pledges'] = 'unknown'
|
|
559
|
+
j1_web_session['provider'] = 'unknown'
|
|
354
560
|
end
|
|
355
|
-
j1_web_session['provider'] = user[:provider]
|
|
356
|
-
j1_web_session['authenticated'] = warden.authenticated? ? 'true' : 'false'
|
|
357
561
|
j1_web_session['writer'] = 'middleware'
|
|
358
562
|
|
|
563
|
+
current_user = user[:info]['nickname'] = user[:info]['nickname']
|
|
564
|
+
current_provider = user[:provider]
|
|
565
|
+
|
|
566
|
+
j1_web_session['requested_page'].scan(/(private|premium)/) do |match|
|
|
567
|
+
category = match[0]
|
|
568
|
+
unless j1_web_session['users_allowed'].include? 'all'
|
|
569
|
+
unless j1_web_session['users_allowed'].include? "#{current_user}"
|
|
570
|
+
logger.info "AFTER AUTHENTICATION: User #{current_user} not allowed. Allowed users: #{j1_web_session['users_allowed']}"
|
|
571
|
+
warden.logout
|
|
572
|
+
session.clear
|
|
573
|
+
logger.info "AFTER AUTHENTICATION: User #{current_user} signed out."
|
|
574
|
+
redirect "/access_denied?provider=#{current_provider}&user=#{current_user}&category=#{category}"
|
|
575
|
+
end
|
|
576
|
+
end
|
|
577
|
+
end
|
|
578
|
+
|
|
579
|
+
j1_web_session['provider'] = current_provider
|
|
580
|
+
j1_web_session['users_allowed'] = users["#{current_provider}"]
|
|
581
|
+
|
|
582
|
+
if j1_web_session['requested_page'] == '/'
|
|
583
|
+
category = 'any protected content'
|
|
584
|
+
unless j1_web_session['users_allowed'].include? 'all'
|
|
585
|
+
unless j1_web_session['users_allowed'].include? "#{current_user}"
|
|
586
|
+
logger.info "AFTER AUTHENTICATION: User #{current_user} not allowed. Allowed users: #{j1_web_session['users_allowed']}"
|
|
587
|
+
warden.logout
|
|
588
|
+
session.clear
|
|
589
|
+
logger.info "AFTER AUTHENTICATION: User #{current_user} signed out."
|
|
590
|
+
redirect "/access_denied?provider=#{current_provider}&user=#{current_user}&category=#{category}"
|
|
591
|
+
end
|
|
592
|
+
end
|
|
593
|
+
end
|
|
594
|
+
|
|
359
595
|
# write updated J1 session data to cookie
|
|
360
596
|
#
|
|
361
597
|
session_json = j1_web_session.to_json
|
|
362
598
|
session_encoded = Base64.encode64(session_json)
|
|
363
|
-
logger.info "AFTER AUTHENTICATION:
|
|
364
|
-
|
|
599
|
+
logger.info "AFTER AUTHENTICATION: Write J1 web session data to cookie"
|
|
600
|
+
#logger.info "AFTER AUTHENTICATION: Write J1 web session data as: #{session_json}"
|
|
601
|
+
response.set_cookie(
|
|
602
|
+
'j1.web.session',
|
|
603
|
+
domain: false,
|
|
604
|
+
value: session_encoded.to_s,
|
|
605
|
+
path: '/'
|
|
606
|
+
)
|
|
365
607
|
|
|
366
|
-
# redirect to
|
|
608
|
+
# redirect to requested page
|
|
367
609
|
#
|
|
368
|
-
logger.info "AFTER AUTHENTICATION:
|
|
610
|
+
logger.info "AFTER AUTHENTICATION: Signed in at provider #{user[:provider]} as user: #{user[:info]['nickname']}"
|
|
611
|
+
logger.info "AFTER AUTHENTICATION: Redirect to requested page: #{j1_web_session['requested_page']}"
|
|
369
612
|
redirect j1_web_session['requested_page']
|
|
370
613
|
end
|
|
371
614
|
|
|
372
615
|
get '/redirect_requested_page' do
|
|
373
|
-
logger.info "
|
|
616
|
+
logger.info "AFTER AUTHENTICATION: Redirect to #{j1_web_session['requested_page']}"
|
|
374
617
|
redirect j1_web_session['requested_page']
|
|
375
618
|
end
|
|
376
619
|
|
|
@@ -379,13 +622,20 @@ module J1App
|
|
|
379
622
|
get '/status' do
|
|
380
623
|
logger.info 'STATUS: info request detected'
|
|
381
624
|
|
|
625
|
+
session_encoded = request.cookies['j1.web.session']
|
|
626
|
+
session_decoded = Base64.decode64(session_encoded)
|
|
627
|
+
j1_web_session = JSON.parse(session_decoded)
|
|
628
|
+
|
|
382
629
|
# if request.warden.user.respond_to?(:info)
|
|
383
630
|
#
|
|
384
631
|
if warden.authenticated?
|
|
632
|
+
user_json = warden.user.to_json
|
|
385
633
|
user = warden.user[:info]['nickname']
|
|
386
634
|
user_id = warden.user[:uid]
|
|
387
635
|
user_info = warden.user[:info]
|
|
388
636
|
provider = warden.user[:provider]
|
|
637
|
+
provider_permissions = j1_web_session['permissions']
|
|
638
|
+
# provider_permissions = J1App.get_provider_permissions "#{provider}"
|
|
389
639
|
logger.info "Detected #{user} as: signed in"
|
|
390
640
|
else
|
|
391
641
|
user = 'unknown'
|
|
@@ -398,21 +648,110 @@ module J1App
|
|
|
398
648
|
logger.info 'STATUS: send SIGNED_IN data'
|
|
399
649
|
content_type 'application/json'
|
|
400
650
|
{
|
|
401
|
-
provider:
|
|
402
|
-
user:
|
|
403
|
-
user_id:
|
|
404
|
-
|
|
651
|
+
provider: provider,
|
|
652
|
+
user: user,
|
|
653
|
+
user_id: user_id,
|
|
654
|
+
permissions: provider_permissions,
|
|
655
|
+
status: 'signed in'
|
|
405
656
|
}.to_json
|
|
406
657
|
else
|
|
407
658
|
logger.info 'STATUS: send SIGNED_OUT data'
|
|
408
659
|
content_type 'application/json'
|
|
409
660
|
{
|
|
410
|
-
provider:
|
|
411
|
-
user:
|
|
412
|
-
user_id:
|
|
413
|
-
|
|
661
|
+
provider: 'unknown',
|
|
662
|
+
user: 'unknown',
|
|
663
|
+
user_id: 'unknown',
|
|
664
|
+
permissions: 'unknown',
|
|
665
|
+
status: 'signed out'
|
|
414
666
|
}.to_json
|
|
415
667
|
end
|
|
416
668
|
end
|
|
669
|
+
|
|
670
|
+
# access_protected_content ENDPOINT called from the app (auth manager)
|
|
671
|
+
# --------------------------------------------------------------------------
|
|
672
|
+
get '/access_denied' do
|
|
673
|
+
|
|
674
|
+
provider = params.fetch('provider')
|
|
675
|
+
category = params.fetch('category')
|
|
676
|
+
user = params.fetch('user')
|
|
677
|
+
|
|
678
|
+
session_encoded = request.cookies['j1.web.session']
|
|
679
|
+
session_decoded = Base64.decode64(session_encoded)
|
|
680
|
+
j1_web_session = JSON.parse(session_decoded)
|
|
681
|
+
|
|
682
|
+
# Update J1 web session data
|
|
683
|
+
# --------------------------------------------------------------------
|
|
684
|
+
j1_web_session['user_name'] = 'unknown'
|
|
685
|
+
j1_web_session['user_id'] = 'unknown'
|
|
686
|
+
j1_web_session['user_details'] = 'unknown'
|
|
687
|
+
j1_web_session['users_allowed'] = 'unknown'
|
|
688
|
+
j1_web_session['user_pledges'] = 'unknown'
|
|
689
|
+
j1_web_session['provider'] = 'unknown'
|
|
690
|
+
j1_web_session['provider_url'] = 'unknown'
|
|
691
|
+
j1_web_session['permissions'] = 'unknown'
|
|
692
|
+
j1_web_session['authenticated'] = 'false'
|
|
693
|
+
j1_web_session['writer'] = 'middleware'
|
|
694
|
+
|
|
695
|
+
# write updated J1 session data to cookie
|
|
696
|
+
#
|
|
697
|
+
session_json = j1_web_session.to_json
|
|
698
|
+
session_encoded = Base64.encode64(session_json)
|
|
699
|
+
logger.info "ACCESS DENIED: Write J1 web session data to cookie"
|
|
700
|
+
# logger.info "ACCESS DENIED: Write J1 web session data as: #{session_json}"
|
|
701
|
+
response.set_cookie(
|
|
702
|
+
'j1.web.session',
|
|
703
|
+
domain: false,
|
|
704
|
+
value: session_encoded.to_s,
|
|
705
|
+
path: '/'
|
|
706
|
+
)
|
|
707
|
+
|
|
708
|
+
route = '/'
|
|
709
|
+
|
|
710
|
+
@route = route
|
|
711
|
+
@provider = provider
|
|
712
|
+
@modal = "centralModalInfo"
|
|
713
|
+
@info_type = "danger"
|
|
714
|
+
@modal_icon = "account-off"
|
|
715
|
+
@modal_ok_text = "Ok, understood"
|
|
716
|
+
@modal_title = "Authentication Manager"
|
|
717
|
+
@modal_description = "<h4>Access denied</h4></br></br> User <b>#{user}</b> from provider <b>#{provider}</b> is not allowed to access <b>#{category}</b> pages."
|
|
718
|
+
|
|
719
|
+
erb :auth_manager_ui
|
|
720
|
+
|
|
721
|
+
end
|
|
722
|
+
|
|
723
|
+
# access_protected_content ENDPOINT called from the app (auth manager)
|
|
724
|
+
# --------------------------------------------------------------------------
|
|
725
|
+
get '/access_protected_content' do
|
|
726
|
+
|
|
727
|
+
provider = params.fetch('provider')
|
|
728
|
+
allowed_users = params.fetch('allowed_users')
|
|
729
|
+
page = params.fetch('page')
|
|
730
|
+
category = params.fetch('category')
|
|
731
|
+
|
|
732
|
+
if warden.authenticated?
|
|
733
|
+
route = page
|
|
734
|
+
else
|
|
735
|
+
route = "/authentication?request=signin&provider=#{provider}&allowed_users=#{allowed_users}"
|
|
736
|
+
end
|
|
737
|
+
|
|
738
|
+
@provider = provider
|
|
739
|
+
@route = route
|
|
740
|
+
@modal = "signInProtectedContent"
|
|
741
|
+
@modal_icon = "login"
|
|
742
|
+
@modal_agreed_text = "Yes, please"
|
|
743
|
+
@modal_disagreed_text = "No, thanks"
|
|
744
|
+
@modal_title = "Authentication Manager"
|
|
745
|
+
@modal_image = "/assets/images/master_header/admin-dashboard-bootstrap.1280x600.png"
|
|
746
|
+
@modal_description = "The page <b>#{page}</b> you requested belongs to <b>#{category}</b> content. You'll be redirected to authenticate with the provider <b>#{provider}</b>. If signed in successfully, you get access to all <b>#{category} pages</b>."
|
|
747
|
+
|
|
748
|
+
erb :auth_manager_ui
|
|
749
|
+
end
|
|
750
|
+
|
|
751
|
+
get '/iframe' do
|
|
752
|
+
@website_url = "https://jekyll-one.github.io/"
|
|
753
|
+
erb :iframe
|
|
754
|
+
end
|
|
755
|
+
|
|
417
756
|
end
|
|
418
757
|
end
|