예제 #1
0
파일: auth.py 프로젝트: artss/point-www-new
def reset_password(code):
    if env.request.method != "POST":
        if env.request.args("changed"):
            return render("/auth/new-password-changed.html")
        if env.request.args("fail"):
            return render("/auth/new-password-fail.html")
        return render("/auth/new-password.html")

    errors = []

    password = env.request.args("password")
    confirm = env.request.args("confirm")

    if not password:
        errors.append("password")
    if password != confirm:
        errors.append("confirm")

    if errors:
        return render("/auth/new-password.html", errors=errors)

    if env.user.id:
        env.user.logout()

    try:
        user = users.reset_password(code, password)
    except UserNotFound:
        return Response(redirect="%s://%s/remember/%s?fail=1" % (env.request.protocol, settings.domain, code))
    WebUser(user.id).authenticate()
    return Response(redirect="%s://%s/remember/%s?changed=1" % (env.request.protocol, settings.domain, code))
예제 #2
0
def reset_password(code):
    if env.request.method != 'POST':
        if env.request.args('changed'):
            return render('/auth/new-password-changed.html')
        if env.request.args('fail'):
            return render('/auth/new-password-fail.html')
        return render('/auth/new-password.html')

    errors = []

    password = env.request.args('password')
    confirm = env.request.args('confirm')

    if not password:
        errors.append('password')
    if password != confirm:
        errors.append('confirm')

    if errors:
        return render('/auth/new-password.html', errors=errors)

    if env.user.id:
        env.user.logout()

    try:
        user = users.reset_password(code, password)
    except UserNotFound:
        return Response(redirect='%s://%s/remember/%s?fail=1' % \
                        (env.request.protocol, settings.domain, code))
    WebUser(user.id).authenticate()
    return Response(redirect='%s://%s/remember/%s?changed=1' % \
                        (env.request.protocol, settings.domain, code))
예제 #3
0
파일: auth.py 프로젝트: ilyaguy/point-www
def login():
    if env.user.id:
        return Response().redirect('%s://%s.%s/' % \
                                   (env.request.protocol,
                                    env.user.login, settings.domain))

    referer = get_referer()

    if env.request.method == 'GET':
        return render('/auth/login.html', referer=referer, fields=ULOGIN_FIELDS)

    try:
        login = env.request.args('login')
        password = env.request.args('password')
        if not login or not password:
            raise NotAuthorized
        env.user.authenticate(login, password)
        if env.request.is_xhr:
            return Response(json.dumps({'ok': True}),
                            mimetype='application/json')
        else:
            return Response(redirect=referer)
    except (KeyError, NotAuthorized):
        if env.request.is_xhr:
            return Response(json.dumps({'error': 'credentials'}),
                            mimetype='application/json')
        else:
            return render('/auth/login.html', errors=['credentials'],
                                         referer=referer, fields=ULOGIN_FIELDS)

    return Response(redirect=referer)
예제 #4
0
파일: auth.py 프로젝트: Raegdan/www-new
def reset_password(code):
    if env.request.method != 'POST':
        if env.request.args('changed'):
            return render('/auth/new-password-changed.html')
        if env.request.args('fail'):
            return render('/auth/new-password-fail.html')
        return render('/auth/new-password.html')

    errors = []

    password = env.request.args('password')
    confirm = env.request.args('confirm')

    if not password:
        errors.append('password')
    if password != confirm:
        errors.append('confirm')

    if errors:
        return render('/auth/new-password.html', errors=errors)

    if env.user.id:
        env.user.logout()

    try:
        user = users.reset_password(code, password)
    except UserNotFound:
        return Response(redirect='%s://%s/remember/%s?fail=1' % \
                        (env.request.protocol, settings.domain, code))
    WebUser(user.id).authenticate()
    return Response(redirect='%s://%s/remember/%s?changed=1' % \
                        (env.request.protocol, settings.domain, code))
예제 #5
0
def search_posts():
    search_text = env.request.args('text', '').strip().decode('utf-8')
    if not search_text:
        return render('/search.html', search_text='', page=1, results=[])

    try:
        page = int(env.request.args('page', 1))
    except ValueError:
        page = 1

    offset = (page - 1) * settings.page_limit

    user = env.owner if env.owner else None

    try:
        results, has_next, total = search.search_posts(
            search_text, user=user, offset=offset, limit=settings.page_limit)

        return render('/search.html',
                      search_text=search_text,
                      results=results,
                      page=page,
                      has_next=has_next,
                      total=total)
    except:
        return render('/search-error.html')
예제 #6
0
파일: auth.py 프로젝트: artss/point-www-new
def ulogin():
    if env.user.id:
        raise AlreadyAuthorized

    sess = Session()

    if env.request.method == "POST":
        url = "http://ulogin.ru/token.php?token=%s&host=%s" % (env.request.args("token"), settings.domain)
        try:
            resp = urllib2.urlopen(url)
            data = dict.fromkeys(ULOGIN_FIELDS)
            data.update(json.loads(resp.read()))
            resp.close()
        except urllib2.URLError:
            return render("/auth/login.html", fields=ULOGIN_FIELDS, errors=["ulogin-fail"])

        try:
            env.user.authenticate_ulogin(data["network"], data["uid"])
            if env.user.id:
                return Response(redirect=referer())
        except NotAuthorized:
            pass

        login = data["nickname"].strip(u" -+.")
        if login:
            login = re.sub(r"[\._\-\+]+", "-", login)

        info = {
            "login": login,
            "network": data["network"],
            "uid": data["uid"],
            "name": ("%s %s" % (data["first_name"], data["last_name"])).strip(),
            "email": data["email"],
            "avatar": data["photo_big"],
            "birthdate": data["bdate"],
            "gender": True if data["sex"] == "2" else False if data["sex"] == "1" else None,
            "location": "%s, %s" % (data["city"], data["country"])
            if data["city"] and data["country"]
            else data["city"] or data["country"],
            "_nickname": data["nickname"],
            "_name": ("%s %s" % (data["first_name"], data["last_name"])).strip(),
            "_profile": data["profile"],
        }

        sess["reg_info"] = info
        sess.save()

    else:
        info = sess["reg_info"]

        if not info or not "network" in info or not "uid" in info:
            return Response(redirect="%s://%s/register" % (env.request.protocol, settings.domain))

    info["birthdate"] = parse_date(info["birthdate"]) or datetime.now() - timedelta(days=365 * 16 + 4)

    return render("/auth/register_ulogin.html", info=info)
