修改密钥密码后重新生成key, 普通用户首页

pull/6/head
guanghongwei 2015-04-08 17:32:56 +08:00
parent bd0fd90e2d
commit 2035a49c40
13 changed files with 204 additions and 21 deletions

View File

@ -3,15 +3,11 @@
import ast import ast
from django.db.models import Q from django.db.models import Q
from django.http import Http404
from django.http import HttpResponseRedirect
from django.template import RequestContext from django.template import RequestContext
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from models import IDC, Asset, BisGroup from models import IDC, Asset, BisGroup
from juser.models import UserGroup, DEPT from juser.models import UserGroup, DEPT
from connect import PyCrypt, KEY
from jlog.models import Log
from jumpserver.views import jasset_host_edit, pages from jumpserver.views import jasset_host_edit, pages
from jumpserver.api import * from jumpserver.api import *

View File

@ -281,6 +281,7 @@ def user_perm_asset_api(username):
asset_list.extend(asset_group.asset_set.all()) asset_list.extend(asset_group.asset_set.all())
return asset_list return asset_list
return []
def asset_perm_api(asset): def asset_perm_api(asset):

View File

@ -108,7 +108,6 @@ TEMPLATE_DIRS = (
STATICFILES_DIRS = ( STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"), os.path.join(BASE_DIR, "static"),
os.path.join(BASE_DIR, "keys"),
) )
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/1.7/topics/i18n/ # https://docs.djangoproject.com/en/1.7/topics/i18n/

View File

@ -12,9 +12,12 @@ urlpatterns = patterns('',
(r'^base/$', 'jumpserver.views.base'), (r'^base/$', 'jumpserver.views.base'),
(r'^login/$', 'jumpserver.views.login'), (r'^login/$', 'jumpserver.views.login'),
(r'^logout/$', 'jumpserver.views.logout'), (r'^logout/$', 'jumpserver.views.logout'),
(r'^upload/$', 'jumpserver.views.upload'),
(r'^download/$', 'jumpserver.views.download'),
(r'^juser/', include('juser.urls')), (r'^juser/', include('juser.urls')),
(r'^jasset/', include('jasset.urls')), (r'^jasset/', include('jasset.urls')),
(r'^jlog/', include('jlog.urls')), (r'^jlog/', include('jlog.urls')),
(r'^jperm/', include('jperm.urls')), (r'^jperm/', include('jperm.urls')),
) )

View File

@ -44,6 +44,25 @@ def get_data(data, items, option):
@require_login @require_login
def index_cu(request): def index_cu(request):
user_id = request.session.get('user_id')
user = User.objects.filter(id=user_id)
if user:
user = user[0]
login_types = {'L': 'LDAP', 'M': 'MAP'}
user_id = request.session.get('user_id')
username = User.objects.get(id=user_id).name
posts = user_perm_asset_api(username)
host_count = len(posts)
new_posts = []
post_five = []
for post in posts:
if len(post_five) < 5:
post_five.append(post)
else:
new_posts.append(post_five)
post_five = []
new_posts.append(post_five)
return render_to_response('index_cu.html', locals(), context_instance=RequestContext(request)) return render_to_response('index_cu.html', locals(), context_instance=RequestContext(request))
@ -237,3 +256,6 @@ def install(request):
name='group_admin', email='group_admin@jumpserver.org', role='DA', is_active=True, dept=dept2).save() name='group_admin', email='group_admin@jumpserver.org', role='DA', is_active=True, dept=dept2).save()
return HttpResponse('Ok') return HttpResponse('Ok')
def upload(request):
pass

View File

@ -29,4 +29,5 @@ urlpatterns = patterns('juser.views',
(r'^profile/$', 'profile'), (r'^profile/$', 'profile'),
(r'^chg_info/$', 'chg_info'), (r'^chg_info/$', 'chg_info'),
(r'^chg_role/$', 'chg_role'), (r'^chg_role/$', 'chg_role'),
(r'^down_key/$', 'down_key'),
) )

View File

