fakefilter 0.1.656 → 1.1.10

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.
Files changed (242) hide show
  1. package/README.md +16 -64
  2. package/apiserver/api/ext_result.js +51 -0
  3. package/apiserver/api/ext_tasks.js +151 -0
  4. package/apiserver/api/is_fakedomain.js +39 -0
  5. package/apiserver/api/is_fakeemail.js +17 -0
  6. package/apiserver/api/ping.js +12 -0
  7. package/apiserver/docs/README.md +41 -0
  8. package/apiserver/docs/babel.config.js +3 -0
  9. package/apiserver/docs/blog/2019-05-28-first-blog-post.md +12 -0
  10. package/apiserver/docs/blog/2019-05-29-long-blog-post.md +44 -0
  11. package/apiserver/docs/blog/2021-08-01-mdx-blog-post.mdx +20 -0
  12. package/apiserver/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
  13. package/apiserver/docs/blog/2021-08-26-welcome/index.md +25 -0
  14. package/apiserver/docs/blog/authors.yml +17 -0
  15. package/apiserver/docs/docs/intro.md +16 -0
  16. package/apiserver/docs/docs/nodejs/_category_.json +4 -0
  17. package/apiserver/docs/docs/nodejs/index.md +30 -0
  18. package/apiserver/docs/docs/restful/_category_.json +4 -0
  19. package/apiserver/docs/docs/restful/index.md +59 -0
  20. package/apiserver/docs/docusaurus.config.js +118 -0
  21. package/apiserver/docs/package.json +37 -0
  22. package/apiserver/docs/sidebars.js +31 -0
  23. package/apiserver/docs/src/components/HomepageFeatures/index.js +64 -0
  24. package/apiserver/docs/src/components/HomepageFeatures/styles.module.css +11 -0
  25. package/apiserver/docs/src/css/custom.css +39 -0
  26. package/apiserver/docs/src/pages/index.js +45 -0
  27. package/apiserver/docs/src/pages/index.module.css +23 -0
  28. package/apiserver/docs/src/pages/markdown-page.md +7 -0
  29. package/apiserver/docs/src/theme/IconArrow/index.js +10 -0
  30. package/apiserver/docs/static/.nojekyll +0 -0
  31. package/apiserver/docs/static/img/docusaurus.png +0 -0
  32. package/apiserver/docs/static/img/favicon.ico +0 -0
  33. package/apiserver/docs/static/img/logo.svg +1 -0
  34. package/apiserver/docs/static/img/tutorial/docsVersionDropdown.png +0 -0
  35. package/apiserver/docs/static/img/tutorial/localeDropdown.png +0 -0
  36. package/apiserver/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
  37. package/apiserver/docs/static/img/undraw_docusaurus_react.svg +170 -0
  38. package/apiserver/docs/static/img/undraw_docusaurus_tree.svg +40 -0
  39. package/apiserver/inc/middleware_client.js +37 -0
  40. package/apiserver/inc/middleware_logging.js +17 -0
  41. package/apiserver/inc/shared.js +45 -0
  42. package/apiserver/inc/worker_fakefilter.js +53 -0
  43. package/apiserver/index.js +62 -0
  44. package/apiserver/public/10minemail.com.js +27 -0
  45. package/apiserver/public/10minuteemails.com.js +46 -0
  46. package/apiserver/public/10minutemail.com.js +29 -0
  47. package/apiserver/public/crazymailing.com.js +27 -0
  48. package/apiserver/public/gettempmail.com.js +39 -0
  49. package/apiserver/public/img/dynamic/README.md +0 -0
  50. package/apiserver/public/onetempmail.com.js +35 -0
  51. package/apiserver/public/shared.js +54 -0
  52. package/apiserver/public/temp-mail.org.js +28 -0
  53. package/apiserver/public/tempmail.com.tr.js +36 -0
  54. package/apiserver/public/tempmail.net.js +28 -0
  55. package/apiserver/public/tempmailid.com.js +40 -0
  56. package/apiserver/public/tempmailo.org.js +36 -0
  57. package/apiserver/public/throwawaymail.com.js +27 -0
  58. package/burner/README.md +1 -0
  59. package/burner/burner-check.js +57 -0
  60. package/burner/emails.txt +57106 -0
  61. package/chart-update.js +179 -0
  62. package/cleanup.js +58 -0
  63. package/config.js +126 -0
  64. package/events.js +59 -0
  65. package/fetch.js +177 -0
  66. package/models/events.js +37 -0
  67. package/models/harvested.js +45 -0
  68. package/models/harvested_clone.js +44 -0
  69. package/package.json +41 -23
  70. package/providers/10-minute-mail.com.js +38 -0
  71. package/providers/10-minuten-mail.de.js +38 -0
  72. package/providers/10mails.net.js +40 -0
  73. package/providers/10minut.com.pl.js +38 -0
  74. package/providers/10minut.xyz.js +40 -0
  75. package/providers/10minuteemails.com.js +39 -0
  76. package/providers/10minutemail.co.za.js +38 -0
  77. package/providers/10minutemail.com.js +39 -0
  78. package/providers/10minutemail.info.js +38 -0
  79. package/providers/10minutemail.net.js +38 -0
  80. package/providers/10minutemail.org.js +38 -0
  81. package/providers/10minutesemail.net.js +36 -0
  82. package/providers/10minutesmail.us.js +38 -0
  83. package/providers/1secmail.com.js +39 -0
  84. package/providers/20minutemail.com.js +36 -0
  85. package/providers/24hour.email.js +37 -0
  86. package/providers/___emailondeck.com.js +76 -0
  87. package/providers/abandonmail.com.js +38 -0
  88. package/providers/airmailbox.website.js +38 -0
  89. package/providers/akmail.in.js +37 -0
  90. package/providers/altmails.com.js +37 -0
  91. package/providers/anonbox.net.js +42 -0
  92. package/providers/anonmails.de.js +25 -0
  93. package/providers/another-temp-mail.com.js +40 -0
  94. package/providers/brodilla.email.js +44 -0
  95. package/providers/byom.de.js +42 -0
  96. package/providers/cryptogmail.com.js +40 -0
  97. package/providers/default.tmail.thehp.in.js +41 -0
  98. package/providers/developermail.com.js +39 -0
  99. package/providers/dispemail.com.js +37 -0
  100. package/providers/disposableemail.co.js +37 -0
  101. package/providers/disposableemail.us.js +36 -0
  102. package/providers/disposablemail.com.js +38 -0
  103. package/providers/disposeamail.com.js +43 -0
  104. package/providers/dispostable.com.js +38 -0
  105. package/providers/dodsi.com.js +38 -0
  106. package/providers/dropmail.me.js +37 -0
  107. package/providers/easytrashmail.com.js +33 -0
  108. package/providers/edumail.icu.js +36 -0
  109. package/providers/email-fake.com.js +35 -0
  110. package/providers/emailfake.com.js +35 -0
  111. package/providers/etempmail.net.js +37 -0
  112. package/providers/eyepaste.com.js +39 -0
  113. package/providers/fakemail.io.js +35 -0
  114. package/providers/fakemail.net.js +35 -0
  115. package/providers/fakemailgenerator.com.js +35 -0
  116. package/providers/fakermail.com.js +37 -0
  117. package/providers/fex.plus.js +38 -0
  118. package/providers/findtempmail.com.js +38 -0
  119. package/providers/foxiomail.com.js +41 -0
  120. package/providers/fyii.de.js +42 -0
  121. package/providers/gecicimail.co.js +14 -0
  122. package/providers/gecicimail.com.tr.js +15 -0
  123. package/providers/generator.email.js +37 -0
  124. package/providers/getnada.com.js +37 -0
  125. package/providers/gpa.lu.js +37 -0
  126. package/providers/guerrillamail.com.js +38 -0
  127. package/providers/harakirimail.com.js +38 -0
  128. package/providers/haribu.net.js +39 -0
  129. package/providers/hizli.email.js +40 -0
  130. package/providers/hottempmail.com.js +51 -0
  131. package/providers/instant-email.org.js +39 -0
  132. package/providers/instantemailaddress.com.js +39 -0
  133. package/providers/jooko.info.js +36 -0
  134. package/providers/kopeechka.store.js +53 -0
  135. package/providers/linshi-email.com.js +38 -0
  136. package/providers/lroid.com.js +35 -0
  137. package/providers/luxusmail.org.js +39 -0
  138. package/providers/mail-temp.com.js +37 -0
  139. package/providers/mail-tester.com.js +37 -0
  140. package/providers/mail.gen.tr.js +14 -0
  141. package/providers/mail.gw.js +35 -0
  142. package/providers/mail.td.js +42 -0
  143. package/providers/mail.tm.js +35 -0
  144. package/providers/mail1a.de.js +42 -0
  145. package/providers/mail7.io.js +41 -0
  146. package/providers/mailcatch.com.js +38 -0
  147. package/providers/maildim.com.js +38 -0
  148. package/providers/maildrop.cc.js +38 -0
  149. package/providers/mailinator.com.js +27 -0
  150. package/providers/mailnesia.com.js +41 -0
  151. package/providers/mailpoof.com.js +71 -0
  152. package/providers/mailsac.com.js +27 -0
  153. package/providers/mailswipe.net.js +37 -0
  154. package/providers/minimail.eu.org.js +27 -0
  155. package/providers/mintemail.com.js +49 -0
  156. package/providers/minuteinbox.com.js +35 -0
  157. package/providers/moakt.com.js +37 -0
  158. package/providers/mohmal.com.js +39 -0
  159. package/providers/muellmail.com.js +41 -0
  160. package/providers/mytemp.email.js +35 -0
  161. package/providers/mytrashmailer.com.js +38 -0
  162. package/providers/niepodam.pl.js +53 -0
  163. package/providers/nolog.email.js +38 -0
  164. package/providers/onetempmail.com.js +37 -0
  165. package/providers/open.js +41 -0
  166. package/providers/oxyemail.com.js +38 -0
  167. package/providers/phaantm.de.js +42 -0
  168. package/providers/poo.email.js +27 -0
  169. package/providers/sandvpn.com.js +49 -0
  170. package/providers/shitmail.me.js +38 -0
  171. package/providers/shitmail.org.js +38 -0
  172. package/providers/spamdecoy.net.js +38 -0
  173. package/providers/spamgourmet.com.js +29 -0
  174. package/providers/spoofmail.de.js +47 -0
  175. package/providers/t-mail.org.js +42 -0
  176. package/providers/temp-email.info.js +39 -0
  177. package/providers/temp-inbox.com.js +38 -0
  178. package/providers/temp-mail.io.js +36 -0
  179. package/providers/temp-mails.com.js +45 -0
  180. package/providers/temp.cab.js +39 -0
  181. package/providers/tempail.com.js +36 -0
  182. package/providers/tempinbox.xyz.js +38 -0
  183. package/providers/tempmail.altmails.com.js +37 -0
  184. package/providers/tempmail.cn.js +38 -0
  185. package/providers/tempmail.co.js +38 -0
  186. package/providers/tempmail.dev.js +35 -0
  187. package/providers/tempmail.ninja.js +35 -0
  188. package/providers/tempmail.plus.js +47 -0
  189. package/providers/tempmail.run.js +37 -0
  190. package/providers/tempmail.tel.js +38 -0
  191. package/providers/tempmailed.com.js +43 -0
  192. package/providers/tempmailo.com.js +35 -0
  193. package/providers/tempo-email.com.js +38 -0
  194. package/providers/tempo-mail.xyz.js +40 -0
  195. package/providers/temporary-email.com.js +35 -0
  196. package/providers/temporary-mail.net.js +42 -0
  197. package/providers/temporarymail.com.js +39 -0
  198. package/providers/tempos.email.js +38 -0
  199. package/providers/tempr.email.js +45 -0
  200. package/providers/temprmail.com.js +38 -0
  201. package/providers/tenmail.org.js +40 -0
  202. package/providers/thnen.com.js +25 -0
  203. package/providers/throwaway.io.js +39 -0
  204. package/providers/tmail.gg.js +36 -0
  205. package/providers/tmail.mmomekong.com.js +38 -0
  206. package/providers/tmailor.com.js +37 -0
  207. package/providers/tmailweb.com.js +39 -0
  208. package/providers/trash-mail.com.js +42 -0
  209. package/providers/trashmail.com.js +39 -0
  210. package/providers/trashmail.de.js +36 -0
  211. package/providers/trashmail.live.js +36 -0
  212. package/providers/trashmail.org.js +39 -0
  213. package/providers/trashmail.ws.js +42 -0
  214. package/providers/trashmails.com.js +38 -0
  215. package/providers/txen.de.js +48 -0
  216. package/providers/wegwerfemailadresse.com.js +43 -0
  217. package/providers/yopmail.com.js +37 -0
  218. package/providers/yopmail.fr.js +37 -0
  219. package/providers/yopmail.net.js +37 -0
  220. package/providers/yourmail.online.js +39 -0
  221. package/release.sh +26 -0
  222. package/repo-update.js +121 -0
  223. package/shared.js +559 -0
  224. package/test/doRequest.js +47 -0
  225. package/test/is_domain_banned.js +53 -0
  226. package/test/is_fakedomain.js +136 -0
  227. package/test/is_fakeemail.js +136 -0
  228. package/test/psl.js +58 -0
  229. package/test/repo_json_v1.js +30 -0
  230. package/test/repo_json_v2.js +41 -0
  231. package/test1.js +36 -0
  232. package/update-repo.sh +44 -0
  233. package/vars.js +16 -0
  234. package/CHARTS.md +0 -489
  235. package/LICENSE.md +0 -29
  236. package/examples/online.js +0 -16
  237. package/index.d.ts +0 -23
  238. package/index.js +0 -193
  239. package/json/data.json +0 -1
  240. package/json/data_version2.json +0 -1
  241. package/markdown/README.md +0 -16435
  242. package/txt/data.txt +0 -16435
