Skip to content

Commit

Permalink
Merge pull request #272 from elg/master
Browse files Browse the repository at this point in the history
Issues corrections and Log API
  • Loading branch information
elg committed Jan 29, 2018
2 parents b8f8256 + ef77c1b commit 60f768b
Show file tree
Hide file tree
Showing 8 changed files with 153 additions and 44 deletions.
13 changes: 0 additions & 13 deletions passhportd/app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,19 +129,6 @@ class TGroup_Target(db.Model):
primary_key=True)


class TGroup_TGroup(db.Model):
"""TgroupTgroup Targets a group can access"""
__tablename__ = "tgroup_tgroup"
targetgroup_id = db.Column(
db.Integer,
db.ForeignKey("targetgroup.id"),
primary_key=True)
containertargetgroup_id = db.Column(
db.Integer,
db.ForeignKey("targetgroup.id"),
primary_key=True)


class Tgroup_Group(db.Model):
"""TgroupGroup Targets in target group a group can access"""
__tablename__ = "tgroup_group"
Expand Down
4 changes: 3 additions & 1 deletion passhportd/app/models_mod/target.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,9 @@ def username_list_json(self):
usernames = ""

for user in self.members:
usernames = usernames + "{\"Name\" : \"" + user.show_name() + "\"},"
usernames = usernames + \
"{\"Name\" : \"" + user.show_name() + "\"," + \
"\"Comment\" : \"" + user.show_comment() + "\"},"

return usernames[:-1]

Expand Down
98 changes: 84 additions & 14 deletions passhportd/app/models_mod/targetgroup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from __future__ import absolute_import
from __future__ import unicode_literals

from app import db
from app import db, models_mod

# Table to handle the self-referencing many-to-many relationship
# for the Targetgroup class:
Expand Down Expand Up @@ -52,25 +52,34 @@ def __repr__(self):

output.append("Name: {}".format(self.name))
output.append("Comment: {}".format(self.comment))
output.append("User list: " + " ".join(self.username_list()))
output.append("Target list: " + " ".join(self.targetname_list()))
output.append("Usergroup list: " + " ".join(self.usergroupname_list()))
output.append("Targetgroup list: " + " ".join(self.targetgroupname_list()))

output.append("All users: " + " ".join(self.all_username_list()))
output.append("All targets: " + " ".join(self.all_targetname_list()))
output.append("All usergroups: " + " ".join(self.all_usergroupname_list()))
output.append("All targetgroups: " + " ".join(self.all_targetgroupname_list()))
output.append("User list: " + \
" ".join(self.username_list()))
output.append("Target list: " + \
" ".join(self.targetname_list()))
output.append("Usergroup list: " + \
" ".join(self.usergroupname_list()))
output.append("Targetgroup list: " + \
" ".join(self.targetgroupname_list()))

output.append("All users: " + \
" ".join(self.all_username_list()))
output.append("All targets: " + \
" ".join(self.all_targetname_list()))
output.append("All usergroups: " + \
" ".join(self.all_usergroupname_list()))
output.append("All targetgroups: " + \
" ".join(self.all_targetgroupname_list()))

return "\n".join(output)


def simplejson(self):
"""Return a simplified data of the targetgroup as json but not all the data"""
"""Return a simplified data of the targetgroup as json but not
all the data"""
output = "{\n"

output = output + "\"name\": \"" + format(self.name) + "\",\n"
output = output + "\"comment\": \"" + format(self.comment) + "\",\n"
output = output + "\"Name\": \"" + format(self.name) + "\",\n"
output = output + "\"Comment\": \"" + format(self.comment) + "\",\n"
output = output + "}"

return output
Expand All @@ -81,6 +90,11 @@ def show_name(self):
return self.name


def show_comment(self):
"""Return a string containing the targetgroup’s comment"""
return self.comment