예제 #7
0
def doc(path):
    if path.endswith('/'):
        path = path[:-1]
    try:
        return render('%s.html' % path)
    except TemplateNotFound:
        try:
            return render(os.path.join(path, 'index.html'))
        except TemplateNotFound:
            raise NotFound
예제 #8
0
def doc(path):
    if path.endswith('/'):
        path = path[:-1]
    try:
        return render('%s.html' % path)
    except TemplateNotFound:
        try:
            return render(os.path.join(path, 'index.html'))
        except TemplateNotFound:
            raise NotFound
예제 #9
0
파일: feeds.py 프로젝트: radjah/point-www
def add_feed():
    url = env.request.args('url', '').strip()

    try:
        if url.index(settings.domain):
            return Response(redirect=url)
    except ValueError:
        pass

    if env.request.method == 'GET':
        return render('/feeds/add.html',
                      section='feeds',
                      feeds=feeds.subscriptions(),
                      url=url)

    errors = env.request.args('errors')
    if not errors:
        errors = []
    elif not isinstance(errors, (list, tuple)):
        errors = [errors]

    try:
        feed = feeds.get_feed(url)
    except InvalidFeedUrl:
        errors.append('url')
    except InvalidFeedType:
        errors.append('type')
    except FeedFetchError:
        errors.append('fetch')

    if errors:
        return render('/feeds/add.html',
                      section='feeds',
                      feeds=feeds.subscriptions(),
                      url=url,
                      errors=errors)

    if feed.id and feed.check_subscriber(env.user):
        return Response(redirect="%s://%s.%s/" % \
                   (env.request.protocol, feed.login.lower(), settings.domain))
    try:
        feed.fetch()
    except FeedFetchError:
        errors.append('fetch')

    return render('/feeds/subscribe.html',
                  section='feeds',
                  feeds=feeds.subscriptions(),
                  feed=feed,
                  url=url)
예제 #10
0
def ulogin():
    if env.request.method == 'GET':
        raise Forbidden

    url = "http://ulogin.ru/token.php?token=%s&host=%s" % \
            (env.request.args('token'), settings.domain)
    try:
        resp = urllib2.urlopen(url)
        data = json.loads(resp.read())
        resp.close()
    except urllib2.URLError:
        return render('/profile/accounts.html', errors=['ulogin-fail'])

    if 'error' in data:
        raise Forbidden

    try:
        env.user.bind_ulogin(data['network'], data['uid'],
            nickname=data['nickname'],
            name=('%s %s' % (data['first_name'], data['last_name'])).strip(),
            profile=data['profile'])
    except (KeyError, UserExists):
        pass

    return Response(redirect='%s://%s.%s/profile/accounts?saved=1' % \
                             (env.request.protocol,
                              env.user.login, settings.domain))
예제 #11
0
def confirm_account(code):
    if not env.user.id:
        referer = '%s://%s/profile/accounts/confirm/%s' % \
                  (env.request.protocol, settings.domain, code)
        return render('/auth/login.html', referer=referer)

    if not users.confirm_account(code):
        jid_active = env.user.get_active_account('xmpp')
        return render('/profile/accounts.html',
                      jids=env.user.get_accounts('xmpp'),
                      active_jid=jid_active,
                      errors=['confirm'])

    return Response(redirect='%s://%s.%s/profile/accounts?saved=1' % \
                             (env.request.protocol,
                              env.user.login, settings.domain))
예제 #12
0
def add_post():
    text = env.request.args('text', '').strip()

    tags = env.request.args('tags', '').strip(' \t*,;')
    if isinstance(tags, str):
        tags = tags.decode('utf-8')
    tags = [t.replace(u"\xa0", " ") for t in re.split(r'\s*[,;*]\s*', tags)]

    private = bool(env.request.args('private'))

    m = re.search(r'^\s*(?P<to>(?:@[a-z0-9_-]+[,\s]*)+)', text)
    to = parse_logins(m.group('to')) if m else []

    files = _files([])

    sess = Session()
    sess['clear_post_input'] = True
    sess.save()

    try:
        id = posts.add_post(text, tags=tags, to=to, private=private, files=files)
    except PostTextError:
        return render('/post-error.html')

    return Response(redirect='%s://%s.%s/%s' % \
                             (env.request.protocol,
                              env.user.login, settings.domain, id))
예제 #13
0
def add_post():
    text = env.request.args('text', '').strip()

    tags = env.request.args('tags', '').strip(' \t*,;')
    if isinstance(tags, str):
        tags = tags.decode('utf-8')
    tags = [t.replace(u"\xa0", " ") for t in re.split(r'\s*[,;*]\s*', tags)]

    private = bool(env.request.args('private'))

    m = re.search(r'^\s*(?P<to>(?:@[a-z0-9_-]+[,\s]*)+)', text)
    to = parse_logins(m.group('to')) if m else []

    files = _files([])

    try:
        id = posts.add_post(text,
                            tags=tags,
                            to=to,
                            private=private,
                            files=files)
    except PostTextError:
        return render('/post-error.html')

    return Response(redirect='%s://%s.%s/%s' % \
                             (env.request.protocol,
                              env.user.login, settings.domain, id))
예제 #14
0
def subscribers():
    if not env.owner:
        raise NotFound
    if not env.user.login and env.owner.get_profile('deny_anonymous'):
        raise Forbidden
    users = env.owner.subscribers()
    return render('/subs.html', section='subscribers', users=users)
