1
0
Fork 0
mirror of https://github.com/gorhill/uMatrix.git synced 2024-06-02 02:14:52 +12:00

Compare commits

...

20 commits

Author SHA1 Message Date
Raymond Hill 59d918356b
Remove obsolete assets 2021-07-20 13:57:06 -04:00
Raymond Hill 9d97748772
Fix fetching of assets at build time 2021-07-19 11:58:09 -04:00
Raymond Hill 8f8234dfae
New revision for dev build 2021-07-19 11:57:31 -04:00
Raymond Hill 1603b33b27
Fix infinite recursion with maliciously crafted URL
Related issue:
- https://github.com/vtriolet/writings/blob/main/posts/2021/ublock_origin_and_umatrix_denial_of_service.adoc
2021-07-19 11:56:15 -04:00
Raymond Hill 0bcb7669e7
Fix exception thrown when a stock asset is removed
Related feedback:
- https://www.reddit.com/r/uMatrix/comments/ftebgz/
2020-04-02 10:39:31 -04:00
Raymond Hill 89b7e026c3
Revert "Remove hpHosts from stock hosts files"
This reverts commit ba0dfe5d9b.

Related feedback:
- https://www.reddit.com/r/uMatrix/comments/ftebgz/
2020-04-02 08:46:09 -04:00
Raymond Hill ba0dfe5d9b
Remove hpHosts from stock hosts files
Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/971
2020-04-01 07:52:37 -04:00
Raymond Hill 57eb9fc150
Expect that IntersectionObserver API may not be available
Related issue:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/235

The popup-resize functionality won't be available if the
IntersectionObserver API is not available. The purpose
of the popup-resize code is to adjust the matrix visuals
on small display -- i.e. on mobile or when the popup panel
is used in the overflow menu in Firefox.
2020-03-08 11:12:47 -04:00
Raymond Hill e0800f89df
Make Firefox dev build auto-update 2020-02-24 16:25:58 -05:00
Raymond Hill b26b3bb960
New revision for dev build 2020-02-24 16:20:15 -05:00
Raymond Hill 2d8e32c61b
Minor style changes 2020-02-24 16:18:57 -05:00
Raymond Hill 41133dffd2
Fix remnants of uBO code in cache storage manager
Related feedback:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/227#issuecomment-590543891
2020-02-24 16:16:06 -05:00
Saitama a1ec20423c
mvps host list secure protocol http => https (#1014) 2020-02-23 06:59:20 -05:00
Raymond Hill e3ebfdfba4
Fix improper initial value for suspendTabsUntilReady 2020-02-02 08:49:24 -05:00
Raymond Hill 43cd137fff
Make Firefox dev build auto-update 2020-01-03 08:56:04 -05:00
Raymond Hill a697ce0be9
New revision for dev build 2020-01-03 08:47:26 -05:00
Raymond Hill b75500eff4
Import translation work from https://crowdin.com/project/umatrix 2020-01-03 08:46:53 -05:00
Raymond Hill 3f4425d9db
Fix broken handling of blocked document parameters
Related issue:
- https://github.com/uBlockOrigin/uMatrix-issues/issues/214

Regression from:
- https://github.com/gorhill/uMatrix/commit/9b292304d33a#diff-67a98e071667dfff264d50da29bb3a5cL38-R39
2020-01-03 08:39:39 -05:00
Raymond Hill f8c82add03
Fix python scripts used for pusblishing dev builds 2019-12-31 10:27:14 -05:00
Raymond Hill a78a6465b0
Make Firefox dev build auto-update 2019-12-31 10:20:18 -05:00
17 changed files with 86 additions and 75 deletions

View file

@ -16,25 +16,6 @@
"assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat" "assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat"
] ]
}, },
"malware-0": {
"content": "filters",
"title": "Malware Domain List",
"contentURL": [
"https://www.malwaredomainlist.com/hostslist/hosts.txt",
"assets/thirdparties/www.malwaredomainlist.com/hostslist/hosts.txt"
]
},
"malware-1": {
"content": "filters",
"title": "Malware domains",
"contentURL": [
"https://mirror.cedia.org.ec/malwaredomains/justdomains",
"https://mirror1.malwaredomains.com/files/justdomains",
"assets/thirdparties/mirror1.malwaredomains.com/files/justdomains",
"assets/thirdparties/mirror1.malwaredomains.com/files/justdomains.txt"
],
"supportURL": "http://www.malwaredomains.com/"
},
"dpollock-0": { "dpollock-0": {
"content": "filters", "content": "filters",
"updateAfter": 11, "updateAfter": 11,
@ -45,25 +26,15 @@
], ],
"supportURL": "https://someonewhocares.org/hosts/" "supportURL": "https://someonewhocares.org/hosts/"
}, },
"hphosts": {
"content": "filters",
"updateAfter": 11,
"title": "hpHosts Ad and tracking servers",
"contentURL": [
"https://hosts-file.net/.%5Cad_servers.txt",
"assets/thirdparties/hosts-file.net/ad_servers.txt"
],
"supportURL": "https://hosts-file.net/"
},
"mvps-0": { "mvps-0": {
"content": "filters", "content": "filters",
"updateAfter": 11, "updateAfter": 11,
"title": "MVPS HOSTS", "title": "MVPS HOSTS",
"contentURL": [ "contentURL": [
"http://winhelp2002.mvps.org/hosts.txt", "https://winhelp2002.mvps.org/hosts.txt",
"assets/thirdparties/winhelp2002.mvps.org/hosts.txt" "assets/thirdparties/winhelp2002.mvps.org/hosts.txt"
], ],
"supportURL": "http://winhelp2002.mvps.org/" "supportURL": "https://winhelp2002.mvps.org/"
}, },
"plowe-0": { "plowe-0": {
"content": "filters", "content": "filters",

View file

@ -39,7 +39,7 @@ if not re.search('^\d+\.\d+\.\d+(b|rc)\d+$', version):
cs_extension_id = 'eckgcipdkhcfghnmincccnhpdmnbefki' cs_extension_id = 'eckgcipdkhcfghnmincccnhpdmnbefki'
tmpdir = tempfile.TemporaryDirectory() tmpdir = tempfile.TemporaryDirectory()
raw_zip_filename = 'uMatrix.chromium.zip' raw_zip_filename = 'uMatrix_'+ version + '.chromium.zip'
raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename) raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename)
github_owner = 'gorhill' github_owner = 'gorhill'
github_repo = 'uMatrix' github_repo = 'uMatrix'