@ -6,7 +6,6 @@ import random
import subprocess import subprocess
from Crypto.PublicKey import RSA from Crypto.PublicKey import RSA
import crypt import crypt
import datetime
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
@ -32,9 +31,10 @@ def bash(cmd):
return subprocess.call(cmd, shell=True) return subprocess.call(cmd, shell=True)
def is_dir(dir_name, mode=0755): def is_dir(dir_name, username='root', mode=0755):
if not os.path.isdir(dir_name): if not os.path.isdir(dir_name):
os.makedirs(dir_name) os.makedirs(dir_name)
bash("chown %s:%s '%s'" % (username, username, dir_name))
os.chmod(dir_name, mode) os.chmod(dir_name, mode)
@ -113,7 +113,7 @@ def gen_ssh_key(username, password=None, length=2048):
public_key_dir = '/home/%s/.ssh/' % username public_key_dir = '/home/%s/.ssh/' % username
public_key_file = os.path.join(public_key_dir, 'authorized_keys') public_key_file = os.path.join(public_key_dir, 'authorized_keys')
is_dir(private_key_dir) is_dir(private_key_dir)
is_dir(public_key_dir, mode=0700) is_dir(public_key_dir, username, mode=0700)
key = RSA.generate(length) key = RSA.generate(length)
with open(private_key_file, 'w') as pri_f: with open(private_key_file, 'w') as pri_f:
@ -128,7 +128,7 @@ def gen_ssh_key(username, password=None, length=2048):
def server_add_user(username, password, ssh_key_pwd): def server_add_user(username, password, ssh_key_pwd):
bash('useradd %s; echo %s | passwd --stdin %s' % (username, password, username)) bash("useradd '%s'; echo '%s' | passwd --stdin '%s'" % (username, password, username))
gen_ssh_key(username, ssh_key_pwd) gen_ssh_key(username, ssh_key_pwd)
@ -883,6 +883,7 @@ def user_edit(request):
password = md5_crypt(password) password = md5_crypt(password)
if ssh_key_pwd != user.ssh_key_pwd: if ssh_key_pwd != user.ssh_key_pwd:
gen_ssh_key(user.username, ssh_key_pwd)
ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd) ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd)
db_update_user(user_id=user_id, db_update_user(user_id=user_id,
@ -991,9 +992,42 @@ def chg_info(request):
password = md5_crypt(password) password = md5_crypt(password)
if ssh_key_pwd != user.ssh_key_pwd: if ssh_key_pwd != user.ssh_key_pwd:
gen_ssh_key(user.username, ssh_key_pwd)
ssh_key_pwd = md5_crypt(ssh_key_pwd) ssh_key_pwd = md5_crypt(ssh_key_pwd)
user_set.update(name=name, password=password, ssh_key_pwd=ssh_key_pwd, email=email) user_set.update(name=name, password=password, ssh_key_pwd=ssh_key_pwd, email=email)
msg = '淇敼鎴愬姛' msg = '淇敼鎴愬姛'
return render_to_response('juser/chg_info.html', locals(), context_instance=RequestContext(request)) return render_to_response('juser/chg_info.html', locals(), context_instance=RequestContext(request))
@require_login
def down_key(request):
user_id = ''
if is_super_user(request):
user_id = request.GET.get('id')
if is_group_admin(request):
user_id = request.GET.get('id')
if not validate(request, user=[user_id]):
user_id = request.session.get('user_id')
if is_common_user(request):
user_id = request.session.get('user_id')
if user_id:
user = User.objects.filter(id=user_id)
if user:
user = user[0]
username = user.username
private_key_dir = os.path.join(BASE_DIR, 'keys/jumpserver/')
private_key_file = os.path.join(private_key_dir, username+".pem")
if os.path.isfile(private_key_file):
f = open(private_key_file)
data = f.read()
f.close()
response = HttpResponse(data, content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(private_key_file)
return response
return HttpResponse('No Key File. Contact Admin.')

View File

@ -1,8 +1,9 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load mytags %}
{% block content %} {% block content %}
{% include 'nav_cat_bar.html' %} {% include 'nav_cat_bar.html' %}
<div class="wrapper wrapper-content"> <div class="wrapper wrapper-content" xmlns="http://www.w3.org/1999/html">
<div class="row"> <div class="row">
<div class="col-lg-8"> <div class="col-lg-8">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
@ -27,9 +28,132 @@
</div> </div>
</div> </div>
<div class="ibox-content"> <div class="ibox-content" style="line-height: 26px">
helo <span style="font-size: large"></span>杩庝娇鐢<span class="text-navy"><b>Jumpserver</b></span>璺虫澘鏈虹郴缁燂紝
棣栧厛闇瑕 <b><a href="/juser/down_key/?id={{ user.id }}">涓嬭浇</a></b> 鐧诲綍璺虫澘鏈虹殑SSH瀵嗛挜鏂囦欢鐒跺悗瀵煎叆鍒板伐鍏锋垨鑰卻sh鍛戒护鎸囧畾瀵嗛挜鏂囦欢(纭繚瀵嗛挜鏂囦欢鏉冮檺600)锛岃緭鍏ユ敹鍒扮殑瀵嗛挜瀵嗙爜锛岀櫥褰曡烦鏉挎満銆
鐧诲綍鍚庢牴鎹彁绀鸿繘琛屾搷浣溿傝烦鏉挎満web鐣岄潰鏀寔淇敼瀵嗙爜銆佷釜浜轰俊鎭拰涓婁紶涓嬭浇鏂囦欢绛夊姛鑳鍙互鍚戠鐞嗗憳鐢宠鏉冮檺銆
</div> </div>
</div>
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5> 宸叉巿鏉冧富鏈 </h5>
<div class="ibox-tools">
<div class="label label-primary float-left"><b>鎬诲叡锛歿{ host_count }}</b></div>
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">鏈惎鐢 1</a>
</li>
<li><a href="#">鏈惎鐢 2</a>
</li>
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<table class="table table-striped">
{% for host_five in new_posts %}
<tr>
{% for host in host_five %}
<td>{{ host.ip }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{% ifequal host_count 0 %}
(绌)
{% endifequal %}
</div>
</div>
</div>
<div class="col-lg-4">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span class="label label-primary"><b>{{ user.name }}</b></span>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#"></a>
</li>
<li><a href="#"></a>
</li>
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<div>
<div class="text-left">
<table class="table">
<tr>
<td class="text-navy">ID</td>
<td>{{ user.id }}</td>
</tr>
<tr>
<td class="text-navy">鐢ㄦ埛鍚</td>
<td>{{ user.username }}</td>
</tr>
<tr>
<td class="text-navy">濮撳悕</td>
<td>{{ user.name }}</td>
</tr>
<tr>
<td class="text-navy">瑙掕壊</td>
<td>{{ user.id | get_role }}</td>
</tr>
<tr>
<td class="text-navy">閮ㄩ棬</td>
<td>{{ user.dept.name }}</td>
</tr>
<tr>
<td class="text-navy">Email</td>
<td>{{ user.email }}</td>
</tr>
<tr>
<td class="text-navy">婵娲</td>
<td>{{ user.is_active|bool2str }}</td>
</tr>
<tr>
<td class="text-navy">娣诲姞鏃ユ湡</td>
<td>{{ user.date_joined|date:"Y-m-d H:i:s" }}</td>
</tr>
<tr>
<td class="text-navy">鏈鍚庣櫥褰</td>
<td>{{ user.last_login|date:"Y-m-d H:i:s" }}</td>
</tr>
<tr>
<td class="text-navy">鎵鍦ㄧ敤鎴风粍</td>
<td>
<table class="table">
{% for group in user.group.all %}
<tr>
<td>{{ group.name }}</td>
</tr>
{% endfor %}
</table>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -63,7 +63,7 @@
<div class="col-sm-8"> <div class="col-sm-8">
<input id="ssh_key_pwd" name="ssh_key_pwd" placeholder="SSH Key Password" type="password" class="form-control" value="{{ user.ssh_key_pwd }}"> <input id="ssh_key_pwd" name="ssh_key_pwd" placeholder="SSH Key Password" type="password" class="form-control" value="{{ user.ssh_key_pwd }}">
<span class="help-block m-b-none"> <span class="help-block m-b-none">
鐧婚檰 Jumpserver 浣跨敤鐨凷SH瀵嗛挜鐨勫瘑鐮 鐧婚檰 Jumpserver 浣跨敤鐨凷SH瀵嗛挜鐨勫瘑鐮,鏇存敼瀵嗛挜瀵嗙爜闇瑕侀噸鏂颁笅杞藉瘑閽
</span> </span>
</div> </div>
</div> </div>

View File

@ -136,6 +136,9 @@
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
{% if not user|get_user_asset_group %}
(鏃)
{% endif %}
</div> </div>
</div> </div>
</div> </div>
@ -164,6 +167,9 @@
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
{% if not logs_last %}
(鏃)
{% endif %}
</div> </div>
<button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> Show All</button> <button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> Show All</button>

View File

@ -59,7 +59,7 @@
<div class="col-sm-8"> <div class="col-sm-8">
<input id="ssh_key_pwd" name="ssh_key_pwd" placeholder="SSH Key Password" type="password" class="form-control" value="{{ user.ssh_key_pwd }}"> <input id="ssh_key_pwd" name="ssh_key_pwd" placeholder="SSH Key Password" type="password" class="form-control" value="{{ user.ssh_key_pwd }}">
<span class="help-block m-b-none"> <span class="help-block m-b-none">
鐧婚檰 Jumpserver 浣跨敤鐨凷SH瀵嗛挜鐨勫瘑鐮 鐧婚檰 Jumpserver 浣跨敤鐨凷SH瀵嗛挜鐨勫瘑鐮锛屾洿鏀瑰瘑閽ュ瘑鐮侀渶瑕侀噸鏂颁笅杞藉瘑閽
</span> </span>
</div> </div>
</div> </div>

View File

@ -72,7 +72,7 @@
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.group.all | group_str2 }} </td> <td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.group.all | group_str2 }} </td>
<td class="text-center"> {{ user.id | get_role }}</td> <td class="text-center"> {{ user.id | get_role }}</td>
<td class="text-center">{{ user.is_active|bool2str }}</td> <td class="text-center">{{ user.is_active|bool2str }}</td>
<td class="text-center"><a href="/static/jumpserver/{{ user.username }}.pem">涓嬭浇</a></td> <td class="text-center"><a href="/juser/down_key/?id={{ user.id }}">涓嬭浇</a></td>
<td class="text-center"> <td class="text-center">
<a href="../user_detail/?id={{ user.id }}" class="btn btn-xs btn-primary">璇︽儏</a> <a href="../user_detail/?id={{ user.id }}" class="btn btn-xs btn-primary">璇︽儏</a>
{% ifequal session_role_id 2 %} {% ifequal session_role_id 2 %}

