summaryrefslogtreecommitdiffstats
path: root/web/gui/v2/registry-hello.html
blob: 7fba5662c5390b419d3a0316416952de283ed134 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<!doctype html><html><head><title>Netdata Registry</title><meta name="application-name" content="netdata"/><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,minimum-scale=1"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/></head><body><script>var getBasename = function() {
        var pathRegex = /\/(v2\/)?registry-hello.html?.*/
        return window.location.origin + window.location.pathname.replace(pathRegex, "")
      }

      function doRegistryAccess(parentHelloData, originUrl) {
        const helloPromise = !parentHelloData
          ? fetch(originUrl + "/api/v1/registry?action=hello", { cache: "no-cache", credentials: "include" })
              .then(function(response) { return response.json() })
          : Promise.resolve(parentHelloData)

        helloPromise.then(function(data) {
          var retries = 3
          var nodes = data.nodes || []

          var doAccess = function(mg, nm, token) {
            fetch(data.registry + '/api/v1/registry?action=access&machine=' + (mg || data.machine_guid) + '&name=' + encodeURIComponent(nm || data.hostname) + '&url=' + encodeURIComponent(originUrl) + '&agent=' + (data.agent ? data.agent.machine_guid : ""), { cache: "no-cache", credentials: "include", headers: { ["X-Netdata-Auth"]: 'Bearer ' + (token || localStorage.getItem("registry-netdata-token")) } })
            .then(function(response) { return response.json() })
            .then(function(data) {
              var token = data.person_guid

              if (data.status === "redirect" && retries > 0) {
                retries = retries - 1
                doAccess(data.machine_guid, data.hostname, token)
              }

              if (data.status === "ok") {
                localStorage.setItem("registry-netdata-token", token)

                let node = nodes.pop()

                if (!!node) {
                  setTimeout(function () {
                    doAccess(node.machine_guid, node.hostname, token)
                  }, 1000)
                }
              }
              window.parent.postMessage(data, "*");
            })
          }
          doAccess(data.machine_guid, data.hostname)
        }).catch(() => {})
      }

      try {
        var searchParams = new URLSearchParams(location.search)
        var url = searchParams.get("url")
        var mg = searchParams.get("agent_machine_guid")
        var tr_i = searchParams.get("transition_id")

        fetch(url + "/api/v1/registry?action=hello", { cache: "no-cache", credentials: "include" })
          .then(function(response) { return response.json() })
          .then(function(helloData) {
            window.parent.postMessage({
              mg: mg,
              tr_i: tr_i,
              hostname: helloData.hostname,
              url: url,
              isSame: mg === (helloData.agent ? helloData.agent.machine_guid : helloData.machine_guid)
            }, "*");
          }).catch(() => {
            window.parent.postMessage({
              mg: mg,
              tr_i: tr_i,
              url: url,
              isSame: false,
              hasError: true
            }, "*");
          })
        doRegistryAccess(parentHelloData, searchParams.get("originUrl"))
      } catch(e) {
        // do nothing
      }

      function isValidHttpUrl(string) {
        var url;

        try {
          return true
        } catch (_) {
          return false;
        }
      }

      window.addEventListener('message', function(event) {
        var isNetdataMessage = Array.isArray(event.data) ? event.data.length === 3 ? event.data[0] === "netdata-registry" : isValidHttpUrl(event.data[0]) : true

        if (!isNetdataMessage) return

        var originUrl = Array.isArray(event.data) ? event.data.length === 3 ? event.data[1] : event.data[0] : event.data
        var parentHelloData = Array.isArray(event.data) ? event.data.length === 3 ? event.data[2] : event.data[1] : null

        doRegistryAccess(parentHelloData, originUrl)
      });</script></body></html>