mirror of
				https://github.com/sb745/NyaaV3.git
				synced 2025-10-31 16:05:46 +02:00 
			
		
		
		
	 a38e5d5b53
			
		
	
	
		a38e5d5b53
		
	
	
	
	
		
			
			* Implement range bans People connecting from banned IP ranges are unable to upload torrents anonymously, and need to manually have their accounts activated. This adds a new table "rangebans", and a command line utility, "rangeban.py", which can be used to add, list and remove rangebans from the command line. As an example: ./rangeban.py ban 192.168.0.0/24 This would rangeban anything in this /24. The temporary_tor column allows automated scripts to clean out and re-add ever-changing sets of ranges to be banned without affecting the other ranges. This has only been tested for IPv4. * Revise Rangebans Add an id column, and change "temporary_tor" to "temp". Also index masked_cidr and mask. * rangebans: fix enabled and the binary op kill me * Add enabling/disabling bans to rangeban.py * rangebans: fail earlier on garbage arguments * rangebans: fix linter errors * rangeban.py: don't shadow builtin keyword 'id' * rangebans: change temporary ban logic, column The 'temp' column is now a nullable time column. If the field is null, the ban is understood to be permanent. If there is a time in there, it's understood to be the creation time of the ban. This allows scripts to e.g. delete all temporary bans older than a certain amount of time. Also, rename the '_cidr_string' column to 'cidr_string', because reasons. * rangeban.py: use ip_address to parse CIDR subnet * rangebans: fixes to the mask calculation and query Both were not bugs per-se, but just technically not needed/correct. * De-meme apparently
		
			
				
	
	
		
			136 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| {% extends "layout.html" %}
 | |
| {% block title %}Upload Torrent :: {{ config.SITE_NAME }}{% endblock %}
 | |
| {% block metatags %}
 | |
| <meta property="og:description" content="Upload a torrent to {{ config.SITE_NAME }}">
 | |
| {% endblock %}
 | |
| {% block body %}
 | |
| {% from "_formhelpers.html" import render_field %}
 | |
| {% from "_formhelpers.html" import render_upload %}
 | |
| {% from "_formhelpers.html" import render_markdown_editor %}
 | |
| 
 | |
| <h1>Upload Torrent</h1>
 | |
| {% if not g.user %}
 | |
| <p>You are not logged in, and are uploading anonymously.</p>
 | |
| {% endif %}
 | |
| 
 | |
| <div id="upload-drop-zone"><span>Drop here!</span></div>
 | |
| <form method="POST" enctype="multipart/form-data">
 | |
| 	{{ upload_form.csrf_token }}
 | |
| 
 | |
| 	{% if config.ENFORCE_MAIN_ANNOUNCE_URL %}<p><strong>Important:</strong> Please include <kbd>{{ config.MAIN_ANNOUNCE_URL }}</kbd> in your trackers.</p>{% endif %}
 | |
| 	<p><strong>Important:</strong> Make sure you have read <strong><a href="{{ url_for('site.rules') }}">the rules</a></strong> before uploading!</p>
 | |
| 	<br>
 | |
| 
 | |
| 	{% if show_ratelimit %}
 | |
| 	{% set ratelimit_class = 'danger' if upload_form.ratelimit.errors else 'warning' %}
 | |
| 	<div class="row">
 | |
| 		<div class="col-md-12">
 | |
| 			<div class="alert alert-{{ ratelimit_class }}" role="alert">
 | |
| 				<div>You've reached your maximum upload rate ({{ config.MAX_UPLOAD_BURST }} per {{ config.UPLOAD_BURST_DURATION // 60}} minutes, you have <b>{{ ratelimit_count }}</b>) and will now have to wait {{ config.UPLOAD_TIMEOUT // 60 }} minutes between uploads.</div>
 | |
| 				{% if next_upload_time %}
 | |
| 				<div>You may upload again at <b data-timestamp="{{ next_upload_time|utc_timestamp }}">{{ next_upload_time.strftime('%Y-%m-%d %H:%M UTC') }}</b>.</div>
 | |
| 				{% else %}
 | |
| 				<div>You may upload again now.</div>
 | |
| 				{% endif %}
 | |
| 			</div>
 | |
| 		</div>
 | |
| 	</div>
 | |
| 	{% endif %}
 | |
| 
 | |
| 	{% if upload_form.rangebanned.errors %}
 | |
| 	<div class="row">
 | |
| 		<div class="col-md-12">
 | |
| 			<div class="alert alert-danger" role="alert">
 | |
| 				{% for error in upload_form.rangebanned.errors %}
 | |
| 				<p>{{ error }}</p>
 | |
| 				{% endfor %}
 | |
| 			</div>
 | |
