416 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			416 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | |
| <html ng-app="com.daplie.cloud" ng-strict>
 | |
|   <head>
 | |
|     <link type="text/css" rel="stylesheet" href="/assets/com.bootstrapcdn/spacelab/bootstrap.css">
 | |
|   </head>
 | |
|   <body class="fade" ng-class="[ 'in' ]" ng-controller="LoginController as vm" ng-init="vm.setSimple()">
 | |
| 
 | |
|     <div class="container">
 | |
|       <center>
 | |
|         <h1>Welcome to Goldilocks!</h1>
 | |
|         <span ng-if="vm.config">
 | |
|           Server Name: '<span ng-bind="vm.config.device.hostname"></span>' running from
 | |
|           <br/>
 | |
|           <code><span ng-bind="vm.config.cwd"></span>/</code>
 | |
|           <br/>
 | |
|           iface: <span ng-bind="vm.admin.network.iface"></span>
 | |
|           <br/>
 | |
|           ipv4: <span ng-bind="vm.admin.network.ipv4"></span>
 | |
|           <br/>
 | |
|           ipv6: <span ng-bind="vm.admin.network.ipv6"></span>
 | |
|         </span>
 | |
|         <br/>
 | |
|         <br/>
 | |
|       </center>
 | |
|     </div>
 | |
| 
 | |
|     <div class="container">
 | |
|       <div class="row">
 | |
|       <div class="col-sm-3">
 | |
|         <ul class="nav nav-pills nav-stacked" ng-init="vm.admin.page = 'authn'">
 | |
|           <li
 | |
|             role="presentation"
 | |
|             ng-class="{ active: 'authn' === vm.admin.page }"
 | |
|             ><a
 | |
|               href=""
 | |
|               ng-click="vm.admin.page = 'authn'"
 | |
|               ng-disabled="'authn' === vm.admin.page"
 | |
|               >Authenticate</a></li>
 | |
|           <li
 | |
|             ng-if="vm.config"
 | |
|             role="presentation"
 | |
|             ng-class="{ active: 'network' === vm.admin.page }"
 | |
|             ><a
 | |
|               href=""
 | |
|               ng-click="vm.admin.page = 'network'"
 | |
|               ng-disabled="'network' === vm.admin.page"
 | |
|               >Network</a></li>
 | |
|           <li
 | |
|             ng-if="vm.config"
 | |
|             role="presentation"
 | |
|             ng-class="{ active: 'domains' === vm.admin.page }"
 | |
|             ><a
 | |
|               href=""
 | |
|               ng-click="vm.admin.page = 'domains'"
 | |
|               ng-disabled="'domains' === vm.admin.page"
 | |
|               >Domains</a></li>
 | |
|           <li
 | |
|             ng-if="vm.config"
 | |
|             role="presentation"
 | |
|             ng-class="{ active: 'plugins' === vm.admin.page }"
 | |
|             ><a
 | |
|               href=""
 | |
|               ng-click="vm.admin.page = 'plugins'"
 | |
|               ng-disabled="'plugins' === vm.admin.page"
 | |
|               >Plugins</a></li>
 | |
|         </ul>
 | |
| 
 | |
|         <div ng-if="vm.config">
 | |
|           <ul class="nav nav-tabs">
 | |
|             <li
 | |
|               role="presentation"
 | |
|               ng-class="{ active: !vm.admin.remote }"
 | |
|               ><a
 | |
|                 href=""
 | |
|                 ng-click="vm.admin.remote = false"
 | |
|                 >Local Server</a></li>
 | |
|             <li
 | |
|               role="presentation"
 | |
|               ng-class="{ active: vm.admin.remote }"
 | |
|               ><a
 | |
|                 href=""
 | |
|                 ng-click="vm.admin.remote = true"
 | |
|                 >Remote Server</a></li>
 | |
|           </ul>
 | |
| 
 | |
|           <div ng-if="!vm.admin.remote">
 | |
|             <label>Server Address:</label>
 | |
|             <input type="text" disabled value="127.0.0.1">
 | |
|             <label>Server Name:</label>
 | |
|             <input type="text" disabled value="localhost.admin.daplie.me">
 | |
|           </div>
 | |
| 
 | |
|           <div ng-if="vm.admin.remote">
 | |
|             <button
 | |
|               type="button"
 | |
|               class="btn btn-default"
 | |
|               ng-click="vm.remote.scan()">Scan Local Network</button>
 | |
|             <br/>
 | |
|             <label>Server Address:</label>
 | |
|             <input type="text" placeholder="i.e. 192.168.1.100">
 | |
|             <br/>
 | |
|             <label>Server Name:</label>
 | |
|             <input type="text" placeholder="i.e. admin.goldilocks.invalid">
 | |
|             <br/>
 | |
|             <label>Root Certificate Validation (optional):</label>
 | |
