Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
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
Beispiel #7
0
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
Beispiel #8
0
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
Beispiel #9
0
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
Beispiel #10
0
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
Beispiel #11
0
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
Beispiel #12
0
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
Beispiel #13
0
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
Beispiel #14
0
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)
Beispiel #15
0
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)
Beispiel #16
0
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
Beispiel #17
0
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
Beispiel #18
0
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
Beispiel #19
0
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')
Beispiel #20
0
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
Beispiel #21
0
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
Beispiel #22
0
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