Ejemplo n.º 1
0
Archivo: cli.js Proyecto: wrangr/dn
internals.main = function (argv) {

  const cmd = argv._.shift();
  const domain = argv._.shift();
  const inspect = internals.createInspectFn(argv);
  const error = internals.createErrorFn(inspect);
  const done = internals.createDoneFn(inspect);


  if (argv.v || argv.version) {
    console.log(Pkg.version);
    process.exit(0);
  }
  else if (!cmd || !domain || argv.h || argv.help) {
    internals.help();
    process.exit(0);
  }


  if (cmd === 'parse') {
    return done(Psl.parse(domain));
  }

  if (typeof Dn[cmd] !== 'function') {
    return error(new Error('Unknown command.'));
  }


  Dn[cmd].apply(Dn, [domain].concat(argv._).concat((err, data) => {

    if (err) {
      error(err);
    }
    else {
      done(data);
    }
  }));
};
Biskviit.prototype.set = function(cookieStr, url) {
    var urlparts = urllib.parse(url || '');
    var cookie = this.parse(cookieStr);

    if (cookie.domain) {
        let domain = cookie.domain.replace(/^\./, '');

        // do not allow generic TLDs, except unlisted
        if (psl.parse(domain).listed && !psl.isValid(domain)) {
            cookie.domain = urlparts.hostname;
        }

        // do not allow cross origin cookies
        if (
            // can't be valid if the requested domain is shorter than current hostname
            urlparts.hostname.length < domain.length ||

            // prefix domains with dot to be sure that partial matches are not used
            ('.' + urlparts.hostname).substr(-domain.length + 1) !== ('.' + domain)) {
            cookie.domain = urlparts.hostname;
        }
    } else {
        cookie.domain = urlparts.hostname;
    }

    if (!cookie.path) {
        cookie.path = this.getPath(urlparts.pathname);
    }

    // if no expire date, then use sessionTimeout value
    if (!cookie.expires) {
        cookie.expires = new Date(Date.now() + (Number(this.options.sessionTimeout || SESSION_TIMEOUT) || SESSION_TIMEOUT) * 1000);
    }

    return this.add(cookie);
};
Ejemplo n.º 3
0
  async maybeSetUpDomain(alias, domains, currentTeam, user) {
    const gracefulExit = () => {
      this.close()
      domains.close()
      // eslint-disable-next-line unicorn/no-process-exit
      process.exit()
    }
    // Make alias lowercase
    alias = alias.toLowerCase()

    // Trim leading and trailing dots
    // for example: `google.com.` => `google.com`
    alias = alias.replace(/^\.+/, '').replace(/\.+$/, '')
    // Evaluate the alias
    if (/\./.test(alias)) {
      alias = toHost(alias)
    } else {
      if (this._debug) {
        console.log(`> [debug] suffixing \`.now.sh\` to alias ${alias}`)
      }

      alias = `${alias}.now.sh`
    }

    if (!domainRegex.test(alias)) {
      const err = new Error(`Invalid alias "${alias}"`)
      err.userError = true
      throw err
    }

    if (!/\.now\.sh$/.test(alias)) {
      console.log(`> ${chalk.bold(chalk.underline(alias))} is a custom domain.`)

      let stopSpinner = wait('Fetching domain info')

      let elapsed = stamp()
      const parsed = publicSuffixList.parse(alias)
      const pricePromise = domains.price(parsed.domain).catch(() => {
        // Can be safely ignored
      })
      const canBePurchased = await domains.status(parsed.domain)
      const aliasParam = param(parsed.domain)
      let price
      let period

      stopSpinner()

      if (canBePurchased) {
        try {
          const json = await pricePromise
          price = json.price
          period = json.period
        } catch (err) {
          // Can be safely ignored
        }
      }
      if (canBePurchased && price && period) {
        const periodMsg = `${period}yr${period > 1 ? 's' : ''}`
        info(
          `The domain ${aliasParam} is ${chalk.italic(
            'available'
          )} to buy under ${chalk.bold(
            (currentTeam && currentTeam.slug) || user.username || user.email
          )}! ${elapsed()}`
        )
        const confirmation = await promptBool(
          `Buy now for ${chalk.bold(`$${price}`)} (${periodMsg})?`
        )
        eraseLines(1)
        if (!confirmation) {
          info('Aborted')
          gracefulExit()
        }
        elapsed = stamp()
        stopSpinner = wait('Purchasing')
        let domain
        try {
          domain = await domains.buy(parsed.domain)
        } catch (err) {
          stopSpinner()
          treatBuyError(err)
          gracefulExit()
        }

        stopSpinner()
        success(`Domain purchased and created ${uid(domain.uid)} ${elapsed()}`)

        stopSpinner = wait('Verifying nameservers')

        let domainInfo

        try {
          domainInfo = await this.setupDomain(parsed.domain)
        } catch (err) {
          if (this._debug) {
            console.log('> [debug] Error while trying to setup the domain', err)
          }
        }

        stopSpinner()

        if (!domainInfo.verified) {
          const tld = param(`.${parsed.tld}`)
          console.error(error(
            'The nameservers are pending propagation. Please try again shortly'
          ))
          info(
            `The ${tld} servers might take some extra time to reflect changes`
          )
          gracefulExit()
        }
      }

      console.log(
        `> Verifying the DNS settings for ${chalk.bold(
          chalk.underline(alias)
        )} (see ${chalk.underline('https://zeit.world')} for help)`
      )

      const _domain = publicSuffixList.parse(alias).domain
      let _domainInfo
      try {
        _domainInfo = await this.getDomain(_domain)
      } catch (err) {
        if (err.status === 404) {
          // It's ok if the domain was not found – we'll add it when creating
          // the alias
        } else {
          throw err
        }
      }
      const domainInfo =
        _domainInfo && !_domainInfo.error ? _domainInfo : undefined
      const { domain, nameservers } = domainInfo
        ? { domain: _domain }
        : await this.getNameservers(alias)
      const usingZeitWorld = domainInfo
        ? !domainInfo.isExternal
        : isZeitWorld(nameservers)
      let skipDNSVerification = false

      if (this._debug) {
        if (domainInfo) {
          console.log(
            `> [debug] Found domain ${domain} with verified:${domainInfo.verified}`
          )
        } else {
          console.log(
            `> [debug] Found domain ${domain} and nameservers ${nameservers}`
          )
        }
      }

      if (!usingZeitWorld && domainInfo) {
        if (domainInfo.verified) {
          skipDNSVerification = true
        } else if (domainInfo.uid) {
          const { verified, created } = await this.setupDomain(domain, {
            isExternal: true
          })
          if (!(created && verified)) {
            const e = new Error(
              `> Failed to verify the ownership of ${domain}, please refer to 'now domain --help'.`
            )
            e.userError = true
            throw e
          }
          console.log(
            `${chalk.cyan('> Success!')} Domain ${chalk.bold(
              chalk.underline(domain)
            )} verified`
          )
        }
      }

      try {
        if (!skipDNSVerification) {
          await this.verifyDomain(alias)
        }
      } catch (err) {
        if (err.userError) {
          // A user error would imply that verification failed
          // in which case we attempt to correct the dns
          // configuration (if we can!)
          try {
            if (usingZeitWorld) {
              console.log(
                `> Detected ${chalk.bold(
                  chalk.underline('zeit.world')
                )} nameservers! Configuring records.`
              )
              const record = alias.substr(0, alias.length - domain.length)

              // Lean up trailing and leading dots
              const _record = record.replace(/^\./, '').replace(/\.$/, '')
              const _domain = domain.replace(/^\./, '').replace(/\.$/, '')

              if (_record === '') {
                await this.setupRecord(_domain, '*')
              }

              await this.setupRecord(_domain, _record)

              this.recordSetup = true
              console.log('> DNS Configured! Verifying propagation…')

              try {
                await this.retry(() => this.verifyDomain(alias), {
                  retries: 10,
                  maxTimeout: 8000
                })
              } catch (err2) {
                const e = new Error(
                  '> We configured the DNS settings for your alias, but we were unable to ' +
                    "verify that they've propagated. Please try the alias again later."
                )
                e.userError = true
                throw e
              }
            } else {
              console.log(
                `> Resolved IP: ${err.ip
                  ? `${chalk.underline(err.ip)} (unknown)`
                  : chalk.dim('none')}`
              )
              console.log(
                `> Nameservers: ${nameservers && nameservers.length
                  ? nameservers.map(ns => chalk.underline(ns)).join(', ')
                  : chalk.dim('none')}`
              )
              throw err
            }
          } catch (e) {
            if (e.userError) {
              throw e
            }

            throw err
          }
        } else {
          throw err
        }
      }

      if (!usingZeitWorld && !skipDNSVerification) {
        if (this._debug) {
          console.log(
            `> [debug] Trying to register a non-ZeitWorld domain ${domain} for the current user`
          )
        }

        const { uid, verified, created } = await this.setupDomain(domain, {
          isExternal: true
        })
        if (!(created && verified)) {
          const e = new Error(
            `> Failed to verify the ownership of ${domain}, please refer to 'now domain --help'.`
          )
          e.userError = true
          throw e
        }
        console.log(
          `${chalk.cyan('> Success!')} Domain ${chalk.bold(
            chalk.underline(domain)
          )} ${chalk.dim(`(${uid})`)} added`
        )
      }

      console.log(`> Verification ${chalk.bold('OK')}!`)
    }
    return alias
  }