예제 #15
0
def comments(page=1, unread=False):
    if not env.owner or env.owner.id != env.user.id:
        return Response(redirect='%s://%s.%s%s' % \
                        (env.request.protocol,
                         env.user.login.lower(), settings.domain,
                         env.request.path))

    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.recent_commented_posts(unread=unread,
                                         offset=offset,
                                         limit=settings.page_limit + 1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/comments.html',
                  section='comments',
                  unread=unread,
                  posts=plist,
                  page=page)
예제 #16
0
파일: users.py 프로젝트: radjah/point-www
def subscribers():
    if not env.owner:
        raise NotFound
    if not env.user.login and env.owner.get_profile('deny_anonymous'):
        raise Forbidden
    users = env.owner.subscribers()
    return render('/subs.html', section='subscribers', users=users)
예제 #17
0
def messages_new(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.private_unread(offset=offset, limit=settings.page_limit + 1)

    if not plist and page == 1:
        return Response(redirect='%s://%s/messages/incoming' % \
                        (env.request.protocol, settings.domain))

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/messages/index.html',
                  section='messages',
                  posts=plist,
                  page=page)
예제 #18
0
def all_posts(page=1):
    sess = Session()
    if not sess['agree']:
        if env.request.args('agree'):
            sess['agree'] = True
            sess.save()
        else:
            return all_posts_warning()

    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.select_posts(private=False,
                               author_private=False,
                               blacklist=True,
                               limit=settings.page_limit + 1,
                               offset=offset)

    return render('/all_posts.html', section='all', posts=plist, page=page)
예제 #19
0
파일: blog.py 프로젝트: radjah/point-www
def recent_all(page=1, unread=False):
    if not env.owner or env.owner.id != env.user.id:
        return Response(redirect="%s://%s.%s/recent" % \
                        (env.request.protocol, env.user.login, settings.domain))
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    unread = bool(unread)

    plist = posts.recent_posts(unread=unread,
                               offset=offset, limit=settings.page_limit+1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/recent.html', section='recent_all', unread=unread,
                  posts=plist, page=page)
예제 #20
0
파일: blog.py 프로젝트: radjah/point-www
def bookmarks(page=1):
    if not env.owner or env.owner.id != env.user.id:
        return Response(redirect='%s://%s.%s/%s' % \
                        (env.request.protocol, env.user.login.lower(),
                         settings.domain, env.request.path))
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.bookmarks(settings.page_limit+1, offset)

    #if env.request.is_xhr:
    #    for p in plist:
    #        p['created'] = timestamp(p['created'])
    #        p['text'] = html(None, p['text'], True)
    #    return Response(json.dumps(plist), mimetype='application/json')

    section = 'bookmarks'

    return render('/bookmarks.html', section=section, posts=plist, page=page)
예제 #21
0
파일: profile.py 프로젝트: radjah/point-www
def ulogin():
    if env.request.method == 'GET':
        raise Forbidden

    url = "http://ulogin.ru/token.php?token=%s&host=%s" % \
            (env.request.args('token'), settings.domain)
    try:
        resp = urllib2.urlopen(url)
        data = json.loads(resp.read())
        resp.close()
    except urllib2.URLError:
        return render('/profile/accounts.html', errors=['ulogin-fail'])

    if 'error' in data:
        raise Forbidden

    try:
        env.user.bind_ulogin(
            data['network'],
            data['uid'],
            nickname=data['nickname'],
            name=('%s %s' % (data['first_name'], data['last_name'])).strip(),
            profile=data['profile'])
    except (KeyError, UserExists):
        pass

    return Response(redirect='%s://%s.%s/profile/accounts?saved=1' % \
                             (env.request.protocol,
                              env.user.login, settings.domain))
예제 #22
0
파일: profile.py 프로젝트: radjah/point-www
def confirm_account(code):
    if not env.user.id:
        referer = '%s://%s/profile/accounts/confirm/%s' % \
                  (env.request.protocol, settings.domain, code)
        return render('/auth/login.html', referer=referer)

    if not users.confirm_account(code):
        jid_active = env.user.get_active_account('xmpp')
        return render('/profile/accounts.html',
                      jids=env.user.get_accounts('xmpp'),
                      active_jid=jid_active,
                      errors=['confirm'])

    return Response(redirect='%s://%s.%s/profile/accounts?saved=1' % \
                             (env.request.protocol,
                              env.user.login, settings.domain))
예제 #23
0
def bookmarks(page=1):
    if not env.owner or env.owner.id != env.user.id:
        return Response(redirect='%s://%s.%s/%s' % \
                        (env.request.protocol, env.user.login.lower(),
                         settings.domain, env.request.path))
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.bookmarks(settings.page_limit + 1, offset)

    #if env.request.is_xhr:
    #    for p in plist:
    #        p['created'] = timestamp(p['created'])
    #        p['text'] = html(None, p['text'], True)
    #    return Response(json.dumps(plist), mimetype='application/json')

    section = 'bookmarks'

    return render('/bookmarks.html', section=section, posts=plist, page=page)
예제 #24
0
def show_post(id):
    post = posts.show_post(id)

    if env.request.method == 'POST':
        return add_comment(post.id)

    if not env.owner or env.owner.id != post.author.id:
        return Response(redirect='%s://%s.%s/%s' % \
                        (env.request.protocol,
                         post.author.login.lower(), settings.domain, id))

    comments = post.comments(cuser=env.user)

    if env.user.is_authorized():
        posts.clear_unread_posts(id)
        if comments:
            posts.clear_unread_comments(id)

    errors = []
    if env.request.args('expired'):
        errors.append('expired')
    if env.request.args('commented'):
        errors.append('commented')

    sess = Session()

    tree = env.request.args('tree')
    if tree:
        if tree.lower() in ('0', 'false', 'f'):
            tree = False
        else:
            tree = True
        sess['ctree'] = tree
        sess.save()
    elif sess['ctree'] is not None:
        tree = sess['ctree']
    else:
        env.user.get_profile('tree')

    comments_count = len(comments)
    if tree:
        cout = {}
        for c in comments:
            cout[c.id] = c
            if c.to_comment_id and c.to_comment_id in cout:
                cout[c.to_comment_id].comments.append(c)
            else:
                c.to_comment_id = None
        comments = filter(lambda c: not c.to_comment_id, cout.itervalues())

    section = 'messages' if post.private else ''

    return render('/post.html',
                  post=post,
                  comments=comments,
                  comments_count=comments_count,
                  tree=tree,
                  errors=errors,
                  section=section)
