74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
import os
|
|
import sys
|
|
import traceback
|
|
|
|
import tornado.gen
|
|
import tornado.web
|
|
from raven.contrib.tornado import SentryMixin
|
|
|
|
from common.log import logUtils as log
|
|
from common.ripple import userUtils
|
|
from common.web import requestsManager
|
|
from constants import exceptions
|
|
from common import generalUtils
|
|
from objects import glob
|
|
from common.sentry import sentry
|
|
|
|
MODULE_NAME = "screenshot"
|
|
class handler(requestsManager.asyncRequestHandler):
|
|
"""
|
|
Handler for /web/osu-screenshot.php
|
|
"""
|
|
@tornado.web.asynchronous
|
|
@tornado.gen.engine
|
|
@sentry.captureTornado
|
|
def asyncPost(self):
|
|
try:
|
|
if glob.debug:
|
|
requestsManager.printArguments(self)
|
|
|
|
# Make sure screenshot file was passed
|
|
if "ss" not in self.request.files:
|
|
raise exceptions.invalidArgumentsException(MODULE_NAME)
|
|
|
|
# Check user auth because of sneaky people
|
|
if not requestsManager.checkArguments(self.request.arguments, ["u", "p"]):
|
|
raise exceptions.invalidArgumentsException(MODULE_NAME)
|
|
username = self.get_argument("u")
|
|
password = self.get_argument("p")
|
|
ip = self.getRequestIP()
|
|
userID = userUtils.getID(username)
|
|
if not userUtils.checkLogin(userID, password):
|
|
raise exceptions.loginFailedException(MODULE_NAME, username)
|
|
if userUtils.check2FA(userID, ip):
|
|
raise exceptions.need2FAException(MODULE_NAME, username, ip)
|
|
|
|
# Rate limit
|
|
if glob.redis.get("lets:screenshot:{}".format(userID)) is not None:
|
|
self.write("no")
|
|
return
|
|
glob.redis.set("lets:screenshot:{}".format(userID), 1, 60)
|
|
|
|
# Get a random screenshot id
|
|
found = False
|
|
screenshotID = ""
|
|
while not found:
|
|
screenshotID = generalUtils.randomString(8)
|
|
if not os.path.isfile(".data/screenshots/{}.jpg".format(screenshotID)):
|
|
found = True
|
|
|
|
# Write screenshot file to .data folder
|
|
with open(".data/screenshots/{}.jpg".format(screenshotID), "wb") as f:
|
|
f.write(self.request.files["ss"][0]["body"])
|
|
|
|
# Output
|
|
log.info("New screenshot ({})".format(screenshotID))
|
|
|
|
# Return screenshot link
|
|
self.write("{}/ss/{}.jpg".format(glob.conf.config["server"]["servername"], screenshotID))
|
|
except exceptions.need2FAException:
|
|
pass
|
|
except exceptions.invalidArgumentsException:
|
|
pass
|
|
except exceptions.loginFailedException:
|
|
pass |