remade loginsecurity to use py_player

This commit is contained in:
PanFritz
2015-08-17 04:06:34 +02:00
parent 2a7b4a05ff
commit 039d79fa0c
3 changed files with 76 additions and 21 deletions

View File

@@ -10,6 +10,8 @@ import org.bukkit.block as bblock
import org.bukkit.event.entity as entity import org.bukkit.event.entity as entity
import org.bukkit.command.ConsoleCommandSender import org.bukkit.command.ConsoleCommandSender
from org.bukkit.entity import * from org.bukkit.entity import *
from player import get_py_player
from player import py_players
from traceback import format_exc as trace from traceback import format_exc as trace

View File

@@ -14,7 +14,6 @@ min_pass_length = 8
blocked_events = ["block.BlockBreakEvent", "block.BlockPlaceEvent", "player.PlayerMoveEvent","player.AsyncPlayerChatEvent"] blocked_events = ["block.BlockBreakEvent", "block.BlockPlaceEvent", "player.PlayerMoveEvent","player.AsyncPlayerChatEvent"]
logging_in = {}
def matches(password,user): def matches(password,user):
@@ -24,13 +23,18 @@ def matches(password,user):
def matches_thread(password, user): def matches_thread(password, user):
hashed = get_pass(uid(user)) hashed = get_pass(uid(user))
py_player = get_py_player(user)
if crypt.verify(password, hashed): if crypt.verify(password, hashed):
if user.getName() in logging_in: if py_player.logging_in:
del logging_in[user.getName()] py_player.logging_in = False
msg(user, "&aLogged in successfully!") msg(user, "&aLogged in successfully!")
else: else:
if user.getName() in logging_in: if py_player.logging_in:
msg(user, "&cInvalid password") msg(user, "&cInvalid password!")
else:
msg(user,"&cAlready logged in!")
@simplecommand("cgpass", @simplecommand("cgpass",
@@ -39,18 +43,26 @@ def matches_thread(password, user):
senderLimit = 0, senderLimit = 0,
helpNoargs = True) helpNoargs = True)
def change_pass_command(sender, command, label, args): def change_pass_command(sender, command, label, args):
if sender.getName() in logging_in:
py_player = get_py_player(sender)
if py_player.logging_in:
return "&cYou are not logged in" return "&cYou are not logged in"
if not len(args) == 2: if not len(args) == 2:
return "&cInvalid arguments" return "&cInvalid arguments"
password = args[0] password = args[0]
new_password = args[1] new_password = args[1]
uuid = uid(sender) uuid = uid(sender)
if is_registered(uuid): if is_registered(uuid):
change_pass(uuid, crypt.encrypt(new_password, rounds=200000, salt_size=16)) change_pass(uuid, crypt.encrypt(new_password, rounds=200000, salt_size=16))
return "&aPassword changed" return "&aPassword changed"
return "&cYou are not registered" return "&cYou are not registered"
@simplecommand("login", @simplecommand("login",
usage = "<password>", usage = "<password>",
description = "Logs you in if <password> matches your password.", description = "Logs you in if <password> matches your password.",
@@ -60,50 +72,77 @@ def login_command(sender, command, label, args):
password = args[0] password = args[0]
matches(password, sender) matches(password, sender)
@simplecommand("register", @simplecommand("register",
usage = "<password>", usage = "<password>",
description = "Registers you with <password>. Next time you join, log in with /login", description = "Registers you with <password>. Next time you join, log in with /login",
senderLimit = 0, senderLimit = 0,
helpNoargs = True) helpNoargs = True)
def register_command(sender, command, label, args): def register_command(sender, command, label, args):
py_player = get_py_player(sender)
if len(args) > 1: if len(args) > 1:
return "&cPassword can only be one word!" return "&cPassword can only be one word!"
uuid = uid(sender) uuid = uid(sender)
if is_registered(uuid): if is_registered(uuid):
return "&cYou are already registered!" return "&cYou are already registered!"
password = args[0] password = args[0]
if len(password) < min_pass_length: if len(password) < min_pass_length:
return "&cThe password has to be made up of at least %s characters!" % min_pass_length return "&cThe password has to be made up of at least %s characters!" % min_pass_length
create_pass(uuid, password) create_pass(uuid, password)
return "&cPassword set. Use /login <password> upon join." return "&cPassword set. Use /login <password> upon join."
@simplecommand("rmpass", @simplecommand("rmpass",
description = "Removes your password if the password matches", description = "Removes your password if the password matches",
senderLimit = 0, senderLimit = 0,
amax = 0, amax = 0,
helpNoargs = False) helpNoargs = False)
def rmpass_command(sender, command, label, args): def rmpass_command(sender, command, label, args):
if sender.getName() in logging_in:
py_player = get_py_player(sender)
if py_player.logging_in:
return "&cYou are not logged in" return "&cYou are not logged in"
if not is_registered(uid(sender)): if not is_registered(uid(sender)):
return "&cYou are not registered!" return "&cYou are not registered!"
if not sender.getName() in logging_in:
if py_player.logging_in == False:
delete_pass(uid(sender)) delete_pass(uid(sender))
return "&aPassword removed successfully. You will not be prompted anymore." return "&aPassword removed successfully. You will not be prompted anymore."
return "&cFailed to remove password, please contact a staff member" return "&cFailed to remove password, please contact a staff member"
@simplecommand("rmotherpass", @simplecommand("rmotherpass",
aliases = ["lacrmpass"], aliases = ["lacrmpass"],
usage = "<user>", usage = "<user>",
description = "Removes password of <user> and sends them a notification", description = "Removes password of <user> and sends them a notification",
helpNoargs = True) helpNoargs = True)
def rmotherpass_command(sender, command, label, args): def rmotherpass_command(sender, command, label, args):
if sender.getName() in logging_in:
py_player = get_py_player(sender)
if py_player.logging_in:
return "&cYou are not logged in" return "&cYou are not logged in"
if not sender.hasPermission(admin_perm): if not sender.hasPermission(admin_perm):
noperm(sender) noperm(sender)
return return
user = server.getOfflinePlayer(args[0]) user = server.getOfflinePlayer(args[0])
if is_registered(uid(user)): if is_registered(uid(user)):
delete_pass(uid(user)) delete_pass(uid(user))
runas(server.getConsoleSender(), colorify("mail send %s &cYour password was reset by a staff member. Use &6/register&c to set a new one." % user.getName())) runas(server.getConsoleSender(), colorify("mail send %s &cYour password was reset by a staff member. Use &6/register&c to set a new one." % user.getName()))
@@ -162,16 +201,24 @@ def delete_pass(uuid):
@hook.event("player.PlayerJoinEvent", "high") @hook.event("player.PlayerJoinEvent", "high")
def on_join(event): def on_join(event):
user = event.getPlayer() user = event.getPlayer()
py_player = get_py_player(event.getPlayer())
if is_registered(uid(user)): if is_registered(uid(user)):
msg(event.getPlayer(), "&6You will be disconnected after 60 seconds if you don't &alogin") msg(event.getPlayer(), "&6You will be disconnected after 60 seconds if you don't &alogin")
msg(user, "&cUse /login <password>") msg(user, "&cUse /login <password>")
logging_in[user.getName()] = time.time() py_player.logging_in = True
py_player.login_time = time.time()
return
elif user.hasPermission(admin_perm):
pass #Do what? force them to make a password, lots of code, maybe just message us on slack?
#This shouldn't be needed anymore as py_player gets removed anyway.
"""
@hook.event("player.PlayerQuitEvent", "high") @hook.event("player.PlayerQuitEvent", "high")
def on_quit(event): def on_quit(event):
if event.getPlayer().getName() in logging_in: if event.getPlayer().getName() in logging_in:
del logging_in[event.getPlayer().getName()] del logging_in[event.getPlayer().getName()]
"""
##Threading start ##Threading start
class kick_class(Runnable): class kick_class(Runnable):
@@ -187,15 +234,17 @@ def kick_thread():
while True: while True:
time.sleep(1) time.sleep(1)
now = time.time() now = time.time()
for name, jointime in logging_in.iteritems(): for py_player in py_players:
if now - jointime > wait_time: if now - py_player.login_time > wait_time:
player = server.getPlayer(name) player = py_player.player
kick = kick_class(player) kick = kick_class(player)
server.getScheduler().runTask(server.getPluginManager().getPlugin("RedstonerUtils"), kick) server.getScheduler().runTask(server.getPluginManager().getPlugin("RedstonerUtils"), kick)
if name in logging_in:
"""if name in logging_in:
del logging_in[name] del logging_in[name]
break break
"""
thread = threading.Thread(target = kick_thread) thread = threading.Thread(target = kick_thread)
@@ -206,6 +255,6 @@ thread.start()
for blocked_event in blocked_events: for blocked_event in blocked_events:
@hook.event(blocked_event, "high") @hook.event(blocked_event, "high")
def on_blocked_event(event): def on_blocked_event(event):
user = event.getPlayer() user = get_py_player(event.getPlayer())
if user.getName() in logging_in: if user.logging_in:
event.setCancelled(True) event.setCancelled(True)

View File

@@ -1,22 +1,26 @@
from helpers import * from helpers import *
players = [] py_players = []
class py_player: class py_player:
def __init__(player): def __init__(player):
self.player = player self.player = player
#Properties TODO """
#Example: Player properties, please add a short description of the property when adding a new one.
"""
self.logging_in = False self.logging_in = False
self.login_time = 0
def get_py_player(player): def get_py_player(player):
py_player = players[players.index(player)] py_player = players[players.index(player)]
return py_player return py_player
@hook.event("player.PlayerJoinEvent","highest") @hook.event("player.PlayerJoinEvent","lowest")
def on_join(event): def on_join(event):
player = py_player(event.getPlayer()) player = py_player(event.getPlayer())
players.append(player) players.append(player)