1 | #!/usr/bin/env node
|
2 |
|
3 | const parseArgs = require('minimist')
|
4 | const axios = require('axios')
|
5 | const querystring = require('querystring')
|
6 | const HTMLParser = require('fast-html-parser');
|
7 |
|
8 | const DEFAULT_EXPIRE_DAYS = 7
|
9 | const DEFAULT_EXPIRE_VIEWS = 5
|
10 |
|
11 | const showHelp = (txt = '\r') => {
|
12 | console.log(`${txt}
|
13 | \rUsage:
|
14 | \r $ pwpush <password> [parameters] [options]
|
15 |
|
16 | \rParameters
|
17 | \r --days | -d Days until the password is deleted. Default is ${DEFAULT_EXPIRE_DAYS}
|
18 | \r --views | -v Number of visualizations until the password is deleted. Default is ${DEFAULT_EXPIRE_VIEWS}
|
19 |
|
20 | \rOptions
|
21 | \r --version Display package version.
|
22 | \r --help | -h Display help usage information.
|
23 |
|
24 | \rExample
|
25 | \r $ pwpush MySuperSecretPassword --days 1 --views 2
|
26 | `)
|
27 | process.exit(0)
|
28 | }
|
29 |
|
30 | const cli = parseArgs(process.argv.slice(2), {
|
31 | boolean: ['version', 'help'],
|
32 | alias: {
|
33 | d: 'days',
|
34 | v: 'views',
|
35 | h: 'help',
|
36 | },
|
37 | unknown: (value) => {
|
38 | if (process.argv.slice(2, 3)[0] !== value) {
|
39 | showHelp(`Unknown value: ${value}\n`)
|
40 | }
|
41 | },
|
42 | });
|
43 |
|
44 | if (!!cli.version) {
|
45 | console.log(`${require('./package.json').version}`)
|
46 | process.exit(0)
|
47 | }
|
48 | if (!!cli.help || !cli._[0]) {
|
49 | showHelp()
|
50 | }
|
51 |
|
52 | const password = cli._[0]
|
53 | const expire_days = cli.days || DEFAULT_EXPIRE_DAYS
|
54 | const expire_views = cli.views || DEFAULT_EXPIRE_VIEWS
|
55 |
|
56 | const reqData = querystring.stringify({
|
57 | 'password[payload]': password,
|
58 | 'password[expire_after_days]': expire_days,
|
59 | 'password[expire_after_views]': expire_views,
|
60 | 'password[deletable_by_viewer]': 'on',
|
61 | })
|
62 |
|
63 | const reqOptions = {
|
64 | method: 'post',
|
65 | url: 'https://pwpush.com/p',
|
66 | data: reqData,
|
67 | headers: {
|
68 | 'Content-Type': 'application/x-www-form-urlencoded',
|
69 | 'Accept': 'text/html,application/xhtml+xml,application/xml',
|
70 | },
|
71 | }
|
72 |
|
73 | const onResponseComplete = (response) => {
|
74 | const rawHtml = response.data
|
75 | const $dom = HTMLParser.parse(rawHtml)
|
76 |
|
77 | try {
|
78 | getResultText($dom)
|
79 | } catch(err) {
|
80 | console.error(`Something gets wrong!! ${err}`)
|
81 | }
|
82 | }
|
83 |
|
84 | const getResultText = ($dom) => {
|
85 | console.log(getExpirationDate($dom))
|
86 | console.log(getUrlValue($dom))
|
87 | }
|
88 |
|
89 | const getUrlValue = ($dom) => `> ${$dom.querySelector('#url').attributes.value}`
|
90 | const getExpirationDate = ($dom) => $dom.querySelectorAll('p')[3].text.replace(/\n/g, ' ').trim()
|
91 |
|
92 | axios(reqOptions)
|
93 | .then(onResponseComplete)
|
94 | .catch(console.error)
|
95 |
|
96 | module.exports = {
|
97 | password,
|
98 | expire_days,
|
99 | expire_views,
|
100 | reqOptions
|
101 | }
|