yannstatic/static/2020/10/04/Mullvad-linux-Desktop-et-Android.html

2402 lines
217 KiB
HTML
Raw Permalink Normal View History

2024-10-31 20:18:37 +01:00
<!DOCTYPE html><html lang="fr">
<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Mullvad linux Desktop et Android - YannStatic</title>
<meta name="description" content="Évitez les hackers et les traqueursLors de vos connexions à Internet via Mullvad, nous chiffrons tout le trafic entrant et sortant de votre ordinateur selon ...">
<link rel="canonical" href="https://static.rnmkcy.eu/2020/10/04/Mullvad-linux-Desktop-et-Android.html"><link rel="alternate" type="application/rss+xml" title="YannStatic" href="/feed.xml">
<!-- - include head/favicon.html - -->
<link rel="shortcut icon" type="image/png" href="/assets/favicon/favicon.png"><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" ><!-- start custom head snippets --><link rel="stylesheet" href="/assets/css/expand.css">
<!-- end custom head snippets --><script>(function() {
window.isArray = function(val) {
return Object.prototype.toString.call(val) === '[object Array]';
};
window.isString = function(val) {
return typeof val === 'string';
};
window.hasEvent = function(event) {
return 'on'.concat(event) in window.document;
};
window.isOverallScroller = function(node) {
return node === document.documentElement || node === document.body || node === window;
};
window.isFormElement = function(node) {
var tagName = node.tagName;
return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
};
window.pageLoad = (function () {
var loaded = false, cbs = [];
window.addEventListener('load', function () {
var i;
loaded = true;
if (cbs.length > 0) {
for (i = 0; i < cbs.length; i++) {
cbs[i]();
}
}
});
return {
then: function(cb) {
cb && (loaded ? cb() : (cbs.push(cb)));
}
};
})();
})();
(function() {
window.throttle = function(func, wait) {
var args, result, thisArg, timeoutId, lastCalled = 0;
function trailingCall() {
lastCalled = new Date;
timeoutId = null;
result = func.apply(thisArg, args);
}
return function() {
var now = new Date,
remaining = wait - (now - lastCalled);
args = arguments;
thisArg = this;
if (remaining <= 0) {
clearTimeout(timeoutId);
timeoutId = null;
lastCalled = now;
result = func.apply(thisArg, args);
} else if (!timeoutId) {
timeoutId = setTimeout(trailingCall, remaining);
}
return result;
};
};
})();
(function() {
var Set = (function() {
var add = function(item) {
var i, data = this._data;
for (i = 0; i < data.length; i++) {
if (data[i] === item) {
return;
}
}
this.size ++;
data.push(item);
return data;
};
var Set = function(data) {
this.size = 0;
this._data = [];
var i;
if (data.length > 0) {
for (i = 0; i < data.length; i++) {
add.call(this, data[i]);
}
}
};
Set.prototype.add = add;
Set.prototype.get = function(index) { return this._data[index]; };
Set.prototype.has = function(item) {
var i, data = this._data;
for (i = 0; i < data.length; i++) {
if (this.get(i) === item) {
return true;
}
}
return false;
};
Set.prototype.is = function(map) {
if (map._data.length !== this._data.length) { return false; }
var i, j, flag, tData = this._data, mData = map._data;
for (i = 0; i < tData.length; i++) {
for (flag = false, j = 0; j < mData.length; j++) {
if (tData[i] === mData[j]) {
flag = true;
break;
}
}
if (!flag) { return false; }
}
return true;
};
Set.prototype.values = function() {
return this._data;
};
return Set;
})();
window.Lazyload = (function(doc) {
var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
var createNode = function(name, attrs) {
var node = doc.createElement(name), attr;
for (attr in attrs) {
if (attrs.hasOwnProperty(attr)) {
node.setAttribute(attr, attrs[attr]);
}
}
return node;
};
var end = function(type, url) {
var s, q, qi, cbs, i, j, cur, val, flag;
if (type === 'js' || type ==='css') {
s = sources[type], q = queue[type];
s[url] = true;
for (i = 0; i < q.length; i++) {
cur = q[i];
if (cur.urls.has(url)) {
qi = cur, val = qi.urls.values();
qi && (cbs = qi.callbacks);
for (flag = true, j = 0; j < val.length; j++) {
cur = val[j];
if (!s[cur]) {
flag = false;
}
}
if (flag && cbs && cbs.length > 0) {
for (j = 0; j < cbs.length; j++) {
cbs[j].call(context);
}
qi.load = true;
}
}
}
}
};
var load = function(type, urls, callback) {
var s, q, qi, node, i, cur,
_urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
if (type === 'js' || type ==='css') {
s = sources[type], q = queue[type];
for (i = 0; i < q.length; i++) {
cur = q[i];
if (_urls.is(cur.urls)) {
qi = cur;
break;
}
}
val = _urls.values();
if (qi) {
callback && (qi.load || qi.callbacks.push(callback));
callback && (qi.load && callback());
} else {
q.push({
urls: _urls,
callbacks: callback ? [callback] : [],
load: false
});
for (i = 0; i < val.length; i++) {
node = null, url = val[i];
if (s[url] === undefined) {
(type === 'js' ) && (node = createNode('script', { src: url }));
(type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
if (node) {
node.onload = (function(type, url) {
return function() {
end(type, url);
};
})(type, url);
(doc.head || doc.body).appendChild(node);
s[url] = false;
}
}
}
}
}
};
return {
js: function(url, callback) {
load('js', url, callback);
},
css: function(url, callback) {
load('css', url, callback);
}
};
})(this.document);
})();
</script><script>
(function() {
var TEXT_VARIABLES = {
version: '2.2.6',
sources: {
font_awesome: 'https://use.fontawesome.com/releases/v5.0.13/css/all.css',
jquery: '/assets/js/jquery.min.js',
leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
gitalk: {
js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
},
valine: 'https://unpkg.com/valine/dist/Valine.min.js'
},
site: {
toc: {
selectors: 'h1,h2,h3'
}
},
paths: {
search_js: '/assets/search.js'
}
};
window.TEXT_VARIABLES = TEXT_VARIABLES;
})();
</script>
</head>
<body>
<div class="root" data-is-touch="false">
<div class="layout--page js-page-root"><!----><div class="page__main js-page-main page__viewport hide-footer has-aside has-aside cell cell--auto">
<div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
<div class="header__title">
<div class="header__brand"><svg id="svg" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="478.9473684210526" viewBox="0, 0, 400,478.9473684210526"><g id="svgg"><path id="path0" d="M308.400 56.805 C 306.970 56.966,303.280 57.385,300.200 57.738 C 290.906 58.803,278.299 59.676,269.200 59.887 L 260.600 60.085 259.400 61.171 C 258.010 62.428,256.198 63.600,255.645 63.600 C 255.070 63.600,252.887 65.897,252.598 66.806 C 252.460 67.243,252.206 67.600,252.034 67.600 C 251.397 67.600,247.206 71.509,247.202 72.107 C 247.201 72.275,246.390 73.190,245.400 74.138 C 243.961 75.517,243.598 76.137,243.592 77.231 C 243.579 79.293,241.785 83.966,240.470 85.364 C 239.176 86.740,238.522 88.365,237.991 91.521 C 237.631 93.665,236.114 97.200,235.554 97.200 C 234.938 97.200,232.737 102.354,232.450 104.472 C 232.158 106.625,230.879 109.226,229.535 110.400 C 228.933 110.926,228.171 113.162,226.434 119.500 C 226.178 120.435,225.795 121.200,225.584 121.200 C 225.373 121.200,225.200 121.476,225.200 121.813 C 225.200 122.149,224.885 122.541,224.500 122.683 C 223.606 123.013,223.214 123.593,223.204 124.600 C 223.183 126.555,220.763 132.911,219.410 134.562 C 218.443 135.742,217.876 136.956,217.599 138.440 C 217.041 141.424,215.177 146.434,214.532 146.681 C 214.240 146.794,214.000 147.055,214.000 147.261 C 214.000 147.467,213.550 148.086,213.000 148.636 C 212.450 149.186,212.000 149.893,212.000 150.208 C 212.000 151.386,208.441 154.450,207.597 153.998 C 206.319 153.315,204.913 150.379,204.633 147.811 C 204.365 145.357,202.848 142.147,201.759 141.729 C 200.967 141.425,199.200 137.451,199.200 135.974 C 199.200 134.629,198.435 133.224,196.660 131.311 C 195.363 129.913,194.572 128.123,193.870 125.000 C 193.623 123.900,193.236 122.793,193.010 122.540 C 190.863 120.133,190.147 118.880,188.978 115.481 C 188.100 112.928,187.151 111.003,186.254 109.955 C 185.358 108.908,184.518 107.204,183.847 105.073 C 183.280 103.273,182.497 101.329,182.108 100.753 C 181.719 100.177,180.904 98.997,180.298 98.131 C 179.693 97.265,178.939 95.576,178.624 94.378 C 178.041 92.159,177.125 90.326,175.023 87.168 C 174.375 86.196,173.619 84.539,173.342 83.486 C 172.800 81.429,171.529 79.567,170.131 78.785 C 169.654 78.517,168.697 77.511,168.006 76.549 C 167.316 75.587,166.594 74.800,166.402 74.800 C 166.210 74.800,164.869 73.633,163.421 72.206 C 160.103 68.936,161.107 69.109,146.550 69.301 C 133.437 69.474,128.581 70.162,126.618 72.124 C 126.248 72.495,125.462 72.904,124.872 73.033 C 124.282 73.163,123.088 73.536,122.219 73.863 C 121.349 74.191,119.028 74.638,117.061 74.858 C 113.514 75.254,109.970 76.350,108.782 77.419 C 107.652 78.436,100.146 80.400,97.388 80.400 C 95.775 80.400,93.167 81.360,91.200 82.679 C 90.430 83.195,89.113 83.804,88.274 84.031 C 85.875 84.681,78.799 90.910,74.400 96.243 L 73.400 97.456 73.455 106.028 C 73.526 117.055,74.527 121.238,77.820 124.263 C 78.919 125.273,80.400 127.902,80.400 128.842 C 80.400 129.202,81.075 130.256,81.900 131.186 C 83.563 133.059,85.497 136.346,86.039 138.216 C 86.233 138.886,87.203 140.207,88.196 141.153 C 89.188 142.098,90.000 143.104,90.000 143.388 C 90.000 144.337,92.129 148.594,92.869 149.123 C 93.271 149.410,93.600 149.831,93.600 150.059 C 93.600 150.286,93.932 150.771,94.337 151.136 C 94.743 151.501,95.598 153.004,96.237 154.475 C 96.877 155.947,97.760 157.351,98.200 157.596 C 98.640 157.841,99.900 159.943,101.000 162.267 C 102.207 164.817,103.327 166.644,103.825 166.876 C 104.278 167.087,105.065 168.101,105.573 169.130 C 107.658 173.348,108.097 174.093,110.006 176.647 C 111.103 178.114,112.000 179.725,112.000 180.227 C 112.000 181.048,113.425 183.163,114.678 184.200 C 115.295 184.711,117.396 188.733,117.720 190.022 C 117.855 190.562,118.603 191.633,119.381 192.402 C 120.160 193.171,121.496 195.258,122.351 197.039 C 123.206 198.820,124.167 200.378,124.487 200.501 C 124.807 200.624,125.953 202.496,127.034 204.662 C 128.114 206.828,129.676 209.299,130.505 210.153 C 131.333 211.007,132.124 212.177,132.262 212.753 C 132.618 214.239,134.291 217.048,136.288 219.5
" href="/">YannStatic</a></div><!--<button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button>--><!-- <li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li> -->
<!-- Champ de recherche -->
<div id="searchbox" class="search search--dark" style="visibility: visible">
<div class="main">
<div class="search__header"></div>
<div class="search-bar">
<div class="search-box js-search-box">
<div class="search-box__icon-search"><i class="fas fa-search"></i></div>
<input id="search-input" type="text" />
<!-- <div class="search-box__icon-clear js-icon-clear">
<a><i class="fas fa-times"></i></a>
</div> -->
</div>
</div>
</div>
</div>
<!-- Script pointing to search-script.js -->
<script>/*!
* Simple-Jekyll-Search
* Copyright 2015-2020, Christian Fei
* Licensed under the MIT License.
*/
(function(){
'use strict'
var _$Templater_7 = {
compile: compile,
setOptions: setOptions
}
const options = {}
options.pattern = /\{(.*?)\}/g
options.template = ''
options.middleware = function () {}
function setOptions (_options) {
options.pattern = _options.pattern || options.pattern
options.template = _options.template || options.template
if (typeof _options.middleware === 'function') {
options.middleware = _options.middleware
}
}
function compile (data) {
return options.template.replace(options.pattern, function (match, prop) {
const value = options.middleware(prop, data[prop], options.template)
if (typeof value !== 'undefined') {
return value
}
return data[prop] || match
})
}
'use strict';
function fuzzysearch (needle, haystack) {
var tlen = haystack.length;
var qlen = needle.length;
if (qlen > tlen) {
return false;
}
if (qlen === tlen) {
return needle === haystack;
}
outer: for (var i = 0, j = 0; i < qlen; i++) {
var nch = needle.charCodeAt(i);
while (j < tlen) {
if (haystack.charCodeAt(j++) === nch) {
continue outer;
}
}
return false;
}
return true;
}
var _$fuzzysearch_1 = fuzzysearch;
'use strict'
/* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
function FuzzySearchStrategy () {
this.matches = function (string, crit) {
return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
}
}
'use strict'
var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
function LiteralSearchStrategy () {
this.matches = function (str, crit) {
if (!str) return false
str = str.trim().toLowerCase()
crit = crit.trim().toLowerCase()
return crit.split(' ').filter(function (word) {
return str.indexOf(word) >= 0
}).length === crit.split(' ').length
}
}
'use strict'
var _$Repository_4 = {
put: put,
clear: clear,
search: search,
setOptions: __setOptions_4
}
/* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
/* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
function NoSort () {
return 0
}
const data = []
let opt = {}
opt.fuzzy = false
opt.limit = 10
opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = NoSort
opt.exclude = []
function put (data) {
if (isObject(data)) {
return addObject(data)
}
if (isArray(data)) {
return addArray(data)
}
return undefined
}
function clear () {
data.length = 0
return data
}
function isObject (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
}
function isArray (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
}
function addObject (_data) {
data.push(_data)
return data
}
function addArray (_data) {
const added = []
clear()
for (let i = 0, len = _data.length; i < len; i++) {
if (isObject(_data[i])) {
added.push(addObject(_data[i]))
}
}
return added
}
function search (crit) {
if (!crit) {
return []
}
return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
}
function __setOptions_4 (_opt) {
opt = _opt || {}
opt.fuzzy = _opt.fuzzy || false
opt.limit = _opt.limit || 10
opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = _opt.sort || NoSort
opt.exclude = _opt.exclude || []
}
function findMatches (data, crit, strategy, opt) {
const matches = []
for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
const match = findMatchesInObject(data[i], crit, strategy, opt)
if (match) {
matches.push(match)
}
}
return matches
}
function findMatchesInObject (obj, crit, strategy, opt) {
for (const key in obj) {
if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
return obj
}
}
}
function isExcluded (term, excludedTerms) {
for (let i = 0, len = excludedTerms.length; i < len; i++) {
const excludedTerm = excludedTerms[i]
if (new RegExp(excludedTerm).test(term)) {
return true
}
}
return false
}
/* globals ActiveXObject:false */
'use strict'
var _$JSONLoader_2 = {
load: load
}
function load (location, callback) {
const xhr = getXHR()
xhr.open('GET', location, true)
xhr.onreadystatechange = createStateChangeListener(xhr, callback)
xhr.send()
}
function createStateChangeListener (xhr, callback) {
return function () {
if (xhr.readyState === 4 && xhr.status === 200) {
try {
callback(null, JSON.parse(xhr.responseText))
} catch (err) {
callback(err, null)
}
}
}
}
function getXHR () {
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
}
'use strict'
var _$OptionsValidator_3 = function OptionsValidator (params) {
if (!validateParams(params)) {
throw new Error('-- OptionsValidator: required options missing')
}
if (!(this instanceof OptionsValidator)) {
return new OptionsValidator(params)
}
const requiredOptions = params.required
this.getRequiredOptions = function () {
return requiredOptions
}
this.validate = function (parameters) {
const errors = []
requiredOptions.forEach(function (requiredOptionName) {
if (typeof parameters[requiredOptionName] === 'undefined') {
errors.push(requiredOptionName)
}
})
return errors
}
function validateParams (params) {
if (!params) {
return false
}
return typeof params.required !== 'undefined' && params.required instanceof Array
}
}
'use strict'
var _$utils_9 = {
merge: merge,
isJSON: isJSON
}
function merge (defaultParams, mergeParams) {
const mergedOptions = {}
for (const option in defaultParams) {
mergedOptions[option] = defaultParams[option]
if (typeof mergeParams[option] !== 'undefined') {
mergedOptions[option] = mergeParams[option]
}
}
return mergedOptions
}
function isJSON (json) {
try {
if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
return true
}
return false
} catch (err) {
return false
}
}
var _$src_8 = {};
(function (window) {
'use strict'
let options = {
searchInput: null,
resultsContainer: null,
json: [],
success: Function.prototype,
searchResultTemplate: '<li><a href="{url}" title="{desc}">{title}</a></li>',
templateMiddleware: Function.prototype,
sortMiddleware: function () {
return 0
},
noResultsText: 'No results found',
limit: 10,
fuzzy: false,
debounceTime: null,
exclude: []
}
let debounceTimerHandle
const debounce = function (func, delayMillis) {
if (delayMillis) {
clearTimeout(debounceTimerHandle)
debounceTimerHandle = setTimeout(func, delayMillis)
} else {
func.call()
}
}
const requiredOptions = ['searchInput', 'resultsContainer', 'json']
/* removed: const _$Templater_7 = require('./Templater') */;
/* removed: const _$Repository_4 = require('./Repository') */;
/* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
const optionsValidator = _$OptionsValidator_3({
required: requiredOptions
})
/* removed: const _$utils_9 = require('./utils') */;
window.SimpleJekyllSearch = function (_options) {
const errors = optionsValidator.validate(_options)
if (errors.length > 0) {
throwError('You must specify the following required options: ' + requiredOptions)
}
options = _$utils_9.merge(options, _options)
_$Templater_7.setOptions({
template: options.searchResultTemplate,
middleware: options.templateMiddleware
})
_$Repository_4.setOptions({
fuzzy: options.fuzzy,
limit: options.limit,
sort: options.sortMiddleware,
exclude: options.exclude
})
if (_$utils_9.isJSON(options.json)) {
initWithJSON(options.json)
} else {
initWithURL(options.json)
}
const rv = {
search: search
}
typeof options.success === 'function' && options.success.call(rv)
return rv
}
function initWithJSON (json) {
_$Repository_4.put(json)
registerInput()
}
function initWithURL (url) {
_$JSONLoader_2.load(url, function (err, json) {
if (err) {
throwError('failed to get JSON (' + url + ')')
}
initWithJSON(json)
})
}
function emptyResultsContainer () {
options.resultsContainer.innerHTML = ''
}
function appendToResultsContainer (text) {
options.resultsContainer.innerHTML += text
}
function registerInput () {
options.searchInput.addEventListener('input', function (e) {
if (isWhitelistedKey(e.which)) {
emptyResultsContainer()
debounce(function () { search(e.target.value) }, options.debounceTime)
}
})
}
function search (query) {
if (isValidQuery(query)) {
emptyResultsContainer()
render(_$Repository_4.search(query), query)
}
}
function render (results, query) {
const len = results.length
if (len === 0) {
return appendToResultsContainer(options.noResultsText)
}
for (let i = 0; i < len; i++) {
results[i].query = query
appendToResultsContainer(_$Templater_7.compile(results[i]))
}
}
function isValidQuery (query) {
return query && query.length > 0
}
function isWhitelistedKey (key) {
return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
}
function throwError (message) {
throw new Error('SimpleJekyllSearch --- ' + message)
}
})(window)
}());
</script>
<!-- Configuration -->
<script>
SimpleJekyllSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('results-container'),
json: '/search.json',
//searchResultTemplate: '<li><a href="https://static.rnmkcy.eu{url}">{date}&nbsp;{title}</a></li>'
searchResultTemplate: '<li><a href="{url}">{date}&nbsp;{title}</a></li>'
})
</script>
<!-- Fin déclaration champ de recherche --></div><nav class="navigation">
<ul><li class="navigation__item"><a href="/archive.html">Etiquettes</a></li><li class="navigation__item"><a href="/htmldoc.html">Documents</a></li><li class="navigation__item"><a href="/liens_ttrss.html">Liens</a></li><li class="navigation__item"><a href="/aide-jekyll-text-theme.html">Aide</a></li></ul>
</nav></div>
</header>
</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
<div class="col-main cell cell--auto"><!-- start custom main top snippet --><div id="results-container" class="search-result js-search-result"></div><!-- end custom main top snippet -->
<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1 style="color:Tomato;">Mullvad linux Desktop et Android</h1></header></div><meta itemprop="headline" content="Mullvad linux Desktop et Android"><div class="article__info clearfix"><ul class="left-col menu"><li>
2024-11-08 14:10:33 +01:00
<a class="button button--secondary button--pill button--sm" style="color:#00FFFF" href="/archive.html?tag=vpn">vpn</a>
2024-10-31 20:18:37 +01:00
</li></ul><ul class="right-col menu"><li>
<i class="far fa-calendar-alt"></i>&nbsp;<span title="Création" style="color:#FF00FF">&nbsp;4&nbsp;oct.&nbsp;&nbsp;2020</span>
<span title="Modification" style="color:#00FF7F">&nbsp;8&nbsp;mai&nbsp;&nbsp;&nbsp;2021</span></li></ul></div><meta itemprop="datePublished" content="2021-05-08T00:00:00+02:00">
<meta itemprop="keywords" content="vpn"><div class="js-article-content">
<div class="layout--article"><!-- start custom article top snippet -->
<style>
#myBtn {
display: none;
position: fixed;
bottom: 10px;
right: 10px;
z-index: 99;
font-size: 12px;
font-weight: bold;
border: none;
outline: none;
background-color: white;
color: black;
cursor: pointer;
padding: 5px;
border-radius: 4px;
}
#myBtn:hover {
background-color: #555;
}
</style>
<button onclick="topFunction()" id="myBtn" title="Haut de page">&#8679;</button>
<script>
//Get the button
var mybutton = document.getElementById("myBtn");
// When the user scrolls down 20px from the top of the document, show the button
window.onscroll = function() {scrollFunction()};
function scrollFunction() {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
// When the user clicks on the button, scroll to the top of the document
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
<!-- end custom article top snippet -->
<div class="article__content" itemprop="articleBody"><details>
<summary><b>Afficher/cacher Sommaire</b></summary>
<!-- affichage sommaire -->
<div class="toc-aside js-toc-root"></div>
</details><p><strong>Évitez les hackers et les traqueurs</strong><br />
Lors de vos connexions à Internet via Mullvad, nous chiffrons tout le trafic entrant et sortant de votre ordinateur selon les standards les plus élevés, et ce même si vous utilisez le réseau WiFi public dun café ou dun hôtel.</p>
<p><strong>Conservez votre anonymat</strong><br />
Nous ne conservons pas dhistorique des connexions, nous ne demandons pas dinformations personnelles à nos utilisateurs et nous vous encourageons à payer de manière anonyme, en espèces ou avec lune des crypto-monnaies acceptées. Votre adresse IP est remplacée par une adresse que nous vous fournissons, ce qui signifie que lactivité et la localisation de votre appareil ne sont pas associées à votre identité.</p>
<p><strong>Facilité dutilisation</strong><br />
Lutilisation de Mullvad est simple et directe il vous suffit de télécharger et dinstaller lapplication. Nous avons voulu faire de Mullvad un outil convivial : ne perdez pas de temps à gérer des configurations dinstallation ou à suivre une procédure dinscription en plusieurs étapes.</p>
<h2 id="liens">Liens</h2>
<ul>
<li><a href="https://mullvad.net/fr/help/guides/">Guides</a></li>
<li><a href="https://mullvad.net/en/">Mullvad</a> est un service VPN basé en Suède qui utilise <a href="https://wiki.archlinux.org/index.php/OpenVPN">OpenVPN</a> et <a href="https://wiki.archlinux.org/index.php/WireGuard">WireGuard</a>, TUTO <a href="/files/VPN-Wireguard.pdf">Serveur VPN wireguard</a><img src="/images/pdf.png" alt="(PDF)" /></li>
<li><a href="https://mullvad.net/fr/download/">Les applications Mullvad téléchargeables desktop et android</a></li>
</ul>
<h2 id="mullvad---android">Mullvad - Android</h2>
<p><a href="https://mullvad.net/fr/download/#android">Lien de téléchargement client android .apk</a></p>
<blockquote>
<p>Veuillez noter que la première fois que vous utilisez lapplication Mullvad VPN ou que vous remplacez la clé WireGuard, il vous faudra jusquà deux minutes pour vous connecter à un serveur.<br />
Nous sommes conscients que la connexion peut échouer / échouer si vous changez de serveur plusieurs fois.<br />
Lapplication ne fonctionnera pas non plus correctement si vous avez un autre tunnel VPN actif en même temps ou tout autre élément utilisant lAPI VPN.</p>
</blockquote>
<h3 id="exigences-dinstallation">Exigences dinstallation</h3>
<p>Vous avez besoin dAndroid 6 ou version ultérieure et dun compte Mullvad (le compte peut être créé sur https://mullvad.net)</p>
<p>Téléchargez et installez lapplication</p>
<ol>
<li><a href="https://mullvad.net/download/">Téléchargez</a> la dernière version de lapplication sur notre site Web.</li>
<li>Ouvrez le fichier .apk téléchargé et suivez les instructions pour installer lapplication.</li>
<li>Si vous recevez un avertissement semblable à celui ci-dessous, tapez sur <strong>Settings</strong> (<em>Paramètres</em>)<br />
<img src="/images/mullvad-vpn-android-phone-install-settings.jpg" alt="Texte alternatif" width="200" /></li>
<li>Activez <strong>Allow from this source</strong> (<em>Autoriser à partir de cette source</em>) , puis appuyez sur le bouton Précédent pour reprendre linstallation.<br />
<img src="/images/mullvad-vpn-android-allow-source.jpg" alt="Texte alternatif" width="200" /></li>
<li>Une fois linstallation terminée, vous pouvez lancer lapplication directement.</li>
</ol>
<h3 id="utiliser-lapplication">Utiliser lapplication</h3>
<p>La version Android de lapplication dispose actuellement dun ensemble limité de fonctionnalités et de paramètres par rapport à la version de bureau. Veuillez suivre ces instructions simplifiées jusquà ce que nous ayons un guide utilisateur dédié. ( <a href="http://mullvad.net/guides/using-mullvad-vpn-app/">guide de bureau (en)</a> . Voir également <strong>Utiliser lapplication Mullvad VPN</strong></p>
<ol>
<li>Ouvrez lapplication “Mullvad VPN”</li>
<li>Entrez votre compte Mullvad et connectez-vous</li>
<li>Notez que cela peut prendre jusquà deux minutes pour que vos clés WireGuard soient envoyées à tous nos serveurs avant de pouvoir vous connecter - ceci se produit lors de votre première connexion ou si vous changez de clé.</li>
<li>Appuyez sur “Sécuriser ma connexion”.</li>
<li>La première fois, il y aura une fenêtre pop-up “Demande de connexion - Mullvad VPN veut configurer un VPN …” - Tapez sur OK.</li>
</ol>
<h3 id="désinstaller-lapplication">Désinstaller lapplication</h3>
<ol>
<li>Ouvrez les <strong>Paramètres</strong> de votre appareil.</li>
<li>Faites défiler jusquà <strong>Applications</strong> et ouvrez-le.</li>
<li>Recherchez <strong>Mullvad VPN</strong> et appuyez sur pour louvrir.</li>
<li>Appuyez sur <strong>Désinstaller</strong> .</li>
</ol>
<h2 id="mullvad---archlinux">Mullvad - Archlinux</h2>
<h3 id="mullvad-vpn">mullvad-vpn</h3>
<p>Le nouveau <a href="https://mullvad.net/download/">client dinterface graphique officiel</a> est disponible sous le nom de <a href="https://aur.archlinux.org/packages/mullvad-vpn/">mullvad-vpn AUR</a>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S mullvad-vpn
</code></pre></div></div>
<p>En cas derreur importation clé</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>==&gt; PGP keys need importing:
-&gt; A1198702FC3E0A09A9AE5B75D5A1D4F266DE8DDF, required by: mullvad-vpn
==&gt; Import? [Y/n]
:: Importing keys with gpg......
gpg: échec de réception depuis le serveur de clefs : Server indicated a failure
==&gt; Error: Problem importing keys
</code></pre></div></div>
<p>Importer la clé</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gpg --keyserver pool.sks-keyservers.net --recv-keys 66DE8DDF
</code></pre></div></div>
<p>Après linstallation, vous devez activer et démarrer le service systemd</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable mullvad-daemon.service
sudo systemctl start mullvad-daemon.service
</code></pre></div></div>
<p>Vous pouvez également utiliser lancien client ou <a href="https://wiki.archlinux.org/index.php/OpenVPN">OpenVPN</a> avec un fichier de configuration pour Mullvad, comme expliqué dans la section <strong>Configuration manuelle</strong></p>
<h3 id="configuration-manuelle">Configuration manuelle</h3>
<p>Assurez-vous dabord que les packages <a href="https://www.archlinux.org/packages/?name=openvpn">openvpn</a> et <a href="https://www.archlinux.org/packages/?name=openresolv">openresolv</a> sont installés, puis téléchargez le package de fichier de configuration OpenVPN de Mullvad depuis <a href="https://www.mullvad.net/download/config/">leur site Web</a> (NECESSITE UN COMPTE MULLVAD)</p>
<p><img src="/images/mullvad-arch01.png" alt="Texte alternatif" width="400" /></p>
<p>et décompressez le fichier téléchargé dans <strong>/etc/openvpn/client/</strong></p>
<p>Renommez <strong>mullvad_linux.conf</strong> pour un nom plus court à utiliser avec le service systemd ultérieurement:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mv /etc/openvpn/client/mullvad_linux.conf /etc/openvpn/client/mullvad.conf
</code></pre></div></div>
<p>Afin dutiliser les serveurs de noms fournis par Mullvad, le script <em>update-resolv-conf</em> est appelé au démarrage et à larrêt de la connexion avec OpenVPN afin de modifier resolv.conf afin dinclure les adresses IP correctes.<br />
Ce script est également inclus dans le fichier zip de configuration Mullvad, mais doit être déplacé vers <strong>/etc/openvpn/</strong> pour correspondre au chemin spécifié dans le fichier de configuration Mullvad:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mv /etc/openvpn/client/update-resolv-conf /etc/openvpn/
</code></pre></div></div>
<p>Le script peut être maintenu à jour avec le script <a href="https://github.com/masterkorp/openvpn-update-resolv-conf">openvpn-update-resolv-conf</a> , qui contient également un correctif pour les fuites DNS.</p>
<p>Après la configuration, la connexion VPN peut être gérée avec <code class="language-plaintext highlighter-rouge">openvpn-client@mullvad.service</code><br />
Si le service ne parvient pas à démarrer avec une erreur telle que <strong>Cannot open TUN/TAP dev /dev/net/tun: No such device (errno=19)</strong> , vous devrez peut-être redémarrer le système pour permettre à OpenVPN de créer le périphérique réseau approprié pour la tâche. .</p>
<h3 id="fuites-dns">Fuites DNS</h3>
<p>Par défaut, les configurations openvpn de Mullvad autorisent les fuites DNS et, dans les cas dutilisation VPN habituels, il sagit dun défaut de confidentialité défavorable.<br />
Le nouveau client dinterface graphique de Mullvad arrête automatiquement les fuites DNS en supprimant chaque adresse IP du serveur DNS de la configuration système et en les remplaçant par une adresse IP pointant vers le serveur DNS non connecté de Mullvad, valable lors de la connexion VPN. Ce correctif peut également être appliqué avec la méthode simple OpenVPN en configurant resolv.conf pour utiliser uniquement ladresse IP du serveur DNS Mullvad spécifiée sur <a href="https://www.mullvad.net/guides/dns-leaks/">leur site Web</a></p>
<p>La version du script de mise à jour <strong>resolv.conf</strong> dans <a href="https://github.com/masterkorp/openvpn-update-resolv-conf">openvpn-update-resolv-conf</a> implémente un correctif différent pour les fuites en utilisant le commutateur dinterface exclusif <code class="language-plaintext highlighter-rouge">-x</code> lors de lexécution de la commande <code class="language-plaintext highlighter-rouge">resolvconf</code> , mais cela pourrait entraîner une autre forme de fuite DNS résolution de ladresse réseau via le serveur DNS fourni par Mullvad, comme indiqué dans la <a href="https://github.com/masterkorp/openvpn-update-resolv-conf/issues/18">page de problème GitHub du script</a></p>
<h3 id="voir-également">Voir également</h3>
<ul>
<li><a href="https://github.com/mullvad/mullvadvpn-app">Code source du client Mullvad</a></li>
<li><a href="https://mullvad.net/en/faq/">Mullvad FAQ</a></li>
</ul>
<h2 id="utiliser-lapplication-mullvad-vpn">Utiliser lapplication Mullvad VPN</h2>
<h3 id="sidentifier">Sidentifier</h3>
<p>Entrez votre numéro de compte Mullvad et appuyez sur Entrée ou cliquez sur le bouton de connexion vert.</p>
<p><img src="/images/mvd01.png" alt="" height="300" /><br />
Écran de connexion pour lapplication Mullvad VPN</p>
<p>Si vous navez pas encore de numéro de compte, cliquez simplement sur le bouton <strong>Créer un compte</strong> pour accéder à la page de création de compte de notre site Web.<br />
<strong>Lapplication mémorise votre numéro de compte</strong></p>
<p>Nous vous encourageons vivement à noter votre numéro de compte pour votre sécurité. Toutefois, lapplication enregistrera localement les trois derniers numéros de compte que vous avez utilisés, ce qui facilite la connexion sans avoir à mémoriser le numéro à chaque fois.</p>
<p>Chaque fois que vous êtes déconnecté, cliquez simplement dans le champ de connexion et une liste déroulante apparaîtra.</p>
<p>Si vous souhaitez un jour supprimer un numéro de compte de cette liste, il vous suffit de cliquer sur licône en forme de X située à droite du numéro.</p>
<h3 id="connexion">Connexion</h3>
<p>Une fois que vous vous êtes connecté avec un numéro de compte valide, lapplication tentera automatiquement détablir une connexion sécurisée et <u>bloquera simultanément votre connexion Internet</u>.</p>
<p><img src="/images/mvd03.png" alt="" height="300" /></p>
<p>Par défaut, lapplication se connectera initialement à un serveur en Suède pour augmenter les chances dune connexion rapide et stable. Si vous choisissez un autre emplacement, lapplication mémorisera votre dernière sélection pour la prochaine utilisation de lapplication.</p>
<h4 id="savoir-quand-vous-êtes-connecté">Savoir quand vous êtes connecté</h4>
<p>Une fois connectée, lapplication Mullvad le signalera de plusieurs manières:</p>
<ul>
<li>Le cadenas dans la barre détat système/menu deviendra vert.</li>
<li>“Connexion sécurisée” sera affiché sur lécran de connexion.</li>
<li>Un point GPS vert indiquera sur la carte où vous êtes connecté.</li>
</ul>
<p><img src="/images/mvd02.png" alt="" height="300" /></p>
<h4 id="détails-de-la-connexion">Détails de la connexion</h4>
<p>Lorsque vous êtes connecté, vous pouvez cliquer sur le nom du serveur (par exemple, se-got-008) dans lécran de connexion pour afficher les détails de la connexion, y compris les protocoles et les adresses IP utilisés.<br />
<img src="/images/mvd04.png" alt="" height="300" /></p>
<h4 id="votre-navigateur-présente-t-il-des-fuites">Votre navigateur présente-t-il des fuites?</h4>
<p>Utilisez notre outil <a href="https://am.i.mullvad.net/">Am I Mullvad</a> pour vérifier létat de votre connexion et pour voir si votre navigateur contient des informations qui mettent en péril votre vie privée. Cela peut se produire même lorsque vous êtes connecté à Mullvad.</p>
<h3 id="changer-de-lieu">Changer de lieu</h3>
<p>Pour choisir un autre serveur, cliquez sur le bouton <strong>Changer de localisation</strong></p>
<p>Sur lécran Sélectionner un emplacement , faites défiler et cliquez sur le pays que vous préférez et lapplication se reconnectera automatiquement.</p>
<p><img src="/images/mvd05.png" alt="" height="300" /></p>
<p>Certains pays ont une icône déroulante à droite. En cliquant dessus, vous obtiendrez une liste de villes ou de régions que vous pouvez choisir et auxquelles vous pouvez vous connecter.</p>
<p><img src="/images/mvd06.png" alt="" height="300" /></p>
<p>Si la ville ou la région possède également une icône déroulante, un clic sur celle-ci vous donnera une liste de serveurs spécifiques.</p>
<p><img src="/images/mvd07.png" alt="" height="300" /></p>
<p>Parfois, vous ne pourrez pas sélectionner un emplacement car ses serveurs sont actuellement indisponibles. Un tel endroit aura un point rouge à côté et le nom sera grisé.</p>
<p><img src="/images/mvd08.png" alt="" height="300" /></p>
<p>Vous pouvez toujours consulter la <a href="https://mullvad.net/servers/">liste des serveurs</a> de notre site Web pour en savoir plus sur la situation.</p>
<h3 id="déconnexion">Déconnexion</h3>
<p>Si vous souhaitez vous déconnecter, cliquez simplement sur le bouton <strong>Déconnxion</strong> de lécran de connexion.</p>
<p>Savoir quand vous êtes déconnecté</p>
<p>Lorsque vous êtes déconnecté, lapplication Mullvad le signalera de plusieurs manières:</p>
<ul>
<li>La barre du haut de lapplication sera rouge.</li>
<li>“Connexion non sécurisée” sera affiché en rouge sur lécran de connexion.</li>
<li>Le cadenas dans la barre détat système / menu sera rouge.</li>
<li>Le véritable emplacement de votre connexion Internet sera répertorié.</li>
<li>Un point GPS rouge marquera votre emplacement Internet réel sur la carte.</li>
</ul>
<p><img src="/images/mvd09.png" alt="" height="300" /></p>
<h3 id="mettre-à-jour-votre-application">Mettre à jour votre application</h3>
<p>Si vous utilisez une version obsolète de lapplication, vous verrez un message davertissement sur lécran de connexion. En cliquant sur le message, vous accéderez à notre page Web de téléchargement. Nous vous recommandons vivement de toujours garder votre application à jour.</p>
<p><img src="/images/mvd10.png" alt="" height="100" /> <br />
Lapplication Mullvad VPN affichant un message indiquant que lutilisateur exécute une version non prise en charge.</p>
<h3 id="internet-bloqué-temporairement---kill-switch-on">Internet bloqué temporairement - kill switch on</h3>
<p>Parfois, lorsque lapplication Mullvad est connectée, vous pouvez remarquer que votre connexion Internet a soudainement cessé de fonctionner. Vérifiez si le <u>cadenas dans la barre d'état système/ barre de menus est devenu vert avec un point rouge</u>. <br />
Si tel est le cas, lécran de connexion de lapplication affichera également “blocage dInternet”.</p>
<p>Il sagit de linterrupteur de neutralisation intégré de lapplication au travail, bloquant automatiquement Internet en cas déchec de la connexion VPN afin déviter toute fuite accidentelle de trafic en dehors de notre tunnel sécurisé.</p>
<p>Échec de la connexion VPN afin déviter toute fuite accidentelle de votre trafic en dehors de notre tunnel sécurisé.
<img src="/images/mvd11.png" alt="" height="300" /> <br />
Mullvad VPN app soulignant les éléments visuels qui montrent que lapplication bloque Internet tout en essayant de se connecter.</p>
<p>Vous en ferez lexpérience dans les situations suivantes</p>
<ul>
<li>si lapplication se déconnecte accidentellement delle-même, de problèmes de connectivité ou similaires</li>
<li>si vous manquez de temps sur votre compte lorsque vous êtes connecté</li>
<li>pendant que lapplication établit une connexion lorsque vous démarrez lapplication.</li>
</ul>
<blockquote>
<p><strong>Lapplication continuera à bloquer votre trafic Internet jusquà ce quune connexion sécurisée soit établie ou rétablie, ou jusquà ce que vous vous déconnectiez manuellement de lapplication.</strong></p>
</blockquote>
<p>Si vous êtes inquiet à propos de ces moments où vous oubliez de démarrer lapplication (sans vous sécuriser), envisagez lune des actions suivantes:</p>
<ul>
<li>activez le paramètre “Bloquer les déconnexions” (mentionné dans la section Paramètres avancés )</li>
<li>Configurez votre navigateur avec notre <a href="https://mullvad.net/guides/socks5-proxy/">proxy SOCKS5</a> qui servira de protection de sauvegarde.</li>
</ul>
<h3 id="menu-paramètres">Menu paramètres</h3>
<p>Vous pouvez accéder au menu Paramètres en cliquant sur licône Paramètres (roue dentée) dans lécran de connexion.</p>
<p>De là, vous avez accès à une variété dinformations.<br />
<img src="/images/mvd12.png" alt="" height="300" /></p>
<h4 id="compte">Compte</h4>
<p>Vous pouvez y afficher des informations relatives à votre compte, y compris votre numéro de compte, le temps que vous avez payé, ainsi quun lien vers notre site Web pour Acheter plus de crédits . Cest aussi où vous pouvez vous déconnecter .</p>
<p>Trois jours avant lexpiration du crédit de votre compte, une notification saffiche dans lécran de connexion.</p>
<h3 id="version-de-lapplication">Version de lapplication</h3>
<p>Cela vous indique quelle version de lapplication vous utilisez actuellement. Cliquez dessus et vous serez redirigé vers notre site Web pour télécharger la dernière version (que nous recommandons toujours davoir!). Si vous ne possédez pas la dernière version, vous verrez un message davertissement ici et dans lécran de connexion.</p>
<h4 id="signaler-un-problème">Signaler un problème</h4>
<p>Si vous rencontrez des problèmes, vous pouvez facilement nous en informer à laide de notre formulaire dassistance intégrée à lapplication. Comme indiqué dans le formulaire, les fichiers journaux de votre application sont anonymisés avant de nous être envoyés en toute sécurité. Vous pouvez facilement afficher ces journaux en cliquant sur <strong>Afficher les journaux des applications</strong> .</p>
<p>Bien que facultatif, nous vous recommandons vivement de fournir une description du problème. Vous navez également pas besoin de renseigner une adresse électronique, mais si vous souhaitez une réponse de notre part, vous devrez en inclure une.</p>
<h4 id="faq-et-guides">FAQ et guides</h4>
<p>Ce lien vous mènera à la <a href="https://mullvad.net/guides/">section Aide</a> de notre site Web.</p>
<h4 id="la-langue">La langue</h4>
<p>Cette option vous permet de changer la langue daffichage de lapplication.</p>
<h4 id="quitter-lapplication">Quitter lapplication</h4>
<p>Un clic sur le bouton rouge <strong>Quitter</strong> ferme lapplication. Cela vous déconnectera de toute connexion que vous aviez avec lapplication, laissant votre trafic Internet exposé et non sécurisé, sauf si vous avez activé le paramètre Bloquer lorsque déconnecté.</p>
<h3 id="préférences">Préférences</h3>
<p><img src="/images/mvd13.png" alt="" height="300" /> <br />
Le menu Préférences de lapplication Mullvad VPN.</p>
<p><strong>Lancer lapplication au démarrage</strong><br />
Cliquez sur le bouton bascule pour activer/désactiver ce paramètre.</p>
<p><strong>Connexion automatique</strong><br />
Lorsque ce paramètre est activé, lapplication se connectera automatiquement à un serveur lors de son lancement.</p>
<p><strong>Partage de réseau local</strong><br />
Activez ce paramètre pour accéder à dautres périphériques du même réseau, tels que limpression et le partage.</p>
<p><strong>Les notifications</strong><br />
Contrôlez si vous souhaitez ou non que les notifications système soient affichées. Les notifications critiques, telles que le moment où lapplication se déconnecte temporairement, seront toujours affichées.</p>
<p>Icône de bac monochrome (macOS uniquement)<br />
Ce paramètre permet de créer une icône de la barre déchelle de gris au lieu de celle colorée par défaut.</p>
<p><strong>Démarrer réduit (Linux uniquement)</strong><br />
Activez ce paramètre si vous souhaitez uniquement afficher licône de la barre des tâches au démarrage de lapplication.</p>
<blockquote>
<p><strong>NOTE : Sur archlinux , tout est activé (vert) dans préférences</strong></p>
</blockquote>
<h3 id="réglages-avancés">Réglages avancés</h3>
<p><img src="/images/mvd14.png" alt="" height="300" /></p>
<p><strong>Activer IPv6</strong><br />
Cela active / désactive la communication IPv6 via le tunnel.</p>
<p><strong>Bloquer quand déconnecté</strong><br />
Mise en garde! Avec ce paramètre activé, votre connexion Internet ne fonctionnera que si lapplication a établi une connexion. Dans tous les autres cas, votre connexion Internet sera complètement bloquée, y compris si vous vous déconnectez ou quittez lapplication.<br />
<em>Si vous craignez de ne pas être sécurisé pendant ces moments où vous oubliez de démarrer lapplication, utilisez ce paramètre.</em></p>
<p><strong>Protocole de tunnel (Linux et macOS uniquement)</strong><br />
Choisissez le protocole VPN que vous souhaitez utiliser avec votre connexion. Le paramètre par défaut est <strong>Automatique</strong>, qui sélectionne toujours OpenVPN , mais vous pouvez également spécifier WireGuard . <br />
Protocole de transport <strong>OpenVPN</strong></p>
<blockquote>
<p>Remarque : les utilisateurs Linux et macOS ne le verront que si le paramètre de protocole Tunnel a été défini sur Automatique ou sur OpenVPN.</p>
</blockquote>
<p>Le paramètre par défaut est <strong>Automatique</strong> , mais vous pouvez également choisir <strong>TCP</strong> ou <strong>UDP</strong><br />
Les protocoles réseau utiliseront par défaut le protocole UDP, car il est généralement plus rapide que TCP. Cependant, parfois, seul le protocole TCP fonctionne sur certains réseaux restreints.</p>
<p><strong>Port WireGuard (Linux et macOS uniquement)</strong><br />
Cela nindiquera que si le paramétrage du protocole de tunnel a été défini sur WireGuard.<br />
Les options ici sont actuellement limitées mais seront étendues avec les futures mises à jour.</p>
<p><strong>Clé WireGuard (Linux et macOS uniquement)</strong> <br />
<img src="/images/mvd17.png" alt="" height="300" /> <br />
Ici, vous pouvez régénérer et vérifier votre <strong>Clé WireGuard</strong> la plus récente.</p>
<blockquote>
<p><strong>Important : Un clic sur la touche Régénérer remplacera également votre adresse IP statique interne.</strong></p>
</blockquote>
<p>Pour avoir un aperçu de toutes vos clés, cliquez sur <strong>Gérer les clés</strong> pour être redirigé vers la page de votre compte sur notre site Web.<br />
<img src="/images/mvd15.png" alt="" height="300" /></p>
<p><strong>Mode pont</strong><br />
<img src="/images/mvd16.png" alt="" height="300" /> <br />
Lactivation du mode pont route votre trafic sur deux serveurs - un serveur pont, puis un serveur VPN - au lieu dun, essentiellement un multi-saut.</p>
<p>Suivez notre guide <a href="https://mullvad.net/guides/how-use-bridge-mode/">Comment utiliser Bridge Mode</a> pour des instructions complètes.</p>
<p><strong>Mssfix</strong><br />
Définissez une valeur pour OpenVPN MSS.</p>
<h2 id="mullvad-wireguard">Mullvad wireguard</h2>
<p><em>Comment activer WireGuard dans lapplication Mullvad</em></p>
<h3 id="activation-wireguard">Activation WireGuard</h3>
<p>Suivez ces étapes simples pour vous connecter à nos serveurs WireGuard dans lapplication VPN Mullvad :</p>
<ol>
<li>Dans lapplication, naviguez vers Paramètres (icône en forme de roue dentée).</li>
<li>Cliquez sur Avancé</li>
<li>Sous le protocole Tunnel, sélectionnez WireGuard<br />
<img src="/images/mullvad-wg01.png" alt="" height="300" /></li>
</ol>
<p>Vous êtes connecté sur un serveur wireguard<br />
<img src="/images/mullvad-wg05.png" alt="" height="300" /></p>
<h3 id="gérer-les-clés">Gérer les clés</h3>
<p>Dans lapplication Mullvad, vous pouvez gérer vos clés WireGuard.</p>
<p>Naviguez dans le menu via Paramètres &gt; Avancés &gt; Clé WireGuard.<br />
<img src="/images/mullvad-wg02.png" alt="" height="300" /><br />
Vous verrez votre clé publique actuelle et sa date de création.</p>
<h3 id="régénérer-la-clé">Régénérer la clé</h3>
<p>Cliquez sur le bouton <strong>Regénérer la clé</strong> pour remplacer votre clé actuelle.</p>
<blockquote>
<p><strong>Cela remplacera également votre adresse IP statique interne.</strong></p>
</blockquote>
<h3 id="vérifier-la-clé">Vérifier la clé</h3>
<p>Cela permettra de vérifier votre clé actuelle.<br />
<img src="/images/mullvad-wg03.png" alt="" height="300" /></p>
<h3 id="gérer-les-clés-1">Gérer les clés</h3>
<p>Cette option ouvrira la page de votre compte sur notre site web afin que vous puissiez avoir un aperçu de toutes vos clés.<br />
<img src="/images/mullvad-wg04.png" alt="" width="300" /></p>
<p><em>“WireGuard” est une marque déposée de Jason A. Donenfeld.</em></p>
<h2 id="mullvad-wireguard-cli">Mullvad WireGuard CLI</h2>
<p>Ce guide de linterface en ligne de commande (CLI) explique comment se connecter aux serveurs WireGuard® de Mullvad en utilisant le terminal.</p>
<p>Si vous utilisez lapplication VPN de Mullvad, voir paragraphe précédent sur la façon dactiver WireGuard dans lapplication.</p>
<ol>
<li>Ouvrez le terminal<br />
Ouvrez une fenêtre de terminal.</li>
<li>Avez-vous une paire de clés ?<br />
Vérifiez si vous avez déjà une paire de clés.<br />
<code class="language-plaintext highlighter-rouge">mullvad tunnel wireguard key check</code></li>
<li>Pas de paire de clés ? Générez-en une.<br />
Cette commande génère une nouvelle paire de clés mais ne renvoie aucune information.<br />
<code class="language-plaintext highlighter-rouge">mullvad tunnel wireguard key generate</code></li>
<li>Nouvelle paire de clés ? Attendez.<br />
Si vous avez généré une nouvelle paire de clés, <strong>vous devrez peut-être attendre jusquà deux minutes avant quelle ne commence à fonctionner</strong>. Si lapplication Mullvad ne parvient pas à se connecter dans les étapes suivantes, vous devez quand même attendre.</li>
<li>Activer WireGuard<br />
Cette commande active WireGuard.<br />
<code class="language-plaintext highlighter-rouge">mullvad relay set tunnel wireguard any</code><br />
Une fois que vous avez exécuté cette commande, vous pouvez utiliser lapplication comme vous le feriez normalement.</li>
<li>Utiliser WireGuard dans lapplication<br />
Lancez lapplication. Dans le menu de localisation, choisissez nimporte quel pays, ville ou serveur disponible. Les lieux qui nont pas de serveur WireGuard seront grisés et ne pourront pas être sélectionnés.</li>
<li>Désactiver WireGuard<br />
Cette commande terminale vous déconnectera de WireGuard.</li>
</ol>
<p>mullvad relay set tunnel openvpn any</p>
<p>Si vous êtes connecté à lapplication lorsque vous éteignez WireGuard, notez que lapplication se reconnectera automatiquement afin de mettre en œuvre cette nouvelle configuration.
FAQ
Je reçois “BLOCKED CONNECTION” lorsque je lance lapplication.</p>
<p>Il suffit de choisir un autre emplacement. Cela signifie simplement que lorsque vous avez utilisé lapplication auparavant, avant dactiver WireGuard, vous étiez connecté à un endroit qui na pas de serveur WireGuard.</p>
<p><em>“WireGuard” est une marque déposée de Jason A. Donenfeld.</em></p>
<h2 id="questionsréponses">Questions/Réponses</h2>
<h3 id="fuites-de-dns-dns-leaks">Fuites de DNS (DNS leaks)</h3>
<p><u>Qu'est-ce qu'un serveur DNS ?</u><br />
Chaque fois que vous entrez un nom de domaine dans la barre dadresse de votre navigateur, cliquez sur un lien ou téléchargez une image ou une autre ressource à partir dun site Web, vous utilisez très probablement le système de noms de domaine (DNS).<br />
Votre navigateur utilise son serveur DNS configuré pour rechercher ladresse IP de cette ressource. Ladresse IP, à son tour, est utilisée pour télécharger les ressources que vous avez demandées.<br />
Un site Web normal est aujourdhui plein de liens vers des ressources sur le même site et dautres sites tiers. Cela signifie que votre ou vos serveurs DNS seront contactés fréquemment.</p>
<p><u>Pourquoi les serveurs DNS sont-ils importants du point de vue de la confidentialité ?</u><br />
Puisque votre navigateur contacte le serveur DNS pour chaque nouvelle requête de nom de domaine, le serveur DNS saura quelles pages vous visitez et quelles ressources vous consultez. Par conséquent, vous divulguez constamment des informations à votre fournisseur de serveur DNS sur ce que vous faites et quand.<br />
Habituellement, le serveur DNS appartient à votre fournisseur daccès Internet (FAI) ou à une grande entreprise comme Google.</p>
<blockquote>
<p>Un moyen facile de vérifier si vous êtes à labri des fuites de DNS est de vous rendre sur notre site <a href="https://am.i.mullvad.net/">Am I Mullvad</a>.</p>
</blockquote>
<p><u>Solution - Utilisez les serveurs DNS Mullvad</u><br />
En raison des problèmes de confidentialité mentionnés ci-dessus, Mullvad possède son propre serveur DNS public non connecté à ladresse IP suivante : 193.138.219.228.<br />
Nous avons également un serveur DNS sur chaque serveur VPN qui nest accessible que par le tunnel à cette adresse : 10.8.0.1 (ou toute autre adresse correspondant à 10.x.0.1).</p>
<p><u>Comment utiliser le serveur DNS de Mullvad ?</u><br />
Une fois que vous avez suivi les instructions ci-dessous pour votre système dexploitation, utilisez notre outil en ligne Am I Mullvad pour vérifier que vous êtes à labri des fuites DNS.</p>
<p><u>Utilisateurs Windows, MacOS et Linux</u><br />
Si vous utilisez notre application VPN, vous navez rien à faire car la protection contre les fuites DNS est toujours activée. Il ny a pas doption pour le désactiver.</p>
<p><u>Autres utilisateurs</u><br />
Si vous utilisez un autre client VPN ou un routeur pour accéder à Mullvad, réglez votre DNS sur 193.138.219.228 pour indiquer le serveur DNS de Mullvad. Ceci garantit que vous ne divulguez pas dinformations à un serveur DNS sur les sites que vous visitez. Cela signifie que notre serveur DNS est toujours utilisé, donc si pour une raison quelconque votre trafic se retrouve sur lInternet public, il va à notre serveur DNS non-logging.</p>
<blockquote>
<p>Il est à noter que tous nos serveurs VPN détournent les appels vers notre serveur DNS public et que les requêtes DNS sont traitées sur un serveur DNS local non connecté installé sur ce serveur VPN. Ceci est fait pour traiter les demandes plus rapidement et pour divulguer moins dinformations à Internet.</p>
</blockquote>
<h3 id="analyse-connexion---dns---webrtc---blacklisting">Analyse Connexion - DNS - WebRTC - Blacklisting</h3>
<p>Se connecter en VPN et lancer le test sur depuis le site <a href="https://am.i.mullvad.net/">Am I Mullvad</a></p>
<p><img src="/images/mullvad-dnsleaks-webrtc-1.png" alt="" width="600" /></p>
<p>Il ya risque avec le webrtc , il faut le désactiver de firefox <br />
Firefox - méthode avancée</p>
<p>Suivez ces instructions si vous souhaitez désactiver manuellement WebRTC :</p>
<ol>
<li>Tapez “about:config” dans la barre dadresse et appuyez sur Entrée.</li>
<li>Cliquez sur le bouton “Jaccepte le risque !</li>
<li>Tapez “media.peerconnection.enabled” dans la barre de recherche. Une seule entrée doit apparaître.</li>
<li>Cliquez avec le bouton droit de la souris sur lentrée et choisissez “Inverser” pour changer la colonne Valeur en “false”.</li>
</ol>
<p>Faire de nouveau le test</p>
<p><img src="/images/mullvad-dnsleaks-webrtc-2.png" alt="" width="600" /></p>
<h3 id="proxy-socks5">Proxy SOCKS5</h3>
<p><u>Pourquoi dois-je sans cesse répondre à des CAPTCHA ?</u><br />
Ce problème survient fréquemment sur les sites utilisant Cloudflare</p>
<p>Pour atténuer le problème , on va utiliser un <strong>proxy SOCKS5</strong><br />
Avec le proxy SOCKS5 sur tous les serveurs VPN de Mullvad, vous pouvez minimiser davantage lidentité de votre ordinateur. Cette fonction simple mais puissante réduit également les CAPTCHAs.</p>
<blockquote>
<p>Pour les utilisateurs avancés, le proxy est situé sur IP 10.8.0.1, port 1080, accessible uniquement via Mullvad.</p>
</blockquote>
<p><u>Pourquoi le **proxy SOCKS5** est avantageux</u><br />
Vous connaissez peut-être déjà la fonction de sécurité “kill switch” intégrée de lapplication Mullvad. En dautres termes, en cas dinterruption de la connexion Mullvad, tout votre trafic Internet est automatiquement bloqué, garantissant ainsi que votre trafic ne fuit pas accidentellement à lextérieur de notre tunnel sécurisé.</p>
<p><u>Cependant, que se passe-t-il si vous avez oublié de démarrer l'application Mullvad ?</u><br />
Cest là que lutilisation du proxy SOCKS5 savère utile, pour servir de protection de secours.</p>
<p><u>Comment fonctionne le proxy</u><br />
Si vous configurez votre navigateur, par exemple, pour utiliser le proxy SOCKS5, il dirigera tout votre accès Internet via le proxy qui nest accessible que par Mullvad. Ainsi, si vous navez pas activé lapplication, votre navigateur empêchera tout accès à Internet et ne divulguera donc aucune information.</p>
<blockquote>
<p>Le proxy fonctionne également avec les routeurs et tout autre VPN utilisé avec les serveurs Mullvad.</p>
</blockquote>
<p><u>Réduction des CAPTCHAs</u><br />
Un autre avantage est une réduction du nombre de CAPTCHAs. De nombreux sites Web et services exigent cette identification lorsquils détectent du trafic provenant dun serveur VPN. Le proxy rend cette détection plus difficile.</p>
<p><u>Démarrez avec le proxy SOCKS5</u><br />
Suivez ces étapes pour configurer Firefox et Qbittorrent pour utiliser nos proxy SOCKS5.</p>
<p><u>Utilisateurs de WireGuard</u><br />
Si vous utilisez WireGuard, vous devrez remplacer 10.8.0.1 par 10.64.0.1 dans les instructions ci-dessous.</p>
<p><u>Firefox</u></p>
<ol>
<li>Cliquez sur <em>Préférences</em> (sur certains systèmes dexploitation, cliquez sur Options).
<ul>
<li>Faites défiler vers le bas jusquà <em>Paramètres réseau</em>.</li>
<li>Cliquez sur <em>Paramètres</em>.</li>
<li>Sélectionnez <em>Configuration manuelle du proxy</em>.</li>
<li>Assurez-vous que les champs proxy HTTP SSL et FTP sont vides.</li>
<li>Dans le champ <strong>Hôte SOCKS</strong> :, entrez 10.8.0.1 avec le port 1080.</li>
<li>Cliquez sur <strong>SOCKS v5</strong> et activez <strong>Utiliser un DNS distant lorsque SOCKS v5 est actif</strong>.</li>
<li>Cliquez sur OK.</li>
</ul>
</li>
</ol>
<p>Pour désactiver cette fonction, passez à létape 5 et réglez le paramètre sur <strong>Pas de proxy</strong>.</p>
<p><img src="/images/firefox-proxy-sock.png" alt="" height="400" /></p>
<p><u>Firefox sur Android</u></p>
<ol>
<li>Entrez about:config dans la barre dadresse et cliquez sur Envoyer.
<ul>
<li>Dans le champ de recherche, entrez proxy.</li>
<li>Faites défiler vers le bas jusquà network.proxy.socks et entrez 10.8.0.1.</li>
<li>Faites défiler vers le bas jusquà network.proxy.socks_port et entrez 1080.</li>
<li>Changez la valeur pour network.proxy.socks_remote_dns en True.</li>
<li>Changez la valeur pour network.proxy.socks_version à 5.</li>
<li>Changez le type de proxy.réseau en 1.</li>
<li>Effacez le champ pour network.proxy.ftp.</li>
<li>Effacez le champ pour network.proxy.http.</li>
<li>Dégagez le champ pour network.proxy.ssl.</li>
<li>Cliquez sur le bouton Précédent pour enregistrer les modifications.</li>
</ul>
</li>
</ol>
<p>Pour désactiver, passez à létape 7 et changez le réglage à 5.</p>
<p><u>Qbittorrent</u></p>
<ol>
<li>Cliquez sur Outils, puis sur Options (Alt-O).</li>
<li>Cliquez sur Connexion.</li>
<li>Cliquez sur BitTorrent</li>
<li>Activer (Vérifier) Activer le mode anonyme</li>
<li>Désactiver (décocher) Activer DHT</li>
<li>Désactiver (décocher) Activer PeX</li>
<li>Désactiver (décocher) Activer la découverte locale par les pairs</li>
<li>Cliquez sur Connexion</li>
<li>Pour le protocole Activé : Utilisez la barre déroulante et sélectionnez TCP</li>
<li>Sous Serveur proxy, changez le type en SOCKS5.</li>
<li>Changer lhôte : vers 10.8.0.1.</li>
<li>Changez Port sur 1080.</li>
<li>Cochez la case à côté de loption Utiliser un proxy pour les connexions entre pairs.</li>
<li>Cochez la case à côté de Désactiver les connexions non prises en charge par les proxies.</li>
<li>Désactiver (décocher) Utiliser PNP / NAT - PMP</li>
<li>Cliquez sur Connexion</li>
</ol>
<p>Pour désactiver, passez à létape 8 et changez le type en (aucun).</p>
<h2 id="dns-sur-https-et-dns-sur-tls-beta">DNS sur HTTPS et DNS sur TLS (Beta)</h2>
<p>Notre service DNS public (actuellement en version bêta) offre le DNS sur HTTPS (DoH) et le DNS sur TLS (DoT), avec la minimisation des QNAME et le blocage basique des publicités. Il a été audité par les experts en sécurité dAssured. <a href="https://mullvad.net/blog/2021/3/3/mullvad-doh-and-dot-beta-release/">En savoir plus sur DoH et DoT</a>.</p>
<p><strong>Deux services différents</strong></p>
<p>1 - Version avec blocage des publicités - adblock.doh.mullvad.net<br />
2 - Sans blocage de la publicité - doh.mullvad.net
Comment utiliser notre service DNS</p>
<h3 id="firefox">Firefox</h3>
<ol>
<li>Dans une fenêtre du navigateur Firefox, cliquez sur le bouton de menu et choisissez Options ou Préférences.</li>
<li>Dans la boîte de recherche, tapez “réseau”, puis cliquez sur le bouton Paramètres dans les résultats.</li>
<li>En bas, cochez la case à côté de Activer le DNS sur HTTPS.</li>
<li>À côté de Utiliser le fournisseur, choisissez Personnalisé.</li>
<li>Dans la zone de texte qui apparaît, entrez https://doh.mullvad.net/dns-query ou https://adblock.doh.mullvad.net/dns-query. <img src="/images/firefox-doh1.png" alt="" /></li>
<li>Cliquez sur OK.</li>
<li>Dans la barre dadresse du navigateur, tapez about:config et appuyez sur Entrée.</li>
<li>Si un avertissement saffiche, cliquez sur “Accepter le risque et continuer”.</li>
<li>Dans la boîte de recherche, tapez network.trr.mode</li>
<li>Changez la valeur en 3 et appuyez sur Entrée. (cela désactivera la solution de repli non chiffrée).<br />
<img src="/images/firefox-doh2.png" alt="" /></li>
</ol>
<h3 id="android">Android</h3>
<p>Suivez les étapes pour utiliser le DNS sur TLS :</p>
<ol>
<li>Ouvrez les paramètres de votre appareil.</li>
<li>Naviguez jusquà Réseau et Internet &gt; Avancé &gt; Private DNS.</li>
<li>Sélectionnez Nom dhôte du fournisseur de DNS privé.</li>
<li>Dans la zone de texte, tapez doh.mullvad.net ou adblock.doh.mullvad.net.</li>
<li>Cliquez sur Enregistrer.</li>
</ol>
</div>
<div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2020-10-04T00:00:00+02:00"><!-- start custom article footer snippet -->
<!-- end custom article footer snippet -->
<!--
<div align="right"><a type="application/rss+xml" href="/feed.xml" title="S'abonner"><i class="fa fa-rss fa-2x"></i></a>
&emsp;</div>
-->
</footer>
<div class="article__section-navigator clearfix"><div class="previous"><span>PRÉCÉDENT</span><a href="/2020/10/04/Mullvad-VPN-(OBSOLETE).html">Mullvad VPN (OBSOLETE)</a></div><div class="next"><span>SUIVANT</span><a href="/2020/10/11/ovh-vps785909_debian_10_rnmkcy.eu.html">vps785909 debian 10 - audio - wireguard - rnmkcy.eu (INACTIF)</a></div></div></div>
</div>
<script>(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
$(function() {
var $this ,$scroll;
var $articleContent = $('.js-article-content');
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
var scroll = hasSidebar ? '.js-page-main' : 'html, body';
$scroll = $(scroll);
$articleContent.find('.highlight').each(function() {
$this = $(this);
$this.attr('data-lang', $this.find('code').attr('data-lang'));
});
$articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
$this = $(this);
$this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
});
$articleContent.on('click', '.anchor', function() {
$scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
});
});
});
})();
</script>
</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
<!-- end custom main bottom snippet -->
</div>
</div></div></div></div>
</div><script>(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
var $body = $('body'), $window = $(window);
var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
var activeCount = 0;
function modal(options) {
var $root = this, visible, onChange, hideWhenWindowScroll = false;
var scrollTop;
function setOptions(options) {
var _options = options || {};
visible = _options.initialVisible === undefined ? false : show;
onChange = _options.onChange;
hideWhenWindowScroll = _options.hideWhenWindowScroll;
}
function init() {
setState(visible);
}
function setState(isShow) {
if (isShow === visible) {
return;
}
visible = isShow;
if (visible) {
activeCount++;
scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
$root.addClass('modal--show');
$pageMain.scrollTop(scrollTop);
activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
$window.on('keyup', handleKeyup);
} else {
activeCount > 0 && activeCount--;
$root.removeClass('modal--show');
$window.scrollTop(scrollTop);
activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
$window.off('keyup', handleKeyup);
}
onChange && onChange(visible);
}
function show() {
setState(true);
}
function hide() {
setState(false);
}
function handleKeyup(e) {
// Char Code: 27 ESC
if (e.which === 27) {
hide();
}
}
setOptions(options);
init();
return {
show: show,
hide: hide,
$el: $root
};
}
$.fn.modal = modal;
});
})();
</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
(function () {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
// search panel
var search = (window.search || (window.search = {}));
var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
true : window.useDefaultSearchBox ;
var $searchModal = $('.js-page-search-modal');
var $searchToggle = $('.js-search-toggle');
var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
var modalVisible = false;
search.searchModal = searchModal;
var $searchBox = null;
var $searchInput = null;
var $searchClear = null;
function getModalVisible() {
return modalVisible;
}
search.getModalVisible = getModalVisible;
function handleModalChange(visible) {
modalVisible = visible;
if (visible) {
search.onShow && search.onShow();
useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
} else {
search.onShow && search.onHide();
useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
setTimeout(function() {
useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
search.clear && search.clear();
window.pageAsideAffix && window.pageAsideAffix.refresh();
}, 400);
}
}
$searchToggle.on('click', function() {
modalVisible ? searchModal.hide() : searchModal.show();
});
// Char Code: 83 S, 191 /
$(window).on('keyup', function(e) {
if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
modalVisible || searchModal.show();
}
});
if (useDefaultSearchBox) {
$searchBox = $('.js-search-box');
$searchInput = $searchBox.children('input');
$searchClear = $searchBox.children('.js-icon-clear');
search.getSearchInput = function() {
return $searchInput.get(0);
};
search.getVal = function() {
return $searchInput.val();
};
search.setVal = function(val) {
$searchInput.val(val);
};
$searchInput.on('focus', function() {
$(this).addClass('focus');
});
$searchInput.on('blur', function() {
$(this).removeClass('focus');
});
$searchInput.on('input', window.throttle(function() {
var val = $(this).val();
if (val === '' || typeof val !== 'string') {
search.clear && search.clear();
} else {
$searchBox.addClass('not-empty');
search.onInputNotEmpty && search.onInputNotEmpty(val);
}
}, 400));
$searchClear.on('click', function() {
$searchInput.val(''); $searchBox.removeClass('not-empty');
search.clear && search.clear();
});
}
});
})();
</script><div class="search search--dark">
<div class="main">
<div class="search__header">Recherche</div>
<div class="search-bar">
<div class="search-box js-search-box">
<div class="search-box__icon-search"><i class="fas fa-search"></i></div>
<input id="search-input" type="text" />
<div class="search-box__icon-clear js-icon-clear">
<a><i class="fas fa-times"></i></a>
</div>
</div>
<button class="button button--theme-dark button--pill search__cancel js-search-toggle">
Annuler</button>
</div>
<div id="results-container" class="search-result js-search-result"></div>
</div>
</div>
<!-- Script pointing to search-script.js -->
<script>/*!
* Simple-Jekyll-Search
* Copyright 2015-2020, Christian Fei
* Licensed under the MIT License.
*/
(function(){
'use strict'
var _$Templater_7 = {
compile: compile,
setOptions: setOptions
}
const options = {}
options.pattern = /\{(.*?)\}/g
options.template = ''
options.middleware = function () {}
function setOptions (_options) {
options.pattern = _options.pattern || options.pattern
options.template = _options.template || options.template
if (typeof _options.middleware === 'function') {
options.middleware = _options.middleware
}
}
function compile (data) {
return options.template.replace(options.pattern, function (match, prop) {
const value = options.middleware(prop, data[prop], options.template)
if (typeof value !== 'undefined') {
return value
}
return data[prop] || match
})
}
'use strict';
function fuzzysearch (needle, haystack) {
var tlen = haystack.length;
var qlen = needle.length;
if (qlen > tlen) {
return false;
}
if (qlen === tlen) {
return needle === haystack;
}
outer: for (var i = 0, j = 0; i < qlen; i++) {
var nch = needle.charCodeAt(i);
while (j < tlen) {
if (haystack.charCodeAt(j++) === nch) {
continue outer;
}
}
return false;
}
return true;
}
var _$fuzzysearch_1 = fuzzysearch;
'use strict'
/* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
function FuzzySearchStrategy () {
this.matches = function (string, crit) {
return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
}
}
'use strict'
var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
function LiteralSearchStrategy () {
this.matches = function (str, crit) {
if (!str) return false
str = str.trim().toLowerCase()
crit = crit.trim().toLowerCase()
return crit.split(' ').filter(function (word) {
return str.indexOf(word) >= 0
}).length === crit.split(' ').length
}
}
'use strict'
var _$Repository_4 = {
put: put,
clear: clear,
search: search,
setOptions: __setOptions_4
}
/* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
/* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
function NoSort () {
return 0
}
const data = []
let opt = {}
opt.fuzzy = false
opt.limit = 10
opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = NoSort
opt.exclude = []
function put (data) {
if (isObject(data)) {
return addObject(data)
}
if (isArray(data)) {
return addArray(data)
}
return undefined
}
function clear () {
data.length = 0
return data
}
function isObject (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
}
function isArray (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
}
function addObject (_data) {
data.push(_data)
return data
}
function addArray (_data) {
const added = []
clear()
for (let i = 0, len = _data.length; i < len; i++) {
if (isObject(_data[i])) {
added.push(addObject(_data[i]))
}
}
return added
}
function search (crit) {
if (!crit) {
return []
}
return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
}
function __setOptions_4 (_opt) {
opt = _opt || {}
opt.fuzzy = _opt.fuzzy || false
opt.limit = _opt.limit || 10
opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = _opt.sort || NoSort
opt.exclude = _opt.exclude || []
}
function findMatches (data, crit, strategy, opt) {
const matches = []
for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
const match = findMatchesInObject(data[i], crit, strategy, opt)
if (match) {
matches.push(match)
}
}
return matches
}
function findMatchesInObject (obj, crit, strategy, opt) {
for (const key in obj) {
if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
return obj
}
}
}
function isExcluded (term, excludedTerms) {
for (let i = 0, len = excludedTerms.length; i < len; i++) {
const excludedTerm = excludedTerms[i]
if (new RegExp(excludedTerm).test(term)) {
return true
}
}
return false
}
/* globals ActiveXObject:false */
'use strict'
var _$JSONLoader_2 = {
load: load
}
function load (location, callback) {
const xhr = getXHR()
xhr.open('GET', location, true)
xhr.onreadystatechange = createStateChangeListener(xhr, callback)
xhr.send()
}
function createStateChangeListener (xhr, callback) {
return function () {
if (xhr.readyState === 4 && xhr.status === 200) {
try {
callback(null, JSON.parse(xhr.responseText))
} catch (err) {
callback(err, null)
}
}
}
}
function getXHR () {
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
}
'use strict'
var _$OptionsValidator_3 = function OptionsValidator (params) {
if (!validateParams(params)) {
throw new Error('-- OptionsValidator: required options missing')
}
if (!(this instanceof OptionsValidator)) {
return new OptionsValidator(params)
}
const requiredOptions = params.required
this.getRequiredOptions = function () {
return requiredOptions
}
this.validate = function (parameters) {
const errors = []
requiredOptions.forEach(function (requiredOptionName) {
if (typeof parameters[requiredOptionName] === 'undefined') {
errors.push(requiredOptionName)
}
})
return errors
}
function validateParams (params) {
if (!params) {
return false
}
return typeof params.required !== 'undefined' && params.required instanceof Array
}
}
'use strict'
var _$utils_9 = {
merge: merge,
isJSON: isJSON
}
function merge (defaultParams, mergeParams) {
const mergedOptions = {}
for (const option in defaultParams) {
mergedOptions[option] = defaultParams[option]
if (typeof mergeParams[option] !== 'undefined') {
mergedOptions[option] = mergeParams[option]
}
}
return mergedOptions
}
function isJSON (json) {
try {
if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
return true
}
return false
} catch (err) {
return false
}
}
var _$src_8 = {};
(function (window) {
'use strict'
let options = {
searchInput: null,
resultsContainer: null,
json: [],
success: Function.prototype,
searchResultTemplate: '<li><a href="{url}" title="{desc}">{title}</a></li>',
templateMiddleware: Function.prototype,
sortMiddleware: function () {
return 0
},
noResultsText: 'No results found',
limit: 10,
fuzzy: false,
debounceTime: null,
exclude: []
}
let debounceTimerHandle
const debounce = function (func, delayMillis) {
if (delayMillis) {
clearTimeout(debounceTimerHandle)
debounceTimerHandle = setTimeout(func, delayMillis)
} else {
func.call()
}
}
const requiredOptions = ['searchInput', 'resultsContainer', 'json']
/* removed: const _$Templater_7 = require('./Templater') */;
/* removed: const _$Repository_4 = require('./Repository') */;
/* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
const optionsValidator = _$OptionsValidator_3({
required: requiredOptions
})
/* removed: const _$utils_9 = require('./utils') */;
window.SimpleJekyllSearch = function (_options) {
const errors = optionsValidator.validate(_options)
if (errors.length > 0) {
throwError('You must specify the following required options: ' + requiredOptions)
}
options = _$utils_9.merge(options, _options)
_$Templater_7.setOptions({
template: options.searchResultTemplate,
middleware: options.templateMiddleware
})
_$Repository_4.setOptions({
fuzzy: options.fuzzy,
limit: options.limit,
sort: options.sortMiddleware,
exclude: options.exclude
})
if (_$utils_9.isJSON(options.json)) {
initWithJSON(options.json)
} else {
initWithURL(options.json)
}
const rv = {
search: search
}
typeof options.success === 'function' && options.success.call(rv)
return rv
}
function initWithJSON (json) {
_$Repository_4.put(json)
registerInput()
}
function initWithURL (url) {
_$JSONLoader_2.load(url, function (err, json) {
if (err) {
throwError('failed to get JSON (' + url + ')')
}
initWithJSON(json)
})
}
function emptyResultsContainer () {
options.resultsContainer.innerHTML = ''
}
function appendToResultsContainer (text) {
options.resultsContainer.innerHTML += text
}
function registerInput () {
options.searchInput.addEventListener('input', function (e) {
if (isWhitelistedKey(e.which)) {
emptyResultsContainer()
debounce(function () { search(e.target.value) }, options.debounceTime)
}
})
}
function search (query) {
if (isValidQuery(query)) {
emptyResultsContainer()
render(_$Repository_4.search(query), query)
}
}
function render (results, query) {
const len = results.length
if (len === 0) {
return appendToResultsContainer(options.noResultsText)
}
for (let i = 0; i < len; i++) {
results[i].query = query
appendToResultsContainer(_$Templater_7.compile(results[i]))
}
}
function isValidQuery (query) {
return query && query.length > 0
}
function isWhitelistedKey (key) {
return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
}
function throwError (message) {
throw new Error('SimpleJekyllSearch --- ' + message)
}
})(window)
}());
</script>
<!-- Configuration -->
<script>
SimpleJekyllSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('results-container'),
noResultsText: '<p>Aucun résultat!</p>',
json: '/search.json',
searchResultTemplate: '<li><a href="{url}">{date}&nbsp;{title}</a>&nbsp;(Création {create})</li>'
})
</script>
</div></div>
<script>(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
function scrollToAnchor(anchor, duration, callback) {
var $root = this;
$root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
callback && callback();
});
}
$.fn.scrollToAnchor = scrollToAnchor;
});
})();
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
function affix(options) {
var $root = this, $window = $(window), $scrollTarget, $scroll,
offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
hasInit = false, curState;
function setOptions(options) {
var _options = options || {};
_options.offsetBottom && (offsetBottom = _options.offsetBottom);
_options.scrollTarget && (scrollTarget = _options.scrollTarget);
_options.scroll && (scroll = _options.scroll);
_options.disabled !== undefined && (disabled = _options.disabled);
$scrollTarget = $(scrollTarget);
isOverallScroller = window.isOverallScroller($scrollTarget[0]);
$scroll = $(scroll);
}
function preCalc() {
top();
rootHeight = $root.outerHeight();
rootTop = $root.offset().top + (isOverallScroller ? 0 : $scrollTarget.scrollTop());
rootLeft = $root.offset().left;
}
function calc(needPreCalc) {
needPreCalc && preCalc();
scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
rootBottomTop = scrollBottom - rootTop;
}
function top() {
if (curState !== 'top') {
$root.removeClass('fixed').css({
left: 0,
top: 0
});
curState = 'top';
}
}
function fixed() {
if (curState !== 'fixed') {
$root.addClass('fixed').css({
left: rootLeft + 'px',
top: 0
});
curState = 'fixed';
}
}
function bottom() {
if (curState !== 'bottom') {
$root.removeClass('fixed').css({
left: 0,
top: rootBottomTop + 'px'
});
curState = 'bottom';
}
}
function setState() {
var scrollTop = $scrollTarget.scrollTop();
if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
fixed();
} else if (scrollTop < rootTop) {
top();
} else {
bottom();
}
}
function init() {
if(!hasInit) {
var interval, timeout;
calc(true); setState();
// run calc every 100 millisecond
interval = setInterval(function() {
calc();
}, 100);
timeout = setTimeout(function() {
clearInterval(interval);
}, 45000);
window.pageLoad.then(function() {
setTimeout(function() {
clearInterval(interval);
clearTimeout(timeout);
}, 3000);
});
$scrollTarget.on('scroll', function() {
disabled || setState();
});
$window.on('resize', function() {
disabled || (calc(true), setState());
});
hasInit = true;
}
}
setOptions(options);
if (!disabled) {
init();
}
$window.on('resize', window.throttle(function() {
init();
}, 200));
return {
setOptions: setOptions,
refresh: function() {
calc(true, { animation: false }); setState();
}
};
}
$.fn.affix = affix;
});
})();
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
function toc(options) {
var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
headingsPos, scrolling = false, hasRendered = false, hasInit = false;
function setOptions(options) {
var _options = options || {};
_options.selectors && (selectors = _options.selectors);
_options.container && (container = _options.container);
_options.scrollTarget && (scrollTarget = _options.scrollTarget);
_options.scroller && (scroller = _options.scroller);
_options.disabled !== undefined && (disabled = _options.disabled);
$headings = $(container).find(selectors).filter('[id]');
$scrollTarget = $(scrollTarget);
$scroller = $(scroller);
}
function calc() {
headingsPos = [];
$headings.each(function() {
headingsPos.push(Math.floor($(this).position().top));
});
}
function setState(element, disabled) {
var scrollTop = $scrollTarget.scrollTop(), i;
if (disabled || !headingsPos || headingsPos.length < 1) { return; }
if (element) {
$activeCur = element;
} else {
for (i = 0; i < headingsPos.length; i++) {
if (scrollTop >= headingsPos[i]) {
$activeCur = $tocLi.eq(i);
} else {
$activeCur || ($activeCur = $tocLi.eq(i));
break;
}
}
}
$activeLast && $activeLast.removeClass('active');
($activeLast = $activeCur).addClass('active');
}
function render() {
if(!hasRendered) {
$root.append($tocUl);
$headings.each(function() {
var $this = $(this);
$tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
.append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
});
$tocLi = $tocUl.children('li');
$tocUl.on('click', 'a', function(e) {
e.preventDefault();
var $this = $(this);
scrolling = true;
setState($this.parent());
$scroller.scrollToAnchor($this.attr('href'), 400, function() {
scrolling = false;
});
});
}
hasRendered = true;
}
function init() {
var interval, timeout;
if(!hasInit) {
render(); calc(); setState(null, scrolling);
// run calc every 100 millisecond
interval = setInterval(function() {
calc();
}, 100);
timeout = setTimeout(function() {
clearInterval(interval);
}, 45000);
window.pageLoad.then(function() {
setTimeout(function() {
clearInterval(interval);
clearTimeout(timeout);
}, 3000);
});
$scrollTarget.on('scroll', function() {
disabled || setState(null, scrolling);
});
$window.on('resize', window.throttle(function() {
if (!disabled) {
render(); calc(); setState(null, scrolling);
}
}, 100));
}
hasInit = true;
}
setOptions(options);
if (!disabled) {
init();
}
$window.on('resize', window.throttle(function() {
init();
}, 200));
return {
setOptions: setOptions
};
}
$.fn.toc = toc;
});
})();
/*(function () {
})();*/
</script><script>
/* toc must before affix, since affix need to konw toc' height. */(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
window.Lazyload.js(SOURCES.jquery, function() {
var $window = $(window);
var $articleContent = $('.js-article-content');
var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
var toc;
var tocDisabled = false;
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
function disabled() {
return $col2.css('display') === 'none' || !hasToc;
}
tocDisabled = disabled();
toc = $tocRoot.toc({
selectors: TOC_SELECTOR,
container: $articleContent,
scrollTarget: hasSidebar ? '.js-page-main' : null,
scroller: hasSidebar ? '.js-page-main' : null,
disabled: tocDisabled
});
$window.on('resize', window.throttle(function() {
tocDisabled = disabled();
toc && toc.setOptions({
disabled: tocDisabled
});
}, 100));
});
})();
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
var $window = $(window), $pageFooter = $('.js-page-footer');
var $pageAside = $('.js-page-aside');
var affix;
var tocDisabled = false;
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
affix = $pageAside.affix({
offsetBottom: $pageFooter.outerHeight(),
scrollTarget: hasSidebar ? '.js-page-main' : null,
scroller: hasSidebar ? '.js-page-main' : null,
scroll: hasSidebar ? $('.js-page-main').children() : null,
disabled: tocDisabled
});
$window.on('resize', window.throttle(function() {
affix && affix.setOptions({
disabled: tocDisabled
});
}, 100));
window.pageAsideAffix = affix;
});
})();
</script><!---->
</div>
<script>(function () {
var $root = document.getElementsByClassName('root')[0];
if (window.hasEvent('touchstart')) {
$root.dataset.isTouch = true;
document.addEventListener('touchstart', function(){}, false);
}
})();
</script>
</body>
</html>