|             <br/>
 | |
|             <textarea class="textarea" placeholder="paste the contents of a root.pem here"></textarea>
 | |
|           </div>
 | |
| 
 | |
|         </div>
 | |
|       </div>
 | |
| 
 | |
|       <div class="col-sm-9">
 | |
| 
 | |
|         <div ng-if="!vm.config || 'authn' === vm.admin.page">
 | |
|           <p>In order to administer this server you must authenticate.</p>
 | |
| 
 | |
|           <button
 | |
|             type="button"
 | |
|             class="btn btn-default"
 | |
|             ng-disabled="vm.advanced && !vm.providerUri"
 | |
|             ng-click="vm.authenticate()"
 | |
|             >Login</button>
 | |
|           <button
 | |
|             type="button"
 | |
|             class="btn btn-link"
 | |
|             ng-if="!vm.advanced"
 | |
|             ng-click="vm.setAdvanced()"
 | |
|             >advanced</button>
 | |
|           <div ng-if="vm.advanced">
 | |
|             <button
 | |
|               type="button"
 | |
|               class="btn btn-link"
 | |
|               ng-click="vm.setSimple();"
 | |
|               >simple</button>
 | |
|             <input
 | |
|               type="text"
 | |
|               ng-change="vm.checkProviderUri(vm.myProviderUri)"
 | |
|               ng-model="vm.myProviderUri">
 | |
|             <br/>
 | |
|             <small>todo: allow per-device authorization</small>
 | |
|           </div>
 | |
| 
 | |
|           <br/>
 | |
|           <br/>
 | |
| 
 | |
|           <button
 | |
|             class="btn btn-success"
 | |
|             ng-if="vm.config"
 | |
|             ng-click="vm.admin.page = 'network'"
 | |
|             >Next: Network Settings</button>
 | |
|         </div>
 | |
| 
 | |
|         <div ng-if="vm.config">
 | |
|           <div ng-init="siteconf = vm.config.global">
 | |
|             <div ng-if="'network' === vm.admin.page">
 | |
|               <h1>Server Name:</h1>
 | |
|               <input
 | |
|                 type="text"
 | |
|                 ng-model="vm.admin.servername"
 | |
|                 />
 | |
|               <button
 | |
|                 type="button"
 | |
|                 class="btn btn-primary"
 | |
|                 ng-click="vm.admin.setDeviceName(vm.admin.servername)"
 | |
|                 ng-disabled="vm.config.device.hostname === vm.admin.servername"
 | |
|                 >Save</button>
 | |
| 
 | |
|               <h1>Addresses:</h1>
 | |
|               <table class="table">
 | |
|                 <tr>
 | |
|                   <th>Interface</th>
 | |
|                   <th>Address</th>
 | |
|                   <th>Family</th>
 | |
|                   <th>Scope</th>
 | |
|                 </tr>
 | |
|                 <tr ng-repeat="addr in vm.config.addresses">
 | |
|                   <td ng-bind="addr.iface"></td>
 | |
|                   <td ng-bind="addr.address"></td>
 | |
|                   <td ng-bind="addr.family"></td>
 | |
|                   <td><span
 | |
|                     ng-if="'unicast' !== addr.range" ng-bind="addr.range"></span
 | |
|                     ><strong ng-if="'unicast' === addr.range">Internet</strong>
 | |
|                     <button
 | |
|                       ng-if="vm.admin.network.iface !== addr.iface"
 | |
|                       class="btn btn-primary"
 | |
|                       type="button"
 | |
|                       ng-click="vm.admin.setInterface(addr)"
 | |
|                       >Use <span ng-bind="addr.iface"></span></button></td>
 | |
|                   </td>
 | |
|                 </tr>
 | |
|                 <tr>
 | |
|                   <td>OAuth3 Tunnel</td>
 | |
|                   <td>(automatically assigned)</td>
 | |
|                   <td>IPv4 + IPv6</td>
 | |
|                   <td><strong>Internet</strong>
 | |
|                     <button
 | |
|                       type="button"
 | |
|                       class="btn btn-success"
 | |
|                       ng-if="'oauth3-tunnel' !== vm.admin.network.iface"
 | |
|                       ng-click="vm.enableTunnel()"
 | |
|                       >Enable</button>
 | |
|                     <div ng-if="'oauth3-tunnel' === vm.admin.network.iface">
 | |
|                       <button
 | |
|                         ng-if="!vm.admin.tunnel.advanced"
 | |
|                         type="button"
 | |
|                         class="btn btn-link"
 | |
|                         ng-click="vm.admin.tunnel.advanced = true"
 | |
|                         >Show Advanced Options</button>
 | |
|                       <button
 | |
|                         ng-if="vm.admin.tunnel.advanced"
 | |
|                         type="button"
 | |
