From a1d67cedb89deeef1a7e18686e4459a15879f0ba Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 11:20:07 -0500 Subject: [PATCH 01/14] Added favicon, shifted if logic to handle default first --- chainlink.py | 55 ++++++++++++++++++++++++++++++--------------- images/favicon.ico | Bin 0 -> 4286 bytes 2 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 images/favicon.ico diff --git a/chainlink.py b/chainlink.py index ebd5f33..ffe82e5 100755 --- a/chainlink.py +++ b/chainlink.py @@ -1,25 +1,34 @@ #!/usr/bin/env python """Utilize crypto domains DNS and either redirect, or display information.""" -from bottle import Bottle, run, response, request +from bottle import Bottle, run, response, request, static_file import json import requests import json2html -VERSION = '0.0.1' +VERSION = '0.1.0' app = Bottle() def domainLookup(domain): - apibase = 'https://unstoppabledomains.com/api/v1/' - dnslookup = requests.get(apibase + domain) - domainJSON = json.loads(dnslookup.content) - print(domainJSON) - return domainJSON + """Return a dictionary from JSON results of API call + or return False if there is an error + """ + try: + apibase = 'https://unstoppabledomains.com/api/v1/' + dnslookup = requests.get(apibase + domain) + if dnslookup.status_code == 200: + domainInfo = json.loads(dnslookup.content) + return domainInfo + else: + return False + except requests.exceptions.ConnectionError: + return False @app.route("/") def root(): + """Index page, just displays information about URL formatting""" host = request.get_header('host') helptext = f"""

