checking in all work done so far because what if my SSD dies?
This commit is contained in:
7
net/ssh/hostkeymanager/app/__init__.py
Normal file
7
net/ssh/hostkeymanager/app/__init__.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from flask import Flask
|
||||
|
||||
app = Flask(__name__, instance_relative_config=True)
|
||||
|
||||
from app import views
|
||||
|
||||
app.config.from_object('config')
|
||||
41
net/ssh/hostkeymanager/app/manage.py
Executable file
41
net/ssh/hostkeymanager/app/manage.py
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
import os
|
||||
# This is ugly as fuck. TODO: can we do this more cleanly?
|
||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))
|
||||
import config
|
||||
|
||||
class DBmgr(object):
|
||||
def __init__(self, args = None):
|
||||
self.DB = config.DB
|
||||
self.args = args
|
||||
|
||||
def keyChk(self):
|
||||
# Is it a pubkey file?
|
||||
if os.path.isfile(os.path.abspath(os.path.expanduser(self.args['key']))):
|
||||
with open(os.path.abspath(os.path.expanduser(self.args['key'])), 'r') as f:
|
||||
self.args['key'] = f.read()
|
||||
self.args['key'] = self.args['key'].strip()
|
||||
|
||||
|
||||
def add(self, key, host, role):
|
||||
pass
|
||||
|
||||
def argParse():
|
||||
args = argparse.ArgumentParser()
|
||||
args.add_argument('-k',
|
||||
'--key',
|
||||
dest = 'key',
|
||||
default = None,
|
||||
type = 'str',
|
||||
|
||||
return(args)
|
||||
|
||||
def main():
|
||||
args -
|
||||
d = DBmgr(args)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
0
net/ssh/hostkeymanager/app/models.py
Normal file
0
net/ssh/hostkeymanager/app/models.py
Normal file
4
net/ssh/hostkeymanager/app/templates/about.html
Normal file
4
net/ssh/hostkeymanager/app/templates/about.html
Normal file
@@ -0,0 +1,4 @@
|
||||
{% extends "base.html" %}{% block title %}r00t^2 SSH Key Repository || About{% endblock %}{% block body %}<div class="jumbotron">
|
||||
<h1>About</h1></div>
|
||||
<p>This is a tool to deliver SSH public keys (or, optionally, host keys) to SSH's authentication system in a safe and secure manner.</p>
|
||||
{% endblock %}
|
||||
35
net/ssh/hostkeymanager/app/templates/base.html
Normal file
35
net/ssh/hostkeymanager/app/templates/base.html
Normal file
@@ -0,0 +1,35 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>{% block title %}{% endblock %}</title>
|
||||
<!-- Bootstrap core CSS -->
|
||||
<!-- Thanks, https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xii-facelift and
|
||||
https://scotch.io/tutorials/getting-started-with-flask-a-python-microframework -->
|
||||
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
|
||||
<!--<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">-->
|
||||
<!-- Custom styles for this template -->
|
||||
<link href="https://getbootstrap.com/examples/jumbotron-narrow/jumbotron-narrow.css" rel="stylesheet">
|
||||
<!--<link href="https://getbootstrap.com/docs/4.0/examples/offcanvas/offcanvas.css" rel="stylesheet">-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header clearfix">
|
||||
<nav>
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li role="presentation"><a href="/">Home</a></li>
|
||||
<li role="presentation"><a href="/about">About</a></li>
|
||||
<li role="presentation"><a href="/usage">Usage</a></li>
|
||||
<!-- the following opens in a new tab/window/whatever. the line after opens in the same tab/window/etc. -->
|
||||
<!-- <li role="presentation"><a href="https://square-r00t.net/" target="_blank">r00t^2</a></li> -->
|
||||
<li role="presentation"><a href="https://square-r00t.net/">r00t^2</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
{% block body %}{% endblock %}
|
||||
<footer class="footer">
|
||||
<p><sub>The code for this page is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.en.html#content">GPL 3.0 License</a>. It can be found <a href="https://git.square-r00t.net/OpTools/tree/net">here</a>.</sub></p>
|
||||
</footer>
|
||||
</div>
|
||||
<!-- /container -->
|
||||
</body>
|
||||
</html>
|
||||
38
net/ssh/hostkeymanager/app/templates/html.html
Normal file
38
net/ssh/hostkeymanager/app/templates/html.html
Normal file
@@ -0,0 +1,38 @@
|
||||
<h2>Client/Browser Information</h2>
|
||||
<p>This is information that your browser sends with its connection.</p>
|
||||
<p>
|
||||
<ul>
|
||||
<li><b>Client IP:</b> <a href="https://ipinfo.io/{{ visitor['ip'] }}">{{ visitor['ip'] }}</a></li>
|
||||
<li><b>Browser:</b> {{ '<a href="{0}">{1}</a>'.format(browsers[visitor['client']['browser']][0],
|
||||
browsers[visitor['client']['browser']][1])|safe
|
||||
if visitor['client']['browser'] in browsers.keys()
|
||||
else visitor['client']['browser'].title()
|
||||
if visitor['client']['browser'] is not none
|
||||
else '(N/A)' }}</li>
|
||||
<li><b>Language/Locale:</b> {{ visitor['client']['language'] or '(N/A)' }}</li>
|
||||
{%- set alt_os = alts[visitor['client']['os']] if visitor['client']['os'] in alts.keys() else '' %}
|
||||
<li><b>Operating System:</b> {{ '<a href="{0}">{1}</a>{2}'.format(os[visitor['client']['os']][0],
|
||||
os[visitor['client']['os']][1],
|
||||
alt_os)|safe
|
||||
if visitor['client']['os'] in os.keys()
|
||||
else visitor['client']['os'].title()
|
||||
if visitor['client']['os'] is not none
|
||||
else '(N/A)' }}</li>
|
||||
<li><b>User Agent:</b> {{ visitor['client']['str'] }}</li>
|
||||
<li><b>Version:</b> {{ visitor['client']['version'] or '(N/A)' }}</li>
|
||||
</ul>
|
||||
</p>
|
||||
<h2>Request Headers</h2>
|
||||
<p>These are headers sent along with the request your browser sends for the page's content.</p>
|
||||
<p>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Field</th>
|
||||
<th>Value</th>
|
||||
</tr>{% for k in visitor['headers'].keys()|sort(case_sensitive = True) %}
|
||||
<tr>
|
||||
<td>{{ k }}</td>
|
||||
<td>{{ visitor['headers'][k] if visitor['headers'][k] != '' else '(N/A)' }}</td>
|
||||
</tr>{% endfor %}
|
||||
</table>
|
||||
</p>
|
||||
6
net/ssh/hostkeymanager/app/templates/index.html
Normal file
6
net/ssh/hostkeymanager/app/templates/index.html
Normal file
@@ -0,0 +1,6 @@
|
||||
{% extends "base.html" %}{% block title %}r00t^2 Client Info Revealer{% endblock %}{% block body %}<div class="jumbotron">
|
||||
<h1>Client Info Revealer</h1>
|
||||
<p class="lead">A tool to reveal client-identifying data sent to webservers</p>
|
||||
</div>
|
||||
{% include 'html.html' if not params['json'] else 'json.html' %}
|
||||
{% endblock %}
|
||||
1
net/ssh/hostkeymanager/app/templates/json.html
Normal file
1
net/ssh/hostkeymanager/app/templates/json.html
Normal file
@@ -0,0 +1 @@
|
||||
<pre>{{ json }}</pre>
|
||||
51
net/ssh/hostkeymanager/app/templates/usage.html
Normal file
51
net/ssh/hostkeymanager/app/templates/usage.html
Normal file
@@ -0,0 +1,51 @@
|
||||
{% extends "base.html" %}{% block title %}r00t^2 Client Info Revealer || Usage{% endblock %}{% block body %}<div class="jumbotron">
|
||||
<h1>Usage</h1></div>
|
||||
<h2>Parameters</h2>
|
||||
<p>You can control how this page displays/renders. By default it will try to "guess" what you want; e.g. if you access it in Chrome, it will display this page but if you fetch via Curl, you'll get raw JSON. The following parameters control this behavior.</p>
|
||||
<p><i><b>Note:</b> "Enabled" parameter values can be one of <b>y</b>, <b>yes</b>, <b>1</b>, or <b>true</b>. "Disabled" parameter values can be one of <b>n</b>, <b>no</b>, <b>0</b>, or <b>false</b>. The parameter names are case-sensitive but the values are not.</i></p>
|
||||
<p><ul>
|
||||
<li><b>json:</b> Force rendering in JSON format
|
||||
<ul>
|
||||
<li>It will display it nicely if you're in a browser, otherwise it will return raw/plaintext JSON.</li>
|
||||
<li>Use <b>raw</b> if you want to force raw plaintext JSON output.</li>
|
||||
</ul></li>
|
||||
<li><b>html:</b> Force rendering in HTML
|
||||
<ul>
|
||||
<li>It will render HTML in clients that would normally render as JSON (e.g. curl, wget).</li>
|
||||
</ul></li>
|
||||
<li><b>raw:</b> Force output into a raw JSON string
|
||||
<ul>
|
||||
<li>Pure JSON instead of HTML or formatted JSON. This is suitable for API usages if your client is detected wrongly (or you just want to get the raw JSON).</li>
|
||||
<li>Overrides all other tags.</li>
|
||||
<li>Has no effect for clients that would normally render as JSON (curl, wget, etc.).</li>
|
||||
</ul></li>
|
||||
<li><b>tabs:</b> Indentation for JSON output
|
||||
<ul>
|
||||
<li>Accepts a positive integer.</li>
|
||||
<li>Default is 4 for "desktop" browsers (if <b>json</b> is enabled), and no indentation otherwise.</li>
|
||||
</ul></li>
|
||||
</ul></p>
|
||||
<h2>Examples</h2>{% set scheme = 'https' if request.is_secure else 'http'%}
|
||||
<p><table>
|
||||
<tr>
|
||||
<th>URL</th>
|
||||
<th>Behavior</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="{{ scheme }}://{{ request.headers['host'] }}/">{{ scheme }}://{{ request.headers['host'] }}/</a></td>
|
||||
<td>Displays HTML and "Human" formatting if in a graphical browser, otherwise returns a raw, unformatted JSON string.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="{{ scheme }}://{{ request.headers['host'] }}/?raw=1">{{ scheme }}://{{ request.headers['host'] }}/?raw=1</a></td>
|
||||
<td>Renders a raw, unformatted JSON string if in a graphical browser, otherwise no effect. All other parameters ignored (if in a graphical browser).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="{{ scheme }}://{{ request.headers['host'] }}/?html=1">{{ scheme }}://{{ request.headers['host'] }}/?html=1</a></td>
|
||||
<td>Forces HTML rendering on non-graphical clients.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="{{ scheme }}://{{ request.headers['host'] }}/?json=1&tabs=4">{{ scheme }}://{{ request.headers['host'] }}/?json=1&tabs=4</a></td>
|
||||
<td>Returns JSON indented by 4 spaces for each level (you can leave "json=1" off if it's in a non-graphical browser, unless you specified "html=1").</td>
|
||||
</tr>
|
||||
</table></p>
|
||||
{% endblock %}
|
||||
57
net/ssh/hostkeymanager/app/views.py
Normal file
57
net/ssh/hostkeymanager/app/views.py
Normal file
@@ -0,0 +1,57 @@
|
||||
import json
|
||||
import re
|
||||
from flask import render_template, make_response, request
|
||||
from app import app
|
||||
|
||||
@app.route('/', methods = ['GET']) #@app.route('/')
|
||||
def index():
|
||||
hostkeys = None # TODO: hostkeys go here. dict?
|
||||
# First we define interactive browsers
|
||||
_intbrowsers = ['camino', 'chrome', 'firefox', 'galeon',
|
||||
'kmeleon', 'konqueror', 'links', 'lynx']
|
||||
# Then we set some parameter options for less typing later on.
|
||||
_yes = ('y', 'yes', 'true', '1', True)
|
||||
_no = ('y', 'no', 'false', '0', False, 'none')
|
||||
# http://werkzeug.pocoo.org/docs/0.12/utils/#module-werkzeug.useragents
|
||||
# We have to convert these to strings so we can do tuple comparisons on lower()s.
|
||||
params = {'json': str(request.args.get('json')).lower(),
|
||||
'html': str(request.args.get('html')).lower(),
|
||||
'raw': str(request.args.get('raw')).lower()}
|
||||
if request.user_agent.browser in _intbrowsers:
|
||||
if params['html'] == 'none':
|
||||
params['html'] = True
|
||||
if params['json'] == 'none':
|
||||
params['json'] = False
|
||||
elif params['json'] in _yes:
|
||||
params['json'] = True
|
||||
for k in params.keys():
|
||||
if params[k] in _no:
|
||||
params[k] = False
|
||||
else:
|
||||
params[k] = True
|
||||
# Set the tabs for JSON
|
||||
try:
|
||||
params['tabs'] = int(request.args.get('tabs'))
|
||||
except (ValueError, TypeError):
|
||||
if request.user_agent.browser in _intbrowsers or params['html']:
|
||||
params['tabs'] = 4
|
||||
else:
|
||||
params['tabs'] = None
|
||||
j = json.dumps(hostkeys, indent = params['tabs'])
|
||||
if (request.user_agent.browser in _intbrowsers and params['html'] and not params['raw']) or \
|
||||
(request.user_agent.browser not in _intbrowsers and params['html']):
|
||||
return(render_template('index.html', hostkeys = hostkeys))
|
||||
else:
|
||||
if visitor['client']['browser'] in _intbrowsers.keys() and not params['raw']:
|
||||
return(render_template('json.html',
|
||||
json = j,
|
||||
params = params))
|
||||
return(j)
|
||||
|
||||
@app.route('/about', methods = ['GET'])
|
||||
def about():
|
||||
return(render_template('about.html'))
|
||||
|
||||
@app.route('/usage', methods = ['GET'])
|
||||
def usage():
|
||||
return(render_template('usage.html'))
|
||||
Reference in New Issue
Block a user