Example #1
0
def user_del(request):

    md = model(request.db)
    # 削除対象取得
    del_no = []
    for k, v in request.params.items():
        if v == 'delete':
            del_no.append(int(k))
    # passwd取得
    passwd = request.params['pwd']
    # 画像だけチェック取得
    try:
        chk = request.params['onlyimgdel']
        chk = True
    except KeyError:
        chk = False
    # passwdチェック 兼 削除
    ret = usr_del(del_no, passwd, md, chk)
    if len(ret):
        raise VariableError('<br>'.join(ret))
    # 削除完了文言
    request.session.flash('削除完了')
    # 次画面遷移先
    response = HTTPFound(location='/img_board')

    return response
Example #2
0
def getlog(db, res, page):
    '''記事取得
    '''
    md = model(db)
    start = page * conf.PAGE_DEF

    if not res == 0:
        tmp = md.sel_all(conf.TBL_LOG, no=res)
        if tmp.count() == 0:
            raise VariableError('該当記事が見つかりません')
    else:
        tmp = md.sel_all(conf.TBL_LOG).sort('last_update_date',
                                        pymongo.DESCENDING).skip(start).limit(conf.PAGE_DEF)
    treelst = [t for t in tmp]

    for tree in (treelst):
        #スレッド主の記事の修正
        tree = tree_fix(tree, db)
        reses = tree['res']
        for resone in reses:
            #レス記事の修正
            resone = tree_fix(resone, db)

    # もうすぐ消えるチェック
    treelst = chk_delete_soon(md, treelst)
    # デフォルト表示するチェック
    return treelst
Example #3
0
def imgsrc_fix(db, pict, thumb, W, H):
    '''IMGタグ作成
    :pict=画像ファイル名,thumb=サムネイルファイル名,W=幅,H=高さ
    '''
    imgsrc = ''
    if pict:
        md = model(db)
        file = md.get_file(pict)
        if file:
            size = file.length
            if W and H:
                if thumb:
                    imgsrc = '''
                    <small>サムネイルを表示しています.クリックすると元のサイズを表示します.</small><br>
                    <a href="/img/{src}" target="_blank">
                    <img src="/img/{thumb}" border=0 align="left" width={w} height={h} hspace=20 alt="{size} B">
                    </a>
                    '''.format(src=pict, thumb=thumb, size=size, w=W, h=H)
                else:
                    imgsrc = '''
                    <a href="/img/{src}" target="_blank">
                    <img src="/img/{src}" border=0 align="left" width={w} height={h} hspace=20 alt="{size} B">
                    </a>
                    '''.format(src=pict, size=size, w=W, h=H)
            else:
                imgsrc = '''
                <a href="/img/{src}" target="_blank">
                <img src="/img/{src}" border=0 align="left" hspace=20 alt="{size} B">
                </a>
                '''.format(src=pict, size=size)
            imgsrc = '''
            <a href="/img/{src}" target="_blank">{src}</a>-({size} B) {imgsrc}
            '''.format(src=pict, size=size, imgsrc=imgsrc)

    return imgsrc
Example #4
0
def show_img(request):
    '''画像表示
    '''
    file_name = request.matchdict['file_name']
    md = model(request.db)
    file = md.get_file(file_name)

    response = Response()
    if file is not None:
        response.content_type = file.content_type
        response.app_iter = file
    else:
        response.content_type = 'image/jpeg'
        response.app_iter = open('nopict.jpg', 'rb')
    return response