View file

@ -61,10 +61,10 @@ if match.group(2):
extension_id = 'uMatrix@raymondhill.net' extension_id = 'uMatrix@raymondhill.net'
tmpdir = tempfile.TemporaryDirectory() tmpdir = tempfile.TemporaryDirectory()
raw_xpi_filename = 'uMatrix.firefox.xpi' raw_xpi_filename = 'uMatrix_' + tag_version + '.firefox.xpi'
raw_xpi_filepath = os.path.join(tmpdir.name, raw_xpi_filename) raw_xpi_filepath = os.path.join(tmpdir.name, raw_xpi_filename)
unsigned_xpi_filepath = os.path.join(tmpdir.name, 'uMatrix.firefox.unsigned.xpi') unsigned_xpi_filepath = os.path.join(tmpdir.name, 'uMatrix.firefox.unsigned.xpi')
signed_xpi_filename = 'uMatrix.firefox.signed.xpi' signed_xpi_filename = 'uMatrix_' + tag_version + '.firefox.signed.xpi'
signed_xpi_filepath = os.path.join(tmpdir.name, signed_xpi_filename) signed_xpi_filepath = os.path.join(tmpdir.name, signed_xpi_filename)
github_owner = 'gorhill' github_owner = 'gorhill'
github_repo = 'uMatrix' github_repo = 'uMatrix'
@ -173,19 +173,32 @@ with zipfile.ZipFile(raw_xpi_filepath, 'r') as zipin:
# - https://addons-server.readthedocs.io/en/latest/topics/api/signing.html # - https://addons-server.readthedocs.io/en/latest/topics/api/signing.html
# #
print('Ask AMO to sign self-hosted xpi package...') amo_api_key = ''
with open(unsigned_xpi_filepath, 'rb') as f: amo_secret = ''
amo_api_key = input_secret('AMO API key', 'amo_api_key')
amo_secret = input_secret('AMO API secret', 'amo_secret') def get_jwt_auth():
global amo_api_key
if amo_api_key == '':
amo_api_key = input_secret('AMO API key', 'amo_api_key')
global amo_secret
if amo_secret == '':
amo_secret = input_secret('AMO API secret', 'amo_secret')
amo_nonce = os.urandom(8).hex() amo_nonce = os.urandom(8).hex()
jwt_payload = { jwt_payload = {
'iss': amo_api_key, 'iss': amo_api_key,
'jti': amo_nonce, 'jti': amo_nonce,
'iat': datetime.datetime.utcnow(), 'iat': datetime.datetime.utcnow(),
'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=180), 'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=15),
} }
jwt_auth = 'JWT ' + jwt.encode(jwt_payload, amo_secret).decode() return 'JWT ' + jwt.encode(jwt_payload, amo_secret).decode()
headers = { 'Authorization': jwt_auth, }
print('Ask AMO to sign self-hosted xpi package...')
with open(unsigned_xpi_filepath, 'rb') as f:
# https://blog.mozilla.org/addons/2019/11/11/security-improvements-in-amo-upload-tools/
# "We recommend allowing up to 15 minutes."
interval = 60 # check every 60 seconds
countdown = 15 * 60 / interval # for at most 15 minutes
headers = { 'Authorization': get_jwt_auth(), }
data = { 'channel': 'unlisted' } data = { 'channel': 'unlisted' }
files = { 'upload': f, } files = { 'upload': f, }
signing_url = 'https://addons.mozilla.org/api/v3/addons/{0}/versions/{1}/'.format(extension_id, ext_version) signing_url = 'https://addons.mozilla.org/api/v3/addons/{0}/versions/{1}/'.format(extension_id, ext_version)
@ -201,11 +214,6 @@ with open(unsigned_xpi_filepath, 'rb') as f:
print('Waiting for AMO to process the request to sign the self-hosted xpi package...') print('Waiting for AMO to process the request to sign the self-hosted xpi package...')
# Wait for signed package to be ready # Wait for signed package to be ready
signing_check_url = signing_request_response['url'] signing_check_url = signing_request_response['url']
# TODO: use real time instead
# https://blog.mozilla.org/addons/2019/11/11/security-improvements-in-amo-upload-tools/
# "We recommend allowing up to 15 minutes."
interval = 30 # check every 30 seconds
countdown = 15 * 60 / interval # for at most 15 minutes
while True: while True:
sys.stdout.write('.') sys.stdout.write('.')
sys.stdout.flush() sys.stdout.flush()
@ -214,15 +222,18 @@ with open(unsigned_xpi_filepath, 'rb') as f:
if countdown <= 0: if countdown <= 0:
print('Error: AMO signing timed out') print('Error: AMO signing timed out')
exit(1) exit(1)
headers = { 'Authorization': get_jwt_auth(), }
response = requests.get(signing_check_url, headers=headers) response = requests.get(signing_check_url, headers=headers)
if response.status_code != 200: if response.status_code != 200:
print('Error: AMO signing failed -- server error {0}'.format(response.status_code)) print('Error: AMO signing failed -- server error {0}'.format(response.status_code))
print(response.text)
exit(1) exit(1)
signing_check_response = response.json() signing_check_response = response.json()
if not signing_check_response['processed']: if not signing_check_response['processed']:
continue continue
if not signing_check_response['valid']: if not signing_check_response['valid']:
print('Error: AMO validation failed') print('Error: AMO validation failed')
print(response.text)
exit(1) exit(1)
if not signing_check_response['files'] or len(signing_check_response['files']) == 0: if not signing_check_response['files'] or len(signing_check_response['files']) == 0:
continue continue
@ -239,6 +250,7 @@ with open(unsigned_xpi_filepath, 'rb') as f:
response = requests.get(download_url, headers=headers) response = requests.get(download_url, headers=headers)
if response.status_code != 200: if response.status_code != 200:
print('Error: Download signed package failed -- server error {0}'.format(response.status_code)) print('Error: Download signed package failed -- server error {0}'.format(response.status_code))
print(response.text)
exit(1) exit(1)
with open(signed_xpi_filepath, 'wb') as f: with open(signed_xpi_filepath, 'wb') as f:
f.write(response.content) f.write(response.content)