@@ -0,0 +1,179 @@
1
+ const path = require('path')
2
+ const fs = require('fs')
3
+ var Table = require('easy-table')
4
+ const winston = require('winston')
5
+ const { getConfig, Sentry } = require('./config')
6
+ const chalk = require('chalk')
7
+ const vars = require('./vars')
8
+ const { softexit, wait } = require('mybase')
9
+ const { pullDomains, pullEventsProviders, pullEventsByProvider } = require('./shared')
10
+ const QuickChart = require('quickchart-js');
11
+ const argv = require('minimist')(process.argv.slice(2))
12
+ const md5 = require('md5')
13
+
14
+ function writeToFile(fn,content) {
15
+ // let fn = 'repo/markdown/README.md'
16
+ fs.writeFileSync(fn,content)
17
+ console.log(chalk.green(`+ file ${fn}`))
18
+ return true
19
+ }
20
+
21
+ function dailyEventGraphic(providerName,events) {
22
+ return new Promise(async function (resolve,reject) {
23
+ const myChart = new QuickChart()
24
+ let data={}
25
+ let fn = `success-rate-${md5(providerName)}.png`
26
+ let successrate={}
27
+ let labels=[]
28
+ let chartFile = path.join(__dirname,`/apiserver/public/img/dynamic/${fn}`)
29
+ if (fs.existsSync(chartFile)) {
30
+ // lets look if the file was recently rendered
31
+ let stats = fs.statSync(chartFile)
32
+ let mtimeMinutes = (new Date()-stats.mtime)/1000/60 // modified time in minutes
33
+ if (mtimeMinutes<200) {
34
+ console.log(`Chart for ${providerName} - taken from cache ${chartFile}`)
35
+ return resolve(fn)
36
+ }
37
+ }
38
+ await wait(2) // rate limit
39
+
40
+ for(let row of events) {
41
+ let dayString = new Date(row.t).toISOString().substring(0,10)
42
+ if (!data.hasOwnProperty(dayString))
43
+ {
44
+ data[dayString]={success:0,failed:0}
45
+ successrate[dayString]=0
46
+ labels.push(dayString)
47
+ }
48
+ if (row.result==='success') data[dayString].success++; else
49
+ data[dayString].failed++;
50
+ }
51
+ for(let date of Object.keys(data)) {
52
+ successrate[date]=((data[date].success/(data[date].failed+data[date].success)))*100
53
+ }
54
+
55
+ let chartConfig1 = {
56
+ type: 'bar',
57
+ data: { labels,
58
+ datasets: [{ label: `Success Rate - ${providerName} - %`,
59
+ backgroundColor: QuickChart.getGradientFillHelper('vertical', ['green', 'red']),
60
+ data: Object.keys(successrate).map(dayString=>successrate[dayString]) }
61
+ ] },
62
+ }
63
+ myChart.setConfig(chartConfig1)
64
+
65
+
66
+ await myChart.toFile(chartFile)
67
+ console.log(`Creating success-rate chart for ${providerName}`)
68
+ return resolve(fn)
69
+
70
+ // calcualte success rate
71
+
72
+ })
73
+ }
74
+ function dailyCoverageGraph(rows) {
75
+ return new Promise(async function (resolve,reject) {
76
+ const myChart = new QuickChart();
77
+ const myChart2 = new QuickChart();
78
+ let data={}
79
+ let labels=[]
80
+ let uniqueDomains=[]
81
+ let dataUniqueDomains={}
82
+ // let cnt = 10
83
+ for(let row of rows) {
84
+ let dayString = new Date(row.t).toISOString().substring(0,10)
85
+ if (!uniqueDomains.includes(row.domain)) uniqueDomains.push(row.domain)
86
+ if (!data.hasOwnProperty(dayString))
87
+ {
88
+ data[dayString]=[]
89
+ dataUniqueDomains[dayString]=uniqueDomains.length
90
+ labels.push(dayString)
91
+ }
92
+
93
+ if (!data[dayString].includes(row.domain)) data[dayString].push(row.domain)
94
+ // console.log(row)
95
+ // if (cnt<10) break
96
+ // cnt--
97
+ }
98
+ // console.log(dataUniqueDomains)
99
+ labels = labels.reverse()
100
+ let chartConfig2 = {
101
+ type: 'bar',
102
+ data: { labels,
103
+ datasets: [{ label: 'Unique Domains', data: Object.keys(dataUniqueDomains).map(dayString=>dataUniqueDomains[dayString]) }] },
104
+ }
105
+
106
+ let chartConfig1 = {
107
+ type: 'bar',
108
+ data: { labels,
109
+ datasets: [{ label: 'Daily Coverage', data: Object.keys(data).map(dayString=>data[dayString].length) }] },
110
+ }
111
+
112
+ // console.log(chartConfig1)
113
+ myChart.setConfig(chartConfig1)
114
+ myChart2.setConfig(chartConfig2)
115
+ await myChart.toFile(path.join(__dirname,'/apiserver/public/img/dynamic/chart1.png'))
116
+
117
+ await myChart2.toFile(path.join(__dirname,'/apiserver/public/img/dynamic/chart2.png'))
118
+
119
+ return resolve()
120
+ })
121
+ }
122
+
123
+ async function start() {
124
+ try {
125
+ await getConfig()
126
+ let events_providers = await pullEventsProviders(false,60)
127
+ let markdown3=``
128
+ for(let provider of events_providers) {
129
+ // break
130
+ // if (provider==='temporarymail.com')
131
+ {
132
+ try {
133
+ let r = await pullEventsByProvider(provider,60)
134
+ let chartfn = await dailyEventGraphic(provider,r)
135
+
136
+ markdown3+=`### ${provider}
137
+ ![Success Rate for ${provider}](https://fakefilter.net/public/img/dynamic/${chartfn})
138
+
139
+ `
140
+ }catch(err) {
141
+ Sentry.captureException(err)
142
+ console.log(err)
143
+ }
144
+ }
145
+ }
146
+
147
+ let domain_rows = await pullDomains(200,false)
148
+ let urls = await dailyCoverageGraph(domain_rows)
149
+
150
+ let markdown1=`
151
+ # Charts
152
+ ## All Providers
153
+ ### Daily Coverage
154
+ Amount of coverage, actions against all known Disposable Email Providers per Day
155
+ ![Daily Coverage](https://fakefilter.net/public/img/dynamic/chart1.png)
156
+
157
+ ### Daily Unique Disposable Domains
158
+ Number of unique known validated Disposable Domains in Total at given Day
159
+ ![Daily Disposable Domains](https://fakefilter.net/public/img/dynamic/chart1.png)
160
+
161
+ ## Success Rate
162
+ Per Provider Success Rate per Day - A lower Success rate might mean different things; counter measures from provider to be detected like capchas or even service downtime.
163
+
164
+ ${markdown3}
165
+ `
166
+ writeToFile(path.join(__dirname, 'repo/CHARTS.md'),markdown1)
167
+
168
+ console.log(urls)
169
+ process.exit(0)
170
+
171
+ }
172
+ catch(err) {
173
+ console.log(err)
174
+ Sentry.captureException(err)
175
+ softexit("",1)
176
+ }
177
+ }
178
+
179
+ start()
package/cleanup.js ADDED
@@ -0,0 +1,58 @@
1
+ const { Op } = require("sequelize")
2
+ const path = require('path')
3
+ const fs = require('fs')
4
+ const winston = require('winston')
5
+ const { getConfig, Sentry } = require('./config')
6
+ const chalk = require('chalk')
7
+ const vars = require('./vars')
8
+ const { softexit, wait } = require('mybase')
9
+ const { pullDomains, pullEventsProviders, pullEventsByProvider } = require('./shared')
10
+ const QuickChart = require('quickchart-js');
11
+ const argv = require('minimist')(process.argv.slice(2))
12
+
13
+ /*
14
+ we need to vacuum Harvested table to avoid excessive load times of domains
15
+ */
16
+
17
+ async function start() {
18
+ try {
19
+ await getConfig()
20
+ let rows = await pullDomains(10000)
21
+ // const progress = require('progressbar').create().step('combining')
22
+ // progress.setTotal(rows.length)
23
+ let memory = {}
24
+ let keep_provider_domains_per_day = 1 // never put this to 0 or lower!!! never
25
+ let deleted = 0
26
+ if (keep_provider_domains_per_day > 0)
27
+ for (let row of rows) {
28
+ // await wait(1 / 1000)
29
+ // progress.addTick()
30
+ // console.log(row,provider)
31
+ let day = new Date(row.t).toISOString().substring(0, 10)
32
+ let provider = row.provider.toLowerCase()
33
+ let domain = row.domain.toLowerCase()
34
+
35
+ if (!memory.hasOwnProperty(day)) memory[day] = {}
36
+ if (!memory[day].hasOwnProperty(provider)) memory[day][provider] = {}
37
+ if (!memory[day][provider].hasOwnProperty(domain)) memory[day][provider][domain] = 0
38
+ memory[day][provider][domain]++
39
+ if (memory[day][provider][domain] > keep_provider_domains_per_day) {
40
+ console.log(`day:${day} domain:${chalk.bold(domain)} provider:${chalk.yellow(provider)} found ${chalk.blue(memory[day][provider][domain])} times`)
41
+ await vars.models.Harvested.destroy({ where: { id: row.id } })
42
+ deleted++
43
+ }
44
+ }
45
+ console.log(`Deleted ${deleted} rows from Harvested to vacuum`)
46
+ process.exit(0)
47
+
48
+
49
+ }
50
+ catch (err) {
51
+ console.log(err)
52
+ Sentry.captureException(err)
53
+ await wait(5)
54
+ process.exit(0)
55
+ }
56
+ }
57
+
58
+ start()
package/config.js ADDED
@@ -0,0 +1,126 @@
1
+ const fs = require('fs')
2
+ const path = require('path')
3
+ const argv = require('minimist')(process.argv.slice(2))
4
+ const vars = require('./vars')
5
+ const { Sequelize } = require('sequelize')
6
+ var chalk = require('chalk')
7
+ var debug = require('debug')('fakefilter')
8
+ var { vaultFill,isLocal,canReadAndWrite } = require('mybase')
9
+ const { Harvested,initHarvested } = require('./models/harvested')
10
+ const { HarvestedClone,initHarvestedClone } = require('./models/harvested_clone')
11
+ const { Events,initEvents } = require('./models/events')
12
+
13
+
14
+ var vault = require("node-vault")({
15
+ apiVersion: 'v1', // default
16
+ endpoint: 'https://vault2.vpn1.com:8200',
17
+ token: 'd7130f39-8466-4444-b2b7-49c93da2c597'
18
+ })
19
+
20
+ var Sentry = require('@sentry/node');
21
+ Sentry.init({
22
+ dsn:'https://1074c423d608484e951455dc3c0d69bb@sentry.def24.com/25',
23
+ captureUnhandledRejections: true,
24
+ name: require('os').hostname()
25
+ })
26
+
27
+ function syncModel(modelName) {
28
+ return new Promise(async function (resolve, reject) {
29
+ console.log(`Synching model: ${modelName.name}`)
30
+ try {
31
+ await modelName.sync({ alter: true })
32
+ return resolve(true)
33
+ } catch (err) {
34
+ console.log(err)
35
+ console.log(chalk.red(`Exception by synching model: ${modelName.name}`))
36
+ process.exit(0)
37
+ }
38
+ })
39
+
40
+ }
41
+
42
+ function getConfig()
43
+ {
44
+ return new Promise(async function (resolve,reject) {
45
+ try {
46
+
47
+ await vaultFill(vault,config)
48
+ await canReadAndWrite(config.cache_folder,true)
49
+
50
+ var sequelize = new Sequelize(
51
+ config.mysqlserver.db,
52
+ config.mysqlserver.login,
53
+ config.mysqlserver.password, {
54
+ host: config.mysqlserver.host,
55
+ dialect: 'mysql',
56
+ logging: false
57
+ }
58
+ )
59
+ vars.sequelize = sequelize
60
+ await sequelize.authenticate()
61
+
62
+ // initialize
63
+ await initHarvested()
64
+ await initHarvestedClone()
65
+ await initEvents()
66
+
67
+
68
+
69
+ vars.models.Harvested = Harvested
70
+ vars.models.HarvestedClone = HarvestedClone
71
+ vars.models.Events = Events
72
+ vars.config = config
73
+
74
+ if (argv.sync) {
75
+ await syncModel(Harvested)
76
+ await syncModel(HarvestedClone)
77
+ await syncModel(Events)
78
+ process.exit(0)
79
+ }
80
+
81
+ resolve(config)
82
+ }
83
+ catch(err) {
84
+ reject(err)
85
+ }
86
+
87
+ })
88
+ }
89
+
90
+ var config = {
91
+ lockPort: 9994,
92
+ captcha_resolver_api:'7a1f7a34d2c261393528e62088a75515',
93
+ mysqlserver:{
94
+ db:'fakefilter',
95
+ login:'fakefilter',
96
+ password:'Q3p5hfxyrZLs',
97
+ host:'mix.def24.com'
98
+ },
99
+ apiserver: {
100
+ ip: '127.0.0.1',
101
+ port: 5520
102
+ },
103
+ cache_folder:path.join(__dirname,"cache"),
104
+ main_folder:__dirname,
105
+ ignore_domains : ['nytimes.com','yahoo.gr','outlook.sa','live.nl','yahoo.it','comcast.net','mail.ua','yahoo.com.br','outlook.es','aliyun.com','cps.edu','sina.cn','yahoo.ca',
106
+ 't-online.de','yahoo.co.jp','hotmail.es','yahoo.in','vip.qq.com','yandex.ua','139.com','hotmail.it','orange.fr','hotmail.de','yahoo.com.hk','gmx.at','live.co.uk','gmx.net','yahoo.co.in','yahoo.de','yahoo.es','me.com','o2.pl','gmx.fr','abv.bg','yahoo.co.id','wp.pl','i.ua','msn.com','live.fr','googlemail.com','gmx.com','yahoo.co.uk','yahoo.fr','naver.com','sina.com','yandex.com','gmx.de','aol.com','hotmail.co.uk','yahoo.com.tw','hotmail.fr','bk.ru','mail.com','web.de','outlook.fr','protonmail.com','ukr.net','live.com','icloud.com','126.com','yandex.ru','outlook.com','163.com','mail.ru','hotmail.com','yahoo.com','qq.com','gmail.com','zoho.com','cloudflare.com']
107
+ // vaultKey: 'vault@/secret/vault'
108
+ }
109
+
110
+ if (require.main===module) {
111
+ getConfig().then(c=>{
112
+ console.log('11')
113
+ if (!argv.sync) console.log(c)
114
+ console.log('22')
115
+ process.exit(0)
116
+ })
117
+ }
118
+
119
+
120
+
121
+
122
+ module.exports = {
123
+ Sentry,
124
+ getConfig,
125
+ config
126
+ }
package/events.js ADDED
@@ -0,0 +1,59 @@
1
+
2
+ const debug = require('debug')('fetch')
3
+ const winston = require('winston')
4
+ const { getConfig, Sentry } = require('./config')
5
+ const { promiseTimeout, getDomainPart,domainFromEmail, eventsOfProvider } = require('./shared')
6
+ const Table = require('easy-table')
7
+ const chalk = require('chalk')
8
+ const vars = require('./vars')
9
+ const argv = require('minimist')(process.argv.slice(2))
10
+ const { parseDomain, ParseResultType } = require("parse-domain")
11
+ const { CoadminService } = require('coadmin-lib')
12
+ const coadmin_service = new CoadminService('fakefilter/fetch')
13
+ const MAX_RUN_HOURS = 2
14
+
15
+
16
+ async function start() {
17
+ try {
18
+
19
+ let config = await getConfig()
20
+ let selectedProvider = false
21
+ if (argv._.length > 0)
22
+ selectedProvider=argv._[0]
23
+ if (!selectedProvider) {
24
+ console.log(chalk.blue('Usage:'))
25
+ console.log(`node events.js <provider>`)
26
+ process.exit(0)
27
+ }
28
+
29
+ let events = await eventsOfProvider(selectedProvider,7)
30
+ if (events) {
31
+ console.log(chalk.yellow(`${events.length} events found for ${selectedProvider}`))
32
+ var t = new Table()
33
+ let stats = {
34
+ success:0,
35
+ other:0,
36
+ failed:0
37
+ }
38
+ for(let event of events) {
39
+ // console.log(event)
40
+ t.cell("t",new Date(event.t).toISOString())
41
+ t.cell("event",event.event)
42
+ t.cell("result",event.result==='success' ? '✅ success' : '❌ '+event.result)
43
+ t.newRow()
44
+ if (event.result==='success') stats.success++; else
45
+ if (event.result==='failed') stats.failed++;
46
+ else stats.other++
47
+ }
48
+ console.log(t.toString())
49
+ console.log(`Total success: ${chalk.green(stats.success)} failed: ${chalk.red(stats.failed)} other: ${stats.other}`)
50
+ console.log(`This is only from last 7 days`)
51
+ }
52
+ process.exit(0)
53
+ } catch (err) {
54
+ console.log(err)
55
+ process.exit(0)
56
+ }
57
+ }
58
+
59
+ start()
package/fetch.js ADDED
@@ -0,0 +1,177 @@
1
+ const { tryLock } = require('tcp-mutex')
2
+ const debug = require('debug')('fetch')
3
+ const winston = require('winston')
4
+ const { getConfig } = require('./config')
5
+ const { promiseTimeout, getDomainPart,domainFromEmail, eventsOfProvider } = require('./shared')
6
+ const chalk = require('chalk')
7
+ const vars = require('./vars')
8
+ const argv = require('minimist')(process.argv.slice(2))
9
+ const { parseDomain, ParseResultType } = require("parse-domain")
10
+ const { CoadminService } = require('coadmin-lib')
11
+ const coadmin_service = new CoadminService('fakefilter/fetch')
12
+ const MAX_RUN_HOURS = 2
13
+
14
+ let succeed = 0
15
+ let failed = []
16
+
17
+
18
+ const logger = winston.createLogger({
19
+ level: 'info',
20
+ format: winston.format.combine(
21
+ winston.format.timestamp(),
22
+ winston.format.json(),
23
+ ),
24
+ defaultMeta: { script: 'fetch.js' },
25
+
26
+ transports: [
27
+ //
28
+ // - Write all logs with importance level of `error` or less to `error.log`
29
+ // - Write all logs with importance level of `info` or less to `combined.log`
30
+ //
31
+ new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
32
+ new winston.transports.File({ filename: 'logs/combined.log' }),
33
+ // log to Console too
34
+ // new winston.transports.Console()
35
+ ],
36
+ })
37
+
38
+ // load all providers/*.js
39
+ var glob = require('glob'), path = require('path')
40
+ const { array_shuffle } = require('mybase')
41
+ glob.sync('./providers/*.js').forEach(function (file) {
42
+ require(path.resolve(file));
43
+ })
44
+
45
+ // shuffle providers to randomize
46
+ vars.providers = array_shuffle(vars.providers)
47
+
48
+ async function processProvider(p, headless = true) {
49
+ return new Promise(async function (resolve, reject) {
50
+ logger.info(`Processing ${p.name}`)
51
+ debug(`Processing ${p.name}`)
52
+
53
+ if (p.hasOwnProperty('min_hours') && parseInt(p['min_hours'])>0) {
54
+ let min_hours = parseInt(p['min_hours'])
55
+ // if min_hours specified we rate limit the provider
56
+ let events = await eventsOfProvider(p.name,1)
57
+ if (events && events.length>0) {
58
+ let last_event = events[events.length-1]
59
+ let since_last_event = Date.now()-last_event.t
60
+ let since_last_event_hours = since_last_event/(60*60*1000)
61
+ if (since_last_event_hours<min_hours) {
62
+ // need to skip processing this provider
63
+ console.log(chalk.yellow(`Provider ${p.name} skipped due to min_hours(${min_hours} hours) rule`))
64
+ return resolve(true)
65
+ }
66
+ console.log(last_event,since_last_event_hours)
67
+ }
68
+ }
69
+
70
+ // console.log(chalk.yellow(p.name))
71
+ let initResult = await p.init()
72
+ debug(`Init done, result = ${initResult ? true : false}`)
73
+ // console.log(`init=`,initResult)
74
+ if (initResult === true) {
75
+ debug(`Calling start`)
76
+ let res = await p.start(headless)
77
+ debug(`Start result`, res)
78
+ if (res && res.hasOwnProperty('email')) {
79
+ await vars.models.Events.create({
80
+ provider: p.name,
81
+ t: Date.now(),
82
+ event: 'fetch',
83
+ result: 'success'
84
+ })
85
+ // console.log(res)
86
+ succeed++
87
+ // success
88
+ let emails = []
89
+ if (typeof res.email === 'string') emails.push(res.email);
90
+ else emails = res.email
91
+ for (let e of emails) {
92
+ let thedomain = p.randomSubdomain ? getDomainPart(domainFromEmail(e)) : domainFromEmail(e)
93
+ if (vars.config.ignore_domains.includes(thedomain)) {
94
+ console.log(chalk.red(`Ignored domain: ${thedomain} ignored`))
95
+ continue
96
+ }
97
+ console.log(chalk.green(`Provider ${p.name} - ${thedomain}`))
98
+
99
+ logger.info(`Provider ${p.name} - domain: ${thedomain}`)
100
+ await vars.models.Harvested.create({
101
+ provider: p.name,
102
+ t: Date.now(),
103
+ domain: thedomain
104
+ })
105
+ }
106
+ return resolve(true)
107
+ }
108
+ await vars.models.Events.create({
109
+ provider: p.name,
110
+ t:Date.now(),
111
+ event:'fetch',
112
+ result:'failed'
113
+ })
114
+ failed.push(p.name)
115
+ console.log(chalk.red(`Provider ${p.name} - failed`))
116
+ }
117
+ logger.error(`Provider ${p.name} - failed - initResult:${initResult ? 'true' : 'false'}`)
118
+ resolve(false)
119
+ })
120
+ }
121
+
122
+ async function start() {
123
+ try {
124
+ // make sure we never stuck
125
+ setTimeout(() => {
126
+ logger.error('MAX RUNTIME reached')
127
+ process.exit(0)
128
+ }, MAX_RUN_HOURS * 60 * 60 * 1000)
129
+
130
+ let config = await getConfig()
131
+
132
+
133
+ let selectedProvider = []
134
+ if (argv._.length > 0) {
135
+ selectedProvider.push(...argv._)
136
+ console.log(`Selected providers:`, selectedProvider.join(', '))
137
+ } else await tryLock(config.lockPort)
138
+
139
+ coadmin_service.report('started')
140
+
141
+ for (var p of vars.providers) {
142
+ if (selectedProvider.length > 0 && !selectedProvider.includes(p.name)) continue
143
+
144
+ try {
145
+ await promiseTimeout(120000, processProvider(p, argv.v ? false : true))
146
+ coadmin_service.report_every(1, 'fetching')
147
+ } catch (err) {
148
+ console.log(err)
149
+ }
150
+
151
+ // make sure to close the browser - attempt to protect the memory
152
+ if (vars.browsers.length > 0)
153
+ try {
154
+ let browser = vars.browsers.shift()
155
+ await browser.close()
156
+ coadmin_service.report_every(1, 'closing browsers')
157
+ } catch (e) {
158
+ console.log(e)
159
+ }
160
+ }
161
+
162
+ if (failed.length > 0)
163
+ console.log(chalk.bold(`Finished..`), chalk.green(`${succeed} succeed`), chalk.red(`${failed.length} failed`))
164
+ else
165
+ console.log(chalk.bold(`Finished..`), chalk.green(`${succeed} succeed`))
166
+ if (failed.length > 0)
167
+ console.log(chalk.red(`Failed providers:\n`), chalk.red(failed.join('\n')))
168
+
169
+ coadmin_service.report('stopped')
170
+ process.exit(0)
171
+ } catch (err) {
172
+ console.log(chalk.red(err))
173
+ process.exit(0)
174
+ }
175
+ }
176
+
177
+ start()
@@ -0,0 +1,37 @@
1
+ const { Sequelize, DataTypes, Model } = require('sequelize');
2
+ const vars = require('./../vars')
3
+
4
+ class Events extends Model { }
5
+
6
+ function initEvents() {
7
+ Events.init({
8
+ t: {
9
+ type: DataTypes.BIGINT,
10
+ allowNull: true
11
+ },
12
+ provider: {
13
+ type: DataTypes.STRING(255),
14
+ allowNull: false,
15
+ comment: 'service hostname, domainname'
16
+ },
17
+ event: {
18
+ type: DataTypes.STRING(32),
19
+ allowNull: false,
20
+ },
21
+ result: {
22
+ type: DataTypes.STRING(32),
23
+ allowNull: false,
24
+ },
25
+ }, {
26
+ // Other model options go here
27
+ sequelize:vars.sequelize, // We need to pass the connection instance
28
+ modelName: 'Events',// We need to choose the model name
29
+ tableName: 'events'
30
+ })
31
+ }
32
+
33
+
34
+ module.exports = {
35
+ Events,
36
+ initEvents
37
+ }
@@ -0,0 +1,45 @@
1
+ const { Sequelize, DataTypes, Model } = require('sequelize');
2
+ const vars = require('./../vars')
3
+
4
+ class Harvested extends Model { }
5
+
6
+ function initHarvested() {
7
+ Harvested.init({
8
+ t: {
9
+ type: DataTypes.BIGINT,
10
+ allowNull: true
11
+ },
12
+ provider: {
13
+ type: DataTypes.STRING(255),
14
+ allowNull: false,
15
+ comment: 'service hostname, domainname'
16
+ },
17
+ domain: {
18
+ type: DataTypes.STRING(255),
19
+ allowNull: false,
20
+ comment: 'domainname'
21
+ },
22
+ }, {
23
+ // Other model options go here
24
+ sequelize:vars.sequelize, // We need to pass the connection instance
25
+ modelName: 'Harvested',// We need to choose the model name
26
+ tableName: 'harvested',
27
+ indexes:[
28
+ {
29
+ fields:['provider'],
30
+ },
31
+ {
32
+ fields:['domain']
33
+ },
34
+ {
35
+ fields:['t']
36
+ },
37
+ ]
38
+ })
39
+ }
40
+
41
+
42
+ module.exports = {
43
+ Harvested,
44
+ initHarvested
45
+ }