|
|
|
@ -2,54 +2,117 @@
|
|
|
|
|
|
|
|
|
|
from django.http import HttpResponseRedirect
|
|
|
|
|
import json
|
|
|
|
|
import os
|
|
|
|
|
from ConfigParser import ConfigParser
|
|
|
|
|
import getpass
|
|
|
|
|
from Crypto.Cipher import AES
|
|
|
|
|
from binascii import b2a_hex, a2b_hex
|
|
|
|
|
import ldap
|
|
|
|
|
from ldap import modlist
|
|
|
|
|
|
|
|
|
|
from django.http import HttpResponse
|
|
|
|
|
from django.http import HttpResponse, Http404
|
|
|
|
|
|
|
|
|
|
from juser.models import User, UserGroup
|
|
|
|
|
from jasset.models import Asset, BisGroup
|
|
|
|
|
from jlog.models import Log
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def user_perm_group_api(user):
|
|
|
|
|
if user:
|
|
|
|
|
perm_list = []
|
|
|
|
|
user_group_all = user.group.all()
|
|
|
|
|
for user_group in user_group_all:
|
|
|
|
|
perm_list.extend(user_group.perm_set.all())
|
|
|
|
|
BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
|
|
|
|
CONF = ConfigParser()
|
|
|
|
|
CONF.read(os.path.join(BASE_DIR, 'jumpserver.conf'))
|
|
|
|
|
LOG_DIR = os.path.join(BASE_DIR, 'logs')
|
|
|
|
|
SSH_KEY_DIR = os.path.join(BASE_DIR, 'keys')
|
|
|
|
|
SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server')
|
|
|
|
|
KEY = CONF.get('web', 'key')
|
|
|
|
|
LOGIN_NAME = getpass.getuser()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PyCrypt(object):
|
|
|
|
|
"""This class used to encrypt and decrypt password."""
|
|
|
|
|
|
|
|
|
|
def __init__(self, key):
|
|
|
|
|
self.key = key
|
|
|
|
|
self.mode = AES.MODE_CBC
|
|
|
|
|
|
|
|
|
|
def encrypt(self, text):
|
|
|
|
|
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
|
|
|
|
length = 16
|
|
|
|
|
try:
|
|
|
|
|
count = len(text)
|
|
|
|
|
except TypeError:
|
|
|
|
|
raise ServerError('Encrypt password error, TYpe error.')
|
|
|
|
|
add = (length - (count % length))
|
|
|
|
|
text += ('\0' * add)
|
|
|
|
|
ciphertext = cryptor.encrypt(text)
|
|
|
|
|
return b2a_hex(ciphertext)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CRYPTOR = PyCrypt(KEY)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ServerError(Exception):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LDAPMgmt():
|
|
|
|
|
def __init__(self,
|
|
|
|
|
host_url,
|
|
|
|
|
base_dn,
|
|
|
|
|
root_cn,
|
|
|
|
|
root_pw):
|
|
|
|
|
self.ldap_host = host_url
|
|
|
|
|
self.ldap_base_dn = base_dn
|
|
|
|
|
self.conn = ldap.initialize(host_url)
|
|
|
|
|
self.conn.set_option(ldap.OPT_REFERRALS, 0)
|
|
|
|
|
self.conn.protocol_version = ldap.VERSION3
|
|
|
|
|
self.conn.simple_bind_s(root_cn, root_pw)
|
|
|
|
|
|
|
|
|
|
def list(self, filter, scope=ldap.SCOPE_SUBTREE, attr=None):
|
|
|
|
|
result = {}
|
|
|
|
|
try:
|
|
|
|
|
ldap_result = self.conn.search_s(self.ldap_base_dn, scope, filter, attr)
|
|
|
|
|
for entry in ldap_result:
|
|
|
|
|
name, data = entry
|
|
|
|
|
for k, v in data.items():
|
|
|
|
|
print '%s: %s' % (k, v)
|
|
|
|
|
result[k] = v
|
|
|
|
|
return result
|
|
|
|
|
except ldap.LDAPError, e:
|
|
|
|
|
print e
|
|
|
|
|
|
|
|
|
|
def add(self, dn, attrs):
|
|
|
|
|
try:
|
|
|
|
|
ldif = modlist.addModlist(attrs)
|
|
|
|
|
self.conn.add_s(dn, ldif)
|
|
|
|
|
except ldap.LDAPError, e:
|
|
|
|
|
print e
|
|
|
|
|
|
|
|
|
|
def modify(self, dn, attrs):
|
|
|
|
|
try:
|
|
|
|
|
attr_s = []
|
|
|
|
|
for k, v in attrs.items():
|
|
|
|
|
attr_s.append((2, k, v))
|
|
|
|
|
self.conn.modify_s(dn, attr_s)
|
|
|
|
|
except ldap.LDAPError, e:
|
|
|
|
|
print e
|
|
|
|
|
|
|
|
|
|
def delete(self, dn):
|
|
|
|
|
try:
|
|
|
|
|
self.conn.delete_s(dn)
|
|
|
|
|
except ldap.LDAPError, e:
|
|
|
|
|
print e
|
|
|
|
|
|
|
|
|
|
def decrypt(self, text):
|
|
|
|
|
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
|
|
|
|
try:
|
|
|
|
|
plain_text = cryptor.decrypt(a2b_hex(text))
|
|
|
|
|
except TypeError:
|
|
|
|
|
raise ServerError('Decrypt password error, TYpe error.')
|
|
|
|
|
return plain_text.rstrip('\0')
|
|
|
|
|
|
|
|
|
|
asset_group_list = []
|
|
|
|
|
for perm in perm_list:
|
|
|
|
|
asset_group_list.append(perm.asset_group)
|
|
|
|
|
return asset_group_list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def user_perm_asset_api(username):
|
|
|
|
|
user = User.objects.filter(username=username)
|
|
|
|
|
if user:
|
|
|
|
|
user = user[0]
|
|
|
|
|
asset_list = []
|
|
|
|
|
asset_group_list = user_perm_group_api(user)
|
|
|
|
|
for asset_group in asset_group_list:
|
|
|
|
|
asset_list.extend(asset_group.asset_set.all())
|
|
|
|
|
|
|
|
|
|
return asset_list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def asset_perm_api(asset):
|
|
|
|
|
if asset:
|
|
|
|
|
perm_list = []
|
|
|
|
|
asset_group_all = asset.bis_group.all()
|
|
|
|
|
for asset_group in asset_group_all:
|
|
|
|
|
perm_list.extend(asset_group.perm_set.all())
|
|
|
|
|
|
|
|
|
|
user_group_list = []
|
|
|
|
|
for perm in perm_list:
|
|
|
|
|
user_group_list.extend(perm.user_group.all())
|
|
|
|
|
|
|
|
|
|
user_permed_list = []
|
|
|
|
|
for user_group in user_group_list:
|
|
|
|
|
user_permed_list.extend(user_group.user_set.all())
|
|
|
|
|
return user_permed_list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def require_login(func):
|
|
|
|
@ -79,21 +142,73 @@ def require_admin(func):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_super_user(request):
|
|
|
|
|
if request.session.get('role_id') == '2':
|
|
|
|
|
if request.session.get('role_id') == 2:
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_group_admin(request):
|
|
|
|
|
if request.session.get('role_id') == '1':
|
|
|
|
|
if request.session.get('role_id') == 1:
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def api_user(request):
|
|
|
|
|
hosts = Log.objects.filter(is_finished=0).count()
|
|
|
|
|
users = Log.objects.filter(is_finished=0).values('user').distinct().count()
|
|
|
|
|
ret = {'users': users, 'hosts': hosts}
|
|
|
|
|
json_data = json.dumps(ret)
|
|
|
|
|
return HttpResponse(json_data)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def view_splitter(request, su=None, adm=None):
|
|
|
|
|
if is_super_user(request):
|
|
|
|
|
return su(request)
|
|
|
|
|
elif is_group_admin(request):
|
|
|
|
|
return adm(request)
|
|
|
|
|
raise Http404
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def user_perm_group_api(user):
|
|
|
|
|
if user:
|
|
|
|
|
perm_list = []
|
|
|
|
|
user_group_all = user.group.all()
|
|
|
|
|
for user_group in user_group_all:
|
|
|
|
|
perm_list.extend(user_group.perm_set.all())
|
|
|
|
|
|
|
|
|
|
asset_group_list = []
|
|
|
|
|
for perm in perm_list:
|
|
|
|
|
asset_group_list.append(perm.asset_group)
|
|
|
|
|
return asset_group_list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def user_perm_asset_api(username):
|
|
|
|
|
user = User.objects.filter(username=username)
|
|
|
|
|
if user:
|
|
|
|
|
user = user[0]
|
|
|
|
|
asset_list = []
|
|
|
|
|
asset_group_list = user_perm_group_api(user)
|
|
|
|
|
for asset_group in asset_group_list:
|
|
|
|
|
asset_list.extend(asset_group.asset_set.all())
|
|
|
|
|
|
|
|
|
|
return asset_list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def asset_perm_api(asset):
|
|
|
|
|
if asset:
|
|
|
|
|
perm_list = []
|
|
|
|
|
asset_group_all = asset.bis_group.all()
|
|
|
|
|
for asset_group in asset_group_all:
|
|
|
|
|
perm_list.extend(asset_group.perm_set.all())
|
|
|
|
|
|
|
|
|
|
user_group_list = []
|
|
|
|
|
for perm in perm_list:
|
|
|
|
|
user_group_list.extend(perm.user_group.all())
|
|
|
|
|
|
|
|
|
|
user_permed_list = []
|
|
|
|
|
for user_group in user_group_list:
|
|
|
|
|
user_permed_list.extend(user_group.user_set.all())
|
|
|
|
|
return user_permed_list
|
|
|
|
|