예제 #25
0
def edit_post(id):
    try:
        post = posts.show_post(id)
    except PostAuthorError:
        raise SubscribeError

    if env.request.method == 'GET':
        return render('/post-edit.html', post=post)

    files = _files(post.files)

    @csrf
    def save(post):
        text = env.request.args('text', '').strip()

        tags = env.request.args('tags', '').strip(' \t*,;')
        if isinstance(tags, str):
            tags = tags.decode('utf-8')
        tags = [
            t.replace(u"\xa0", " ") for t in re.split(r'\s*[,;*]\s*', tags)
        ]

        private = bool(env.request.args('private'))

        posts.edit_post(post,
                        text=text,
                        tags=tags,
                        private=private,
                        files=files)

        return Response(redirect='%s://%s.%s/%s' % \
                                 (env.request.protocol,
                                  env.user.login, settings.domain, post.id))

    try:
        return save(post)
    except PostUpdateError:
        return Response(redirect='%s://%s.%s/%s?expired=1' % \
                                 (env.request.protocol,
                                  env.user.login, settings.domain, post.id))
    except PostCommentedError:
        return Response(redirect='%s://%s.%s/%s?commented=1' % \
                                 (env.request.protocol,
                                  env.user.login, settings.domain, post.id))
    except PostDiffError:
        return render('/post-edit.html', post=post, errors=['diff'])
예제 #26
0
파일: auth.py 프로젝트: Raegdan/www-new
def remember():
    if env.request.method != 'POST':
        if env.request.args('sent'):
            return render('/auth/remember-sent.html')
        if env.request.args('fail'):
            return render('/auth/remember-fail.html')
        return render('/auth/remember.html')

    errors = []

    if env.user.id:
        user = env.user
    else:
        login = env.request.args('login')
        if not login:
            errors.append('login')
        else:
            try:
                user = User('login', login)
            except UserNotFound:
                errors.append('login')

    if not errors:
        try:
            text = env.request.args('recaptcha_response_field')
            challenge = env.request.args('recaptcha_challenge_field')

            resp = captcha.submit(challenge, text,
                                  settings.recaptcha_private_key,
                                  env.request.remote_host)

            if resp.is_valid:
                users.request_password(user)
                return Response(redirect='%s://%s/remember?sent=1' % \
                        (env.request.protocol, settings.domain))

            errors.append('captcha')

        except urllib2.URLError:
            errors.append('recaptcha-fail')
        except AddressNotFound:
            return Response(redirect='%s://%s/remember?fail=1' % \
                        (env.request.protocol, settings.domain))

    return render('/auth/remember.html', errors=errors)
예제 #27
0
def remember():
    if env.request.method != 'POST':
        if env.request.args('sent'):
            return render('/auth/remember-sent.html')
        if env.request.args('fail'):
            return render('/auth/remember-fail.html')
        return render('/auth/remember.html')

    errors = []

    if env.user.id:
        user = env.user
    else:
        login = env.request.args('login')
        if not login:
            errors.append('login')
        else:
            try:
                user = User('login', login)
            except UserNotFound:
                errors.append('login')

    if not errors:
        try:
            text = env.request.args('recaptcha_response_field')
            challenge = env.request.args('recaptcha_challenge_field')

            resp = captcha.submit(challenge, text,
                                  settings.recaptcha_private_key,
                                  env.request.remote_host)

            if resp.is_valid:
                users.request_password(user)
                return Response(redirect='%s://%s/remember?sent=1' % \
                        (env.request.protocol, settings.domain))

            errors.append('captcha')

        except urllib2.URLError:
            errors.append('recaptcha-fail')
        except AddressNotFound:
            return Response(redirect='%s://%s/remember?fail=1' % \
                        (env.request.protocol, settings.domain))

    return render('/auth/remember.html', errors=errors)
예제 #28
0
def taglist():
    if not env.owner:
        raise NotFound

    sort_by_name = env.request.args('order', '') != 'cnt'

    tags = env.owner.tags(all=True, sort_by_name=sort_by_name)

    return render('/tags-list.html', tags=tags, sort_by_name=sort_by_name)
예제 #29
0
def all_posts_warning():
    try:
        referer = env.request.args('referer')
    except KeyError:
        referer = env.request.referer
    if not referer:
        referer = '%s://%s/' % (env.request.protocol, settings.domain)

    return render('/all_posts_warning.html', referer=referer)
예제 #30
0
def taglist():
    if not env.user.login and env.owner.get_profile('deny_anonymous'):
        raise Forbidden

    sort_by_name = env.request.args('order', '') != 'cnt'

    tags = env.owner.tags(all=True, sort_by_name=sort_by_name)

    return render('/tags-list.html', tags=tags, sort_by_name=sort_by_name)
예제 #31
0
파일: blog.py 프로젝트: Alinaki/point-www
def taglist():
    if not env.owner:
        raise NotFound

    sort_by_name = env.request.args('order', '') != 'cnt'

    tags = env.owner.tags(all=True, sort_by_name=sort_by_name)

    return render('/tags-list.html', tags=tags, sort_by_name=sort_by_name)
