aboutsummaryrefslogtreecommitdiff
path: root/cgi/framework.py
diff options
context:
space:
mode:
Diffstat (limited to 'cgi/framework.py')
-rw-r--r--cgi/framework.py815
1 files changed, 435 insertions, 380 deletions
diff --git a/cgi/framework.py b/cgi/framework.py
index f90ed92..cc7a065 100644
--- a/cgi/framework.py
+++ b/cgi/framework.py
@@ -14,453 +14,508 @@ from Cookie import SimpleCookie
from settings import Settings
from database import *
+
def setBoard(dir):
- """
- Sets the board which the script is operating on by filling Settings._.BOARD
- with the data from the db.
- """
- if not dir:
- raise UserError, _("The specified board is invalid.")
- logTime("Seteando el board " + dir)
- board = FetchOne("SELECT * FROM `boards` WHERE `dir` = '%s' LIMIT 1" % _mysql.escape_string(dir))
- if not board:
- raise UserError, _("The specified board is invalid.")
-
- board["filetypes"] = FetchAll("SELECT * FROM `boards_filetypes` INNER JOIN `filetypes` ON filetypes.id = boards_filetypes.filetypeid WHERE `boardid` = %s ORDER BY `ext` ASC" % _mysql.escape_string(board['id']))
- board["filetypes_ext"] = [filetype['ext'] for filetype in board['filetypes']]
- logTime("Board seteado.")
-
- Settings._.BOARD = board
-
- return board
+ """
+ Sets the board which the script is operating on by filling Settings._.BOARD
+ with the data from the db.
+ """
+ if not dir:
+ raise UserError, _("The specified board is invalid.")
+ logTime("Seteando el board " + dir)
+ board = FetchOne(
+ "SELECT * FROM `boards` WHERE `dir` = '%s' LIMIT 1" % _mysql.escape_string(dir))
+ if not board:
+ raise UserError, _("The specified board is invalid.")
+
+ board["filetypes"] = FetchAll(
+ "SELECT * FROM `boards_filetypes` INNER JOIN `filetypes` ON filetypes.id = boards_filetypes.filetypeid WHERE `boardid` = %s ORDER BY `ext` ASC" % _mysql.escape_string(board['id']))
+ board["filetypes_ext"] = [filetype['ext']
+ for filetype in board['filetypes']]
+ logTime("Board seteado.")
+
+ Settings._.BOARD = board
+
+ return board
+
def cleanDir(path, ext=None):
- if ext:
- filelist = [ f for f in os.listdir(path) if f.endswith("." + ext) ]
- else:
- filelist = os.listdir(path)
-
- for f in filelist:
- os.remove(os.path.join(path, f))
+ if ext:
+ filelist = [f for f in os.listdir(path) if f.endswith("." + ext)]
+ else:
+ filelist = os.listdir(path)
+
+ for f in filelist:
+ os.remove(os.path.join(path, f))
+
def addressIsBanned(ip, board):
- packed_ip = inet_aton(ip)
- bans = FetchAll("SELECT * FROM `bans` WHERE (`netmask` IS NULL AND `ip` = '"+str(packed_ip)+"') OR (`netmask` IS NOT NULL AND '"+str(packed_ip)+"' & `netmask` = `ip`)")
- logTime("SELECT * FROM `bans` WHERE (`netmask` IS NULL AND `ip` = '"+str(packed_ip)+"') OR (`netmask` IS NOT NULL AND '"+str(packed_ip)+"' & `netmask` = `ip`)")
- for ban in bans:
- if ban["boards"] != "":
- boards = pickle.loads(ban["boards"])
- if ban["boards"] == "" or board in boards:
- if board not in Settings.EXCLUDE_GLOBAL_BANS:
- return True
- return False
+ packed_ip = inet_aton(ip)
+ bans = FetchAll("SELECT * FROM `bans` WHERE (`netmask` IS NULL AND `ip` = '"+str(
+ packed_ip)+"') OR (`netmask` IS NOT NULL AND '"+str(packed_ip)+"' & `netmask` = `ip`)")
+ logTime("SELECT * FROM `bans` WHERE (`netmask` IS NULL AND `ip` = '"+str(packed_ip) +
+ "') OR (`netmask` IS NOT NULL AND '"+str(packed_ip)+"' & `netmask` = `ip`)")
+ for ban in bans:
+ if ban["boards"] != "":
+ boards = pickle.loads(ban["boards"])
+ if ban["boards"] == "" or board in boards:
+ if board not in Settings.EXCLUDE_GLOBAL_BANS:
+ return True
+ return False
+
def addressIsTor(ip):
- if Settings._.IS_TOR is None:
- res = False
- nodes = []
- if ip == '127.0.0.1': # Tor proxy address
- res = True
+ if Settings._.IS_TOR is None:
+ res = False
+ nodes = []
+ if ip == '127.0.0.1': # Tor proxy address
+ res = True
+ else:
+ with open('tor.txt') as f:
+ nodes = [line.rstrip() for line in f]
+ if ip in nodes:
+ res = True
+ Settings._.IS_TOR = res
+ return res
else:
- with open('tor.txt') as f:
- nodes = [line.rstrip() for line in f]
- if ip in nodes:
- res = True
- Settings._.IS_TOR = res
- return res
- else:
- return Settings._.IS_TOR
+ return Settings._.IS_TOR
+
def addressIsProxy(ip):
- if Settings._.IS_PROXY is None:
- res = False
- proxies = []
- with open('proxy.txt') as f:
- proxies = [line.rstrip() for line in f]
- if ip in proxies:
- res = True
- Settings._.IS_PROXY = res
- return res
- else:
- return Settings._.IS_PROXY
-
+ if Settings._.IS_PROXY is None:
+ res = False
+ proxies = []
+ with open('proxy.txt') as f:
+ proxies = [line.rstrip() for line in f]
+ if ip in proxies:
+ res = True
+ Settings._.IS_PROXY = res
+ return res
+ else:
+ return Settings._.IS_PROXY
+
+
def addressIsES(ip):
- ES = ['AR', 'BO', 'CL', 'CO', 'CR', 'CU', 'EC', 'ES', 'GF',
- 'GY', 'GT', 'HN', 'MX', 'NI', 'PA', 'PE', 'PY', 'PR', 'SR', 'UY', 'VE'] # 'BR',
- return getCountry(ip) in ES
+ ES = ['AR', 'BO', 'CL', 'CO', 'CR', 'CU', 'EC', 'ES', 'GF',
+ 'GY', 'GT', 'HN', 'MX', 'NI', 'PA', 'PE', 'PY', 'PR', 'SR', 'UY', 'VE'] # 'BR',
+ return getCountry(ip) in ES
+
def addressIsUS(ip):
- return getCountry(ip) == 'US'
+ return getCountry(ip) == 'US'
+
def getCountry(ip):
- import geoip
- return geoip.country(ip)
-
+ import geoip
+ return geoip.country(ip)
+
+
def getHost(ip):
- if Settings._.HOST is None:
- try:
- Settings._.HOST = socket.gethostbyaddr(ip)[0]
- return Settings._.HOST
- except socket.herror:
- return None
- else:
- return Settings._.HOST
-
+ if Settings._.HOST is None:
+ try:
+ Settings._.HOST = socket.gethostbyaddr(ip)[0]
+ return Settings._.HOST
+ except socket.herror:
+ return None
+ else:
+ return Settings._.HOST
+
+
def hostIsBanned(ip):
- host = getHost(ip)
- if host:
- banned_hosts = []
- for banned_host in banned_hosts:
- if host.endswith(banned_host):
- return True
- return False
- else:
- return False
-
+ host = getHost(ip)
+ if host:
+ banned_hosts = []
+ for banned_host in banned_hosts:
+ if host.endswith(banned_host):
+ return True
+ return False
+ else:
+ return False
+
+
def updateBoardSettings():
- """
- Pickle the board's settings and store it in the configuration field
- """
- board = Settings._.BOARD
- #UpdateDb("UPDATE `boards` SET `configuration` = '%s' WHERE `id` = %s LIMIT 1" % (_mysql.escape_string(configuration), board["id"]))
-
- del board["filetypes"]
- del board["filetypes_ext"]
- post_values = ["`" + _mysql.escape_string(str(key)) + "` = '" + _mysql.escape_string(str(value)) + "'" for key, value in board.iteritems()]
-
- UpdateDb("UPDATE `boards` SET %s WHERE `id` = '%s' LIMIT 1" % (", ".join(post_values), board["id"]))
+ """
+ Pickle the board's settings and store it in the configuration field
+ """
+ board = Settings._.BOARD
+ #UpdateDb("UPDATE `boards` SET `configuration` = '%s' WHERE `id` = %s LIMIT 1" % (_mysql.escape_string(configuration), board["id"]))
+
+ del board["filetypes"]
+ del board["filetypes_ext"]
+ post_values = ["`" + _mysql.escape_string(str(key)) + "` = '" + _mysql.escape_string(
+ str(value)) + "'" for key, value in board.iteritems()]
+
+ UpdateDb("UPDATE `boards` SET %s WHERE `id` = '%s' LIMIT 1" %
+ (", ".join(post_values), board["id"]))
+
def timestamp(t=None):
- """
- Create MySQL-safe timestamp from the datetime t if provided, otherwise create
- the timestamp from datetime.now()
- """
- if not t:
- t = datetime.datetime.now()
- return int(time.mktime(t.timetuple()))
+ """
+ Create MySQL-safe timestamp from the datetime t if provided, otherwise create
+ the timestamp from datetime.now()
+ """
+ if not t:
+ t = datetime.datetime.now()
+ return int(time.mktime(t.timetuple()))
+
def formatDate(t=None, home=False):
- """
- Format a datetime to a readable date
- """
- if not t:
- t = datetime.datetime.now()
-
- days = {'en': ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],
- 'es': ['lun', 'mar', 'mie', 'jue', 'vie', 'sab', 'dom'],
- 'jp': ['月', '火', '水', '木', '金', '土', '日']}
-
- daylist = days[Settings.LANG]
- format = "%d/%m/%y(%a)%H:%M:%S"
-
- if not home:
- try:
- board = Settings._.BOARD
- if board["dir"] == 'world':
- daylist = days['en']
- elif board["dir"] == '2d':
- daylist = days['jp']
- except:
- pass
-
- t = t.strftime(format)
-
- t = re.compile(r"mon", re.DOTALL | re.IGNORECASE).sub(daylist[0], t)
- t = re.compile(r"tue", re.DOTALL | re.IGNORECASE).sub(daylist[1], t)
- t = re.compile(r"wed", re.DOTALL | re.IGNORECASE).sub(daylist[2], t)
- t = re.compile(r"thu", re.DOTALL | re.IGNORECASE).sub(daylist[3], t)
- t = re.compile(r"fri", re.DOTALL | re.IGNORECASE).sub(daylist[4], t)
- t = re.compile(r"sat", re.DOTALL | re.IGNORECASE).sub(daylist[5], t)
- t = re.compile(r"sun", re.DOTALL | re.IGNORECASE).sub(daylist[6], t)
- return t
+ """
+ Format a datetime to a readable date
+ """
+ if not t:
+ t = datetime.datetime.now()
+
+ days = {'en': ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],
+ 'es': ['lun', 'mar', 'mie', 'jue', 'vie', 'sab', 'dom'],
+ 'jp': ['月', '火', '水', '木', '金', '土', '日']}
+
+ daylist = days[Settings.LANG]
+ format = "%d/%m/%y(%a)%H:%M:%S"
+
+ if not home:
+ try:
+ board = Settings._.BOARD
+ if board["dir"] == 'world':
+ daylist = days['en']
+ elif board["dir"] == '2d':
+ daylist = days['jp']
+ except:
+ pass
+
+ t = t.strftime(format)
+
+ t = re.compile(r"mon", re.DOTALL | re.IGNORECASE).sub(daylist[0], t)
+ t = re.compile(r"tue", re.DOTALL | re.IGNORECASE).sub(daylist[1], t)
+ t = re.compile(r"wed", re.DOTALL | re.IGNORECASE).sub(daylist[2], t)
+ t = re.compile(r"thu", re.DOTALL | re.IGNORECASE).sub(daylist[3], t)
+ t = re.compile(r"fri", re.DOTALL | re.IGNORECASE).sub(daylist[4], t)
+ t = re.compile(r"sat", re.DOTALL | re.IGNORECASE).sub(daylist[5], t)
+ t = re.compile(r"sun", re.DOTALL | re.IGNORECASE).sub(daylist[6], t)
+ return t
+
def formatTimestamp(t, home=False):
- """
- Format a timestamp to a readable date
- """
- return formatDate(datetime.datetime.fromtimestamp(int(t)), home)
+ """
+ Format a timestamp to a readable date
+ """
+ return formatDate(datetime.datetime.fromtimestamp(int(t)), home)
+
def timeTaken(time_start, time_finish):
- return str(round(time_finish - time_start, 3))
+ return str(round(time_finish - time_start, 3))
+
def parseIsoPeriod(t_str):
- m = re.match('P(?:(\d+)D)?T(?:(\d+)H)?(?:(\d+)M)?(\d+)S', t_str)
- if m:
- grps = [x for x in m.groups() if x]
- if len(grps) == 1:
- grps.insert(0, '0')
- grps[-1] = grps[-1].zfill(2)
- return ':'.join(grps)
- else:
- return '???'
-
+ m = re.match('P(?:(\d+)D)?T(?:(\d+)H)?(?:(\d+)M)?(\d+)S', t_str)
+ if m:
+ grps = [x for x in m.groups() if x]
+ if len(grps) == 1:
+ grps.insert(0, '0')
+ grps[-1] = grps[-1].zfill(2)
+ return ':'.join(grps)
+ else:
+ return '???'
+
+
def getFormData(self):
- """
- Process input sent to WSGI through a POST method and output it in an easy to
- retrieve format: dictionary of dictionaries in the format of {key: value}
- """
- # This must be done to avoid a bug in cgi.FieldStorage
- self.environ.setdefault("QUERY_STRING", "")
- if self.environ["QUERY_STRING"] == "rawpost":
- return None
- wsgi_input = self.environ["wsgi.input"]
- post_form = self.environ.get("wsgi.post_form")
- if (post_form is not None
- and post_form[0] is wsgi_input):
- return post_form[2]
- fs = cgi.FieldStorage(fp=wsgi_input,
- environ=self.environ,
- keep_blank_values=1)
- new_input = InputProcessed()
- post_form = (new_input, wsgi_input, fs)
- self.environ["wsgi.post_form"] = post_form
- self.environ["wsgi.input"] = new_input
-
- 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
+ """
+ Process input sent to WSGI through a POST method and output it in an easy to
+ retrieve format: dictionary of dictionaries in the format of {key: value}
+ """
+ # This must be done to avoid a bug in cgi.FieldStorage
+ self.environ.setdefault("QUERY_STRING", "")
+ if self.environ["QUERY_STRING"] == "rawpost":
+ return None
+ wsgi_input = self.environ["wsgi.input"]
+ post_form = self.environ.get("wsgi.post_form")
+ if (post_form is not None
+ and post_form[0] is wsgi_input):
+ return post_form[2]
+ fs = cgi.FieldStorage(fp=wsgi_input,
+ environ=self.environ,
+ keep_blank_values=1)
+ new_input = InputProcessed()
+ post_form = (new_input, wsgi_input, fs)
+ self.environ["wsgi.post_form"] = post_form
+ self.environ["wsgi.input"] = new_input
+
+ 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.")
- readline = readlines = __iter__ = read
+ def read(self):
+ raise EOFError("El stream de wsgi.input ya se ha consumido.")
+ readline = readlines = __iter__ = read
+
class UserError(Exception):
- pass
+ pass
+
def secure_filename(path):
- split = re.compile(r'[\0%s]' % re.escape(''.join([os.path.sep, os.path.altsep or ''])))
- return cgi.escape(split.sub('', path))
-
+ split = re.compile(r'[\0%s]' % re.escape(
+ ''.join([os.path.sep, os.path.altsep or ''])))
+ return cgi.escape(split.sub('', path))
+
+
def getMD5(data):
- m = hashlib.md5()
- m.update(data)
-
- return m.hexdigest()
+ m = hashlib.md5()
+ m.update(data)
+
+ return m.hexdigest()
+
def nullstr(len): return "\0" * len
+
def hide_data(data, length, key, secret):
- """
- Encrypts data, useful for tripcodes and IDs
- """
- crypt = rc4(nullstr(length), rc4(nullstr(32), key + secret) + data).encode('base64')
- return crypt.rstrip('\n')
+ """
+ Encrypts data, useful for tripcodes and IDs
+ """
+ crypt = rc4(nullstr(length), rc4(
+ nullstr(32), key + secret) + data).encode('base64')
+ return crypt.rstrip('\n')
+
def rc4(data, key):
- """
- rc4 implementation
- """
- x = 0
- box = range(256)
- for i in range(256):
- x = (x + box[i] + ord(key[i % len(key)])) % 256
- box[i], box[x] = box[x], box[i]
- x = 0
- y = 0
- out = []
- for char in data:
- x = (x + 1) % 256
- y = (y + box[x]) % 256
- box[x], box[y] = box[y], box[x]
- out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256]))
-
- return ''.join(out)
+ """
+ rc4 implementation
+ """
+ x = 0
+ box = range(256)
+ for i in range(256):
+ x = (x + box[i] + ord(key[i % len(key)])) % 256
+ box[i], box[x] = box[x], box[i]
+ x = 0
+ y = 0
+ out = []
+ for char in data:
+ x = (x + 1) % 256
+ y = (y + box[x]) % 256
+ box[x], box[y] = box[y], box[x]
+ out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256]))
+
+ return ''.join(out)
+
def getRandomLine(filename):
- import random
- f = open(filename, 'r')
- lines = f.readlines()
- num = random.randint(0, len(lines) - 1)
- return lines[num]
-
+ import random
+ f = open(filename, 'r')
+ lines = f.readlines()
+ num = random.randint(0, len(lines) - 1)
+ return lines[num]
+
+
def getRandomIco():
- from glob import glob
- from random import choice
- icons = glob("../static/ico/*")
- if icons:
- return choice(icons).lstrip('..')
- else:
- return ''
+ from glob import glob
+ from random import choice
+ icons = glob("../static/ico/*")
+ if icons:
+ return choice(icons).lstrip('..')
+ else:
+ return ''
+
def N_(message): return message
+
def getCookie(self, value=""):
- try:
- return urllib.unquote_plus(self._cookies[value].value)
- except KeyError:
- return None
+ try:
+ return urllib.unquote_plus(self._cookies[value].value)
+ except KeyError:
+ return None
+
def reCookie(self, key, value=""):
- board = Settings._.BOARD
- setCookie(self, key, value)
+ board = Settings._.BOARD
+ setCookie(self, key, value)
+
def setCookie(self, key, value="", max_age=None, expires=None, path="/", domain=None, secure=None):
- """
- Copied from Colubrid
- """
- if self._newcookies is None:
- self._newcookies = SimpleCookie()
- self._newcookies[key] = urllib.quote_plus(value)
- if not max_age is None:
- self._newcookies[key]["max-age"] = max_age
- if not expires is None:
- if isinstance(expires, basestring):
- self._newcookies[key]["expires"] = expires
- expires = None
- elif isinstance(expires, datetime):
- expires = expires.utctimetuple()
- elif not isinstance(expires, (int, long)):
- expires = datetime.datetime.gmtime(expires)
- else:
- raise ValueError("Se requiere de un entero o un datetime")
+ """
+ Copied from Colubrid
+ """
+ if self._newcookies is None:
+ self._newcookies = SimpleCookie()
+ self._newcookies[key] = urllib.quote_plus(value)
+ if not max_age is None:
+ self._newcookies[key]["max-age"] = max_age
if not expires is None:
- now = datetime.datetime.gmtime()
- month = _([N_("Jan"), N_("Feb"), N_("Mar"), N_("Apr"), N_("May"), N_("Jun"), N_("Jul"),
- N_("Aug"), N_("Sep"), N_("Oct"), N_("Nov"), N_("Dec")][now.tm_mon - 1])
- day = _([N_("Monday"), N_("Tuesday"), N_("Wednesday"), N_("Thursday"),
- N_("Friday"), N_("Saturday"), N_("Sunday")][expires.tm_wday])
- date = "%02d-%s-%s" % (
- now.tm_mday, month, str(now.tm_year)[-2:]
- )
- d = "%s, %s %02d:%02d:%02d GMT" % (day, date, now.tm_hour,
- now.tm_min, now.tm_sec)
- self._newcookies[key]["expires"] = d
- if not path is None:
- self._newcookies[key]["path"] = path
- if not domain is None:
- if domain != "THIS":
- self._newcookies[key]["domain"] = domain
- if not secure is None:
- self._newcookies[key]["secure"] = secure
+ if isinstance(expires, basestring):
+ self._newcookies[key]["expires"] = expires
+ expires = None
+ elif isinstance(expires, datetime):
+ expires = expires.utctimetuple()
+ elif not isinstance(expires, (int, long)):
+ expires = datetime.datetime.gmtime(expires)
+ else:
+ raise ValueError("Se requiere de un entero o un datetime")
+ if not expires is None:
+ now = datetime.datetime.gmtime()
+ month = _([N_("Jan"), N_("Feb"), N_("Mar"), N_("Apr"), N_("May"), N_("Jun"), N_("Jul"),
+ N_("Aug"), N_("Sep"), N_("Oct"), N_("Nov"), N_("Dec")][now.tm_mon - 1])
+ day = _([N_("Monday"), N_("Tuesday"), N_("Wednesday"), N_("Thursday"),
+ N_("Friday"), N_("Saturday"), N_("Sunday")][expires.tm_wday])
+ date = "%02d-%s-%s" % (
+ now.tm_mday, month, str(now.tm_year)[-2:]
+ )
+ d = "%s, %s %02d:%02d:%02d GMT" % (day, date, now.tm_hour,
+ now.tm_min, now.tm_sec)
+ self._newcookies[key]["expires"] = d
+ if not path is None:
+ self._newcookies[key]["path"] = path
+ if not domain is None:
+ if domain != "THIS":
+ self._newcookies[key]["domain"] = domain
+ if not secure is None:
+ self._newcookies[key]["secure"] = secure
+
def deleteCookie(self, key):
- """
- Copied from Colubrid
- """
- if key not in self._cookies:
- return # Cookie doesn't exist
- if self._newcookies is None:
- self._newcookies = SimpleCookie()
- self._newcookies[key] = ""
- if self._cookies[key]["path"]:
- self._newcookies[key]["path"] = self._cookies[key]["path"]
- else:
- self._newcookies[key]["path"] = "/"
- self._newcookies[key]["domain"] = self._cookies[key]["domain"]
- self._newcookies[key]["expires"] = "Thu, 01 Jan 1970 00:00:00 GMT"
-
-def elapsed_time(seconds, suffixes=['y','w','d','h','m','s'], add_s=False, separator=' '):
- """
- Takes an amount of seconds and turns it into a human-readable amount of time.
- """
- # the formatted time string to be returned
- time = []
-
- # the pieces of time to iterate over (days, hours, minutes, etc)
- # - the first piece in each tuple is the suffix (d, h, w)
- # - the second piece is the length in seconds (a day is 60s * 60m * 24h)
- parts = [(suffixes[0], 60 * 60 * 24 * 7 * 52),
- (suffixes[1], 60 * 60 * 24 * 7),
- (suffixes[2], 60 * 60 * 24),
- (suffixes[3], 60 * 60),
- (suffixes[4], 60),
- (suffixes[5], 1)]
-
- # for each time piece, grab the value and remaining seconds, and add it to
- # the time string
- for suffix, length in parts:
- value = seconds / length
- if value > 0:
- seconds = seconds % length
- time.append('%s%s' % (str(value),
- (suffix, (suffix, suffix + 's')[value > 1])[add_s]))
- if seconds < 1:
- break
-
- return separator.join(time)
+ """
+ Copied from Colubrid
+ """
+ if key not in self._cookies:
+ return # Cookie doesn't exist
+ if self._newcookies is None:
+ self._newcookies = SimpleCookie()
+ self._newcookies[key] = ""
+ if self._cookies[key]["path"]:
+ self._newcookies[key]["path"] = self._cookies[key]["path"]
+ else:
+ self._newcookies[key]["path"] = "/"
+ self._newcookies[key]["domain"] = self._cookies[key]["domain"]
+ self._newcookies[key]["expires"] = "Thu, 01 Jan 1970 00:00:00 GMT"
+
+
+def elapsed_time(seconds, suffixes=['y', 'w', 'd', 'h', 'm', 's'], add_s=False, separator=' '):
+ """
+ Takes an amount of seconds and turns it into a human-readable amount of time.
+ """
+ # the formatted time string to be returned
+ time = []
+
+ # the pieces of time to iterate over (days, hours, minutes, etc)
+ # - the first piece in each tuple is the suffix (d, h, w)
+ # - the second piece is the length in seconds (a day is 60s * 60m * 24h)
+ parts = [(suffixes[0], 60 * 60 * 24 * 7 * 52),
+ (suffixes[1], 60 * 60 * 24 * 7),
+ (suffixes[2], 60 * 60 * 24),
+ (suffixes[3], 60 * 60),
+ (suffixes[4], 60),
+ (suffixes[5], 1)]
+
+ # for each time piece, grab the value and remaining seconds, and add it to
+ # the time string
+ for suffix, length in parts:
+ value = seconds / length
+ if value > 0:
+ seconds = seconds % length
+ time.append('%s%s' % (str(value),
+ (suffix, (suffix, suffix + 's')[value > 1])[add_s]))
+ if seconds < 1:
+ break
+
+ return separator.join(time)
+
def inet_aton(ip_string):
- import socket, struct
- return struct.unpack('!L',socket.inet_aton(ip_string))[0]
+ import socket
+ import struct
+ return struct.unpack('!L', socket.inet_aton(ip_string))[0]
+
def inet_ntoa(packed_ip):
- import socket, struct
- return socket.inet_ntoa(struct.pack('!L',packed_ip))
+ import socket
+ import struct
+ return socket.inet_ntoa(struct.pack('!L', packed_ip))
+
def is_bad_proxy(pip):
- import urllib2
- import socket
- socket.setdefaulttimeout(3)
-
- try:
- proxy_handler = urllib2.ProxyHandler({'http': pip})
- opener = urllib2.build_opener(proxy_handler)
- opener.addheaders = [('User-agent', 'Mozilla/5.0')]
- urllib2.install_opener(opener)
- req=urllib2.Request('http://bienvenidoainternet.org')
- sock=urllib2.urlopen(req)
- except urllib2.HTTPError, e:
- return e.code
- except Exception, detail:
- return True
- return False
+ import urllib2
+ import socket
+ socket.setdefaulttimeout(3)
+
+ try:
+ proxy_handler = urllib2.ProxyHandler({'http': pip})
+ opener = urllib2.build_opener(proxy_handler)
+ opener.addheaders = [('User-agent', 'Mozilla/5.0')]
+ urllib2.install_opener(opener)
+ req = urllib2.Request('http://bienvenidoainternet.org')
+ sock = urllib2.urlopen(req)
+ except urllib2.HTTPError, e:
+ return e.code
+ except Exception, detail:
+ return True
+ return False
+
def send_mail(subject, srcmsg):
- import smtplib
- from email.mime.text import MIMEText
-
- msg = MIMEText(srcmsg)
- me = 'weabot@bienvenidoainternet.org'
- you = 'burocracia@bienvenidoainternet.org'
-
- msg['Subject'] = 'The contents of %s' % textfile
- msg['From'] = me
- msg['To'] = you
-
- s = smtplib.SMTP('localhost')
- s.sendmail(me, [you], msg.as_string())
- s.quit()
+ import smtplib
+ from email.mime.text import MIMEText
+
+ msg = MIMEText(srcmsg)
+ me = 'weabot@bienvenidoainternet.org'
+ you = 'burocracia@bienvenidoainternet.org'
+
+ msg['Subject'] = 'The contents of %s' % textfile
+ msg['From'] = me
+ msg['To'] = you
+
+ s = smtplib.SMTP('localhost')
+ s.sendmail(me, [you], msg.as_string())
+ s.quit()
+
class weabotLogger:
- def __init__(self):
- self.times = []
-
- def log(self, message):
- self.times.append([time.time(), message])
-
- def allTimes(self):
- output = "Time Logged action\n--------------------------\n"
- start = self.times[0][0]
- for time in self.times:
- difference = str(time[0] - start)
- difference_split = difference.split(".")
- if len(difference_split[0]) < 2:
- difference_split[0] = "0" + difference_split[0]
-
- if len(difference_split[1]) < 7:
- difference_split[1] = ("0" * (7 - len(difference_split[1]))) + difference_split[1]
- elif len(difference_split[1]) > 7:
- difference_split[1] = difference_split[1][:7]
-
- output += ".".join(difference_split) + " " + time[1] + "\n"
-
- return output
+ def __init__(self):
+ self.times = []
+
+ def log(self, message):
+ self.times.append([time.time(), message])
+
+ def allTimes(self):
+ output = "Time Logged action\n--------------------------\n"
+ start = self.times[0][0]
+ for time in self.times:
+ difference = str(time[0] - start)
+ difference_split = difference.split(".")
+ if len(difference_split[0]) < 2:
+ difference_split[0] = "0" + difference_split[0]
+
+ if len(difference_split[1]) < 7:
+ difference_split[1] = (
+ "0" * (7 - len(difference_split[1]))) + difference_split[1]
+ elif len(difference_split[1]) > 7:
+ difference_split[1] = difference_split[1][:7]
+
+ output += ".".join(difference_split) + " " + time[1] + "\n"
+
+ return output
+
logger = weabotLogger()
+
+
def logTime(message):
- global logger
- logger.log(message)
+ global logger
+ logger.log(message)
+
def logTimes():
- global logger
- return logger.allTimes()
+ global logger
+ return logger.allTimes()