|                         class="btn btn-link"
 | |
|                         ng-click="vm.admin.tunnel.advanced = false"
 | |
|                         >Hide Advanced Options</button>
 | |
|                     </div>
 | |
|                   </td>
 | |
|                 </tr>
 | |
|               </table>
 | |
| 
 | |
|               <div ng-if="'oauth3-tunnel' === vm.admin.network.iface">
 | |
|                 <div ng-if="vm.admin.tunnel.advanced">
 | |
|                   <h2>OAuth3 Tunnel Options</h2>
 | |
|                   <label><input
 | |
|                     type="checkbox"
 | |
|                     ng-model="vm.admin.tunnel.optimistic"
 | |
|                     ng-change="vm.setTunnel()"> Prefer local network when available</label>
 | |
|                   <br/>
 | |
|                   <label>URL</label> <input
 | |
|                     class"form-input"
 | |
|                     type="url"
 | |
|                     value="https://oauth3.org/api/org.oauth3.tunnel"
 | |
|                     disabled />
 | |
|                   <br/>
 | |
|                   <label>Token (Bearer or JWT)</label> <textarea
 | |
|                     class"form-input"
 | |
|                     disabled />aaaaaaaaaa.bbbbbbbbbbb.cccccccccccc</textarea>
 | |
|                   <br/>
 | |
|                   <label>Shared Secret (Text or JWK)</label> <input
 | |
|                     class"form-input"
 | |
|                     type="text"
 | |
|                     value="xxxx-xxxx-xxx-xxxxx"
 | |
|                     disabled />
 | |
|                   <br/>
 | |
|                   <label>Private Key (PEM or JWK)</label> <textarea
 | |
|                     class"form-input"
 | |
|                     disabled />    {
 | |
|               kty: "EC",
 | |
|               crv: "P-256",
 | |
|               x: "zCQ5BPHPCLZYgdpo1n-x_90P2Ij52d53YVwTh3ZdiMo",
 | |
|               y: "pDfQTUx0-OiZc5ZuKMcA7v2Q7ZPKsQwzB58bft0JTko",
 | |
|               ext: true,
 | |
|           }
 | |
| 
 | |
|       -----BEGIN EC PARAMETERS-----
 | |
|       BggqhkjOPQMBBw==
 | |
|       -----END EC PARAMETERS-----
 | |
|       -----BEGIN EC PRIVATE KEY-----
 | |
|       MHcCAQEEIDm2RM5oZ8NPkn06MZlpz7yk6X0gJ7TeJGBAA3lJmJ/UoAoGCCqGSM49
 | |
|       AwEHoUQDQgAE2aCepzyydsM4oxfGMrtham2Do1U3AZSFNiuTLKMYqXTnp2LqNTVA
 | |
|       FdfmISGJve/PV53+MnCzwRcnrwQb1OfRMQ==
 | |
|       -----END EC PRIVATE KEY-----</textarea>
 | |
|                   <br/>
 | |
|                 </div>
 | |
|               </div>
 | |
| 
 | |
|             </div>
 | |
| 
 | |
| 
 | |
| 
 | |
|             <div ng-if="'domains' === vm.admin.page">
 | |
|               <h1>Managed Domains:</h1>
 | |
| 
 | |
|               <div ng-if="!vm.domains.length">
 | |
|                 You don't have any domains with this account.
 | |
|                 <br/>
 | |
|                 Try a different account?
 | |
|                 <br/>
 | |
|                 <input type="url" placeholder="https://daplie.domains">
 | |
|                 <button type="button"
 | |
|                   class="btn"
 | |
|                   disabled
 | |
|                   >Login</button>
 | |
|               </div>
 | |
| 
 | |
|               <div ng-if="vm.domains.length">
 | |
| 
 | |
|                 <table class="table">
 | |
|                   <tr>
 | |
|                     <td><select
 | |
|                       ng-if="vm.domains.length"
 | |
|                       ng-model="vm.domains.add.domain"
 | |
|                       ng-options="domain.domain as domain.domain for domain in vm.domains"
 | |
|                       ><option
 | |
|                         style="display:none" value="">-- select domain --</option
 | |
|                         ></select></td>
 | |
|                     <td><input
 | |
|                       type="text"
 | |
|                       placeholder="@"
 | |
|                       ng-model="vm.domains.add.sub"
 | |
|                       >.<input
 | |
|                       type="text"
 | |
|                       placeholder="example.com"
 | |
|                       ng-model="vm.domains.add.domain"
 | |
|                       ></td>
 | |
|                     <td><button
 | |
|                       type="button"
 | |
|                       class="btn btn-success"
 | |
|                       ng-click="vm.domains.add.commit(vm.domain.add.sub, vm.delta.domain)"
 | |
|                       >Add</button></td>
 | |
|                   </tr>
 | |
|                 </table>
 | |
