markdownr 0.5.9 → 0.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/Dockerfile.markdownr +5 -0
- data/bin/markdownr +10 -0
- data/bin/push-to-docker +12 -0
- data/lib/markdown_server/app.rb +85 -1
- data/lib/markdown_server/version.rb +1 -1
- data/views/admin_login.erb +24 -0
- data/views/setup_info.erb +28 -0
- metadata +5 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: afce137b9a88a74b444125a02f30a12dba75210bd3e223052542bea4ea39d4bf
|
|
4
|
+
data.tar.gz: b2cebe87af19b5f2ec26270b6f5b79d05472357e3dcb6916b9047ca69a27a3d5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 94c9857b53bad2ac793ae931607ee74e06f02f2410a029a0cfd5568754daa4befd6d913257ec9fbb673c594b1701ce4a9ef7e2f7681dba7c16f0406e6a8886ea
|
|
7
|
+
data.tar.gz: b55430f749eadd254de9b2feffd9d9aef09566166d47f33d42be29c58d826955d42a47f7c2fb704ccc807e0748e3b1bfcb7a245c558a38d014acabef2d3894c9
|
data/bin/markdownr
CHANGED
|
@@ -23,6 +23,14 @@ OptionParser.new do |opts|
|
|
|
23
23
|
options[:allow_robots] = true
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
+
opts.on("--behind-proxy", "Trust X-Forwarded-For for client IP (use when behind a reverse proxy like Caddy)") do
|
|
27
|
+
options[:behind_proxy] = true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
opts.on("-i", "--index-file FILENAME", "Render this file instead of the directory listing when present (e.g. index.md, moc.md)") do |f|
|
|
31
|
+
options[:index_file] = f
|
|
32
|
+
end
|
|
33
|
+
|
|
26
34
|
opts.on("--no-link-tooltips", "Disable preview tooltips for local markdown links") do
|
|
27
35
|
options[:link_tooltips] = false
|
|
28
36
|
end
|
|
@@ -46,8 +54,10 @@ unless File.directory?(dir)
|
|
|
46
54
|
end
|
|
47
55
|
|
|
48
56
|
MarkdownServer::App.set :root_dir, dir
|
|
57
|
+
MarkdownServer::App.set :behind_proxy, options[:behind_proxy] || false
|
|
49
58
|
MarkdownServer::App.set :custom_title, options[:title]
|
|
50
59
|
MarkdownServer::App.set :allow_robots, options[:allow_robots] || false
|
|
60
|
+
MarkdownServer::App.set :index_file, options[:index_file]
|
|
51
61
|
MarkdownServer::App.set :link_tooltips, options.fetch(:link_tooltips, true)
|
|
52
62
|
MarkdownServer::App.set :hard_wrap, options.fetch(:hard_wrap, true)
|
|
53
63
|
MarkdownServer::App.set :port, options[:port]
|
data/bin/push-to-docker
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
IMAGE="$DOCKER_HUB_USERNAME/markdownr:latest"
|
|
5
|
+
|
|
6
|
+
echo "$DOCKER_HUB_TOKEN" | docker login -u "$DOCKER_HUB_USERNAME" --password-stdin
|
|
7
|
+
|
|
8
|
+
docker build --no-cache -f bin/Dockerfile.markdownr -t "$IMAGE" .
|
|
9
|
+
|
|
10
|
+
docker push "$IMAGE"
|
|
11
|
+
|
|
12
|
+
docker logout
|
data/lib/markdown_server/app.rb
CHANGED
|
@@ -9,6 +9,7 @@ require "cgi"
|
|
|
9
9
|
require "pathname"
|
|
10
10
|
require "set"
|
|
11
11
|
require "net/http"
|
|
12
|
+
require "base64"
|
|
12
13
|
|
|
13
14
|
module MarkdownServer
|
|
14
15
|
class App < Sinatra::Base
|
|
@@ -20,11 +21,15 @@ module MarkdownServer
|
|
|
20
21
|
set :root_dir, Dir.pwd
|
|
21
22
|
set :custom_title, nil
|
|
22
23
|
set :allow_robots, false
|
|
24
|
+
set :index_file, nil
|
|
23
25
|
set :link_tooltips, true
|
|
24
26
|
set :hard_wrap, true
|
|
25
27
|
set :show_exceptions, false
|
|
26
28
|
set :protection, false
|
|
27
29
|
set :host_authorization, { permitted_hosts: [] }
|
|
30
|
+
set :behind_proxy, false
|
|
31
|
+
set :session_secret, ENV.fetch("MARKDOWNR_SESSION_SECRET", SecureRandom.hex(64))
|
|
32
|
+
set :sessions, key: "markdownr_session", same_site: :strict, httponly: true
|
|
28
33
|
end
|
|
29
34
|
|
|
30
35
|
helpers do
|
|
@@ -729,6 +734,43 @@ module MarkdownServer
|
|
|
729
734
|
raise RegexpError, e.message
|
|
730
735
|
end
|
|
731
736
|
|
|
737
|
+
def client_ip
|
|
738
|
+
if settings.behind_proxy
|
|
739
|
+
fwd = env["HTTP_X_FORWARDED_FOR"].to_s.split(",").map(&:strip).first
|
|
740
|
+
fwd && !fwd.empty? ? fwd : env["REMOTE_ADDR"]
|
|
741
|
+
else
|
|
742
|
+
env["REMOTE_ADDR"]
|
|
743
|
+
end
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
def setup_config
|
|
747
|
+
@setup_config ||= begin
|
|
748
|
+
path = File.join(root_dir, ".setup.yml")
|
|
749
|
+
(File.exist?(path) && YAML.safe_load(File.read(path))) || {}
|
|
750
|
+
rescue StandardError
|
|
751
|
+
{}
|
|
752
|
+
end
|
|
753
|
+
end
|
|
754
|
+
|
|
755
|
+
def admin?
|
|
756
|
+
return true if session[:admin]
|
|
757
|
+
|
|
758
|
+
adm = setup_config["admin"]
|
|
759
|
+
return false unless adm.is_a?(Hash)
|
|
760
|
+
|
|
761
|
+
return true if adm["ip"].to_s.strip == client_ip
|
|
762
|
+
|
|
763
|
+
if adm["user"] && adm["pw"]
|
|
764
|
+
auth = request.env["HTTP_AUTHORIZATION"].to_s
|
|
765
|
+
if auth.start_with?("Basic ")
|
|
766
|
+
user, pw = Base64.decode64(auth[6..]).split(":", 2)
|
|
767
|
+
return true if user == adm["user"].to_s && pw == adm["pw"].to_s
|
|
768
|
+
end
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
false
|
|
772
|
+
end
|
|
773
|
+
|
|
732
774
|
end
|
|
733
775
|
|
|
734
776
|
# Routes
|
|
@@ -746,6 +788,41 @@ module MarkdownServer
|
|
|
746
788
|
redirect "/browse/"
|
|
747
789
|
end
|
|
748
790
|
|
|
791
|
+
get "/setup-info" do
|
|
792
|
+
@title = "Setup Info"
|
|
793
|
+
@client_ip = client_ip
|
|
794
|
+
@is_admin = admin?
|
|
795
|
+
@served_path = root_dir if @is_admin
|
|
796
|
+
@public_config = setup_config.reject { |k, _| k == "admin" }
|
|
797
|
+
erb :setup_info
|
|
798
|
+
end
|
|
799
|
+
|
|
800
|
+
get "/admin/login" do
|
|
801
|
+
@title = "Admin Login"
|
|
802
|
+
@error = session.delete(:login_error)
|
|
803
|
+
@return_to = params[:return_to]
|
|
804
|
+
erb :admin_login
|
|
805
|
+
end
|
|
806
|
+
|
|
807
|
+
post "/admin/login" do
|
|
808
|
+
adm = setup_config["admin"]
|
|
809
|
+
if adm.is_a?(Hash) &&
|
|
810
|
+
params[:username] == adm["user"].to_s &&
|
|
811
|
+
params[:password] == adm["pw"].to_s
|
|
812
|
+
session[:admin] = true
|
|
813
|
+
return_to = params[:return_to].to_s
|
|
814
|
+
redirect(return_to.start_with?("/") ? return_to : "/")
|
|
815
|
+
else
|
|
816
|
+
session[:login_error] = "Invalid username or password."
|
|
817
|
+
redirect "/admin/login"
|
|
818
|
+
end
|
|
819
|
+
end
|
|
820
|
+
|
|
821
|
+
get "/admin/logout" do
|
|
822
|
+
session.clear
|
|
823
|
+
redirect "/"
|
|
824
|
+
end
|
|
825
|
+
|
|
749
826
|
get "/browse/?*" do
|
|
750
827
|
requested = params["splat"].first.to_s
|
|
751
828
|
requested = requested.chomp("/")
|
|
@@ -757,7 +834,14 @@ module MarkdownServer
|
|
|
757
834
|
end
|
|
758
835
|
|
|
759
836
|
if File.directory?(real_path)
|
|
760
|
-
|
|
837
|
+
index = settings.index_file
|
|
838
|
+
index_path = index && File.join(real_path, index)
|
|
839
|
+
if index_path && File.file?(index_path)
|
|
840
|
+
index_rel = requested.empty? ? index : "#{requested}/#{index}"
|
|
841
|
+
render_file(index_path, index_rel)
|
|
842
|
+
else
|
|
843
|
+
render_directory(real_path, requested)
|
|
844
|
+
end
|
|
761
845
|
else
|
|
762
846
|
render_file(real_path, requested)
|
|
763
847
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<div class="title-bar">
|
|
2
|
+
<h1 class="page-title">Admin Login</h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<div class="md-content" style="max-width: 360px;">
|
|
6
|
+
<% if @error %>
|
|
7
|
+
<p style="color: #b33; margin-bottom: 1rem;"><%= h(@error) %></p>
|
|
8
|
+
<% end %>
|
|
9
|
+
|
|
10
|
+
<form method="post" action="/admin/login">
|
|
11
|
+
<input type="hidden" name="return_to" value="<%= h(@return_to.to_s) %>">
|
|
12
|
+
<table class="meta-table" style="margin-bottom: 1rem;">
|
|
13
|
+
<tr>
|
|
14
|
+
<th class="blb-th">Username</th>
|
|
15
|
+
<td><input type="text" name="username" autofocus style="width:100%;padding:2px 4px;"></td>
|
|
16
|
+
</tr>
|
|
17
|
+
<tr>
|
|
18
|
+
<th class="blb-th">Password</th>
|
|
19
|
+
<td><input type="password" name="password" style="width:100%;padding:2px 4px;"></td>
|
|
20
|
+
</tr>
|
|
21
|
+
</table>
|
|
22
|
+
<button type="submit" style="padding:4px 16px;">Log in</button>
|
|
23
|
+
</form>
|
|
24
|
+
</div>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<div class="title-bar">
|
|
2
|
+
<h1 class="page-title">Setup Info</h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<div class="md-content">
|
|
6
|
+
<% if @is_admin %>
|
|
7
|
+
<p><strong>You are an administrator.</strong></p>
|
|
8
|
+
<% end %>
|
|
9
|
+
|
|
10
|
+
<table class="meta-table">
|
|
11
|
+
<tr><th>Your IP</th><td><%= h(@client_ip) %></td></tr>
|
|
12
|
+
<% if @served_path %>
|
|
13
|
+
<tr><th>Serving</th><td><%= h(@served_path) %></td></tr>
|
|
14
|
+
<% end %>
|
|
15
|
+
</table>
|
|
16
|
+
|
|
17
|
+
<% unless @public_config.empty? %>
|
|
18
|
+
<h3>Configuration</h3>
|
|
19
|
+
<table class="meta-table">
|
|
20
|
+
<% @public_config.each do |key, value| %>
|
|
21
|
+
<tr>
|
|
22
|
+
<th><%= h(key.to_s) %></th>
|
|
23
|
+
<td><%= h(value.to_s) %></td>
|
|
24
|
+
</tr>
|
|
25
|
+
<% end %>
|
|
26
|
+
</table>
|
|
27
|
+
<% end %>
|
|
28
|
+
</div>
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: markdownr
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.5.
|
|
4
|
+
version: 0.5.10
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Brian Dunn
|
|
@@ -100,15 +100,19 @@ executables:
|
|
|
100
100
|
extensions: []
|
|
101
101
|
extra_rdoc_files: []
|
|
102
102
|
files:
|
|
103
|
+
- bin/Dockerfile.markdownr
|
|
103
104
|
- bin/markdownr
|
|
105
|
+
- bin/push-to-docker
|
|
104
106
|
- lib/markdown_server.rb
|
|
105
107
|
- lib/markdown_server/app.rb
|
|
106
108
|
- lib/markdown_server/version.rb
|
|
109
|
+
- views/admin_login.erb
|
|
107
110
|
- views/directory.erb
|
|
108
111
|
- views/layout.erb
|
|
109
112
|
- views/markdown.erb
|
|
110
113
|
- views/raw.erb
|
|
111
114
|
- views/search.erb
|
|
115
|
+
- views/setup_info.erb
|
|
112
116
|
homepage: https://github.com/brianmd/markdown-server
|
|
113
117
|
licenses:
|
|
114
118
|
- MIT
|