View File

@ -136,7 +136,7 @@
<li> <li>
<a href="/"><i class="fa fa-th-large"></i> <span class="nav-label">浠〃鐩</span><span class="label label-info pull-right"></span></a> <a href="/"><i class="fa fa-th-large"></i> <span class="nav-label">浠〃鐩</span><span class="label label-info pull-right"></span></a>
</li> </li>
<li> <li class="user_detail">
<a href="/juser/user_detail/?id={{ session_user_id }}"><i class="fa fa-rebel"></i> <span class="nav-label">涓汉淇℃伅</span><span class="label label-info pull-right"></span></a> <a href="/juser/user_detail/?id={{ session_user_id }}"><i class="fa fa-rebel"></i> <span class="nav-label">涓汉淇℃伅</span><span class="label label-info pull-right"></span></a>
</li> </li>
<li id="jasset"> <li id="jasset">
@ -156,13 +156,10 @@
<li> <li>
<a href="#"><i class="fa fa-download"></i> <span class="nav-label">涓婁紶涓嬭浇</span><span class="fa arrow"></span></a> <a href="#"><i class="fa fa-download"></i> <span class="nav-label">涓婁紶涓嬭浇</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level"> <ul class="nav nav-second-level">
<li><a href="/file/upload/">鏂囦欢涓婁紶</a></li> <li><a href="/upload/">鏂囦欢涓婁紶</a></li>
<li><a href="/file/download/">鏂囦欢涓嬭浇</a></li> <li><a href="/download/">鏂囦欢涓嬭浇</a></li>
</ul> </ul>
</li> </li>
<li>
<a href="/"><i class="fa fa-files-o"></i> <span class="nav-label">浣跨敤璇存槑</span><span class="label label-info pull-right"></span></a>
</li>
<li class="special_link"> <li class="special_link">
<a href="http://www.jumpserver.org" target="_blank"><i class="fa fa-database"></i> <span class="nav-label">璁块棶瀹樼綉</span></a> <a href="http://www.jumpserver.org" target="_blank"><i class="fa fa-database"></i> <span class="nav-label">璁块棶瀹樼綉</span></a>