|                 <table class="table">
 | |
|                   <tr>
 | |
|                     <th>Domain</th>
 | |
|                     <th>Sub</th>
 | |
|                     <th>Devices</th>
 | |
|                   </tr>
 | |
|                   <tr ng-repeat="d in vm.dns">
 | |
|                     <td ng-bind="d.domain"></td>
 | |
|                     <td ng-bind="d.name"></td>
 | |
|                     <td>
 | |
|                       <span ng-if="!d.domain">
 | |
|                         <div ng-repeat="dev in d.devices">
 | |
|                           <span ng-bind="dev"
 | |
|                             ></span> <button
 | |
|                             type="button"
 | |
|                             class="btn btn-danger"
 | |
|                             ng-click="vm.removeDevice(d, dev)"
 | |
|                             >x</button>
 | |
|                         </div>
 | |
|                       </span>
 | |
|                     </td>
 | |
|                   </tr>
 | |
|                 </table>
 | |
|               </div>
 | |
|             </div>
 | |
| 
 | |
|             <div ng-if="'plugins' === vm.admin.page">
 | |
|               <h1>Global Settings:</h1>
 | |
|               <br/>
 | |
|               <form class="form-inline">
 | |
|               <div ng-repeat="path in siteconf.paths">
 | |
|                 <h2 ng-bind="path.$id"></h2>
 | |
|                 <div ng-repeat="module in path.modules">
 | |
|                   <h3>{{module.$id}}</h3>
 | |
|                   <div ng-repeat="(key, value) in module">
 | |
|                     <label>{{key}}</label>: <input class="form-control" ng-model="module[key]" />
 | |
|                   </div>
 | |
|                 </div>
 | |
|                 <br/>
 | |
|                 <br/>
 | |
|                 <br/>
 | |
|               </div>
 | |
|               </form>
 | |
| 
 | |
|               <h1>Per-Domain Settings:</h1>
 | |
|               <div ng-repeat="siteconf in vm.config.sites">
 | |
|                 <h2 ng-bind="siteconf.$id"></h2>
 | |
|                 <div ng-repeat="path in siteconf.paths">
 | |
|                   <h2 ng-bind="path.$id"></h2>
 | |
|                   <div ng-repeat="module in path.modules">
 | |
|                     <h3>{{module.$id}}</h3>
 | |
|                     <div ng-repeat="(key, value) in module">
 | |
|                       <label>{{key}}</label>: <input class="form-control" ng-model="module[key]" />
 | |
|                     </div>
 | |
|                   </div>
 | |
|                   <br/>
 | |
|                   <br/>
 | |
|                   <br/>
 | |
|                 </div>
 | |
|               </div>
 | |
| 
 | |
|               <div ng-init="defaultsconf = vm.config.defaults">
 | |
|                 <h1>Fallback Settings:</h1>
 | |
|                 <br/>
 | |
|                 <div ng-repeat="path in siteconf.paths">
 | |
|                   <h2 ng-bind="path.$id"></h2>
 | |
|                   <div ng-repeat="module in path.modules">
 | |
|                     <h3>{{module.$id}}</h3>
 | |
|                     <div ng-repeat="(key, value) in module">
 | |
|                       <label>{{key}}</label>: <input class="form-control" ng-model="module[key]" />
 | |
|                     </div>
 | |
|                   </div>
 | |
|                   <br/>
 | |
|                   <br/>
 | |
|                   <br/>
 | |
|                 </div>
 | |
|               </div>
 | |
| 
 | |
|               <div ng-if="!vm._showvmconfig">
 | |
|                 <button class="btn-link" ng-click="vm._showvmconfig = true">show config as json</button>
 | |
|               </div>
 | |
|               <div ng-if="vm._showvmconfig">
 | |
|                 <button class="btn-link" ng-click="vm._showvmconfig = false">hide config</button>
 | |
|                 <pre><code ng-bind="vm.config | json">{{vm.config}}</code></pre>
 | |
|               </div>
 | |
|             </div>
 | |
|           </div>
 | |
|         </div>
 | |
|       </div>
 | |
|       </div>
 | |
| 
 | |
|     </div>
 | |
| 
 | |
|     <script src="/assets/com.jquery/jquery-3.1.1.js"></script>
 | |
|     <script src="/assets/com.google/angular.1.6.2.min.js"></script>
 | |
|     <script src="/assets/org.oauth3/oauth3.core.js"></script>
 | |
|     <script src="/assets/org.oauth3/oauth3.ng.js"></script>
 | |
|     <script src="/assets/org.oauth3/oauth3.domains.js"></script>
 | |
|     <script src="/assets/org.oauth3/oauth3.dns.js"></script>
 | |
|     <script src="/js/app.js"></script>
 | |
| 
 | |
|   </body>
 | |
| </html>
 |