From d43418e2909ec243e82cd61f419e696d039e7e37 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 11 Jul 2019 06:00:00 -0700 Subject: [PATCH] update ui --- .gitignore | 1 + pkg/server/server.go | 5 +- static/banner.jpg | Bin 0 -> 43508 bytes static/main.js | 185 +++++++++++++++++++++++ static/style.css | 64 ++++++++ templates/view.html | 345 +++++++++++++------------------------------ 6 files changed, 356 insertions(+), 244 deletions(-) create mode 100644 static/banner.jpg create mode 100644 static/main.js diff --git a/.gitignore b/.gitignore index 8c3053d..64f4f1a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ pkg/server/assets.go +*~ # Binaries for programs and plugins *.exe *.exe~ diff --git a/pkg/server/server.go b/pkg/server/server.go index d0dc203..e60ce8a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -4,6 +4,7 @@ import ( "fmt" "html/template" "math/rand" + "io/ioutil" "net/http" "path/filepath" "strings" @@ -77,7 +78,7 @@ Disallow: /`)) return } else if strings.HasPrefix(r.URL.Path, "/static") { var b []byte - b, err = Asset(r.URL.Path[1:]) + b, err = ioutil.ReadFile()(r.URL.Path[1:]) if err != nil { http.Error(w, "file not found", 404) return @@ -98,7 +99,7 @@ Disallow: /`)) return } else if r.URL.Path == "/" { var t *template.Template - b, _ := Asset("templates/view.html") + b, _ := ioutil.ReadFile("templates/view.html") t, err = template.New("view").Parse(string(b)) if err != nil { log.Error(err) diff --git a/static/banner.jpg b/static/banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33ad37e57a2929b7783dc98e1d0443a793390320 GIT binary patch literal 43508 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 GKmXZ-)wJ3G literal 0 HcmV?d00001 diff --git a/static/main.js b/static/main.js new file mode 100644 index 0000000..42132b1 --- /dev/null +++ b/static/main.js @@ -0,0 +1,185 @@ +var files = []; +var isConnected = false; +var relativeDirectory = ""; + +function consoleLog(s) { + console.log(s); + if (typeof s === 'object') { + s = JSON.stringify(s); + } + + if (!(s.startsWith("[debug]"))) { + document.getElementById("consoleText").value = document.getElementById("consoleText").value + s + "\n"; + document.getElementById("consoleText").scrollTop = document.getElementById("consoleText").scrollHeight; + } +} + +function humanFileSize(bytes, si) { + var thresh = si ? 1000 : 1024; + if (Math.abs(bytes) < thresh) { + return bytes + ' B'; + } + var units = si ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', + 'EiB', 'ZiB', 'YiB' + ]; + var u = -1; + do { + bytes /= thresh; + ++u; + } while (Math.abs(bytes) >= thresh && u < units.length - 1); + return bytes.toFixed(1) + ' ' + units[u]; +} + +var Name = ""; +var filesize = 0; + +(function(Dropzone) { + Dropzone.autoDiscover = false; + + let drop = new Dropzone('div#filesBox', { + maxFiles: 1000, + url: '/', + method: 'post', + createImageThumbnails: false, + previewTemplate: "

", + autoProcessQueue: false, + }); + + + drop.on('addedfile', function(file) { + // console.log(file); + var domain = document.getElementById("inputDomain").value + files.push(file); + if (files.length == 1) { + relativeDirectory = file.webkitRelativePath.split("/")[0]; + } else if (file.webkitRelativePath.split("/")[0] != relativeDirectory) { + relativeDirectory = ""; + } + + if (!(isConnected)) { + isConnected = true; + socketSend({ + type: "domain", + message: domain, + key: document.getElementById("inputKey").value, + }) + } + + var filesString = "files are"; + var domainName = `${window.publicURL}/${domain}/`; + if (files.length == 1) { + filesString = "file is" + domainName += `${file.name}` + } + + document.getElementById("consoleHeader").innerHTML = + `

Your ${filesString} available at:

${domainName}

`; + html = `
    ` + for (i = 0; i < files.length; i++) { + var urlToFile = files[i].name; + if ('fullPath' in files[i]) { + urlToFile = files[i].fullPath; + } + html = html + + `
  • /${urlToFile}
  • ` + } + html = html + `
