diff options
| author | Ev Bogue <ev@evbogue.com> | 2019-12-21 14:26:30 -0600 | 
|---|---|---|
| committer | Ev Bogue <ev@evbogue.com> | 2019-12-21 14:26:30 -0600 | 
| commit | 3fe02c91174d7316ae2c66a7679ab807ca43c6c3 (patch) | |
| tree | c397326b8b62edba91471a421ad97ced868d8987 | |
| parent | 6a19e648f27efde551b7f5902c4b72f61e048cb4 (diff) | |
initial stab at private beacons
| -rw-r--r-- | app.js | 3 | ||||
| -rw-r--r-- | beacons.js | 89 | ||||
| -rw-r--r-- | css/style.css | 4 | ||||
| -rw-r--r-- | gossip.js | 3 | ||||
| -rw-r--r-- | index.html | 1 | ||||
| -rw-r--r-- | render.js | 73 | ||||
| -rw-r--r-- | server.js | 59 | ||||
| -rw-r--r-- | settings.js | 49 | 
8 files changed, 190 insertions, 91 deletions
| @@ -10,6 +10,8 @@ function route (keys) {    if (src === 'settings') {      settingsPage(keys) +  } else if (src === 'beacons') { +    beaconsPage(keys)    } else if (src[0] === '@') {      profilePage(src, keys)    } else if (src[0] === '?') { @@ -28,6 +30,7 @@ keys().then(key => {      h('div', {classList: 'internal'}, [        h('li', [h('a', {href: '#'}, ['Home'])]),        h('li', [h('a', {href: '#' + key.publicKey}, [getName(key.publicKey, keys)])]), +      h('li', [h('a', {href: '#beacons'}, ['Beacons'])]),        h('li', {classList: 'right'}, [h('a', {href: '#settings'}, ['Settings'])]),        h('form', { classList: 'search',           onsubmit: function (e) { diff --git a/beacons.js b/beacons.js new file mode 100644 index 0000000..1656879 --- /dev/null +++ b/beacons.js @@ -0,0 +1,89 @@ + +function beaconsPage (keys) { + +  var pubslist = h('select') + +  localforage.getItem('securepubs').then(function (servers) { +    servers.forEach(function (pub) { +      pubslist.appendChild( +        h('option', {value: pub}, [pub]) +      ) +    }) +  }) +   +  var ads = h('div', {classList: 'message'}) + +  ads.appendChild(h('span', {innerHTML: marked('Sometimes when you\'re lost on the Internet you might want to send out a beacon so that people can see you. \n\n Beacons from guests will run for 100 views before they are deleted by the pub. \n\nSelect a pub:')})) + +  ads.appendChild(pubslist) + +  var recp = h('input', {placeholder: 'Ex: @Q++V5BbvWIg8B+TqtC9ZKFhetruuw+nOgxEqfjlOZI0='}) + +  var adstext = h('textarea', {placeholder: 'Hello World!'}) + +  ads.appendChild(h('span', [ +    h('br'), +    h('p', [" Send a beacon (leave the 'To:' field blank for a public beacon): "]), +    h('p', ['To: ', +      recp +    ]), +    adstext, +    h('br'), +    h('button', { +      onclick: function () { +        var split = pubslist.value.split('~') +        console.log(split) +        var serverurl = split[0] +        var serverpub = split[1] +        var ws = new WebSocket(serverurl) + +        if ((recp.value) && (adstext.value)) { +          var tobox = { +            author: keys.publicKey, +            timestamp: Date.now(), +            content: adstext.value +          } +          box(JSON.stringify(tobox), recp.value, keys).then(boxedmsg => { +            var msg = { +              type: 'beacon', +              author: keys.publicKey, +              box: boxedmsg +            } +            ws.onopen = function () { +              box(JSON.stringify(msg), serverpub, keys).then(boxed => { +                var obj = { +                  requester: keys.publicKey, +                  box: boxed +                } +                ws.send(JSON.stringify(obj)) +              }) +              adstext.value = '' +              recp.value = '' +            } +          }) +        } + +        if ((!recp.value) && (adstext.value)) { +          var msg = { +            type: 'beacon', +            author: keys.publicKey +          } +          msg.signature = nacl.util.encodeBase64(nacl.sign(nacl.util.decodeUTF8(JSON.stringify(adstext.value)), nacl.util.decodeBase64(keys.privateKey))) +          ws.onopen = function () { +            box(JSON.stringify(msg), serverpub, keys).then(boxed => { +              var obj = { +                requester: keys.publicKey, +                box: boxed +              } +              ws.send(JSON.stringify(obj)) +            }) +            adstext.value = '' +          } +        } +      } +    }, ['Publish']) +  ])) + +  scroller.appendChild(ads) +} + diff --git a/css/style.css b/css/style.css index 2a7745b..1eef78f 100644 --- a/css/style.css +++ b/css/style.css @@ -70,7 +70,7 @@ hr {    animation: fadein .5s;  } -#ad { +#ad, #pm {    background: white;    font-size: .8em;    border: 1px solid #ddd; @@ -82,7 +82,7 @@ hr {    width: 250px;  } -#ad button { +#ad button, #pm button {    font-size: .8em;    margin: 0;    padding: 0; @@ -53,6 +53,9 @@ function sync (subs, keys) {                          unboxedreq.signature = unboxedreq.content                          renderAd(unboxedreq)                        } +                      if (unboxedreq.box) { +                        renderAd(unboxedreq, keys) +                      }                        if (unboxedreq.seq === 0) {                          var stringedfeed = JSON.stringify(srclog)                          box(stringedfeed, serverpub, keys).then(boxed => { @@ -17,6 +17,7 @@      <script src="bog.js"></script>      <script src="composer.js"></script>      <script src="settings.js"></script> +    <script src="beacons.js"></script>      <script src="identify.js"></script>      <script src="render.js"></script>      <script src="gossip.js"></script> @@ -1,4 +1,6 @@ -function renderAd (ad) { +function renderAd (ad, keys) { +  console.log(ad) +    var screen = document.getElementById('screen')    var adspot = document.getElementById('ad') @@ -11,30 +13,57 @@ function renderAd (ad) {    if (ad.views) {      adspace.appendChild(h('span', {classList: 'right'}, [h('pre', [ad.views + ' views'])]))    } else { -    adspace.appendChild(h('span', {classList: 'right'}, [h('pre', ['ad'])])) +    adspace.appendChild(h('span', {classList: 'right'}, [h('pre', ['beacon'])]))    } -  open(ad).then(opened => { -    quickName(ad.author).then(gotName => { -      newAd = h('div', {id: 'ad'}, [ -        adspace, -        h('p', {innerHTML: marked(opened)}), -        h('button', {classList: 'right', -          onclick: function () { -            adspot = document.getElementById('ad') -            adspot.parentNode.removeChild(adspot) -          } -        }, ['Heard']), -        h('span', [ -          '—', -          h('a', {href: '#' + ad.author}, [gotName]), -          ' from ', -          h('a', {href: ad.name}, [ad.name]) +  if (ad.box) { +    unbox(ad.box, ad.author, keys).then(unboxed => { +      var msg = JSON.parse(nacl.util.encodeUTF8(unboxed)) +      quickName(ad.author).then(gotName => { +        beacon = h('div', {id: 'pm'}, [ +          h('span', {classList: 'right'}, [h('pre', [human(new Date(msg.timestamp))])]), +          h('p', {innerHTML: marked(msg.content)}), +          h('button', {classList: 'right', +            onclick: function () { +              pmspot = document.getElementById('pm') +              pmspot.parentNode.removeChild(pmspot) +            } +          }, ['Heard']), +          h('span', [ +            '—', +            h('a', {href: '#' + ad.author}, [gotName]), +            ' from ', +            h('a', {href: ad.name}, [ad.name]) +          ])          ]) -      ]) -      screen.appendChild(newAd) -    })  -  }) +        screen.append(beacon) +      })       +    }) +  } + +  if (ad.signature) { +    open(ad).then(opened => { +      quickName(ad.author).then(gotName => { +        newAd = h('div', {id: 'ad'}, [ +          adspace, +          h('p', {innerHTML: marked(opened)}), +          h('button', {classList: 'right', +            onclick: function () { +              adspot = document.getElementById('ad') +              adspot.parentNode.removeChild(adspot) +            } +          }, ['Heard']), +          h('span', [ +            '—', +            h('a', {href: '#' + ad.author}, [gotName]), +            ' from ', +            h('a', {href: ad.name}, [ad.name]) +          ]) +        ]) +        screen.appendChild(newAd) +      })  +    }) +  }  }  function getHeader (post, keys, mini) { @@ -119,15 +119,27 @@ bog.keys().then(key => {        } else {           bog.unbox(req.box, req.requester, key).then(unboxed => {            var unboxedreq = JSON.parse(nacl.util.encodeUTF8(unboxed)) -          if (unboxedreq.type == 'ad') { -             -            var hex = Buffer.from(nacl.hash(nacl.util.decodeUTF8(unboxedreq.signature))).toString('hex') -             -            var obj = { -              hash: hex, -              author: unboxedreq.author, -              signature: unboxedreq.signature, -              views: 0 +          //console.log(unboxedreq) +          if (unboxedreq.type == 'beacon') { +            if (unboxedreq.box) { +              var hex = Buffer.from(nacl.hash(nacl.util.decodeUTF8(unboxedreq.box))).toString('hex') + +              var obj = { +                hash: hex, +                author: unboxedreq.author, +                box: unboxedreq.box, +                views: 0 +              } +            }  + +            if (unboxedreq.signature) { +              var hex = Buffer.from(nacl.hash(nacl.util.decodeUTF8(unboxedreq.signature))).toString('hex') +              var obj = { +                hash: hex, +                author: unboxedreq.author, +                signature: unboxedreq.signature, +                views: 0 +              }              }              fs.writeFile(addir + hex, JSON.stringify(obj), 'UTF-8', function () { @@ -150,13 +162,25 @@ bog.keys().then(key => {                              var num = Math.floor(Math.random() * (adfiles.length))                               fs.readFile(addir + adfiles[num], 'UTF-8', function (err, adFile) {                                var obj = JSON.parse(adFile) -                              var ad = { -                                author: obj.author, -                                name: config.fullurl, -                                content: obj.signature, -                                timestamp: Date.now(), -                                views: obj.views + +                              if (obj.signature) { +                                var ad = { +                                  author: obj.author, +                                  name: config.fullurl, +                                  content: obj.signature, +                                  views: obj.views +                                }                                } + +                              if (obj.box) { +                                var ad = { +                                  author: obj.author, +                                  name: config.fullurl, +                                  box: obj.box, +                                  views: obj.views +                                } +                              } +                                if ((obj.views > 100) && (obj.author != config.author)) {                                  fs.unlinkSync(addir + obj.hash)                                  //console.log('REMOVING AD') @@ -165,6 +189,7 @@ bog.keys().then(key => {                                  fs.writeFileSync(addir + obj.hash, JSON.stringify(obj), 'UTF-8')                                }                                printSendAd(ad, req) +                              console.log(ad)                                //console.log('SENDING AD')                                bog.box(JSON.stringify(ad), req.requester, key).then(boxed => {                                  sendobj = { @@ -175,9 +200,7 @@ bog.keys().then(key => {                                  ws.close()                                })                              }) -                          } else { -                            ads.make('Hello World.') -                          } +                          }                           })                        }                      } diff --git a/settings.js b/settings.js index 51dc1f2..c88ea07 100644 --- a/settings.js +++ b/settings.js @@ -56,11 +56,7 @@ function settingsPage (keys) {    var add = h('input', {placeholder: 'Add a pub'}) -  var pubslist = h('select') -    localforage.getItem('securepubs').then(function (servers) { - -      pubs.appendChild(h('div', [        add,        h('button', { @@ -74,9 +70,6 @@ function settingsPage (keys) {      ]))      servers.forEach(function (pub) { -      pubslist.appendChild( -        h('option', {value: pub}, [pub]) -      )        pubs.appendChild(h('p', [          pub,          h('button', { @@ -98,52 +91,10 @@ function settingsPage (keys) {      }    }, ['Reset pubs'])) -  var ads = h('div', {classList: 'message'})  - - -  ads.appendChild(h('span', {innerHTML: marked('Submit an advertisement. Right now advertisements are free for anyone to post to this pub. Ads from guests will run for 100 views before they are deleted by the pub. \n\nSelect a pub:')})) - -  ads.appendChild(pubslist) - -  var adstext = h('input', {placeholder: 'Hello World!'}) - -  ads.appendChild(h('span', [ -    h('br'), -    ' Write an ad: ', -    h('br'), -    adstext, -    h('button', { -      onclick: function () { -        var split = pubslist.value.split('~') -        console.log(split) -        var serverurl = split[0] -        var serverpub = split[1] -        var ws = new WebSocket(serverurl) -          -        var msg = { -          type: 'ad', -          author: keys.publicKey -        } -        msg.signature = nacl.util.encodeBase64(nacl.sign(nacl.util.decodeUTF8(JSON.stringify(adstext.value)), nacl.util.decodeBase64(keys.privateKey))) -        ws.onopen = function () { -          box(JSON.stringify(msg), serverpub, keys).then(boxed => { -            var obj = { -              requester: keys.publicKey, -              box: boxed -            } -            ws.send(JSON.stringify(obj)) -          }) -        } -        adstext.value = '' -      } -    }, ['Publish']) -  ])) -    scroller.appendChild(welcome)    scroller.appendChild(keyDiv)    scroller.appendChild(pubs)    scroller.appendChild(everything)    //scroller.appendChild(regenerate) -  scroller.appendChild(ads)  } | 