예제 #32
0
파일: blog.py 프로젝트: radjah/point-www
def all_posts_warning():
    try:
        referer = env.request.args('referer')
    except KeyError:
        referer = env.request.referer
    if not referer:
        referer = '%s://%s/' % (env.request.protocol, settings.domain)

    return render('/all_posts_warning.html', referer=referer)
예제 #33
0
def search_posts():
    search_text = env.request.args('text', '').strip().decode('utf-8')
    if not search_text:
        return render('/search.html', search_text='', page=1, results=[])

    try:
        page = int(env.request.args('page', 1))
    except ValueError:
        page = 1

    offset = (page - 1) * settings.page_limit

    user = env.owner if env.owner else None

    results, has_next, total = search.search_posts(search_text, user=user,
                               offset=offset, limit=settings.page_limit)

    return render('/search.html', search_text=search_text, results=results,
                  page=page, has_next=has_next, total=total)
예제 #34
0
파일: blog.py 프로젝트: radjah/point-www
def show_post(id):
    post = posts.show_post(id)

    if env.request.method == 'POST':
        return add_comment(post.id)

    if not env.owner or env.owner.id != post.author.id:
        return Response(redirect='%s://%s.%s/%s' % \
                        (env.request.protocol,
                         post.author.login.lower(), settings.domain, id))

    comments = post.comments(cuser=env.user)

    if env.user.is_authorized():
        posts.clear_unread_posts(id)
        if comments:
            posts.clear_unread_comments(id)

    errors = []
    if env.request.args('expired'):
        errors.append('expired')
    if env.request.args('commented'):
        errors.append('commented')

    sess = Session()

    tree = env.request.args('tree')
    if tree:
        if tree.lower() in ('0', 'false', 'f'):
            tree = False
        else:
            tree = True
        sess['ctree'] = tree
        sess.save()
    elif sess['ctree'] is not None:
        tree = sess['ctree']
    else:
        env.user.get_profile('tree')

    comments_count = len(comments)
    if tree:
        cout = {}
        for c in comments:
            cout[c.id] = c
            if c.to_comment_id and c.to_comment_id in cout:
                cout[c.to_comment_id].comments.append(c)
            else:
                c.to_comment_id = None
        comments = filter(lambda c: not c.to_comment_id, cout.itervalues())

    section = 'messages' if post.private else ''

    return render('/post.html', post=post, comments=comments,
                  comments_count=comments_count, tree=tree,
                  errors=errors, section=section)
예제 #35
0
def add_feed():
    url = env.request.args('url', '').strip()

    try:
        if url.index(settings.domain):
            return Response(redirect=url)
    except ValueError:
        pass

    if env.request.method == 'GET':
        return render('/feeds/add.html', section='feeds',
                      feeds=feeds.subscriptions(), url=url)

    errors = env.request.args('errors')
    if not errors:
        errors = []
    elif not isinstance(errors, (list, tuple)):
        errors = [errors]

    try:
        feed = feeds.get_feed(url)
    except InvalidFeedUrl:
        errors.append('url')
    except InvalidFeedType:
        errors.append('type')
    except FeedFetchError:
        errors.append('fetch')

    if errors:
        return render('/feeds/add.html', section='feeds',
                      feeds=feeds.subscriptions(), url=url, errors=errors)

    if feed.id and feed.check_subscriber(env.user):
        return Response(redirect="%s://%s.%s/" % \
                   (env.request.protocol, feed.login.lower(), settings.domain))
    try:
        feed.fetch()
    except FeedFetchError:
        errors.append('fetch')

    return render('/feeds/subscribe.html', section='feeds',
                  feeds=feeds.subscriptions(), feed=feed, url=url)
예제 #36
0
파일: auth.py 프로젝트: artss/point-www-new
def remember():
    if env.request.method != "POST":
        if env.request.args("sent"):
            return render("/auth/remember-sent.html")
        if env.request.args("fail"):
            return render("/auth/remember-fail.html")
        return render("/auth/remember.html")

    errors = []

    if env.user.id:
        user = env.user
    else:
        login = env.request.args("login")
        if not login:
            errors.append("login")
        else:
            try:
                user = User("login", login)
            except UserNotFound:
                errors.append("login")

    if not errors:
        try:
            text = env.request.args("recaptcha_response_field")
            challenge = env.request.args("recaptcha_challenge_field")

            resp = captcha.submit(challenge, text, settings.recaptcha_private_key, env.request.remote_host)

            if resp.is_valid:
                users.request_password(user)
                return Response(redirect="%s://%s/remember?sent=1" % (env.request.protocol, settings.domain))

            errors.append("captcha")

        except urllib2.URLError:
            errors.append("recaptcha-fail")
        except AddressNotFound:
            return Response(redirect="%s://%s/remember?fail=1" % (env.request.protocol, settings.domain))

    return render("/auth/remember.html", errors=errors)
예제 #37
0
def taglist():
    if not env.owner or not env.owner.id:
        raise UserNotFound

    if not env.user.login and env.owner.get_profile('deny_anonymous'):
        raise Forbidden

    sort_by_name = env.request.args('order', '') != 'cnt'

    tags = env.owner.tags(all=True, sort_by_name=sort_by_name)

    return render('/tags-list.html', tags=tags, sort_by_name=sort_by_name)
예제 #38
0
파일: blog.py 프로젝트: radjah/point-www
def edit_post(id):
    try:
        post = posts.show_post(id)
    except PostAuthorError:
        raise SubscribeError

    if env.request.method == 'GET':
        return render('/post-edit.html', post=post)

    files = _files(post.files)

    @csrf
    def save(post):
        text = env.request.args('text', '').strip()

        tags = env.request.args('tags', '').strip(' \t*,;')
        if isinstance(tags, str):
            tags = tags.decode('utf-8')
        tags = [t.replace(u"\xa0", " ") for t in re.split(r'\s*[,;*]\s*', tags)]

        private = bool(env.request.args('private'))

        posts.edit_post(post, text=text, tags=tags, private=private, files=files)

        return Response(redirect='%s://%s.%s/%s' % \
                                 (env.request.protocol,
                                  env.user.login, settings.domain, post.id))
    try:
        return save(post)
    except PostUpdateError:
        return Response(redirect='%s://%s.%s/%s?expired=1' % \
                                 (env.request.protocol,
                                  env.user.login, settings.domain, post.id))
    except PostCommentedError:
        return Response(redirect='%s://%s.%s/%s?commented=1' % \
                                 (env.request.protocol,
                                  env.user.login, settings.domain, post.id))
    except PostDiffError:
        return render('/post-edit.html', post=post, errors=['diff'])
