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]