# User management
def is_members(self, user):
"""Return true if the given user is a member
Expand Down Expand Up @@ -190,6 +204,20 @@ def targetname_list(self):

return targetnames


def username_list_json(self):
"""Return users directly linked with the targetgroup"""
usernames = ""

for user in self.members:
usernames = usernames + "{\"Name\" : \"" + \
user.show_name() + "\"," + \
"\"Comment\" : \"" + \
user.show_comment() + "\"},"

return usernames[:-1]


def targetname_list_json(self):
"""Return targets directly linked with the targetgroup"""
targetnames = ""
Expand All @@ -203,6 +231,31 @@ def targetname_list_json(self):
return targetnames[:-1]


def usergroupname_list_json(self):
"""Return usergroups directly linked with the targetgroup"""
usergroupnames = ""

for usergroup in self.gmembers:
usergroupnames = usergroupnames + "{\"Name\" : \"" + \
usergroup.show_name() + "\"," + \
"\"Comment\" : \"" + \
usergroup.show_comment() + "\"},"

return usergroupnames[:-1]


def targetgroupname_list_json(self):
"""Return targetgroups directly linked with the targetgroup"""
targetgroupnames = ""

for targetgroup in self.tgmembers:
targetgroupnames = targetgroupnames + "{\"Name\" : \"" + \
targetgroup.show_name() + "\"," + \
"\"Comment\" : \"" + \
targetgroup.show_comment() + "\"},"

return targetgroupnames[:-1]


def accessible_target_list(self, parsed_targetgroups = None, style="object"):
"""Return accessible targets as an object list or target name list"""
Expand All @@ -216,7 +269,7 @@ def accessible_target_list(self, parsed_targetgroups = None, style="object"):
parsed_targetgroups.append(targetgroup)
for target in targetgroup.accessible_target_list(
parsed_targetgroups = parsed_targetgroups,
style = style):
style = "object"):
if target not in targets:
targets.append(target)
# Return target objects or names depending of the style
Expand Down Expand Up @@ -331,6 +384,23 @@ def rmtargetgroup(self, targetgroup):
return self


def memberof(self, obj):
"""Return a string list of direct memberships of this targetgroup"""
if obj == "targetgroup":
members = []
query = db.session.query(models_mod.targetgroup.Targetgroup).all()
for targetgroup in query:
if self in targetgroup.tgmembers:
members.append(targetgroup)
else:
return "Error in object type"

ret = "["
for m in members:
ret = ret + m.name + ","
return ret[:-1] + "]"


def subtargetgroupname_in_targetgroup(self, subtargetgroupname):
"""Return true if the given subtargetgroupname belongs to a member
of the targetgroup, false otherwise
Expand Down
7 changes: 5 additions & 2 deletions passhportd/app/models_mod/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ def simplejson(self):
output = output + "\"email\": \"" + format(self.name) + "\",\n"
output = output + "\"sshkey\": \"" + format(self.sshkey) + "\",\n"
output = output + "\"comment\": \"" + format(self.comment) + "\",\n"
output = output + "\"accessibleTargetList\": \"" + format(self.accessible_targetname_list()) + "\",\n"
#output = output + "\"accessibleTargets\": \"" + format(self.accessible_target_list("json")) + "\"\n"
output = output + "}"

return output
Expand All @@ -65,6 +63,11 @@ def show_name(self):
return self.name


def show_comment(self):
"""Return a string containing the user's comment"""
return self.comment


def accessible_targetname_list(self):
"""Return target names which are accessible to the user"""
return self.accessible_target_list("names")
Expand Down
23 changes: 15 additions & 8 deletions passhportd/app/models_mod/usergroup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from __future__ import absolute_import
from __future__ import unicode_literals

from app import db
from app import db, models_mod
from app.models_mod import target,targetgroup


Expand Down Expand Up @@ -68,10 +68,10 @@ def simplejson(self):
directsize = len(self.members)
totalsize = len(self.all_username_list())
output = "{\n"
output = output + "\"name\": \"" + format(self.name) + "\",\n"
output = output + "\"comment\": \"" + format(self.comment) + "\",\n"
output = output + "\"directsize\": \"" + format(str(directsize)) + "\",\n"
output = output + "\"totalsize\": \"" + format(str(totalsize)) + "\",\n"
output = output + "\"Name\": \"" + format(self.name) + "\",\n"
output = output + "\"Comment\": \"" + format(self.comment) + "\",\n"
output = output + "\"Directsize\": \"" + format(str(directsize)) + "\",\n"
output = output + "\"Totalsize\": \"" + format(str(totalsize)) + "\",\n"
output = output + "}"

return output
Expand Down Expand Up @@ -200,7 +200,11 @@ def memberof(self, obj):
elif obj == "targetgroup":
members = self.tgmembers
elif obj == "usergroup":
members = self.gmembers
members = []
query = db.session.query(models_mod.usergroup.Usergroup).all()
for usergroup in query:
if self in usergroup.gmembers:
members.append(usergroup)
else:
return "Error in object type"

