Compare commits
104 Commits
Author | SHA1 | Date | |
---|---|---|---|
0ad9d4ead6 | |||
|
faf0b2e62c | ||
|
5b1d9ad6c6 | ||
|
c76d2d2204 | ||
|
8f1e2c6309 | ||
c0ec14c8b8 | |||
464bd352a0 | |||
5b255b7344 | |||
d9e416f47f | |||
91cd3746ad | |||
1faa3a29c3 | |||
58d8b3e629 | |||
|
b6365a5dfb | ||
db0c047d23 | |||
437e83d919 | |||
eb63247c25 | |||
d47f98a277 | |||
5f889bb284 | |||
751e57dafc | |||
|
febda62a5c | ||
261ecbb1a1 | |||
da03f4015c | |||
3cf85dff17 | |||
a736916f7d | |||
|
ade4beb0ae | ||
|
5b596f05ca | ||
356ba5e3bc | |||
fa1507e29d | |||
9c8fbcf7b9 | |||
3df864e946 | |||
156494c74f | |||
|
aa2f9d11a1 | ||
84034daa8b | |||
6cbfa60450 | |||
7dfd27cd6b | |||
7d083f94f8 | |||
9beac1ceeb | |||
84bb3b52e3 | |||
1a2822e948 | |||
0c5ed87aaa | |||
d64a8d85d2 | |||
c2b1cadfbb | |||
d2be334510 | |||
a2500aaa38 | |||
dd12a9f121 | |||
5a5c7e62d4 | |||
a14801a541 | |||
252446126c | |||
313af5819f | |||
9029c132ba | |||
2746790cb4 | |||
b5f254f699 | |||
fc5d6206e4 | |||
d2388c98c9 | |||
b4723773e9 | |||
3202e68213 | |||
dec3776072 | |||
8bad255d19 | |||
a53c939540 | |||
1c64edb4d8 | |||
ad348b4cbc | |||
ab4283e836 | |||
fd408985b4 | |||
f515b90176 | |||
1a995ca8be | |||
4353ede23f | |||
539c282f10 | |||
1c9f2bc661 | |||
2b1f7af389 | |||
c07347e48f | |||
066256a718 | |||
5af34e3dc3 | |||
f627d43d84 | |||
d8cfb5e3a7 | |||
1320d534e1 | |||
80175d81c3 | |||
fb8e0857f9 | |||
a8921ec26b | |||
415c2a4945 | |||
04b2f750c8 | |||
f706ada8be | |||
3cf9f00472 | |||
a12a60106b | |||
58166cfc93 | |||
|
6d9c94ed06 | ||
|
2e92c22c41 | ||
|
bb46ff6ff0 | ||
|
4fbac24c29 | ||
|
e8bc3d6b24 | ||
|
a27834050b | ||
|
ba734ca83f | ||
|
f0de0ff69d | ||
|
71ea07b095 | ||
|
730d1f0fce | ||
|
1ca937b00f | ||
|
caaa227e79 | ||
|
e9f679ceb8 | ||
|
91f279b4a2 | ||
|
98469689e9 | ||
|
17d40578b7 | ||
|
4c327987bd | ||
|
c9b500716e | ||
|
b1aab3217b | ||
|
fcd4987b21 |
12
.drone.yml
Normal file
12
.drone.yml
Normal file
|
@ -0,0 +1,12 @@
|
|||
kind: pipeline
|
||||
name: default
|
||||
steps:
|
||||
- name: test
|
||||
image: crystallang/crystal:latest-alpine
|
||||
environment:
|
||||
commands:
|
||||
- apk --no-cache add curl
|
||||
- mkdir -p /tmp/files
|
||||
- make deps
|
||||
- make test
|
||||
- make build
|
|
@ -1 +0,0 @@
|
|||
language: crystal
|
37
Dockerfile
37
Dockerfile
|
@ -1,30 +1,29 @@
|
|||
#FROM manastech/crystal
|
||||
FROM greyltc/archlinux
|
||||
MAINTAINER Arthur Poulet <arthur.poulet@mailoo.org>
|
||||
|
||||
# Install crystal
|
||||
RUN pacman -Syu --noprogressbar --noconfirm crystal shards llvm35 llvm35-libs clang35 base-devel libxml2
|
||||
|
||||
# Install shards
|
||||
WORKDIR /usr/local
|
||||
#RUN apt-get update
|
||||
#RUN DEBIAN_FRONTEND=noninteractive apt-get install -y curl git libssl-dev
|
||||
#RUN curl -Lo bin/shards.gz https://github.com/crystal-lang/shards/releases/download/v0.6.3/shards-0.6.3_linux_x86_64.gz; gunzip bin/shards.gz; chmod 755 bin/shards
|
||||
FROM alpine:edge AS builder
|
||||
|
||||
# Add this directory to container as /app
|
||||
ADD . /transfer_more
|
||||
WORKDIR /transfer_more
|
||||
ADD . /build
|
||||
WORKDIR /build
|
||||
|
||||
# Install dependencies
|
||||
RUN apk add --no-cache \
|
||||
crystal shards libc-dev yaml-dev libxml2-dev zlib-dev openssl-dev curl
|
||||
|
||||
# Install shards
|
||||
RUN shards install
|
||||
|
||||
# Build our app
|
||||
RUN crystal build --release src/transfer_more.cr
|
||||
RUN crystal build --release --warnings all src/transfer_more.cr
|
||||
|
||||
# Run the tests
|
||||
RUN mkdir /tmp/files
|
||||
#RUN crystal spec
|
||||
RUN mkdir /tmp/files && crystal spec
|
||||
|
||||
EXPOSE 3000
|
||||
FROM alpine:edge
|
||||
MAINTAINER Arthur Poulet <arthur.poulet@sceptique.eu>
|
||||
|
||||
ENTRYPOINT ./transfer_more --port 3000
|
||||
RUN apk add --no-cache libgcc libevent libgc++ pcre2
|
||||
|
||||
WORKDIR /app
|
||||
ADD ./public /app/public
|
||||
COPY --from=builder /build/transfer_more ./transfer_more
|
||||
|
||||
ENTRYPOINT ["./transfer_more"]
|
||||
|
|
11
Makefile
11
Makefile
|
@ -6,9 +6,9 @@ all: deps_opt build
|
|||
run:
|
||||
crystal run src/transfer_more.cr
|
||||
build:
|
||||
crystal build src/transfer_more.cr --stats -o $(NAME)
|
||||
crystal build src/transfer_more.cr --stats --warnings all -o $(NAME)
|
||||
release:
|
||||
crystal build src/transfer_more.cr --stats --release -o $(NAME)
|
||||
crystal build src/transfer_more.cr --stats --release --warnings all -o $(NAME)
|
||||
test:
|
||||
crystal spec
|
||||
deps:
|
||||
|
@ -20,9 +20,8 @@ deps_opt:
|
|||
doc:
|
||||
crystal docs
|
||||
install:
|
||||
mkdir -p $(PREFIX)/bin
|
||||
cp $(NAME) $(PREFIX)/bin/$(NAME)
|
||||
uninstall:
|
||||
rm $(PREFIX)/bin/$(NAME)
|
||||
mkdir -p $(PREFIX)/transfer-more
|
||||
cp $(NAME) $(PREFIX)/transfer-more/
|
||||
cp -r public $(PREFIX)/transfer-more/
|
||||
|
||||
.PHONY: all run build release test deps deps_update doc install uninstall
|
||||
|
|
117
README.md
117
README.md
|
@ -1,16 +1,18 @@
|
|||
**Upstream on <https://git.sceptique.eu/Sceptique/transfer_more>**
|
||||
|
||||
# transfer_more
|
||||
|
||||
Fast and lite file upload server ([transfer.sh](https://transfer.sh/) clone).
|
||||
|
||||
![screenshot](https://screenshots.firefoxusercontent.com/images/191ebbd9-a5ea-4fe9-ab8c-d896f59ea08c.png)
|
||||
![screenshot](https://raw.githubusercontent.com/Nephos/transfer_more/master/sample.png)
|
||||
|
||||
- It's a simple online file sharing.
|
||||
- Files older than 7 days are destroyed (configurable).
|
||||
- Recognize shebangs, magic numbers, ...
|
||||
|
||||
## Installation [![travis](https://travis-ci.org/Nephos/transfer_more.svg)](https://travis-ci.org/Nephos/transfer_more)
|
||||
## Installation [![Build Status](https://drone.sceptique.eu/api/badges/Sceptique/transfer_more/status.svg)](https://drone.sceptique.eu/Sceptique/transfer_more)
|
||||
|
||||
Compatible crystal v0.27.0
|
||||
Compatible crystal v1.9.2
|
||||
|
||||
### From source
|
||||
|
||||
|
@ -20,12 +22,70 @@ make test # run unit test
|
|||
make doc # build the documentation
|
||||
```
|
||||
|
||||
### From AUR with yaourt
|
||||
### From AUR with yay (or yaourt etc.)
|
||||
|
||||
```sh
|
||||
yaourt -S transfer-more
|
||||
yay -S transfer-more
|
||||
```
|
||||
|
||||
### As a systemd service
|
||||
|
||||
[Unit]
|
||||
Description=Tranfer more file sharing
|
||||
Documentation=https://wiki.archlinux.org/index.php/Transfer-more
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/share/transfer-more/transfer-more --port 10003 --bind 127.0.0.1
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
Environment="TRANSFER_SSL_ENABLED=true"
|
||||
WorkingDirectory=/usr/share/transfer-more/
|
||||
|
||||
# Hardening
|
||||
MemoryDenyWriteExecute=true
|
||||
SystemCallArchitectures=native
|
||||
CapabilityBoundingSet=
|
||||
NoNewPrivileges=true
|
||||
RemoveIPC=true
|
||||
LockPersonality=true
|
||||
|
||||
ProtectControlGroups=true
|
||||
ProtectKernelTunables=true
|
||||
ProtectKernelModules=true
|
||||
ProtectKernelLogs=true
|
||||
ProtectClock=true
|
||||
ProtectHostname=true
|
||||
ProtectProc=noaccess
|
||||
|
||||
RestrictRealtime=true
|
||||
RestrictSUIDSGID=true
|
||||
RestrictNamespaces=true
|
||||
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
|
||||
|
||||
ProtectSystem=full
|
||||
ProtectHome=true
|
||||
PrivateDevices=true
|
||||
PrivateTmp=true
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
|
||||
### Behind a nginx proxy
|
||||
|
||||
You should configure your nginx with `/etc/nginx/servers-enabled/transfer-more.conf`:
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name your.sub.domain;
|
||||
client_max_body_size 1G;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
location / {
|
||||
proxy_pass http://localhost:3000;
|
||||
}
|
||||
}
|
||||
|
||||
## Usage
|
||||
|
||||
### Run the Server
|
||||
|
@ -34,8 +94,11 @@ yaourt -S transfer-more
|
|||
export TRANSFER_SSL_ENABLED=true # true if the ssl is enabled, any other string is false
|
||||
export TRANSFER_BASE_STORAGE="/tmp" # where the files will be kept
|
||||
export TRANSFER_SECURE_SIZE=4 # how much characters to identify a file
|
||||
export TRANSFER_STORRAGE_DAYS=7 # how much time the files are kept
|
||||
export TRANSFER_STORAGE_DAYS=7 # how much time the files are kept
|
||||
export TRANSFER_TIME_FORMAT="%y%m%d%H"
|
||||
export TRANSFER_HOST_PORT="localhost:3000" # in pinciple it is auto solved using the http headers, optional
|
||||
export TRANSFER_MORE_FOOTER="Something <strong>important</strong> on the bottom" # replace the default footer
|
||||
export TRANSFER_MORE_TITLE="MyName upload" # replace the default title
|
||||
./transfer_more
|
||||
```
|
||||
|
||||
|
@ -51,32 +114,50 @@ export TRANSFER_TIME_FORMAT="%y%m%d%H"
|
|||
curl --progress-bar --upload-file file.mp4 http://domain/name.mp4
|
||||
```
|
||||
|
||||
### Inside a docker
|
||||
### Inside a Docker container
|
||||
|
||||
If you are using docker-compose:
|
||||
```sh
|
||||
docker build -t transfer_more . && docker run -p 3000:3000 transfer_more
|
||||
```
|
||||
|
||||
Or with docker-compose:
|
||||
|
||||
```sh
|
||||
docker-compose build && docker-compose up
|
||||
```
|
||||
|
||||
Else, you can do:
|
||||
### [ShareX](https://github.com/ShareX) template
|
||||
|
||||
```sh
|
||||
docker build -t transfer_more . && docker run transfer_more
|
||||
```json
|
||||
{
|
||||
"Name": "Sceptique",
|
||||
"DestinationType": "ImageUploader, TextUploader, FileUploader, URLShortener",
|
||||
"RequestURL": "https://up.sceptique.eu/",
|
||||
"FileFormName": "file",
|
||||
"Headers": {
|
||||
"User-Agent": "curl"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
TODO: Write development instructions here
|
||||
For now I don't have much plan expanding the feature of it, as it fulfills all my needs.
|
||||
|
||||
I will keep updating with each crystal new release.
|
||||
|
||||
## Contributing
|
||||
|
||||
1. Fork it ( <https://github.com/Nephos/transfer_more/fork> )
|
||||
2. Create your feature branch (git checkout -b my-new-feature)
|
||||
3. Commit your changes (git commit -am 'Add some feature')
|
||||
4. Push to the branch (git push origin my-new-feature)
|
||||
5. Create a new Pull Request
|
||||
Feel free to propose new feature anyway, we can just put them behind feature flag if it's overkill.
|
||||
|
||||
Review your own coding style as possible.
|
||||
|
||||
Do not try to include external CI in the upstream, I don't want big centralized service of the GAFAM as possible.
|
||||
|
||||
You can either propose a patch in an issue or open a merge request on <https://git.sceptique.eu/Sceptique/transfer_more/fork>.
|
||||
|
||||
You can propose it on github if you want, but git.sceptique.eu accept github OAuth so it's very quick to setup and it's my prefered way.
|
||||
|
||||
## Contributors
|
||||
|
||||
- [Nephos](https://github.com/Nephos) Arthur Poulet - creator, maintainer
|
||||
- [Sceptique](https://git.sceptique.eu/Sceptique) Arthur Poulet - creator, maintainer
|
||||
|
|
102
public/images/favico.svg
Normal file
102
public/images/favico.svg
Normal file
|
@ -0,0 +1,102 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
viewBox="0 0 210 297"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
sodipodi:docname="carré.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#505050"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.4142136"
|
||||
inkscape:cx="210.71782"
|
||||
inkscape:cy="277.18586"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1003"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2791" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs2" />
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#85b5bb;fill-opacity:1;stroke-width:2.86198"
|
||||
id="rect165"
|
||||
width="100"
|
||||
height="100"
|
||||
x="51.59375"
|
||||
y="34.395832"
|
||||
ry="0" />
|
||||
<rect
|
||||
style="fill:#e3d7f4;fill-opacity:1;stroke-width:0.198284"
|
||||
id="rect2559-2-2"
|
||||
width="25"
|
||||
height="25"
|
||||
x="89.09375"
|
||||
y="96.895828" />
|
||||
<g
|
||||
id="g3324"
|
||||
transform="translate(0.07217726,-2.5000051)">
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#e3d7f4;fill-opacity:1;stroke-width:0.264583"
|
||||
id="path2665-6"
|
||||
inkscape:flatsided="true"
|
||||
sodipodi:sides="3"
|
||||
sodipodi:cx="79.323067"
|
||||
sodipodi:cy="58.415363"
|
||||
sodipodi:r1="33.237694"
|
||||
sodipodi:r2="16.618849"
|
||||
sodipodi:arg1="0.5281275"
|
||||
sodipodi:arg2="1.5753251"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="M 108.0322,75.164397 50.463413,74.903682 79.473591,25.17801 Z"
|
||||
inkscape:transform-center-x="0.024065192"
|
||||
inkscape:transform-center-y="-5.8292997"
|
||||
transform="matrix(0.86851499,-0.00296818,0.00248553,0.70188644,32.507167,46.96568)" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#e3d7f4;fill-opacity:1;stroke-width:0.264583"
|
||||
id="path2665-6-9"
|
||||
inkscape:flatsided="true"
|
||||
sodipodi:sides="3"
|
||||
sodipodi:cx="79.323067"
|
||||
sodipodi:cy="58.415363"
|
||||
sodipodi:r1="33.237694"
|
||||
sodipodi:r2="16.618849"
|
||||
sodipodi:arg1="0.5281275"
|
||||
sodipodi:arg2="1.5753251"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="M 108.0322,75.164397 50.463413,74.903682 79.473591,25.17801 Z"
|
||||
inkscape:transform-center-x="0.024065192"
|
||||
inkscape:transform-center-y="-5.8292997"
|
||||
transform="matrix(0.86851499,-0.00296818,0.00248553,0.70188644,32.507165,29.45962)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.2 KiB |
BIN
public/images/favicon.ico
Normal file
BIN
public/images/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
Binary file not shown.
Before Width: | Height: | Size: 4.9 KiB |
BIN
sample.png
Normal file
BIN
sample.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 99 KiB |
22
shard.lock
22
shard.lock
|
@ -1,18 +1,18 @@
|
|||
version: 1.0
|
||||
version: 2.0
|
||||
shards:
|
||||
backtracer:
|
||||
git: https://github.com/sija/backtracer.cr.git
|
||||
version: 1.2.2
|
||||
|
||||
exception_page:
|
||||
github: crystal-loot/exception_page
|
||||
version: 0.1.1
|
||||
git: https://github.com/crystal-loot/exception_page.git
|
||||
version: 0.3.0
|
||||
|
||||
kemal:
|
||||
github: sdogruyol/kemal
|
||||
commit: 482b4a6e7dc3be7a0352fc6b8ee8108fe4cb1105
|
||||
|
||||
kilt:
|
||||
github: jeromegn/kilt
|
||||
version: 0.4.0
|
||||
git: https://github.com/sdogruyol/kemal.git
|
||||
version: 1.3.0
|
||||
|
||||
radix:
|
||||
github: luislavena/radix
|
||||
version: 0.3.8
|
||||
git: https://github.com/luislavena/radix.git
|
||||
version: 0.4.1
|
||||
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
name: transfer_more
|
||||
version: 0.5.0
|
||||
version: 0.5.9
|
||||
|
||||
authors:
|
||||
- Arthur Poulet <arthur.poulet@mailoo.org>
|
||||
- Arthur Poulet <arthur.poulet@sceptique.eu>
|
||||
|
||||
license: GPL-3.0
|
||||
|
||||
dependencies:
|
||||
kemal:
|
||||
github: sdogruyol/kemal
|
||||
branch: master
|
||||
version: ~> 1.3
|
||||
|
|
7
src/public/css/bootstrap.min.css
vendored
7
src/public/css/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
Before Width: | Height: | Size: 4.9 KiB |
|
@ -1,13 +1,11 @@
|
|||
require "kemal"
|
||||
require "./transfer_more/*"
|
||||
|
||||
static_headers do |response, filepath, filestat|
|
||||
if filepath =~ /\.html$/
|
||||
response.headers.add("Access-Control-Allow-Origin", "*")
|
||||
end
|
||||
response.headers.add("Content-Size", filestat.size.to_s)
|
||||
end
|
||||
serve_static true
|
||||
# static_headers do |response, filepath, filestat|
|
||||
# response.headers.add("Access-Control-Allow-Origin", "*")
|
||||
# response.headers.add("Content-Size", filestat.size.to_s)
|
||||
# end
|
||||
# serve_static true
|
||||
|
||||
# TODO: proper directory check
|
||||
Dir.mkdir(TransferMore.storage("files")) rescue nil
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
module TransferMore
|
||||
SSL_ENABLED = ENV["TRANSFER_SSL_ENABLED"]?.to_s.downcase == "true"
|
||||
BASE_STORAGE = ENV["TRANSFER_BASE_STORAGE"]? || "/tmp"
|
||||
HOST_PORT = ENV["TRANSFER_HOST_PORT"]? || "localhost:3000"
|
||||
SECURE_SIZE = Int32.new(ENV["TRANSFER_SECURE_SIZE"]? || 4)
|
||||
STORAGE_DAYS = Int32.new(ENV["TRANSFER_STORAGE_DAYS"]? || 7)
|
||||
end
|
||||
|
|
|
@ -2,10 +2,10 @@
|
|||
|
||||
module TransferMore
|
||||
def self.purge(duration, verbose = true)
|
||||
t_from = Time.now - duration
|
||||
t_from = Time.local - duration
|
||||
puts "[PURGE] Start (#{t_from})" if verbose
|
||||
Dir.entries(storage "files").select do |dir|
|
||||
t_current = Time.parse!("#{dir}00", TransferMore::TIME_FORMAT) rescue next
|
||||
t_current = Time.parse(dir, TransferMore::TIME_FORMAT, location: Time::Location.load_local) rescue next
|
||||
r = t_current < t_from
|
||||
end.each do |dir|
|
||||
spawn do
|
||||
|
@ -23,9 +23,9 @@ module TransferMore
|
|||
puts "[REMOVE] #{subdir}/#{file}" if verbose
|
||||
File.delete("#{subdir}/#{file}")
|
||||
end
|
||||
Dir.rmdir(subdir)
|
||||
Dir.delete(subdir)
|
||||
end
|
||||
Dir.rmdir(storage "files/#{dir}")
|
||||
Dir.delete(storage "files/#{dir}")
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -4,7 +4,8 @@ module TransferMore
|
|||
end
|
||||
|
||||
def self.base_url(env)
|
||||
scheme =
|
||||
"http#{Kemal.config.ssl || SSL_ENABLED ? 's' : nil}://#{(env.request.host_with_port || "localhost:3000")}"
|
||||
scheme = Kemal.config.ssl || SSL_ENABLED ? "https://" : "http://"
|
||||
host_port = env.request.headers["Host"]? || HOST_PORT
|
||||
"#{scheme}#{host_port}"
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,7 +2,7 @@ require "random/secure"
|
|||
|
||||
private def get_upload_infos(filename : String)
|
||||
file_name = filename.downcase
|
||||
dir = Time.now.to_s(TransferMore::TIME_FORMAT) + "/" + Random::Secure.hex(TransferMore::SECURE_SIZE) + (ENV["TRANSFER_MORE_CHRISTMAS"]? == "true" ? "/\u{1F384}" : "")
|
||||
dir = Time.local.to_s(TransferMore::TIME_FORMAT) + "/" + Random::Secure.hex(TransferMore::SECURE_SIZE) + (ENV["TRANSFER_MORE_CHRISTMAS"]? == "true" ? "/\u{1F384}" : "")
|
||||
Dir.mkdir_p TransferMore.storage("files/#{dir}")
|
||||
visible_path = "#{dir}/#{file_name}"
|
||||
file_path = TransferMore.storage("files/#{visible_path}")
|
||||
|
@ -13,7 +13,7 @@ private def upload(env, name_of_upload, io_to_copy)
|
|||
begin
|
||||
file_name, dir, visible_path, file_path = get_upload_infos name_of_upload
|
||||
File.open(file_path, "w") { |f| IO.copy(io_to_copy, f) }
|
||||
TransferMore.base_url(env) + "/" + visible_path
|
||||
TransferMore.base_url(env) + "/f/" + visible_path
|
||||
rescue err
|
||||
env.response.status_code = 500
|
||||
"Error 500: #{err}"
|
||||
|
@ -73,7 +73,7 @@ post "/" do |env|
|
|||
parseAndUpload(env)
|
||||
end
|
||||
|
||||
get "/:part1/:part2/:file_name" do |env|
|
||||
get "/f/:part1/:part2/:file_name" do |env|
|
||||
file_name = env.params.url["file_name"].to_s.downcase
|
||||
path = TransferMore.storage("files") + "/" + env.params.url["part1"] + "/" + env.params.url["part2"] + "/" + file_name
|
||||
begin
|
||||
|
|
|
@ -1,22 +1,64 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>upload with kemal</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<!-- <link rel="stylesheet" href="/css/bootstrap.min.css" /> -->
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous" />
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title><%= ENV.fetch("TRANSFER_MORE_TITLE", "File upload") %></title>
|
||||
<link rel="stylesheet" href="/css/bootstrap.min.css" />
|
||||
<!-- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous" /> -->
|
||||
<!-- <link rel="stylesheet" href="//octicons.github.com/components/octicons/octicons/octicons.css"> -->
|
||||
<!-- <script src="/js/main.js"></script> -->
|
||||
<!-- <script src="/js/dropzone.js"></script> -->
|
||||
<link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon">
|
||||
<style type="text/css">
|
||||
body { text-align:center;font-family:helvetica,arial;font-size:22px;color:#888;margin:20px;}
|
||||
a { color:#66b;text-decoration:none; }
|
||||
#c {margin:0 auto;width:500px;text-align:left}
|
||||
body {
|
||||
text-align: center;
|
||||
font-family: Helvetica, Arial;
|
||||
font-size: 22px;
|
||||
color: #888;
|
||||
margin-top: 20px;
|
||||
}
|
||||
a {
|
||||
color: #66b;
|
||||
text-decoration: none;
|
||||
}
|
||||
#c {
|
||||
margin: 0 auto;
|
||||
width: 500px;
|
||||
text-align: left;
|
||||
}
|
||||
.dropzone {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
margin: 1em auto;
|
||||
color: #555;
|
||||
border: 2px dashed #555;
|
||||
border-radius: 6px;
|
||||
cursor: default;
|
||||
height: 400px;
|
||||
max-width: 400px;
|
||||
background-color: rgba(250, 166, 180, 0.5);
|
||||
background-repeat: no-repeat;
|
||||
background-position: bottom;
|
||||
}
|
||||
#dropzone.hover {
|
||||
color: #eaa
|
||||
border-color: #eaa;
|
||||
border-style: solid;
|
||||
box-shadow: inset 0 4px 4px #888;
|
||||
}
|
||||
footer {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 1em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h2>transfer.sh with kemal</h2>
|
||||
<h2><%= ENV.fetch("TRANSFER_MORE_TITLE", "File upload") %></h2>
|
||||
<% if !file_url.empty? %>
|
||||
<div class="alert alert-success">
|
||||
<p>Upload url: <a href="<%= file_url %>"><%= file_url %></a></p>
|
||||
|
@ -32,22 +74,19 @@
|
|||
|
||||
<form method="POST" action="/" enctype="multipart/form-data">
|
||||
<div class="form-group">
|
||||
<div class="col-lg-10">
|
||||
<div class="dropzone-bg">
|
||||
<input name="commit" value="Upload" class="btn btn-primary" type="submit">
|
||||
<input class="btn btn-default" name="file" id="file" type="file">
|
||||
<input class="form-control dropzone" name="file" id="file" type="file" required>Drop files</input>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- <img src="/images/kemal.png"> -->
|
||||
<img src="https://kemalcr.com/img/kemal.png">
|
||||
|
||||
<footer style="position:fixed;bottom:0px;padding:60px;">
|
||||
<span style="position:fixed;left:10%">
|
||||
built by <a href="https://github.com/Nephos/">Nephos</a> with <a href="http://kemalcr.com/">kemal</a>
|
||||
<footer>
|
||||
<span>
|
||||
<%= ENV.fetch("TRANSFER_MORE_FOOTER", "built by <a href=\"https://git.sceptique.eu/Sceptique\">Sceptique</a>, powered with <a href=\"http://kemalcr.com/\">kemal</a>") %>
|
||||
</span>
|
||||
<span style="position:fixed;right:10%">
|
||||
<a href="https://github.com/Nephos/transfer_more">Fork me</a>
|
||||
<span>
|
||||
<a href="https://git.sceptique.eu/Sceptique/transfer_more">Fork or patch me</a>
|
||||
</span>
|
||||
</footer>
|
||||
</body>
|
||||
|
|
Loading…
Reference in New Issue
Block a user