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.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_blog_archive.html +117 -110
  3. data/_includes/themes/j1/modules/navigator/generator.html +2 -2
  4. data/_includes/themes/j1/modules/navigator/procedures/sidebar.proc +88 -9
  5. data/_includes/themes/j1/procedures/collections/create_collection_article_preview.proc +5 -4
  6. data/_includes/themes/j1/procedures/global/get_page_path.proc +5 -3
  7. data/lib/j1/commands/generate.rb +3 -3
  8. data/lib/j1/version.rb +1 -1
  9. data/lib/j1_app/j1_auth_manager/auth_manager.rb +417 -78
  10. data/lib/j1_app/j1_auth_manager/config.rb +47 -0
  11. data/lib/j1_app/j1_auth_manager/helpers.rb +15 -11
  12. data/lib/j1_app/j1_auth_manager/views/_unused/iframe.erb +29 -0
  13. data/lib/j1_app/j1_auth_manager/views/_unused/modal_page.erb +136 -0
  14. data/lib/j1_app/j1_auth_manager/views/auth_manager_ui.erb +144 -0
  15. data/lib/j1_app/j1_auth_manager/warden_omniauth.rb +8 -6
  16. data/lib/j1_app/omniauth/strategies/disqus.rb +7 -7
  17. data/lib/j1_app/omniauth/strategies/facebook.rb +1 -1
  18. data/lib/j1_app/omniauth/strategies/github.rb +7 -7
  19. data/lib/j1_app/omniauth/strategies/patreon.rb +5 -4
  20. data/lib/j1_app/omniauth/strategies/twitter.rb +1 -1
  21. data/lib/starter_web/Gemfile +2 -2
  22. data/lib/starter_web/_config.yml +27 -19
  23. data/lib/starter_web/_data/modules/_unused/j1_navigator.yml +4 -4
  24. data/lib/starter_web/_data/modules/_unused/j1_navigator_menu.yml +24 -24
  25. data/lib/starter_web/_data/modules/j1_banner.yml +2 -2
  26. data/lib/starter_web/_data/modules/j1_cookiebar.yml +2 -2
  27. data/lib/starter_web/_data/modules/j1_footer.yml +4 -4
  28. data/lib/starter_web/_data/modules/j1_navigator.yml +18 -17
  29. data/lib/starter_web/_data/modules/j1_navigator_menu.yml +37 -64
  30. data/lib/starter_web/_data/modules/j1_panel.yml +15 -15
  31. data/lib/starter_web/_data/modules/j1_theme_switcher.yml +7 -7
  32. data/lib/starter_web/_rack/dot.gitignore +8 -6
  33. data/lib/starter_web/assets/images/master_header/aaron-burden-1280x600.png +0 -0
  34. data/lib/starter_web/assets/images/master_header/admin-dashboard-bootstrap.1280x600.png +0 -0
  35. data/lib/starter_web/assets/images/master_header/chuttersnap-1280x800.png +0 -0
  36. data/lib/starter_web/assets/images/master_header/clark-tibbs-do-something.1280x600.png +0 -0
  37. data/lib/starter_web/assets/images/master_header/clark-tibbs-do-something.1920x900.png +0 -0
  38. data/lib/starter_web/assets/images/master_header/homehead-default-1280x600.png +0 -0
  39. data/lib/starter_web/assets/images/master_header/homehead-default-1920x800.png +0 -0
  40. data/lib/starter_web/assets/images/master_header/ideas-start-here.1280x900.png +0 -0
  41. data/lib/starter_web/assets/images/master_header/maarten-van-den-heuvel.1280x600.png +0 -0
  42. data/lib/starter_web/assets/images/master_header/pagehead-default-1280x500.png +0 -0
  43. data/lib/starter_web/assets/images/master_header/pagehead-default-1920x600.png +0 -0
  44. data/lib/starter_web/assets/images/master_header/water-journal-1280x600.png +0 -0
  45. data/lib/starter_web/assets/themes/j1/core/css/bootstrap.css +895 -286
  46. data/lib/starter_web/assets/themes/j1/core/css/bootstrap.min.css +2 -2
  47. data/lib/starter_web/assets/themes/j1/core/js/adapter/navigator.js +9 -17
  48. data/lib/starter_web/collections/posts/{series → premium/series}/_posts/000_includes/attributes.asciidoc +5 -5
  49. data/lib/starter_web/collections/posts/{series → premium/series}/_posts/000_includes/documents/100-docker-using-shared-folders.asciidoc +0 -0
  50. data/lib/starter_web/collections/posts/{series → premium/series}/_posts/000_includes/documents/loop.sh +0 -0
  51. data/lib/starter_web/collections/posts/{series → premium/series}/_posts/000_includes/tables/debug_variables.asciidoc +2 -1
  52. data/lib/starter_web/collections/posts/premium/series/_posts/2018-11-01-docker-using-shared-folders.adoc +79 -0
  53. 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
  54. data/lib/starter_web/collections/posts/{wikipedia → private/wikipedia}/_posts/2016-11-20-minneapolis.adoc +0 -0
  55. data/lib/starter_web/collections/posts/{wikipedia → private/wikipedia}/_posts/2016-11-24-narcisse-snake-pits.adoc +0 -0
  56. data/lib/starter_web/collections/posts/{wikipedia → private/wikipedia}/_posts/2016-11-26-columbia-river.adoc +0 -0
  57. data/lib/starter_web/collections/posts/{featured → public/featured}/_posts/0000-00-00-welcome-to-j1-template.adoc.erb +0 -0
  58. data/lib/starter_web/collections/posts/public/featured/_posts/000_includes/attributes.asciidoc +46 -0
  59. data/lib/starter_web/collections/posts/{featured → public/featured}/_posts/2017-05-01-confusion-about-base-url.adoc +5 -4
  60. data/lib/starter_web/collections/posts/{featured → public/featured}/_posts/2017-06-01-top-open-source-static-site-generators.adoc +0 -0
  61. data/lib/starter_web/collections/posts/{featured → public/featured}/_posts/2017-07-01-what-is-a-static-site.adoc +0 -0
  62. data/lib/starter_web/package.json +1 -1
  63. data/lib/starter_web/pages/{bookshelf → premium/bookshelf}/100_about_jekyll_collections.adoc +1 -1
  64. data/lib/starter_web/pages/{bookshelf → premium/bookshelf}/200_book_shelf_biography.adoc +1 -1
  65. data/lib/starter_web/pages/{bookshelf → premium/bookshelf}/300_book_shelf_fantasy.adoc +1 -1
  66. data/lib/starter_web/pages/{bookshelf → premium/bookshelf}/400_book_shelf_romance.adoc +1 -1
  67. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/attributes.asciidoc +0 -0
  68. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/100_absolute_sizes.asciidoc +0 -0
  69. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/110_bs_grid_sizes.asciidoc +0 -0
  70. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/120_relative_sizes.asciidoc +0 -0
  71. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/200_rotate.asciidoc +0 -0
  72. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/300_flip.asciidoc +0 -0
  73. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/400_spin_pulsed.asciidoc +0 -0
  74. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/500_bw_color_palette.asciidoc +0 -0
  75. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/510_bs_color_palette.asciidoc +0 -0
  76. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/600_md_color_palette.asciidoc +0 -0
  77. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/601_md_color_palette_indigo.asciidoc +0 -0
  78. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/mdi_icons/602_md_color_palette_pink.asciidoc +0 -0
  79. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/100_bs_sizes.asciidoc +0 -0
  80. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/100_relative_sizes.asciidoc +0 -0
  81. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/200_rotate.asciidoc +0 -0
  82. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/300_flip.asciidoc +0 -0
  83. data/lib/starter_web/pages/{previewer → private/previewer}/000_includes/tables/twitter_emoji/400_spin_pulsed.asciidoc +0 -0
  84. data/lib/starter_web/pages/{previewer → private/previewer}/justified_gallery.html +1 -1
  85. data/lib/starter_web/pages/{previewer → private/previewer}/mdi_icons_preview.adoc +1 -1
  86. data/lib/starter_web/pages/{previewer → private/previewer}/twitter_emoji_preview.adoc +1 -1
  87. data/lib/starter_web/pages/{about → public/about}/about_site.adoc +1 -1
  88. data/lib/starter_web/pages/{blog → public/blog}/navigator/archive.html +11 -11
  89. data/lib/starter_web/pages/{blog/navigator/archive_by_category.html → public/blog/navigator/archive/categoryview.html} +11 -11
  90. data/lib/starter_web/pages/{blog/navigator/archive_by_date.html → public/blog/navigator/archive/dateview.html} +11 -12
  91. data/lib/starter_web/pages/{blog/navigator/archive_by_tag.html → public/blog/navigator/archive/tagview.html} +12 -12
  92. data/lib/starter_web/pages/{blog → public/blog}/navigator/index.html +0 -0
  93. data/lib/starter_web/pages/{legal → public/legal}/de/100_impress.adoc +1 -1
  94. data/lib/starter_web/pages/{legal → public/legal}/de/200_terms_of_use.adoc +1 -1
  95. data/lib/starter_web/pages/{legal → public/legal}/de/300_privacy.adoc +1 -1
  96. data/lib/starter_web/pages/{legal → public/legal}/de/400_license_agreement.adoc +1 -1
  97. data/lib/starter_web/pages/{legal → public/legal}/de/500_support.adoc +1 -1
  98. data/lib/starter_web/pages/{legal → public/legal}/en/100_impress.adoc +1 -1
  99. data/lib/starter_web/pages/{legal → public/legal}/en/200_terms_of_use.adoc +1 -1
  100. data/lib/starter_web/pages/{legal → public/legal}/en/300_privacy.adoc +1 -1
  101. data/lib/starter_web/pages/{legal → public/legal}/en/400_license_agreement.adoc +1 -1
  102. data/lib/starter_web/pages/{legal → public/legal}/en/500_support.adoc +1 -1
  103. data/lib/starter_web/pages/{panel/100_intro_panel.adoc → public/panels/intro_panel.adoc} +1 -1
  104. data/lib/starter_web/pages/public/previewer/000_includes/attributes.asciidoc +75 -0
  105. data/lib/starter_web/pages/{previewer → public/previewer}/bootstrap_theme.adoc +13 -8
  106. data/lib/starter_web/pages/{start → public/start}/000_includes/attributes.asciidoc +1 -1
  107. data/lib/starter_web/pages/{start → public/start}/change_me_first.adoc +1 -1
  108. data/lib/starter_web/pages/{start → public/start}/dm920hd.adoc +1 -1
  109. data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/000_includes/attributes.asciidoc +4 -4
  110. data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/000_includes/tables/100_quickstart_installation_packages.asciidoc +0 -0
  111. data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/100_linux_starter.adoc +1 -1
  112. data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/200_macos_starter.adoc +1 -1
  113. data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/300_windows_starter.adoc +1 -1
  114. data/lib/starter_web/pages/{start → public/start}/downloads/quickstarter/quickstart.adoc +1 -1
  115. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/attributes.asciidoc +0 -0
  116. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/collections.adoc +0 -0
  117. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/configuration.adoc +1 -1
  118. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/directory_structure.adoc +0 -0
  119. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/jekyll_commandline.adoc +0 -0
  120. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/layout_inheritance.adoc +0 -0
  121. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/manage_pages.adoc +0 -0
  122. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/manage_posts.adoc +0 -0
  123. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/pagination.adoc +0 -0
  124. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/plugins.adoc +0 -0
  125. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/templates.adoc +0 -0
  126. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/000_includes/documents/variables.adoc +0 -0
  127. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/100_introduction.adoc +1 -1
  128. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/110_preparations.adoc +1 -1
  129. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/120_getting_started.adoc +1 -1
  130. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/_unused/20_j1_anatomy.asciidoc +1 -1
  131. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/_unused/30_j1_configure_your_site.asciidoc +1 -1
  132. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/_unused/40_j1_create_content.asciidoc +1 -1
  133. data/lib/starter_web/pages/{start → public/start}/kickstarter/web_in_a_day/_unused/50_j1_customize_your_pages.asciidoc +1 -1
  134. data/lib/starter_web/pages/{start → public/start}/read_me_first.adoc +1 -1
  135. data/lib/starter_web/pages/public/start/roundtrip/000_includes/attributes.asciidoc +90 -0
  136. data/lib/starter_web/pages/{start → public/start}/roundtrip/000_includes/documents/100_gistblock.asciidoc +0 -0
  137. data/lib/starter_web/pages/{start → public/start}/roundtrip/100_present_images.adoc +2 -3
  138. data/lib/starter_web/pages/{start → public/start}/roundtrip/200_cards.adoc +1 -1
  139. data/lib/starter_web/pages/{start → public/start}/roundtrip/300_typography.adoc +1 -1
  140. data/lib/starter_web/pages/{start → public/start}/roundtrip/400_icon_fonts.adoc +1 -1
  141. data/lib/starter_web/pages/{start → public/start}/roundtrip/500_asciidoc_extensions.adoc +1 -1
  142. data/lib/starter_web/pages/{start → public/start}/roundtrip/600_themes.adoc +1 -1
  143. data/lib/starter_web/pages/{start/roundtrip/700_additional_modals.adoc → public/start/roundtrip/700_j1_modals.adoc} +25 -36
  144. data/lib/starter_web/pages/{teaser → public/teaser}/100_core.adoc +1 -1
  145. data/lib/starter_web/pages/{teaser → public/teaser}/200_components.adoc +1 -1
  146. data/lib/starter_web/pages/{teaser → public/teaser}/300_modules.adoc +1 -1
  147. metadata +115 -209
  148. data/lib/starter_web/apps/calendar/index.adoc +0 -71
  149. data/lib/starter_web/apps/link_checker/index.html +0 -24
  150. data/lib/starter_web/assets/apps/link-checker/assets/img/main/img22.jpg +0 -0
  151. data/lib/starter_web/assets/apps/link-checker/assets/img/main/img22.png +0 -0
  152. data/lib/starter_web/assets/apps/link-checker/index.html +0 -125
  153. data/lib/starter_web/assets/apps/link-checker/src/bootstrap/css/bootstrap.min.css +0 -1560
  154. data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  155. data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -288
  156. data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  157. data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  158. data/lib/starter_web/assets/apps/link-checker/src/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  159. data/lib/starter_web/assets/apps/link-checker/src/bootstrap/js/bootstrap.min.js +0 -7
  160. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/LICENSE.md +0 -11
  161. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/README.md +0 -105
  162. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/css/font-awesome.css +0 -2337
  163. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/css/font-awesome.min.css +0 -4
  164. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/FontAwesome.otf +0 -0
  165. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.eot +0 -0
  166. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.svg +0 -2671
  167. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.ttf +0 -0
  168. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.woff +0 -0
  169. data/lib/starter_web/assets/apps/link-checker/src/fonts/font_awesome/fonts/fontawesome-webfont.woff2 +0 -0
  170. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/How_to_use_webfonts.html +0 -230
  171. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular-demo.html +0 -372
  172. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular.eot +0 -0
  173. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular.svg +0 -621
  174. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular.ttf +0 -0
  175. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/Roboto-Regular.woff +0 -0
  176. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/specimen_files/Roboto-Regular-cleartype.png +0 -0
  177. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/specimen_files/grid_12-825-55-15.css +0 -129
  178. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/specimen_files/specimen_stylesheet.css +0 -396
  179. data/lib/starter_web/assets/apps/link-checker/src/fonts/roboto/stylesheet.css +0 -12
  180. data/lib/starter_web/assets/apps/link-checker/src/link-checker/css/link-checker.css +0 -87
  181. data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/backbone.1.3.2.js +0 -1920
  182. data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/backbone.min.js +0 -37
  183. data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/html5shiv.min.js +0 -4
  184. data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/iframeResizer.contentWindow.min.js +0 -9
  185. data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/jquery.min.js +0 -6
  186. data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/jsuri-1.1.1.min.js +0 -2
  187. data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/link-checker.js +0 -333
  188. data/lib/starter_web/assets/apps/link-checker/src/link-checker/js/underscore.min.js +0 -31
  189. data/lib/starter_web/assets/images/master_header/aaron-burden-1200.jpg +0 -0
  190. data/lib/starter_web/assets/images/master_header/alexey-ruban-slider.jpg +0 -0
  191. data/lib/starter_web/assets/images/master_header/chuttersnap-1200.jpg +0 -0
  192. data/lib/starter_web/assets/images/master_header/clark-tibbs-do-something.jpg +0 -0
  193. data/lib/starter_web/assets/images/master_header/homehead-default-1200.jpg +0 -0
  194. data/lib/starter_web/assets/images/master_header/ideas-start-here.1200x800.png +0 -0
  195. data/lib/starter_web/assets/images/master_header/ideas-start-here.jpg +0 -0
  196. data/lib/starter_web/assets/images/master_header/maarten-van-den-heuvel-1200.jpg +0 -0
  197. data/lib/starter_web/assets/images/master_header/pagehead-default-1200.jpg +0 -0
  198. data/lib/starter_web/assets/images/master_header/stefan-stefancik-1200.jpg +0 -0
  199. data/lib/starter_web/assets/images/master_header/water-journal-1200.jpg +0 -0
  200. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/001_menubar_example.png +0 -0
  201. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/005_navbar.png +0 -0
  202. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/005_navigation_bar.png +0 -0
  203. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/006_navigation_side_bar.png +0 -0
  204. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/006_searchbar.png +0 -0
  205. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/007_sidebar.png +0 -0
  206. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/008_navbar_blank.png +0 -0
  207. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/010_nav_bar.png +0 -0
  208. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/010_top_search.png +0 -0
  209. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/012_top_search.png +0 -0
  210. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/015_quicklink_bar.png +0 -0
  211. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/017_side_bar.png +0 -0
  212. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/200_navigation/020_menu_bar.png +0 -0
  213. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/2-tier-architecture-1280x600.png +0 -0
  214. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/3-tier-architecture-1280x600.png +0 -0
  215. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/download_image_create_starter.800x600.png +0 -0
  216. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1-app-authclient-icon.1280x600.png +0 -0
  217. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1-app-authclient-signin.1280x700.png +0 -0
  218. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1-app-authclient-signout.1280x700.png +0 -0
  219. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1-disqus-comment-dialog.1280x500.png +0 -0
  220. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1_development_system-1280x600.png +0 -0
  221. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/j1_runtime_system-1280x600.png +0 -0
  222. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/rack_based_web_app-1280x600.png +0 -0
  223. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/rack_based_web_app.png +0 -0
  224. 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
  225. data/lib/starter_web/assets/images/pages/documentation/100_user_guide/200_modules/240_auth_manager/run_starter_web.800x700.png +0 -0
  226. data/lib/starter_web/collections/posts/featured/_posts/000_includes/attributes.asciidoc +0 -15
  227. data/lib/starter_web/pages/about/about_you.adoc +0 -103
  228. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/attributes.asciidoc +0 -72
  229. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/documents/200_library_features.asciidoc +0 -285
  230. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/001_menu_bar_example.png +0 -0
  231. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/005_navbar.png +0 -0
  232. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/005_navigation_bar.png +0 -0
  233. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/006_navigation_side_bar.png +0 -0
  234. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/006_searchbar.png +0 -0
  235. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/007_sidebar.png +0 -0
  236. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/008_navbar_blank.png +0 -0
  237. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/010_nav_bar.png +0 -0
  238. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/010_top_search.png +0 -0
  239. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/012_top_search.png +0 -0
  240. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/015_quicklink_bar.png +0 -0
  241. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/017_side_bar.png +0 -0
  242. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/020_menu_bar.png +0 -0
  243. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/400_master_header.png +0 -0
  244. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/410_text_header.png +0 -0
  245. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/411_text_header.png +0 -0
  246. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/412_header_anatomy.png +0 -0
  247. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/415_image_header_caption.png +0 -0
  248. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/images/snagit/412_header_anatomy.snag +0 -0
  249. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/000_text_sizes.asciidoc +0 -50
  250. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/410_common_header_parameters.asciidoc +0 -120
  251. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/420_common_image_header_parameters.asciidoc +0 -52
  252. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/421_additional_image_header_parameters.asciidoc +0 -36
  253. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/430_video_header_parameters.asciidoc +0 -26
  254. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/440_image_and_video_transitions.asciidoc +0 -36
  255. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/450_image_and_video_header_defaults.asciidoc +0 -82
  256. data/lib/starter_web/pages/start/documentation/user_guide/100_header/000_includes/tables/451_additional_image_and_video_header_defaults.asciidoc +0 -23
  257. data/lib/starter_web/pages/start/documentation/user_guide/100_header/100_header.adoc +0 -452
  258. data/lib/starter_web/pages/start/documentation/user_guide/240_auth_manager/000_includes/attributes.asciidoc +0 -119
  259. data/lib/starter_web/pages/start/documentation/user_guide/240_auth_manager/100_auth_manager.adoc +0 -539
  260. 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 collections_dir %}{% endcapture %}
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 %}
@@ -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
@@ -1,3 +1,3 @@
1
1
  module J1
