diff options
Diffstat (limited to 'cgi/oekaki.py')
| -rw-r--r-- | cgi/oekaki.py | 401 | 
1 files changed, 207 insertions, 194 deletions
| diff --git a/cgi/oekaki.py b/cgi/oekaki.py index e20316c..e063c61 100644 --- a/cgi/oekaki.py +++ b/cgi/oekaki.py @@ -11,206 +11,219 @@ from formatting import *  from template import *  from post import * +  def oekaki(self, path_split): -  """ -  Este script hace todo lo que tiene que hacer con los -  archivos de Oekaki. -  """ -  page = '' -  skiptemplate = False -   -  if len(path_split) > 2: -    # Inicia el applet. Lo envia luego a este mismo script, a "Finish". -    if path_split[2] == 'paint': -      # Veamos que applet usar -      applet = self.formdata['oek_applet'].split('|') -       -      applet_name = applet[0] -       -      if len(applet) > 1 and applet[1] == 'y': -        applet_str = 'pro' -      else: -        applet_str = '' -       -      if len(applet) > 2 and applet[2] == 'y': -        use_selfy = True -      else: -        use_selfy = False -       -      # Obtenemos el board -      board = setBoard(self.formdata['board']) -       -      if board['allow_oekaki'] != '1': -        raise UserError, 'Esta sección no soporta oekaki.' -       -      # Veamos a quien le estamos respondiendo -      try: -        parentid = int(self.formdata['parent']) -      except: -        parentid = 0 -       -      # Vemos si el usuario quiere una animacion -      if 'oek_animation' in self.formdata.keys(): -        animation = True -        animation_str = 'animation' -      else: -        animation = False -        animation_str = '' -       -      # Nos aseguramos que la entrada es numerica -      try: -        width = int(self.formdata['oek_x']) -        height = int(self.formdata['oek_y']) -      except: -        raise UserError, 'Valores de tamaño inválidos (%s)' % repr(self.formdata) -       -      params = { -        'dir_resource': Settings.BOARDS_URL + 'oek_temp/', -        'tt.zip': 'tt_def.zip', -        'res.zip': 'res.zip', -        'MAYSCRIPT': 'true', -        'scriptable': 'true', -        'tools': applet_str, -        'layer_count': '5', -        'undo': '90', -        'undo_in_mg': '15', -        'url_save': Settings.BOARDS_URL + 'oek_temp/save.py?applet=shi'+applet_str, -        'poo': 'false', -        'send_advance': 'true', -        'send_language': 'utf8', -        'send_header': '', -        'send_header_image_type': 'false', -        'thumbnail_type': animation_str, -        'image_jpeg': 'false', -        'image_size': '92', -        'compress_level': '4' -      } -       -      if 'oek_edit' in self.formdata.keys(): -        # Si hay que editar, cargar la imagen correspondiente en el canvas -        pid = int(self.formdata['oek_edit']) -        post = FetchOne('SELECT id, file, image_width, image_height FROM posts WHERE id = %d AND boardid = %s' % (pid, board['id'])) -        editfile = Settings.BOARDS_URL + board['dir'] + '/src/' + post['file'] -         -        params['image_canvas'] = edit -        params['image_width'] = file['image_width'] -        params['image_height'] = file['image_height'] -        width = int(file['image_width']) -        height = int(file['image_height']) -      else: -        editfile = None -        params['image_width'] = str(width) -        params['image_height'] = str(height) -         -      if 'canvas' in self.formdata.keys(): -        editfile = self.formdata['canvas'] -         -      # Darle las dimensiones al exit script -      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 = os.path.join(Settings.IMAGES_DIR, board['dir'], "temp", str(ip) + ".png") - -      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 -      # 4: Parentid -      if len(path_split) >= 5: -        # Al terminar de dibujar, llegamos aqui. Damos la opcion de postearlo. -        board = setBoard(path_split[3]) -        try: -          parentid = int(path_split[4]) -        except: -          parentid = None -         -        if board['allow_oekaki'] != '1': -          raise UserError, 'Esta sección no soporta oekaki.' - -        ts = int(time.time()) -        ip    = inet_aton(self.environ["REMOTE_ADDR"]) -        fname = os.path.join(Settings.IMAGES_DIR, board['dir'], "temp", str(ip) + ".png") -        oek   = 'no' -         -        if 'filebase' in self.formdata: -          write_from_base64(fname, self.formdata['filebase']) -         -        if os.path.isfile(fname): -          oek = ip -         -        try: -          timetaken = timestamp() - int(path_split[5][:-2]) -        except: -          timetaken = 0 -         -        page += renderTemplate("board.html", {"threads": None, "oek_finish": oek, "replythread": parentid, "ts": ts}) -    elif path_split[2] == 'animation': -      try: -        board = setBoard(path_split[3]) -        file = int(path_split[4]) -      except: -        raise UserError, 'Board o archivo de animación inválido.' -       -      params = { -        'pch_file': Settings.BOARDS_URL + board['dir'] + '/src/' + str(file) + '.pch', -        'run': 'true', -        'buffer_progress': 'false', -        'buffer_canvas': 'true', -        'speed': '2', -        'res.zip': Settings.BOARDS_URL + 'oek_temp/res/' +'res.zip', -        'tt.zip': Settings.BOARDS_URL + 'oek_temp/res/' + 'tt.zip', -        'tt_size': '31' -      } -      page += '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' + \ -      '<html xmlns="http://www.w3.org/1999/xhtml">\n<head><style type="text/css">html, body{margin: 0; padding: 0;height:100%;} .full{width:100%;height:100%;}</style>\n<title>Bienvenido a Internet | Oekaki</title>\n</head>\n' + \ -      '<body bgcolor="#CFCFFF" text="#800000" link="#003399" vlink="#808080" alink="#11FF11">\n' + \ -      '<table cellpadding="0" cellspacing="0" class="full"><tr><td class="full">\n' -      page += '<applet name="pch" code="pch2.PCHViewer.class" archive="' + Settings.BOARDS_URL + 'oek_temp/PCHViewer123.jar" width="100%" height="100%">' -      for key in params.keys(): -        page += '<param name="' + key + '" value="' + cleanString(params[key]) + '" />' + "\n" -      page += '<div align="center">Java must be installed and enabled to use this applet. Please refer to our Java setup tutorial for more information.</div>' -      page += '</applet>\n</td></tr></table>\n</body>\n</html>' - -  if not skiptemplate: -    self.output = page +    """ +    Este script hace todo lo que tiene que hacer con los +    archivos de Oekaki. +    """ +    page = '' +    skiptemplate = False + +    if len(path_split) > 2: +        # Inicia el applet. Lo envia luego a este mismo script, a "Finish". +        if path_split[2] == 'paint': +            # Veamos que applet usar +            applet = self.formdata['oek_applet'].split('|') + +            applet_name = applet[0] + +            if len(applet) > 1 and applet[1] == 'y': +                applet_str = 'pro' +            else: +                applet_str = '' + +            if len(applet) > 2 and applet[2] == 'y': +                use_selfy = True +            else: +                use_selfy = False + +            # Obtenemos el board +            board = setBoard(self.formdata['board']) + +            if board['allow_oekaki'] != '1': +                raise UserError, 'Esta sección no soporta oekaki.' + +            # Veamos a quien le estamos respondiendo +            try: +                parentid = int(self.formdata['parent']) +            except: +                parentid = 0 + +            # Vemos si el usuario quiere una animacion +            if 'oek_animation' in self.formdata.keys(): +                animation = True +                animation_str = 'animation' +            else: +                animation = False +                animation_str = '' + +            # Nos aseguramos que la entrada es numerica +            try: +                width = int(self.formdata['oek_x']) +                height = int(self.formdata['oek_y']) +            except: +                raise UserError, 'Valores de tamaño inválidos (%s)' % repr( +                    self.formdata) + +            params = { +                'dir_resource': Settings.BOARDS_URL + 'oek_temp/', +                'tt.zip': 'tt_def.zip', +                'res.zip': 'res.zip', +                'MAYSCRIPT': 'true', +                'scriptable': 'true', +                'tools': applet_str, +                'layer_count': '5', +                'undo': '90', +                'undo_in_mg': '15', +                'url_save': Settings.BOARDS_URL + 'oek_temp/save.py?applet=shi'+applet_str, +                'poo': 'false', +                'send_advance': 'true', +                'send_language': 'utf8', +                'send_header': '', +                'send_header_image_type': 'false', +                'thumbnail_type': animation_str, +                'image_jpeg': 'false', +                'image_size': '92', +                'compress_level': '4' +            } + +            if 'oek_edit' in self.formdata.keys(): +                # Si hay que editar, cargar la imagen correspondiente en el canvas +                pid = int(self.formdata['oek_edit']) +                post = FetchOne( +                    'SELECT id, file, image_width, image_height FROM posts WHERE id = %d AND boardid = %s' % (pid, board['id'])) +                editfile = Settings.BOARDS_URL + \ +                    board['dir'] + '/src/' + post['file'] + +                params['image_canvas'] = edit +                params['image_width'] = file['image_width'] +                params['image_height'] = file['image_height'] +                width = int(file['image_width']) +                height = int(file['image_height']) +            else: +                editfile = None +                params['image_width'] = str(width) +                params['image_height'] = str(height) + +            if 'canvas' in self.formdata.keys(): +                editfile = self.formdata['canvas'] + +            # Darle las dimensiones al exit script +            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 = os.path.join(Settings.IMAGES_DIR, +                                 board['dir'], "temp", str(ip) + ".png") + +            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 +            # 4: Parentid +            if len(path_split) >= 5: +                # Al terminar de dibujar, llegamos aqui. Damos la opcion de postearlo. +                board = setBoard(path_split[3]) +                try: +                    parentid = int(path_split[4]) +                except: +                    parentid = None + +                if board['allow_oekaki'] != '1': +                    raise UserError, 'Esta sección no soporta oekaki.' + +                ts = int(time.time()) +                ip = inet_aton(self.environ["REMOTE_ADDR"]) +                fname = os.path.join(Settings.IMAGES_DIR, +                                     board['dir'], "temp", str(ip) + ".png") +                oek = 'no' + +                if 'filebase' in self.formdata: +                    write_from_base64(fname, self.formdata['filebase']) + +                if os.path.isfile(fname): +                    oek = ip + +                try: +                    timetaken = timestamp() - int(path_split[5][:-2]) +                except: +                    timetaken = 0 + +                page += renderTemplate("board.html", { +                                       "threads": None, "oek_finish": oek, "replythread": parentid, "ts": ts}) +        elif path_split[2] == 'animation': +            try: +                board = setBoard(path_split[3]) +                file = int(path_split[4]) +            except: +                raise UserError, 'Board o archivo de animación inválido.' + +            params = { +                'pch_file': Settings.BOARDS_URL + board['dir'] + '/src/' + str(file) + '.pch', +                'run': 'true', +                'buffer_progress': 'false', +                'buffer_canvas': 'true', +                'speed': '2', +                'res.zip': Settings.BOARDS_URL + 'oek_temp/res/' + 'res.zip', +                'tt.zip': Settings.BOARDS_URL + 'oek_temp/res/' + 'tt.zip', +                'tt_size': '31' +            } +            page += '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' + \ +                '<html xmlns="http://www.w3.org/1999/xhtml">\n<head><style type="text/css">html, body{margin: 0; padding: 0;height:100%;} .full{width:100%;height:100%;}</style>\n<title>Bienvenido a Internet | Oekaki</title>\n</head>\n' + \ +                '<body bgcolor="#CFCFFF" text="#800000" link="#003399" vlink="#808080" alink="#11FF11">\n' + \ +                '<table cellpadding="0" cellspacing="0" class="full"><tr><td class="full">\n' +            page += '<applet name="pch" code="pch2.PCHViewer.class" archive="' + \ +                Settings.BOARDS_URL + 'oek_temp/PCHViewer123.jar" width="100%" height="100%">' +            for key in params.keys(): +                page += '<param name="' + key + '" value="' + \ +                    cleanString(params[key]) + '" />' + "\n" +            page += '<div align="center">Java must be installed and enabled to use this applet. Please refer to our Java setup tutorial for more information.</div>' +            page += '</applet>\n</td></tr></table>\n</body>\n</html>' + +    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" +    # 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" +    # Check data type +    type = fp.read(1) +    if type != 'P': +        return "UNSUPPORTED" -  # Read header -  headerLength = int(fp.read(8)) -  header = fp.read(headerLength) +    # 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) +    # 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) +    # Write image +    with open(fname, 'wb') as f: +        f.write(img) -  return "OK" +    return "OK" | 
