Example #1
0
 def get(self):
     self.session = session.TornadoSession(self.application.session_manager, self)
     _get_c = self.get_arguments('c')
     _get_redirect = self.get_arguments('redirect')
     _get_close  = self.get_arguments('close')
     _post_logout = self.get_arguments('logout')
     _made_of_chars = '^\w+$'
     _valid_url = '((mailto\:|(news|(ht|f)tp(s?))\:\/\/){1}\S+)'
     _user_agent = self.request.headers["User-Agent"]
     _browser = 'style'
     _mobile_browsers = ['iPhone', 'iPod', 'BlackBerry', 'Windows Phone', 'Fennec', 'Opera Mini', 'Opera Mobi', 'MeeGo']
     for b in _mobile_browsers:
         if _user_agent.find(b) > -1:
             _browser = 'mobile'
     if _get_redirect and re.findall(_valid_url,_get_redirect[0]):
         self.render('redirect.html', redirect=_get_redirect[0])
         return
     if ''.join(_get_close):
         self.render('close.html')
         return
     if _get_c:
         if re.findall(_made_of_chars, _get_c[0]):
             if len(_get_c) <= 32:
                 responseList = chat(_get_c)
                 self.render(responseList[0],browser='style',install=responseList[1], nick=responseList[2] , name=responseList[3], maxinput=responseList[4]) 
             else:
                 self.render('welcome.html',browser='style',install=config.INSTALL,name='chat name too large')
         else:
             self.render('welcome.html',browser='style',install=config.INSTALL,name='letters and numbers only')
     elif _post_logout and  re.findall(_made_of_chars, _post_logout):
             self.session['name'] ='s' + _post_logout
             self.session.save()
             logout(_post_logout, self.session['nick'], 0)
             self.render('welcome.html',browser='style',install=config.INSTALL,name='name your chat')
     else:
             self.render('welcome.html',browser='style',install=config.INSTALL,name='name your chat')
