From 3cb34d81adbb9cdfcb8ba05f0d289d4c1520ff5d Mon Sep 17 00:00:00 2001 From: Fornax Date: Mon, 20 Dec 2021 20:31:39 +0100 Subject: [PATCH] Add page for connecting apps to your account --- go.mod | 6 +- go.sum | 8 + res/static/img/jdownloader.png | Bin 0 -> 30720 bytes svelte/src/user_home/APIKeys.svelte | 31 +++- svelte/src/user_home/ConnectApp.svelte | 199 +++++++++++++++++++++++++ svelte/src/user_home/Router.svelte | 13 +- webcontroller/misc.go | 2 +- webcontroller/user_account.go | 1 + webcontroller/web_controller.go | 1 + 9 files changed, 250 insertions(+), 11 deletions(-) create mode 100644 res/static/img/jdownloader.png create mode 100644 svelte/src/user_home/ConnectApp.svelte diff --git a/go.mod b/go.mod index a9edbda..c52c2d4 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.17 require ( fornaxian.tech/config v0.0.0-20211108212237-6133aed90586 fornaxian.tech/log v0.0.0-20211102185326-552e9b1f8640 - fornaxian.tech/pixeldrain_api_client v0.0.0-20211209211007-1632279aa965 + fornaxian.tech/pixeldrain_api_client v0.0.0-20211220185733-94b115cb883d fornaxian.tech/util v0.0.0-20211102152345-9a486dee9787 github.com/julienschmidt/httprouter v1.3.0 github.com/microcosm-cc/bluemonday v1.0.16 @@ -19,7 +19,7 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect - golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b // indirect - golang.org/x/net v0.0.0-20211209124913-491a49abca63 // indirect + golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect + golang.org/x/net v0.0.0-20211216030914-fe4d6282115f // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) diff --git a/go.sum b/go.sum index c3e7a53..df8c577 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,10 @@ fornaxian.tech/pixeldrain_api_client v0.0.0-20211128195924-7b5d3f7293df h1:eFpcI fornaxian.tech/pixeldrain_api_client v0.0.0-20211128195924-7b5d3f7293df/go.mod h1:uajB2ofEsefUtxjvs4m7SDyPVRlfrI3qzCSWcud47hY= fornaxian.tech/pixeldrain_api_client v0.0.0-20211209211007-1632279aa965 h1:QAzkcEwXfVopwc6Q8UBZoW7YYgP8jwk18mmbrcl2KfE= fornaxian.tech/pixeldrain_api_client v0.0.0-20211209211007-1632279aa965/go.mod h1:uajB2ofEsefUtxjvs4m7SDyPVRlfrI3qzCSWcud47hY= +fornaxian.tech/pixeldrain_api_client v0.0.0-20211220172818-8db5ef7da837 h1:uM2Gu3RnsfXF646AA1SMzO1bj1SxPJr0SIOTXXu5GCE= +fornaxian.tech/pixeldrain_api_client v0.0.0-20211220172818-8db5ef7da837/go.mod h1:uajB2ofEsefUtxjvs4m7SDyPVRlfrI3qzCSWcud47hY= +fornaxian.tech/pixeldrain_api_client v0.0.0-20211220185733-94b115cb883d h1:BWmYoeL3InMJFD9iIMbq170yyJ07WObJBS3soi5VuVE= +fornaxian.tech/pixeldrain_api_client v0.0.0-20211220185733-94b115cb883d/go.mod h1:uajB2ofEsefUtxjvs4m7SDyPVRlfrI3qzCSWcud47hY= fornaxian.tech/util v0.0.0-20211102152345-9a486dee9787 h1:9ujI8Qi6+FTL/YW6xQAS9DmWDMerHBe8foQvVD/G/i0= fornaxian.tech/util v0.0.0-20211102152345-9a486dee9787/go.mod h1:FqVgfghmxTGR3l9Zx4MOMeZ9KHjiEFl3s3C0BSTvBwk= github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= @@ -49,6 +53,8 @@ golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 h1:/pEO3GD/ABYAjuakUS6xSE golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -56,6 +62,8 @@ golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 h1:0qxwC5n+ttVOINCBeRHO0nq9X golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/res/static/img/jdownloader.png b/res/static/img/jdownloader.png new file mode 100644 index 0000000000000000000000000000000000000000..61be313f8709bd2e5237ada69d6eb07033f43aca GIT binary patch literal 30720 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 p1V5 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 { const create_key = async () => { loading = true try { + let form = new FormData() + form.append("app_name", "Key generated by user") + const resp = await fetch( window.api_endpoint+"/user/session", - { method: "POST" } + { + method: "POST", + body: form, + } ); if(resp.status >= 400) { throw new Error(await resp.text()); @@ -82,6 +88,7 @@ const logout = async (key) => { {/if} +
{#if !loaded}
@@ -134,7 +141,22 @@ const logout = async (key) => { - User-Agent: {row.user_agent} + + App: + {#if row.app_name === "Pixeldrain Website"} + Pixeldrain logo + Website + {:else if row.app_name === "sharex"} + ShareX logo + ShareX + {:else if row.app_name === "jdownloader"} + JDownloader logo + JDownloader + {:else} + {row.app_name} + {/if} + + User-Agent: {row.user_agent} {/each} @@ -157,4 +179,9 @@ const logout = async (key) => { } .toolbar > * { flex: 0 0 auto; } .toolbar_spacer { flex: 1 1 auto; } + +.app_icon { + height: 1.6em; + vertical-align: middle; +} diff --git a/svelte/src/user_home/ConnectApp.svelte b/svelte/src/user_home/ConnectApp.svelte new file mode 100644 index 0000000..cf2f3a3 --- /dev/null +++ b/svelte/src/user_home/ConnectApp.svelte @@ -0,0 +1,199 @@ + + +
+ {#if loading} +
+ +
+ {/if} +
+ {#if app_name === "jdownloader"} +

+ Connect + JDownloader logo + JDownloader to your pixeldrain account +

+

+ To connect JDownloader to pixeldrain you need to generate an API + key and enter it in JDownloader's Account Manager. +
+ Do not show the generated key to anyone, it can + be used to gain access to your pixeldrain account! +

+ + {#if !api_key} +
+ +
+ {:else} +

Key created

+ +
+ + + +
+ {/if} + +

+ Paste the key in JDownloader to authenticate the app. +

+ {:else if app_name === "sharex"} +

+ Connect + ShareX logo + ShareX to your pixeldrain account +

+

+ ShareX is a Screen capture, file sharing and productivity tool. + Pixeldrain is supported as a custom uploader. You can get ShareX + here. +

+

+ Here you can download our custom ShareX uploader which uses + pixeldrain to upload your files. This uploader is configured to + upload files to your personal pixeldrain account. Do not + share the configuration file with anyone, it contains + your account credentials. +

+ + + +

Setting pixeldrain as default uploader

+

+ Download the uploader config and choose 'Open file' +
+
+ Set pixeldrain.com as active uploader. Choose Yes +
+
+

+ {:else} +

Connect an app to your pixeldrain account

+
    +
  • + +
  • +
  • + +
  • +
+ {/if} +
+
+ + diff --git a/svelte/src/user_home/Router.svelte b/svelte/src/user_home/Router.svelte index 2edd53e..1baf1eb 100644 --- a/svelte/src/user_home/Router.svelte +++ b/svelte/src/user_home/Router.svelte @@ -5,6 +5,7 @@ import AccountSettings from "./AccountSettings.svelte"; import APIKeys from "./APIKeys.svelte"; import Transactions from "./Transactions.svelte"; import Subscription from "./Subscription.svelte"; +import ConnectApp from "./ConnectApp.svelte"; let page = "" @@ -74,14 +75,16 @@ onMount(() => {
{#if page === "home"} - + {:else if page === "settings"} - + {:else if page === "api_keys"} - + + {:else if page === "connect_app"} + {:else if page === "transactions"} - + {:else if page === "subscription"} - + {/if}
diff --git a/webcontroller/misc.go b/webcontroller/misc.go index daaa42f..28e819a 100644 --- a/webcontroller/misc.go +++ b/webcontroller/misc.go @@ -17,7 +17,7 @@ func (wc *WebController) serveShareXConfig(w http.ResponseWriter, r *http.Reques w.Header().Add("Content-Disposition", "attachment; filename=pixeldrain.com.sxcu") if templateData.Authenticated { - sess, err := templateData.PixelAPI.PostUserSession() + sess, err := templateData.PixelAPI.PostUserSession("sharex") if err != nil { log.Error("Failed to create user session: %s", err) wc.templates.Get().ExecuteTemplate(w, "500", templateData) diff --git a/webcontroller/user_account.go b/webcontroller/user_account.go index f520b72..84f4d31 100644 --- a/webcontroller/user_account.go +++ b/webcontroller/user_account.go @@ -197,6 +197,7 @@ func (wc *WebController) loginForm(td *TemplateData, r *http.Request) (f Form) { if session, err := td.PixelAPI.PostUserLogin( f.FieldVal("username"), f.FieldVal("password"), + "Pixeldrain Website", ); err != nil { log.Debug("Login failed: %s", err) formAPIError(err, &f) diff --git a/webcontroller/web_controller.go b/webcontroller/web_controller.go index edd3ed2..f757166 100644 --- a/webcontroller/web_controller.go +++ b/webcontroller/web_controller.go @@ -181,6 +181,7 @@ func New( {GET, "user/home" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, {GET, "user/settings" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, {GET, "user/api_keys" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, + {GET, "user/connect_app" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, {GET, "user/transactions" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, {GET, "user/subscription" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, {GET, "user/confirm_email" /* */, wc.serveEmailConfirm},