j1_template_mde 2018.4.11 → 2018.4.12

Sign up to get free protection for your applications and to get access to all the features.
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