Example #5
0
def insertlog(request, param):
    '''記事保存
    '''
    md = model(request.db)

    com = param['com']
    sub = param['sub']
    name = param['name']
    email = param['email']
    resto = param['resto'] if param['resto'] else ''
    if (com in conf.badstring or sub in conf.badstring or
        name in conf.badstring or email in conf.badstring):
        return "拒絶されました"

    name = '' if re.search('^[ | |]*$', name) else name
    com = '' if re.search('^[ | |\t]*$', com) else com
    sub = '' if re.search('^[ | |]*$', sub) else sub

    if not param['resto'] and not param['textonly'] and param['upfile'] == b'':
        return '画像がありません'
    if com == '' and param['upfile'] == b'':
        return '何か書いてください'

    # 名前欄の変更
    name = re.sub('管理', '"管理"', name)
    name = re.sub('削除', '"削除"', name)

    # 入力値長さチェック
    if len(com) > 1000:
        return '本文が長すぎますっ!'
    if len(name) > 100:
        return '本文が長すぎますっ!'
    if len(email) > 100:
        return '本文が長すぎますっ!'

    # HOST取得
    host = request.client_addr
    if host in conf.badip:
        return "拒絶されました"

    if (re.search('^mail', host) or re.search('^ns', host) or
        re.search('^dns', host) or re.search('^ftp', host) or
        re.search('^prox', host) or re.search('^pc', host)):
        pxck = True
    if (re.search('ne\\.jp$', host) or re.search('ad\\.jp$', host) or
        re.search('bbtec\\.net$', host) or re.search('aol\\.com$', host) or
        re.search('uu\\.net$', host) or re.search('asahi-net\\.or\\.jp$', host) or
        re.search('rim\\.or\\.jp$', host)):
        pxck = False
    else:
        pxck = True

    if pxck and conf.PROXY_CHECK:
        if proxy_connect(host, 80):
            return 'ERROR! 公開PROXY規制中!!(80)'
        if proxy_connect(host, 8080):
            return 'ERROR! 公開PROXY規制中!!(8080)'

    # No. とパスと時間とURLフォーマット
    import random
    pwd = param['pwd']
    random.seed()
    if pwd == '':
        if not 'pwdc' in request.cookies or not request.cookies['pwdc'] == '':
            pwd = ('00000000' + str(random.randrange(0, 99999999)))[-8:]
        else:
            pwd = request.cookies['pwdc']
    dig_pass = digest_passwd(pwd) if not pwd == '' else '*'

    #日付とID取得
    nowdate = get_date_str(email, host)

    # テキスト整形
    admin = 'admin' in request.session
    email = clean_str(email, admin)
    email = re.sub('[\r\n]', '', email)
    sub = clean_str(sub, admin)
    sub = re.sub('[\r\n]', '', sub)
    resto = clean_str(resto, admin)
    resto = re.sub('[\r\n]', '', resto)
    com = clean_str(com, admin)

    # 改行文字の統一
    com = com.replace('\r\n', '\n')
    com = com.replace('\r', '\n')

    # 連続する空行を一行
    com = re.sub('\n(( | )*\n){3,}', '\n', com)
    if not conf.BR_CHECK or com.count('\n') < conf.BR_CHECK:
        com = com.replace('\n', '<br>\n')
    com = com.replace('\n', '')

    name = re.sub('[\r\n]', '', name)
    name = re.sub('◆', '◇', name)
    names = name
    name = clean_str(name, admin)

    # トリップ作成
    m = re.search('(#|#)(.*)', names)
    if m:
        cap = m.group(2)
        trip = get_trip(cap)
        name = re.sub('(#|#)(.*)', '', name)
        name += trip

    if name == '':
        name = '名無し'
    if com == '':
        com = '本文なし'
    if sub == '':
        sub = '無題'

    # 二重投稿チェック
    if chk_double_post(md, host):
        return '連続投稿はもうしばらく時間を置いてからお願い致します'

    # ログ行数オーバー
    del_over_tree(md)

    # 更新
    savelog = log()

    # 画像保存
    if not param['upfile'] == b'':
        data = param['upfile'].file
        fname = param['upfile'].filename
        try:
            img = Image.open(data)
        except IOError:
            return "アップロードに失敗しました。画像ファイル以外は受け付けません"

        #拒否ファイル
        if hashlib.md5(img.tostring()).hexdigest() in conf.badfile:
            return "アップロードに失敗しました。同じ画像がありました"

        savelog.W, savelog.H = img.size
        pictname, savelog.ext = os.path.splitext(fname)
        tmpname = str(int(time.time()))
        savelog.pict = tmpname + savelog.ext
        if (savelog.W > conf.MAX_W or savelog.H > conf.MAX_H):
            tW = conf.MAX_W / savelog.W
            tH = conf.MAX_H / savelog.H
            if tW < tH:
                key = tW
            else:
                key = tH
            savelog.W = math.ceil(savelog.W * key)
            savelog.H = math.ceil(savelog.H * key)
            # サムネ作成
            if conf.USE_THUMB:
                f = tempfile.TemporaryFile()
                savelog.thumb = tmpname + '.s' + savelog.ext
                img.thumbnail((savelog.W, savelog.H), Image.ANTIALIAS)
                img.save(f, img.format)
                f.seek(0)   # SAVEするとポインタが最後まで飛ぶのでもどす
                md.save_file(f, savelog.thumb)
        data.seek(0)   # PILのOpenをするとポインタが最後まで飛ぶのでもどす
        md.save_file(data, savelog.pict)

        mes = "画像 {fname} のアップロードが成功しました".format(fname=fname)

    #スレ立て
    if resto == '':
        savelog.last_update_date = datetime.datetime.now()
        savelog.no = md.seq()
        savelog.now = nowdate
        savelog.name = name
        savelog.email = email
        savelog.sub = sub
        savelog.com = com
        savelog.host = host
        savelog.pwd = dig_pass
        savelog.res = []
        md.ins(conf.TBL_LOG, **savelog.__dict__)
    else:
        #レス
        savelog.last_update_date = datetime.datetime.now()
        savelog.no = md.seq()
        savelog.now = nowdate
        savelog.name = name
        savelog.email = email
        savelog.sub = sub
        savelog.com = com
        savelog.host = host
        savelog.pwd = dig_pass
        #レスを格納
        resData = {'res': savelog.__dict__}
        #レスを上書き
        whereData = {'no': int(resto)}
        if not md.update_push(conf.TBL_LOG, resData, whereData):
            return 'スレッドがありません。'
        #最終更新日時上書き
        dateData = {'last_update_date': datetime.datetime.now()}
        md.update(conf.TBL_LOG, dateData, whereData)
Example #6
0
def get_log_count(db):
    '''log件数取得'''
    md = model(db)
    tmp = md.sel_all(conf.TBL_LOG)
    return tmp.count()