Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
5b4ce709
Commit
5b4ce709
authored
Dec 21, 2016
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add private token and change user group
parent
875aaa00
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
91 additions
and
36 deletions
+91
-36
asset.py
apps/assets/models/asset.py
+2
-4
group.py
apps/assets/models/group.py
+1
-1
idc.py
apps/assets/models/idc.py
+1
-1
user.py
apps/assets/models/user.py
+4
-2
settings.py
apps/jumpserver/settings.py
+0
-1
api.py
apps/terminal/api.py
+12
-0
forms.py
apps/terminal/forms.py
+1
-1
models.py
apps/terminal/models.py
+35
-8
__init__.py
apps/users/models/__init__.py
+1
-3
authentication.py
apps/users/models/authentication.py
+22
-5
group.py
apps/users/models/group.py
+3
-3
user.py
apps/users/models/user.py
+5
-4
utils.py
apps/users/models/utils.py
+4
-3
No files found.
apps/assets/models/asset.py
View file @
5b4ce709
...
...
@@ -73,7 +73,7 @@ class Asset(models.Model):
def
__unicode__
(
self
):
return
'
%(ip)
s:
%(port)
s'
%
{
'ip'
:
self
.
ip
,
'port'
:
self
.
port
}
__str__
=
__unicode__
()
__str__
=
__unicode__
@property
def
is_valid
(
self
):
...
...
@@ -88,7 +88,6 @@ class Asset(models.Model):
pass
class
Meta
:
db_table
=
'asset'
unique_together
=
(
'ip'
,
'port'
)
@classmethod
...
...
@@ -126,4 +125,4 @@ class Tag(models.Model):
__str__
=
__unicode__
class
Meta
:
db_table
=
'tag'
\ No newline at end of file
ordering
=
[
'name'
]
apps/assets/models/group.py
View file @
5b4ce709
...
...
@@ -25,7 +25,7 @@ class AssetGroup(models.Model):
return
self
.
name
class
Meta
:
db_table
=
'asset_group'
ordering
=
[
'name'
]
@classmethod
def
initial
(
cls
):
...
...
apps/assets/models/idc.py
View file @
5b4ce709
...
...
@@ -34,7 +34,7 @@ class IDC(models.Model):
return
cls
.
objects
.
get_or_create
(
name
=
_
(
'Default'
),
created_by
=
_
(
'System'
),
comment
=
_
(
'Default IDC'
))[
0
]
class
Meta
:
db_table
=
'idc'
ordering
=
[
'name'
]
@classmethod
def
generate_fake
(
cls
,
count
=
100
):
...
...
apps/assets/models/user.py
View file @
5b4ce709
...
...
@@ -37,6 +37,8 @@ class AdminUser(models.Model):
def
__unicode__
(
self
):
return
self
.
name
__str__
=
__unicode__
@property
def
password
(
self
):
return
signer
.
unsign
(
self
.
_password
)
...
...
@@ -66,7 +68,7 @@ class AdminUser(models.Model):
return
self
.
assets
.
count
()
class
Meta
:
db_table
=
'admin_user'
ordering
=
[
'name'
]
@classmethod
def
generate_fake
(
cls
,
count
=
100
):
...
...
@@ -161,7 +163,7 @@ class SystemUser(models.Model):
return
self
.
asset_groups
.
count
()
class
Meta
:
db_table
=
'system_user'
ordering
=
[
'name'
]
@classmethod
def
generate_fake
(
cls
,
count
=
100
):
...
...
apps/jumpserver/settings.py
View file @
5b4ce709
...
...
@@ -60,7 +60,6 @@ INSTALLED_APPS = [
'common.apps.CommonConfig'
,
'terminal.apps.TerminalConfig'
,
'rest_framework'
,
'rest_framework.authtoken'
,
'bootstrapform'
,
'captcha'
,
'django.contrib.auth'
,
...
...
apps/terminal/api.py
View file @
5b4ce709
...
...
@@ -14,6 +14,18 @@ from .serializers import TerminalSerializer, TerminalHeatbeatSerializer
from
.hands
import
IsSuperUserOrTerminalUser
,
User
class
TerminalRegister
(
ListCreateAPIView
):
queryset
=
Terminal
.
objects
.
all
()
serializer_class
=
TerminalSerializer
permission_classes
=
(
AllowAny
,)
def
create
(
self
,
request
,
*
args
,
**
kwargs
):
name
=
signer
.
unsign
(
request
.
data
.
get
(
'name'
,
''
))
remote_addr
=
request
.
Meta
.
get
(
'REMOTE_ADDR'
)
serializer
=
self
.
serializer_class
({
'name'
:
name
,
'remote_addr'
:
remote_addr
})
class
TerminalViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
Terminal
.
objects
.
all
()
...
...
apps/terminal/forms.py
View file @
5b4ce709
...
...
@@ -10,7 +10,7 @@ from .models import Terminal
class
TerminalForm
(
forms
.
ModelForm
):
class
Meta
:
model
=
Terminal
fields
=
[
'name'
,
'
ip'
,
'is_active
'
,
'type'
,
'url'
,
'comment'
]
fields
=
[
'name'
,
'
remote_addr
'
,
'type'
,
'url'
,
'comment'
]
help_texts
=
{
'url'
:
'Example: ssh://192.168.1.1:22 or http://jms.jumpserver.org, that user login'
}
...
...
apps/terminal/models.py
View file @
5b4ce709
...
...
@@ -8,20 +8,42 @@ from users.models import User
class
Terminal
(
models
.
Model
):
TYPE_CHOICES
=
(
(
'S'
,
'SSH Terminal'
),
(
'W
T
'
,
'Web Terminal'
)
(
'S
SH
'
,
'SSH Terminal'
),
(
'W
eb
'
,
'Web Terminal'
)
)
name
=
models
.
CharField
(
max_length
=
30
,
unique
=
True
,
verbose_name
=
_
(
'Name'
))
ip
=
models
.
GenericIPAddressField
(
verbose_name
=
_
(
'From ip'
))
is_active
=
models
.
BooleanField
(
default
=
False
,
verbose_name
=
_
(
'Is active'
))
is_bound_ip
=
models
.
BooleanField
(
default
=
False
,
verbose_name
=
_
(
'Is bound ip'
))
remote_addr
=
models
.
GenericIPAddressField
(
verbose_name
=
_
(
'Remote address'
),
blank
=
True
,
null
=
True
)
type
=
models
.
CharField
(
choices
=
TYPE_CHOICES
,
max_length
=
2
,
verbose_name
=
_
(
'Terminal type'
))
user
=
models
.
OneToOneField
(
User
,
verbose_name
=
'Application user'
,
null
=
True
)
url
=
models
.
CharField
(
max_length
=
100
,
verbose_name
=
_
(
'URL to login'
))
date_created
=
models
.
DateTimeField
(
auto_now_add
=
True
)
comment
=
models
.
TextField
(
blank
=
True
,
verbose_name
=
_
(
'Comment'
))
def
is_valid
(
self
):
return
self
.
is_active
and
self
.
is_accepted
@property
def
is_active
(
self
):
if
self
.
user
and
self
.
user
.
is_active
:
return
True
return
False
@is_active.setter
def
is_active
(
self
,
active
):
if
self
.
user
:
self
.
user
.
is_active
=
active
self
.
user
.
save
()
@property
def
is_accepted
(
self
):
if
self
.
user
:
return
True
else
:
return
False
@is_accepted.setter
def
is_accepted
(
self
,
accepted
):
if
accepted
:
user
=
User
.
create_app_user
(
name
=
self
.
name
,
comment
=
self
.
comment
)
self
.
user
=
user
self
.
save
()
@property
def
is_superuser
(
self
):
...
...
@@ -31,9 +53,14 @@ class Terminal(models.Model):
def
is_terminal
(
self
):
return
True
def
__unicode__
(
self
):
active
=
'Active'
if
self
.
user
and
self
.
user
.
is_active
else
'Disabled'
return
'
%
s:
%
s'
%
(
self
.
name
,
active
)
__str__
=
__unicode__
class
Meta
:
db_table
=
'terminal'
ordering
=
[
'is_active'
]
class
TerminalHeatbeat
(
models
.
Model
):
...
...
apps/users/models/__init__.py
View file @
5b4ce709
...
...
@@ -4,6 +4,4 @@
from
.group
import
*
from
.user
import
*
from
.access_key
import
*
from
.authentication
import
*
apps/users/models/a
ccess_key
.py
→
apps/users/models/a
uthentication
.py
View file @
5b4ce709
...
...
@@ -3,21 +3,38 @@
#
import
uuid
from
django.db
import
models
from
django.utils.translation
import
ugettext_lazy
as
_
from
rest_framework.authtoken.models
import
Token
from
.
import
User
__all__
=
[
'AccessKey'
]
def
get_uuid_string
():
return
uuid
.
uuid4
()
.
__str__
()
class
AccessKey
(
models
.
Model
):
id
=
models
.
UUIDField
(
verbose_name
=
'AccessKeyID'
,
primary_key
=
True
,
default
=
get_uuid_string
,
editable
=
False
)
secret
=
models
.
UUIDField
(
verbose_name
=
'AccessKeySecret'
,
default
=
get_uuid_string
,
editable
=
False
)
user
=
models
.
ForeignKey
(
User
,
verbose_name
=
'User'
)
id
=
models
.
UUIDField
(
verbose_name
=
'AccessKeyID'
,
primary_key
=
True
,
default
=
uuid
.
uuid4
,
editable
=
False
)
secret
=
models
.
UUIDField
(
verbose_name
=
'AccessKeySecret'
,
default
=
uuid
.
uuid4
,
editable
=
False
)
user
=
models
.
ForeignKey
(
User
,
verbose_name
=
'User'
,
related_name
=
'access_key'
)
def
get_id
(
self
):
return
str
(
self
.
id
)
def
get_secret
(
self
):
return
str
(
self
.
secret
)
def
__unicode__
(
self
):
return
s
elf
.
id
return
s
tr
(
self
.
id
)
__str__
=
__unicode__
class
PrivateToken
(
Token
):
"""Inherit from auth token, otherwise migration is boring"""
class
Meta
:
verbose_name
=
_
(
'Private Token'
)
apps/users/models/group.py
View file @
5b4ce709
...
...
@@ -5,6 +5,7 @@
from
__future__
import
unicode_literals
from
django.db
import
models
,
IntegrityError
from
django.contrib.auth.models
import
Group
from
django.utils.translation
import
ugettext_lazy
as
_
from
common.utils
import
signer
,
date_expired_default
...
...
@@ -13,8 +14,7 @@ from common.mixins import NoDeleteModelMixin
__all__
=
[
'UserGroup'
]
class
UserGroup
(
NoDeleteModelMixin
):
name
=
models
.
CharField
(
max_length
=
100
,
unique
=
True
,
verbose_name
=
_
(
'Name'
))
class
UserGroup
(
NoDeleteModelMixin
,
Group
):
comment
=
models
.
TextField
(
blank
=
True
,
verbose_name
=
_
(
'Comment'
))
date_created
=
models
.
DateTimeField
(
auto_now_add
=
True
)
created_by
=
models
.
CharField
(
max_length
=
100
)
...
...
@@ -34,7 +34,7 @@ class UserGroup(NoDeleteModelMixin):
return
True
class
Meta
:
db_table
=
'user_group'
ordering
=
[
'name'
]
@classmethod
def
initial
(
cls
):
...
...
apps/users/models/user.py
View file @
5b4ce709
...
...
@@ -15,7 +15,7 @@ from django.shortcuts import reverse
from
rest_framework.authtoken.models
import
Token
from
common.utils
import
signer
,
date_expired_default
from
.
import
UserGroup
,
AccessKey
from
.
import
UserGroup
__all__
=
[
'User'
]
...
...
@@ -178,11 +178,12 @@ class User(AbstractUser):
@classmethod
def
create_app_user
(
cls
,
name
,
comment
):
domain_name
=
settings
.
DOMAIN_NAME
or
'jumpserver.org'
from
.
import
AccessKey
domain_name
=
settings
.
CONFIG
.
DOMAIN_NAME
or
'jumpserver.org'
app
=
cls
.
objects
.
create
(
username
=
name
,
name
=
name
,
email
=
'
%
s@
%
s'
%
(
name
,
domain_name
),
role
=
'App'
,
enable_otp
=
False
,
comment
=
comment
,
is_first_login
=
False
,
created_by
=
'System'
)
AccessKey
.
object
.
create
(
user
=
app
)
AccessKey
.
object
s
.
create
(
user
=
app
)
return
app
@classmethod
...
...
@@ -207,7 +208,7 @@ class User(AbstractUser):
return
super
(
User
,
self
)
.
delete
()
class
Meta
:
db_table
=
'user'
ordering
=
[
'username'
]
#: Use this method initial user
@classmethod
...
...
apps/users/models/utils.py
View file @
5b4ce709
...
...
@@ -7,10 +7,11 @@ from . import User, UserGroup
def
initial_model
():
for
cls
in
[
User
,
UserGroup
]:
cls
.
initial
()
if
getattr
(
cls
,
'initial'
):
cls
.
initial
()
def
generate_fake
():
for
cls
in
[
User
,
UserGroup
]:
cls
.
generate_fake
()
if
getattr
(
cls
,
'generate_fake'
):
cls
.
generate_fake
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment