forked from nikopol/querytext.js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.html
142 lines (138 loc) · 10.2 KB
/
test.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<meta id="viewport" name="viewport" content="height=device-height,width=device-width,initial-scale=1.0,maximum-scale=1.0"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<link rel="shorcut icon" type="image/png" href="icons/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body { font: normal 12px "Sans Serif"; }
textarea { width: 100%; height: 300px; }
textarea#query { width: 90%; height: 50px; }
form { background: #aaa; }
input[type="text"] { width: 500px; }
label { float: left; display: block; width: 100px; text-align: right; }
.error { color: #f44; }
#result { padding: 5px; font-size: 18px; text-align: center }
pre { font-size: 12px; text-align: left; }
span.highlight { background-color: #f99 }
</style>
<title>QueryText</title>
<script type="text/javascript" src="querytext.js"></script>
<script type="text/javascript">
// miniko.js 0.3
// ~L~ [email protected] 2012
// https://github.com/nikopol/miniko.js
var __=function(a){return a instanceof Array?a:[a]},_=function(a,c){var b,g,e;if("object"==typeof a)b=a;else if(a.length)if("#"==a[0]&&!/[ \.\>\<]/.test(a))b=document.getElementById(a.substr(1));else{g=document.querySelectorAll(a);b=[];for(e=0;e<g.length;++e)b.push(g[e])}b&&void 0!=c&&__(b).forEach(function(a){a.innerHTML=c});return b},append=function(a,c){var b=_(a);b&&__(b).forEach(function(a){var b=document.createElement("div");for(b.innerHTML=c;b.childNodes.length;)a.appendChild(b.childNodes[0])});return b},css=function(a,c){var b=_(a),g,e;if(b){if(void 0==c)return b instanceof Array?b:b.className;/^([\+\-\*])(.+)$/.test(c)?(g=RegExp.$1,c=RegExp.$2,__(b).forEach(function(a){e=a.className.split(/\s+/).filter(function(a){return a});"-"!=g&&-1==e.indexOf(c)?e.push(c):"+"!=g&&(e=e.filter(function(a){return a!=c}));b.className=e.join(" ")})):__(b).forEach(function(a){a.className=c});return b}},ajax=function(a,c){"string"==typeof a&&(a={url:a,ok:c});var b=a.type||"GET",g=a.url||"",e=a.contenttype||
"application/x-www-form-urlencoded",j=a.datatype||"application/json",d=new window.XMLHttpRequest,i,f,h;if(a.data){if("string"==typeof a.data)f=a.data;else if(/json/.test(e))f=JSON.stringify(a.data);else{f=[];for(h in a.data)f.push(encodeURIComponent(h)+"="+encodeURIComponent(a.data[h]));f=f.join("&")}/GET|DEL/i.test(b)&&(g+=/\?/.test(g)?"&"+f:"?"+f,f="")}a.error||(a.error=function(a,b){console.error(a,b)});a.ok||(a.ok=function(){});d.onreadystatechange=function(){if(4==d.readyState)if(i&&clearTimeout(i),
/^2/.test(d.status)){f=d.responseText;if(/json/.test(j))try{f=JSON.parse(d.responseText)}catch(b){return a.error("json parse error: "+b.message,d)}a.ok(f,d)}else a.error(d.responseText,d)};d.open(b,g,!0);d.setRequestHeader("Content-Type",e);if(a.headers)for(h in a.headers)d.setRequestHeader(h,a.headers[h]);a.timeout&&(i=setTimeout(function(){d.onreadystatechange=function(){};d.abort();a.error&&a.error("timeout",d)},1E3*a.timeout));d.send(f);return d},position=function(a){var a=_(a),c={};a&&(c=a.getBoundingClientRect(),
c.left+=window.pageXOffset,c.top+=window.pageYOffset);return c},ready=function(a){/complete|loaded|interactive/.test(document.readyState)?a():document.attachEvent?document.attachEvent("ondocumentready",a()):document.addEventListener("DOMContentLoaded",function(){a()},!1)};
</script>
<script type="text/javascript">
ready(function(){
_('#search').onclick=function(){
var r=_('#result');
css(r,'-error').innerHTML='...';
var q=querytext({
debug: _('#debug').checked,
unaccent: _('#unaccent').checked,
sensitive: _('#sensitive').checked,
wholeword: _('#wholeword').checked,
matches: _('#match').checked,
query: _('#query').value
});
if(q.error){
css(r,'+error');
r.innerHTML=q.error+' at '+q.pos;
} else {
var v = _('#text').value;
var z = q.match(v);
r.innerHTML = z ? "match!" : "don't match";
if(_('#match').checked)
for(var k in z)
r.innerHTML += ' '+k+':'+z[k].join(',');
r.innerHTML += "<br/><pre>"+q.dump()+'</pre>';
}
};
_('#normalize').onclick=function(){
var r=_('#result');
css(r,'-error').innerHTML='...';
var q=querytext({
debug: _('#debug').checked,
unaccent: _('#unaccent').checked,
sensitive: _('#sensitive').checked,
wholeword: _('#wholeword').checked,
matches: _('#match').checked,
query: _('#query').value
});
if(q.error){
css(r,'+error');
r.innerHTML=q.error+' at '+q.pos;
} else {
_('#query').value = q.normalize();
r.innerHTML='normalized';
}
}
_('#highlight').onclick=function(){
var r=_('#result');
css(r,'-error').innerHTML='...';
var q=querytext({
debug: _('#debug').checked,
unaccent: _('#unaccent').checked,
sensitive: _('#sensitive').checked,
wholeword: _('#wholeword').checked,
matches: _('#match').checked,
query: _('#query').value
});
if(q.error){
css(r,'+error');
r.innerHTML=q.error+' at '+q.pos;
} else {
r.innerHTML=q.highlight(_('#text').value,'<span class="highlight">','</span>');
}
}
_('#highlightml').onclick=function(){
var r=_('#result');
css(r,'-error').innerHTML='...';
var q=querytext({
debug: _('#debug').checked,
unaccent: _('#unaccent').checked,
sensitive: _('#sensitive').checked,
wholeword: _('#wholeword').checked,
matches: _('#match').checked,
query: _('#query').value
});
if(q.error){
css(r,'+error');
r.innerHTML=q.error+' at '+q.pos;
} else {
r.innerHTML=q.highlight(_('#text').value,'<span class="highlight">','</span>',true);
}
}
});
</script>
</head>
<body>
<div><textarea id="text">
C'est l'un des hold-up les plus audacieux réalisés contre l'Etat français. En mai dernier, quelques jours avant le second tour de l'élection présidentielle, des pirates ont réussi à s'introduire dans les réseaux informatiques de l'Elysée. Révélée par le quotidien régional Le Télégramme, cette intrusion avait alors été soigneusement étouffée par le Château. Une omerta qui, jusqu'à présent, n'avait pas été brisée. Aucune information n'avait filtré sur la nature des agresseurs, ou même sur le préjudice subi. Pourtant, l'affaire est grave, d'autant qu'elle constituerait une cyberattaque sans précédent entre pays alliés.
L'Express peut révéler que les intrus ont non seulement réussi à pénétrer au coeur même du pouvoir politique français, mais qu'ils ont pu fouiller les ordinateurs des proches conseillers de Nicolas Sarkozy. Des notes secrètes ont été récupérées sur des disques durs, mais aussi des plans stratégiques. Du vrai travail de pro, digne du dernier James Bond, Skyfall. Et, comme souvent dans ce type d'attaque, une négligence humaine est à l'origine de la catastrophe.
Tout a commencé sur Facebook. Les assaillants ont d'abord identifié, sur le réseau social, le profil de personnes travaillant au palais présidentiel. Se faisant passer pour des amis, ils les ont ensuite invitées, par un message électronique, à se connecter sur l'intranet du Château. Sauf que ce lien menait à une fausse page Web - une réplique de celle de l'Elysée. Les victimes n'y ont vu que du feu ; et lorsque est apparu, à l'écran, un message leur demandant leur identifiant et leur mot de passe, elles les ont donnés en toute bonne foi. Une technique bien connue des hackers, qui leur a permis de récupérer les clefs numériques pour s'inviter en toute quiétude dans le saint des saints.
Une fois à l'intérieur, les pirates ont installé un logiciel espion qui s'est propagé d'un ordinateur à l'autre. Très élaboré, ce "ver" n'a infecté que quelques machines. Et pas n'importe lesquelles : celles des conseillers les plus influents du gouvernement... et du secrétaire général, Xavier Musca. Nicolas Sarkozy y a, lui, échappé. Et pour cause, il ne possédait pas de PC. Malheureusement pour les assaillants, le code malveillant a laissé des empreintes. "Telles des marionnettes actionnées par des fils invisibles, les machines infectées communiquent avec leur maître pour prendre leurs ordres, décrypte un expert, Olivier Caleff, responsable sécurité du Cert-Devoteam, une société de sécurité informatique. Lorsque l'on essaie de remonter ces fils sur Internet, on arrive souvent sur des serveurs situés à l'étranger."
C'est ce travail de fourmi qu'ont mené les enquêteurs français. Le degré de sophistication de l'attaque était tel que les suspects se limitaient, d'emblée, à une poignée de pays. Pour preuve, le cyberpompier de l'Etat, l'Agence nationale de la sécurité des systèmes d'information (Anssi), a mis plusieurs jours pour restaurer le réseau de l'Elysée. Difficile de trouver l'origine de l'offensive. Souvent, les assaillants brouillent les pistes en passant par des pays tiers. Autant de rebonds, sur des serveurs situés sur les cinq continents, qui rendent ce fil d'Ariane très compliqué à suivre, même pour les "cyberdétectives" de l'Etat mobilisés pour l'occasion. Mais, selon les informations recueillies par L'Express auprès de plusieurs sources, leurs conclusions, fondées sur un faisceau de présomptions, convergent vers le plus vieil allié de la France : les Etats-Unis.
</textarea></div>
<form>
<div><label for="query">Query</label><textarea id="query">"James Bond" AND sarkozy</textarea></div>
<div><label for="wholeword">WholeWord</label><input id="wholeword" type="checkbox" checked="checked"/></div>
<div><label for="sensitive">Case sensitive</label><input id="sensitive" type="checkbox"/></div>
<div><label for="unaccent">Unaccent</label><input id="unaccent" type="checkbox" checked="checked"/></div>
<div><label for="match">Matches</label><input id="match" type="checkbox" checked="checked"/> return match's positions (query tree optimized if not)</div>
<div><label for="debug">Debug</label><input id="debug" type="checkbox" checked="checked"/> (console logs)</div>
<input id="search" type="button" value="search" />
<input id="normalize" type="button" value="normalize" />
<input id="highlight" type="button" value="highlight" />
<input id="highlightml" type="button" value="HTML highlight" />
</form>
<div id="result"></div>
</body>
</html>