From ff6bf1b045fa810989a3efc78624123d3fc97f19 Mon Sep 17 00:00:00 2001
From: z411
Date: Mon, 1 Apr 2019 04:28:52 -0300
Subject: Reimplementado oekaki en Python y otros cambios
- Portados algoritmos de guardado de imagen a Python e incorporados en weabot
- Ahora los dibujos temporales se guardan en el directorio del board (adiós oek_temp)
- (Temporal) Los dibujos no se borran si no que se guardan como .bak
- Arreglado bug donde se pierde el dibujo si hubo cualquier problema al subir
---
cgi/framework.py | 24 +++++++++++----------
cgi/oekaki.py | 56 ++++++++++++++++++++++++++++++++++++++++--------
cgi/templates/board.html | 2 +-
cgi/templates/paint.html | 4 ++--
cgi/weabot.py | 18 ++++++++++++----
static/js/wpaint/bai.js | 5 +++--
6 files changed, 80 insertions(+), 29 deletions(-)
diff --git a/cgi/framework.py b/cgi/framework.py
index e827f67..053bef0 100644
--- a/cgi/framework.py
+++ b/cgi/framework.py
@@ -235,17 +235,19 @@ def getFormData(self):
self.environ["wsgi.post_form"] = post_form
self.environ["wsgi.input"] = new_input
- formdata = {}
- for key in dict(fs):
- try:
- formdata.update({key: fs[key].value})
- if key == "file":
- formdata.update({"file_original": secure_filename(fs[key].filename)})
- except AttributeError:
- formdata.update({key: fs[key]})
-
- return formdata
-
+ try:
+ formdata = {}
+ for key in dict(fs):
+ try:
+ formdata.update({key: fs[key].value})
+ if key == "file":
+ formdata.update({"file_original": secure_filename(fs[key].filename)})
+ except AttributeError:
+ formdata.update({key: fs[key]})
+
+ return formdata
+ except TypeError:
+ return fs
class InputProcessed(object):
def read(self):
raise EOFError("El stream de wsgi.input ya se ha consumido.")
diff --git a/cgi/oekaki.py b/cgi/oekaki.py
index 14446d7..14c3a1d 100644
--- a/cgi/oekaki.py
+++ b/cgi/oekaki.py
@@ -74,7 +74,7 @@ def oekaki(self, path_split):
'layer_count': '5',
'undo': '90',
'undo_in_mg': '15',
- 'url_save': Settings.BOARDS_URL + 'oek_temp/save.php?applet=shi'+applet_str,
+ 'url_save': Settings.BOARDS_URL + 'oek_temp/save.py?applet=shi'+applet_str,
'poo': 'false',
'send_advance': 'true',
'send_language': 'utf8',
@@ -109,6 +109,19 @@ def oekaki(self, path_split):
params['url_exit'] = Settings.CGI_URL + 'oekaki/finish/' + board['dir'] + '/' + str(parentid)
page += renderTemplate("paint.html", {'applet': applet_name, 'edit': editfile, 'replythread': parentid, 'width': width, 'height': height, 'params': params, 'selfy': use_selfy})
+ elif path_split[2] == 'save':
+ # path splits:
+ # 3: Board
+ # 4: Data format
+ board = setBoard(path_split[3])
+
+ ip = inet_aton(self.environ["REMOTE_ADDR"])
+ fname = "%s/%s/temp/%d.png" % (Settings.IMAGES_DIR, board['dir'], ip)
+
+ if path_split[4] == 'b64':
+ page = write_from_base64(fname, self.formdata['image'])
+ elif path_split[4] == 'paintbbs':
+ page = write_from_shi(fname, self.environ["wsgi.input"])
elif path_split[2] == 'finish':
# path splits:
# 3: Board
@@ -126,17 +139,11 @@ def oekaki(self, path_split):
ts = int(time.time())
ip = inet_aton(self.environ["REMOTE_ADDR"])
- fname = "%s/oek_temp/%d.png" % (Settings.HOME_DIR, ip)
+ fname = "%s/%s/temp/%d.png" % (Settings.IMAGES_DIR, board['dir'], ip)
oek = 'no'
if 'filebase' in self.formdata:
- img = self.formdata['filebase']
- if img.startswith("data:image/png;base64,"):
- img = img[22:]
- img = img.replace(' ', '+')
- img = img.decode('base64')
- with open(fname, 'wb') as f:
- f.write(img)
+ write_from_base64(fname, self.formdata['filebase'])
if os.path.isfile(fname):
oek = ip
@@ -176,3 +183,34 @@ def oekaki(self, path_split):
if not skiptemplate:
self.output = page
+
+def write_from_base64(fname, data):
+ # Skip header
+ if data.startswith("data:image/png;base64,"):
+ data = data[22:]
+ data = data.replace(' ', '+')
+ data = data.decode('base64')
+ with open(fname, 'wb') as f:
+ f.write(data)
+ return "OK"
+
+def write_from_shi(fname, fp):
+ # Check data type
+ type = fp.read(1)
+ if type != 'P':
+ return "UNSUPPORTED"
+
+ # Read header
+ headerLength = int(fp.read(8))
+ header = fp.read(headerLength)
+
+ # Read image data
+ imgLength = int(fp.read(8))
+ fp.read(2) # TODO: seek() isn't working for some reason. Debug.
+ img = fp.read(imgLength)
+
+ # Write image
+ with open(fname, 'wb') as f:
+ f.write(img)
+
+ return "OK"
\ No newline at end of file
diff --git a/cgi/templates/board.html b/cgi/templates/board.html
index 6ded4c5..09ed67d 100644
--- a/cgi/templates/board.html
+++ b/cgi/templates/board.html
@@ -31,7 +31,7 @@
No hay dibujo
-
+
diff --git a/cgi/templates/paint.html b/cgi/templates/paint.html
index 476babe..945a8d2 100644
--- a/cgi/templates/paint.html
+++ b/cgi/templates/paint.html
@@ -27,7 +27,7 @@
-
+
@@ -57,7 +57,7 @@
-