Expand Down Expand Up @@ -410,7 +414,9 @@ def username_list_json(self):
usernames = ""

for user in self.members:
usernames = usernames + "{\"Name\" : \"" + user.show_name() + "\"},"
usernames = usernames + \
"{\"Name\" : \"" + user.show_name() + "\"," + \
"\"Comment\" : \"" + user.show_comment() + "\"},"

return usernames[:-1]

Expand All @@ -420,7 +426,8 @@ def managername_list_json(self):
names = ""

for user in self.ugadmins:
names = names + "{\"Name\" : \"" + user.show_name() + "\"},"
names = names + "{\"Name\" : \"" + user.show_name() + "\"," + \
"\"Comment\" : \"" + user.show_comment() + "\"},"

return names[:-1]

Expand Down
18 changes: 12 additions & 6 deletions passhportd/app/views_mod/targetgroup/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ def api_targetgroup_show(name):
return utils.response("[" + str(targetgroup_data.simplejson()) + "]", 200)


@app.route("/api/targetgroup/target/<name>")
def api_targetgroup_target(name):
"""Return json formated targets lists attached to the targetgroup 'name'"""
@app.route("/api/targetgroup/<element>/<name>")
def api_targetgroup_element(name, element):
"""Return json formated element lists attached to the targetgroup 'name'"""
# Check for required fields
if not name:
return utils.response("ERROR: The name is required ", 417)
Expand All @@ -64,7 +64,7 @@ def api_targetgroup_target(name):
return utils.response("ERROR: No targetgroup with the name " + name + \
" in the database.", 417)

return api_targetgroup_element(targetgroup_data, "target")
return api_targetgroup_element(targetgroup_data, element)


def api_targetgroup_element(targetgroup_data, element):
Expand All @@ -73,8 +73,14 @@ def api_targetgroup_element(targetgroup_data, element):
return utils.response("[" + targetgroup_data.username_list_json() + \
"]", 200)
elif element == "usergroup":
return utils.response("[" + targetgroup_data.usergroupname_list_json() + \
"]", 200)
return utils.response("[" + \
targetgroup_data.usergroupname_list_json() + "]", 200)
elif element == "target":
return utils.response("[" + targetgroup_data.targetname_list_json() + \
"]", 200)
elif element == "targetgroup":
return utils.response("[" + \
targetgroup_data.targetgroupname_list_json() + "]", 200)
else:
return utils.response("Error: element type unkown" , 417)

33 changes: 33 additions & 0 deletions passhportd/app/views_mod/targetgroup/targetgroup.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,22 @@ def targetgroup_show(name):
return utils.response(targetgroup_data.__repr__(), 200)


@app.route("/targetgroup/memberof/<obj>/<name>")
def targetgroup_memberof(obj, name):
"""Return the list of obj this targetgroup is member of"""
# Check for required fields
if not name:
return utils.response("ERROR: The name is required ", 417)

data = targetgroup.Targetgroup.query.filter_by(name=name).first()

if data is None:
return utils.response('ERROR: No targetgroup with the name "' + name + \
'" in the database.', 417)

return utils.response(str(data.memberof(obj)), 200)


@app.route("/targetgroup/create", methods=["POST"])
def targetgroup_create():
"""Add a targetgroup in the database"""
Expand Down Expand Up @@ -528,3 +544,20 @@ def targetgroup_rmtargetgroup():

return utils.response('OK: "' + subtargetgroupname + '" removed from "' + \
targetgroupname + '"', 200)


@app.route("/targetgroup/access/<name>")
def targetgroup_access(name):
"""Return all the targets accessible if you're in this targetgroup"""
# Check for required fields
if not name:
return utils.response("ERROR: The name is required ", 417)

data = targetgroup.Targetgroup.query.filter_by(name=name).first()

if data is None:
return utils.response('ERROR: No targetgroup with the name "' + name + \
'" in the database.', 417)

return utils.response(str(data.accessible_target_list(style="names")), 200)

1 change: 1 addition & 0 deletions passhportd/app/views_mod/user/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ def api_user_list():

return utils.response("".join(result), 200)


@app.route("/api/user/show/<name>")
def api_user_show(name):
"""Return json formated data about a user"""
Expand Down

0 comments on commit 60f768b

Please sign in to comment.