def handle_signoff(request, path = None): response = redirect('/signon') remote.send_request(request, URL_SIGN_OFF) force_sign_out(request, response) return response
def handle_list(request, path): try: redirect_if_no_session(request) args = path.split("/") try: page = int(args[0]) except: page = 1 query = URL + "?page=%d" % page result = remote.send_request(request, query) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup) data = default_template_vars(u"받은 쪽지함 - %d 페이지" % (page), request, "inbox") data.update(inbox.parse_list(html, soup)) data["pages"] = filter(lambda x: x > 0 and x <= data["maxpages"], range(page - 2, page + 3)) data["page"] = page return render_to_response("inbox_list.html", data) except redirection, e: return e.where
def handle_view(request, path): try: redirect_if_no_session(request) try: args = path.split('/') no = int(args[0]) except: return error(request, u'잘못된 요청입니다.') query = URL + '?exec=view&no=%d' % no result = remote.send_request(request, query) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup) output = inbox_sent.parse_view(html, soup) data = default_template_vars(u'보낸 쪽지함 - %s' % (output['topic']), request, 'inbox_sent') data.update(output) data['no'] = no return render_to_response('inbox_sent_view.html', data) except redirection, e: return e.where
def handle_view(request, path): try: redirect_if_no_session(request) try: args = path.split("/") no = int(args[0]) except: return error(request, u"잘못된 요청입니다.") query = URL + "?exec=view&no=%d" % no result = remote.send_request(request, query) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup) output = inbox.parse_view(html, soup) data = default_template_vars(u"받은 쪽지함 - %s" % (output["topic"]), request, "inbox") data.update(output) data["no"] = no return render_to_response("inbox_view.html", data) except redirection, e: return e.where
def handle_get(request, path): try: redirect_if_no_session(request) args = path.split('/') if len(args) < 2: return error(request, u'잘못된 인자입니다.') dest = args[0] no = int(args[1]) query = URL + '?id=%s&no=%d&mode=modify' % (pagedefs.PAGE_IDS[dest], no) result = remote.send_request(request, query, referer=URL) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup, pagedefs.PAGE_PARSERS[dest]) errcode, errmsg = pagedefs.PAGE_PARSERS[dest].check_error(request, html, soup) if errcode: return error_forward(request, errmsg) data = default_template_vars(u'%s - 글 수정' % pagedefs.PAGE_NAMES[dest], request, dest) data.update(pagedefs.PAGE_PARSERS[dest].check_write(dest, html, soup)) data['bid'] = dest data['target'] = '/modify/%s/%d' % (dest, no) return render_to_response('post.html', data) except redirection, e: return e.where
def handle_delete_comment(request, path): try: redirect_if_no_session(request) args = path.split('/') if len(args) < 3: return error(request, u'잘못된 인자입니다.') dest = args[0] no = int(args[1]) cno = int(args[2]) query = {'id': pagedefs.PAGE_IDS[dest], 'no': no, 'c_no': cno} l = remote.send_request(request, URL_DELETE_COMMENT, urllib.urlencode(query), referer=URL_DELETE_COMMENT) result, soup = remote.postprocess(l.read()) redirect_if_not_signed_on(request, result, soup, pagedefs.PAGE_PARSERS[dest]) errcode, errmsg = pagedefs.PAGE_PARSERS[dest].check_error(request, result, soup) if errcode: return error_forward(request, errmsg) except redirection, e: return e.where
def handle_comment(request, path): try: redirect_if_no_session(request) args = path.split('/') if len(args) < 2: return error(request, u'잘못된 인자입니다.') dest = args[0] no = args[1] if not pagedefs.PAGE_IDS.has_key(dest): return error(request, u'정의되지 않은 페이지입니다.') try: memo = request.POST['comment'].encode(TARGET_ENCODING) except: return error(request, u'내용을 입력하셔야 합니다.') query = {'id': pagedefs.PAGE_IDS[dest], 'no': no, 'memo': memo} l = remote.send_request(request, URL_POST_COMMENT, urllib.urlencode(query), referer=URL_REFERER) result, soup = remote.postprocess(l.read()) redirect_if_not_signed_on(request, result, soup, pagedefs.PAGE_PARSERS[dest]) errcode, errmsg = pagedefs.PAGE_PARSERS[dest].check_error(request, result, soup) if errcode: return error_forward(request, errmsg) except redirection, e: return e.where
def attempt_sign_on(request, response, userid, passwd): ip = request.META['REMOTE_ADDR'] if ip == '127.0.0.1': ip = request.META['HTTP_X_REAL_IP'] ua = request.META['HTTP_USER_AGENT'] if request.META.has_key('HTTP_USER_AGENT') else None encoded = urllib.urlencode( {'user_id': userid.encode(TARGET_ENCODING), 'password': passwd.encode(TARGET_ENCODING), 's_url': 'about:blank'} ) max_age = 365*24*60*60 expires = datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age) try: sessid = request.COOKIES['session'] except: sessid = generate_session_id() response.set_cookie('session', sessid, expires=expires, max_age=max_age) m = urllib2.urlopen(URL_MENU) result, soup = remote.postprocess(m.read()) errid, errmsg = find_error(result, soup) if errid: registry.audit(userid, sessid, ip, ua, False, why=errmsg) raise SignOnException(error(request, errmsg)) try: sc = m.headers['Set-Cookie'] phpsessid = re.match('PHPSESSID=([0-9a-z]+)', sc).group(1) except e: registry.audit(userid, sessid, ip, ua, False, why=u'알 수 없음') raise e l = remote.send_request(request, URL_SIGN_ON, encoded, phpsessid) result, soup = remote.postprocess(l.read()) errid, errmsg = find_error(result, soup) if errid: registry.audit(userid, sessid, ip, ua, False, why=errmsg) raise SignOnException(error(request, errmsg)) if 'about:blank' in result: # succeeded registry.register(sessid, userid, phpsessid) registry.audit(userid, sessid, ip, ua, True) # save form data if needed if request.POST.has_key('saveform') and request.POST['saveform'] == 'true': response.set_cookie('userid', userid, expires=expires, max_age=max_age) response.set_cookie('password', passwd, expires=expires, max_age=max_age) else: if request.COOKIES.has_key('userid'): # clear cookie if deselected response.delete_cookie('userid') response.delete_cookie('password') return True else: registry.audit(userid, sessid, ip, ua, False, why=u'잘못된 아이디 또는 비밀번호 조합') return False
def handle_list(request, path): try: redirect_if_no_session(request) args = path.split('/') try: page = int(args[0]) except: page = 1 query = URL + '?page=%d' % page result = remote.send_request(request, query) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup) data = default_template_vars(u'보낸 쪽지함 - %d 페이지' % (page), request, 'inbox_sent') data.update(inbox_sent.parse_list(html, soup)) data['pages'] = filter(lambda x: x > 0 and x <= data['maxpages'], range(page-2, page+3)) data['page'] = page return render_to_response('inbox_sent_list.html', data) except redirection, e: return e.where
def get_zantan(request): result = remote.send_request(request, URL_MODIFY) html, soup = remote.postprocess(result.read()) try: return int(soup.findAll('td', {'style': 'text-align:left;padding-left:10px;'})[1].contents[1].text) except: return None
def get_sign_on_status(request, page, soup): result = remote.send_request(request, URL_MENU) html, soup = remote.postprocess(result.read()) if len(soup.findAll('input', {'type': 'password'})) > 0: return False else: return True
def get_my_nickname(request): result = remote.send_request(request, URL_MENU) html, soup = remote.postprocess(result.read()) try: return soup.find('a', {'onfocus': 'blur()'}).text except: return None
def handle(request, path): try: redirect_if_no_session(request) args = path.split('/') if len(args) < 2: return error(request, u'잘못된 인자입니다.') try: dest = args[0] no = int(args[1]) except: return error(request, u'잘못된 대상입니다.') try: pq = request.GET['pq'] except: pq = None if not pagedefs.PAGE_IDS.has_key(dest): return error(request, u'정의되지 않은 페이지입니다.') query = URL + "?id=%s&no=%d" % (pagedefs.PAGE_IDS[dest], no) result = remote.send_request(request, query) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup, pagedefs.PAGE_PARSERS[dest]) errcode, errmsg = pagedefs.PAGE_PARSERS[dest].check_error(request, html, soup) if errcode: return error_forward(request, errmsg) # For internal images for x in soup.findAll('img'): if x['src'][0:5] == 'data/': x['src'] = "http://excf.com/bbs/" + x['src'] #if not 'aprilfools' in request.COOKIES: # for x in soup.findAll('img'): # x['src'] = 'http://prx.influx.kr/convert/negate?uri=%s' % (urllib.quote(x['src'])) output = pagedefs.PAGE_PARSERS[dest].parse_view(dest, html, soup) output['bid'] = dest output['pid'] = no if pq: output['pq'] = urllib.unquote(pq) data = default_template_vars(u'%s - %s' % (pagedefs.PAGE_NAMES[dest], output['subject']), request, dest) data.update(output) return render_to_response('view.html', data) except redirection, e: return e.where
def handle_article_get(request, path): try: redirect_if_no_session(request) sid = get_session_id(request) sess = registry.query(sid) prefs = registry.get_prefs(sid) dest = check_arg(path) if not dest: return error(request, u'잘못된 인자입니다.') query = URL_POST_PAGE + '?id=%s' % (pagedefs.PAGE_IDS[dest]) result = remote.send_request(request, query, referer=URL_POST_PAGE) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup, pagedefs.PAGE_PARSERS[dest]) errcode, errmsg = pagedefs.PAGE_PARSERS[dest].check_error(request, html, soup) if errcode: return error_forward(request, errmsg) data = default_template_vars(u'%s - 새 글 쓰기' % pagedefs.PAGE_NAMES[dest], request, dest) data.update(pagedefs.PAGE_PARSERS[dest].check_write(dest, html, soup)) if request.META['HTTP_USER_AGENT']: ua = request.META['HTTP_USER_AGENT'] if (('iPhone' in ua or 'iPod' in ua) and 'iPhone OS' in ua) or 'iPad' in ua: if 'OS 6_' in ua or 'OS 7_' in ua or 'OS 8_' in ua: pass else: data['iphone'] = True data['session'] = md5(request.COOKIES['session']).hexdigest() if dest == 'free': zantan = 15 - get_zantan(request) if zantan: data['zantan'] = zantan if prefs.photo_resize: data['size'] = prefs.photo_resize data['bid'] = dest data['target'] = '/post/%s' % dest data['mode'] = 'post' except redirection, e: return e.where
def handle_article_post(request, path): try: redirect_if_no_session(request) sid = get_session_id(request) sess = registry.query(sid) dest = check_arg(path) if not dest: return error(request, u'잘못된 인자입니다.') try: subject = request.POST['subject'].encode(TARGET_ENCODING) contents = request.POST['contents'].encode(TARGET_ENCODING) if not subject or not contents: raise Exception except: return error(request, u'내용을 입력해 주셔야 합니다.') keys = map(lambda x: 'file%d' % x, sorted(map(lambda x: int(x[4:]), request.FILES.keys()))) keys.reverse() for f in keys: try: prefs = registry.get_prefs(sid) url = uploader.upload(request, request.FILES[f], size=prefs.photo_resize, bid=dest, uid=sess[0]) cx = '<img src=\'%s\' alt=\'%s\' />\n\n' % (url, request.FILES[f].name) except Exception, e: cx = u'업로드 실패하였습니다: <b>%s</b> (%s)\n\n' % (request.FILES[f].name, str(e)) contents = cx.encode(TARGET_ENCODING) + contents query = {'subject': subject, 'memo': contents, 'mode': 'write', 'id': pagedefs.PAGE_IDS[dest], 'use_html': '1'} try: query['category'] = request.POST['category'] except: pass l = remote.send_request(request, URL_POST, urllib.urlencode(query), referer=URL_REFERER) result, soup = remote.postprocess(l.read()) redirect_if_not_signed_on(request, result, soup, pagedefs.PAGE_PARSERS[dest]) errcode, errmsg = pagedefs.PAGE_PARSERS[dest].check_error(request, result, soup) if errcode: return error_forward(request, errmsg)
def handle_send_get(request, uid): query = URL_NEW_MEMO + "?member_no=%d" % uid result = remote.send_request(request, query) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup) data = default_template_vars(u"새 쪽지", request) try: data.update(inbox.parse_new(html, soup)) except: return error(request, u"없는 사용자입니다.") data["uid"] = uid if request.GET.has_key("qp"): data["redirect_to"] = request.GET["qp"] return render_to_response("inbox_new.html", data)
def handle_delete(request, path): try: redirect_if_no_session(request) try: args = path.split('/') no = int(args[0]) except: return error query = URL + '?exec=del&no=%d' % no result = remote.send_request(request, query) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup) return redirect('/inbox_sent') except redirection, e: return e.where
def handle_adult_check_get(request): try: redirect_if_no_session(request) try: page = int(args[0]) except: page = 1 query = URL + '?page=%d' % page result = remote.send_request(request, query) html, soup = remote.postprocess(result.read()) data = default_template_vars(u'성인인증', request, 'that') data['redirect'] = request.GET.get('redirect', None) redirect_if_not_signed_on(request, html, soup) return render_to_response('adult_check.html', data) except redirection, e: return e.where
def handle_post(request, path): try: redirect_if_no_session(request) args = path.split('/') if len(args) < 2: return error(request, u'잘못된 인자입니다.') dest = args[0] no = int(args[1]) try: subject = request.POST['subject'].encode(TARGET_ENCODING) contents = request.POST['contents'].encode(TARGET_ENCODING) if not subject or not contents: raise Exception except: return error(request, u'내용을 입력해 주셔야 합니다.') query = {'subject': subject, 'memo': contents, 'mode': 'modify', 'id': pagedefs.PAGE_IDS[dest], 'use_html': '1', 'no': no} try: query['category'] = request.POST['category'] except: pass l = remote.send_request(request, URL_POST, urllib.urlencode(query), referer=URL_POST) result, soup = remote.postprocess(l.read()) redirect_if_not_signed_on(request, result, soup, pagedefs.PAGE_PARSERS[dest]) errcode, errmsg = pagedefs.PAGE_PARSERS[dest].check_error(request, result, soup) if errcode: return error_forward(request, errmsg) except redirection, e: return e.where
def handle_send_post(request, uid): if request.GET.has_key("qp"): redir = request.GET["qp"] else: redir = "/inbox" try: topic = request.POST["subject"].encode(TARGET_ENCODING) body = request.POST["body"].encode(TARGET_ENCODING) except: return error(u"내용을 입력해 주십시오.") query = {"html": "1", "member_no": str(uid), "kind": "1", "subject": topic, "memo": body} l = remote.send_request(request, URL_SEND_MEMO, urllib.urlencode(query), referer=URL_REFERER) result, soup = remote.postprocess(l.read()) redirect_if_not_signed_on(request, result, soup) response = redirect(redir) response.delete_cookie("unsaved_body") response.delete_cookie("unsaved_subject") return response
def attempt_adult_check(request, response, ssn1, ssn2): ip = request.META['REMOTE_ADDR'] if ip == '127.0.0.1': ip = request.META['HTTP_X_REAL_IP'] ua = request.META['HTTP_USER_AGENT'] if request.META.has_key('HTTP_USER_AGENT') else None encoded = urllib.urlencode( {'resno1': ssn1.encode(TARGET_ENCODING), 'resno2': ssn2.encode(TARGET_ENCODING), 'redirect_to': '/bbs/zboard.php?id=ddf'.encode(TARGET_ENCODING)} ) # user is already logged in this moment. userid, phpsessid = registry.query(request.COOKIES['session']) l = remote.send_request(request, URL_ADULT_CHECK, encoded, phpsessid) result, soup = remote.postprocess(l.read()) # meh. if u"잘못된 주민등록번호입니다." in result: return False else: return True
def handle_post(request): sess = get_session_id(request) if request.POST['domain'] == 'mobile': try: resize = int(request.POST['resize']) if resize < 450: resize = 450 except: resize = 1600 set_prefs(sess, int(request.POST['resize']), request.POST['css']) elif request.POST['domain'] == 'global': nickname = request.POST['nickname'].encode(TARGET_ENCODING) l = remote.send_request(request, URL_NICKNAME_SET, urllib.urlencode({'name': nickname})) result, soup = remote.postprocess(l.read()) redirect_if_not_signed_on(request, result, soup, pagedefs.PAGE_PARSERS['free']) errcode, errmsg = pagedefs.PAGE_PARSERS['free'].check_error(request, result, soup) if errcode: return error_forward(request, errmsg) return redirect('/config')
def handle(request, path): try: redirect_if_no_session(request) args = path.split('/') dest = args[0] page = 1 divpage = -1 search = ['subject', 'body'] searchterm = '' category = None if request.GET.has_key('category'): category = request.GET['category'] base = 1 try: page = int(args[base]) base += 1 except: pass it = iter(args[base:]) while True: try: key = it.next() if key == 'div': divpage = int(it.next()) elif key == 'search': sq = it.next() if sq == 'myself': search = ['name_exact'] searchterm = common.get_my_nickname(request) else: search = sq.split('+') searchterm = it.next() except StopIteration: break if not pagedefs.PAGE_IDS.has_key(dest): return error(request, u'정의되지 않은 페이지입니다.') query = URL + '?id=%s&page=%d' % (pagedefs.PAGE_IDS[dest], page) if category: query += '&category=%s' % category if divpage >= 0: query += '&divpage=%d' % divpage if searchterm: comp = lambda x: 'on' if x in search else 'off' sn1 = comp('name_exact') if sn1 == 'on': sn = 'on' else: sn = comp('name') ss = comp('subject') sc = comp('body') sr = comp('comments') query += '&sn1=%s&sn=%s&ss=%s&sc=%s&sr=%s&keyword=%s' % (sn1, sn, ss, sc, sr, urllib.quote(searchterm.encode(TARGET_ENCODING))) result = remote.send_request(request, query) html, soup = remote.postprocess(result.read()) redirect_if_not_signed_on(request, html, soup, pagedefs.PAGE_PARSERS[dest]) errcode, errmsg = pagedefs.PAGE_PARSERS[dest].check_error(request, html, soup) if errcode: return error_forward(request, errmsg) output = pagedefs.PAGE_PARSERS[dest].parse_list(dest, html, soup) if output.get('no_adult_check', False): redirect_if_no_adult_check(request) output['bid'] = dest output['page'] = page output['search'] = search output['searchquery'] = '' if searchterm: output['searchterm'] = searchterm output['searchquery'] = '/search/%s/%s' % ('+'.join(search), searchterm) if category: output['category'] = category output['searchquery'] += '?category=%s' % category if divpage >= 0: output['div'] = divpage output['divquery'] = '/div/%d' % divpage output['listquery'] = urllib.quote(path.encode('utf-8')) try: maxpages = output['maxpages'] except: maxpages = 1 pages = filter(lambda x: x > 0 and x <= maxpages, range(page-2, page+3)) output['pages'] = pages data = default_template_vars(u'%s - %d 페이지' % (pagedefs.PAGE_NAMES[dest], page), request, dest) data.update(output) return render_to_response('list.html', data) except redirection, e: return e.where