General format is {host}/<domain>/<action> @@ -49,10 +58,22 @@ def root(): @app.route("//") @app.route("//") def redirectDomain(domain, action=None): + """Handle the actual redirect for the domain queried""" lookupResult = domainLookup(domain) - redirect_url = lookupResult['ipfs']['redirect_domain'] - html = lookupResult['ipfs']['html'] - if action == 'redir': + if lookupResult: + redirect_url = lookupResult['ipfs']['redirect_domain'] + ipfs_hash = lookupResult['ipfs']['html'] + else: + return f"Unable to get info for {domain}" + if action is None or action == 'html': + response.status = 302 + if not ipfs_hash.startswith('/ip'): + ipfshash = "ipfs/" + ipfs_hash + else: + ipfshash = ipfs_hash + response.set_header('Location', + f"https://cloudflare-ipfs.com/{ipfshash}") + elif action == 'redir': try: if not redirect_url.startswith('http'): redirect_url = "http://" + redirect_url @@ -60,17 +81,15 @@ def redirectDomain(domain, action=None): response.set_header('Location', redirect_url) except KeyError: return f'Did not find a redirect for {domain}' - elif action is None or action == 'html': - response.status = 302 - if not html.startswith('/ip'): - ipfshash = "ipfs/" + html - else: - ipfshash = html - response.set_header('Location', - f"https://cloudflare-ipfs.com/{ipfshash}") elif action == 'raw': return json2html.json2html.convert(json=lookupResult) +@app.route("/favicon.ico") +def favicon(): + """Display a favicon to make the errors go away :)""" + return static_file('favicon.ico', root='images') + + if __name__ == "__main__": run(app, host='0.0.0.0', port='5000', reloader=True) diff --git a/images/favicon.ico b/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f62f4e6a2f940b0692f606cde4d0e294c6a104f5 GIT binary patch literal 4286 zcmeHL-%Aux7`;A-4%9ZFiboH=LPXT3BZ9-n;jl`M&RbXYLY` zNAgH%DItWElCdH}P7^{d=p#Zd5rSDvl3`yyE5NsRapzCDjh^ZV!MPXk}s~ki_1b3d!x^4w)DY$bEh<$>-Hz+rASV)?z+k-1E+8;KyvRrinA< zlwkDSLg;Gb{i9CDIK)+@5cvlF-gH>b25VZ(F`m<|G&#kAtMnpj4fu%>zvLO}Z0@cz z95_?TQRl#a^H7zXDP`vSH^ycT8w1U|$JGT_l>%rC_+LasE``1K4LqxBDhKFdC0gHS zweD}eTZuLdU@vg^FcFjsUA6vfzhCI8?fx9^*4KmkaeI_tv>5sZzRuzC?LRnhRXMR3 z^4^)(JgtH$XQ5B5Mefiiv+>Pk4!YhPY}?PoVJYm@&ta zDu<2!X1Uti7|(U@T-TX7AnrS(0r`5kL$3E-*ZY(nhiN?*Pk4alV{bcs6C6;JhAxbF zV2t}t#^I0y;$XLLLKn~`G=@4ytpQ`Lw^5|!VmhRAvf^roZ=y#Drj(;sbEfFE#u?4G z;^3xluJ$$xi(E_!MoZlCO~gF4Cea_DRn()KzPTK!6R62U577**rTPVG*sf<73*S6H zr+Hcz!(Pp(kxU%^`)1TN-!yW7t6<6*w|z4WU%iZHO}!4?^37EIna=8KAD?#V_%8Zp ziBPLf&U9A$wud|P=RD{T=d4t2c6`p}o9Ii1hvBS)vz{H8<~=g`=5K8O0nU2n-`P3N a=$kR0z*)~utZaK(`KEb&+Mfac;PndxNNgMc literal 0 HcmV?d00001 From 6c0e596a09b046625123f20a63b8f1a45c10d1fd Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 11:36:02 -0500 Subject: [PATCH 02/14] Added a basic README --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..ccc2ec2 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +Chainlink +========= + +Chainlink is a utility that will run on a webserver to handle crypto-backed domains. Specifically this works with [Unstoppable Domains](https://unstoppabledomains.com) + +Installation +============ + +To install this on your own server: + +#. Clone this repository +#. Install the python dependancies via `pip install -r requirements.txt` +#. Run the server with `./chainlink.py` +#. You can now hit the app at [http://localhost:5000/](http://localhost:5000) + +Testing on a running instance +============================= + +Assuming that it is running (I could be messing with it, or it might just be +broken), you may try this without installing by going to +[https://chainlink.arachnitech.com/](https://chainlink.arachnitech.com/) From 369b7a94afe8e5d2adabe2c4f909aa59e1788d65 Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 11:37:21 -0500 Subject: [PATCH 03/14] Fixed list markdown --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ccc2ec2..0329263 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ Installation To install this on your own server: -#. Clone this repository -#. Install the python dependancies via `pip install -r requirements.txt` -#. Run the server with `./chainlink.py` -#. You can now hit the app at [http://localhost:5000/](http://localhost:5000) +1. Clone this repository +2. Install the python dependancies via `pip install -r requirements.txt` +3. Run the server with `./chainlink.py` +4. You can now hit the app at [http://localhost:5000/](http://localhost:5000) Testing on a running instance ============================= From 84100ee9812b93b38f1cc72b26d1213b4caa4d5f Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 11:45:29 -0500 Subject: [PATCH 04/14] Added more usage detail to README --- README.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0329263..77cbf99 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ Chainlink ========= -Chainlink is a utility that will run on a webserver to handle crypto-backed domains. Specifically this works with [Unstoppable Domains](https://unstoppabledomains.com) +Chainlink is a utility that will run on a webserver to handle crypt-backed +domains Specifically this works with +[Unstoppable Domains](https://unstoppabledomains.com) +This utilizes public IPFS gateways to display IPFS content, or will redirect to +whatever the URL is set to in the Unstoppable Domain management. Installation ============ @@ -11,11 +15,25 @@ To install this on your own server: 1. Clone this repository 2. Install the python dependancies via `pip install -r requirements.txt` 3. Run the server with `./chainlink.py` -4. You can now hit the app at [http://localhost:5000/](http://localhost:5000) +4. You can now hit the app at http://localhost:5000 Testing on a running instance ============================= Assuming that it is running (I could be messing with it, or it might just be broken), you may try this without installing by going to -[https://chainlink.arachnitech.com/](https://chainlink.arachnitech.com/) +https://chainlink.arachnitech.com/ + +URL Patterns +============ + +The general format is http://localhost:5000// +where is a .crypto or .zil name registered with Unstoppable Domains and + can be +* html - uses the IPFS hash set in Unstoppable Domains management +* redir - uses the redirect_url set in Unstoppable Domains management +* raw - displays an HTML table view of the full JSON returned from Unstoppable + Domains API + +The default action is "html", so if you don't specify anything it will attempt +to use that field. From 06bdc39a7528621783de822d3fe273c1437e8b38 Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 11:46:27 -0500 Subject: [PATCH 05/14] spelling fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 77cbf99..95bcd65 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ Chainlink ========= -Chainlink is a utility that will run on a webserver to handle crypt-backed -domains Specifically this works with +Chainlink is a utility that will run on a webserver to handle crypto-backed +domain names Specifically this works with [Unstoppable Domains](https://unstoppabledomains.com) This utilizes public IPFS gateways to display IPFS content, or will redirect to whatever the URL is set to in the Unstoppable Domain management. From d8928a2037deabf815938515a25010aa6d8d7396 Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 11:52:30 -0500 Subject: [PATCH 06/14] fixed < > for HTML --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 95bcd65..2aee53e 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ https://chainlink.arachnitech.com/ URL Patterns ============ -The general format is http://localhost:5000// -where is a .crypto or .zil name registered with Unstoppable Domains and - can be +The general format is http://localhost:5000/<domain>lt;/action> +where <domain> is a .crypto or .zil name registered with Unstoppable +Domains and <action> can be * html - uses the IPFS hash set in Unstoppable Domains management * redir - uses the redirect_url set in Unstoppable Domains management * raw - displays an HTML table view of the full JSON returned from Unstoppable From 18bb8ee8c6eaf755ee1598a01135779c98ed5eb8 Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 11:54:29 -0500 Subject: [PATCH 07/14] Attempt to fix < > --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2aee53e..6f54391 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ https://chainlink.arachnitech.com/ URL Patterns ============ -The general format is http://localhost:5000/<domain>lt;/action> -where <domain> is a .crypto or .zil name registered with Unstoppable -Domains and <action> can be +The general format is http://localhost:5000// +where is a .crypto or .zil name registered with Unstoppable +Domains and can be * html - uses the IPFS hash set in Unstoppable Domains management * redir - uses the redirect_url set in Unstoppable Domains management * raw - displays an HTML table view of the full JSON returned from Unstoppable From 33059e197144ad7095e2753de191352abce2c73a Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 11:55:30 -0500 Subject: [PATCH 08/14] I clearly have no idea how to handle <> in markdown :) --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6f54391..1685f15 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ https://chainlink.arachnitech.com/ URL Patterns ============ -The general format is http://localhost:5000// -where is a .crypto or .zil name registered with Unstoppable -Domains and can be +The general format is http://localhost:5000/\/\ +where \ is a .crypto or .zil name registered with Unstoppable +Domains and \ can be * html - uses the IPFS hash set in Unstoppable Domains management * redir - uses the redirect_url set in Unstoppable Domains management * raw - displays an HTML table view of the full JSON returned from Unstoppable From fcbac544d84a04d4c606f4e8dbd69d8e47501a86 Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 13:38:03 -0500 Subject: [PATCH 09/14] Added MIT license text --- LICENSE.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..bc3e420 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Alex Kelly + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 4107c8608264830ab8393f4523ff8b24a37c61c4 Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 13:52:11 -0500 Subject: [PATCH 10/14] Added search engine registering howto --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 1685f15..474bfb8 100644 --- a/README.md +++ b/README.md @@ -37,3 +37,19 @@ Domains and \ can be The default action is "html", so if you don't specify anything it will attempt to use that field. + +Browser Search Engine +===================== + +I added a browser search engine for each of the UD domains (.zil and .crypto) so +that, when I type `.crypto domain` The browser will automatically redirect based +on the output from my chainlink script. + +The settings to make that work for .crypto is: +![.crypto search registration][crypto] + +It's basically the same for .zil: +![.crypto search registration][zil] + +[crypto]: images/cryptosearch.png +[zil]: images/zilsearch.png From 59716d25b2aa139e69ad35d89255244ab3bbcfbd Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 13:52:41 -0500 Subject: [PATCH 11/14] Added images --- images/cryptosearch.png | Bin 0 -> 17607 bytes images/zilsearch.png | Bin 0 -> 12706 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/cryptosearch.png create mode 100644 images/zilsearch.png diff --git a/images/cryptosearch.png b/images/cryptosearch.png new file mode 100644 index 0000000000000000000000000000000000000000..64e8e3bee21f36ae150cad0b33a74d1bea531def GIT binary patch literal 17607 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 literal 0 HcmV?d00001 diff --git a/images/zilsearch.png b/images/zilsearch.png new file mode 100644 index 0000000000000000000000000000000000000000..b42881e21ac868c27c9c50166dd7b606c93c13f9 GIT binary patch literal 12706 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 n^ozf+TBC*kKf>F&s~f%A% Date: Mon, 6 Jan 2020 14:06:51 -0500 Subject: [PATCH 12/14] Hopefully fixed all the annoying formatting issues --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 474bfb8..a032e78 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ https://chainlink.arachnitech.com/ URL Patterns ============ -The general format is http://localhost:5000/\/\ -where \ is a .crypto or .zil name registered with Unstoppable -Domains and \ can be +The general format is http://localhost:5000/{domain}/{action} +where {domain} is a .crypto or .zil name registered with Unstoppable +Domains and {action} can be * html - uses the IPFS hash set in Unstoppable Domains management * redir - uses the redirect_url set in Unstoppable Domains management * raw - displays an HTML table view of the full JSON returned from Unstoppable @@ -45,11 +45,12 @@ I added a browser search engine for each of the UD domains (.zil and .crypto) so that, when I type `.crypto domain` The browser will automatically redirect based on the output from my chainlink script. -The settings to make that work for .crypto is: +The settings to make that work for .crypto is:

