├── .gitattributes
├── .github
├── renovate.json
└── workflows
│ ├── docker.yaml
│ ├── golang.yml
│ ├── goreleaser.yml
│ └── mkdocs.yml
├── .gitignore
├── .goreleaser.yaml
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── client
├── conf
│ └── conf.go
├── main.go
└── screenshot
│ └── screenshot.go
├── docs
├── docs
│ ├── client
│ │ ├── build.md
│ │ ├── documentation.md
│ │ └── install.md
│ ├── curl.md
│ ├── index.md
│ └── server
│ │ ├── build.md
│ │ ├── downloads.md
│ │ ├── install.md
│ │ ├── running.md
│ │ └── serve.md
├── mkdocs.yml
└── requirements.txt
├── go.mod
├── go.sum
└── server
├── conf
└── conf.go
├── curl
├── curl.go
├── data.go
└── helpers.go
├── database
└── database.go
├── examples
├── apache
│ └── goploader.conf
├── caddy
│ └── Caddyfile
├── conf.yml.example
├── supervisor
│ └── goploader.conf
└── systemd
│ └── goploader.service
├── logger
└── logger.go
├── main.go
├── metrics
└── metrics.go
├── models
├── initialize.go
├── resources.go
└── statistics.go
├── monitoring
└── monitoring.go
├── router
└── router.go
├── setup
└── setup.go
├── utils
├── assets.go
├── assets
│ ├── clipboard.min.js
│ ├── custom.js
│ ├── favicon.ico
│ ├── fontawesome
│ │ ├── css
│ │ │ ├── font-awesome.css
│ │ │ └── font-awesome.min.css
│ │ └── fonts
│ │ │ ├── FontAwesome.otf
│ │ │ ├── fontawesome-webfont.eot
│ │ │ ├── fontawesome-webfont.svg
│ │ │ ├── fontawesome-webfont.ttf
│ │ │ ├── fontawesome-webfont.woff
│ │ │ └── fontawesome-webfont.woff2
│ ├── jquery.min.js
│ ├── manifest.json
│ ├── milligram.min.css
│ ├── prism
│ │ ├── components
│ │ │ ├── prism-abap.js
│ │ │ ├── prism-abap.min.js
│ │ │ ├── prism-actionscript.js
│ │ │ ├── prism-actionscript.min.js
│ │ │ ├── prism-ada.js
│ │ │ ├── prism-ada.min.js
│ │ │ ├── prism-apacheconf.js
│ │ │ ├── prism-apacheconf.min.js
│ │ │ ├── prism-apl.js
│ │ │ ├── prism-apl.min.js
│ │ │ ├── prism-applescript.js
│ │ │ ├── prism-applescript.min.js
│ │ │ ├── prism-asciidoc.js
│ │ │ ├── prism-asciidoc.min.js
│ │ │ ├── prism-aspnet.js
│ │ │ ├── prism-aspnet.min.js
│ │ │ ├── prism-autohotkey.js
│ │ │ ├── prism-autohotkey.min.js
│ │ │ ├── prism-autoit.js
│ │ │ ├── prism-autoit.min.js
│ │ │ ├── prism-bash.js
│ │ │ ├── prism-bash.min.js
│ │ │ ├── prism-basic.js
│ │ │ ├── prism-basic.min.js
│ │ │ ├── prism-batch.js
│ │ │ ├── prism-batch.min.js
│ │ │ ├── prism-bison.js
│ │ │ ├── prism-bison.min.js
│ │ │ ├── prism-brainfuck.js
│ │ │ ├── prism-brainfuck.min.js
│ │ │ ├── prism-bro.js
│ │ │ ├── prism-bro.min.js
│ │ │ ├── prism-c.js
│ │ │ ├── prism-c.min.js
│ │ │ ├── prism-clike.js
│ │ │ ├── prism-clike.min.js
│ │ │ ├── prism-coffeescript.js
│ │ │ ├── prism-coffeescript.min.js
│ │ │ ├── prism-cpp.js
│ │ │ ├── prism-cpp.min.js
│ │ │ ├── prism-crystal.js
│ │ │ ├── prism-crystal.min.js
│ │ │ ├── prism-csharp.js
│ │ │ ├── prism-csharp.min.js
│ │ │ ├── prism-css-extras.js
│ │ │ ├── prism-css-extras.min.js
│ │ │ ├── prism-css.js
│ │ │ ├── prism-css.min.js
│ │ │ ├── prism-d.js
│ │ │ ├── prism-d.min.js
│ │ │ ├── prism-dart.js
│ │ │ ├── prism-dart.min.js
│ │ │ ├── prism-diff.js
│ │ │ ├── prism-diff.min.js
│ │ │ ├── prism-django.js
│ │ │ ├── prism-django.min.js
│ │ │ ├── prism-docker.js
│ │ │ ├── prism-docker.min.js
│ │ │ ├── prism-eiffel.js
│ │ │ ├── prism-eiffel.min.js
│ │ │ ├── prism-elixir.js
│ │ │ ├── prism-elixir.min.js
│ │ │ ├── prism-erlang.js
│ │ │ ├── prism-erlang.min.js
│ │ │ ├── prism-fortran.js
│ │ │ ├── prism-fortran.min.js
│ │ │ ├── prism-fsharp.js
│ │ │ ├── prism-fsharp.min.js
│ │ │ ├── prism-gherkin.js
│ │ │ ├── prism-gherkin.min.js
│ │ │ ├── prism-git.js
│ │ │ ├── prism-git.min.js
│ │ │ ├── prism-glsl.js
│ │ │ ├── prism-glsl.min.js
│ │ │ ├── prism-go.js
│ │ │ ├── prism-go.min.js
│ │ │ ├── prism-graphql.js
│ │ │ ├── prism-graphql.min.js
│ │ │ ├── prism-groovy.js
│ │ │ ├── prism-groovy.min.js
│ │ │ ├── prism-haml.js
│ │ │ ├── prism-haml.min.js
│ │ │ ├── prism-handlebars.js
│ │ │ ├── prism-handlebars.min.js
│ │ │ ├── prism-haskell.js
│ │ │ ├── prism-haskell.min.js
│ │ │ ├── prism-haxe.js
│ │ │ ├── prism-haxe.min.js
│ │ │ ├── prism-http.js
│ │ │ ├── prism-http.min.js
│ │ │ ├── prism-icon.js
│ │ │ ├── prism-icon.min.js
│ │ │ ├── prism-inform7.js
│ │ │ ├── prism-inform7.min.js
│ │ │ ├── prism-ini.js
│ │ │ ├── prism-ini.min.js
│ │ │ ├── prism-j.js
│ │ │ ├── prism-j.min.js
│ │ │ ├── prism-jade.js
│ │ │ ├── prism-jade.min.js
│ │ │ ├── prism-java.js
│ │ │ ├── prism-java.min.js
│ │ │ ├── prism-javascript.js
│ │ │ ├── prism-javascript.min.js
│ │ │ ├── prism-jolie.js
│ │ │ ├── prism-jolie.min.js
│ │ │ ├── prism-json.js
│ │ │ ├── prism-json.min.js
│ │ │ ├── prism-jsx.js
│ │ │ ├── prism-jsx.min.js
│ │ │ ├── prism-julia.js
│ │ │ ├── prism-julia.min.js
│ │ │ ├── prism-keyman.js
│ │ │ ├── prism-keyman.min.js
│ │ │ ├── prism-kotlin.js
│ │ │ ├── prism-kotlin.min.js
│ │ │ ├── prism-latex.js
│ │ │ ├── prism-latex.min.js
│ │ │ ├── prism-less.js
│ │ │ ├── prism-less.min.js
│ │ │ ├── prism-livescript.js
│ │ │ ├── prism-livescript.min.js
│ │ │ ├── prism-lolcode.js
│ │ │ ├── prism-lolcode.min.js
│ │ │ ├── prism-lua.js
│ │ │ ├── prism-lua.min.js
│ │ │ ├── prism-makefile.js
│ │ │ ├── prism-makefile.min.js
│ │ │ ├── prism-markdown.js
│ │ │ ├── prism-markdown.min.js
│ │ │ ├── prism-markup.js
│ │ │ ├── prism-markup.min.js
│ │ │ ├── prism-matlab.js
│ │ │ ├── prism-matlab.min.js
│ │ │ ├── prism-mel.js
│ │ │ ├── prism-mel.min.js
│ │ │ ├── prism-mizar.js
│ │ │ ├── prism-mizar.min.js
│ │ │ ├── prism-monkey.js
│ │ │ ├── prism-monkey.min.js
│ │ │ ├── prism-nasm.js
│ │ │ ├── prism-nasm.min.js
│ │ │ ├── prism-nginx.js
│ │ │ ├── prism-nginx.min.js
│ │ │ ├── prism-nim.js
│ │ │ ├── prism-nim.min.js
│ │ │ ├── prism-nix.js
│ │ │ ├── prism-nix.min.js
│ │ │ ├── prism-nsis.js
│ │ │ ├── prism-nsis.min.js
│ │ │ ├── prism-objectivec.js
│ │ │ ├── prism-objectivec.min.js
│ │ │ ├── prism-ocaml.js
│ │ │ ├── prism-ocaml.min.js
│ │ │ ├── prism-oz.js
│ │ │ ├── prism-oz.min.js
│ │ │ ├── prism-parigp.js
│ │ │ ├── prism-parigp.min.js
│ │ │ ├── prism-parser.js
│ │ │ ├── prism-parser.min.js
│ │ │ ├── prism-pascal.js
│ │ │ ├── prism-pascal.min.js
│ │ │ ├── prism-perl.js
│ │ │ ├── prism-perl.min.js
│ │ │ ├── prism-php-extras.js
│ │ │ ├── prism-php-extras.min.js
│ │ │ ├── prism-php.js
│ │ │ ├── prism-php.min.js
│ │ │ ├── prism-powershell.js
│ │ │ ├── prism-powershell.min.js
│ │ │ ├── prism-processing.js
│ │ │ ├── prism-processing.min.js
│ │ │ ├── prism-prolog.js
│ │ │ ├── prism-prolog.min.js
│ │ │ ├── prism-properties.js
│ │ │ ├── prism-properties.min.js
│ │ │ ├── prism-protobuf.js
│ │ │ ├── prism-protobuf.min.js
│ │ │ ├── prism-puppet.js
│ │ │ ├── prism-puppet.min.js
│ │ │ ├── prism-pure.js
│ │ │ ├── prism-pure.min.js
│ │ │ ├── prism-python.js
│ │ │ ├── prism-python.min.js
│ │ │ ├── prism-q.js
│ │ │ ├── prism-q.min.js
│ │ │ ├── prism-qore.js
│ │ │ ├── prism-qore.min.js
│ │ │ ├── prism-r.js
│ │ │ ├── prism-r.min.js
│ │ │ ├── prism-reason.js
│ │ │ ├── prism-reason.min.js
│ │ │ ├── prism-rest.js
│ │ │ ├── prism-rest.min.js
│ │ │ ├── prism-rip.js
│ │ │ ├── prism-rip.min.js
│ │ │ ├── prism-roboconf.js
│ │ │ ├── prism-roboconf.min.js
│ │ │ ├── prism-ruby.js
│ │ │ ├── prism-ruby.min.js
│ │ │ ├── prism-rust.js
│ │ │ ├── prism-rust.min.js
│ │ │ ├── prism-sas.js
│ │ │ ├── prism-sas.min.js
│ │ │ ├── prism-sass.js
│ │ │ ├── prism-sass.min.js
│ │ │ ├── prism-scala.js
│ │ │ ├── prism-scala.min.js
│ │ │ ├── prism-scheme.js
│ │ │ ├── prism-scheme.min.js
│ │ │ ├── prism-scss.js
│ │ │ ├── prism-scss.min.js
│ │ │ ├── prism-smalltalk.js
│ │ │ ├── prism-smalltalk.min.js
│ │ │ ├── prism-smarty.js
│ │ │ ├── prism-smarty.min.js
│ │ │ ├── prism-sql.js
│ │ │ ├── prism-sql.min.js
│ │ │ ├── prism-stylus.js
│ │ │ ├── prism-stylus.min.js
│ │ │ ├── prism-swift.js
│ │ │ ├── prism-swift.min.js
│ │ │ ├── prism-tcl.js
│ │ │ ├── prism-tcl.min.js
│ │ │ ├── prism-textile.js
│ │ │ ├── prism-textile.min.js
│ │ │ ├── prism-twig.js
│ │ │ ├── prism-twig.min.js
│ │ │ ├── prism-typescript.js
│ │ │ ├── prism-typescript.min.js
│ │ │ ├── prism-vbnet.js
│ │ │ ├── prism-vbnet.min.js
│ │ │ ├── prism-verilog.js
│ │ │ ├── prism-verilog.min.js
│ │ │ ├── prism-vhdl.js
│ │ │ ├── prism-vhdl.min.js
│ │ │ ├── prism-vim.js
│ │ │ ├── prism-vim.min.js
│ │ │ ├── prism-wiki.js
│ │ │ ├── prism-wiki.min.js
│ │ │ ├── prism-xojo.js
│ │ │ ├── prism-xojo.min.js
│ │ │ ├── prism-yaml.js
│ │ │ └── prism-yaml.min.js
│ │ ├── prism-dark.css
│ │ ├── prism-light.css
│ │ └── prism.js
│ ├── style.css
│ ├── toastr.css
│ ├── toastr.min.js
│ └── webapp
│ │ ├── gpldr.svg
│ │ ├── gpldr144.png
│ │ ├── gpldr168.png
│ │ ├── gpldr192.png
│ │ ├── gpldr48.png
│ │ ├── gpldr72.png
│ │ ├── gpldr96.png
│ │ └── sw.js
├── scheme.go
├── servername.go
├── templates
│ ├── code.tmpl
│ ├── index.html
│ ├── info.tmpl
│ ├── mobile.html
│ └── setup.html
└── units.go
└── views
├── resources.go
├── unencrypted.go
└── web.go
/.gitattributes:
--------------------------------------------------------------------------------
1 | server/utils/assets/* linguist-vendored
2 |
--------------------------------------------------------------------------------
/.github/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3 | "extends": ["config:best-practices", ":automergeMinor", ":automergeDigest"]
4 | }
5 |
--------------------------------------------------------------------------------
/.github/workflows/docker.yaml:
--------------------------------------------------------------------------------
1 | name: docker
2 | on:
3 | push:
4 | branches: ["main"]
5 | tags: ["*"]
6 |
7 | env:
8 | REGISTRY: ghcr.io
9 | IMAGE_NAME: ${{ github.repository }}
10 |
11 | jobs:
12 | build-and-push-image:
13 | runs-on: ubuntu-latest
14 | permissions:
15 | contents: read
16 | packages: write
17 |
18 | steps:
19 | - name: Checkout repository
20 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
21 |
22 | - name: Log in to the Container registry
23 | uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
24 | with:
25 | registry: ${{ env.REGISTRY }}
26 | username: ${{ github.actor }}
27 | password: ${{ secrets.GITHUB_TOKEN }}
28 |
29 | - name: Extract metadata (tags, labels) for Docker
30 | id: meta
31 | uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
32 | with:
33 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
34 | tags: |
35 | type=semver,pattern={{version}}
36 | type=semver,pattern={{major}}.{{minor}}
37 | type=ref,event=branch
38 | type=sha
39 |
40 | - name: Build and push Docker image
41 | uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
42 | with:
43 | context: .
44 | push: true
45 | tags: ${{ steps.meta.outputs.tags }}
46 | labels: ${{ steps.meta.outputs.labels }}
47 |
--------------------------------------------------------------------------------
/.github/workflows/goreleaser.yml:
--------------------------------------------------------------------------------
1 | name: goreleaser
2 |
3 | on:
4 | push:
5 | tags: ["*"]
6 |
7 | permissions:
8 | contents: write
9 |
10 | jobs:
11 | goreleaser:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - name: Checkout
15 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
16 | with:
17 | fetch-depth: 0
18 | - name: Set up Go
19 | uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5
20 | with:
21 | go-version: stable
22 | - name: Run GoReleaser
23 | uses: goreleaser/goreleaser-action@9c156ee8a17a598857849441385a2041ef570552 # v6
24 | with:
25 | distribution: goreleaser
26 | version: "~> v2"
27 | args: release --clean
28 | env:
29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
30 |
--------------------------------------------------------------------------------
/.github/workflows/mkdocs.yml:
--------------------------------------------------------------------------------
1 | name: mdkocs
2 |
3 | on:
4 | workflow_dispatch:
5 | push:
6 | branches: ["main"]
7 | paths: ["docs/**"]
8 |
9 | permissions:
10 | contents: read
11 | pages: write
12 | id-token: write
13 |
14 | concurrency:
15 | group: "pages"
16 | cancel-in-progress: false
17 |
18 | jobs:
19 | deploy:
20 | environment:
21 | name: github-pages
22 | url: ${{ steps.deployment.outputs.page_url }}
23 | runs-on: ubuntu-latest
24 | defaults:
25 | run:
26 | working-directory: docs/
27 | steps:
28 | - name: Checkout
29 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
30 | - name: Setup Python
31 | uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
32 | with:
33 | python-version: 3.x
34 | - name: Install mkdocs
35 | run: pip install mkdocs-material
36 | - name: Build Documentation
37 | working-directory: "./docs/"
38 | run: mkdocs build
39 | - name: Setup Pages
40 | uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
41 | - name: Upload artifact
42 | uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
43 | with:
44 | path: "./docs/site/"
45 | - name: Deploy to GitHub Pages
46 | id: deployment
47 | uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
48 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | client/client
2 | client/client*
3 | client/misc/
4 | client/testfiles/
5 | server/*.back
6 | server/*.db
7 | server/up/
8 | server/server
9 | server/conf.yml
10 | server/ssl
11 | releases
12 | server/data/
13 | prom.yml
14 | vendor/
15 | docs/env/
16 | docs/site/
17 | .vscode/
18 | dist/
19 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # Build Step
2 | FROM golang:1.24-alpine@sha256:b4f875e650466fa0fe62c6fd3f02517a392123eea85f1d7e69d85f780e4db1c1 AS builder
3 |
4 | # Dependencies
5 | RUN apk update && apk add --no-cache git
6 |
7 | # Source
8 | WORKDIR $GOPATH/src/github.com/Depado/goploader
9 | COPY go.mod go.sum ./
10 | RUN go mod download
11 | RUN go mod verify
12 | COPY . .
13 |
14 | # Build
15 | RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /tmp/gpldr github.com/Depado/goploader/server
16 |
17 | # Final Step
18 | FROM gcr.io/distroless/static@sha256:d9f9472a8f4541368192d714a995eb1a99bab1f7071fc8bde261d7eda3b667d8
19 | COPY --from=builder /tmp/gpldr /go/bin/gpldr
20 |
21 | VOLUME [ "/data" ]
22 | WORKDIR /data
23 | EXPOSE 8080
24 | ENTRYPOINT ["/go/bin/gpldr"]
25 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .DEFAULT_GOAL := all
2 | CGO_ENABLED=0
3 | VERSION=$(shell git describe --abbrev=0 --tags 2> /dev/null || echo "0.1.0")
4 | BUILD=$(shell git rev-parse HEAD 2> /dev/null || echo "undefined")
5 | BUILDDATE=$(shell LANG=en_us_88591 date)
6 |
7 | .PHONY: help
8 | help:
9 | @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
10 |
11 | .PHONY: all
12 | all: ## Build both the client and the server in their respective directories
13 | go build -o ./client/client ./client
14 | go build -o ./server/server ./server
15 |
16 | .PHONY: docker
17 | docker: ## Build the docker image
18 | docker build -t gpldr:latest -t gpldr:$(BUILD) -f Dockerfile .
19 |
20 | .PHONY: release
21 | release: ## Create a new release
22 | goreleaser release --clean
23 |
24 | .PHONY: snapshot
25 | snapshot: ## Create a new snapshot release
26 | goreleaser release --snapshot --clean
27 |
28 | clean:
29 | -rm -r releases/
30 | -rm -r goploader-server
31 |
--------------------------------------------------------------------------------
/client/conf/conf.go:
--------------------------------------------------------------------------------
1 | package conf
2 |
3 | import (
4 | "fmt"
5 | "log"
6 | "os"
7 |
8 | "github.com/mitchellh/go-homedir"
9 |
10 | "gopkg.in/yaml.v2"
11 | )
12 |
13 | // Configuration is the struct representing a configuration.
14 | type Configuration struct {
15 | Service string `yaml:"service"`
16 | Token string `yaml:"token"`
17 | }
18 |
19 | // C is the exported global configuration variable
20 | var C Configuration
21 |
22 | // Load loads the given fp (file path) to the C global configuration variable.
23 | func Load() error {
24 | var err error
25 | var hd string
26 | var conf []byte
27 |
28 | if hd, err = homedir.Dir(); err != nil {
29 | return err
30 | }
31 |
32 | cdir := hd + "/.config/"
33 | cf := cdir + "goploader.conf.yml"
34 |
35 | if _, err = os.Stat(cdir); os.IsNotExist(err) {
36 | log.Printf("Creating %v directory.\n", cdir)
37 | if err := os.Mkdir(cdir, 0700); err != nil {
38 | return fmt.Errorf("unable to create %v directory: %w", cdir, err)
39 | }
40 | } else if err != nil {
41 | return err
42 | }
43 | if _, err = os.Stat(cf); os.IsNotExist(err) {
44 | log.Printf("Configuration file %v not found. Writing default configuration.\n", cf)
45 | C.Service = "http://127.0.0.1:8080"
46 | if conf, err = yaml.Marshal(C); err != nil {
47 | return err
48 | }
49 | return os.WriteFile(cf, conf, 0644)
50 | } else if err != nil {
51 | return err
52 | }
53 |
54 | if conf, err = os.ReadFile(cf); err != nil {
55 | return err
56 | }
57 | return yaml.Unmarshal(conf, &C)
58 | }
59 |
--------------------------------------------------------------------------------
/client/screenshot/screenshot.go:
--------------------------------------------------------------------------------
1 | package screenshot
2 |
3 | import (
4 | "fmt"
5 | "os/exec"
6 | )
7 |
8 | // Program is a simple struct defining a screenshot program
9 | type Program struct {
10 | Command string
11 | WindowArgs []string
12 | FullScreenArgs []string
13 | }
14 |
15 | // GetCommand returns an *exec.Cmd
16 | func (p *Program) GetCommand(fp string, window bool) *exec.Cmd {
17 | var args []string
18 | if window {
19 | args = append(args, p.WindowArgs...)
20 | args = append(args, fp)
21 | } else {
22 | args = append(args, p.FullScreenArgs...)
23 | args = append(args, fp)
24 | }
25 | return exec.Command(p.Command, args...)
26 | }
27 |
28 | // Do executes a screenshot with the given program
29 | func (p *Program) Do(fp string, window bool) error {
30 | cmd := p.GetCommand(fp, window)
31 | cmd.Stderr = nil
32 | cmd.Stdout = nil
33 | return cmd.Run()
34 | }
35 |
36 | var progs = []Program{
37 | {
38 | Command: "gnome-screenshot",
39 | WindowArgs: []string{"-a", "-f"},
40 | FullScreenArgs: []string{"-f"},
41 | },
42 | {
43 | Command: "import",
44 | WindowArgs: []string{},
45 | FullScreenArgs: []string{"-window", "root"},
46 | },
47 | {
48 | Command: "scrot",
49 | WindowArgs: []string{"-s"},
50 | FullScreenArgs: []string{},
51 | },
52 | }
53 |
54 | // Do executes the screenshot, saving the file to the file path fp.
55 | func Do(fp string, window bool) error {
56 | var err error
57 |
58 | for _, p := range progs {
59 | if _, err = exec.LookPath(p.Command); err == nil {
60 | return p.Do(fp, window)
61 | }
62 | }
63 |
64 | return fmt.Errorf("no screenshot program found")
65 | }
66 |
--------------------------------------------------------------------------------
/docs/docs/client/build.md:
--------------------------------------------------------------------------------
1 | If you don't want to download a pre-compiled version of goploader client you can
2 | build it from source. Otherwise you can directly download a pre-compiled binary
3 | [here](install.md).
4 |
5 | ## Prerequisites
6 |
7 | - A recent version Go installed on your machine
8 | - `$GOPATH` should be set to the appropriate directory
9 | - The `dep` tool must be installed : `go get -u github.com/golang/dep/cmd/dep`
10 |
11 | ## Clone the repo
12 |
13 | ```shell
14 | $ mkdir -p $GOPATH/src/github.com/Depado/
15 | $ cd $GOPATH/src/github.com/Depado/
16 | $ git clone https://github.com/Depado/goploader.git
17 | $ cd goploader/
18 | $ dep ensure
19 | ```
20 |
21 | ## Build
22 |
23 | Now all you have to do is build the client :
24 |
25 | ```shell
26 | $ cd
27 | $ go build -i -o gpldr github.com/Depado/goploader/client
28 | ```
29 |
30 | ## Next steps
31 |
32 | Ensure you have `$GOPATH/bin` added to your standard `$PATH` so you can have
33 | access to the binary you just built. Then head over to
34 | [the client's documentation](documentation.md) to learn how to use it.
35 |
--------------------------------------------------------------------------------
/docs/docs/client/install.md:
--------------------------------------------------------------------------------
1 | ## Archlinux
2 |
3 | If you're running Archlinux, there is a `goploader-client-git` package in AUR.
4 |
5 | Thanks to [krion](https://twitter.com/dropinthebin) for setting up the AUR
6 | package.
7 |
8 | !!! note
9 | This package will compile and install the latest version of goploader and
10 | will also install Go in your machine if you don't already have it.
11 |
12 | ## Binary Downloads
13 |
26 |
27 | ### Linux
28 |
29 | Linux 64-bit
30 | Linux 32-bit
31 | Linux ARMv7
32 |
33 | ### FreeBSD
34 |
35 | FreeBSD 64-bit
36 | FreeBSD 32-bit
37 |
38 | ### MacOS
39 |
40 | Darwin 64-bit
41 | Darwin 32-bit
42 |
43 | ### Windows
44 |
45 | Windows 64-bit
46 | Windows 32-bit
47 |
--------------------------------------------------------------------------------
/docs/docs/server/build.md:
--------------------------------------------------------------------------------
1 | # Building from source
2 |
3 | If you don't want to download a pre-compiled version of goploader server you can
4 | build it from source.
5 |
6 | ## Prerequisites
7 |
8 | - A recent version Go installed on your machine
9 | - `$GOPATH` should be set to the appropriate directory
10 |
11 | ## Clone the repo
12 |
13 | ```shell
14 | $ mkdir -p $GOPATH/src/github.com/Depado/
15 | $ cd $GOPATH/src/github.com/Depado/
16 | $ git clone https://github.com/Depado/goploader.git
17 | $ cd goploader/
18 | ```
19 |
20 | ## Build
21 |
22 | Now all you have to do is build the project :
23 |
24 | ```shell
25 | $ go build -o server github.com/Depado/goploader/server
26 | ```
27 |
28 | That's it. Now head to the [setup](install.md) part to see how to
29 | generate or create the `conf.yml` file that is necessary for goploader to run.
30 |
--------------------------------------------------------------------------------
/docs/docs/server/downloads.md:
--------------------------------------------------------------------------------
1 | # Downloads
2 |
3 | All downloads can be found on the
4 | [releases](https://github.com/depado/goploader/releases) page on GitHub. This
5 | page exists to explain the different download types.
6 |
7 | ## Standalone Downloads
8 |
9 | The standalone distribution contains only a binary. All assets and templates
10 | (html files, css, js, etc) are included directly in the binary. If you don't
11 | intend to modify those assets, this distribution is for you. All you have to
12 | do is download the archive, and go the [Setup](install.md) page to read
13 | the instructions on how to setup goploader server.
14 |
15 | ## Simple Downloads
16 |
17 | These downloads contain the pre-compiled binary along with all its assets.
18 | You're free to modify what you want in those assets. (HTML templates, CSS, JS)
19 |
20 |
--------------------------------------------------------------------------------
/docs/docs/server/running.md:
--------------------------------------------------------------------------------
1 | ## Running with Supervisor
2 |
3 | I enjoy supervisor for its ease of use and the control it offers on the process.
4 | You can run the goploader server using a configuration file that could look like
5 | that :
6 |
7 | ```ini
8 | [program:goploader]
9 | directory=/home/youruser/goploader/
10 | command=/home/youruser/goploader/server
11 | user=youruser
12 | autostart=true
13 | autorestart=true
14 | stdout_logfile=/var/log/supervisor/goploader_stdout.log
15 | stderr_logfile=/var/log/supervisor/goploader_stderr.log
16 | ```
17 |
18 | Of course you need to replace `youruser` with the user you installed goploader
19 | with.
20 |
21 | ## Running with Systemd
22 |
23 | You can also use a Systemd Unit to launch Goploader on boot.
24 |
25 | ```ini
26 | [Unit]
27 | Description=goploader
28 |
29 | [Service]
30 | Type=simple
31 | User=youruser
32 | WorkingDirectory=/home/youruser/goploader
33 | ExecStart=/home/youruser/goploader/server
34 |
35 |
36 | [Install]
37 | WantedBy=multi-user.target
38 | ```
39 |
40 | As for supervisor, you'll need to replace `youruser` with the user you installed
41 | goploader with.
--------------------------------------------------------------------------------
/docs/docs/server/serve.md:
--------------------------------------------------------------------------------
1 | ## Serving with Caddy
2 |
3 | ```
4 | up.example.com {
5 | proxy / 127.0.0.1:8002 {
6 | transparent
7 | }
8 | gzip
9 | }
10 | ```
11 |
12 | ## Serving with Apache
13 |
14 | ```xml
15 |
16 | ServerName up.example.com
17 | DocumentRoot /data/goploader-server
18 |
19 |
20 | Require all granted
21 |
22 |
23 | ProxyPass / "http://localhost:8080/"
24 | ProxyPassReverse / "http://localhost:8080/"
25 |
26 | LogLevel warn
27 | ErrorLog /data/logs/apache2/goploader.log
28 | CustomLog /var/log/apache2/goploader.log combined
29 |
30 | ```
--------------------------------------------------------------------------------
/docs/mkdocs.yml:
--------------------------------------------------------------------------------
1 | site_name: Goploader
2 | repo_url: https://github.com/depado/goploader
3 | site_author: depado
4 | theme:
5 | name: 'material'
6 | feature:
7 | tabs: true
8 | palette:
9 | - scheme: default
10 | toggle:
11 | icon: material/weather-night
12 | name: Switch to dark mode
13 | - scheme: slate
14 | toggle:
15 | icon: material/weather-sunny
16 | name: Switch to light mode
17 |
18 | markdown_extensions:
19 | - toc:
20 | permalink: True
21 | - admonition
22 | - codehilite
23 | - pymdownx.arithmatex
24 | - pymdownx.betterem:
25 | smart_enable: all
26 | - pymdownx.caret
27 | - pymdownx.critic
28 | - pymdownx.details
29 | - pymdownx.emoji:
30 | emoji_generator: !!python/name:pymdownx.emoji.to_svg
31 | - pymdownx.magiclink
32 | - pymdownx.mark
33 | - pymdownx.smartsymbols
34 | - pymdownx.superfences
35 | - pymdownx.tasklist:
36 | custom_checkbox: true
37 | - pymdownx.tilde
38 | nav:
39 | - Home: index.md
40 | - Server Guide:
41 | - Build From Source: server/build.md
42 | - Downloads: server/downloads.md
43 | - Setup: server/install.md
44 | - Running: server/running.md
45 | - Serve: server/serve.md
46 | - Client:
47 | - Build From Source: client/build.md
48 | - Downloads and Install: client/install.md
49 | - Documentation: client/documentation.md
50 | - Curl: curl.md
51 | extra:
52 | social:
53 | - icon: fontawesome/brands/github-alt
54 | link: https://github.com/Depado
55 | - icon: fontawesome/brands/bluesky
56 | link: https://bsky.app/profile/depa.do
57 |
58 |
59 |
--------------------------------------------------------------------------------
/docs/requirements.txt:
--------------------------------------------------------------------------------
1 | babel==2.17.0
2 | certifi==2025.4.26
3 | charset-normalizer==3.4.2
4 | click==8.2.1
5 | colorama==0.4.6
6 | ghp-import==2.1.0
7 | idna==3.10
8 | Jinja2==3.1.6
9 | Markdown==3.8
10 | MarkupSafe==3.0.2
11 | mergedeep==1.3.4
12 | mkdocs==1.6.1
13 | mkdocs-get-deps==0.2.0
14 | mkdocs-material==9.6.14
15 | mkdocs-material-extensions==1.3.1
16 | packaging==25.0
17 | paginate==0.5.7
18 | pathspec==0.12.1
19 | platformdirs==4.3.8
20 | Pygments==2.19.1
21 | pymdown-extensions==10.15
22 | python-dateutil==2.9.0.post0
23 | PyYAML==6.0.2
24 | pyyaml_env_tag==1.1
25 | regex==2024.11.6
26 | requests==2.32.3
27 | six==1.17.0
28 | urllib3==2.4.0
29 | watchdog==6.0.0
30 |
--------------------------------------------------------------------------------
/server/curl/curl.go:
--------------------------------------------------------------------------------
1 | package curl
2 |
3 | import (
4 | "github.com/gin-gonic/gin"
5 |
6 | "github.com/Depado/goploader/server/utils"
7 | )
8 |
9 | // WriteTutorial will write to a gin.Context's writer the full curl tutorial
10 | func WriteTutorial(c *gin.Context) {
11 | w := c.Writer
12 | Header(w, header)
13 | Title(w, "Usage\n")
14 | Standard(w, "Upload from stdin")
15 | Command(w, "$ tree | curl -F file=@- "+utils.ServerURI(c))
16 | Standard(w, "Simple file upload")
17 | Command(w, "$ curl -F file=@myfile.txt "+utils.ServerURI(c))
18 | }
19 |
--------------------------------------------------------------------------------
/server/curl/data.go:
--------------------------------------------------------------------------------
1 | package curl
2 |
3 | var header = `
4 | _ _
5 | | | | |
6 | ____ ____ | | _ | | ____
7 | / _ || _ \ | | / || | / ___)
8 | ( ( | || | | || |( (_| || |
9 | \_|| || ||_/ |_| \____||_|
10 | (_____||_|
11 |
12 | Because file sharing is meant to be easy
13 | ~ Server-side encrypted file sharing ~
14 | `
15 |
--------------------------------------------------------------------------------
/server/curl/helpers.go:
--------------------------------------------------------------------------------
1 | package curl
2 |
3 | import (
4 | "io"
5 |
6 | "github.com/fatih/color"
7 | )
8 |
9 | // Multiple formats being exported for later reuse
10 | var (
11 | HeaderFormat = color.New(color.Bold, color.FgBlue)
12 | TitleFormat = color.New(color.Bold, color.Underline, color.FgRed)
13 | StandardFormat = color.New(color.FgWhite)
14 | CommandFormat = color.New(color.BgBlack, color.FgHiGreen)
15 | ExplanationFormat = color.New(color.Italic, color.FgWhite)
16 | )
17 |
18 | // Header writes a text using the HeaderFormat to the w io.Writer
19 | func Header(w io.Writer, text string) {
20 | HeaderFormat.Fprintln(w, text) //nolint:errcheck
21 | }
22 |
23 | // Title writes a text using the TitleFormat to the w io.Writer
24 | func Title(w io.Writer, text string) {
25 | TitleFormat.Fprintln(w, text) //nolint:errcheck
26 | }
27 |
28 | // Standard writes a text using the StandardFormat to the w io.Writer
29 | func Standard(w io.Writer, text string) {
30 | StandardFormat.Fprintln(w, text) //nolint:errcheck
31 | }
32 |
33 | // Command writes a text using the CommandFormat to the w io.Writer
34 | func Command(w io.Writer, text string) {
35 | CommandFormat.Fprintln(w, text) //nolint:errcheck
36 | }
37 |
38 | // Explanation writes a text using the ExplanationFormat to the w io.Writer
39 | func Explanation(w io.Writer, text string) {
40 | ExplanationFormat.Fprintln(w, text) //nolint:errcheck
41 | }
42 |
43 | func init() {
44 | color.NoColor = false
45 | }
46 |
--------------------------------------------------------------------------------
/server/database/database.go:
--------------------------------------------------------------------------------
1 | package database
2 |
3 | import (
4 | "time"
5 |
6 | "github.com/asdine/storm"
7 | bolt "go.etcd.io/bbolt"
8 |
9 | "github.com/Depado/goploader/server/conf"
10 | )
11 |
12 | // DB is the main database. Put in separate package for use in external ones.
13 | var DB *storm.DB
14 |
15 | // Initialize initializes the database (creating it if necessary)
16 | func Initialize() error {
17 | var err error
18 | DB, err = storm.Open(conf.C.DB, storm.BoltOptions(0600, &bolt.Options{Timeout: 1 * time.Second}))
19 | return err
20 | }
21 |
--------------------------------------------------------------------------------
/server/examples/apache/goploader.conf:
--------------------------------------------------------------------------------
1 |
2 | ServerName up.example.com
3 | DocumentRoot /data/goploader-server
4 |
5 |
6 | Require all granted
7 |
8 |
9 | ProxyPass / "http://localhost:8080/"
10 | ProxyPassReverse / "http://localhost:8080/"
11 |
12 | LogLevel warn
13 | ErrorLog /data/logs/apache2/goploader.log
14 | CustomLog /var/log/apache2/goploader.log combined
15 |
16 |
--------------------------------------------------------------------------------
/server/examples/caddy/Caddyfile:
--------------------------------------------------------------------------------
1 | up.example.com {
2 | proxy / 127.0.0.1:8002 {
3 | transparent
4 | }
5 | gzip
6 | }
7 |
--------------------------------------------------------------------------------
/server/examples/conf.yml.example:
--------------------------------------------------------------------------------
1 | name_server: yourdomain.tld
2 | upload_dir: up/
3 | db: goploader.db
4 | port: 8080
5 | uniuri_length: 10
6 | key_length: 16
7 | size_limit: 20
8 | no_web: false
9 | fulldoc: true
10 | loglevel: info
11 | stats: true
12 | sensitive_mode: false
13 |
--------------------------------------------------------------------------------
/server/examples/supervisor/goploader.conf:
--------------------------------------------------------------------------------
1 | [program:goploader]
2 | directory=/home/youruser/goploader/
3 | command=/home/youruser/goploader/server
4 | user=youruser
5 | autostart=true
6 | autorestart=true
7 | stdout_logfile=/var/log/supervisor/goploader_stdout.log
8 | stderr_logfile=/var/log/supervisor/goploader_stderr.log
9 |
--------------------------------------------------------------------------------
/server/examples/systemd/goploader.service:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description=goploader
3 |
4 | [Service]
5 | Type=simple
6 | User=www-data
7 | WorkingDirectory=/data/goploader-server
8 | ExecStart=/data/goploader-server/server
9 |
10 |
11 | [Install]
12 | WantedBy=multi-user.target
13 |
--------------------------------------------------------------------------------
/server/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "log"
6 | "net/http"
7 |
8 | "github.com/gin-gonic/gin"
9 | flag "github.com/ogier/pflag"
10 |
11 | "github.com/Depado/goploader/server/conf"
12 | "github.com/Depado/goploader/server/database"
13 | "github.com/Depado/goploader/server/logger"
14 | "github.com/Depado/goploader/server/models"
15 | "github.com/Depado/goploader/server/monitoring"
16 | "github.com/Depado/goploader/server/router"
17 | "github.com/Depado/goploader/server/setup"
18 | )
19 |
20 | func main() {
21 | var err error
22 | var cp string
23 | var initial bool
24 | var r *gin.Engine
25 |
26 | flag.StringVarP(&cp, "conf", "c", "conf.yml", "Local path to configuration file.")
27 | flag.BoolVarP(&initial, "initial", "i", false, "Run the initial setup of the server.")
28 | flag.Parse()
29 |
30 | if err = conf.Load(cp, !initial); err != nil || initial {
31 | setup.Run()
32 | }
33 | if err = database.Initialize(); err != nil {
34 | log.Fatal(err)
35 | }
36 | defer database.DB.Close() //nolint:errcheck
37 |
38 | if err = models.Initialize(); err != nil {
39 | log.Fatal(err)
40 | }
41 | go monitoring.Monit()
42 | if r, err = router.Setup(); err != nil {
43 | log.Fatal(err)
44 | }
45 |
46 | logger.Info("server", "Started goploader server on port", conf.C.Port)
47 | if conf.C.ServeHTTPS {
48 | if err = http.ListenAndServeTLS(fmt.Sprintf(":%d", conf.C.Port), conf.C.SSLCert, conf.C.SSLPrivKey, r); err != nil {
49 | logger.Err("server", "Fatal error", err)
50 | }
51 | } else {
52 | if err = r.Run(fmt.Sprintf("%s:%d", conf.C.Host, conf.C.Port)); err != nil {
53 | logger.Err("server", "Fatal error", err)
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/server/metrics/metrics.go:
--------------------------------------------------------------------------------
1 | package metrics
2 |
3 | import "github.com/prometheus/client_golang/prometheus"
4 |
5 | const namespace = "gpldr"
6 |
7 | // UploadedFilesTotal is a prometheus counter to monitor the number of uploaded
8 | // files
9 | var UploadedFilesTotal = prometheus.NewCounterVec(
10 | prometheus.CounterOpts{
11 | Namespace: namespace,
12 | Name: "uploaded_files_total",
13 | Help: "Count of files uploaded",
14 | },
15 | []string{"ip"},
16 | )
17 |
18 | // UploadedFilesSizeTotal is a prometheus counter to monitor the size of
19 | // uploaded files
20 | var UploadedFilesSizeTotal = prometheus.NewCounter(
21 | prometheus.CounterOpts{
22 | Namespace: namespace,
23 | Name: "uploaded_files_size_total",
24 | Help: "Size of uploaded files",
25 | },
26 | )
27 |
28 | func init() {
29 | prometheus.MustRegister(UploadedFilesSizeTotal, UploadedFilesTotal)
30 | }
31 |
--------------------------------------------------------------------------------
/server/router/router.go:
--------------------------------------------------------------------------------
1 | package router
2 |
3 | import (
4 | "github.com/gin-gonic/gin"
5 | "github.com/prometheus/client_golang/prometheus/promhttp"
6 |
7 | "github.com/Depado/goploader/server/conf"
8 | "github.com/Depado/goploader/server/utils"
9 | "github.com/Depado/goploader/server/views"
10 | )
11 |
12 | // Setup creates the gin Engine
13 | func Setup() (*gin.Engine, error) {
14 | var err error
15 |
16 | gin.SetMode(gin.ReleaseMode)
17 | r := gin.New()
18 | r.Use(gin.Recovery())
19 | if !conf.C.NoWeb {
20 | if err = utils.InitAssetsTemplates(r, true, "index.html", "mobile.html", "code.tmpl"); err != nil {
21 | return nil, err
22 | }
23 | r.Static("/releases", "releases")
24 | r.GET("/", views.Index)
25 | r.GET("/sw.js", func(c *gin.Context) {
26 | c.File("sw.js")
27 | })
28 | r.GET("/simple", views.SimpleIndex)
29 |
30 | }
31 | if conf.C.DisableEncryption {
32 | r.POST("/", views.Create)
33 | r.GET("/v/:uniuri", views.View)
34 | r.HEAD("/v/:uniuri", views.Head)
35 | r.GET("/v/:uniuri/:lang", views.ViewCode)
36 | } else {
37 | r.POST("/", views.CreateC)
38 | r.GET("/v/:uniuri/:key", views.ViewC)
39 | r.HEAD("/v/:uniuri/:key", views.HeadC)
40 | r.GET("/v/:uniuri/:key/:lang", views.ViewCCode)
41 | //TODO: Add HEAD for ViewCCode
42 | }
43 | if conf.C.PrometheusEnabled {
44 | r.Any("/metrics", gin.WrapH(promhttp.Handler()))
45 | }
46 | return r, nil
47 | }
48 |
--------------------------------------------------------------------------------
/server/utils/assets.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "embed"
5 | "html/template"
6 | "net/http"
7 | "io/fs"
8 |
9 | "github.com/gin-gonic/gin"
10 |
11 | "github.com/Depado/goploader/server/logger"
12 | )
13 |
14 | //go:embed all:assets
15 | var assets embed.FS
16 | //go:embed all:templates
17 | var templates embed.FS
18 |
19 | // InitAssetsTemplates initializes the router to use embedded assets
20 | func InitAssetsTemplates(r *gin.Engine, verbose bool, names ...string) error {
21 | template := template.Must(template.ParseFS(templates, "templates/*"))
22 | r.SetHTMLTemplate(template)
23 | logger.Debug("server", "Loaded templates")
24 |
25 | assetsFp, _ := fs.Sub(assets, "assets")
26 | r.StaticFS("/static", http.FS(assetsFp))
27 | logger.Debug("server", "Loaded assets")
28 | return nil
29 | }
30 |
--------------------------------------------------------------------------------
/server/utils/assets/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/depado/goploader/a389583d3b5b6d698c56d3cc1c8c03157cdd6ed0/server/utils/assets/favicon.ico
--------------------------------------------------------------------------------
/server/utils/assets/fontawesome/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/depado/goploader/a389583d3b5b6d698c56d3cc1c8c03157cdd6ed0/server/utils/assets/fontawesome/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/server/utils/assets/fontawesome/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/depado/goploader/a389583d3b5b6d698c56d3cc1c8c03157cdd6ed0/server/utils/assets/fontawesome/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/server/utils/assets/fontawesome/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/depado/goploader/a389583d3b5b6d698c56d3cc1c8c03157cdd6ed0/server/utils/assets/fontawesome/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/server/utils/assets/fontawesome/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/depado/goploader/a389583d3b5b6d698c56d3cc1c8c03157cdd6ed0/server/utils/assets/fontawesome/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/server/utils/assets/fontawesome/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/depado/goploader/a389583d3b5b6d698c56d3cc1c8c03157cdd6ed0/server/utils/assets/fontawesome/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/server/utils/assets/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Goploader",
3 | "lang": "en-US",
4 | "scope": "/simple",
5 | "orientation": "portrait-primary",
6 | "short_name": "Goploader",
7 | "start_url": "/simple",
8 | "display": "standalone",
9 | "background_color": "#FFF",
10 | "theme_color": "#9b4dca",
11 | "description": "Goploader App",
12 | "icons": [{
13 | "src": "/static/webapp/gpldr48.png",
14 | "sizes": "48x48",
15 | "type": "image/png"
16 | }, {
17 | "src": "/static/webapp/gpldr72.png",
18 | "sizes": "72x72",
19 | "type": "image/png"
20 | }, {
21 | "src": "/static/webapp/gpldr96.png",
22 | "sizes": "96x96",
23 | "type": "image/png"
24 | }, {
25 | "src": "/static/webapp/gpldr144.png",
26 | "sizes": "144x144",
27 | "type": "image/png"
28 | }, {
29 | "src": "/static/webapp/gpldr168.png",
30 | "sizes": "168x168",
31 | "type": "image/png"
32 | }, {
33 | "src": "/static/webapp/gpldr192.png",
34 | "sizes": "192x192",
35 | "type": "image/png"
36 | }]
37 | }
--------------------------------------------------------------------------------
/server/utils/assets/prism/components/prism-actionscript.js:
--------------------------------------------------------------------------------
1 | Prism.languages.actionscript = Prism.languages.extend('javascript', {
2 | 'keyword': /\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|native|override|set|static)\b/,
3 | 'operator': /\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<|>>?>?|[!=]=?)=?|[~?@]/
4 | });
5 | Prism.languages.actionscript['class-name'].alias = 'function';
6 |
7 | if (Prism.languages.markup) {
8 | Prism.languages.insertBefore('actionscript', 'string', {
9 | 'xml': {
10 | pattern: /(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\\1|\\?(?!\1)[\s\S])*\2)*\s*\/?>/,
11 | lookbehind: true,
12 | inside: {
13 | rest: Prism.languages.markup
14 | }
15 | }
16 | });
17 | }
--------------------------------------------------------------------------------
/server/utils/assets/prism/components/prism-actionscript.min.js:
--------------------------------------------------------------------------------
1 | Prism.languages.actionscript=Prism.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|native|override|set|static)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<|>>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript["class-name"].alias="function",Prism.languages.markup&&Prism.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\\1|\\?(?!\1)[\s\S])*\2)*\s*\/?>/,lookbehind:!0,inside:{rest:Prism.languages.markup}}});
--------------------------------------------------------------------------------
/server/utils/assets/prism/components/prism-ada.js:
--------------------------------------------------------------------------------
1 | Prism.languages.ada = {
2 | 'comment': /--.*/,
3 | 'string': /"(?:""|[^"\r\f\n])*"/i,
4 | 'number': [
5 | {
6 | pattern: /\b\d(?:_?\d)*#[0-9A-F](?:_?[0-9A-F])*(?:\.[0-9A-F](?:_?[0-9A-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i
7 | },
8 | {
9 | pattern: /\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i
10 | }
11 | ],
12 | 'attr-name': /\b'\w+/i,
13 | 'keyword': /\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|new|return|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,
14 | 'boolean': /\b(?:true|false)\b/i,
15 | 'operator': /<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,
16 | 'punctuation': /\.\.?|[,;():]/,
17 | 'char': /'.'/,
18 | 'variable': /\b[a-z](?:[_a-z\d])*\b/i
19 | };
--------------------------------------------------------------------------------
/server/utils/assets/prism/components/prism-ada.min.js:
--------------------------------------------------------------------------------
1 | Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/i,number:[{pattern:/\b\d(?:_?\d)*#[0-9A-F](?:_?[0-9A-F])*(?:\.[0-9A-F](?:_?[0-9A-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],"attr-name":/\b'\w+/i,keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|new|return|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,"boolean":/\b(?:true|false)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,"char":/'.'/,variable:/\b[a-z](?:[_a-z\d])*\b/i};
--------------------------------------------------------------------------------
/server/utils/assets/prism/components/prism-apl.js:
--------------------------------------------------------------------------------
1 | Prism.languages.apl = {
2 | 'comment': /(?:⍝|#[! ]).*$/m,
3 | 'string': {
4 | pattern: /'(?:[^'\r\n]|'')*'/,
5 | greedy: true
6 | },
7 | 'number': /¯?(?:\d*\.?\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:\d*\.?\d+(?:e[\+¯]?\d+)?|¯|∞))?/i,
8 | 'statement': /:[A-Z][a-z][A-Za-z]*\b/,
9 | 'system-function': {
10 | pattern: /⎕[A-Z]+/i,
11 | alias: 'function'
12 | },
13 | 'constant': /[⍬⌾#⎕⍞]/,
14 | 'function': /[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,
15 | 'monadic-operator': {
16 | pattern: /[\\\/⌿⍀¨⍨⌶&∥]/,
17 | alias: 'operator'
18 | },
19 | 'dyadic-operator': {
20 | pattern: /[.⍣⍠⍤∘⌸@⌺]/,
21 | alias: 'operator'
22 | },
23 | 'assignment': {
24 | pattern: /←/,
25 | alias: 'keyword'
26 | },
27 | 'punctuation': /[\[;\]()◇⋄]/,
28 | 'dfn': {
29 | pattern: /[{}⍺⍵⍶⍹∇⍫:]/,
30 | alias: 'builtin'
31 | }
32 | };
33 |
--------------------------------------------------------------------------------
/server/utils/assets/prism/components/prism-apl.min.js:
--------------------------------------------------------------------------------
1 | Prism.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:\d*\.?\d+(?:e[\+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,"function":/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}};
--------------------------------------------------------------------------------
/server/utils/assets/prism/components/prism-applescript.min.js:
--------------------------------------------------------------------------------
1 | Prism.languages.applescript={comment:[/\(\*(?:\(\*[\s\S]*?\*\)|[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\?.)*?"/,number:/\b-?\d*\.?\d+([Ee]-?\d+)?\b/,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:start|begin|end)s? with|(?:(?:does not|doesn't) contain|contains?)|(?:is|isn't|is not) (?:in|contained by)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:(?:does not|doesn't) come|comes) (?:before|after)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equals|equal to|isn't|is not)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|or|div|mod|as|not))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class":{pattern:/\b(?:alias|application|boolean|class|constant|date|file|integer|list|number|POSIX file|real|record|reference|RGB color|script|text|centimetres|centimeters|feet|inches|kilometres|kilometers|metres|meters|miles|yards|square feet|square kilometres|square kilometers|square metres|square meters|square miles|square yards|cubic centimetres|cubic centimeters|cubic feet|cubic inches|cubic metres|cubic meters|cubic yards|gallons|litres|liters|quarts|grams|kilograms|ounces|pounds|degrees Celsius|degrees Fahrenheit|degrees Kelvin)\b/,alias:"builtin"},punctuation:/[{}():,¬«»《》]/};
--------------------------------------------------------------------------------
/server/utils/assets/prism/components/prism-aspnet.js:
--------------------------------------------------------------------------------
1 | Prism.languages.aspnet = Prism.languages.extend('markup', {
2 | 'page-directive tag': {
3 | pattern: /<%\s*@.*%>/i,
4 | inside: {
5 | 'page-directive tag': /<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,
6 | rest: Prism.languages.markup.tag.inside
7 | }
8 | },
9 | 'directive tag': {
10 | pattern: /<%.*%>/i,
11 | inside: {
12 | 'directive tag': /<%\s*?[$=%#:]{0,2}|%>/i,
13 | rest: Prism.languages.csharp
14 | }
15 | }
16 | });
17 | // Regexp copied from prism-markup, with a negative look-ahead added
18 | Prism.languages.aspnet.tag.pattern = /<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\s\S])*\1|[^\s'">=]+))?)*\s*\/?>/i;
19 |
20 | // match directives of attribute value foo="<% Bar %>"
21 | Prism.languages.insertBefore('inside', 'punctuation', {
22 | 'directive tag': Prism.languages.aspnet['directive tag']
23 | }, Prism.languages.aspnet.tag.inside["attr-value"]);
24 |
25 | Prism.languages.insertBefore('aspnet', 'comment', {
26 | 'asp comment': /<%--[\s\S]*?--%>/
27 | });
28 |
29 | // script runat="server" contains csharp, not javascript
30 | Prism.languages.insertBefore('aspnet', Prism.languages.javascript ? 'script' : 'tag', {
31 | 'asp script': {
32 | pattern: /(
13 |
16 |