Browse Source

docker, previews, tor, bugfixes

* implemented docker
* added previews (markdown, html, text, video, audio)
* added tor support
* several bugfixes
tags/v1.0.0
Remco 9 years ago
parent
commit
6b251ec7a8
63 changed files with 4402 additions and 308 deletions
  1. +16
    -0
      .dockerignore
  2. +6
    -0
      .ebextensions/01config_nginx.config
  3. +1
    -0
      .gitignore
  4. +1
    -1
      Dockerfile
  5. +33
    -3
      Gruntfile.js
  6. +10
    -0
      README.md
  7. +2
    -0
      package.json
  8. +110
    -36
      transfersh-server/handlers.go
  9. +23
    -15
      transfersh-server/main.go
  10. +1
    -1
      transfersh-server/static/404.html
  11. +132
    -0
      transfersh-server/static/download.audio.html
  12. +134
    -0
      transfersh-server/static/download.code.html
  13. +116
    -0
      transfersh-server/static/download.html
  14. +126
    -0
      transfersh-server/static/download.image.html
  15. +124
    -0
      transfersh-server/static/download.markdown.html
  16. +129
    -0
      transfersh-server/static/download.video.html
  17. BIN
     
  18. +5
    -5
      transfersh-server/static/images/terminal-top.svg
  19. +6
    -0
      transfersh-server/static/images/tor.svg
  20. +5
    -0
      transfersh-server/static/includes/download-bottom.html
  21. +10
    -0
      transfersh-server/static/includes/download-btn.html
  22. +6
    -0
      transfersh-server/static/includes/download-top.html
  23. +36
    -0
      transfersh-server/static/includes/footer.html
  24. +15
    -0
      transfersh-server/static/includes/ga.html
  25. +12
    -0
      transfersh-server/static/includes/head.html
  26. +2
    -0
      transfersh-server/static/includes/js.html
  27. +15
    -0
      transfersh-server/static/includes/navigation.html
  28. +132
    -94
      transfersh-server/static/index.html
  29. +3
    -3
      transfersh-server/static/scripts/main.js
  30. +1
    -1
      transfersh-server/static/styles/main.css
  31. +46
    -2
      transfersh-server/storage.go
  32. +172
    -0
      transfersh-server/utils.go
  33. +47
    -0
      transfersh-web/download.audio.html
  34. +143
    -0
      transfersh-web/download.code.html
  35. +31
    -0
      transfersh-web/download.html
  36. +41
    -0
      transfersh-web/download.image.html
  37. +39
    -0
      transfersh-web/download.markdown.html
  38. +44
    -0
      transfersh-web/download.video.html
  39. BIN
     
  40. +5
    -5
      transfersh-web/images/terminal-top.svg
  41. +6
    -0
      transfersh-web/images/tor.svg
  42. +5
    -0
      transfersh-web/includes/download-bottom.html
  43. +10
    -0
      transfersh-web/includes/download-btn.html
  44. +6
    -0
      transfersh-web/includes/download-top.html
  45. +36
    -0
      transfersh-web/includes/footer.html
  46. +15
    -0
      transfersh-web/includes/ga.html
  47. +14
    -0
      transfersh-web/includes/head.html
  48. +9
    -0
      transfersh-web/includes/js.html
  49. +15
    -0
      transfersh-web/includes/navigation.html
  50. +54
    -92
      transfersh-web/index.html
  51. +61
    -0
      transfersh-web/scripts/clipboard.js
  52. +86
    -8
      transfersh-web/scripts/main.js
  53. +1296
    -0
      transfersh-web/scripts/showdown.js
  54. +0
    -1
      transfersh-web/scripts/typewriter-bundle.min.js
  55. +3
    -3
      transfersh-web/styles/bootstrap.less
  56. +8
    -6
      transfersh-web/styles/includes/global.less
  57. +9
    -3
      transfersh-web/styles/includes/home.less
  58. +21
    -1
      transfersh-web/styles/includes/pages.less
  59. +200
    -0
      transfersh-web/styles/includes/preview.less
  60. +16
    -14
      transfersh-web/styles/includes/reviews.less
  61. +750
    -13
      transfersh-web/styles/main.css
  62. +1
    -1
      transfersh-web/styles/main.css.map
  63. +1
    -0
      transfersh-web/styles/main.less

+ 16
- 0
.dockerignore View File

@@ -0,0 +1,16 @@
build
pkg
dist
src
bin
*.pyc
*.egg-info
.vagrant
.git
.tmp
bower_components
node_modules
extras
build
transfersh-server/run.sh
.elasticbeanstalk

+ 6
- 0
.ebextensions/01config_nginx.config View File

@@ -0,0 +1,6 @@
files:
"/etc/nginx/conf.d/client_max_body_size.conf":
mode: "000644"
owner: root
group: root
content: "client_max_body_size 0;"

+ 1
- 0
.gitignore View File

@@ -13,3 +13,4 @@ bower_components/
node_modules/

transfersh-server/run.sh
.elasticbeanstalk/

transfersh-server/Dockerfile → Dockerfile View File

@@ -5,7 +5,7 @@ RUN mkdir -p /go/src/app
WORKDIR /go/src/app

# Copy the local package files to the container's workspace.
ADD . /go/src/app
ADD ./transfersh-server /go/src/app

# install dependencies
RUN go get ./

+ 33
- 3
Gruntfile.js View File

@@ -28,6 +28,10 @@ module.exports = function (grunt) {
gruntfile: {
files: ['Gruntfile.js']
},
includes: {
files: ['<%= yeoman.app %>/*.html', '.tmp/*.html'],
tasks: ['includes:server']
},
livereload: {
options: {
livereload: '<%= connect.options.livereload %>'
@@ -37,7 +41,8 @@ module.exports = function (grunt) {
'{.tmp,<%= yeoman.app %>}/styles/{,*/}*.css',
'{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js',
'<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
]
],
tasks: ['includes:server']
}
},
connect: {
@@ -112,6 +117,27 @@ module.exports = function (grunt) {
}
}
},