View file

@ -3,10 +3,10 @@
"uMatrix@raymondhill.net": { "uMatrix@raymondhill.net": {
"updates": [ "updates": [
{ {
"version": "1.4.1.2", "version": "1.4.1.6",
"browser_specific_settings": { "gecko": { "strict_min_version": "56" } }, "browser_specific_settings": { "gecko": { "strict_min_version": "56" } },
"update_info_url": "https://github.com/gorhill/uMatrix/releases/tag/1.4.1b2", "update_info_url": "https://github.com/gorhill/uMatrix/releases/tag/1.4.1b6",
"update_link": "https://github.com/gorhill/uMatrix/releases/download/1.4.1b2/uMatrix_1.4.1b2.firefox.signed.xpi" "update_link": "https://github.com/gorhill/uMatrix/releases/download/1.4.1b6/uMatrix_1.4.1b6.firefox.signed.xpi"
} }
] ]
} }

2
dist/version vendored
View file

@ -1 +1 @@
1.4.1.4 1.4.3.0

View file

@ -72,7 +72,7 @@
"description": "HAS TO FIT IN MATRIX HEADER!" "description": "HAS TO FIT IN MATRIX HEADER!"
}, },
"fetchPrettyName": { "fetchPrettyName": {
"message": "obter", "message": "fetch",
"description": "HAS TO FIT IN MATRIX HEADER!" "description": "HAS TO FIT IN MATRIX HEADER!"
}, },
"framePrettyName": { "framePrettyName": {
@ -328,11 +328,11 @@
"description": "Placeholder string for logger output filtering input field" "description": "Placeholder string for logger output filtering input field"
}, },
"loggerPopupPanelTip": { "loggerPopupPanelTip": {
"message": "Alternar o painel do popup", "message": "Alternar o painel do pop-up",
"description": "Tooltip for the popup panel button in the logger page" "description": "Tooltip for the popup panel button in the logger page"
}, },
"loggerInfoTip": { "loggerInfoTip": {
"message": "uBlock Origin wiki: O Registro", "message": "uBlock Origin wiki: Registros",
"description": "Tooltip for the top-right info label in the logger page" "description": "Tooltip for the top-right info label in the logger page"
}, },
"loggerClearTip": { "loggerClearTip": {
@ -628,7 +628,7 @@
"description": "" "description": ""
}, },
"hostsFilesAutoUpdatePrompt": { "hostsFilesAutoUpdatePrompt": {
"message": "Autoatualizar recursos", "message": "Auto-atualizar recursos",
"description": "" "description": ""
}, },
"hostsFilesUpdateNow": { "hostsFilesUpdateNow": {

View file

@ -72,7 +72,7 @@
"description": "HAS TO FIT IN MATRIX HEADER!" "description": "HAS TO FIT IN MATRIX HEADER!"
}, },
"fetchPrettyName": { "fetchPrettyName": {
"message": "получить", "message": "fetch",
"description": "HAS TO FIT IN MATRIX HEADER!" "description": "HAS TO FIT IN MATRIX HEADER!"
}, },
"framePrettyName": { "framePrettyName": {

View file

@ -57,6 +57,8 @@ const rawSettingsDefault = {
assetFetchBypassBrowserCache: false, assetFetchBypassBrowserCache: false,
assetFetchTimeout: 30, assetFetchTimeout: 30,
autoUpdateAssetFetchPeriod: 120, autoUpdateAssetFetchPeriod: 120,
cacheStorageAPI: 'unset',
cacheStorageCompression: true,
cnameIgnoreList: 'unset', cnameIgnoreList: 'unset',
cnameIgnore1stParty: true, cnameIgnore1stParty: true,
cnameIgnoreExceptions: true, cnameIgnoreExceptions: true,
@ -124,7 +126,7 @@ const rawSettingsDefault = {
'</body></html>' '</body></html>'
].join(''), ].join(''),
framePlaceholderBackground: 'default', framePlaceholderBackground: 'default',
suspendTabsUntilReady: false suspendTabsUntilReady: 'unset'
}; };
/******************************************************************************/ /******************************************************************************/

View file

@ -119,7 +119,7 @@
disconnect(); disconnect();
}, },
Math.max( Math.max(
µMatrix.hiddenSettings.autoUpdateAssetFetchPeriod * 2 * 1000, µMatrix.rawSettings.autoUpdateAssetFetchPeriod * 2 * 1000,
180000 180000
) )
); );
@ -296,7 +296,7 @@
const promises = [ getDb() ]; const promises = [ getDb() ];
const entries = []; const entries = [];
const dontCompress = const dontCompress =
µMatrix.hiddenSettings.cacheStorageCompression !== true; µMatrix.rawSettings.cacheStorageCompression !== true;
const handleEncodingResult = result => { const handleEncodingResult = result => {
entries.push({ key: result.key, value: result.data }); entries.push({ key: result.key, value: result.data });
}; };

View file

@ -23,7 +23,7 @@
'use strict'; 'use strict';
CodeMirror.defineMode("raw-settings", function() { CodeMirror.defineMode('raw-settings', function() {
return { return {
token: function(stream) { token: function(stream) {
if ( stream.sol() ) { if ( stream.sol() ) {

View file

@ -26,7 +26,7 @@
// https://github.com/hackademix/noscript/commit/6e80d3f130773fc9a9123c5c4c2e97d63e90fa2a // https://github.com/hackademix/noscript/commit/6e80d3f130773fc9a9123c5c4c2e97d63e90fa2a
(function() { (function() {
let html = document.documentElement; const html = document.documentElement;
if ( html instanceof HTMLElement === false ) { return; } if ( html instanceof HTMLElement === false ) { return; }
let meta; let meta;
@ -45,8 +45,8 @@
// //
// The CSP directive is enforced as soon as the meta tag is inserted: // The CSP directive is enforced as soon as the meta tag is inserted:
// > Enforce the policy policy. // > Enforce the policy policy.
let head = document.head, const head = document.head;
parent = head; let parent = head;
if ( parent === null ) { if ( parent === null ) {
parent = document.createElement('head'); parent = document.createElement('head');
html.appendChild(parent); html.appendChild(parent);

View file

@ -87,7 +87,7 @@ uDom('.what').text(details.url);
return s; return s;
}; };
const renderParams = function(parentNode, rawURL) { const renderParams = function(parentNode, rawURL, depth = 0) {
const a = document.createElement('a'); const a = document.createElement('a');
a.href = rawURL; a.href = rawURL;
if ( a.search.length === 0 ) { return false; } if ( a.search.length === 0 ) { return false; }
@ -109,9 +109,9 @@ uDom('.what').text(details.url);
const name = safeDecodeURIComponent(param.slice(0, pos)); const name = safeDecodeURIComponent(param.slice(0, pos));
const value = safeDecodeURIComponent(param.slice(pos + 1)); const value = safeDecodeURIComponent(param.slice(pos + 1));
const li = liFromParam(name, value); const li = liFromParam(name, value);
if ( reURL.test(value) ) { if ( depth < 2 && reURL.test(value) ) {
const ul = document.createElement('ul'); const ul = document.createElement('ul');
renderParams(ul, value); renderParams(ul, value, depth + 1);
li.appendChild(ul); li.appendChild(ul);
} }
parentNode.appendChild(li); parentNode.appendChild(li);

View file

@ -77,6 +77,11 @@ const resizePopup = (( ) => {
// The purpose of `xobserver` is to initiate the resize handler only // The purpose of `xobserver` is to initiate the resize handler only
// when the popup panel is actually visible. // when the popup panel is actually visible.
// https://github.com/uBlockOrigin/uMatrix-issues/issues/235
if ( self.IntersectionObserver instanceof Object === false ) {
return ( ) => { };
}
let xobserver = new IntersectionObserver(intersections => { let xobserver = new IntersectionObserver(intersections => {
if ( intersections.length === 0 ) { return; } if ( intersections.length === 0 ) { return; }
if ( intersections[0].isIntersecting === false ) { return; } if ( intersections[0].isIntersecting === false ) { return; }

View file

@ -32,6 +32,11 @@
]); ]);
log.info(`User settings ready ${Date.now()-vAPI.T0} ms after launch`); log.info(`User settings ready ${Date.now()-vAPI.T0} ms after launch`);
const cacheBackend = await µm.cacheStorage.select(
µm.rawSettings.cacheStorageAPI
);
log.info(`Backend storage for cache will be ${cacheBackend}`);
const shouldWASM = const shouldWASM =
vAPI.canWASM === true && vAPI.canWASM === true &&
µm.rawSettings.disableWebAssembly !== true; µm.rawSettings.disableWebAssembly !== true;

View file

@ -496,9 +496,19 @@ self.addEventListener('rawSettingsChanged', ( ) => {
const addedCount = this.ubiquitousBlacklistRef.addedCount; const addedCount = this.ubiquitousBlacklistRef.addedCount;
const addCount = this.ubiquitousBlacklistRef.addCount; const addCount = this.ubiquitousBlacklistRef.addCount;
this.mergeHostsFileContent(details.content); // https://www.reddit.com/r/uMatrix/comments/ftebgz/
// Be ready to deal with a removed asset.
if ( typeof details.content === 'string' && details.content !== '' ) {
this.mergeHostsFileContent(details.content);
}
const hostsFileMeta = this.liveHostsFiles.get(details.assetKey); const hostsFileMeta = this.liveHostsFiles.get(details.assetKey);
if ( hostsFileMeta === undefined ) {
this.liveHostsFiles.delete(details.assetKey);
return;
}
hostsFileMeta.entryCount = hostsFileMeta.entryCount =
this.ubiquitousBlacklistRef.addCount - addCount; this.ubiquitousBlacklistRef.addCount - addCount;
hostsFileMeta.entryUsedCount = hostsFileMeta.entryUsedCount =

View file

@ -55,7 +55,7 @@ const µm = µMatrix;
// its APIs, but since this is not the case, uMatrix inherits the duty to // its APIs, but since this is not the case, uMatrix inherits the duty to
// make it seamless on its side. // make it seamless on its side.
if ( pageURL.startsWith('wyciwyg:') ) { if ( pageURL.startsWith('wyciwyg:') ) {
let match = /^wyciwyg:\/\/\d+\//.exec(pageURL); const match = /^wyciwyg:\/\/\d+\//.exec(pageURL);
if ( match !== null ) { if ( match !== null ) {
pageURL = pageURL.slice(match[0].length); pageURL = pageURL.slice(match[0].length);
} }
@ -64,18 +64,18 @@ const µm = µMatrix;
// If the URL is that of our "blocked page" document, return the URL of // If the URL is that of our "blocked page" document, return the URL of
// the blocked page. // the blocked page.
if ( pageURL.startsWith(vAPI.getURL('main-blocked.html')) ) { if ( pageURL.startsWith(vAPI.getURL('main-blocked.html')) ) {
let matches = /main-blocked\.html\?details=([^&]+)/.exec(pageURL); const parsedURL = new URL(pageURL);
if ( matches && matches.length === 2 ) { const details = parsedURL.searchParams.get('details');
if ( details ) {
try { try {
let details = JSON.parse(atob(matches[1])); pageURL = JSON.parse(decodeURIComponent(details)).url;
pageURL = details.url; } catch (ex) {
} catch (e) {
} }
} }
} }
let uri = this.URI.set(pageURL); const uri = this.URI.set(pageURL);
let scheme = uri.scheme; const scheme = uri.scheme;
if ( scheme === 'https' || scheme === 'http' ) { if ( scheme === 'https' || scheme === 'http' ) {
return uri.normalizedURI(); return uri.normalizedURI();
} }

View file

@ -14,11 +14,14 @@ cp ./assets/assets.json $DES/
if [ -n "${TRAVIS_TAG}" ]; then if [ -n "${TRAVIS_TAG}" ]; then
pushd .. > /dev/null pushd .. > /dev/null
git clone --depth 1 https://github.com/uBlockOrigin/uAssets.git git clone --depth 1 https://github.com/uBlockOrigin/uAssets.git
git checkout 84dc2761abb4193bb34290aa6d90266610f735f6
popd > /dev/null popd > /dev/null
fi fi
mkdir $DES/thirdparties mkdir $DES/thirdparties
cp -R ../uAssets/thirdparties/hosts-file.net $DES/thirdparties/ pushd ../uAssets
git checkout 84dc2761abb4193bb34290aa6d90266610f735f6
popd
cp -R ../uAssets/thirdparties/mirror1.malwaredomains.com $DES/thirdparties/ cp -R ../uAssets/thirdparties/mirror1.malwaredomains.com $DES/thirdparties/
cp -R ../uAssets/thirdparties/pgl.yoyo.org $DES/thirdparties/ cp -R ../uAssets/thirdparties/pgl.yoyo.org $DES/thirdparties/
cp -R ../uAssets/thirdparties/publicsuffix.org $DES/thirdparties/ cp -R ../uAssets/thirdparties/publicsuffix.org $DES/thirdparties/
@ -27,5 +30,8 @@ cp -R ../uAssets/thirdparties/winhelp2002.mvps.org $DES/thirdparties/
cp -R ../uAssets/thirdparties/www.malwaredomainlist.com $DES/thirdparties/ cp -R ../uAssets/thirdparties/www.malwaredomainlist.com $DES/thirdparties/
mkdir $DES/umatrix mkdir $DES/umatrix
cp -R ../uAssets/recipes/* $DES/umatrix/ cp -R ../uAssets/recipes/* $DES/umatrix/
pushd ../uAssets
git checkout master
popd
echo "done." echo "done."