| 		</div>
 | |
| 	</div>
 | |
| 	{% endif %}
 | |
| 
 | |
| 	<div class="row">
 | |
| 		<div class="col-md-12">
 | |
| 		{{ render_upload(upload_form.torrent_file, accept=".torrent") }}
 | |
| 		</div>
 | |
| 	</div>
 | |
| 	<div class="row">
 | |
| 		<div class="col-md-6">
 | |
| 		{{ render_field(upload_form.display_name, class_='form-control', placeholder='Display name') }}
 | |
| 		</div>
 | |
| 		<div class="col-md-6">
 | |
| 		{{ render_field(upload_form.category, class_='form-control')}}
 | |
| 		</div>
 | |
| 	</div>
 | |
| 	<div class="row form-group">
 | |
| 		<div class="col-md-6">
 | |
| 			{{ render_field(upload_form.information, class_='form-control', placeholder='Your website or IRC channel') }}
 | |
| 		</div>
 | |
| 		<div class="col-md-6">
 | |
| 			<label class="control-label">Torrent flags</label><br>
 | |
| 
 | |
| 			<div class="btn-group" data-toggle="buttons">
 | |
| 				<label class="btn btn-default {% if not g.user %}active disabled{% endif %}" title="Upload torrent anonymously (don't display your username)">
 | |
| 					{{ upload_form.is_anonymous(disabled=(False if g.user else ""), checked=(False if g.user else "")) }}
 | |
| 					{% if not g.user %}<span class="glyphicon glyphicon-ban-circle"></span>{% endif %}
 | |
| 					{% if g.user %}<span class="glyphicon glyphicon-check"></span>{% endif %}
 | |
| 					{% if g.user %}<span class="glyphicon glyphicon-unchecked"></span>{% endif %}
 | |
| 					Anonymous
 | |
| 				</label>
 | |
| 				<label class="btn btn-grey" title="Hide torrent from listing">
 | |
| 					{{ upload_form.is_hidden }}
 | |
| 					<span class="glyphicon glyphicon-check"></span>
 | |
| 					<span class="glyphicon glyphicon-unchecked"></span>
 | |
| 					Hidden
 | |
| 				</label>
 | |
| 			</div>
 | |
| 			<div class="hidden-xl hidden-lg"><br></div>
 | |
| 			<div class="btn-group" data-toggle="buttons">
 | |
| 				<label class="btn btn-danger" title="This torrent is derived from another release">
 | |
| 					{{ upload_form.is_remake }}
 | |
| 					<span class="glyphicon glyphicon-check"></span>
 | |
| 					<span class="glyphicon glyphicon-unchecked"></span>
 | |
| 					Remake
 | |
| 				</label>
 | |
| 				<label class="btn btn-warning" title="This torrent is a complete batch (eg. season)">
 | |
| 					{{ upload_form.is_complete }}
 | |
| 					<span class="glyphicon glyphicon-check"></span>
 | |
| 					<span class="glyphicon glyphicon-unchecked"></span>
 | |
| 					Complete
 | |
| 				</label>
 | |
| 				{% if g.user.is_trusted %}
 | |
| 				<label class="btn btn-success active" title="Mark torrent trusted">
 | |
| 					{{ upload_form.is_trusted(checked="") }}
 | |
| 					<span class="glyphicon glyphicon-check"></span>
 | |
| 					<span class="glyphicon glyphicon-unchecked"></span>
 | |
| 					Trusted
 | |
| 				</label>
 | |
| 				{% endif %}
 | |
| 			</div>
 | |
| 		</div>
 | |
| 	</div>
 | |
| 	<div class="row">
 | |
| 		<div class="col-md-12">
 | |
| 			{{ render_markdown_editor(upload_form.description, field_name='description') }}
 | |
| 		</div>
 | |
| 	</div>
 | |
| 
 | |
| 	{% if config.USE_RECAPTCHA and (not g.user or g.user.age < config['ACCOUNT_RECAPTCHA_AGE']) %}
 | |
| 	<div class="row">
 | |
| 		<div class="col-md-4">
 | |
| 			{% for error in upload_form.recaptcha.errors %}
 | |
| 			{{ error }}
 | |
| 			{% endfor %}
 | |
| 			{{ upload_form.recaptcha }}
 | |
| 		</div>
 | |
| 	</div>
 | |
| 	{% endif %}
 | |
| 
 | |
| 	<br>
 | |
| 	<div class="row">
 | |
| 		<div class="form-group col-md-6">
 | |
| 			<input type="submit" value="Upload" class="btn btn-primary">
 | |
| 		</div>
 | |
| 	</div>
 | |
| </form>
 | |
| {% endblock %}
 |