mirror of
https://github.com/barronwaffles/dwc_network_server_emulator.git
synced 2026-08-24 03:25:43 -05:00
@@ -82,6 +82,7 @@ class AdminPage(resource.Resource):
|
||||
'<body>'
|
||||
'<p>'
|
||||
'<a href="/banhammer">All Users</a> | '
|
||||
'<a href="/consoles">Consoles</a> | '
|
||||
'<a href="/banlist">Active Bans</a> '
|
||||
'</p>'
|
||||
)
|
||||
@@ -145,6 +146,39 @@ class AdminPage(resource.Resource):
|
||||
referer = "/banhammer"
|
||||
request.setHeader("Location", referer)
|
||||
|
||||
request.setResponseCode(303)
|
||||
return responsedata
|
||||
def update_consolelist(self, request):
|
||||
address = request.getClientIP()
|
||||
dbconn = sqlite3.connect('gpcm.db')
|
||||
macadr = request.args['macadr'][0].strip()
|
||||
actiontype = request.args['action'][0]
|
||||
if not macadr.isalnum():
|
||||
request.setResponseCode(500)
|
||||
logger.log(logging.INFO,address+" Bad data "+macadr+" ")
|
||||
return "Bad data"
|
||||
if actiontype == 'add':
|
||||
dbconn.cursor().execute('insert into pending values(?)',(macadr,))
|
||||
dbconn.cursor().execute('insert into registered values(?)',(macadr,))
|
||||
responsedata = "Added macadr=%s" % (macadr)
|
||||
elif actiontype == 'activate':
|
||||
dbconn.cursor().execute('insert into registered values(?)',(macadr,))
|
||||
responsedata = "Activated console belonging to %s" % (macadr)
|
||||
else:
|
||||
dbconn.cursor().execute('delete from pending where macadr=?',(macadr,))
|
||||
dbconn.cursor().execute('delete from registered where macadr=?',(macadr,))
|
||||
responsedata = "Removed macadr=%s" % (macadr)
|
||||
dbconn.commit()
|
||||
dbconn.close()
|
||||
logger.log(logging.INFO,address+" "+responsedata)
|
||||
request.setHeader("Content-Type", "text/html; charset=utf-8")
|
||||
request.setHeader("Location", "/consoles")
|
||||
referer = request.getHeader('referer')
|
||||
request.setResponseCode(303)
|
||||
if not referer:
|
||||
referer = "/banhammer"
|
||||
request.setHeader("Location", referer)
|
||||
|
||||
request.setResponseCode(303)
|
||||
return responsedata
|
||||
|
||||
@@ -277,6 +311,40 @@ class AdminPage(resource.Resource):
|
||||
request.setResponseCode(303)
|
||||
return responsedata
|
||||
|
||||
def render_consolelist(self, request):
|
||||
address = request.getClientIP()
|
||||
dbconn = sqlite3.connect('gpcm.db')
|
||||
active_list = []
|
||||
for row in dbconn.cursor().execute("SELECT * FROM REGISTERED"):
|
||||
active_list.append(str(row[0]))
|
||||
logger.log(logging.INFO,address+" Viewed console list")
|
||||
responsedata = (""
|
||||
'<a href="http://%20:%20@'+request.getHeader('host')+'">[CLICK HERE TO LOG OUT]</a>'
|
||||
"<form action='updateconsolelist' method='POST'>"
|
||||
"macadr:<input type='text' name='macadr'>\r\n"
|
||||
"<input type='hidden' name='action' value='add'>\r\n"
|
||||
"<input type='submit' value='Register and activate console'></form>\r\n"
|
||||
"<table border='1'>"
|
||||
"<tr><td>macadr</td></tr>\r\n")
|
||||
for row in dbconn.cursor().execute("select * from pending"):
|
||||
macadr = str(row[0])
|
||||
if macadr in active_list:
|
||||
responsedata += ("<tr><td>"+macadr+"</td>"
|
||||
"<td><form action='updateconsolelist' method='POST'>"
|
||||
"<input type='hidden' name='macadr' value='"+macadr+"'>"
|
||||
"<input type='hidden' name='action' value='remove'>\r\n"
|
||||
"<input type='submit' value='Un-register console'></form></td></tr>\r\n")
|
||||
else:
|
||||
responsedata += ("<tr><td>"+macadr+"</td>"
|
||||
"<td><form action='updateconsolelist' method='POST'>"
|
||||
"<input type='hidden' name='macadr' value='"+macadr+"'>"
|
||||
"<input type='hidden' name='action' value='activate'>\r\n"
|
||||
"<input type='submit' value='Activate console'></form></td></tr>\r\n")
|
||||
responsedata += "</table>"
|
||||
dbconn.close()
|
||||
request.setHeader("Content-Type", "text/html; charset=utf-8")
|
||||
return responsedata
|
||||
|
||||
def render_GET(self, request):
|
||||
if not adminpageconf:
|
||||
self.render_not_available(request)
|
||||
@@ -292,7 +360,9 @@ class AdminPage(resource.Resource):
|
||||
elif request.path == "/banhammer":
|
||||
title = 'AltWfc Users'
|
||||
response = self.render_blacklist(request)
|
||||
|
||||
elif request.path == "/consoles":
|
||||
title = "AltWfc Console List"
|
||||
response = self.render_consolelist(request)
|
||||
return self.get_header(title) + response + self.get_footer()
|
||||
|
||||
def render_POST(self, request):
|
||||
@@ -304,6 +374,8 @@ class AdminPage(resource.Resource):
|
||||
|
||||
if request.path == "/updatebanlist":
|
||||
return self.update_banlist(request)
|
||||
if request.path == "/updateconsolelist":
|
||||
return self.update_consolelist(request)
|
||||
else:
|
||||
return self.get_header() + self.get_footer()
|
||||
|
||||
|
||||
@@ -118,7 +118,8 @@ class GamespyDatabase(object):
|
||||
tx.nonquery("CREATE TABLE IF NOT EXISTS gameinfo (profileid INT, dindex TEXT, ptype TEXT, data TEXT)")
|
||||
tx.nonquery("CREATE TABLE IF NOT EXISTS nas_logins (userid TEXT, authtoken TEXT, data TEXT)")
|
||||
tx.nonquery("CREATE TABLE IF NOT EXISTS banned (gameid TEXT, ipaddr TEXT)")
|
||||
|
||||
tx.nonquery("CREATE TABLE IF NOT EXISTS pending (macadr TEXT)")
|
||||
tx.nonquery("CREATE TABLE IF NOT EXISTS registered (macadr TEXT)")
|
||||
# Create some indexes for performance.
|
||||
tx.nonquery("CREATE UNIQUE INDEX IF NOT EXISTS gamestatprofile_triple on gamestat_profile(profileid,dindex,ptype)")
|
||||
tx.nonquery("CREATE UNIQUE INDEX IF NOT EXISTS users_profileid_idx ON users (profileid)")
|
||||
@@ -403,6 +404,14 @@ class GamespyDatabase(object):
|
||||
with Transaction(self.conn) as tx:
|
||||
row = tx.queryone("SELECT COUNT(*) FROM banned WHERE gameid = ? AND ipaddr = ?",(postdata['gamecd'][:-1],postdata['ipaddr']))
|
||||
return int(row[0]) > 0
|
||||
def pending(self,postdata):
|
||||
with Transaction(self.conn) as tx:
|
||||
row = tx.queryone("SELECT COUNT(*) FROM pending WHERE macadr = ?",(postdata['macadr'],))
|
||||
return int(row[0]) > 0
|
||||
def registered(self,postdata):
|
||||
with Transaction(self.conn) as tx:
|
||||
row = tx.queryone("SELECT COUNT(*) FROM registered WHERE macadr = ?",(postdata['macadr'],))
|
||||
return int(row[0]) > 0
|
||||
|
||||
def get_next_available_userid(self):
|
||||
with Transaction(self.conn) as tx:
|
||||
|
||||
@@ -135,6 +135,23 @@ class NasHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
"retry": "1",
|
||||
"reason": "User banned."
|
||||
}
|
||||
#Un-comment these lines to enable console registration feature
|
||||
#elif not self.server.db.pending(post):
|
||||
#logger.log(logging.DEBUG, "Login denied - Unknown console"+str(post))
|
||||
#ret = {
|
||||
#"datetime": time.strftime("%Y%m%d%H%M%S"),
|
||||
#"returncd": "3921",
|
||||
#"locator": "gamespy.com",
|
||||
#"retry": "1",
|
||||
#}
|
||||
#elif not self.server.db.registered(post):
|
||||
#logger.log(logging.DEBUG, "Login denied - console pending"+str(post))
|
||||
#ret = {
|
||||
#"datetime": time.strftime("%Y%m%d%H%M%S"),
|
||||
#"returncd": "3888",
|
||||
#"locator": "gamespy.com",
|
||||
#"retry": "1",
|
||||
#}
|
||||
else:
|
||||
challenge = utils.generate_random_str(8)
|
||||
post["challenge"] = challenge
|
||||
|
||||
128
register_page.py
Normal file
128
register_page.py
Normal file
@@ -0,0 +1,128 @@
|
||||
# DWC Network Server Emulator
|
||||
# Copyright (C) 2014 SMTDDR
|
||||
# Copyright (C) 2014 kyle95wm
|
||||
# Copyright (C) 2014 AdmiralCurtiss
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from twisted.web import server, resource
|
||||
from twisted.internet import reactor
|
||||
from twisted.internet.error import ReactorAlreadyRunning
|
||||
import re
|
||||
import base64
|
||||
import codecs
|
||||
import sqlite3
|
||||
import collections
|
||||
import json
|
||||
import time
|
||||
import datetime
|
||||
import other.utils as utils
|
||||
import gamespy
|
||||
import gamespy.gs_utility as gs_utils
|
||||
|
||||
class RegPage(resource.Resource):
|
||||
isLeaf = True
|
||||
|
||||
def __init__(self,regpage):
|
||||
self.regpage = regpage
|
||||
|
||||
def get_header(self, title = None):
|
||||
if not title:
|
||||
title = 'Register a Console'
|
||||
s = (
|
||||
'<html>'
|
||||
'<head>'
|
||||
'<title>' + title + '</title>'
|
||||
'</head>'
|
||||
'<body>'
|
||||
'<p>'
|
||||
'<b>Register a console</b>'
|
||||
'</p>'
|
||||
)
|
||||
return s
|
||||
|
||||
def get_footer(self):
|
||||
s = (
|
||||
'</body>'
|
||||
'</html>'
|
||||
)
|
||||
return s
|
||||
|
||||
def update_maclist(self, request):
|
||||
address = request.getClientIP()
|
||||
dbconn = sqlite3.connect('gpcm.db')
|
||||
macadr = request.args['macadr'][0].strip()
|
||||
actiontype = request.args['action'][0]
|
||||
macadr = macadr.lower()
|
||||
if not re.match("[0-9a-f]{2}([-:])[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", macadr):
|
||||
request.setResponseCode(500)
|
||||
return "The MAC you entered was invalid. Please click the back button and try again!"
|
||||
macadr = macadr.replace(":","").replace("-","")
|
||||
if actiontype == 'add':
|
||||
dbconn.cursor().execute('insert into pending values(?)',(macadr,))
|
||||
responsedata = "Added %s to pending list. Please close this window now. It's also not a bad idea to check back on the status of your activation by attempting to connect your console to the server." % (macadr)
|
||||
dbconn.commit()
|
||||
dbconn.close()
|
||||
request.setHeader("Content-Type", "text/html; charset=utf-8")
|
||||
request.setResponseCode(303)
|
||||
return responsedata
|
||||
if not referer:
|
||||
referer = "/register"
|
||||
request.setHeader("Location", referer)
|
||||
|
||||
request.setResponseCode(303)
|
||||
return responsedata
|
||||
|
||||
def render_maclist(self, request):
|
||||
address = request.getClientIP()
|
||||
dbconn = sqlite3.connect('gpcm.db')
|
||||
responsedata = (""
|
||||
"<form action='updatemaclist' method='POST'>"
|
||||
"macadr (must be in the format of aa:bb:cc:dd:ee:ff or aa-bb-cc-dd-ee-ff):<input type='text' name='macadr'>\r\n"
|
||||
"<input type='hidden' name='action' value='add'>\r\n"
|
||||
"<input type='submit' value='Register console'></form>\r\n"
|
||||
"<table border='1'>"
|
||||
"")
|
||||
dbconn.close()
|
||||
request.setHeader("Content-Type", "text/html; charset=utf-8")
|
||||
return responsedata
|
||||
|
||||
def render_GET(self, request):
|
||||
title = None
|
||||
response = ''
|
||||
if request.path == "/register":
|
||||
title = 'Register a Console'
|
||||
response = self.render_maclist(request)
|
||||
|
||||
return self.get_header(title) + response + self.get_footer()
|
||||
|
||||
def render_POST(self, request):
|
||||
if request.path == "/updatemaclist":
|
||||
return self.update_maclist(request)
|
||||
else:
|
||||
return self.get_header() + self.get_footer()
|
||||
|
||||
port = 9998
|
||||
class RegPageServer(object):
|
||||
def start(self):
|
||||
site = server.Site(RegPage(self))
|
||||
reactor.listenTCP(port, site)
|
||||
try:
|
||||
if reactor.running == False:
|
||||
reactor.run(installSignalHandlers=0)
|
||||
except ReactorAlreadyRunning:
|
||||
pass
|
||||
|
||||
if __name__ == "__main__":
|
||||
RegPageServer().start()
|
||||
Reference in New Issue
Block a user