includes: {
build: {
cwd: '<%= yeoman.app %>',
src: ['*.html', 'includes/*.html'],
dest: '<%= yeoman.dist %>',
options: {
flatten: true,
banner: ''
}
},
server: {
cwd: '<%= yeoman.app %>',
src: ['*.html', 'includes/*.html'],
dest: '.tmp/',
options: {
flatten: true,
banner: ''
}
}
},
// not used since Uglify task does concat,
// but still available if needed
/*concat: {
@@ -240,6 +266,7 @@ module.exports = function (grunt) {
grunt.task.run([
'clean:server',
'less',
'includes:server',
'copy:server',
'connect:livereload',
'watch'
@@ -260,14 +287,17 @@ module.exports = function (grunt) {

grunt.registerTask('build', [
'clean:dist',

'copy:server',
'useminPrepare',
'concurrent',
'cssmin',
'concat',
'includes:build',
'uglify',
'copy',
'usemin'
'usemin',

]);

grunt.registerTask('default', [
@@ -275,4 +305,4 @@ module.exports = function (grunt) {
'test',
'build'
]);
};
};

+ 10
- 0
README.md View File

@@ -62,6 +62,16 @@ go run transfersh-server/*.go -provider=local --port 8080 --temp=/tmp/ --basedir
go build -o transfersh-server *.go
```

## Docker

For easy deployment we've enabled Docker deployment.

```
cd ./transfer-server/
docker build -t transfersh .
docker run --publish 8080:8080 --rm transfersh --provider local --basedir /tmp/
```

## Contributions

Contributions are welcome.


+ 2
- 0
package.json View File

@@ -18,6 +18,8 @@
"grunt-contrib-less": "~0.11.4",
"grunt-contrib-uglify": "~0.6.0",
"grunt-contrib-watch": "~0.6.1",
"grunt-include-replace": "^2.0.0",
"grunt-includes": "^0.4.5",
"grunt-rev": "~0.1.0",
"grunt-svgmin": "1.0.0",
"grunt-usemin": "~2.4.0",


+ 110
- 36
transfersh-server/handlers.go View File

@@ -35,9 +35,9 @@ import (
"errors"
"fmt"
"github.com/dutchcoders/go-clamd"
"github.com/golang/gddo/httputil/header"
"github.com/gorilla/mux"
"github.com/kennygrant/sanitize"
"github.com/russross/blackfriday"
html_template "html/template"
"io"
"io/ioutil"
@@ -57,23 +57,94 @@ func healthHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Approaching Neutral Zone, all systems normal and functioning.")
}

// this handler will output html or text, depending on the
// support of the client (Accept header).
/* The preview handler will show a preview of the content for browsers (accept type text/html), and referer is not transfer.sh */
func previewHandler(w http.ResponseWriter, r *http.Request) {

func viewHandler(w http.ResponseWriter, r *http.Request) {
// vars := mux.Vars(r)
vars := mux.Vars(r)

token := vars["token"]
filename := vars["filename"]

contentType, contentLength, err := storage.Head(token, filename)
if err != nil {
http.Error(w, http.StatusText(404), 404)
return
}

actual := header.ParseAccept(r.Header, "Accept")
var templatePath string
var content html_template.HTML

html := false
switch {
case strings.HasPrefix(contentType, "image/"):
templatePath = "download.image.html"
case strings.HasPrefix(contentType, "video/"):
templatePath = "download.video.html"
case strings.HasPrefix(contentType, "audio/"):
templatePath = "download.audio.html"
case strings.HasPrefix(contentType, "text/"):
templatePath = "download.markdown.html"

var reader io.ReadCloser
if reader, _, _, err = storage.Get(token, filename); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

for _, s := range actual {
if s.Value == "text/html" {
html = true
var data []byte
if data, err = ioutil.ReadAll(reader); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

if strings.HasPrefix(contentType, "text/x-markdown") || strings.HasPrefix(contentType, "text/markdown") {
output := blackfriday.MarkdownCommon(data)
content = html_template.HTML(output)
} else if strings.HasPrefix(contentType, "text/plain") {
content = html_template.HTML(fmt.Sprintf("<pre>%s</pre>", data))
} else {
content = html_template.HTML(data)
}

templatePath = "download.markdown.html"
default:
templatePath = "download.html"
}

if html {
tmpl, err := html_template.New(templatePath).Funcs(html_template.FuncMap{"format": formatNumber}).ParseFiles("static/" + templatePath)

if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

data := struct {
ContentType string
Content html_template.HTML
Filename string
Url string
ContentLength uint64
}{
contentType,
content,
filename,
r.URL.String(),
contentLength,
}

if err := tmpl.ExecuteTemplate(w, templatePath, data); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

}

// this handler will output html or text, depending on the
// support of the client (Accept header).

func viewHandler(w http.ResponseWriter, r *http.Request) {
// vars := mux.Vars(r)

if acceptsHtml(r.Header) {
tmpl, err := html_template.ParseFiles("static/index.html")

if err != nil {
@@ -106,7 +177,7 @@ func notFoundHandler(w http.ResponseWriter, r *http.Request) {

func postHandler(w http.ResponseWriter, r *http.Request) {
if err := r.ParseMultipartForm(_24K); nil != err {
log.Println(err)
log.Printf("%s", err.Error())
http.Error(w, "Error occured copying to output stream", 500)
return
}
@@ -128,7 +199,7 @@ func postHandler(w http.ResponseWriter, r *http.Request) {
var err error

if f, err = fheader.Open(); err != nil {
log.Print(err)
log.Printf("%s", err.Error())
http.Error(w, err.Error(), 500)
return
}
@@ -137,7 +208,7 @@ func postHandler(w http.ResponseWriter, r *http.Request) {

n, err := io.CopyN(&b, f, _24K+1)
if err != nil && err != io.EOF {
log.Print(err)
log.Printf("%s", err.Error())
http.Error(w, err.Error(), 500)
return
}
@@ -155,7 +226,7 @@ func postHandler(w http.ResponseWriter, r *http.Request) {
if err != nil {
os.Remove(file.Name())

log.Print(err)
log.Printf("%s", err.Error())
http.Error(w, err.Error(), 500)
return
}
@@ -170,7 +241,7 @@ func postHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("Uploading %s %s %d %s", token, filename, contentLength, contentType)

if err = storage.Put(token, filename, reader, contentType, uint64(contentLength)); err != nil {
log.Print(err)
log.Printf("%s", err.Error())
http.Error(w, err.Error(), 500)
return

@@ -199,7 +270,9 @@ func scanHandler(w http.ResponseWriter, r *http.Request) {

response, err := c.ScanStream(reader)
if err != nil {
log.Printf("%s", err.Error())
http.Error(w, err.Error(), 500)
return
}

var b string
@@ -237,7 +310,7 @@ func putHandler(w http.ResponseWriter, r *http.Request) {

n, err := io.CopyN(&b, f, _24K+1)
if err != nil && err != io.EOF {
log.Print(err)
log.Printf("%s", err.Error())
http.Error(w, err.Error(), 500)
return
}
@@ -245,7 +318,7 @@ func putHandler(w http.ResponseWriter, r *http.Request) {
if n > _24K {
file, err := ioutil.TempFile(config.Temp, "transfer-")
if err != nil {
log.Print(err)
log.Printf("%s", err.Error())
http.Error(w, err.Error(), 500)
return
}
@@ -255,8 +328,7 @@ func putHandler(w http.ResponseWriter, r *http.Request) {
n, err = io.Copy(file, io.MultiReader(&b, f))
if err != nil {
os.Remove(file.Name())

log.Print(err)
log.Printf("%s", err.Error())
http.Error(w, err.Error(), 500)
return
}
@@ -282,6 +354,7 @@ func putHandler(w http.ResponseWriter, r *http.Request) {
var err error

if err = storage.Put(token, filename, reader, contentType, uint64(contentLength)); err != nil {
log.Printf("%s", err.Error())
http.Error(w, errors.New("Could not save file").Error(), 500)
return
}
@@ -307,10 +380,17 @@ func zipHandler(w http.ResponseWriter, r *http.Request) {
zw := zip.NewWriter(w)

for _, key := range strings.Split(files, ",") {
token := sanitize.Path(strings.Split(key, "/")[0])
if strings.HasPrefix(key, "/") {
key = key[1:]
}

key = strings.Replace(key, "\\", "/", -1)

token := strings.Split(key, "/")[0]
filename := sanitize.Path(strings.Split(key, "/")[1])

reader, _, _, err := storage.Get(token, filename)

if err != nil {
if err.Error() == "The specified key does not exist." {
http.Error(w, "File not found", 404)
@@ -371,8 +451,14 @@ func tarGzHandler(w http.ResponseWriter, r *http.Request) {
defer zw.Close()

for _, key := range strings.Split(files, ",") {
if strings.HasPrefix(key, "/") {
key = key[1:]
}

key = strings.Replace(key, "\\", "/", -1)

token := strings.Split(key, "/")[0]
filename := strings.Split(key, "/")[1]
filename := sanitize.Path(strings.Split(key, "/")[1])

reader, _, contentLength, err := storage.Get(token, filename)
if err != nil {
@@ -482,23 +568,11 @@ func getHandler(w http.ResponseWriter, r *http.Request) {

w.Header().Set("Content-Type", contentType)
w.Header().Set("Content-Length", strconv.FormatUint(contentLength, 10))

mediaType, _, _ := mime.ParseMediaType(contentType)

switch {
case mediaType == "text/html":
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))
break
case strings.HasPrefix(mediaType, "text"):
case mediaType == "":
break
default:
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))
}

w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))
w.Header().Set("Connection", "close")

if _, err = io.Copy(w, reader); err != nil {
log.Printf("%s", err.Error())
http.Error(w, "Error occured copying to output stream", 500)
return
}


+ 23
- 15
transfersh-server/main.go View File

@@ -33,7 +33,9 @@ import (
"github.com/gorilla/mux"
"log"
"math/rand"
"mime"
"net/http"
"net/url"
"os"
"time"
)
@@ -86,23 +88,27 @@ func main() {
r.HandleFunc("/({files:.*}).tar.gz", tarGzHandler).Methods("GET")
r.HandleFunc("/download/{token}/{filename}", getHandler).Methods("GET")

/*r.HandleFunc("/{token}/{filename}", viewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
u, err := url.Parse(r.Referer())
if err != nil {
log.Fatal(err)
return true
}
r.HandleFunc("/{token}/{filename}", previewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) (match bool) {
match = false

if u.Host == "transfer.sh" {
return false
}
// The file will show a preview page when opening the link in browser directly or
// from external link. If the referer url path and current path are the same it will be
// downloaded.
if !acceptsHtml(r.Header) {
return false
}

if u.Host == "" {
return false
}
match = (r.Referer() == "")

return true
}).Methods("GET")*/
u, err := url.Parse(r.Referer())
if err != nil {
log.Fatal(err)
return
}

match = match || (u.Path != r.URL.Path)
return
}).Methods("GET")

r.HandleFunc("/{token}/{filename}", getHandler).Methods("GET")
r.HandleFunc("/get/{token}/{filename}", getHandler).Methods("GET")
@@ -156,7 +162,9 @@ func main() {
log.Panic("Error while creating storage.")
}

log.Printf("Transfer.sh server started. :%v using temp folder: %s", *port, config.Temp)
mime.AddExtensionType(".md", "text/x-markdown")

log.Printf("Transfer.sh server started. :\nlistening on port: %v\nusing temp folder: %s\nusing storage provider: %s", *port, config.Temp, *provider)
log.Printf("---------------------------")

s := &http.Server{


+ 1
- 1
transfersh-server/static/404.html View File

@@ -154,4 +154,4 @@
<script src="http://linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js"></script>
</div>
</body>
</html>
</html>

+ 132
- 0
transfersh-server/static/download.audio.html View File

@@ -0,0 +1,132 @@


</html>
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>transfer.sh - Easy and fast file sharing from the command-line.</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="/styles/main.css">
<link href='//fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<script src="/scripts/vendor/modernizr.js"></script>
</head>


<body id="download">

<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<div id="navigation">
<div class="wrapper">
<a href="/">
<h1>transfer.sh</h1>
</a>
<ul class="hidden-xs">
<li><a href="/">home</a>
</li>
<li><a href="/#samples">sample use cases</a>
</li>
<li><a href="/#contact">contact us</a>
</li>
</ul>
</div>
</div>

<section id="home">
<div class="wrapper">
<br/>
<h2 class="page-title">{{.Filename}}</h2>
<h4>type: <b>{{.ContentType}}</b></h4>
<h4>size: <b>{{.ContentLength | format "#,###."}}</b> bytes</h4>

<a href="{{.Url}}" class="btn-cta btn"> download</i> </a> <br/><br/>


<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">

</div>
<div id="terminal" class="terminal preview-image">
<audio controls>
<source src="{{.Url}}" type="{{.ContentType}}">
</audio>
</div>
</div>
</div>
<br/>
<div>

</section>

<footer>
<div class="wrapper">
<div style="">
<a href="bitcoin:164ybRMLbg1dhhWWiUkXtiNr7jUhMKdJqH" label="Bitcoin+Donation" style="word-wrap: break-word;">
<img border="0" src=" /images/bitcoin.png" style="margin: 0 auto;;">
</a>
</div>
<br/>
<br/>
<img src="/images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://blog.dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
</p>
</div>

</footer>


<a href="https://github.com/you"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->


<script src="/scripts/main.js"></script>


</body>

</html>

+ 134
- 0
transfersh-server/static/download.code.html View File

@@ -0,0 +1,134 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{{.Filename}} - transfer.sh</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="styles/main.css">

<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<script src="scripts/vendor/modernizr.js"></script>
</head>

<body id="download">
<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<div id="navigation">
<div class="wrapper">
<h1>transfer.sh</h1>
<ul class="hidden-xs">
<li><a href="#samples">sample use cases</a>
</li>
<li><a href="#contact">contact us</a>
</li>
</ul>
</div>
</div>

<section id="home">
<div class="wrapper">
<h2>
{{.Filename}}</h2>
<a href="{{.Url}}"></a>
<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">

</div>
<div id="terminal" class="terminal">
<div id="code"></div>
</div>



</div>

</div>

<div>
<a href="#" id="copy-link-btn" class="btn-cta btn">copy link</a> &nbsp;&nbsp;
<a href="{{.Url}}" class="btn-cta btn"> download</i> </a>
<div id="copy-link-wrapper" class="copy-link-wrapper">
<p>Press Ctrl / CMD + C to copy link to your clipboard.</p>
<input readonly="readonly" type="text" value="{{.Url}}" />
</div>
<div id="overlay" class="overlay"></div>
</div>
<script src="scripts/clipboard.js"></script>

</section>


<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->

<script>
(function(b, o, i, l, e, r) {
b.GoogleAnalyticsObject = l;
b[l] || (b[l] =
function() {
(b[l].q = b[l].q || []).push(arguments)
});
b[l].l = +new Date;
e = o.createElement(i);
r = o.getElementsByTagName(i)[0];
e.src = '//www.google-analytics.com/analytics.js';
r.parentNode.insertBefore(e, r)
}(window, document, 'script', 'ga'));
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<script src="scripts/main.js"></script>
<script>

var text = "# Markdown *works*.";

var converter = new Showdown.converter();
var html = converter.makeHtml(text);
$('#md-preview').append(html);

</script>


</body>

</html>

+ 116
- 0
transfersh-server/static/download.html View File

@@ -0,0 +1,116 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>transfer.sh - Easy and fast file sharing from the command-line.</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="/styles/main.css">
<link href='//fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<script src="/scripts/vendor/modernizr.js"></script>
</head>


<body id="download">

<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<div id="navigation">
<div class="wrapper">
<a href="/">
<h1>transfer.sh</h1>
</a>
<ul class="hidden-xs">
<li><a href="/">home</a>
</li>
<li><a href="/#samples">sample use cases</a>
</li>
<li><a href="/#contact">contact us</a>
</li>
</ul>
</div>
</div>

<section id="home">
<div class="wrapper">
<br/>
<h2 class="page-title">{{.Filename}}</h2>
<h4>type: <b>{{.ContentType}}</b></h4>
<h4>size: <b>{{.ContentLength | format "#,###."}}</b> bytes</h4>

<a href="{{.Url}}" class="btn-cta btn"> download</i> </a> <br/><br/>

</div>
</section>
<footer>
<div class="wrapper">
<div style="">
<a href="bitcoin:164ybRMLbg1dhhWWiUkXtiNr7jUhMKdJqH" label="Bitcoin+Donation" style="word-wrap: break-word;">
<img border="0" src=" /images/bitcoin.png" style="margin: 0 auto;;">
</a>
</div>
<br/>
<br/>
<img src="/images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://blog.dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
</p>
</div>

</footer>


<a href="https://github.com/you"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->


<script src="/scripts/main.js"></script>



</body>

</html>

+ 126
- 0
transfersh-server/static/download.image.html View File

@@ -0,0 +1,126 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>transfer.sh - Easy and fast file sharing from the command-line.</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="/styles/main.css">
<link href='//fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<script src="/scripts/vendor/modernizr.js"></script>
</head>


<body id="download">

<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<div id="navigation">
<div class="wrapper">
<a href="/">
<h1>transfer.sh</h1>
</a>
<ul class="hidden-xs">
<li><a href="/">home</a>
</li>
<li><a href="/#samples">sample use cases</a>
</li>
<li><a href="/#contact">contact us</a>
</li>
</ul>
</div>
</div>

<section id="home">
<div class="wrapper">

<br/>
<h2 class="page-title">{{.Filename}}</h2>
<h4>type: <b>{{.ContentType}}</b></h4>
<h4>size: <b>{{.ContentLength | format "#,###."}}</b> bytes</h4>

<a href="{{.Url}}" class="btn-cta btn"> download</i> </a> <br/><br/>


<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">

</div>
<div id="terminal" class="terminal preview-image">
<img src="{{.Url}}" alt="">
</div>
</div>
</div>
<br/>
<div>
<div>
</section>

<footer>
<div class="wrapper">
<div style="">
<a href="bitcoin:164ybRMLbg1dhhWWiUkXtiNr7jUhMKdJqH" label="Bitcoin+Donation" style="word-wrap: break-word;">
<img border="0" src=" /images/bitcoin.png" style="margin: 0 auto;;">
</a>
</div>
<br/>
<br/>
<img src="/images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://blog.dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
</p>
</div>

</footer>


<a href="https://github.com/you"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->


<script src="/scripts/main.js"></script>


</body>

</html>

+ 124
- 0
transfersh-server/static/download.markdown.html View File

@@ -0,0 +1,124 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>transfer.sh - Easy and fast file sharing from the command-line.</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="/styles/main.css">
<link href='//fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<script src="/scripts/vendor/modernizr.js"></script>
</head>


<body id="download">

<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<div id="navigation">
<div class="wrapper">
<a href="/">
<h1>transfer.sh</h1>
</a>
<ul class="hidden-xs">
<li><a href="/">home</a>
</li>
<li><a href="/#samples">sample use cases</a>
</li>
<li><a href="/#contact">contact us</a>
</li>
</ul>
</div>
</div>

<section id="home">
<div class="wrapper">

<br/>
<h2 class="page-title">{{.Filename}}</h2>
<h4>type: <b>{{.ContentType}}</b></h4>
<h4>size: <b>{{.ContentLength | format "#,###."}}</b> bytes</h4>

<a href="{{.Url}}" class="btn-cta btn"> download</i> </a> <br/><br/>


<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">
</div>
<div id="terminal" class="terminal">
<div id="md-preview">{{.Content}}</div>
</div>
</div>
</div>
<br/>

</section>


<footer>
<div class="wrapper">
<div style="">
<a href="bitcoin:164ybRMLbg1dhhWWiUkXtiNr7jUhMKdJqH" label="Bitcoin+Donation" style="word-wrap: break-word;">
<img border="0" src=" /images/bitcoin.png" style="margin: 0 auto;;">
</a>
</div>
<br/>
<br/>
<img src="/images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://blog.dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
</p>
</div>

</footer>


<a href="https://github.com/you"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->


<script src="/scripts/main.js"></script>

</body>

</html>

+ 129
- 0
transfersh-server/static/download.video.html View File

@@ -0,0 +1,129 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>transfer.sh - Easy and fast file sharing from the command-line.</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="/styles/main.css">
<link href='//fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<script src="/scripts/vendor/modernizr.js"></script>
</head>


<body id="download">

<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<div id="navigation">
<div class="wrapper">
<a href="/">
<h1>transfer.sh</h1>
</a>
<ul class="hidden-xs">
<li><a href="/">home</a>
</li>
<li><a href="/#samples">sample use cases</a>
</li>
<li><a href="/#contact">contact us</a>
</li>
</ul>
</div>
</div>

<section id="home">
<div class="wrapper">
<br/>
<h2 class="page-title">{{.Filename}}</h2>
<h4>type: <b>{{.ContentType}}</b></h4>
<h4>size: <b>{{.ContentLength | format "#,###."}}</b> bytes</h4>

<a href="{{.Url}}" class="btn-cta btn"> download</i> </a> <br/><br/>


<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">

</div>
<div id="terminal" class="terminal preview-image">
<video controls>
<source src="{{.Url}}" type="{{.ContentType}}">
</video>
</div>
</div>
</div>
<br/>
<div>

</section>

<footer>
<div class="wrapper">
<div style="">
<a href="bitcoin:164ybRMLbg1dhhWWiUkXtiNr7jUhMKdJqH" label="Bitcoin+Donation" style="word-wrap: break-word;">
<img border="0" src=" /images/bitcoin.png" style="margin: 0 auto;;">
</a>
</div>
<br/>
<br/>
<img src="/images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://blog.dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
</p>
</div>

</footer>


<a href="https://github.com/you"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->


<script src="/scripts/main.js"></script>


</body>

</html>

BIN
View File


+ 5
- 5
transfersh-server/static/images/terminal-top.svg View File

@@ -45,14 +45,14 @@
</rdf:RDF>
</metadata>
<g
transform="translate(-93.957497,-365.26607)"
transform="matrix(1,0,0,0.94456233,-93.957497,-345.57658)"
id="layer1">
<path
d="m 85.371201,355.16455 789.901059,0 0,49.98291 -789.901059,0 z"
d="m 93.957497,365.85895 750.000003,0 0,31.76074 -750.000003,0 z"
id="rect4487"
style="fill:#85b5bb;fill-opacity:1;stroke:none" />
<g
transform="matrix(1.4512649,0,0,-1.4512649,-114.5591,1453.446)"
transform="matrix(1.4512649,0,0,-1.4512649,-114.5591,1454.9192)"
id="g24"
style="fill:#ff7050">
<g
@@ -78,7 +78,7 @@
</g>
</g>
<g
transform="matrix(1.4512649,0,0,-1.4512649,-114.5591,1453.507)"
transform="matrix(1.4512649,0,0,-1.4512649,-114.5591,1454.9802)"
id="g40"
style="fill:#ffed5d">
<g
@@ -104,7 +104,7 @@
</g>
</g>
<g
transform="matrix(1.4512649,0,0,-1.4512649,-115.0147,1453.4765)"
transform="matrix(1.4512649,0,0,-1.4512649,-115.0147,1454.9497)"
id="g56"
style="fill:#93de7f">
<g


+ 6
- 0
transfersh-server/static/images/tor.svg
File diff suppressed because it is too large
View File


+ 5
- 0
transfersh-server/static/includes/download-bottom.html View File

@@ -0,0 +1,5 @@
</div>
</div>
</div>
<br/>
</section>

+ 10
- 0
transfersh-server/static/includes/download-btn.html View File

@@ -0,0 +1,10 @@
<div>
<a href="#" id="copy-link-btn" class="btn-cta btn">copy link</a> &nbsp;&nbsp;
<a href="{{.Url}}" class="btn-cta btn"> download</i> </a>
<div id="copy-link-wrapper" class="copy-link-wrapper">
<p>Press Ctrl / CMD + C to copy link to your clipboard.</p>
<input readonly="readonly" type="text" value="{{.Url}}" />
</div>
<div id="overlay" class="overlay"></div>
</div>
<script src="scripts/clipboard.js"></script>

+ 6
- 0
transfersh-server/static/includes/download-top.html View File

@@ -0,0 +1,6 @@
<br/>
<h2 class="page-title">{{.Filename}}</h2>
<h4>type: <b>{{.ContentType}}</b></h4>
<h4>size: <b>{{.ContentLength | format "#,###."}}</b> bytes</h4>

<a href="{{.Url}}" class="btn-cta btn"> download</i> </a> <br/><br/>

+ 36
- 0
transfersh-server/static/includes/footer.html View File

@@ -0,0 +1,36 @@
<footer>
<div class="wrapper">
<div style="">
<a href="bitcoin:164ybRMLbg1dhhWWiUkXtiNr7jUhMKdJqH" label="Bitcoin+Donation" style="word-wrap: break-word;">
<img border="0" src=" /images/bitcoin.png" style="margin: 0 auto;;">
</a>
</div>
<br/>
<br/>
<img src="/images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://blog.dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
</p>
</div>

</footer>


<a href="https://github.com/you"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->


+ 15
- 0
transfersh-server/static/includes/ga.html View File

@@ -0,0 +1,15 @@
<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

+ 12
- 0
transfersh-server/static/includes/head.html View File

@@ -0,0 +1,12 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>transfer.sh - Easy and fast file sharing from the command-line.</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="/styles/main.css">
<link href='//fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<script src="/scripts/vendor/modernizr.js"></script>
</head>

+ 2
- 0
transfersh-server/static/includes/js.html View File

@@ -0,0 +1,2 @@
<script src="/scripts/main.js"></script>

+ 15
- 0
transfersh-server/static/includes/navigation.html View File

@@ -0,0 +1,15 @@
<div id="navigation">
<div class="wrapper">
<a href="/">
<h1>transfer.sh</h1>
</a>
<ul class="hidden-xs">
<li><a href="/">home</a>
</li>
<li><a href="/#samples">sample use cases</a>
</li>
<li><a href="/#contact">contact us</a>
</li>
</ul>
</div>
</div>

+ 132
- 94
transfersh-server/static/index.html View File

@@ -11,16 +11,16 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>transfer.sh - Easy and fast file sharing from the command-line.</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="styles/main.css">

<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300" rel="stylesheet" type="text/css">
<link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400" rel="stylesheet" type="text/css">
<link href="http://fonts.googleapis.com/css?family=Droid+Sans+Mono" rel="stylesheet" type="text/css">
<script src="scripts/vendor/modernizr.js"></script>
<link rel="stylesheet" href="/styles/main.css">
<link href='//fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<script src="/scripts/vendor/modernizr.js"></script>
</head>



<body>

<script>
@@ -39,21 +39,25 @@
ga('send', 'pageview');
</script>

<div id="navigation">
<div class="wrapper">
<h1>transfer.sh</h1>
<ul class="hidden-xs">
<li><a href="#samples">sample use cases</a>
</li>
<li><a href="#contact">contact us</a>
</li>
</ul>
<div id="navigation">
<div class="wrapper">
<a href="/">
<h1>transfer.sh</h1>
</a>
<ul class="hidden-xs">
<li><a href="/">home</a>
</li>
<li><a href="/#samples">sample use cases</a>
</li>
<li><a href="/#contact">contact us</a>
</li>
</ul>
</div>
</div>
</div>

<section id="home">
<div class="wrapper">
<h2>
<h2 class="page-title">
Easy file sharing from the command line</h2>
<div class="row animated fadeInDown">
<div id="from-terminal" class="box col-md-8 col-md-offset-2 col-xs-12">
@@ -75,19 +79,20 @@
<code>
<br>
<span class="code-title"># Upload from web</span>
<br>Drag your files here, or <a class="browse" href="#"> click to browse.</a>
<br>Drag your files here, or <a class="browse" href="#"> click to browse. <br/></a>
</code>
<input type="file" multiple="multiple" style="display: none">
<ul class="queue">
<input type="file" multiple="multiple" style='display: none;' />
<ul class='queue'>
<li>
</li>
</ul>
<div class="all-files">
<div class='all-files'>
<br>
<div>
<span class="code-title"># Download all your files</span>
<br>
<br>
<br/>
<br/>
<a class="download-zip btn-cta" href="#">zip</a> <a class="download-tar btn-cta" href="#">tar.gz</a>
</div>
</div>
@@ -95,16 +100,16 @@
</div>

<div>
<a href="#features" class="btn-cta btn-home">learn more </a>
<a href="#features" class="btn-cta btn-home">learn more</i> </a>
</div>
</div>
</div></section>
</section>



<section id="features">
<div class="wrapper container">
<div class="row animated fadeInDown">
<div class="row animated fadeInDown ">
<div class="col-md-3 col-xs-6">
<i class="icon-terminal"></i>
<h3>Made for use with shell</h3>
@@ -122,7 +127,7 @@
<h3>Files stored for 14 days</h3>
</div>
</div>
<div class="row animated fadeInDown">
<div class="row animated fadeInDown">
<div class="col-md-offset-3 col-md-3 col-xs-6">
<i class="icon-tag"></i>
<h3>For free</h3>
@@ -139,11 +144,11 @@

<section id="samples">
<div class="wrapper">
<h2>
<h2 class="page-title">
Sample use cases
</h2>
<div class="row">
<div class="col-md-6">
<div class="col-md-6 ">
<h3>How to upload</h3>
<div class="terminal-top">

@@ -159,20 +164,21 @@
</code>
</div>
</div>
<div class="col-md-6">
<div class="col-md-6 ">
<h3>Create an alias and add it to .bashrc or .zshrc</h3>
<div class="terminal-top">
</div>
<div class="terminal">
<code>
<span class="code-title"># Add this to .bashrc or its equivalent</span>
<br>transfer() {
<br># write to output to tmpfile because of progress bar
<br>tmpfile=$( mktemp -t transferXXX ); curl --progress-bar --upload-file $1 https://transfer.sh/$(basename $1) >> $tmpfile; cat $tmpfile; rm -f $tmpfile; }
<br>
<br>alias transfer=transfer
<br>
<br>
<br/>transfer() {
<br># write to output to tmpfile because of progress bar
<br>tmpfile=$( mktemp -t transferXXX ); basefile=$(basename "$1" | sed -e 's/[^a-zA-Z0-9]/-/g'); curl --progress-bar --upload-file "$1" "https://transfer.sh/$basefile" >> $tmpfile; cat $tmpfile; rm -f $tmpfile;
<br/>}
<br/>
<br/>alias transfer=transfer
<br/>
<br/>
<span class="code-title"># Now you can use transfer command</span>
<br>$ transfer hello.txt
</code>
@@ -183,9 +189,9 @@

<a class="btn-cta" data-target="#coll" data-toggle="collapse">More examples</a>

<div class="collapse" id="coll">
<div class="collapse " id="coll">
<div class="row">
<div class="col-md-6">
<div class="col-md-6 ">
<h3>Upload multiple files at once</h3>
<div class="terminal-top">
</div>
@@ -196,13 +202,13 @@
<br>
<span class="code-title"># Combining downloads as zip or tar archive</span>
<br>$ curl https://transfer.sh/(15HKz/hello.txt,15HKz/hello.txt).tar.gz
<br>$ curl https://transfer.sh/(15HKz/hello.txt,15HKz/hello.txt).zip
<br/>$ curl https://transfer.sh/(15HKz/hello.txt,15HKz/hello.txt).zip
</code>
</div>


</div>
<div class="col-md-6">
<div class="col-md-6 ">
<h3>Encrypt your files before the transfer</h3>
<div class="terminal-top">
</div>
@@ -229,7 +235,8 @@
<span class="code-title"># Scan for malware or viruses using Clamav</span>
<br>$ wget http://www.eicar.org/download/eicar.com
<br>$ curl -X PUT --upload-file ./eicar.com https://transfer.sh/eicar.com/scan
<br><br>
<br>
<br>
<span class="code-title"># Upload malware to VirusTotal, get a permalink in return</span>
<br>$ curl -X PUT --upload-file nhgbhhj https://transfer.sh/test.txt/virustotal
<br>
@@ -243,7 +250,7 @@
<div class="terminal">
<code>
<span class="code-title"># Backup, encrypt and transfer</span>
<br>$ mysqldump --all-databases|gzip|gpg -ac -o-|curl -X PUT --upload-file "-" https://transfer.sh/test.txt </code>
<br/>$ mysqldump --all-databases|gzip|gpg -ac -o-|curl -X PUT --upload-file "-" https://transfer.sh/test.txt</code>
</div>
</div>
</div>
@@ -255,7 +262,7 @@
<div class="terminal">
<code>
<span class="code-title"># Transfer and send email with link (uses alias)</span>
<br>$ transfer /tmp/hello.txt | mail -s "Hello World" user@yourmaildomain.com
<br/>$ transfer /tmp/hello.txt | mail -s "Hello World" user@yourmaildomain.com
</code>
</div>
</div>
@@ -274,28 +281,45 @@
</div>
</section>

<section id="share">
<div class="wrapper">
<h2 class="page-title">Follow on GitHub</h2>
<br>
<br>

<iframe src="//ghbtns.com/github-btn.html?user=dutchcoders&repo=transfer.sh&type=follow&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="250" height="50"></iframe>
<iframe src="//ghbtns.com/github-btn.html?user=dutchcoders&repo=transfer.sh&type=watch&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="200" height="50"></iframe>
</div>
</section>

<section id="reviews">
<div class="wrapper">
<div class="row">
<div class="col-md-8 col-md-offset-2 col-xs-12">
<blockquote class="twitter-tweet tweet-xl" lang="en">
<img class="twitter-profile" src="images/reviews/dave.jpg" alt="">
<a href="https://twitter.com/FloifyDave/status/517383101425516544">
<img class="twitter-profile" src="images/reviews/dave.jpg" alt="">
</a>
<p><a href="https://twitter.com/dutchcoders">@dutchcoders</a> Thanks for transfer.sh. Just used it for a production purpose for a customer. So great, so easy, so https. :)</p>
<a href="https://twitter.com/FloifyDave/status/517383101425516544">
&mdash; Dave Sims (@FloifyDave)</a>
&mdash; Dave Sims (@FloifyDave)</a>
</blockquote>
</div>
</div>
<div class="row">
<div class="col-md-6 col-xs-12">
<blockquote class="twitter-tweet" lang="en">
<img class="twitter-profile" src="images/reviews/kareem.jpg" alt="">
<a href="https://twitter.com/kareemk/status/517029789191118849">
<img class="twitter-profile" src="images/reviews/kareem.jpg" alt="">
</a>
<p><a href="https://twitter.com/dutchcoders">@dutchcoders</a> love transfer.sh! any change we can *pay* for a self-hosted version?</p><a href="https://twitter.com/kareemk/status/517029789191118849">&mdash; Kareem Kouddous (@kareemk) </a>
</blockquote>
</div>
<div class="col-md-6 col-xs-12">
<blockquote class="twitter-tweet" lang="en">
<img class="twitter-profile" src="images/reviews/pg.jpeg" alt="">
<a href="https://twitter.com/drakpz/status/517008058841829376">
<img class="twitter-profile" src="images/reviews/pg.jpeg" alt="">
</a>
<p><a href="http://t.co/JomAmqWYEB">http://t.co/JomAmqWYEB</a> by <a href="https://twitter.com/dutchcoders">@dutchcoders</a> is pure awesomeness! any chance of source on github? :-)</p><a href="https://twitter.com/drakpz/status/517008058841829376">&mdash; PJ Spagnolatti (@drakpz)</a>
</blockquote>
</div>
@@ -303,14 +327,18 @@
<div class="row">
<div class="col-md-6 col-xs-12">
<blockquote class="twitter-tweet" lang="en">
<img class="twitter-profile" src="images/reviews/jacob.jpg" alt="">
<a href="https://twitter.com/jacoblindgren11/status/516975006501203968">
<img class="twitter-profile" src="images/reviews/jacob.jpg" alt="">
</a>
<p>Love transfer.sh! Will be using it from now on! Thanks for the amazing service we can use from the CLI <a href="https://twitter.com/dutchcoders">@dutchcoders</a>
</p><a href="https://twitter.com/jacoblindgren11/status/516975006501203968">&mdash; Jacob Lindgren (@jacoblindgren11) </a>
</blockquote>
</div>
<div class="col-md-6 col-xs-12">
<blockquote class="twitter-tweet" lang="en">
<img class="twitter-profile" src="images/reviews/lars.jpg" alt="">
<a href="https://twitter.com/arvestad/status/519507976491499521">
<img class="twitter-profile" src="images/reviews/lars.jpg" alt="">
</a>
<p>transfer.sh is my latest fav service! Try simple command-line and web file sharing! <a href="https://t.co/FSrsb1JKJd">https://t.co/FSrsb1JKJd</a>&#10;Thanks <a href="https://twitter.com/dutchcoders">@dutchcoders</a> !</p> <a href="https://twitter.com/arvestad/status/519507976491499521">&mdash; Lars Arvestad (@arvestad)</a>
</blockquote>
</div>
@@ -320,83 +348,93 @@

<section id="share">
<div class="wrapper">
<h2>Share the love</h2>
<h2 class="page-title">Share the love</h2>
<ul class="share-buttons">
<li>
<a href="https://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Ftransfer.sh&t=" target="_blank" onclick="window.open('https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(document.URL) + '&t=' + encodeURIComponent(document.URL)); return false"> <i class="icon-facebook"></i>
<a href="https://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Ftransfer.sh&t=" target="_blank" onclick="window.open('https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(document.URL) + '&t=' + encodeURIComponent(document.URL)); return false;"> <i class="icon-facebook"></i>
</a>
</li>
<li>
<a href="https://twitter.com/intent/tweet?source=http%3A%2F%2Ftransfer.sh&text=:%20http%3A%2F%2Ftransfer.sh" target="_blank" title="Tweet" onclick="window.open('https://twitter.com/intent/tweet?text=' + encodeURIComponent(document.title) + ':%20' + encodeURIComponent(document.URL)); return false"> <i class="icon-twitter"></i>
</a></li>
<a href="https://twitter.com/intent/tweet?source=http%3A%2F%2Ftransfer.sh&text=:%20http%3A%2F%2Ftransfer.sh" target="_blank" title="Tweet" onclick="window.open('https://twitter.com/intent/tweet?text=' + encodeURIComponent(document.title) + ':%20' + encodeURIComponent(document.URL)); return false;"> <i class="icon-twitter"></i>
</li>
<li>
<a href="https://plus.google.com/share?url=http%3A%2F%2Ftransfer.sh" target="_blank" title="Share on Google+" onclick="window.open('https://plus.google.com/share?url=' + encodeURIComponent(document.URL)); return false"> <i class="icon-gplus"></i>
<a href="https://plus.google.com/share?url=http%3A%2F%2Ftransfer.sh" target="_blank" title="Share on Google+" onclick="window.open('https://plus.google.com/share?url=' + encodeURIComponent(document.URL)); return false;"> <i class="icon-gplus"></i>
</a>
</li>
<li>
<a href="http://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Ftransfer.sh&title=&summary=&source=http%3A%2F%2Ftransfer.sh" target="_blank" title="Share on LinkedIn" onclick="window.open('http://www.linkedin.com/shareArticle?mini=true&url=' + encodeURIComponent(document.URL) + '&title=' + encodeURIComponent(document.title)); return false"> <i class="icon-linkedin"></i>
<a href="http://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Ftransfer.sh&title=&summary=&source=http%3A%2F%2Ftransfer.sh" target="_blank" title="Share on LinkedIn" onclick="window.open('http://www.linkedin.com/shareArticle?mini=true&url=' + encodeURIComponent(document.URL) + '&title=' + encodeURIComponent(document.title)); return false;"> <i class="icon-linkedin"></i>
</a>
</li>
</ul>
</div>
</section>


<section id="contact">
<div class="wrapper">
<i class="icon-mail"></i>
<h2>
<h2 class="page-title">
Any questions?
</h2>
<a href="#" data-uv-trigger class="btn-cta">contact us</a>
</div>
</section>


<section id="tor">
<div class="wrapper">
<a href="https://torproject.com"><img src="images/tor.svg" alt=""></a><br/>
<a href="https://jxm5d6emw5rknovg.onion/">https://jxm5d6emw5rknovg.onion/</a>
</div>
</section>


<footer>
<div class="wrapper">
<img src="images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
<div style="">
<a href="bitcoin:164ybRMLbg1dhhWWiUkXtiNr7jUhMKdJqH" label="Bitcoin+Donation" style="word-wrap: break-word;">
<img border="0" src=" /images/bitcoin.png" style="margin: 0 auto;;">
</a>
</div>
<br/>
<br/>
<img src="/images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://blog.dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
</p>
</div>

</footer>

<a href="https://github.com/dutchcoders/transfer.sh/">
<img style="position: absolute; top: 0; right: 0; border: 0" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png">
</a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>
<a href="https://github.com/you"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->



<script src="/scripts/main.js"></script>


<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->

<script>
(function(b, o, i, l, e, r) {
b.GoogleAnalyticsObject = l;
b[l] || (b[l] =
function() {
(b[l].q = b[l].q || []).push(arguments)
});
b[l].l = +new Date;
e = o.createElement(i);
r = o.getElementsByTagName(i)[0];
e.src = '//www.google-analytics.com/analytics.js';
r.parentNode.insertBefore(e, r)
}(window, document, 'script', 'ga'));
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<script src="scripts/main.js"></script>

</body>

</html>
</html>

+ 3
- 3
transfersh-server/static/scripts/main.js
File diff suppressed because it is too large
View File


+ 1
- 1
transfersh-server/static/styles/main.css
File diff suppressed because it is too large
View File


+ 46
- 2
transfersh-server/storage.go View File

@@ -4,6 +4,7 @@ import (
"fmt"
"github.com/goamz/goamz/s3"
"io"
"mime"
"os"
"path/filepath"
"strconv"
@@ -11,6 +12,7 @@ import (

type Storage interface {
Get(token string, filename string) (reader io.ReadCloser, contentType string, contentLength uint64, err error)
Head(token string, filename string) (contentType string, contentLength uint64, err error)
Put(token string, filename string, reader io.Reader, contentType string, contentLength uint64) error
}

@@ -23,6 +25,21 @@ func NewLocalStorage(basedir string) (*LocalStorage, error) {
return &LocalStorage{basedir: basedir}, nil
}

func (s *LocalStorage) Head(token string, filename string) (contentType string, contentLength uint64, err error) {
path := filepath.Join(s.basedir, token, filename)

var fi os.FileInfo
if fi, err = os.Lstat(path); err != nil {
return
}

contentLength = uint64(fi.Size())

contentType = mime.TypeByExtension(filepath.Ext(filename))

return
}

func (s *LocalStorage) Get(token string, filename string) (reader io.ReadCloser, contentType string, contentLength uint64, err error) {
path := filepath.Join(s.basedir, token, filename)

@@ -33,11 +50,12 @@ func (s *LocalStorage) Get(token string, filename string) (reader io.ReadCloser,

var fi os.FileInfo
if fi, err = os.Lstat(path); err != nil {
return
}

contentLength = uint64(fi.Size())

contentType = ""
contentType = mime.TypeByExtension(filepath.Ext(filename))

return
}
@@ -80,13 +98,39 @@ func NewS3Storage() (*S3Storage, error) {
return &S3Storage{bucket: bucket}, nil
}

func (s *S3Storage) Head(token string, filename string) (contentType string, contentLength uint64, err error) {
key := fmt.Sprintf("%s/%s", token, filename)

// content type , content length
response, err := s.bucket.Head(key, map[string][]string{})
if err != nil {
return
}

contentType = response.Header.Get("Content-Type")

contentLength, err = strconv.ParseUint(response.Header.Get("Content-Length"), 10, 0)
if err != nil {
return
}

return
}

func (s *S3Storage) Get(token string, filename string) (reader io.ReadCloser, contentType string, contentLength uint64, err error) {
key := fmt.Sprintf("%s/%s", token, filename)

// content type , content length
response, err := s.bucket.GetResponse(key)
contentType = ""
if err != nil {
return
}

contentType = response.Header.Get("Content-Type")
contentLength, err = strconv.ParseUint(response.Header.Get("Content-Length"), 10, 0)
if err != nil {
return
}

reader = response.Body
return


+ 172
- 0
transfersh-server/utils.go View File

@@ -27,8 +27,11 @@ package main
import (
"github.com/goamz/goamz/aws"
"github.com/goamz/goamz/s3"
"github.com/golang/gddo/httputil/header"
"math"
"net/http"
"net/mail"
"strconv"
"strings"
"time"
)
@@ -44,6 +47,163 @@ func getBucket() (*s3.Bucket, error) {
return b, nil
}

func formatNumber(format string, s uint64) string {

return RenderFloat(format, float64(s))
}

var renderFloatPrecisionMultipliers = [10]float64{
1,
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
}

var renderFloatPrecisionRounders = [10]float64{
0.5,
0.05,
0.005,
0.0005,
0.00005,
0.000005,
0.0000005,
0.00000005,
0.000000005,
0.0000000005,
}

func RenderFloat(format string, n float64) string {
// Special cases:
// NaN = "NaN"
// +Inf = "+Infinity"
// -Inf = "-Infinity"
if math.IsNaN(n) {
return "NaN"
}
if n > math.MaxFloat64 {
return "Infinity"
}
if n < -math.MaxFloat64 {
return "-Infinity"
}

// default format
precision := 2
decimalStr := "."
thousandStr := ","
positiveStr := ""
negativeStr := "-"

if len(format) > 0 {
// If there is an explicit format directive,
// then default values are these:
precision = 9
thousandStr = ""

// collect indices of meaningful formatting directives
formatDirectiveChars := []rune(format)
formatDirectiveIndices := make([]int, 0)
for i, char := range formatDirectiveChars {
if char != '#' && char != '0' {
formatDirectiveIndices = append(formatDirectiveIndices, i)
}
}

if len(formatDirectiveIndices) > 0 {
// Directive at index 0:
// Must be a '+'
// Raise an error if not the case
// index: 0123456789
// +0.000,000
// +000,000.0
// +0000.00
// +0000
if formatDirectiveIndices[0] == 0 {
if formatDirectiveChars[formatDirectiveIndices[0]] != '+' {
panic("RenderFloat(): invalid positive sign directive")
}
positiveStr = "+"
formatDirectiveIndices = formatDirectiveIndices[1:]
}

// Two directives:
// First is thousands separator
// Raise an error if not followed by 3-digit
// 0123456789
// 0.000,000
// 000,000.00
if len(formatDirectiveIndices) == 2 {
if (formatDirectiveIndices[1] - formatDirectiveIndices[0]) != 4 {
panic("RenderFloat(): thousands separator directive must be followed by 3 digit-specifiers")
}
thousandStr = string(formatDirectiveChars[formatDirectiveIndices[0]])
formatDirectiveIndices = formatDirectiveIndices[1:]
}

// One directive:
// Directive is decimal separator
// The number of digit-specifier following the separator indicates wanted precision
// 0123456789
// 0.00
// 000,0000
if len(formatDirectiveIndices) == 1 {
decimalStr = string(formatDirectiveChars[formatDirectiveIndices[0]])
precision = len(formatDirectiveChars) - formatDirectiveIndices[0] - 1
}
}
}

// generate sign part
var signStr string
if n >= 0.000000001 {
signStr = positiveStr
} else if n <= -0.000000001 {
signStr = negativeStr
n = -n
} else {
signStr = ""
n = 0.0
}

// split number into integer and fractional parts
intf, fracf := math.Modf(n + renderFloatPrecisionRounders[precision])

// generate integer part string
intStr := strconv.Itoa(int(intf))

// add thousand separator if required
if len(thousandStr) > 0 {
for i := len(intStr); i > 3; {
i -= 3
intStr = intStr[:i] + thousandStr + intStr[i:]
}
}

// no fractional part, we can leave now
if precision == 0 {
return signStr + intStr
}

// generate fractional part
fracStr := strconv.Itoa(int(fracf * renderFloatPrecisionMultipliers[precision]))
// may need padding
if len(fracStr) < precision {
fracStr = "000000000000000"[:precision-len(fracStr)] + fracStr
}

return signStr + intStr + decimalStr + fracStr
}

func RenderInteger(format string, n int) string {
return RenderFloat(format, float64(n))
}

// Request.RemoteAddress contains port, which we want to remove i.e.:
// "[::1]:58292" => "[::1]"
func ipAddrFromRemoteAddr(s string) string {
@@ -78,3 +238,15 @@ func encodeRFC2047(String string) string {
addr := mail.Address{String, ""}
return strings.Trim(addr.String(), " <>")
}

func acceptsHtml(hdr http.Header) bool {
actual := header.ParseAccept(hdr, "Accept")

for _, s := range actual {
if s.Value == "text/html" {
return (true)
}
}

return (false)
}

+ 47
- 0
transfersh-web/download.audio.html View File

@@ -0,0 +1,47 @@


</html>
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

include "includes/head.html"

<body id="download">

include "includes/ga.html"
include "includes/navigation.html"

<section id="home">
<div class="wrapper">
include "includes/download-top.html"

<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">

</div>
<div id="terminal" class="terminal preview-image">
<audio controls>
<source src="{{.Url}}" type="{{.ContentType}}">
</audio>
</div>
</div>
</div>
<br/>
<div>

</section>

include "includes/footer.html"
include "includes/js.html"

</body>

</html>

+ 143
- 0
transfersh-web/download.code.html View File

@@ -0,0 +1,143 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{{.Filename}} - transfer.sh</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="styles/main.css">

<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<!-- build:js scripts/vendor/modernizr.js -->
<script src="bower_components/modernizr/modernizr.js"></script>
<!-- endbuild -->
</head>

<body id="download">
<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<div id="navigation">
<div class="wrapper">
<h1>transfer.sh</h1>
<ul class="hidden-xs">
<li><a href="#samples">sample use cases</a>
</li>
<li><a href="#contact">contact us</a>
</li>
</ul>
</div>
</div>

<section id="home">
<div class="wrapper">
<h2>
{{.Filename}}</h2>
<a href="{{.Url}}"></a>
<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">

</div>
<div id="terminal" class="terminal">
<div id="code"></div>
</div>



</div>

</div>

<div>
<a href="#" id="copy-link-btn" class="btn-cta btn">copy link</a> &nbsp;&nbsp;
<a href="{{.Url}}" class="btn-cta btn"> download</i> </a>
<div id="copy-link-wrapper" class="copy-link-wrapper">
<p>Press Ctrl / CMD + C to copy link to your clipboard.</p>
<input readonly="readonly" type="text" value="{{.Url}}" />
</div>
<div id="overlay" class="overlay"></div>
</div>
<script src="scripts/clipboard.js"></script>

</section>


<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->

<script>
(function(b, o, i, l, e, r) {
b.GoogleAnalyticsObject = l;
b[l] || (b[l] =
function() {
(b[l].q = b[l].q || []).push(arguments)
});
b[l].l = +new Date;
e = o.createElement(i);
r = o.getElementsByTagName(i)[0];
e.src = '//www.google-analytics.com/analytics.js';
r.parentNode.insertBefore(e, r)
}(window, document, 'script', 'ga'));
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<!-- build:js scripts/main.js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/uri.js/src/URI.min.js"></script>
<script src="bower_components/bootstrap/js/transition.js"></script>
<script src="bower_components/bootstrap/js/collapse.js"></script>
<script src="/scripts/showdown.js"></script>
<script src="/scripts/main.js"></script>
<!-- endbuild -->
<script>

var text = "# Markdown *works*.";

var converter = new Showdown.converter();
var html = converter.makeHtml(text);
$('#md-preview').append(html);

</script>


</body>

</html>

+ 31
- 0
transfersh-web/download.html View File

@@ -0,0 +1,31 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

include "includes/head.html"

<body id="download">

include "includes/ga.html"
include "includes/navigation.html"

<section id="home">
<div class="wrapper">
include "includes/download-top.html"
</div>
</section>
include "includes/footer.html"
include "includes/js.html"


</body>

</html>

+ 41
- 0
transfersh-web/download.image.html View File

@@ -0,0 +1,41 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

include "includes/head.html"

<body id="download">

include "includes/ga.html"
include "includes/navigation.html"

<section id="home">
<div class="wrapper">

include "includes/download-top.html"

<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">

</div>
<div id="terminal" class="terminal preview-image">
<img src="{{.Url}}" alt="">
</div>
</div>
</div>
<br/>
<div>
<div>
</section>

include "includes/footer.html"
include "includes/js.html"

</body>

</html>

+ 39
- 0
transfersh-web/download.markdown.html View File

@@ -0,0 +1,39 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

include "includes/head.html"

<body id="download">

include "includes/ga.html"
include "includes/navigation.html"

<section id="home">
<div class="wrapper">

include "includes/download-top.html"

<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">
</div>
<div id="terminal" class="terminal">
<div id="md-preview">{{.Content}}</div>
</div>
</div>
</div>
<br/>

</section>


include "includes/footer.html"
include "includes/js.html"
</body>

</html>

+ 44
- 0
transfersh-web/download.video.html View File

@@ -0,0 +1,44 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->

include "includes/head.html"

<body id="download">

include "includes/ga.html"
include "includes/navigation.html"

<section id="home">
<div class="wrapper">
include "includes/download-top.html"

<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">

</div>
<div id="terminal" class="terminal preview-image">
<video controls>
<source src="{{.Url}}" type="{{.ContentType}}">
</video>
</div>
</div>
</div>
<br/>
<div>

</section>

include "includes/footer.html"
include "includes/js.html"

</body>

</html>

BIN
View File


+ 5
- 5
transfersh-web/images/terminal-top.svg View File

@@ -45,14 +45,14 @@
</rdf:RDF>
</metadata>
<g
transform="translate(-93.957497,-365.26607)"
transform="matrix(1,0,0,0.94456233,-93.957497,-345.57658)"
id="layer1">
<path
d="m 85.371201,355.16455 789.901059,0 0,49.98291 -789.901059,0 z"
d="m 93.957497,365.85895 750.000003,0 0,31.76074 -750.000003,0 z"
id="rect4487"
style="fill:#85b5bb;fill-opacity:1;stroke:none" />
<g
transform="matrix(1.4512649,0,0,-1.4512649,-114.5591,1453.446)"
transform="matrix(1.4512649,0,0,-1.4512649,-114.5591,1454.9192)"
id="g24"
style="fill:#ff7050">
<g
@@ -78,7 +78,7 @@
</g>
</g>
<g
transform="matrix(1.4512649,0,0,-1.4512649,-114.5591,1453.507)"
transform="matrix(1.4512649,0,0,-1.4512649,-114.5591,1454.9802)"
id="g40"
style="fill:#ffed5d">
<g
@@ -104,7 +104,7 @@
</g>
</g>
<g
transform="matrix(1.4512649,0,0,-1.4512649,-115.0147,1453.4765)"
transform="matrix(1.4512649,0,0,-1.4512649,-115.0147,1454.9497)"
id="g56"
style="fill:#93de7f">
<g


+ 6
- 0
transfersh-web/images/tor.svg
File diff suppressed because it is too large
View File


+ 5
- 0
transfersh-web/includes/download-bottom.html View File

@@ -0,0 +1,5 @@
</div>
</div>
</div>
<br/>
</section>

+ 10
- 0
transfersh-web/includes/download-btn.html View File

@@ -0,0 +1,10 @@
<div>
<a href="#" id="copy-link-btn" class="btn-cta btn">copy link</a> &nbsp;&nbsp;
<a href="{{.Url}}" class="btn-cta btn"> download</i> </a>
<div id="copy-link-wrapper" class="copy-link-wrapper">
<p>Press Ctrl / CMD + C to copy link to your clipboard.</p>
<input readonly="readonly" type="text" value="{{.Url}}" />
</div>
<div id="overlay" class="overlay"></div>
</div>
<script src="scripts/clipboard.js"></script>

+ 6
- 0
transfersh-web/includes/download-top.html View File

@@ -0,0 +1,6 @@
<br/>
<h2 class="page-title">{{.Filename}}</h2>
<h4>type: <b>{{.ContentType}}</b></h4>
<h4>size: <b>{{.ContentLength | format "#,###."}}</b> bytes</h4>

<a href="{{.Url}}" class="btn-cta btn"> download</i> </a> <br/><br/>

+ 36
- 0
transfersh-web/includes/footer.html View File

@@ -0,0 +1,36 @@
<footer>
<div class="wrapper">
<div style="">
<a href="bitcoin:164ybRMLbg1dhhWWiUkXtiNr7jUhMKdJqH" label="Bitcoin+Donation" style="word-wrap: break-word;">
<img border="0" src=" /images/bitcoin.png" style="margin: 0 auto;;">
</a>
</div>
<br/>
<br/>
<img src="/images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://blog.dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
</p>
</div>

</footer>


<a href="https://github.com/you"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->


+ 15
- 0
transfersh-web/includes/ga.html View File

@@ -0,0 +1,15 @@
<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

+ 14
- 0
transfersh-web/includes/head.html View File

@@ -0,0 +1,14 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>transfer.sh - Easy and fast file sharing from the command-line.</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="/styles/main.css">
<link href='//fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<!-- build:js /scripts/vendor/modernizr.js -->
<script src="bower_components/modernizr/modernizr.js"></script>
<!-- endbuild -->
</head>

+ 9
- 0
transfersh-web/includes/js.html View File

@@ -0,0 +1,9 @@
<!-- build:js /scripts/main.js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/uri.js/src/URI.min.js"></script>
<script src="bower_components/bootstrap/js/transition.js"></script>
<script src="bower_components/bootstrap/js/collapse.js"></script>
<script src="/scripts/showdown.js"></script>
<script src="/scripts/main.js"></script>
<!-- endbuild -->

+ 15
- 0
transfersh-web/includes/navigation.html View File

@@ -0,0 +1,15 @@
<div id="navigation">
<div class="wrapper">
<a href="/">
<h1>transfer.sh</h1>
</a>
<ul class="hidden-xs">
<li><a href="/">home</a>
</li>
<li><a href="/#samples">sample use cases</a>
</li>
<li><a href="/#contact">contact us</a>
</li>
</ul>
</div>
</div>

+ 54
- 92
transfersh-web/index.html View File

@@ -6,22 +6,8 @@
<html class="no-js">
<!--<![endif]-->

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>transfer.sh - Easy and fast file sharing from the command-line.</title>
<meta name="description" content="Easy and fast file sharing from the command-line.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" href="styles/main.css">

<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:100,200,300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
<!-- build:js scripts/vendor/modernizr.js -->
<script src="bower_components/modernizr/modernizr.js"></script>
<!-- endbuild -->
</head>
include "includes/head.html"


<body>

@@ -41,24 +27,14 @@
ga('send', 'pageview');
</script>

<div id="navigation">
<div class="wrapper">
<h1>transfer.sh</h1>
<ul class="hidden-xs">
<li><a href="#samples">sample use cases</a>
</li>
<li><a href="#contact">contact us</a>
</li>
</ul>
</div>
</div>
include "includes/navigation.html"

<section id="home">
<div class="wrapper">
<h2>
<h2 class="page-title">
Easy file sharing from the command line</h2>
<div class="row animated fadeInDown">
<div id="from-terminal" class=" box col-md-8 col-md-offset-2 col-xs-12">
<div id="from-terminal" class="box col-md-8 col-md-offset-2 col-xs-12">
<div class="terminal-top">

</div>
@@ -77,7 +53,8 @@
<code>
<br>
<span class="code-title"># Upload from web</span>
<br>Drag your files here, or <a class="browse" href="#"> click to browse.</a>
<br>Drag your files here, or <a class="browse" href="#"> click to browse. <br/></a>
</code>
<input type="file" multiple="multiple" style='display: none;' />
<ul class='queue'>
@@ -141,7 +118,7 @@

<section id="samples">
<div class="wrapper">
<h2>
<h2 class="page-title">
Sample use cases
</h2>
<div class="row">
@@ -168,9 +145,10 @@
<div class="terminal">
<code>
<span class="code-title"># Add this to .bashrc or its equivalent</span>
<br/>transfer() {
<br># write to output to tmpfile because of progress bar
<br>tmpfile=$( mktemp -t transferXXX ); curl --progress-bar --upload-file $1 https://transfer.sh/$(basename $1) >> $tmpfile; cat $tmpfile; rm -f $tmpfile; }
<br/>transfer() {
<br># write to output to tmpfile because of progress bar
<br>tmpfile=$( mktemp -t transferXXX ); basefile=$(basename "$1" | sed -e 's/[^a-zA-Z0-9]/-/g'); curl --progress-bar --upload-file "$1" "https://transfer.sh/$basefile" >> $tmpfile; cat $tmpfile; rm -f $tmpfile;
<br/>}
<br/>
<br/>alias transfer=transfer
<br/>
@@ -231,7 +209,8 @@
<span class="code-title"># Scan for malware or viruses using Clamav</span>
<br>$ wget http://www.eicar.org/download/eicar.com
<br>$ curl -X PUT --upload-file ./eicar.com https://transfer.sh/eicar.com/scan
<br><br>
<br>
<br>
<span class="code-title"># Upload malware to VirusTotal, get a permalink in return</span>
<br>$ curl -X PUT --upload-file nhgbhhj https://transfer.sh/test.txt/virustotal
<br>
@@ -245,7 +224,7 @@
<div class="terminal">
<code>
<span class="code-title"># Backup, encrypt and transfer</span>
<br/>$ mysqldump --all-databases|gzip|gpg -ac -o-|curl -X PUT --upload-file "-" https://transfer.sh/test.txt </code>
<br/>$ mysqldump --all-databases|gzip|gpg -ac -o-|curl -X PUT --upload-file "-" https://transfer.sh/test.txt</code>
</div>
</div>
</div>
@@ -276,28 +255,45 @@
</div>
</section>

<section id="share">
<div class="wrapper">
<h2 class="page-title">Follow on GitHub</h2>
<br>
<br>

<iframe src="//ghbtns.com/github-btn.html?user=dutchcoders&repo=transfer.sh&type=follow&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="250" height="50"></iframe>
<iframe src="//ghbtns.com/github-btn.html?user=dutchcoders&repo=transfer.sh&type=watch&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="200" height="50"></iframe>
</div>
</section>

<section id="reviews">
<div class="wrapper">
<div class="row">
<div class="col-md-8 col-md-offset-2 col-xs-12">
<blockquote class="twitter-tweet tweet-xl" lang="en">
<img class="twitter-profile" src="images/reviews/dave.jpg" alt="">
<a href="https://twitter.com/FloifyDave/status/517383101425516544">
<img class="twitter-profile" src="images/reviews/dave.jpg" alt="">
</a>
<p><a href="https://twitter.com/dutchcoders">@dutchcoders</a> Thanks for transfer.sh. Just used it for a production purpose for a customer. So great, so easy, so https. :)</p>
<a href="https://twitter.com/FloifyDave/status/517383101425516544">
&mdash; Dave Sims (@FloifyDave)</a>
&mdash; Dave Sims (@FloifyDave)</a>
</blockquote>
</div>
</div>
<div class="row">
<div class="col-md-6 col-xs-12">
<blockquote class="twitter-tweet" lang="en">
<img class="twitter-profile" src="images/reviews/kareem.jpg" alt="">
<a href="https://twitter.com/kareemk/status/517029789191118849">
<img class="twitter-profile" src="images/reviews/kareem.jpg" alt="">
</a>
<p><a href="https://twitter.com/dutchcoders">@dutchcoders</a> love transfer.sh! any change we can *pay* for a self-hosted version?</p><a href="https://twitter.com/kareemk/status/517029789191118849">&mdash; Kareem Kouddous (@kareemk) </a>
</blockquote>
</div>
<div class="col-md-6 col-xs-12">
<blockquote class="twitter-tweet" lang="en">
<img class="twitter-profile" src="images/reviews/pg.jpeg" alt="">
<a href="https://twitter.com/drakpz/status/517008058841829376">
<img class="twitter-profile" src="images/reviews/pg.jpeg" alt="">
</a>
<p><a href="http://t.co/JomAmqWYEB">http://t.co/JomAmqWYEB</a> by <a href="https://twitter.com/dutchcoders">@dutchcoders</a> is pure awesomeness! any chance of source on github? :-)</p><a href="https://twitter.com/drakpz/status/517008058841829376">&mdash; PJ Spagnolatti (@drakpz)</a>
</blockquote>
</div>
@@ -305,14 +301,18 @@
<div class="row">
<div class="col-md-6 col-xs-12">
<blockquote class="twitter-tweet" lang="en">
<img class="twitter-profile" src="images/reviews/jacob.jpg" alt="">
<a href="https://twitter.com/jacoblindgren11/status/516975006501203968">
<img class="twitter-profile" src="images/reviews/jacob.jpg" alt="">
</a>
<p>Love transfer.sh! Will be using it from now on! Thanks for the amazing service we can use from the CLI <a href="https://twitter.com/dutchcoders">@dutchcoders</a>
</p><a href="https://twitter.com/jacoblindgren11/status/516975006501203968">&mdash; Jacob Lindgren (@jacoblindgren11) </a>
</blockquote>
</div>
<div class="col-md-6 col-xs-12">
<blockquote class="twitter-tweet" lang="en">
<img class="twitter-profile" src="images/reviews/lars.jpg" alt="">
<a href="https://twitter.com/arvestad/status/519507976491499521">
<img class="twitter-profile" src="images/reviews/lars.jpg" alt="">
</a>
<p>transfer.sh is my latest fav service! Try simple command-line and web file sharing! <a href="https://t.co/FSrsb1JKJd">https://t.co/FSrsb1JKJd</a>&#10;Thanks <a href="https://twitter.com/dutchcoders">@dutchcoders</a> !</p> <a href="https://twitter.com/arvestad/status/519507976491499521">&mdash; Lars Arvestad (@arvestad)</a>
</blockquote>
</div>
@@ -322,7 +322,7 @@

<section id="share">
<div class="wrapper">
<h2>Share the love</h2>
<h2 class="page-title">Share the love</h2>
<ul class="share-buttons">
<li>
<a href="https://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Ftransfer.sh&t=" target="_blank" onclick="window.open('https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(document.URL) + '&t=' + encodeURIComponent(document.URL)); return false;"> <i class="icon-facebook"></i>
@@ -343,71 +343,33 @@
</div>
</section>


<section id="contact">
<div class="wrapper">
<i class="icon-mail"></i>
<h2>
<h2 class="page-title">
Any questions?
</h2>
<a href="#" data-uv-trigger class="btn-cta">contact us</a>
</div>
</section>

<footer>

<section id="tor">
<div class="wrapper">
<img src="images/Logo-orange.png" alt="Founded in Holland">
<p>Made with <i class="icon-heart"></i> by <a href="http://dutchcoders.io/" title="Dutch Coders">Dutch Coders</a>
</p>
<a href="https://torproject.com"><img src="images/tor.svg" alt=""></a><br/>
<a href="https://jxm5d6emw5rknovg.onion/">https://jxm5d6emw5rknovg.onion/</a>
</div>
</footer>
</section>

<a href="https://github.com/dutchcoders/transfer.sh/">
<img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png">
</a>

<script>
(function() {
var uv = document.createElement('script');
uv.type = 'text/javascript';
uv.async = true;
uv.src = '//widget.uservoice.com/5rkATbLIm8ClJQeOirOhFg.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(uv, s)
})()
</script>
include "includes/footer.html"

include "includes/js.html"

<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->

<script>
(function(b, o, i, l, e, r) {
b.GoogleAnalyticsObject = l;
b[l] || (b[l] =
function() {
(b[l].q = b[l].q || []).push(arguments)
});
b[l].l = +new Date;
e = o.createElement(i);
r = o.getElementsByTagName(i)[0];
e.src = '//www.google-analytics.com/analytics.js';
r.parentNode.insertBefore(e, r)
}(window, document, 'script', 'ga'));
ga('create', 'UA-40833733-1', 'transfer.sh');
ga('send', 'pageview');
</script>

<!-- build:js scripts/main.js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/highlightjs/highlight.pack.js"></script>
<!-- </*script*/ src="bower_components/typed.js/js/typed.js"></script> -->
<script src="bower_components/uri.js/src/URI.min.js"></script>
<script src="bower_components/bootstrap/js/transition.js"></script>
<script src="bower_components/bootstrap/js/collapse.js"></script>

<script src="scripts/typewriter-bundle.js"></script>
<script src="scripts/main.js"></script>
<!-- endbuild -->

</body>



+ 61
- 0
transfersh-web/scripts/clipboard.js View File

@@ -0,0 +1,61 @@
(function() {
var copylinkbtn = document.getElementById("copy-link-btn"),
copylink = document.getElementById("copy-link-wrapper"),
overlay = document.getElementById("overlay");

var url = "http://url"
copylinkbtn.addEventListener("click", function(e) {
e.preventDefault();
var error = document.getElementsByClassName('error');
while (error[0]) {
error[0].parentNode.removeChild(error[0]);
}

document.body.className += ' active';
copylink.children[1].value = url;
copylink.children[1].focus();
copylink.children[1].select();
return (false);
}, false);

overlay.addEventListener("click", function(e) {
e.preventDefault();
document.body.className = '';
return (false);
}, false);

copylink.children[2].addEventListener("keydown", function(e) {

var error = document.getElementsByClassName('error');

while (error[0]) {
error[0].parentNode.removeChild(error[0]);
}

setTimeout(function() {

if((e.metaKey || e.ctrlKey) && e.keyCode === 67 && isTextSelected(copylink.children[2])) {
document.body.className = '';
} else if((e.metaKey || e.ctrlKey) && e.keyCode === 67 && isTextSelected(copylink.children[2]) === false) {
var error = document.createElement('span');
error.className = 'error';
var errortext = document.createTextNode('The link was not copied, make sure the entire text is selected.');
error.appendChild(errortext);
copylink.appendChild(error);
}
}, 100);

function isTextSelected(input) {
if (typeof input.selectionStart == "number") {
return input.selectionStart == 0 && input.selectionEnd == input.value.length;
} else if (typeof document.selection != "undefined") {
input.focus();
return document.selection.createRange().text == input.value;
}
}
}, false);
})();

+ 86
- 8
transfersh-web/scripts/main.js View File

@@ -18,10 +18,18 @@ $(document).ready(function() {

(function() {
var files = Array()
var queue = Array()

function upload(file) {
$(window).bind('beforeunload', function(){
if (queue.length==0)
return;

return 'There are still ' + queue.length + ' files being uploaded.';
});

function upload(file) {
$('.browse').addClass('uploading');

var li = $('<li style="clear:both;"/>');

li.append($('<div><div class="upload-progress"><span></span><div class="bar" style="width:0%;">####################################################</div></div><p>Uploading... ' + file.name + '</p></div>'));
@@ -33,7 +41,8 @@ $(document).ready(function() {
var pc = parseInt((e.loaded / e.total * 100));
$('.upload-progress', $(li)).show();
$('.upload-progress .bar', $(li)).css('width', pc + "%");
$('.upload-progress span ').empty().append(pc + "%");
$('.upload-progress span ', $(li)).empty().append(pc + "%");

}, false);

xhr.onreadystatechange = function(e) {
@@ -47,8 +56,13 @@ $(document).ready(function() {
$(li).html('<span>Error (' + xhr.status + ') during upload of file ' + file.name + '</span>');
}

files.push(xhr.responseText.replace("https://transfer.sh/", "").replace("\n", ""));
// files.push(URI(xhr.responseText).absoluteTo(location.href).toString());
// file uploaded successfully, remove from queue
var index = queue.indexOf(xhr);
if (index > -1) {
queue.splice(index, 1);
}

files.push(URI(xhr.responseText.replace("\n", "")).path());

$(".download-zip").attr("href", URI("(" + files.join(",") + ").zip").absoluteTo(location.href).toString());
$(".download-tar").attr("href", URI("(" + files.join(",") + ").tar.gz").absoluteTo(location.href).toString());
@@ -56,7 +70,9 @@ $(document).ready(function() {
$(".all-files").addClass('show');
}
};

// should queue all uploads.
queue.push(xhr);

// start upload
xhr.open("PUT", '/' + file.name, true);
@@ -73,13 +89,12 @@ $(document).ready(function() {
$('#web').addClass('dragged');
}).bind("dragleave", function(event) {
$('#terminal').removeClass('dragged');
$('#web').removeClass('dragged');
$('#web').removeClass('dragged');

}).bind("drop dragdrop", function(event) {
var files = event.originalEvent.target.files || event.originalEvent.dataTransfer.files;

$.each(files, function(index, file) {
console.debug(file);
upload(file);
});

@@ -93,12 +108,75 @@ $(document).ready(function() {
});



$('input[type=file]').on('change', function(event) {
$.each(this.files, function(index, file) {
if (file instanceof Blob) {
upload(file);
}
});
});
});

// clipboard
if (window.location.href.indexOf("download") > -1 ) {


(function() {
var copylinkbtn = document.getElementById("copy-link-btn"),
copylink = document.getElementById("copy-link-wrapper"),
overlay = document.getElementById("overlay");

var url = "http://url"
copylinkbtn.addEventListener("click", function() {

var error = document.getElementsByClassName('error');

while (error[0]) {
error[0].parentNode.removeChild(error[0]);
}

document.body.className += ' active';

copylink.children[1].value = url;
copylink.children[1].focus();
copylink.children[1].select();
}, false);

overlay.addEventListener("click", function() {
document.body.className = '';
}, false);

copylink.children[1].addEventListener("keydown", function(e) {

var error = document.getElementsByClassName('error');

while (error[0]) {
error[0].parentNode.removeChild(error[0]);
}

setTimeout(function() {

if ((e.metaKey || e.ctrlKey) && e.keyCode === 67 && isTextSelected(copylink.children[2])) {
document.body.className = '';
} else if ((e.metaKey || e.ctrlKey) && e.keyCode === 67 && isTextSelected(copylink.children[2]) === false) {
var error = document.createElement('span');
error.className = 'error';
var errortext = document.createTextNode('The link was not copied, make sure the entire text is selected.');

error.appendChild(errortext);
copylink.appendChild(error);
}
}, 100);

function isTextSelected(input) {
if (typeof input.selectionStart == "number") {
return input.selectionStart == 0 && input.selectionEnd == input.value.length;
} else if (typeof document.selection != "undefined") {
input.focus();
return document.selection.createRange().text == input.value;
}
}
}, false);
})();
};

})();

+ 1296
- 0
transfersh-web/scripts/showdown.js
File diff suppressed because it is too large
View File


+ 0
- 1
transfersh-web/scripts/typewriter-bundle.min.js
File diff suppressed because it is too large
View File


+ 3
- 3
transfersh-web/styles/bootstrap.less View File

@@ -9,10 +9,10 @@
// Core CSS
@import "../bower_components/bootstrap/less/scaffolding.less";
@import "../bower_components/bootstrap/less/type.less";
/* @import "../bower_components/bootstrap/less/code.less"; */
// @import "../bower_components/bootstrap/less/code.less";
@import "../bower_components/bootstrap/less/grid.less";
//@import "../bower_components/bootstrap/less/tables.less";
//@import "../bower_components/bootstrap/less/forms.less";
@import "../bower_components/bootstrap/less/tables.less";
@import "../bower_components/bootstrap/less/forms.less";
//@import "../bower_components/bootstrap/less/buttons.less";

// Components


+ 8
- 6
transfersh-web/styles/includes/global.less View File

@@ -1,4 +1,9 @@

body {
max-width: 2000px;
margin: 0 auto;
}

.browsehappy {
margin: 0.2em 0;
background: orange;
@@ -10,8 +15,8 @@
margin-top: 30px;
ul {
list-style: none;
max-width: 300px;
margin: 0 auto;
max-width: 400px;
marghomein: 0 auto;
}
li {
display: inline-block;
@@ -41,8 +46,7 @@
}



h2 {
.page-title {
text-align: center;
font-size: 35px;
@media (min-width: @screen-sm-min) {
@@ -90,8 +94,6 @@ a {
}
}



::selection {
background: @red;
}


+ 9
- 3
transfersh-web/styles/includes/home.less View File

@@ -1,14 +1,14 @@
#home {
text-align: center;
h2 {
.page-title {
font-size: 30px;
}
@media (min-width: @screen-sm-min) {
padding: 50px;
h2 {
.page-title {
font-size: 45px;
margin-top: -20px;
margin-bottom: 45px;
margin-bottom: 20px;
}
}
.btn-home {
@@ -68,7 +68,12 @@
}

.terminal {
a {
color: #fff
}

.border-top-radius (0);

.border-bottom-radius (5px);
background: @dark-blue;
// background: url(../images/terminal.svg);
@@ -93,6 +98,7 @@
span {
float: right;
}
padding-top: 4px;
}

.all-files {


+ 21
- 1
transfersh-web/styles/includes/pages.less View File

@@ -21,7 +21,7 @@
h4 {
margin-top: 30px;
}
padding: 50px 0;
padding: 75px 0;
text-align: center;
.btn-cta {
margin: 30px 0;
@@ -61,6 +61,26 @@
}
}

#github {
text-align: center;
padding: 50px 0;

}

#tor {
text-align: center;
img {
max-width: 100px;
margin: 0 auto;
margin-bottom: 10px;
}
background: @light-gray;
padding: 50px 0;
a {
font-size: 20px;
}
}


footer {
text-align: center;


+ 200
- 0
transfersh-web/styles/includes/preview.less View File

@@ -0,0 +1,200 @@
.preview-wrapper {
padding-bottom: 30px;
}

html {
min-height:100%;
}
#download {
position: static;
footer {
bottom: 0;
left: 0;
width: 100%;
position: absolute;
z-index: -1;
}
}

.preview-image {
img {
margin: 0 auto;
display:block;
max-width: 800px;
max-width: 100%;
}
padding: 0;
padding: 0px;
}

.overlay {
position: fixed;
z-index: 100;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0,0,0,0.10);
visibility: hidden;
opacity: 0;
transition: opacity 0.2s ease;
.active & {
visibility: visible;
opacity: 1;
}
}

.copy-link-wrapper {
z-index: 200;
padding: 2em;
position: fixed;
top: 50%;
left: 50%;
width: 50%;
max-width: 500px;
min-width: 300px;
background-color: @blue;
border-radius: 2px;
transform: translateX(-50%) translateY(-50%);
opacity: 0;
transition: opacity 0.2s ease;
clip:rect(1px 1px 1px 1px);
opacity: 0;
top: -9999999px;
left: -9999999px;
.active & {
clip: auto;
opacity: 1;
top: 50%;
left: 50%;
}
p {
font-size: 20px;
color: #fff;
}
input {
background-color: @light-gray;
color: @text-color;
border: 0;
font-size: 1em;
padding: 1em;
margin: 0;
width: 100%;
border-radius: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.error {
text-align: center;
color: #E7483B;
display: block;
padding: 0.5em;
}
}

#md-preview,{
padding-bottom: 30px;
}


video {
margin: 0 auto;
width: 100%;
}


.wrap {
width: 40%;
height: 40%;
margin: 20px auto;
}

video {
width: 100%;
}

video::-webkit-media-controls-enclosure {
padding: 0px;
height: 50px;
}

video::-webkit-media-controls-panel {
opacity: 1 !important;
display: -webkit-flex !important;
margin-top: 50px;
height: 50px;
background-color: @dark-blue;
border-radius: 0 0 10px 10px;
}

video::-webkit-media-controls-timeline {
height: 12px;
padding: 0px;
border: 0px;
}

video::-webkit-media-controls-volume-slider, video::-webkit-media-controls-timeline {
height: 12px;
border-radius: 5px;
min-width: 15px;
}

video::-webkit-media-controls-volume-slider::-webkit-media-slider-container, video::-webkit-media-controls-timeline::-webkit-media-slider-container {
border: 0px;
border-radius: 5px;
background-color: @blue;
cursor: pointer;
}

::-webkit-media-slider-thumb {
-webkit-appearance: none;
background: red;
}

video::-webkit-media-controls-play-button {
cursor: pointer;

}

video::-webkit-media-controls-play-button:hover {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
opacity: 0.7;
}

video::-webkit-media-controls-fullscreen-button {
-webkit-appearance: none;
background-color: transparent;
cursor: pointer;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAABACAYAAADF2C3zAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2N0Q1MjA3MDc5NjYxMUUyQjQzRjk5Mjc1MTU5Qjk0NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2N0Q1MjA3MTc5NjYxMUUyQjQzRjk5Mjc1MTU5Qjk0NSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQyQkE2QUZGNzkzQjExRTJCNDNGOTkyNzUxNTlCOTQ1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQyQkE2QjAwNzkzQjExRTJCNDNGOTkyNzUxNTlCOTQ1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+1z7uaAAAAVhJREFUeNrsljFuAjEQRb3ACZByii2pECmgySFIGoiUGsEKiaQAimwTToCggSYSNUoJHSfgFJwhMt9oHBlj8Ga2SAqP9KQV7PPY4y1+9PDYEZ4agaHrj4Lwl5LHXFkvsOXKatt1jjykzrq2WeW+Jb6Bhp5BySOvQQLuaKEPYwYnOQLSkpTwBfbUqQam9hDVtieOyaoOGxDTAtNrV9UFqTEc/UGUQeXWmfSZB6BqXMc3aIFlFllY4hP49N2h66p2YJXly3HJ92ABihxZVRPM6BqvViSlFNwqiBwV5CAHOchBDnKQ/5/si4/iOUn5YX0+ec0X1mkBXljH1nlhncTfh3WIF2EdR/gJ677OKqwfdOqHmJ4Nsd17PwU5E/yWgJieY/Biv6MoUVjvOe61j+cGuuwpsLvDOl5KjeFkDusRtiSNKZ6FdXTlhXWIfxTWcf58YR0L3AzrRwEGAJoOgCMfh6hiAAAAAElFTkSuQmCC);
background-size: 16px 64px;
background-position: center 8px;
background-repeat: no-repeat;
}

video::-webkit-media-controls-mute-button {
-webkit-appearance: none;
background-color: transparent;
cursor: pointer;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAABACAYAAAATffeWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2N0Q1MjA3NDc5NjYxMUUyQjQzRjk5Mjc1MTU5Qjk0NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2N0Q1MjA3NTc5NjYxMUUyQjQzRjk5Mjc1MTU5Qjk0NSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjY3RDUyMDcyNzk2NjExRTJCNDNGOTkyNzUxNTlCOTQ1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjY3RDUyMDczNzk2NjExRTJCNDNGOTkyNzUxNTlCOTQ1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Gp0GRAAAATdJREFUeNpidIsuYMABwoF4BhCvB+IkXIqYcIj7APEiIBYA4jg0OREgLsJnQAgQrwJiNiifGU3eFIi7gDgPxGEBYnYg1gBiDqizQX5ixOEyCyDeC8SNQNwJxJtABuwHYksGwoAR6q3tQFwKxGlAnMtEpGYQ+A+1NROI+aDedGdiIA2sAWJWaDhcBGIVUg1ABqz4ohEXAMXQbyA+DcRaQHwHZMBxIjWDArEcmrg+AXEYEO8ExYIjUjRGQuOXEUcgghLVOahBoAQ1GWTAT2iAgMBJID4BxPOhBqIDkJwnENcDcQkQP8AWBiuAOBiIf0H5f9HkT0NdMAFfIG4D4gggfgtNPMjgDRD3wgPm////DJSAUQNGDRg1YNSAUQNGDRg1YNSA4WhAUnHraI9ltMcy2mMZDD0WgAADADYlybDQKXdAAAAAAElFTkSuQmCC);
background-size: 16px 64px;
background-position: center 8px;
background-repeat: no-repeat;
}

video::-webkit-media-controls-fullscreen-button:hover {
-webkit-appearance: none;
background-position: center -42px;
}

video::-webkit-media-controls-mute-button:hover {
-webkit-appearance: none;
background-position: center -43px;
}

video::-webkit-media-controls-current-time-display, video::-webkit-media-controls-time-remaining-display {

font-size: 13px;
font-weight: normal;
}

+ 16
- 14
transfersh-web/styles/includes/reviews.less View File

@@ -23,7 +23,7 @@ blockquote.twitter-tweet {
margin: 0 auto;
}
@media (max-width: @screen-xs) {
.twitter-profile {
.twitter-profile {
display:none!important;
}
}
@@ -43,17 +43,19 @@ blockquote.twitter-tweet a {
outline: 0 none;
}
blockquote.twitter-tweet a:hover,
blockquote.twitter-tweet a:focus {
text-decoration: underline;
blockquote.tweet-xl {
p {
font-size: 22px;
line-height: 25px;
}
a {
font-size: 22px;
}
@media (max-width: @screen-xs) {
p {
font-size: 17px;}
a {
font-size: 17px;
}
}
}
blockquote.tweet-xl {
p {
font-size: 22px;
line-height: 25px;
}
a {
font-size: 22px;
}
}

+ 750
- 13
transfersh-web/styles/main.css View File

@@ -622,7 +622,6 @@ address {
font-style: normal;
line-height: 1.42857143;
}
/* @import "../bower_components/bootstrap/less/code.less"; */
.container {
margin-right: auto;
margin-left: auto;
@@ -1316,6 +1315,538 @@ address {
margin-left: 0%;
}
}
table {
max-width: 100%;
background-color: transparent;
}
th {
text-align: left;
}
.table {
width: 100%;
margin-bottom: 20px;
}
.table > thead > tr > th,
.table > tbody > tr > th,
.table > tfoot > tr > th,
.table > thead > tr > td,
.table > tbody > tr > td,
.table > tfoot > tr > td {
padding: 8px;
line-height: 1.42857143;
vertical-align: top;
border-top: 1px solid #dddddd;
}
.table > thead > tr > th {
vertical-align: bottom;
border-bottom: 2px solid #dddddd;
}
.table > caption + thead > tr:first-child > th,
.table > colgroup + thead > tr:first-child > th,
.table > thead:first-child > tr:first-child > th,
.table > caption + thead > tr:first-child > td,
.table > colgroup + thead > tr:first-child > td,
.table > thead:first-child > tr:first-child > td {
border-top: 0;
}
.table > tbody + tbody {
border-top: 2px solid #dddddd;
}
.table .table {
background-color: #ffffff;
}
.table-condensed > thead > tr > th,
.table-condensed > tbody > tr > th,
.table-condensed > tfoot > tr > th,
.table-condensed > thead > tr > td,
.table-condensed > tbody > tr > td,
.table-condensed > tfoot > tr > td {
padding: 5px;
}
.table-bordered {
border: 1px solid #dddddd;
}
.table-bordered > thead > tr > th,
.table-bordered > tbody > tr > th,
.table-bordered > tfoot > tr > th,
.table-bordered > thead > tr > td,
.table-bordered > tbody > tr > td,
.table-bordered > tfoot > tr > td {
border: 1px solid #dddddd;
}
.table-bordered > thead > tr > th,
.table-bordered > thead > tr > td {
border-bottom-width: 2px;
}
.table-striped > tbody > tr:nth-child(odd) > td,
.table-striped > tbody > tr:nth-child(odd) > th {
background-color: #f9f9f9;
}
.table-hover > tbody > tr:hover > td,
.table-hover > tbody > tr:hover > th {
background-color: #f5f5f5;
}
table col[class*="col-"] {
position: static;
float: none;
display: table-column;
}
table td[class*="col-"],
table th[class*="col-"] {
float: none;
display: table-cell;
}
.table > thead > tr > .active,
.table > tbody > tr > .active,
.table > tfoot > tr > .active,
.table > thead > .active > td,
.table > tbody > .active > td,
.table > tfoot > .active > td,
.table > thead > .active > th,
.table > tbody > .active > th,
.table > tfoot > .active > th {
background-color: #f5f5f5;
}
.table-hover > tbody > tr > .active:hover,
.table-hover > tbody > .active:hover > td,
.table-hover > tbody > .active:hover > th {
background-color: #e8e8e8;
}
.table > thead > tr > .success,
.table > tbody > tr > .success,
.table > tfoot > tr > .success,
.table > thead > .success > td,
.table > tbody > .success > td,
.table > tfoot > .success > td,
.table > thead > .success > th,
.table > tbody > .success > th,
.table > tfoot > .success > th {
background-color: #dff0d8;
}
.table-hover > tbody > tr > .success:hover,
.table-hover > tbody > .success:hover > td,
.table-hover > tbody > .success:hover > th {
background-color: #d0e9c6;
}
.table > thead > tr > .danger,
.table > tbody > tr > .danger,
.table > tfoot > tr > .danger,
.table > thead > .danger > td,
.table > tbody > .danger > td,
.table > tfoot > .danger > td,
.table > thead > .danger > th,
.table > tbody > .danger > th,
.table > tfoot > .danger > th {
background-color: #f2dede;
}
.table-hover > tbody > tr > .danger:hover,
.table-hover > tbody > .danger:hover > td,
.table-hover > tbody > .danger:hover > th {
background-color: #ebcccc;
}
.table > thead > tr > .warning,
.table > tbody > tr > .warning,
.table > tfoot > tr > .warning,
.table > thead > .warning > td,
.table > tbody > .warning > td,
.table > tfoot > .warning > td,
.table > thead > .warning > th,
.table > tbody > .warning > th,
.table > tfoot > .warning > th {
background-color: #fcf8e3;
}
.table-hover > tbody > tr > .warning:hover,
.table-hover > tbody > .warning:hover > td,
.table-hover > tbody > .warning:hover > th {
background-color: #faf2cc;
}
@media (max-width: 767px) {
.table-responsive {
width: 100%;
margin-bottom: 15px;
overflow-y: hidden;
overflow-x: scroll;
-ms-overflow-style: -ms-autohiding-scrollbar;
border: 1px solid #dddddd;
-webkit-overflow-scrolling: touch;
}
.table-responsive > .table {
margin-bottom: 0;
}
.table-responsive > .table > thead > tr > th,
.table-responsive > .table > tbody > tr > th,
.table-responsive > .table > tfoot > tr > th,
.table-responsive > .table > thead > tr > td,
.table-responsive > .table > tbody > tr > td,
.table-responsive > .table > tfoot > tr > td {
white-space: nowrap;
}
.table-responsive > .table-bordered {
border: 0;
}
.table-responsive > .table-bordered > thead > tr > th:first-child,
.table-responsive > .table-bordered > tbody > tr > th:first-child,
.table-responsive > .table-bordered > tfoot > tr > th:first-child,
.table-responsive > .table-bordered > thead > tr > td:first-child,
.table-responsive > .table-bordered > tbody > tr > td:first-child,
.table-responsive > .table-bordered > tfoot > tr > td:first-child {
border-left: 0;
}
.table-responsive > .table-bordered > thead > tr > th:last-child,
.table-responsive > .table-bordered > tbody > tr > th:last-child,
.table-responsive > .table-bordered > tfoot > tr > th:last-child,
.table-responsive > .table-bordered > thead > tr > td:last-child,
.table-responsive > .table-bordered > tbody > tr > td:last-child,
.table-responsive > .table-bordered > tfoot > tr > td:last-child {
border-right: 0;
}
.table-responsive > .table-bordered > tbody > tr:last-child > th,
.table-responsive > .table-bordered > tfoot > tr:last-child > th,
.table-responsive > .table-bordered > tbody > tr:last-child > td,
.table-responsive > .table-bordered > tfoot > tr:last-child > td {
border-bottom: 0;
}
}
fieldset {
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
padding: 0;
margin-bottom: 20px;
font-size: 21px;
line-height: inherit;
color: #333333;
border: 0;
border-bottom: 1px solid #e5e5e5;
}
label {
display: inline-block;
margin-bottom: 5px;
font-weight: bold;
}
input[type="search"] {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
input[type="radio"],
input[type="checkbox"] {
margin: 4px 0 0;
margin-top: 1px \9;
/* IE8-9 */
line-height: normal;
}
input[type="file"] {
display: block;
}
select[multiple],
select[size] {
height: auto;
}
select optgroup {
font-size: inherit;
font-style: inherit;
font-family: inherit;
}
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
outline: thin dotted;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
height: auto;
}
output {
display: block;
padding-top: 7px;
font-size: 14px;
line-height: 1.42857143;
color: #555555;
vertical-align: middle;
}
.form-control {
display: block;
width: 100%;
height: 34px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.42857143;
color: #555555;
vertical-align: middle;
background-color: #ffffff;
background-image: none;
border: 1px solid #cccccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
.form-control:focus {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
}
.form-control:-moz-placeholder {
color: #999999;
}
.form-control::-moz-placeholder {
color: #999999;
opacity: 1;
}
.form-control:-ms-input-placeholder {
color: #999999;
}
.form-control::-webkit-input-placeholder {
color: #999999;
}
.form-control[disabled],
.form-control[readonly],
fieldset[disabled] .form-control {
cursor: not-allowed;
background-color: #eeeeee;
}
textarea.form-control {
height: auto;
}
.form-group {
margin-bottom: 15px;
}
.radio,
.checkbox {
display: block;
min-height: 20px;
margin-top: 10px;
margin-bottom: 10px;
padding-left: 20px;
vertical-align: middle;
}
.radio label,
.checkbox label {
display: inline;
margin-bottom: 0;
font-weight: normal;
cursor: pointer;
}
.radio input[type="radio"],
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] {
float: left;
margin-left: -20px;
}
.radio + .radio,
.checkbox + .checkbox {
margin-top: -5px;
}
.radio-inline,
.checkbox-inline {
display: inline-block;
padding-left: 20px;
margin-bottom: 0;
vertical-align: middle;
font-weight: normal;
cursor: pointer;
}
.radio-inline + .radio-inline,
.checkbox-inline + .checkbox-inline {
margin-top: 0;
margin-left: 10px;
}
input[type="radio"][disabled],
input[type="checkbox"][disabled],
.radio[disabled],
.radio-inline[disabled],
.checkbox[disabled],
.checkbox-inline[disabled],
fieldset[disabled] input[type="radio"],
fieldset[disabled] input[type="checkbox"],
fieldset[disabled] .radio,
fieldset[disabled] .radio-inline,
fieldset[disabled] .checkbox,
fieldset[disabled] .checkbox-inline {
cursor: not-allowed;
}
.input-sm {
height: 30px;
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
select.input-sm {
height: 30px;
line-height: 30px;
}
textarea.input-sm {
height: auto;
}
.input-lg {
height: 46px;
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
select.input-lg {
height: 46px;
line-height: 46px;
}
textarea.input-lg {
height: auto;
}
.has-warning .help-block,
.has-warning .control-label,
.has-warning .radio,
.has-warning .checkbox,
.has-warning .radio-inline,
.has-warning .checkbox-inline {
color: #8a6d3b;
}
.has-warning .form-control {
border-color: #8a6d3b;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.has-warning .form-control:focus {
border-color: #66512c;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
}
.has-warning .input-group-addon {
color: #8a6d3b;
border-color: #8a6d3b;
background-color: #fcf8e3;
}
.has-error .help-block,
.has-error .control-label,
.has-error .radio,
.has-error .checkbox,
.has-error .radio-inline,
.has-error .checkbox-inline {
color: #a94442;
}
.has-error .form-control {
border-color: #a94442;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.has-error .form-control:focus {
border-color: #843534;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
}
.has-error .input-group-addon {
color: #a94442;
border-color: #a94442;
background-color: #f2dede;
}
.has-success .help-block,
.has-success .control-label,
.has-success .radio,
.has-success .checkbox,
.has-success .radio-inline,
.has-success .checkbox-inline {
color: #3c763d;
}
.has-success .form-control {
border-color: #3c763d;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.has-success .form-control:focus {
border-color: #2b542c;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
}
.has-success .input-group-addon {
color: #3c763d;
border-color: #3c763d;
background-color: #dff0d8;
}
.form-control-static {
margin-bottom: 0;
}
.help-block {
display: block;
margin-top: 5px;
margin-bottom: 10px;
color: #7b7b7b;
}
@media (min-width: 768px) {
.form-inline .form-group {
display: inline-block;
margin-bottom: 0;
vertical-align: middle;
}
.form-inline .form-control {
display: inline-block;
}
.form-inline select.form-control {
width: auto;
}
.form-inline .radio,
.form-inline .checkbox {
display: inline-block;
margin-top: 0;
margin-bottom: 0;
padding-left: 0;
}
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
float: none;
margin-left: 0;
}
}
.form-horizontal .control-label,
.form-horizontal .radio,
.form-horizontal .checkbox,
.form-horizontal .radio-inline,
.form-horizontal .checkbox-inline {
margin-top: 0;
margin-bottom: 0;
padding-top: 7px;
}
.form-horizontal .radio,
.form-horizontal .checkbox {
min-height: 27px;
}
.form-horizontal .form-group {
margin-left: -35px;
margin-right: -35px;
}
.form-horizontal .form-group:before,
.form-horizontal .form-group:after {
content: " ";
display: table;
}
.form-horizontal .form-group:after {
clear: both;
}
.form-horizontal .form-group:before,
.form-horizontal .form-group:after {
content: " ";
display: table;
}
.form-horizontal .form-group:after {
clear: both;
}
.form-horizontal .form-control-static {
padding-top: 7px;
}
@media (min-width: 768px) {
.form-horizontal .control-label {
text-align: right;
}
}
.fade {
opacity: 0;
-webkit-transition: opacity 0.15s linear;
@@ -5358,6 +5889,10 @@ body {
-o-animation-duration: 0.75s;
animation-duration: 0.75s;
}
body {
max-width: 2000px;
margin: 0 auto;
}
.browsehappy {
margin: 0.2em 0;
background: orange;
@@ -5369,8 +5904,8 @@ body {
}
#navigation ul {
list-style: none;
max-width: 300px;
margin: 0 auto;
max-width: 400px;
marghomein: 0 auto;
}
#navigation li {
display: inline-block;
@@ -5397,12 +5932,12 @@ body {
font-size: 15px;
color: #3b3b3b;
}
h2 {
.page-title {
text-align: center;
font-size: 35px;
}
@media (min-width: 768px) {
h2 {
.page-title {
font-size: 50px;
}
}
@@ -5482,17 +6017,17 @@ a:hover {
#home {
text-align: center;
}
#home h2 {
#home .page-title {
font-size: 30px;
}
@media (min-width: 768px) {
#home {
padding: 50px;
}
#home h2 {
#home .page-title {
font-size: 45px;
margin-top: -20px;
margin-bottom: 45px;
margin-bottom: 20px;
}
}
#home .btn-home {
@@ -5561,6 +6096,9 @@ a:hover {
backbground-repeat: no-repeat;
background-size: cover;
}
.terminal a {
color: #ffffff;
}
.terminal-top {
border-top-right-radius: 5px;
border-top-left-radius: 5px;
@@ -5571,6 +6109,7 @@ a:hover {
}
.upload-progress {
max-width: 80%;
padding-top: 4px;
}
.upload-progress .bar {
word-wrap: normal;
@@ -5603,7 +6142,7 @@ a:hover {
font-size: 100px;
}
#samples {
padding: 50px 0;
padding: 75px 0;
text-align: center;
}
#samples h4 {
@@ -5643,6 +6182,23 @@ a:hover {
color: #fff;
text-decoration: none;
}
#github {
text-align: center;
padding: 50px 0;
}
#tor {
text-align: center;
background: #f6f8f8;
padding: 50px 0;
}
#tor img {
max-width: 100px;
margin: 0 auto;
margin-bottom: 10px;
}
#tor a {
font-size: 20px;
}
footer {
text-align: center;
background: #36535a;
@@ -5720,10 +6276,6 @@ blockquote.twitter-tweet a {
text-decoration: none;
outline: 0 none;
}
blockquote.twitter-tweet a:hover,
blockquote.twitter-tweet a:focus {
text-decoration: underline;
}
blockquote.tweet-xl p {
font-size: 22px;
line-height: 25px;
@@ -5731,6 +6283,14 @@ blockquote.tweet-xl p {
blockquote.tweet-xl a {
font-size: 22px;
}
@media (max-width: 480px) {
blockquote.tweet-xl p {
font-size: 17px;
}
blockquote.tweet-xl a {
font-size: 17px;
}
}
@font-face {
font-family: "transfersh";
src: url("../fonts/transfersh.eot");
@@ -5807,4 +6367,181 @@ blockquote.tweet-xl a {
.icon-gplus:before {
content: "p";
}
.preview-wrapper {
padding-bottom: 30px;
}
html {
min-height: 100%;
}
#download {
position: static;
}
#download footer {
bottom: 0;
left: 0;
width: 100%;
position: absolute;
z-index: -1;
}
.preview-image {
padding: 0;
padding: 0px;
}
.preview-image img {
margin: 0 auto;
display: block;
max-width: 800px;
max-width: 100%;
}
.overlay {
position: fixed;
z-index: 100;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.1);
visibility: hidden;
opacity: 0;
transition: opacity 0.2s ease;
}
.active .overlay {
visibility: visible;
opacity: 1;
}
.copy-link-wrapper {
z-index: 200;
padding: 2em;
position: fixed;
top: 50%;
left: 50%;
width: 50%;
max-width: 500px;
min-width: 300px;
background-color: #85b5bb;
border-radius: 2px;
transform: translateX(-50%) translateY(-50%);
transition: opacity 0.2s ease;
clip: rect(1px 1px 1px 1px);
opacity: 0;
top: -9999999px;
left: -9999999px;
}
.active .copy-link-wrapper {
clip: auto;
opacity: 1;
top: 50%;
left: 50%;
}
.copy-link-wrapper p {
font-size: 20px;
color: #fff;
}
.copy-link-wrapper input {
background-color: #f6f8f8;
color: #3b3b3b;
border: 0;
font-size: 1em;
padding: 1em;
margin: 0;
width: 100%;
border-radius: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.copy-link-wrapper .error {
text-align: center;
color: #E7483B;
display: block;
padding: 0.5em;
}
#md-preview {
padding-bottom: 30px;
}
video {
margin: 0 auto;
width: 100%;
}
.wrap {
width: 40%;
height: 40%;
margin: 20px auto;
}
video {
width: 100%;
}
video::-webkit-media-controls-enclosure {
padding: 0px;
height: 50px;
}
video::-webkit-media-controls-panel {
opacity: 1 !important;
display: -webkit-flex !important;
margin-top: 50px;
height: 50px;
background-color: #36535a;
border-radius: 0 0 10px 10px;
}
video::-webkit-media-controls-timeline {
height: 12px;
padding: 0px;
border: 0px;
}
video::-webkit-media-controls-volume-slider,
video::-webkit-media-controls-timeline {
height: 12px;
border-radius: 5px;
min-width: 15px;
}
video::-webkit-media-controls-volume-slider::-webkit-media-slider-container,
video::-webkit-media-controls-timeline::-webkit-media-slider-container {
border: 0px;
border-radius: 5px;
background-color: #85b5bb;
cursor: pointer;
}
::-webkit-media-slider-thumb {
-webkit-appearance: none;
background: red;
}
video::-webkit-media-controls-play-button {
cursor: pointer;
}
video::-webkit-media-controls-play-button:hover {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
opacity: 0.7;
}
video::-webkit-media-controls-fullscreen-button {
-webkit-appearance: none;
background-color: transparent;
cursor: pointer;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAABACAYAAADF2C3zAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2N0Q1MjA3MDc5NjYxMUUyQjQzRjk5Mjc1MTU5Qjk0NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2N0Q1MjA3MTc5NjYxMUUyQjQzRjk5Mjc1MTU5Qjk0NSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQyQkE2QUZGNzkzQjExRTJCNDNGOTkyNzUxNTlCOTQ1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQyQkE2QjAwNzkzQjExRTJCNDNGOTkyNzUxNTlCOTQ1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+1z7uaAAAAVhJREFUeNrsljFuAjEQRb3ACZByii2pECmgySFIGoiUGsEKiaQAimwTToCggSYSNUoJHSfgFJwhMt9oHBlj8Ga2SAqP9KQV7PPY4y1+9PDYEZ4agaHrj4Lwl5LHXFkvsOXKatt1jjykzrq2WeW+Jb6Bhp5BySOvQQLuaKEPYwYnOQLSkpTwBfbUqQam9hDVtieOyaoOGxDTAtNrV9UFqTEc/UGUQeXWmfSZB6BqXMc3aIFlFllY4hP49N2h66p2YJXly3HJ92ABihxZVRPM6BqvViSlFNwqiBwV5CAHOchBDnKQ/5/si4/iOUn5YX0+ec0X1mkBXljH1nlhncTfh3WIF2EdR/gJ677OKqwfdOqHmJ4Nsd17PwU5E/yWgJieY/Biv6MoUVjvOe61j+cGuuwpsLvDOl5KjeFkDusRtiSNKZ6FdXTlhXWIfxTWcf58YR0L3AzrRwEGAJoOgCMfh6hiAAAAAElFTkSuQmCC);
background-size: 16px 64px;
background-position: center 8px;
background-repeat: no-repeat;
}
video::-webkit-media-controls-mute-button {
-webkit-appearance: none;
background-color: transparent;
cursor: pointer;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAABACAYAAAATffeWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2N0Q1MjA3NDc5NjYxMUUyQjQzRjk5Mjc1MTU5Qjk0NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2N0Q1MjA3NTc5NjYxMUUyQjQzRjk5Mjc1MTU5Qjk0NSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjY3RDUyMDcyNzk2NjExRTJCNDNGOTkyNzUxNTlCOTQ1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjY3RDUyMDczNzk2NjExRTJCNDNGOTkyNzUxNTlCOTQ1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Gp0GRAAAATdJREFUeNpidIsuYMABwoF4BhCvB+IkXIqYcIj7APEiIBYA4jg0OREgLsJnQAgQrwJiNiifGU3eFIi7gDgPxGEBYnYg1gBiDqizQX5ixOEyCyDeC8SNQNwJxJtABuwHYksGwoAR6q3tQFwKxGlAnMtEpGYQ+A+1NROI+aDedGdiIA2sAWJWaDhcBGIVUg1ABqz4ohEXAMXQbyA+DcRaQHwHZMBxIjWDArEcmrg+AXEYEO8ExYIjUjRGQuOXEUcgghLVOahBoAQ1GWTAT2iAgMBJID4BxPOhBqIDkJwnENcDcQkQP8AWBiuAOBiIf0H5f9HkT0NdMAFfIG4D4gggfgtNPMjgDRD3wgPm////DJSAUQNGDRg1YNSAUQNGDRg1YNSA4WhAUnHraI9ltMcy2mMZDD0WgAADADYlybDQKXdAAAAAAElFTkSuQmCC);
background-size: 16px 64px;
background-position: center 8px;
background-repeat: no-repeat;
}
video::-webkit-media-controls-fullscreen-button:hover {
-webkit-appearance: none;
background-position: center -42px;
}
video::-webkit-media-controls-mute-button:hover {
-webkit-appearance: none;
background-position: center -43px;
}
video::-webkit-media-controls-current-time-display,
video::-webkit-media-controls-time-remaining-display {
font-size: 13px;
font-weight: normal;
}
/*# sourceMappingURL=/styles/main.css.map */

+ 1
- 1
transfersh-web/styles/main.css.map
File diff suppressed because it is too large
View File


+ 1
- 0
transfersh-web/styles/main.less View File

@@ -9,5 +9,6 @@
@import "includes/pages";
@import "includes/reviews";
@import "includes/transfersh-icons";
@import "includes/preview";



Loading…
Cancel
Save