2
- VERSION = '2018.4.11'
2
+ VERSION = '2018.4.12'
3
3
  end
@@ -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' => 'unknown',
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
- # Check auth status for content of type "pages"
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 '/pages/*' do
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: read J1 web session data as: #{session_decoded}"
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
- j1_web_session['authenticated'] = warden.authenticated? ? 'true' : 'false'
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
- # Content and user detection schema (page and authentication logic)
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
- pass if warden.authenticated?
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
- else
214
- raise J1App::ConfigError
215
- end
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 = params.fetch('request')
230
- provider = params.fetch('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 signing in at: #{provider}"
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
- response.set_cookie('j1.web.session', value: session_encoded.to_s)
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
- response.set_cookie('j1.web.session', value: session_encoded.to_s)
334
- logger.info "SIGNOUT: redirect to #{j1_web_session['requested_page']}"
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
- # update web session data
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: write J1 web session data as: #{session_json}"
364
- response.set_cookie('j1.web.session', value: session_encoded.to_s)
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 selected page
608
+ # redirect to requested page
367
609
  #
368
- logger.info "AFTER AUTHENTICATION: redirect to #{j1_web_session['requested_page']}"
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 "REDIRECT REQUESTED PAGE: redirect to #{j1_web_session['requested_page']}"
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: provider,
402
- user: user,
403
- user_id: user_id,
404
- status: 'signed in'
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: 'unknown',
411
- user: 'unknown',
412
- user_id: 'unknown',
413
- status: 'signed out'
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