![.crypto search registration][crypto] -It's basically the same for .zil: +It's basically the same for .zil:

![.crypto search registration][zil] + [crypto]: images/cryptosearch.png [zil]: images/zilsearch.png From 60b260c86fb32bcb4eb5f35f1d1067042743b693 Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 14:31:05 -0500 Subject: [PATCH 13/14] Handle demo URLs and redirect them to root --- chainlink.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chainlink.py b/chainlink.py index ffe82e5..64edcc3 100755 --- a/chainlink.py +++ b/chainlink.py @@ -1,6 +1,6 @@ #!/usr/bin/env python """Utilize crypto domains DNS and either redirect, or display information.""" -from bottle import Bottle, run, response, request, static_file +from bottle import Bottle, run, response, request, static_file, redirect import json import requests import json2html @@ -60,6 +60,8 @@ def root(): def redirectDomain(domain, action=None): """Handle the actual redirect for the domain queried""" lookupResult = domainLookup(domain) + if domain == 'yourdomain.crypto' or domain == 'yourdomain.zil': + redirect('/') if lookupResult: redirect_url = lookupResult['ipfs']['redirect_domain'] ipfs_hash = lookupResult['ipfs']['html'] From e1ddb50589963c62fade3723b3acd2d23b102982 Mon Sep 17 00:00:00 2001 From: Alex Kelly Date: Mon, 6 Jan 2020 14:37:24 -0500 Subject: [PATCH 14/14] Cloudflare was being too slow, changed to gateway.ipfs.io --- chainlink.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chainlink.py b/chainlink.py index 64edcc3..6157fd1 100755 --- a/chainlink.py +++ b/chainlink.py @@ -42,7 +42,7 @@ def root(): html - Hit the IPFS hash via cloudflare-ipfs.com + Hit the IPFS hash via gateway.ipfs.io redir @@ -74,7 +74,7 @@ def redirectDomain(domain, action=None): else: ipfshash = ipfs_hash response.set_header('Location', - f"https://cloudflare-ipfs.com/{ipfshash}") + f"https://gateway.ipfs.io/{ipfshash}") elif action == 'redir': try: if not redirect_url.startswith('http'):