diff --git a/Gemfile b/Gemfile index 7b4d6d7..ab52866 100644 --- a/Gemfile +++ b/Gemfile @@ -7,6 +7,7 @@ gemspec gem "rake", "~> 13.0" gem "rackup" +gem "rubytree" gem "rspec", "~> 3.0" diff --git a/Gemfile.lock b/Gemfile.lock index 4aad841..994f7a3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -53,6 +53,8 @@ GEM rubocop (>= 1.7.0, < 2.0) rubocop-ast (>= 0.4.0) ruby-progressbar (1.13.0) + rubytree (2.0.2) + json (~> 2.0, > 2.3.1) standard (1.30.1) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -75,6 +77,7 @@ DEPENDENCIES rackup rake (~> 13.0) rspec (~> 3.0) + rubytree skeksis! standard (~> 1.3) diff --git a/config.ru b/config.ru index 9c47a40..3d1575d 100644 --- a/config.ru +++ b/config.ru @@ -1,4 +1,5 @@ require 'skeksis' +require 'rubytree' class SkeksisApp def initialize diff --git a/lib/skeksis.rb b/lib/skeksis.rb index b8b46e0..8d85155 100644 --- a/lib/skeksis.rb +++ b/lib/skeksis.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "yaml" +require "tree" require_relative "skeksis/version" require_relative "skeksis/parser" @@ -39,9 +40,44 @@ module Skeksis config = YAML.load(File.read("config.yml")) @gemini_uri = config['skeksis_config']['gemini_uri'] @serve_dir = config['skeksis_config']['serve_dir'] + @allowlist = Tree::TreeNode.new("ROOT", false) + + build_allowlist(@allowlist, @serve_dir) + + puts @allowlist.to_h + end + + def build_allowlist(tree, path) + Dir.each_child(path) do |child| + full_path = Pathname.new(path).join(child) + + if child == ".serve_ok" + tree.content = true + end + + serve_ok = false + if Dir.exist?(full_path) + Dir.each_child(full_path) do |subchild| + if subchild == ".serve_ok" + serve_ok = true + end + end + + child_node = Tree::TreeNode.new(child, serve_ok) + tree << child_node + end + end end def query(path, env) + query_path = Pathname.new(path).each_filename.to_a + + @allowlist.children do |child| + if child.name == query_path[0] and child.content == false + return nil + end + end + # Chomps the first / and builds path full_path = Pathname.new(@serve_dir) + path[1..-1] puts full_path.to_s @@ -83,12 +119,19 @@ module Skeksis end listing = Dir.each_child(path).map do |i| - if i == ".directory-listing-ok" + if i == ".directory-listing-ok" or i == ".serve_ok" next end - path = Pathname.new(env['PATH_INFO']).join(i) - uri = URI::HTTP.build(host: http.host, port: http.port, path: path.to_s) + child_path = Pathname.new(path).join(i) + puts child_path + + if Dir.exist?(child_path) and not Dir.each_child(child_path).include?('.serve_ok') + next + end + + uri_path = Pathname.new(env['PATH_INFO']).join(i) + uri = URI::HTTP.build(host: http.host, port: http.port, path: uri_path.to_s) "#{i}
" end.join("\n") [Header + listing + Footer]