`; + document.getElementById("fileList").innerHTML = html; + document.getElementById("filesBox").classList.add("hide"); + document.getElementById("console").classList.remove("hide"); + document.getElementById("inputKey").readOnly = "true"; + document.getElementById("inputDomain").readOnly = "true"; + }) + +})(Dropzone); + +var socket; // websocket + + +/* websockets */ +function socketSend(data) { + if (socket == null) { + return + } + if (socket.readyState != 1) { + return + } + jsonData = JSON.stringify(data); + socket.send(jsonData); + if (jsonData.length > 100) { + consoleLog("[debug] ws-> " + jsonData.substring(0, 99)) + } else { + consoleLog("[debug] ws-> " + jsonData) + } +} + +const socketMessageListener = (event) => { + var data = JSON.parse(event.data); + if (!('type' in data && 'message' in data)) { + consoleLog(`[warn] got bad data ${event.data}`); + return + } + console.log(data) + consoleLog(`[debug] ${data.message}`) + if (data.type == "get") { + var foundFile = false + var iToSend = 0 + for (i = 0; i < files.length; i++) { + if (files[i].webkitRelativePath == data.message || files[i].name == data.message || files[i] + .webkitRelativePath == relativeDirectory + "/" + data.message) { + iToSend = i; + var reader = new FileReader(); + reader.onload = function(theFile) { + socketSend({ + type: "get", + message: reader.result, + success: true, + key: document.getElementById("inputKey").value, + }) + consoleLog( + `${data.ip} [${(new Date()).toUTCString()}] /${data.message} 200 ${files[i].size}` + ); + }; + reader.readAsDataURL(files[i]); + foundFile = true + break + } + } + if (foundFile == false) { + socketSend({ + type: "get", + message: "not found", + success: false, + key: document.getElementById("inputKey").value, + }) + consoleLog(`${data.ip} [${(new Date()).toUTCString()}] /${data.message} 404`); + } + } else if (data.type == "domain") { + console.log(`[info] ${data.message}`); + } else if (data.type == "message") { + console.log(`[info] ${data.message}`); + } else { + consoleLog(`[debug] unknown`); + } +}; +const socketOpenListener = (event) => { + consoleLog('[info] connected'); +}; + +const socketCloseListener = (event) => { + if (socket) { + consoleLog('[info] disconnected'); + } + var url = window.origin.replace("http", "ws") + '/ws'; + try { + socket = new WebSocket(url); + socket.addEventListener('open', socketOpenListener); + socket.addEventListener('message', socketMessageListener); + socket.addEventListener('close', socketCloseListener); + } catch (err) { + consoleLog("[info] no connection available") + } +}; + + +socketCloseListener(); \ No newline at end of file diff --git a/static/style.css b/static/style.css index 60826b7..684eee8 100644 --- a/static/style.css +++ b/static/style.css @@ -329,3 +329,67 @@ However, delay the fade out process for 2.5 seconds */ opacity: 0; } } + + + +.main { + padding-top: 20px; +} + +.list { + display: flex; + flex-wrap: wrap; +} + +.list>div { + padding: 0.4em; +} + +body { + text-decoration-skip: ink; +} + +.hide { + display: none; +} + +textarea { + width: 100%; + border: none; + resize: none; + height: 20em; + border: 1px solid #ccc; + background-color: #f5f5f5; + padding: 1em; + font-size: 0.9em; +} + +details>p>code { + background-color: inherit; +} + +.editer { + margin: 0.2em; + padding: 0.5em; + background-color: #f5f5f5; + display: inline; + border: none; + font-weight: bold; + font-family: var(--sans-font); + font-size: 1em; +} + +.banner { + padding-top: 3em; +} + +.p05 { + padding-top: 0.5em; + padding-bottom: 0.5em; +} + +.flexcol { + display: flex; + flex-direction: row; + align-content: center; +} \ No newline at end of file diff --git a/templates/view.html b/templates/view.html index 04871e6..2c02477 100644 --- a/templates/view.html +++ b/templates/view.html @@ -2,70 +2,46 @@ - - - - - + + host yo self + + + + + + + + + + + + + + + + + + + + + + + + + + + - hostyoself -
- +

-

Your files will be relayed at {{.PublicURL}}/. Multiple hosts can be used with this key: .

+

Need a web host? Host yo self! Use this page to host a website or a file directly from your computer / phone / smartwatch / toaster!

Click here for FAQ.

FAQ

@@ -163,10 +139,78 @@

Privacy policy

- Privacy policy +

Effective date: July 11, 2019

+

Host Yo Self ("us", "we", or "our") operates the https://hostyoself.com website (the "Service").

+

This page informs you of our policies regarding the collection, use, and disclosure of personal data when you use our Service and the choices you have associated with that data.

+

We use your data to provide and improve the Service. By using the Service, you agree to the collection and use of information in accordance with this policy. Unless otherwise defined in this Privacy Policy, terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, accessible from https://hostyoself.com

+

Information Collection And Use

+

We collect several different types of information for various purposes to provide and improve our Service to you.

+

Types of Data Collected

+

Personal Data

+

While using our Service, we may ask you to provide us with certain personally identifiable information that can be used to contact or identify you ("Personal Data"). Personally identifiable information may include, but is not limited to:

+
    +
  • Usage Data
  • +
+

Usage Data

+

We may also collect information how the Service is accessed and used ("Usage Data"). This Usage Data may include information such as your computer's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that you visit, the time and date of your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

+

Use of Data

+

Host Yo Self uses the collected data for various purposes:

+
    +
  • To provide and maintain the Service
  • +
  • To notify you about changes to our Service
  • +
  • To allow you to participate in interactive features of our Service when you choose to do so
  • +
  • To provide customer care and support
  • +
  • To provide analysis or valuable information so that we can improve the Service
  • +
  • To monitor the usage of the Service
  • +
  • To detect, prevent and address technical issues
  • +
+

Transfer Of Data

+

Your information, including Personal Data, may be transferred to — and maintained on — computers located outside of your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from your jurisdiction.

+

If you are located outside United States and choose to provide information to us, please note that we transfer the data, including Personal Data, to United States and process it there.

+

Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.

+

Host Yo Self will take all steps reasonably necessary to ensure that your data is treated securely and in accordance with this Privacy Policy and no transfer of your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of your data and other personal information.

+

Disclosure Of Data

+

Legal Requirements

+

Host Yo Self may disclose your Personal Data in the good faith belief that such action is necessary to:

+
    +
  • To comply with a legal obligation
  • +
  • To protect and defend the rights or property of Host Yo Self
  • +
  • To prevent or investigate possible wrongdoing in connection with the Service
  • +
  • To protect the personal safety of users of the Service or the public
  • +
  • To protect against legal liability
  • +
+

Security Of Data

+

The security of your data is important to us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Data, we cannot guarantee its absolute security.

+

Service Providers

+

We may employ third party companies and individuals to facilitate our Service ("Service Providers"), to provide the Service on our behalf, to perform Service-related services or to assist us in analyzing how our Service is used.

+

These third parties have access to your Personal Data only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose.

+

Links To Other Sites

+

Our Service may contain links to other sites that are not operated by us. If you click on a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit.

+

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

+

Children's Privacy

+

Our Service does not address anyone under the age of 18 ("Children").

+

We do not knowingly collect personally identifiable information from anyone under the age of 18. If you are a parent or guardian and you are aware that your Children has provided us with Personal Data, please contact us. If we become aware that we have collected Personal Data from children without verification of parental consent, we take steps to remove that information from our servers.

+

Changes To This Privacy Policy

+

We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.

+

We will let you know via email and/or a prominent notice on our Service, prior to the change becoming effective and update the "effective date" at the top of this Privacy Policy.

+

You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

+

Contact Us

+

If you have any questions about this Privacy Policy, please contact us:

+
    +
  • By email: schollz@mg.hostyoself.com
  • +

+
+ + +
+
+ + +   (You can spawn multiple hosts with this key). +
Drag and drop a folder or click to share a file.
@@ -191,194 +235,11 @@

Made by schollz, source available on Github.

- + + \ No newline at end of file