Example #2
0
 def post(self):
     self.session = session.TornadoSession(self.application.session_manager, self)
     _valid_nick= '^[a-z]{1,12}$'
     _made_of_chars = '^\w+$'
     _valid_key = '^(\w|\/|\+|\?|\(|\)|\=)+$'
     _post_nick = ''.join(self.get_arguments('nick'))
     _post_name = ''.join(self.get_arguments('name'))
     _post_key = ''.join(self.get_arguments('key'))
     _post_pos = ''.join(self.get_arguments('pos'))
     _post_chat = ''.join(self.get_arguments('chat'))
     _post_input = ''.join(self.get_arguments('input'))
     if re.findall(_valid_nick, _post_nick) and re.findall(_made_of_chars, _post_name) and re.findall(_valid_key, _post_key):
         _post_name = _post_name.lower()
         self.session['name'] = 's' + _post_name
         self.session.save()
         if os.path.isfile(config.CHAT_LOGS + _post_name):
             _chatStat = os.stat(config.CHAT_LOGS + _post_name)
             chat = open(config.CHAT_LOGS + _post_name, "rb+")
             _chat_list = chat.readlines()
             _timestamp = int(time.time())
             if _timestamp - int(_chatStat.st_mtime) > config.TIME_LIMIT:
                 chat.close()
                 os.remove(config.CHAT_LOGS + _post_name)
                 enterchat(_post_name,_post_nick,_post_key,self)
                 return
         if _post_key == 'get' and self.session['check'] == 'OK':
             self.write(chat.readline().strip())
             return
         if len(getpeople(_chat_list)) >= config.MAXIMUM_USERS:
             self.write('full')
             return
         elif _post_nick in getpeople(_chat_list):
             self.write('inuse')
             return
         elif hasattr(self.session,'nick'):
             self.session.unset()
             self.session.destroy()
         if not hasattr(self.session,'nick'):
             enterchat(_post_name,_post_nick,_post_key,self)
             if not os.path.isfile(config.CHAT_LOGS + _post_name):
                 chat = open(config.CHAT_LOGS + _post_name, 'w+')
                 _chat_list = chat.readlines()
         else:
             self.write('error')
         return
     elif '_post_nick' in locals():
         self.write('error')
         return
     elif int(_post_pos) >= 0 and re.findall(_made_of_chars, _post_chat):
         _post_chat = _post_chat.lower()
         self.session['name'] = 's' + _post_chat
         self.session.save()
         if self.session['check'] == 'OK':
             if not os.path.isfile(config.CHAT_LOGS + _post_chat):
                 self.write('NOEXIST')
                 return
             else:
                 chat = open(config.CHAT_LOGS + _post_chat, "rb+")
                 _chat_list = chat.readlines() 
                 _pos = self.session['pos'] + int(_post_pos)
                 _sleepcounter = 0
                 while _pos >= len(_chat_list):
                     io.flush()
                     with open(config.CHAT_LOGS + _post_chat,'r+b') as _shared_mem:
                         if (_sleepcounter % (config.TIMEOUT / 4)) == 0:
                             _people = getpeople(chat)
                             _shm_id = mmap.mmap(_shared_mem.fileno(), 256, ACCESS_WRITE)
                             if not _shim_id:
                                 _last = []
                             else:
                                 _last = _shim_id
                                 for p in range(len(_people)):
                                     _timestamp = int(time.time())
                                     if _last[_people[p]] and (_timestamp - TIMEOUT) > _last[_people[p]]:
                                         _last[_people[p]] = []
                                         logout(_post_chat, _people[p], 1)
                             _timestamp = int(time.time())
                             _last[self.session['nick']] = _timestamp
                             _shm_id[0,len(_last)] = _last
                         _shim_id.close()
                         self.write(' ')
                         #if (connection_aborted()) {
                         #    return
                         #}
                         time.sleep(1)
                         _sleepcounter += 1;
                         chat = open(config.CHAT_LOGS + _post_chat, 'r+b');
                 if _pos < len(chat_list):
                     if msgcheck(_chat_list[_pos]) or re.findall(INFO_REG_EX , _chat_list[_pos]):
                         _match = re.findall('\([a-z]{1,12}\)[^\(^\[]+', _chat_list[_pos])
                         _nick = re.findall('^[a-z]{1,12}\|', _chat_list[_pos])
                         _nick = _nick[0][:-1]
                         _found = 0
                         for k in range(len(_match[0])):
                             if _match[0][k][:len(self.session['nick']) + 2] == '(%s)' % self.session['nick']:
                                 _match = _match[0][k][len(self.session['nick']) + 2:]
                                 _chat_list[_pos] = re.sub('\[:3\](.*)\[:3\]', '[:3]' + _match + '[:3]', _chat_list[_pos])
                                 _found = 1
                                 break
                         if not _nick or _nick != self.session['nick']:
                             if not _found and re.findall('\[:3\](.*)\[:3\]', _chat_list[_pos]):
                                 _chat_list[_pos] = '*'
                             else:
                                 _chat_list[_pos] = re.sub('^[a-z]{1,12}\|\w{8}', _nick, _chat_list[_pos])
                             print cgi.escape(_chat_list[_pos])
                         elif re.findall('\|\w{8}', _chat_list[_pos]):
                             _sentid = re.findall('\|\w{8}', _chat_list[_pos])
                             self.write(_sentid[:1])
         else:
             self.write('NOLOGIN')
         return
     elif _post_name and re.findall('^\w+$', _post_name) and len(_post_input) > 6:
         _post_name = _post_name.lower()
         self.session['name'] = 's' + _post_name
         self.session.save()
         chat = open(config.CHAT_LOGS + _post_name, "rb+")
         _thisnick = re.findall('^[a-z]{1,12}\|', _post_input)
         if msgcheck(_post_input) and  self.session['nick'] == _thisnick[0][0: -1]:
             if os.path.isfile(config.CHAT_LOGS + _post_name):
                 _log_it = os.open(config.CHAT_LOGS + _post_name, os.O_APPEND|os.O_EXLOCK )
                 os.write(_log_it, _post_input+"\n")
                 os.close(_log_it)
         return