mirror of
https://github.com/retspen/webvirtcloud
synced 2024-12-25 23:55:24 +00:00
Added models and telmplate for sshkeys
This commit is contained in:
parent
bc90206531
commit
2d1f72a7e1
6 changed files with 111 additions and 2 deletions
25
accounts/migrations/0003_usersshkey.py
Normal file
25
accounts/migrations/0003_usersshkey.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('accounts', '0002_auto_20150325_0846'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UserSSHKey',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||||
|
('keyname', models.CharField(max_length=25)),
|
||||||
|
('keypublic', models.CharField(max_length=500)),
|
||||||
|
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -11,3 +11,12 @@ class UserInstance(models.Model):
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.instance.name
|
return self.instance.name
|
||||||
|
|
||||||
|
|
||||||
|
class UserSSHKey(models.Model):
|
||||||
|
user = models.ForeignKey(User)
|
||||||
|
keyname = models.CharField(max_length=25)
|
||||||
|
keypublic = models.CharField(max_length=500)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.keyname
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% load tags_fingerprint %}
|
||||||
{% block title %}{% trans "Profile" %}{% endblock %}
|
{% block title %}{% trans "Profile" %}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<!-- Page Heading -->
|
<!-- Page Heading -->
|
||||||
|
@ -66,6 +67,49 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
<h3 class="page-header">{% trans "SSH Keys" %}</h3>
|
||||||
|
{% if publickeys %}
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-hover">
|
||||||
|
<tbody style="text-align: center;">
|
||||||
|
{% for key in publickeys %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ key.keyname }} ({% ssh_to_fingerprint key.keypublic %})</td>
|
||||||
|
<td>
|
||||||
|
<form action="" method="post" role="form">{% csrf_token %}
|
||||||
|
<input type="hidden" name="keyid" value="{{ key.id }}"/>
|
||||||
|
<button type="submit" class="btn btn-sm btn-default" name="keydelete" title="{% trans "Delete" %}" onclick="return confirm('{% trans "Are you sure?" %}')">
|
||||||
|
<span class="glyphicon glyphicon-trash"></span>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<form class="form-horizontal" method="post" action="" role="form">{% csrf_token %}
|
||||||
|
<div class="form-group bridge_name_form_group_dhcp">
|
||||||
|
<label class="col-sm-2 control-label">{% trans "Retry" %}</label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<input type="text" class="form-control" name="keyname" placeholder="{% trans "Enter Name" %}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group bridge_name_form_group_dhcp">
|
||||||
|
<label class="col-sm-2 control-label">{% trans "Retry" %}</label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<textarea name="keypublic" class="form-control" rows="6" placeholder="{% trans "Enter Public Key" %}"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
|
<button type="submit" class="btn btn-primary">{% trans "Create" %}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
0
accounts/templatetags/__init__.py
Normal file
0
accounts/templatetags/__init__.py
Normal file
12
accounts/templatetags/tags_fingerprint.py
Normal file
12
accounts/templatetags/tags_fingerprint.py
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
from django import template
|
||||||
|
import base64
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
register = template.Library()
|
||||||
|
|
||||||
|
|
||||||
|
@register.simple_tag
|
||||||
|
def ssh_to_fingerprint(line):
|
||||||
|
key = base64.b64decode(line.strip().split()[1].encode('ascii'))
|
||||||
|
fp_plain = hashlib.md5(key).hexdigest()
|
||||||
|
return ':'.join(a+b for a, b in zip(fp_plain[::2], fp_plain[1::2]))
|
|
@ -3,7 +3,7 @@ from django.http import HttpResponseRedirect
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from accounts.models import UserInstance
|
from accounts.models import UserInstance, UserSSHKey
|
||||||
from instances.models import Instance
|
from instances.models import Instance
|
||||||
from accounts.forms import UserAddForm
|
from accounts.forms import UserAddForm
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ def profile(request):
|
||||||
|
|
||||||
error_messages = []
|
error_messages = []
|
||||||
user = User.objects.get(id=request.user.id)
|
user = User.objects.get(id=request.user.id)
|
||||||
|
publickeys = UserSSHKey.objects.filter(user_id=request.user.id)
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
if 'username' in request.POST:
|
if 'username' in request.POST:
|
||||||
|
@ -41,7 +42,25 @@ def profile(request):
|
||||||
user.set_password(password1)
|
user.set_password(password1)
|
||||||
user.save()
|
user.save()
|
||||||
return HttpResponseRedirect(request.get_full_path())
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
|
if 'keyname' in request.POST:
|
||||||
|
keyname = request.POST.get('keyname', '')
|
||||||
|
keypublic = request.POST.get('keypublic', '')
|
||||||
|
for key in publickeys:
|
||||||
|
if keyname == key.keyname:
|
||||||
|
msg = _("Key name already exist")
|
||||||
|
error_messages.append(msg)
|
||||||
|
if keypublic == key.keypublic:
|
||||||
|
msg = _("Public key already exist")
|
||||||
|
error_messages.append(msg)
|
||||||
|
if not error_messages:
|
||||||
|
addkeypublic = UserSSHKey(user_id=request.user.id, keyname=keyname, keypublic=keypublic)
|
||||||
|
addkeypublic.save()
|
||||||
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
|
if 'keydelete' in request.POST:
|
||||||
|
keyid = request.POST.get('keyid', '')
|
||||||
|
delkeypublic = UserSSHKey.objects.get(id=keyid)
|
||||||
|
delkeypublic.delete()
|
||||||
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
return render(request, 'profile.html', locals())
|
return render(request, 'profile.html', locals())
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue