mirror of
https://github.com/ail-project/ail-framework.git
synced 2024-11-27 00:07:16 +00:00
581 lines
23 KiB
HTML
581 lines
23 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<title>Paste information - AIL</title>
|
|
<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}">
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
|
|
<link href="{{ url_for('static', filename='font-awesome/css/font-awesome.css') }}" rel="stylesheet">
|
|
<link href="{{ url_for('static', filename='css/sb-admin-2.css') }}" rel="stylesheet">
|
|
<link href="{{ url_for('static', filename='css/dataTables.bootstrap.css') }}" rel="stylesheet" type="text/css" />
|
|
<link href="{{ url_for('static', filename='css/tags.css') }}" rel="stylesheet" type="text/css" />
|
|
|
|
<script language="javascript" src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
|
<script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/jquery.dataTables.min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/jquery.flot.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/jquery.flot.time.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/jquery.flot.stack.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/tags.js') }}"></script>
|
|
|
|
<style>
|
|
.scrollable-menu {
|
|
height: auto;
|
|
max-height: 200px;
|
|
overflow-x: hidden;
|
|
width:100%;
|
|
}
|
|
|
|
.red_table thead{
|
|
background: #d91f2d;
|
|
color: #fff;
|
|
}
|
|
</style>
|
|
|
|
</head>
|
|
<body>
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading">
|
|
<h1 class="page-header" >Paste: {{ request.args.get('paste') }}</h1>
|
|
<h2 class="page-header" >
|
|
<div>
|
|
|
|
<div id="mymodal" class="modal fade" role="dialog">
|
|
<div class="modal-dialog modal-lg">
|
|
|
|
<!-- Modal content-->
|
|
<div id="mymodalcontent" class="modal-content">
|
|
<div class="modal-header" style="border-bottom: 4px solid #cccccc; background-color: #cccccc; color: #ffffff;">
|
|
<p class="heading">Edit this tag</p>
|
|
|
|
</div>
|
|
|
|
<div class="modal-body">
|
|
|
|
<div class="input-group" >
|
|
<input id="ltags" type="text" class="form-control" autocomplete="off" style="width: 760px" name="ltags">
|
|
</div>
|
|
|
|
<div class="btn-group btn-block">
|
|
<button type="button" class="btn btn-primary dropdown-toggle btn-block" data-toggle="dropdown">Taxonomie Selection
|
|
<i class="fa fa-chevron-down"></i>
|
|
</button>
|
|
<ul class="dropdown-menu scrollable-menu" role="menu">
|
|
<li><a href="#" id="all-tags-taxonomies">All Tags <i class="fa fa-tags"></i></a></li>
|
|
<li role="separator" class="divider"></li>
|
|
{% for taxo in active_taxonomies %}
|
|
<li><a href="#" id="{{ taxo }}-id{{ loop.index0 }}">{{ taxo }}</a></li>
|
|
{% endfor %}
|
|
</ul>
|
|
</div>
|
|
<br/><br/>
|
|
|
|
<div class="input-group">
|
|
<input id="ltagsgalaxies" type="text" class="form-control" autocomplete="off" style="width: 760px" name="ltagsgalaxies">
|
|
</div>
|
|
|
|
<div class="btn-group btn-block">
|
|
<button type="button" class="btn btn-primary dropdown-toggle btn-block" data-toggle="dropdown">Galaxy Selection
|
|
<i class="fa fa-chevron-down"></i>
|
|
</button>
|
|
<ul class="dropdown-menu scrollable-menu" role="menu">
|
|
<li><a href="#" id="all-tags-galaxies">All Tags <i class="fa fa-tags"></i></a></li>
|
|
<li role="separator" class="divider"></li>
|
|
{% for galaxy in active_galaxies %}
|
|
<li><a href="#" id="{{ galaxy }}-idgalax{{ loop.index0 }}">{{ galaxy }}</a></li>
|
|
{% endfor %}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
|
<a class="btn btn-tags pull-left" href="{{ url_for('Tags.taxonomies') }}" target="_blank">
|
|
<span class="label-icon">Edit Taxonomies List </span>
|
|
<i class="fa fa-wrench fa-2x"></i>
|
|
</a>
|
|
<a class="btn btn-tags pull-left" href="{{ url_for('Tags.galaxies') }}" target="_blank">
|
|
<span class="label-icon">Edit Galaxies List</span>
|
|
<i class="fa fa-rocket fa-2x"></i>
|
|
</a>
|
|
<button class="btn btn-primary btn-tags" onclick="addTags()">
|
|
<span class="glyphicon glyphicon-plus"></span>
|
|
<span class="label-icon">Add Tags</span>
|
|
</button>
|
|
<button type="button" class="btn btn-default" data-dismiss="modal" >Close</button>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
{% for tag in list_tags %}
|
|
<span class="btn btn-{{ bootstrap_label[loop.index0 % 5] }} btn-lg pull-left" data-toggle="modal" data-target="#myModal_{{ loop.index0 }}">{{ tag[0] }}</span>
|
|
|
|
<!-- Modal edit this tag -->
|
|
<div class="modal fade" id="myModal_{{ loop.index0 }}" role="dialog">
|
|
<div class="modal-dialog">
|
|
|
|
<div class="modal-content text-center">
|
|
<div class="modal-header" style="border-bottom: 4px solid #cccccc; background-color: #cccccc; color: #ffffff;">
|
|
<p class="heading">Edit this tag</p>
|
|
|
|
</div>
|
|
<div class="modal-body">
|
|
<span class="label label-{{ bootstrap_label[loop.index0 % 5] }}" >{{ tag[0] }}</span>
|
|
</div>
|
|
<div class="modal-footer center">
|
|
|
|
{% if not tag[2] %}
|
|
<a href="{{ url_for('Tags.tag_validation') }}?paste={{ request.args.get('paste') }}&tag={{ tag[0] }}&status=tp" class="btn btn-success pull-left" data-toggle="tooltip" title="Good Detection">
|
|
<span class="glyphicon glyphicon-thumbs-up "></span>
|
|
</a>
|
|
{% endif %}
|
|
{% if tag[2] %}
|
|
<button class="btn btn-success pull-left disabled" data-toggle="tooltip" title="Good Detection">
|
|
<span class="glyphicon glyphicon-thumbs-up "></span>
|
|
</button>
|
|
{% endif %}
|
|
{% if not tag[3] %}
|
|
<a href="{{ url_for('Tags.tag_validation') }}?paste={{ request.args.get('paste') }}&tag={{ tag[0] }}&status=fp" class="btn btn-danger pull-left" data-toggle="tooltip" title="Bad Detection">
|
|
<span class="glyphicon glyphicon-thumbs-down "></span>
|
|
</a>
|
|
{% endif %}
|
|
{% if tag[3] %}
|
|
<button class="btn btn-danger pull-left disabled" data-toggle="tooltip" title="Bad Detection">
|
|
<span class="glyphicon glyphicon-thumbs-down "></span>
|
|
</button>
|
|
{% endif %}
|
|
|
|
{% if tag[1] %}
|
|
<a href="{{ url_for('Tags.confirm_tag') }}?paste={{ request.args.get('paste') }}&tag={{ tag[0] }}" class="btn btn-primary">
|
|
<span class="glyphicon glyphicon-ok "></span> Confirm this Tag
|
|
</a>
|
|
{% endif %}
|
|
<a href="{{ url_for('Tags.remove_tag') }}?paste={{ request.args.get('paste') }}&tag={{ tag[0] }}" class="btn btn-danger">
|
|
<span class="glyphicon glyphicon-trash "></span> Delete this Tag
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
{% endfor %}
|
|
<button type="button" class="btn btn-light btn-lg" data-toggle="modal" data-target="#mymodal" data-url="{{ url_for('Tags.taxonomies') }}">
|
|
<span class="glyphicon glyphicon-plus "></span>
|
|
</button>
|
|
</div>
|
|
</h2>
|
|
|
|
<table class="table table-condensed">
|
|
<thead>
|
|
<tr>
|
|
<th>Date</th>
|
|
<th>Source</th>
|
|
<th>Encoding</th>
|
|
<th>Language</th>
|
|
<th>Size (Kb)</th>
|
|
<th>Mime</th>
|
|
<th>Number of lines</th>
|
|
<th>Max line length</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>{{ date }}</td>
|
|
<td>{{ source }}</td>
|
|
<td>{{ encoding }}</td>
|
|
<td>{{ language }}</td>
|
|
<td>{{ size }}</td>
|
|
<td>{{ mime }}</td>
|
|
<td>{{ lineinfo.0 }}</td>
|
|
<td>{{ lineinfo.1 }}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
{% if item_parent %}
|
|
<div>
|
|
<a href="{{ url_for('showsavedpastes.showsavedpaste')}}?paste={{item_parent}}" target="_blank">{{item_parent}}</a>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div>
|
|
{% with obj_type='item', obj_id=request.args.get('paste'), obj_lvl=0%}
|
|
{% include 'import_export/block_add_user_object_to_export.html' %}
|
|
{% endwith %}
|
|
|
|
{% if hive %}
|
|
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal_hive">
|
|
Create
|
|
<img id="thehive-icon" src="{{url_for('static', filename='image/thehive_icon.png') }}">
|
|
Case
|
|
</button>
|
|
<!-- Modal HIVE-->
|
|
<div class="modal fade" id="myModal_hive" role="dialog">
|
|
<div class="modal-dialog">
|
|
|
|
<div class="modal-content">
|
|
<div class="modal-header text-center">
|
|
<img id="misp-logo" src="{{url_for('static', filename='image/thehive-logo.png') }}" width="500" >
|
|
</div>
|
|
|
|
<div class="modal-body">
|
|
|
|
<form method="post" action="{{ url_for('PasteSubmit.create_hive_case') }}" target="_blank">
|
|
|
|
<div class="input clear required">
|
|
<label for="EventThreatLevelId">Threat Level</label>
|
|
<select name="threat_level_hive" id="EventThreatLevelId" required="required">
|
|
<option value="1">High</option>
|
|
<option value="2" selected="selected">Medium</option>
|
|
<option value="3">Low</option>
|
|
</select>
|
|
</div>
|
|
<div class="input select required">
|
|
<label for="TLP">TLP</label>
|
|
<select name="hive_tlp" id="hive_tlp" required="required" class="selectpicker">
|
|
<option value="0">White</option>
|
|
<option value="1">Green</option>
|
|
<option value="2" selected="selected">Amber</option>
|
|
<option value="3">Red</option>
|
|
</select>
|
|
</div>
|
|
<div class="clear required">
|
|
<label for="hive_case_title">Title</label>
|
|
<input name="hive_case_title" class="form-control span6" placeholder="Title" type="text" id="hive_case_title" required="required"/>
|
|
</div>
|
|
<div class="clear required">
|
|
<label for="hive_description">Description</label>
|
|
<input name="hive_description" class="form-control span6" placeholder="Quick Case Description" type="text" id="hive_description" required="required"/>
|
|
</div>
|
|
<input type="hidden" id="paste" name="paste" value="{{ request.args.get('paste') }}">
|
|
|
|
{% if hive_caseid %}
|
|
<br>
|
|
<div class="list-group" id="misp_event">
|
|
<li class="list-group-item active">The Hive Case already Created</li>
|
|
<a target="_blank" href="{{ hive_url }}" class="list-group-item">{{ hive_url }}</a></div>
|
|
{% endif %}
|
|
|
|
</div>
|
|
<div class="modal-footer center">
|
|
<button href="" class="btn btn-primary">
|
|
<span class="glyphicon glyphicon-ok "></span> Create Case
|
|
</button>
|
|
|
|
</form>
|
|
<button type="button" class="btn btn-default" data-dismiss="modal" >Close</button>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<div>
|
|
<a href="{{ url_for('correlation.show_correlation')}}?object_type=paste&correlation_id={{ request.args.get('paste') }}&correlation_objects=paste" target="_blank" style="font-size: 15px">
|
|
<button class="btn btn-info"><i class="fa fa-search"></i> Show Paste Correlation
|
|
</button>
|
|
</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="panel-body" id="panel-body">
|
|
|
|
{% if duplicate_list|length == 0 %}
|
|
{% else %}
|
|
<h3> Duplicate list: </h3>
|
|
<table id="tableDup" class="table table-striped table-bordered">
|
|
{% set i = 0 %}
|
|
<thead>
|
|
<tr>
|
|
<th>Hash type</th>
|
|
<th>Paste info</th>
|
|
<th>Date</th>
|
|
<th>Path</th>
|
|
<th>Action</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for dup_path in duplicate_list %}
|
|
<tr>
|
|
<td>{{ hashtype_list[loop.index - 1] }}</td>
|
|
<td>Similarity: {{ simil_list[loop.index - 1] }}%</td>
|
|
<td>{{ date_list[loop.index - 1] }}</td>
|
|
<td><a target="_blank" href="{{ url_for('showsavedpastes.showsavedpaste') }}?paste={{ dup_path }}" id='dup_path'>{{ dup_path }}</a></td>
|
|
<td><a target="_blank" href="{{ url_for('showsavedpastes.showDiff') }}?s1={{ request.args.get('paste') }}&s2={{ dup_path }}" class="fa fa-columns" title="Show differences"></a></td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% if l_64|length != 0 %}
|
|
<h3> Hash files: </h3>
|
|
<table id="tableb64" class="red_table table table-striped table-bordered">
|
|
<thead>
|
|
<tr>
|
|
<th>estimated type</th>
|
|
<th>hash</th>
|
|
<th>saved_path</th>
|
|
<th>Virus Total</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for b64 in l_64 %}
|
|
<tr>
|
|
<td><i class="fa {{ b64[0] }}"></i> {{ b64[1] }}</td>
|
|
<td><a target="_blank" href="{{ url_for('correlation.show_correlation') }}?object_type=decoded&correlation_id={{ b64[2] }}&correlation_objects=paste">{{ b64[2] }}</a> ({{ b64[4] }})</td>
|
|
<td>{{ b64[3] }}</td>
|
|
<td style="text-align:center;">
|
|
{% if vt_enabled %}
|
|
{% if not b64[5] %}
|
|
<darkbutton_{{ b64[2] }}>
|
|
<button id="submit_vt_{{ b64[2] }}" class="btn btn-primary" onclick="sendFileToVT('{{ b64[2] }}')">
|
|
<i class="fa fa-paper-plane"></i> Send this file to VT
|
|
</button>
|
|
</darkbutton_{{ b64[2] }}>
|
|
{% else %}
|
|
<a class="btn btn-primary" target="_blank" href="{{ b64[6] }}"><i class="fa fa-link"> VT Report</i></a>
|
|
{% endif %}
|
|
<button class="btn btn-default" onclick="updateVTReport('{{ b64[2] }}')">
|
|
<div id="report_vt_{{ b64[2] }}"><span class="glyphicon glyphicon-refresh"></span> {{ b64[7] }}</div>
|
|
</button>
|
|
{% else %}
|
|
Virus Total submission is disabled
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% if crawler_metadata['get_metadata'] %}
|
|
<div class="row">
|
|
|
|
<div class="col-md-5">
|
|
<div class="row">
|
|
<div class="panel panel-info">
|
|
<div class="panel-heading">
|
|
<i class="fa fa-eye-slash"></i> Crawled Paste
|
|
</div>
|
|
|
|
<table class="table table-hover table-striped">
|
|
<tbody>
|
|
<tr>
|
|
<td>Domain</td>
|
|
<td><a target="_blank" href="{{ url_for('crawler_splash.showDomain') }}?domain={{ crawler_metadata['domain'] }}" id='domain'>{{ crawler_metadata['domain'] }}</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Father</td>
|
|
<td><a target="_blank" href="{{ url_for('showsavedpastes.showsavedpaste') }}?paste={{ crawler_metadata['paste_father'] }}" id='paste_father'>{{ crawler_metadata['paste_father'] }}</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Source link</td>
|
|
<td>{{ crawler_metadata['real_link'] }}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
{% if crawler_metadata['har_file'] %}
|
|
button
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-7">
|
|
<div class="panel panel-info" style="text-align:center;">
|
|
<div class="panel-heading">
|
|
<div class="row">
|
|
<div class="col-md-8">
|
|
<input class="center" id="blocks" type="range" min="1" max="50" value="{%if tags_safe%}13{%else%}0{%endif%}">
|
|
</div>
|
|
<div class="col-md-4">
|
|
<button class="btn {%if tags_safe%}btn-primary{%else%}btn-danger{%endif%} btn-tags" onclick="blocks.value=50;pixelate();">
|
|
<span class="glyphicon glyphicon-zoom-in"></span>
|
|
<span class="label-icon">Full resolution</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<canvas id="canvas" style="width:100%;"></canvas>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<h3> Content: </h3>
|
|
<a href="{{ url_for('showsavedpastes.showsavedrawpaste') }}?paste={{ request.args.get('paste') }}" id='raw_paste' > [Raw content] </a>
|
|
<p data-initsize="{{ initsize }}"> <pre id="paste-holder">{{ content }}</pre></p>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
|
|
<script>
|
|
var ltags
|
|
var ltagsgalaxies
|
|
$(document).ready(function(){
|
|
|
|
$.getJSON("{{ url_for('Tags.get_all_tags_taxonomies') }}",
|
|
function(data) {
|
|
|
|
ltags = $('#ltags').tagSuggest({
|
|
data: data,
|
|
maxDropHeight: 200,
|
|
name: 'ltags'
|
|
});
|
|
});
|
|
|
|
$.getJSON("{{ url_for('Tags.get_all_tags_galaxy') }}",
|
|
function(data) {
|
|
|
|
ltagsgalaxies = $('#ltagsgalaxies').tagSuggest({
|
|
data: data,
|
|
maxDropHeight: 200,
|
|
name: 'ltagsgalaxies'
|
|
});
|
|
});
|
|
|
|
$('#tableDup').DataTable();
|
|
$('#tableb64').DataTable({
|
|
"aLengthMenu": [[5, 10, 15, -1], [5, 10, 15, "All"]],
|
|
"iDisplayLength": 5,
|
|
"order": [[ 1, "asc" ]]
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<script>
|
|
function updateVTReport(hash) {
|
|
//updateReport
|
|
$.getJSON("{{ url_for('hashDecoded.update_vt_result') }}?hash="+hash,
|
|
function(data) {
|
|
content = '<span class="glyphicon glyphicon-refresh"></span> ' +data['report_vt']
|
|
$( "#report_vt_"+hash ).html(content);
|
|
});
|
|
}
|
|
|
|
function sendFileToVT(hash) {
|
|
//send file to vt
|
|
$.getJSON("{{ url_for('hashDecoded.send_file_to_vt_js') }}?hash="+hash,
|
|
function(data) {
|
|
var content = '<a id="submit_vt_'+hash+'" class="btn btn-primary" target="_blank" href="'+ data['vt_link'] +'"><i class="fa fa-link"> '+ ' VT Report' +'</i></a>';
|
|
$('#submit_vt_'+hash).remove();
|
|
$('darkbutton_'+hash).append(content);
|
|
});
|
|
}
|
|
|
|
</script>
|
|
|
|
<script>
|
|
jQuery("#all-tags-taxonomies").click(function(e){
|
|
//change input tags list
|
|
$.getJSON("{{ url_for('Tags.get_all_tags_taxonomies') }}",
|
|
function(data) {
|
|
ltags.setData(data)
|
|
});
|
|
});
|
|
|
|
</script>
|
|
<script>
|
|
jQuery("#all-tags-galaxies").click(function(e){
|
|
$.getJSON("{{ url_for('Tags.get_all_tags_galaxy') }}",
|
|
function(data) {
|
|
ltagsgalaxies.setData(data)
|
|
});
|
|
});
|
|
|
|
</script>
|
|
|
|
<script>
|
|
function addTags() {
|
|
var tags = ltags.getValue()
|
|
var tagsgalaxy = ltagsgalaxies.getValue()
|
|
var path = '{{ request.args.get('paste') }}'
|
|
window.location.replace("{{ url_for('tags_ui.add_tags') }}?tags=" + tags + "&tagsgalaxies=" + tagsgalaxy + "&object_id=" + path + "&object_type=item");
|
|
}
|
|
|
|
</script>
|
|
|
|
<script>
|
|
{% for taxo in active_taxonomies %}
|
|
jQuery("#{{ taxo }}-id{{ loop.index0 }}").click(function(e){
|
|
$.getJSON("{{ url_for('Tags.get_tags_taxonomie') }}?taxonomie={{ taxo }}",
|
|
function(data) {
|
|
ltags.setData(data)
|
|
});
|
|
});
|
|
{% endfor %}
|
|
</script>
|
|
<script>
|
|
{% for galaxy in active_galaxies %}
|
|
jQuery("#{{ galaxy }}-idgalax{{ loop.index0 }}").click(function(e){
|
|
$.getJSON("{{ url_for('Tags.get_tags_galaxy') }}?galaxy={{ galaxy }}",
|
|
function(data) {
|
|
ltagsgalaxies.setData(data)
|
|
});
|
|
});
|
|
{% endfor %}
|
|
</script>
|
|
|
|
{% if crawler_metadata['get_metadata'] %}
|
|
<script>
|
|
var ctx = canvas.getContext('2d'), img = new Image();
|
|
|
|
/// turn off image smoothing
|
|
ctx.webkitImageSmoothingEnabled = false;
|
|
ctx.imageSmoothingEnabled = false;
|
|
|
|
img.onload = pixelate;
|
|
img.addEventListener("error", img_error);
|
|
var draw_img = false;
|
|
|
|
img.src = "{{ url_for('showsavedpastes.screenshot', filename=crawler_metadata['screenshot']) }}";
|
|
|
|
function pixelate() {
|
|
|
|
/// use slider value
|
|
if( blocks.value == 50 ){
|
|
size = 1;
|
|
} else {
|
|
var size = (blocks.value) * 0.01;
|
|
}
|
|
|
|
canvas.width = img.width;
|
|
canvas.height = img.height;
|
|
|
|
/// cache scaled width and height
|
|
w = canvas.width * size;
|
|
h = canvas.height * size;
|
|
|
|
/// draw original image to the scaled size
|
|
ctx.drawImage(img, 0, 0, w, h);
|
|
|
|
/// pixelated
|
|
ctx.drawImage(canvas, 0, 0, w, h, 0, 0, canvas.width, canvas.height);
|
|
|
|
}
|
|
|
|
function img_error() {
|
|
img.onerror=null;
|
|
img.src="{{ url_for('static', filename='image/AIL.png') }}";
|
|
blocks.value = 50;
|
|
pixelate;
|
|
}
|
|
|
|
blocks.addEventListener('change', pixelate, false);
|
|
</script>
|
|
{% endif %}
|
|
|
|
</html>
|