Skip to content

Commit

Permalink
Ability to lock a flag
Browse files Browse the repository at this point in the history
  • Loading branch information
eljeffeg committed Jul 12, 2022
1 parent aa79837 commit 83a279a
Show file tree
Hide file tree
Showing 9 changed files with 103 additions and 11 deletions.
24 changes: 24 additions & 0 deletions alembic/versions/83f862086ff0_add_flag_lock.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
"""add flag lock
Revision ID: 83f862086ff0
Revises: cd4d09aa9c68
Create Date: 2022-05-13 21:46:22.838283
"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "83f862086ff0"
down_revision = "cd4d09aa9c68"
branch_labels = None
depends_on = None


def upgrade():
op.add_column("flag", sa.Column("_locked", sa.BOOLEAN, nullable=False))


def downgrade():
op.drop_column("flag", "_locked")
15 changes: 14 additions & 1 deletion handlers/AdminHandlers/AdminUserHandlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

from models.Team import Team
from models.Box import Box
from models.Flag import Flag
from models.User import User, ADMIN_PERMISSION
from models.Permission import Permission
from models.GameLevel import GameLevel
Expand Down Expand Up @@ -329,7 +330,7 @@ class AdminLockHandler(BaseHandler):
@authorized(ADMIN_PERMISSION)
def post(self, *args, **kwargs):
""" Calls an lock based on URL """
uri = {"user": self.lock_user, "box": self.lock_box}
uri = {"user": self.lock_user, "box": self.lock_box, "flag": self.lock_flag}
if len(args) and args[0] in uri:
uri[args[0]]()
else:
Expand Down Expand Up @@ -357,6 +358,18 @@ def lock_box(self):
else:
self.render("public/404.html")

def lock_flag(self):
uuid = self.get_argument("uuid", "")
print(uuid)
flag = Flag.by_uuid(uuid)
if flag is not None:
flag.locked = False if flag.locked else True
self.dbsession.add(flag)
self.dbsession.commit()
self.redirect("/admin/view/game_objects#%s" % flag.uuid)
else:
self.render("public/404.html")


class AdminAjaxUserHandler(BaseHandler):
@restrict_ip_address
Expand Down
2 changes: 1 addition & 1 deletion handlers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ def get_cookie_secret():
(r"/admin/users/edit/teams/scores", AdminEditTeamsHandler),
(r"/admin/users/delete/(.*)", AdminDeleteUsersHandler),
(r"/admin/ajax/(user|team)", AdminAjaxUserHandler),
(r"/admin/lock/(user|box)", AdminLockHandler),
(r"/admin/lock/(user|box|flag)", AdminLockHandler),
(r"/admin/configuration", AdminConfigurationHandler),
(r"/admin/gitstatus", AdminGitStatusHandler),
(r"/admin/export/(.*)", AdminExportHandler),
Expand Down
20 changes: 18 additions & 2 deletions models/Box.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class Box(DatabaseObject):
cascade="all,delete,delete-orphan",
)

flags = relationship(
_flags = relationship(
"Flag",
backref=backref("box", lazy="select"),
cascade="all,delete,delete-orphan",
Expand Down Expand Up @@ -163,6 +163,22 @@ def flaglist(self, box_id=None):
flaglist[flag.uuid] = flag.name
return flaglist

@property
def flags(self):
flags = []
for flag in self._flags:
if not flag.locked:
flags.append(flag)
return flags

@flags.setter
def flags(self, flags):
self._flags = flags

@property
def flags_all(self):
return self._flags

@property
def name(self):
return self._name
Expand Down Expand Up @@ -349,7 +365,7 @@ def to_xml(self, parent):
).category
flags_elem = ET.SubElement(box_elem, "flags")
flags_elem.set("count", "%s" % str(len(self.flags)))
for flag in self.flags:
for flag in self.flags_all:
flag.to_xml(flags_elem)
hints_elem = ET.SubElement(box_elem, "hints")
count = 0
Expand Down
18 changes: 17 additions & 1 deletion models/Flag.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
from sqlalchemy import Column, ForeignKey
from sqlalchemy.orm import relationship, backref
from models.Relationships import team_to_flag, user_to_flag
from sqlalchemy.types import Unicode, Integer, String
from sqlalchemy.types import Unicode, Integer, String, Boolean
from models import dbsession
from models.Box import Box
from models.Team import Team
Expand Down Expand Up @@ -79,6 +79,7 @@ class Flag(DatabaseObject):
_original_value = Column(Integer, nullable=True)
_order = Column(Integer, nullable=True, index=True)
_type = Column(Unicode(16), default=False)
_locked = Column(Boolean, default=False, nullable=False)

flag_attachments = relationship(
"FlagAttachment",
Expand Down Expand Up @@ -379,6 +380,19 @@ def is_file(self):
def box(self):
return Box.by_id(self.box_id)

@property
def locked(self):
""" Determines if an admin has locked an flag. """
return self._locked

@locked.setter
def locked(self, value):
""" Setter method for _lock """
if isinstance(value, str):
value = value.lower() in ['true', '1']
assert isinstance(value, bool)
self._locked = value

def choices(self):
# inlucdes the choice uuid - needed for editing choice
choices = []
Expand Down Expand Up @@ -436,6 +450,7 @@ def to_xml(self, parent):
ET.SubElement(flag_elem, "description").text = self.description
ET.SubElement(flag_elem, "capture_message").text = self.capture_message
ET.SubElement(flag_elem, "value").text = str(self.value)
ET.SubElement(flag_elem, "locked").text = str(self.locked)
if self.lock_id:
ET.SubElement(flag_elem, "depends_on").text = Flag.by_id(self.lock_id).name
ET.SubElement(flag_elem, "case_sensitive").text = str(self.case_sensitive)
Expand Down Expand Up @@ -479,6 +494,7 @@ def to_dict(self):
"flagtype": self.type,
"choices": self.choices(),
"order": self.order,
"locked": self.locked,
}

def __repr__(self):
Expand Down
2 changes: 1 addition & 1 deletion setup/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# -*- coding: utf-8 -*-
__version__ = "3.10.6"
__version__ = "3.11.0"
3 changes: 2 additions & 1 deletion setup/xmlsetup.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ def create_flags(parent, box):
flag.capture_message = get_child_text(flag_elem, "capture_message")
flag.type = flag_elem.get("type", "static")
flag.order = get_child_text(flag_elem, "order", None)
flag.locked = get_child_text(flag_elem, "locked", 0)
if flag.type == "file":
add_attachments(
get_child_by_tag(flag_elem, "flag_attachments"), flag
Expand Down Expand Up @@ -224,7 +225,7 @@ def create_boxes(parent, corporation):
box.description = get_child_text(box_elem, "description")
box.capture_message = get_child_text(box_elem, "capture_message")
box.operating_system = get_child_text(box_elem, "operatingsystem")
box.locked = get_child_text(box_elem, "locked", "0")
box.locked = get_child_text(box_elem, "locked", 0)
box.value = get_child_text(box_elem, "value", "0")
if get_child_text(box_elem, "avatar", "none") != "none":
box.avatar = bytearray(
Expand Down
5 changes: 5 additions & 0 deletions static/js/pages/admin/view/game_objects.js
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,11 @@ $(document).ready(function() {
$("#lock-box-uuid").val($(this).data("uuid"));
$("#lock-box-form").submit();
});

$("a[id^=lock-flag-button]").click(function() {
$("#lock-flag-uuid").val($(this).data("uuid"));
$("#lock-flag-form").submit();
});

/* IP Address */
$("#add-ip-address-submit").click(function() {
Expand Down
25 changes: 21 additions & 4 deletions templates/admin/view/game_objects.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,16 @@
{% from models.Flag import FLAG_CHOICE %}
{% from models.FlagChoice import FlagChoice %}
{% set avatars = filter_avatars("box") %}
<!-- Lock Form -->
<!-- Lock Box Form -->
<form id="lock-box-form" action="/admin/lock/box" method="post">
{% raw xsrf_form_html() %}
<input id="lock-box-uuid" name="uuid" type="hidden" />
</form>
<!-- Lock Flag Form -->
<form id="lock-flag-form" action="/admin/lock/flag" method="post">
{% raw xsrf_form_html() %}
<input id="lock-flag-uuid" name="uuid" type="hidden" />
</form>
<!-- Select Avatars -->
<div id="change-box-avatar-modal" class="modal hide fade" style="z-index: 100000; display: none; {% if len(avatars) > 0 %}width: 750px; margin-left: -375px;{% end %}">
<div class="modal-header">
Expand Down Expand Up @@ -821,7 +826,7 @@ <h4 style="display:inline;">
{{_("Add Flags") }}
</a>
<hr>
{% if len(box.flags) != 0 %}
{% if len(box.flags_all) != 0 %}
<table class="table table-striped sort grid">
<thead>
<tr>
Expand All @@ -833,14 +838,15 @@ <h4 style="display:inline;">
<th>{{_("Value")}}</th>
<th>{{_("Type")}}</th>
<th style="text-align: center;"><i class="fa fa-paperclip" title="Attachments"></i></th>
<th>&nbsp;<i class="fa fa-lock" title="Lock"></i></th>
<th>{{_("Statistics")}}</th>
<th><!-- Edit Button --></th>
<th><!-- Delete Button --></th>
</tr>
</thead>
<tbody>
{% for index, flag in enumerate(box.flags) %}
<tr>
{% for index, flag in enumerate(box.flags_all) %}
<tr id="{{ flag.uuid }}" class="{% if flag.locked %} locked{% end %}">
<td class="index shortcolumn" data-uuid="{{ flag.uuid }}">{{ index + 1 }}</td>
<td class="shortcolumn" style="padding-right: 0px;">{% if flag.lock_id %}<i class="fa fa-lock" title="Locked by {{ Flag.by_id(flag.lock_id).name }}"></i>{% end %}</td>
<td class="shortcolumn" style="padding-right: 25px;">{{ flag.name }}</td>
Expand All @@ -856,6 +862,17 @@ <h4 style="display:inline;">
{{ len(flag.flag_attachments) }}
</a>
</td>
<td class="shortcolumn">
{% if flag.locked %}
<a id="lock-flag-button-{{ flag.uuid }}" class="btn btn-mini btn-success" data-uuid="{{ flag.uuid }}">
<i class="fa fa-unlock" title="Lock Flag"></i>
</a>
{% else %}
<a id="lock-flag-button-{{ flag.uuid }}" class="btn btn-mini btn-warning" data-uuid="{{ flag.uuid }}">
<i class="fa fa-lock" title="Unlock Flag"></i>
</a>
{% end %}
</td>
<td class="shortcolumn">
<a id="details-flag-button-{{ flag.uuid }}" class="btn btn-mini" data-toggle="modal" href="#details-flag-modal" data-uuid="{{ flag.uuid }}" data-box-uuid="{{ flag.box.uuid }}" title="{{flag.token}}">
<i class="fa fa-fw fa-eye"></i>
Expand Down

0 comments on commit 83a279a

Please sign in to comment.