Ejemplo n.º 4
0
const psl = require('psl')

const getDomain = {
  get (url) {
    const origin = getDomain.origin(url)
    const res = psl.get(origin)
    return res
  },
  tld (url) {
    const origin = getDomain.origin(url)
    const res = psl.parse(origin)
    return res.tld
  },
  hostname (url) {
    const spliturl = url.indexOf('://') > -1 ? url.split('/')[2] : url.split('/')[0]
    return spliturl.split(':')[0]
  },
  origin (url) {
    const hosturl = getDomain.hostname(url)
    return hosturl.slice(0, 4) === 'www.'? hosturl.slice(4) : hosturl
  },
  clean (url) {
    const trimurl = url.trim()
    const spliturl = url.split('#')[0]
    return spliturl.slice(-1) === '/'? spliturl.slice(0,-1) : trimurl
  },
  uniq (url) {
    const cleanurl = getDomain.clean(url)
    const spliturl = cleanurl.split('://')[1]
    return spliturl !== undefined && spliturl.slice(0, 4) === 'www.'? spliturl.slice(4) : spliturl
  }
function defaultOrganizationResolver(req, res, next) {
  var client = req.app.get('stormpathClient');
  var application = req.app.get('stormpathApplication');
  var logger = req.app.get('stormpathLogger');
  var config = req.app.get('stormpathConfig');
  var cacheTtl = config.cacheOptions && config.cacheOptions.ttl !== undefined
    ? config.cacheOptions.ttl
    : config.client.cacheManager.defaultTtl;
  var web = config.web;

  var currentHost = parseDomain(helpers.getHost(req, true));

  function resolveOrganizationByHref(href, callback) {
    client.getOrganization(href, callback);
  }

  function resolveOrganizationByNameKey(nameKey, callback) {
    var organizationHref = organizationNameKeyToHrefMap.getCachedItem(nameKey, cacheTtl);

    if (organizationHref) {
      return resolveOrganizationByHref(organizationHref, callback);
    }

    client.getOrganizations({ nameKey: nameKey }, function (err, collection) {
      if (err) {
        return callback(err);
      }

      var organization = collection.items[0];

      if (organization) {
        organizationNameKeyToHrefMap.setCachedItem(nameKey, organization.href);
      }

      callback(null, organization);
    });
  }

  // Once we have an organization, attach it to the request and
  // continue processing the middleware pipeline.
  function continueWithOrganization(organization) {
    req.organization = organization;
    next();
  }

  // Strategy which tries to resolve an organization from a sub domain.
  // If this step fails then it falls back to resolving an organization from an access token cookie.
  function continueWithSubDomainStrategy() {

    if (web.multiTenancy.strategy === 'subdomain') {

      if ((web.domainName === currentHost.domain) && currentHost.subdomain) {
        return resolveOrganizationByNameKey(currentHost.subdomain, function (err, organization) {

          if (err) {
            return next(err);
          }

          if (!organization) {
            return next();
          }

          helpers.assertOrganizationIsMappedToApplication(organization, application, function (err, isMappedToApp) {
            if (err) {
              return next(err);
            }

            if (isMappedToApp) {
              return continueWithOrganization(organization);
            }

            logger.info('The organization "' + organization.name + '" is not mapped to this application, it will not be used.');

            next();
          });
        });
      }

    }

    next();
  }

  continueWithSubDomainStrategy();
}
Ejemplo n.º 6
0
                    .on("data", function (row) {
                        if (row[0] === 'CBO') {
                            return;
                        }
                        var rs = {
                            organization: row[0],
                            website: row[1],
                            services: row[2],
                            grade: row[3],
                            aurburn: row[4] === 'x' ? 'Aurburn' : null,
                            federal_way: row[5] === 'x' ? 'Federal Way' : null,
                            highline: row[6] === 'x' ? 'Highline' : null,
                            kent: row[7] === 'x' ? 'Kent' : null,
                            renton: row[8] === 'x' ? 'Renton' : null,
                            seattle: row[9] === 'x' ? 'Seattle' : null,
                            tukwila: row[10] === 'x' ? 'Tukwila' : null,
                            platforms: row[11],
                            contact: row[12],
                            email: row[13],
                            confirmed: row[14],
                            notes: row[15]
                        };

                        var parsed = psl.parse(rs.website);
                        rs.url = parsed.sld;
                        rs.username = rs.url;

                        if (!rs.url || !rs.email) {
                            return;
                        }
                        var createOrg = function (err, user, permission) {
                            if (err) {
                                return console.log('Error: ' + err);
                            }
                            if (!user) {
                                return console.log('User empty');
                            }
                            var newOrg = {
                                name: rs.organization,
                                url: rs.url + '.' + config.get('HOST'),
                                website: rs.website,
                                description: rs.notes,
                                addresses: []
                            };
                            var addrs = null;
                            var addresses = [];
                            if (rs.aurburn && (addrs = self.city(rs.aurburn))) {
                                addresses.push(addrs);
                            }
                            if (rs.federal_way && (addrs = self.city(rs.federal_way))) {
                                addresses.push(addrs);
                            }
                            if (rs.kent && (addrs = self.city(rs.kent))) {
                                addresses.push(addrs);
                            }
                            if (rs.renton && (addrs = self.city(rs.renton))) {
                                addresses.push(addrs);
                            }
                            if (rs.seattle && (addrs = self.city(rs.seattle))) {
                                addresses.push(addrs);
                            }
                            if (rs.tukwila && (addrs = self.city(rs.tukwila))) {
                                addresses.push(addrs);
                            }

                            /**
                             * Start insert new record
                             */
                            newOrg.addresses = addresses;
                            Organization.findOneAndUpdate({name: newOrg.name}, {$set: newOrg}, {
                                safe: true,
                                upsert: true,
                                new: true
                            }, function (err, org) {
                                if (err) {
                                    return console.log(err);
                                }
                                if (org) {

                                    var userPermission = {
                                        organization: org._id,
                                        permissions: [ { model: 'Student', operation: '*', allow: 'all'} ],
                                        students: []
                                    };
                                    if (err) {
                                        return console.log(err);
                                    }
                                    var newProgram = {
                                        name: org.name
                                    };

                                    Program.findOneAndUpdate({name: newOrg.name}, {$set: newProgram}, {
                                        safe: true,
                                        upsert: true,
                                        new: true
                                    }, function (err, program) {
                                        if (err) {
                                            return console.log(err);
                                        }
                                        if (userPermission) {
                                            addStudents(org, newProgram);
                                            User.findOneAndUpdate({email: user.email}, { $push: { permissions: userPermission }}, {safe: true, upsert: true}, function (err, usr) {
                                               if (err) {
                                                   return console.log(err);
                                               }
                                               done(org);
                                            });
                                        }
                                    });
                                }
                            });
                        };

                        var name = rs.contact.split(" ");

                        var newUser = {
                            email: rs.email,
                            first_name: '',
                            middle_name: '',
                            last_name: '',
                            password: '******',
                            username: rs.username
                        };

                        if (name.length > 2) {
                            newUser.first_name = name[0];
                            newUser.middle_name = name[1];
                            var lastNames = [];
                            for (var n = 2; n < name.length; n++) {
                                lastNames.push(name[n]);
                            }
                            newUser.last_name = lastNames.join(" ");
                        } else {
                            newUser.first_name = name[0];
                            newUser.last_name = name[1];
                        }

                        //User.findOneAndUpdate({email: rs.email}, { $set: newUser }, { upsert: true, new: true },  function (err, user) {
                        //    if (err) return console.log(err);
                        //    //if(user) return console.log('User was empty => ', user, ' => ', newUser);
                        //    createOrg(err, user, permission);
                        //});
                        var user = new User(newUser);
                        user.save(function (err) {
                            if (err) {
                                 console.log((err.code && err.code === 11000) ? {
                                     code: err.code,
                                     message: 'User already exists'
                                 } : err );

                            } else {
                                console.log({code: 0, message: 'New users added!'});
                            }
                            createOrg(false, user, permission);
                        });
                    })
Ejemplo n.º 7
0
async function run({ token, sh: { currentTeam, user } }) {
  const domain = new NowDomains({ apiUrl, token, debug, currentTeam })
  const args = argv._.slice(1)

  switch (subcommand) {
    case 'ls':
    case 'list': {
      if (args.length !== 0) {
        console.error(error('Invalid number of arguments'))
        return exit(1)
      }

      const start_ = new Date()
      const domains = await domain.ls()
      domains.sort((a, b) => new Date(b.created) - new Date(a.created))
      const current = new Date()
      const header = [
        ['', 'domain', 'dns', 'verified', 'created'].map(s => chalk.dim(s))
      ]
      const out =
        domains.length === 0
          ? null
          : table(
              header.concat(
                domains.map(domain => {
                  const ns = domain.isExternal ? 'external' : 'zeit.world'
                  const url = chalk.bold(domain.name)
                  const time = chalk.gray(
                    ms(current - new Date(domain.created)) + ' ago'
                  )
                  return ['', url, ns, domain.verified, time]
                })
              ),
              {
                align: ['l', 'l', 'l', 'l', 'l'],
                hsep: ' '.repeat(2),
                stringLength: strlen
              }
            )

      const elapsed_ = ms(new Date() - start_)
      console.log(
        `> ${domains.length} domain${domains.length === 1
          ? ''
          : 's'} found under ${chalk.bold(
          (currentTeam && currentTeam.slug) || user.username || user.email
        )} ${chalk.gray(`[${elapsed_}]`)}`
      )

      if (out) {
        console.log('\n' + out + '\n')
      }

      break
    }
    case 'rm':
    case 'remove': {
      if (args.length !== 1) {
        console.error(error('Invalid number of arguments'))
        return exit(1)
      }

      const _target = String(args[0])
      if (!_target) {
        const err = new Error('No domain specified')
        err.userError = true
        throw err
      }

      const _domains = await domain.ls()
      const _domain = findDomain(_target, _domains)

      if (!_domain) {
        const err = new Error(
          `Domain not found by "${_target}". Run ${chalk.dim(
            '`now domains ls`'
          )} to see your domains.`
        )
        err.userError = true
        throw err
      }

      try {
        const confirmation = (await readConfirmation(
          domain,
          _domain
        )).toLowerCase()
        if (confirmation !== 'y' && confirmation !== 'yes') {
          console.log('\n> Aborted')
          process.exit(0)
        }

        const start = new Date()
        await domain.rm(_domain)
        const elapsed = ms(new Date() - start)
        console.log(
          `${chalk.cyan('> Success!')} Domain ${chalk.bold(
            _domain.uid
          )} removed [${elapsed}]`
        )
      } catch (err) {
        console.error(error(err))
        exit(1)
      }
      break
    }
    case 'add':
    case 'set': {
      if (args.length !== 1) {
        console.error(error('Invalid number of arguments'))
        return exit(1)
      }
      const name = String(args[0])

      const parsedDomain = psl.parse(name)
      if (parsedDomain.subdomain) {
        const msg =
          `You are adding "${name}" as a domain name which seems to contain a subdomain part "${parsedDomain.subdomain}".\n` +
          '  This is probably wrong unless you really know what you are doing.\n' +
          `  To add the root domain instead please run: ${chalk.cyan(
            'now domain add ' +
              (argv.external ? '-e ' : '') +
              parsedDomain.domain
          )}\n` +
          `  Continue adding "${name}" as a domain name?`
        if (!await promptBool(msg)) {
          return exit(1)
        }
      }

      const start = new Date()
      const { uid, code, created, verified } = await domain.add(
        name,
        argv.force,
        argv.external
      )
      const elapsed = ms(new Date() - start)
      if (created) {
        console.log(
          `${chalk.cyan('> Success!')} Domain ${chalk.bold(
            chalk.underline(name)
          )} ${chalk.dim(`(${uid})`)} added [${elapsed}]`
        )
      } else if (verified) {
        console.log(
          `${chalk.cyan('> Success!')} Domain ${chalk.bold(
            chalk.underline(name)
          )} ${chalk.dim(`(${uid})`)} verified [${elapsed}]`
        )
      } else if (code === 'not_modified') {
        console.log(
          `${chalk.cyan('> Success!')} Domain ${chalk.bold(
            chalk.underline(name)
          )} ${chalk.dim(`(${uid})`)} already exists [${elapsed}]`
        )
      } else {
        console.log(
          '> Verification required: Please rerun this command after some time'
        )
      }
      break
    }
    case 'buy': {
      await buy({
        domains: domain,
        args,
        currentTeam,
        user,
        coupon: argv.coupon
      })
      break
    }
    default:
      console.error(error('Please specify a valid subcommand: ls | add | rm'))
      help()
      exit(1)
  }

  domain.close()
}