예제 #39
0
def index(page=1):
    tag = env.request.args('tag')
    if tag:
        return blog.tag_posts(tag, page)

    if not env.request.host or env.request.host == settings.domain:
        try:
            return Response(redirect='%s://%s/recent' % \
                   (env.request.protocol, domain(env.user)))
        except NotAuthorized:
            return render('/auth/login.html')

    return blog.blog(page)
예제 #40
0
def index(page=1):
    tag = env.request.args('tag')
    if tag:
        return blog.tag_posts(tag, page)

    if not env.request.host or env.request.host == settings.domain:
        try:
            return Response(redirect='%s://%s/recent' % \
                   (env.request.protocol, domain(env.user)))
        except NotAuthorized:
            return render('/auth/login.html')

    return blog.blog(page)
예제 #41
0
def tag_posts(tag, page=1):
    if env.request.host != settings.domain and (not env.owner
                                                or not env.owner.id):
        raise UserNotFound

    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    if env.owner and env.owner.id:
        author = env.owner
    else:
        author = None

    if env.owner and env.owner.id == env.user.id:
        private = None
    else:
        private = False

    # variable deny_anonymous is for corresponding value of 'deny_anonymous'
    # field in 'users.profile' table
    deny_anonymous = False if not env.user.is_authorized() else None

    if not isinstance(tag, (list, tuple)):
        tag = [tag]
    tag = [t.decode('utf-8', 'ignore').replace(u"\xa0", " ") for t in tag]

    plist = posts.select_posts(author=author,
                               private=private,
                               deny_anonymous=deny_anonymous,
                               tags=tag,
                               offset=offset,
                               limit=settings.page_limit + 1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    section = 'blog' if env.owner and env.user.id == env.owner.id else ''

    return render('/tags.html',
                  section=section,
                  posts=plist,
                  page=page,
                  tags=tag)
예제 #42
0
def mdoc(path):
    if path.find('..') > -1:
        raise NotFound

    docpath = os.path.join(settings.doc_path, '%s.md' % path.strip('/ '))

    try:
        fd = open(docpath)
    except IOError:
        raise NotFound

    text = fd.read().decode('utf8')
    fd.close()

    return render('/doc.html', prefix='', path=path, text=text)
예제 #43
0
def mdoc(path):
    if path.find('..') > -1:
        raise NotFound

    docpath = os.path.join(settings.doc_path, '%s.md' % path.strip('/ '))

    try:
        fd = open(docpath)
    except IOError:
        raise NotFound

    text = fd.read().decode('utf8')
    fd.close()

    return render('/doc.html', prefix='', path=path, text=text)
예제 #44
0
파일: feeds.py 프로젝트: radjah/point-www
def subscribe():
    url = env.request.args('url', '').strip()

    if not url:
        return Response(redirect="%s://%s.%s/feeds/add" % \
                        (env.request.protocol, env.user.login.lower(),
                         settings.domain))

    try:
        if url.index(settings.domain):
            return Response(redirect=url)
    except ValueError:
        pass

    errors = []

    try:
        feed = feeds.get_feed(url)
        feed.fetch()
    except InvalidFeedUrl:
        errors.append('url')
    except InvalidFeedType:
        errors.append('type')
    except FeedFetchError:
        errors.append('fetch')

    if errors:
        return Response(redirect="%s://%s.%s/feeds/add?url=%s&%s" % \
                    (env.request.protocol, env.user.login.lower(),
                     settings.domain, urlencode(url),
                     '&'.join(["errors=%s" % e for e in errors])))

    if not feed.id:
        feed.save()

    try:
        env.user.subscribe(feed)
    except AlreadySubscribed:
        pass


    return Response(redirect="%s://%s.%s/" % \
                   (env.request.protocol, feed.login.lower(), settings.domain))

    if env.request.method == 'GET':
        return render('/feeds/subscribe.html',
                      feeds=feeds.subscriptions(),
                      feed=feed)
예제 #45
0
def subscribe():
    url = env.request.args('url', '').strip()

    if not url:
        return Response(redirect="%s://%s.%s/feeds/add" % \
                        (env.request.protocol, env.user.login.lower(),
                         settings.domain))

    try:
        if url.index(settings.domain):
            return Response(redirect=url)
    except ValueError:
        pass

    errors = []

    try:
        feed = feeds.get_feed(url)
        feed.fetch()
    except InvalidFeedUrl:
        errors.append('url')
    except InvalidFeedType:
        errors.append('type')
    except FeedFetchError:
        errors.append('fetch')

    if errors:
        return Response(redirect="%s://%s.%s/feeds/add?url=%s&%s" % \
                    (env.request.protocol, env.user.login.lower(),
                     settings.domain, urlencode(url),
                     '&'.join(["errors=%s" % e for e in errors])))

    if not feed.id:
        feed.save()

    try:
        env.user.subscribe(feed)
    except AlreadySubscribed:
        pass


    return Response(redirect="%s://%s.%s/" % \
                   (env.request.protocol, feed.login.lower(), settings.domain))

    if env.request.method == 'GET':
        return render('/feeds/subscribe.html', feeds=feeds.subscriptions(),
                                               feed=feed)
예제 #46
0
def edit_comment(post_id, comment_id):
    if comment_id == '0':
        raise NotFound
    else:
        try:
            posts.edit_comment(post_id, comment_id,
                env.request.args('text', ''), editor=env.user)
        except PostTextError:
            return render('/comment-error.html')

        if env.owner and env.owner.login:
            login = env.owner.login.lower()
        else:
            post = Post(post_id)
            login = post.author.login.lower()

        return Response(redirect='%s://%s.%s/%s#%s' % \
            (env.request.protocol, login, settings.domain, post_id, comment_id))
예제 #47
0
파일: blog.py 프로젝트: radjah/point-www
def edit_comment(post_id, comment_id):
    if comment_id == '0':
        raise NotFound
    else:
        try:
            posts.edit_comment(post_id, comment_id,
                env.request.args('text', ''), editor=env.user)
        except PostTextError:
            return render('/comment-error.html')

        if env.owner and env.owner.login:
            login = env.owner.login.lower()
        else:
            post = Post(post_id)
            login = post.author.login.lower()

        return Response(redirect='%s://%s.%s/%s#%s' % \
            (env.request.protocol, login, settings.domain, post_id, comment_id))
예제 #48
0
def messages_outgoing(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.private_outgoing(offset=offset, limit=settings.page_limit+1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/messages/outgoing.html', section='messages/outgoing', posts=plist, page=page)
예제 #49
0
파일: blog.py 프로젝트: radjah/point-www
def messages_outgoing(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.private_outgoing(offset=offset, limit=settings.page_limit+1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/messages/outgoing.html', section='messages/outgoing', posts=plist, page=page)
예제 #50
0
파일: blog.py 프로젝트: radjah/point-www
def tag_posts(tag, page=1):
    if env.request.host != settings.domain and (not env.owner or not env.owner.id):
        raise UserNotFound

    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    if env.owner and env.owner.id:
        author = env.owner
    else:
        author = None

    if env.owner and env.owner.id == env.user.id:
        private = None
    else:
        private = False

    # variable deny_anonymous is for corresponding value of 'deny_anonymous'
    # field in 'users.profile' table
    deny_anonymous = False if not env.user.is_authorized() else None

    if not isinstance(tag, (list, tuple)):
        tag = [tag]
    tag = [t.decode('utf-8', 'ignore').replace(u"\xa0", " ") for t in tag]

    plist = posts.select_posts(author=author, private=private, 
                               deny_anonymous=deny_anonymous, tags=tag,
                               offset=offset, limit=settings.page_limit+1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    section = 'blog' if env.owner and env.user.id == env.owner.id else ''

    return render('/tags.html', section=section, posts=plist, page=page,
                  tags=tag)
예제 #51
0
파일: blog.py 프로젝트: radjah/point-www
def add_comment(id):
    to_comment_id = env.request.args('comment_id')
    text = env.request.args('text', '').strip()
    files = _files([])

    try:
        comment_id = posts.add_comment(id, to_comment_id, text, files=files)
    except PostTextError:
        return render('/comment-error.html')

    if env.owner and env.owner.login:
        login = env.owner.login.lower()
    else:
        post = Post(id)
        login = post.author.login.lower()

    return Response(redirect='%s://%s.%s/%s#%s' % \
                             (env.request.protocol,
                              login, settings.domain, id, comment_id))
예제 #52
0
파일: auth.py 프로젝트: artss/point-www-new
def register_get():
    if env.user.id:
        raise AlreadyAuthorized

    sess = Session()
    info = sess["reg_info"] or {}

    try:
        del info["network"]
        del info["uid"]
    except (KeyError, TypeError):
        pass

    try:
        info["birthdate"] = parse_date(info["birthdate"]) or datetime.now() - timedelta(days=365 * 16 + 4)
    except (KeyError, TypeError):
        info["birthdate"] = None

    return render("/auth/register.html", fields=ULOGIN_FIELDS, info=info)
예제 #53
0
def add_comment(id):
    to_comment_id = env.request.args('comment_id')
    text = env.request.args('text', '').strip()
    files = _files([])

    try:
        comment_id = posts.add_comment(id, to_comment_id, text, files=files)
    except PostTextError:
        return render('/comment-error.html')

    if env.owner and env.owner.login:
        login = env.owner.login.lower()
    else:
        post = Post(id)
        login = post.author.login.lower()

    return Response(redirect='%s://%s.%s/%s#%s' % \
                             (env.request.protocol,
                              login, settings.domain, id, comment_id))
예제 #54
0
def index(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.recent_posts(type='feed',
                               offset=offset, limit=settings.page_limit+1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/feeds/index.html', feeds=feeds.subscriptions(),
                  posts=plist, page=page, section='feeds')
예제 #55
0
def blog(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    if not env.owner or not env.owner.id:
        raise UserNotFound

    offset = (page - 1) * settings.page_limit

    plist = posts.recent_blog_posts(env.owner, settings.page_limit + 1, offset)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
            p['text'] = markdown_filter(None, p['text'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/blog.html', section='blog', posts=plist, page=page)
예제 #56
0
파일: blog.py 프로젝트: radjah/point-www
def blog(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    if not env.owner or not env.owner.id:
        raise UserNotFound

    offset = (page - 1) * settings.page_limit

    plist = posts.recent_blog_posts(env.owner, settings.page_limit+1, offset)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
            p['text'] = markdown_filter(None, p['text'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/blog.html', section='blog', posts=plist, page=page)
예제 #57
0
파일: feeds.py 프로젝트: radjah/point-www
def index(page=1):
    try:
        page = int(page)
    except (TypeError, ValueError):
        page = 1
    if not page:
        page = 1

    offset = (page - 1) * settings.page_limit

    plist = posts.recent_posts(type='feed',
                               offset=offset,
                               limit=settings.page_limit + 1)

    if env.request.is_xhr:
        for p in plist:
            p['created'] = timestamp(p['created'])
        return Response(json.dumps(plist), mimetype='application/json')

    return render('/feeds/index.html',
                  feeds=feeds.subscriptions(),
                  posts=plist,
                  page=page,
                  section='feeds')
예제 #58
0
파일: auth.py 프로젝트: Raegdan/www-new
def ulogin():
    if env.user.id:
        raise AlreadyAuthorized

    sess = Session()

    if env.request.method == 'POST':
        url = "http://ulogin.ru/token.php?token=%s&host=%s" % \
                (env.request.args('token'), settings.domain)
        try:
            resp = urllib2.urlopen(url)
            data = dict.fromkeys(ULOGIN_FIELDS)
            data.update(json.loads(resp.read()))
            resp.close()
        except urllib2.URLError:
            return render('/auth/login.html',
                          fields=ULOGIN_FIELDS,
                          errors=['ulogin-fail'])

        try:
            env.user.authenticate_ulogin(data['network'], data['uid'])
            if env.user.id:
                return Response(redirect=referer())
        except NotAuthorized:
            pass

        login = data['nickname'].strip(u' -+.')
        if login:
            login = re.sub(r'[\._\-\+]+', '-', login)

        info = {
            'login': login,
            'network': data['network'],
            'uid': data['uid'],
            'name': ('%s %s' % (data['first_name'], data['last_name'])).strip(),
            'email': data['email'],
            'avatar': data['photo_big'],
            'birthdate': data['bdate'],
            'gender': True if data['sex'] == '2' else False if data['sex'] == '1' else None,
            'location': "%s, %s" % (data['city'], data['country']) \
                        if data['city'] and data['country'] else \
                        data['city'] or data['country'],

            '_nickname': data['nickname'],
            '_name': ('%s %s' % (data['first_name'], data['last_name'])).strip(),
            '_profile': data['profile'],
        }

        sess['reg_info'] = info
        sess.save()

    else:
        info = sess['reg_info']

        if not info or not 'network' in info or not 'uid' in info:
            return Response(redirect='%s://%s/register' % \
                    (env.request.protocol, settings.domain))

    info['birthdate'] = parse_date(info['birthdate']) \
                        or datetime.now() - timedelta(days=365*16+4)

    return render('/auth/register_ulogin.html', info=info)
예제 #59
0
파일: auth.py 프로젝트: Raegdan/www-new
def register():
    #raise Forbidden
    if env.user.id:
        raise AlreadyAuthorized

    sess = Session()
    info = sess['reg_info'] or {}

    print 'INFO', info

    if env.request.method == 'GET':
        try:
            del info['network']
            del info['uid']
        except (KeyError, TypeError):
            pass
        sess['reg_info'] = info
        sess.save()

        try:
            info['birthdate'] = parse_date(info['birthdate']) \
                                or datetime.now() - timedelta(days=365*16+4)
        except (KeyError, TypeError):
            info['birthdate'] = None

        return render('/auth/register.html', fields=ULOGIN_FIELDS, info=info)

    try:
        network = info['network'] if 'network' in info else None
        uid = info['uid'] if 'uid' in info else None
    except TypeError:
        network = None
        uid = None

    errors = []

    for p in [
            'login', 'name', 'email', 'birthdate', 'location', 'about',
            'homepage'
    ]:
        info[p] = env.request.args(p, '').decode('utf-8')

    info['gender'] = _gender(env.request.args('gender'))

    login = env.request.args('login', '').strip()
    if login and validate_nickname(login):
        try:
            u = User('login', login)
            if u.id:
                errors.append('login-in-use')
        except UserNotFound:
            pass
    elif login:
        errors.append('login-invalid')
    else:
        errors.append('login-empty')

    password = env.request.args('password')
    confirm = env.request.args('confirm')
    if not (network and uid):
        if not password:
            errors.append('password')
        elif password != confirm:
            errors.append('confirm')

    info['birthdate'] = parse_date(info['birthdate']) \
                            or datetime.now() - timedelta(days=365*16+4)

    if not network and not errors:
        try:
            text = env.request.args('recaptcha_response_field')
            challenge = env.request.args('recaptcha_challenge_field')

            resp = captcha.submit(challenge, text,
                                  settings.recaptcha_private_key,
                                  env.request.remote_host)

            if not resp.is_valid:
                errors.append('captcha')

        except urllib2.URLError:
            errors.append('recaptcha-fail')
        except AddressNotFound:
            return Response(redirect='%s://%s/remember?fail=1' % \
                        (env.request.protocol, settings.domain))

    if errors:
        if network and uid:
            tmpl = '/auth/register_ulogin.html'
        else:
            tmpl = '/auth/register.html'

        return render(tmpl, fields=ULOGIN_FIELDS, info=info, errors=errors)

    users.register(login)

    for p in [
            'name', 'email', 'birthdate', 'gender', 'location', 'about',
            'homepage'
    ]:
        env.user.set_info(p, info[p])

    if password:
        env.user.set_password(password)

    if network and uid:
        _nickname = info['_nickname'] if '_nickname' in info else None
        _name = info['_name'] if '_name' in info else None
        _profile = info['_profile'] if '_profile' in info else None
        try:
            env.user.bind_ulogin(network, uid, _nickname, _name, _profile)
        except UserExists:
            raise Forbidden

    if env.request.args('avatar'):
        ext = env.request.args('avatar', '').split('.').pop().lower()
        if ext not in ['jpg', 'gif', 'png']:
            errors.append('filetype')
        else:
            filename = ('%s.%s' % (env.user.login, ext)).lower()

            make_avatar(env.request.files('avatar'), filename)

            env.user.set_info('avatar',
                              '%s?r=%d' % (filename, randint(1000, 9999)))

    elif 'avatar' in info and info['avatar']:
        filename = ('%s.%s' % (env.user.login, 'jpg')).lower()

        make_avatar(info['avatar'], filename)

        env.user.set_info('avatar',
                          '%s?r=%d' % (filename, randint(1000, 9999)))

    env.user.save()

    env.user.authenticate()

    return Response(redirect=get_referer())