def getserver(fileid, filename=None): ''' Apaño porque Fer tarda mucho en arreglar indir ''' # TODO(felipe): posibilidad de bloquear form = GetServerForm(request.form) data = None if request.method == 'POST': fname = form.filename.data sid = get_id_server_from_search(hex2mid(fileid), fname) if sid: try: data = filesdb.get_file(fileid, sid = sid, bl = None) except filesdb.BogusMongoException as e: logging.exception(e) flash(e, "error") else: flash("admin_file_search_server_not_found", "error") elif filename: form.filename.data = filename return render_template('admin/getserver.html', fileid = fileid, searchform = form, file_data = data )
def lock_file(complaint_id=None): ''' Información y bloqueo de ficheros, puede recibir un id de queja, o una lista de ids (en hex) de ficheros separados por la letra "g" ''' page = request.args.get("page", 0, int) mode = request.args.get("show", "old", str) size = request.args.get("size", 15, int) filenames = {} bugged = [] fileids = () if request.method == 'POST': if not "fileids" in request.form: searchform = BlockFileSearchForm(request.form) identifiers = searchform.identifier.data.split() if searchform.mode.data == "hexid": fileids = [ mid2hex(hex2mid(i)) for i in identifiers if all(x in "0123456789abcdef" for x in i) ] elif searchform.mode.data == "b64id": fileids = [ mid2hex(url2mid(i)) for i in identifiers if all(x in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!-" for x in i) and (len(i)*8)%6 == 0 ] elif searchform.mode.data == "url": filenames.update( ( mid2hex(fileurl2mid(i)), u".".join(urllib2.unquote(i.split("/")[-1]).split(".")[:-1]) ) for i in identifiers if i.startswith("http") and len(i.split("//")[1].split("/")) > 3 ) fileids = filenames.keys() if not fileids: return redirect(url_for('admin.locks', page=page, mode=mode, size=size)) else: block = request.form.get("block", False, bool) unblock = request.form.get("unblock", False, bool) if block or unblock: # submit confirmar if complaint_id: pagesdb.update_complaint({"_id":complaint_id,"processed":True}) fileids = dict(i.split(":") for i in request.form["fileids"].split(",")) sphinx_block = [] sphinx_unblock = [] for fileid, server in fileids.iteritems(): (sphinx_block if block and not unblock else sphinx_unblock).append(fileid) req = {"_id":fileid, "bl": int(block and not unblock)} if server: req["s"] = int(server) # si recibo el servidor, lo uso por eficiencia try: # TODO(felipe): comprobar en qué casos se puede llegar aquí sin "s" filesdb.update_file(req, direct_connection=True, update_sphinx=False) except: flash("No se ha podido actualizar el fichero con id %s" % fileid, "error") if sphinx_block: block_files_in_sphinx(mongo_ids=sphinx_block, block=True) if sphinx_unblock: block_files_in_sphinx(mongo_ids=sphinx_unblock, block=False) flash("admin_locks_locked" if block else "admin_locks_unlocked", "success") elif request.form.get("cancel", False, bool): # submit cancelar if complaint_id: pagesdb.update_complaint({"_id":complaint_id,"processed":True}) flash("admin_locks_not_locked", "success") return redirect(url_for('admin.locks', page=page, mode=mode, size=size)) complaint_data = None # Hay un único o ningún registro de queja por formulario files_data = OrderedDict() # Pueden haber varios ficheros por formulario if complaint_id: # Si hay queja, sólo hay una url, la de la queja complaint_data = pagesdb.get_complaint(complaint_id) if complaint_data and "urlreported" in complaint_data: # extracción el id de complaint["urlreported"] de base64 a hexadecimal files_data[mid2hex(fileurl2mid(complaint_data["urlreported"]))] = None elif fileids: # Si no hay queja, los ficheros se sacan de la url files_data.update((i,None) for i in fileids) # Suponemos si queremos bloquear, desbloquear, o mostrar las dos opciones # dependiendo de sí de los ficheros están bloqueados o no # además rellenamos la información de los ficheros blocked = 0 unblocked = 0 for fileid in files_data.iterkeys(): data = filesdb.get_file(fileid, bl=None) if data is None and fileid in filenames: bugged.append(fileid) sid = get_id_server_from_search(fileid, filenames[fileid]) if sid: data = filesdb.get_file(fileid, sid = sid, bl = None) files_data[fileid] = data or {} if not "bl" in files_data[fileid] or files_data[fileid]["bl"] == 0: unblocked += 1 else: blocked += 1 return render_template('admin/lock_file.html', page_title=_('admin_locks_fileinfo'), complaint_data=complaint_data, files_data=files_data, filenames = filenames, bugged = bugged, fileids=",".join( "%s:%s" % (fileid, prop["s"] if "s" in prop else "") for fileid, prop in files_data.iteritems()), blocked=None if blocked and unblocked else blocked > 0, list_mode=mode, page=page, title=admin_title('admin_losfdcks_fileinfo'))
def download(file_id,file_name=None): ''' Muestra el archivo a descargar, votos, comentarios y archivos relacionados ''' def choose_filename_related(file_data): ''' Devuelve el nombre de fichero elegido ''' f=init_data(file_data) choose_filename(f) return f def comment_votes(file_id,comment): ''' Obtiene los votos de comentarios ''' comment_votes={} if "vs" in comment: for i,comment_vote in enumerate(usersdb.get_file_comment_votes(file_id)): if not comment_vote["_id"] in comment_votes: comment_votes[comment_vote["_id"][0:40]]=[0,0,0] if comment_vote["k"]>0: comment_votes[comment_vote["_id"][0:40]][0]+=1 else: comment_votes[comment_vote["_id"][0:40]][1]+=1 #si el usuario esta logueado y ha votado se guarda para mostrarlo activo if current_user.is_authenticated() and comment_vote["u"]==current_user.id: comment_votes[comment_vote["_id"][0:40]][2]=comment_vote["k"] return comment_votes #guardar los parametros desde donde se hizo la busqueda si procede args={} if request.referrer: querystring = urlparse(request.referrer).query if querystring: for params in u(querystring).encode("UTF-8").split("&"): param=params.split("=") if len(param) == 2: args[param[0]]=u(urllib.unquote_plus(param[1])) try: file_id=url2mid(file_id) except Exception as e: # Comprueba que se trate de un ID antiguo try: possible_file_id = filesdb.get_newid(file_id) if possible_file_id is None: logging.warn("%s - %s" % (e, file_id)) flash("link_not_exist", "error") abort(404) return redirect( url_for(".download", file_id=mid2url(possible_file_id), file_name=file_name), code=301) except filesdb.BogusMongoException as e: logging.exception(e) abort(503) try: data = filesdb.get_file(file_id, bl = None) except filesdb.BogusMongoException as e: logging.exception(e) abort(503) # intenta sacar el id del servidor de sphinx, # resuelve inconsistencias de los datos if not data: sid = get_id_server_from_search(file_id, file_name) if sid: try: data = filesdb.get_file(file_id, sid = sid, bl = None) except filesdb.BogusMongoException as e: logging.exception(e) abort(503) if data: if not data["bl"] in (0, None): if data["bl"] == 1: flash("link_not_exist", "error") elif data["bl"] == 3: flash("error_link_removed", "error") goback = True #block_files( mongo_ids=(data["_id"],) ) abort(404) else: flash("link_not_exist", "error") abort(404) #obtener los datos file_data=fill_data(data, True, file_name) if file_data["view"]["sources"]=={}: #si tiene todos los origenes bloqueados flash("error_link_removed", "error") abort(404) save_visited([file_data]) # Título title = u(file_data['view']['fn']) g.title = u"%s \"%s%s\"%s%s" % ( _(file_data['view']['action']).capitalize(), title[:50], "..." if len(title) > 50 else "", " - " if g.title else "", g.title) #obtener los archivos relacionados related_files = search_related(split_file(file_data["file"])[0][:10]) bin_file_id=mid2bin(file_id) ids=sorted({fid[0:3] for related in related_files for fid in get_ids(related) if fid[0]!=bin_file_id})[:5] files_related=[choose_filename_related(data) for data in get_files(ids)] #si el usuario esta logueado se comprueba si ha votado el archivo para el idioma activo vote=None if current_user.is_authenticated(): vote=usersdb.get_file_vote(file_id,current_user,g.lang) if vote is None: vote={"k":0} #formulario para enviar comentarios form = CommentForm(request.form) if request.method=='POST' and current_user.is_authenticated() and (current_user.type is None or current_user.type==0) and form.validate(): usersdb.set_file_comment(file_id,current_user,g.lang,form.t.data) form.t.data="" flash("comment_published_succesfully") #actualizar el fichero con la suma de los comentarios por idioma filesdb.update_file({"_id":file_id,"cs":usersdb.get_file_comments_sum(file_id),"s":file_data["file"]["s"]},direct_connection=True) #si tiene comentarios se guarda el número del comentario, el usuario que lo ha escrito, el comentario en si y los votos que tiene comments=[] if "cs" in file_data["file"]: comments=[(i,usersdb.find_userid(comment["_id"][0:24]),comment,comment_votes(file_id,comment)) for i,comment in enumerate(usersdb.get_file_comments(file_id,g.lang),1)] return render_template('files/download.html',file=file_data,args=args,vote=vote,files_related=files_related,comments=comments,form=form)