• Stars
    star
    232
  • Rank 167,337 (Top 4 %)
  • Language
    JavaScript
  • License
    Apache License 2.0
  • Created over 5 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Cypress authentication flows using social network providers

cypress-social-logins

cypress authentication flows using social network providers

npm version license downloads build Known Vulnerabilities Security Responsible Disclosure

** ⚠️ DISCLAIMER and LIMITATIONS ⚠️ **

This plugin doesn't work well in a CI environment, due to the anti-fraud detection mechanisms employed by the likes of Google, GitHub etc. Why? If you attempt to login from a CI machine which has different IPs, geolocation and other fingerprint identification which the account you use isn't normally attempting a login from, then this will trigger Multi Factor Authentication, CAPTCHA, or other means of confirming the identity. When those extra steps are needed, this plugin doesn't work well around them.

About

This Cypress library makes it possible to perform third-party logins (think oauth) for services such as GitHub, Google or Facebook.

It does so by delegating the login process to a puppeteer flow that performs the login and returns the cookies for the application under test, so they can be set by the calling Cypress flow for the duration of the test.

Support

Supported identity providers:

Provider Plugin name
Google GoogleSocialLogin
GitHub GitHubSocialLogin
Microsoft MicrosoftSocialLogin
Amazon AmazonSocialLogin
Facebook FacebookSocialLogin
Twitter TBD
LinkedIn TBD

Usage

  1. Call the declared task with a set of options for the social login flow interaction
  2. Set the cookies for the test flow with the help of Cypress.Cookies.defaults
  3. Copy over all or some (or none) of the local & session storage objects from puppeteer to local instance. Note: If you want to persist localStorage through all tests, see localStorage Troubleshooting below.
cy.clearCookies()

return cy.task('GoogleSocialLogin', socialLoginOptions).then(results => {
  results['cookies'].forEach(cookie => {
    if (cookie.domain.includes(cookieName)) {
      cy.setCookie(cookie.name, cookie.value, {
        domain: cookie.domain,
        expiry: cookie.expires,
        httpOnly: cookie.httpOnly,
        path: cookie.path,
        secure: cookie.secure
      })
    }
  })
  cy.window().then(window => {
    Object.keys(results.ssd).forEach(key => window.sessionStorage.setItem(key, results.ssd[key]))
    Object.keys(results.lsd).forEach(key => window.localStorage.setItem(key, results.lsd[key]))
  })
})

Options passed to the task include:

Option name Description Example
username
password
loginUrl The URL for the login page that includes the social network buttons https://www.example.com/login
loginUrlCredentials Basic Authentication credentials for the loginUrl {username: user, password: demo}
args string array which allows providing further arguments to puppeteer ['--no-sandbox', '--disable-setuid-sandbox']
headless Whether to run puppeteer in headless mode or not true
logs Whether to log interaction with the loginUrl website & cookie data false
loginSelector A selector on the page that defines the specific social network to use and can be clicked, such as a button or a link 'a[href="/auth/auth0/google-oauth2"]'
postLoginSelector A selector on the post-login page that can be asserted upon to confirm a successful login '.account-panel'
preLoginSelector a selector to find and click on before clicking on the login button (useful for accepting cookies) '.ind-cbar-right button'
preLoginSelectorIframe string a selector to find a iframe for the preLoginSelector 'div#consent iframe'
preLoginSelectorIframeDelay number delay a specific ms after click on the preLoginSelector. Pass a falsy (false, 0, null, undefined, '') to avoid completely. 2000
otpSecret Secret for generating a one-time password based on OTPLIB 'SECRET'
loginSelectorDelay delay a specific amount of time before clicking on the login button, defaults to 250ms. Pass a boolean false to avoid completely. 100
getAllBrowserCookies Whether to get all browser cookies instead of just ones with the domain of loginUrl true
isPopup boolean, is your google auth displayed like a popup true
popupDelay number, delay a specific milliseconds before popup is shown. Pass a falsy (false, 0, null, undefined, '') to avoid completely 2000
cookieDelay number, delay a specific milliseconds before get a cookies. Pass a falsy (false, 0, null,undefined,'') to avoid completely 100
postLoginClick Optional: a selector to find and click on after clicking on the login button #idSIButton9
usernameField Required for CustomizedLogin: string, a selector for the username field
usernameSubmitBtn Optional for CustomizedLogin: string, a selector for the username button
passwordField Required for CustomizedLogin: string, a selector for the password field
passwordSubmitBtn Optional for CustomizedLogin: string, a selector for password submit button
screenshotOnError Optional: will grab a screen shot if an error occurs on the username, password, or post-login page and saves in the Cypress screenshots folder. false
additionalSteps Optional: function, to define any additional steps which may be required after executing functions for username and password, such as answering security questions, PIN, or anything which may be required to fill out after username and password process. The function and this property must be defined or referenced from index.js for Cypress Plugins directory. async function moreSteps({page, options} = {}) { await page.waitForSelector('#pin_Field') await page.click('#pin_Field') }
trackingConsentSelectors Optional: selectors to find and click on after clicking the login button, but before entering details on the third-party site (useful for accepting third-party cookies e.g. Facebook login). Provide multiple if wanting to accept only essential cookies and it requires multiple clicks ['button[data-testid="cookie-policy-dialog-manage-button"]', 'button-data-testid="cookie-policy-manage-dialog-accept-button"]']
preVisitLoginUrlSetCookies Optional: array of cookies to set before visiting the loginUrl [{name: 'enable-social-login', value: 'true', domain: '.cypress.io'}]

Install

Install the plugin as a dependency

npm install --save-dev cypress-social-logins

Import the plugin

Import the cypress-social-logins plugin definition for the specific social network login you are interested of, and declare a task that performs the login.

Example:

const {GoogleSocialLogin} = require('cypress-social-logins').plugins

module.exports = (on, config) => {
  on('task', {
    GoogleSocialLogin: GoogleSocialLogin
  })
}

Using the social login

Once the Cypress task is defined we can expose a test case that makes use of it. The task will accept an options object with the username, password and other configurations that need to be specified so that the task can navigate through the page properly.

Once the task has completed it will return the list of cookies from the new page. Most likely these cookies need to be set for the rest of the sessions in the test flow, hence the example code showing the case for Cypress.Cookies.defaults.

describe('Login', () => {
  it('Login through Google', () => {
    const username = Cypress.env('googleSocialLoginUsername')
    const password = Cypress.env('googleSocialLoginPassword')
    const loginUrl = Cypress.env('loginUrl')
    const cookieName = Cypress.env('cookieName')
    const socialLoginOptions = {
      username: username,
      password: password,
      loginUrl: loginUrl,
      headless: true,
      logs: false,
      loginSelector: '[href="/auth/auth0/google-oauth2"]',
      postLoginSelector: '.account-panel'
    }

    return cy.task('GoogleSocialLogin', socialLoginOptions).then(({cookies}) => {
      cy.clearCookies()

      const cookie = cookies.filter(cookie => cookie.name === cookieName).pop()
      if (cookie) {
        cy.setCookie(cookie.name, cookie.value, {
          domain: cookie.domain,
          expiry: cookie.expires,
          httpOnly: cookie.httpOnly,
          path: cookie.path,
          secure: cookie.secure
        })

        Cypress.Cookies.defaults({
          preserve: cookieName
        })
      }
    })
  })
})

Defining custom login

1 Alternative When you need to use social logins which aren't supported by this plugin you can make use of the baseLoginConnect() function that is exported as part of the plugin like so:

const {baseLoginConnect} = require('cypress-social-logins').plugins

module.exports = (on, config) => {
  on('task', {
    customLogin(options) {
      async function typeUsername({page, options} = {}) {
        await page.waitForSelector('input[id="username"]')
        await page.type('input[id="username"]', options.username)
      }

      async function typePassword({page, options} = {}) {
        await page.waitForSelector('input[id="password"]')
        await page.type('input[id="password"]', options.password)
        await page.click('button[id="_submit"]')
      }

      return baseLoginConnect(typeUsername, typePassword, null, options)
    }
  })
}

2 Alternative You can also use the CustomizedLogin function and just provide the selectors inside the options object to pass into the function. Properties usernameField and passwordField are required, otherwise the function will throw an Error with a message for requirements. Properties usernameSubmitBtn and passwordSubmitBtn are optional. (It is recommended to define passwordSubmitBtn to help proceed login flow.)

Test file -

describe('Login', () => {
  it('Login through Google', () => {
    const username = Cypress.env('googleSocialLoginUsername')
    const password = Cypress.env('googleSocialLoginPassword')
    const loginUrl = Cypress.env('loginUrl')
    const cookieName = Cypress.env('cookieName')
    const socialLoginOptions = {
      username,
      password,
      loginUrl,
      usernameField: '#input_username',
      passwordField: '#input_password',
      passwordSubmitBtn: '#login_btn_sign',
      headless: true,
      logs: false,
      loginSelector: '[href="/auth/auth0/google-oauth2"]',
      postLoginSelector: '.account-panel'
    }

    return cy.task('GoogleSocialLogin', socialLoginOptions).then(({cookies}) => {
      cy.clearCookies()

      const cookie = cookies.filter(cookie => cookie.name === cookieName).pop()
      if (cookie) {
        cy.setCookie(cookie.name, cookie.value, {
          domain: cookie.domain,
          expiry: cookie.expires,
          httpOnly: cookie.httpOnly,
          path: cookie.path,
          secure: cookie.secure
        })

        Cypress.Cookies.defaults({
          preserve: cookieName
        })
      }
    })
  })
})

Plugns -

/**
 * @type {Cypress.PluginConfig}
 */
const {CustomizedLogin} = require('cypress-social-logins').plugins

module.exports = (on, config) => {
  // `on` is used to hook into various events Cypress emits
  // `config` is the resolved Cypress config
  on('task', {
    customizedLogin: options => {
      return CustomizedLogin(options)
    }
  })
}

Using AmazonSocialLogin with OneTimePassword

You need an Amazon account with activated 2fa. The QR-Code is provided by Amazon and contains a SECRET to calculate an OTP. This is mandatory due the enforcement of 2fa of new amazon-accounts. SMS or E-Mail is not supported. You can extract the Secret from the QR-Code:

otpauth://totp/Amazon%3ASomeUser%40Example?secret=IBU3VLM........&issuer=Amazon

You need to set up the account in Amazon with GoogleAuthenticator or any password-manager which supports OTP. Further information here: https://www.amazon.com/gp/help/customer/display.html?nodeId=GE6SLZ5J9GCNRW44

Adding AdditionalSteps to login work flow

If there more steps to your login work-flow after submitting username and pass, you can define your functions for these extra steps, then assign them to the options.additionalSteps property in Cypress plugins file.

/**
 * @type {Cypress.PluginConfig}
 */
async function fewMoreSteps({page, options} = {}) {
  // ... define steps
}

module.exports = (on, config) => {
  // `on` is used to hook into various events Cypress emits
  // `config` is the resolved Cypress config
  on('task', {
    customizedLogin: options => {
      options.additionalSteps = fewMoreSteps

      return CustomizedLogin(options)
    }
  })
}

Defining custom login

When you need to use social logins which aren't supported by this plugin you can make use of the baseLoginConnect() function that is exported as part of the plugin like so:

const {baseLoginConnect} = require('cypress-social-logins').plugins

module.exports = (on, config) => {
  on('task', {
    customLogin(options) {
      async function typeUsername({page, options} = {}) {
        await page.waitForSelector('input[id="username"')
        await page.type('input[id="username"', options.username)
      }

      async function typePassword({page, options} = {}) {
        await page.waitForSelector('input[id="password"]')
        await page.type('input[id="password"]', options.password)
        await page.click('button[id="_submit"]')
      }

      return baseLoginConnect(typeUsername, typePassword, null, options)
    }
  })
}

Using AmazonSocialLogin with OneTimePassword

You need an Amazon account with activated 2fa. The QR-Code is provided by Amazon and contains a SECRET to calculate an OTP. This is mandatory due the enforcement of 2fa of new amazon-accounts. SMS or E-Mail is not supported. You can extract the Secret from the QR-Code:

otpauth://totp/Amazon%3ASomeUser%40Example?secret=IBU3VLM........&issuer=Amazon

You need to set up the account in Amazon with GoogleAuthenticator or any password-manager which supports OTP. Further information here: https://www.amazon.com/gp/help/customer/display.html?nodeId=GE6SLZ5J9GCNRW44

Troubleshooting

Timeout while trying to enter username

Make sure you are providing the plugin with the username or password in the options when instantiating it. If you're passing it via environment variables then the plugin will look for these two: CYPRESS_googleSocialLoginUsername and CYPRESS_googleSocialLoginPassword

If your application uses popup auth, make sure you are providing isPopup: true configuration parameter.

Timeout error with Selectors

Puppeteer uses document.querySelectors. If you use selectors such as jQuery, you might face timeout errors because Puppeteer may not understand.

You can check these links to get examples for valid selectors: document.querySelector() CSS Selectors

Failed to launch the browser process

If you're getting an error on a Linux server such as:

Error: Failed to launch the browser process!
[768:768:0423/165641.025850:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
TROUBLESHOOTING:

You should pass the argument --no-sandbox to the plugin as extra arguments.

localStorage isn't persisting through all tests

If you find that lsd is not persisting through tests (useful if you need a JWT from SSO in order to login before each test) using the default implementation above, then you can utilize the package cypress-localstorage-commands (https://www.npmjs.com/package/cypress-localstorage-commands).

To use:

npm install --save-dev cypress-localstorage-commands

import 'cypress-localstorage-commands'

before(() => {
  describe('Login through Google', () => {
    const username = Cypress.env('googleSocialLoginUsername')
    const password = Cypress.env('googleSocialLoginPassword')
    const loginUrl = Cypress.env('loginUrl')
    const localStorageItem = Cypress.env('lsdItemName')
    const socialLoginOptions = {
      username: username,
      password: password,
      loginUrl: loginUrl,
      headless: true,
      logs: false,
      loginSelector: '[href="/auth/auth0/google-oauth2"]',
      postLoginSelector: '.account-panel'
    }

    // Clears localStorage prior to getting any new localStorage items
    cy.clearLocalStorageSnapshot()

    return cy.task('GoogleSocialLogin', socialLoginOptions).then(({lsd}) => {
      // Check for localStorage item, such as a JWT or similar
      const hasLsd = Object.keys(lsd)
        .filter(item => item === localStorageItem)
        .pop()

      if (hasLsd) {
        cy.window().then(() => {
          Object.keys(lsd).forEach(key => {
            cy.setLocalStorage(key, lsd[key])
          })
        })

        // Saves a snapshot of localStorage
        cy.saveLocalStorage()
      }
    })
  })
})

// Restore the saved localStorage snapshot prior to each test
beforeEach(() => {
  cy.restoreLocalStorage()
})

// Save the localStorage snapshot after each test
afterEach(() => {
  cy.saveLocalStorage()
})

Error: module not found: "ws" from file

If you're getting an error message such as:

Error: module not found: "ws" from file ..... node_modules/puppeteer/lib/WebSocketTransport.js #17

It may be due to the fact that you're requiring one of the exported plugin functions, such as GoogleSocialLogin in your spec file in addition to requiring it in cypress/plugins/index.js. Remove it from your spec file, or from a support/index.js and make sure you export the GoogleSocialLogin function as a task only from the /plugins/index.js file.

See discussion about in this issue.

Amazon OTP not accepted

Please be aware of proper time on your machine. Make sure you are using ntp to be in sync.

additionalSteps not a function

Please avoid defining your additionalSteps function inside your test file. It will cause errors when you pass your options object through cy.task().

If you also have cases with multiple scenarios, such as having both cases to enter PIN or secuirty after password or enter usual username and password login flow without extra steps, you can add a property in the options object as an indicater which additional functions you wish to apply.

Example:

/**
 * @type {Cypress.PluginConfig}
 */
async function fewMoreStepsPin({page, options} = {}) {
  // ... define steps to enter PIN
}

async function fewMoreStepsSecurityQ({page, option} = {}) {
  // ... define steps to enter secuirty question
}

module.exports = (on, config) => {
  // `on` is used to hook into various events Cypress emits
  // `config` is the resolved Cypress config
  on('task', {
    customizedLogin: options => {
      if (options.moreSteps === 'pin') {
        // assign options.addtionalSteps pin function
        options.additionalSteps = fewMoreStepsPin
      } else if (options.moreSteps === 'securityQ') {
        // assign options.additionalSteps securityQ
        options.additionalSteps = fewMoreStepsSecurityQ
      }
      return CustomizedLogin(options)
    }
  })
}

Author

Liran Tal [email protected]

More Repositories

1

dockly

Immersive terminal interface for managing docker containers and services
JavaScript
3,695
star
2

nodejs-cli-apps-best-practices

The largest Node.js CLI Apps best practices list ✨
3,239
star
3

awesome-nodejs-security

Awesome Node.js Security resources
2,585
star
4

is-website-vulnerable

finds publicly known security vulnerabilities in a website's frontend JavaScript libraries
JavaScript
1,913
star
5

npq

🎖safely* install packages with npm or yarn by auditing them as part of your install process
JavaScript
836
star
6

lockfile-lint

Lint an npm or yarn lockfile to analyze and detect security issues
JavaScript
770
star
7

daloradius

daloRADIUS is an advanced RADIUS web management application aimed at managing hotspots and general-purpose ISP deployments. It features user management, graphical reporting, accounting, a billing engine and integrates with GoogleMaps for geo-locating.
PHP
586
star
8

awesome-opensource-israel

A curated list of Israeli-made projects, events, and individuals
346
star
9

express-version-route

A Node.js express middleware that implements API versioning for route controllers
JavaScript
90
star
10

essential-nodejs-security-book

Documentation for Essential Node.js Security
JavaScript
79
star
11

awesome-contract-testing

Awesome resources for Consumer-Driven Contract Testing
73
star
12

eslint-plugin-anti-trojan-source

ESLint plugin to detect and stop Trojan Source attacks
JavaScript
69
star
13

detect-secrets

A developer-friendly secrets detection tool for CI and pre-commit hooks based on Yelp's detect-secrets
JavaScript
45
star
14

anti-trojan-source

Detect trojan source attacks that employ unicode bidi attacks to inject malicious code
JavaScript
40
star
15

licenseye

Node.js CLI tool to visualize an aggregate list of your dependencies' licenses
JavaScript
38
star
16

create-node-lib

Scaffold a batteries-included Node.js library project with docs, tests, semantic releases and more
JavaScript
31
star
17

pie-my-vulns

Visualize your project security vulnerabilities as a pie chart in the terminal
JavaScript
23
star
18

codeigniter-menu

Menu Navigation extension for CodeIgniter PHP framework
PHP
19
star
19

women-of-open-source-israel

WOSI - Women of Open Source Israel 🇮🇱
19
star
20

learning-http-security-headers-book

Hands-on practical use of HTTP security headers as browser security controls to help secure web applications
18
star
21

express-security-txt

A Node.js middleware for Express that implements Security.txt - A Method for Web Security Policies
JavaScript
18
star
22

enterprise-applications-patterns

Collection of enterprise application patterns
17
star
23

twiks

Twitter awesomeness browser extension
JavaScript
17
star
24

cron-to-quartz

Node.js library to convert unix or linux CRON syntax to Quartz Scheduler
JavaScript
16
star
25

Riess.js

Riess.js is a de-coupled full stack JavaScript application framework
JavaScript
16
star
26

typeform-client

A friendlier Typeform Node.js API client
JavaScript
16
star
27

organising-awesome-meetups

Do you want to start a meetup group but you don't know exactly where to start? You're in the right place!
16
star
28

agilemanager-api

HPE's Agile Manager client API module for NodeJS
JavaScript
14
star
29

docker-travis-cli

Travis CLI in a docker container (encrypt, lint, env, monitor)
Dockerfile
12
star
30

asciidoc-book-starter

A template repository that is ready to author and publish books written in AsciiDoc format
TypeScript
12
star
31

express-version-request

versions an incoming request to Express based on header or URL
JavaScript
11
star
32

smtp-pipe

Pipe any mail envelope input and output forward as SMTP client
JavaScript
10
star
33

nodepulse

NodePulse is a live Node.js dashboard
Vue
9
star
34

js-vulns-detector

Inject JS to the DOM to find vulnerable JavaScript libraries
JavaScript
9
star
35

github-actions-best-practices-for-node.js

GitHub Actions Best Practices for Node.js applications
9
star
36

docker-images-security-workshop

Docker Image Security Workshop for Best Practices
Dockerfile
9
star
37

cwe-sdk

A Common Weakness Enumeration (CWE) Node.js SDK compliant with MITRE / CAPEC
JavaScript
9
star
38

public-speaking

Liran Tal's portfolio of public speaking engagements
9
star
39

nodejs-docker-image-best-practices

Best practices for building and maintaining Node.js docker images
Dockerfile
8
star
40

Manager-README

Liran Tal Manager README
7
star
41

opn-shell

cross-platform execution of command line programs in shells
JavaScript
6
star
42

dependency-confusion-demo

Demo for practicing Dependency Confusion supply chain attacks
JavaScript
6
star
43

vault

A Node.js API service that fetches files and checks for virus or malware
JavaScript
6
star
44

public-speaking-archive

Liran Tal's repository for public speaking
Liquid
6
star
45

slides-react-security-lightning-talk-2022

Slides for talk: How React Applications Get Hacked in the Real World
HTML
6
star
46

typeform-export-excel

Export a Typeform survey questionnaire to an Excel format
JavaScript
6
star
47

gulp-mraudit

Mr Audit is a Gulp plugin to audit JavaScript code for security related static code analysis
JavaScript
6
star
48

docker-detect-secrets

A docker image for Yelp's docker-secrets python application
Dockerfile
5
star
49

nodejssecurity-headers-hsts

Exercise resources about HTTP security headers in Node.js and Express applications
JavaScript
5
star
50

snykcon

A CLI for Snyk's SnykCon 2020 DevSecOps and Developer-first security conference
JavaScript
5
star
51

radiusense

RADIUS monitoring and statistics reporting for FreeRADIUS-based deployments (it's a pingdom for RADUIS servers)
JavaScript
5
star
52

react-suspended-vulnerable-application

React Suspended is an educational frontend application riddled with security vulnerabilities
CSS
5
star
53

slides-react-security-2022

Slides for talk: How React Applications Get Hacked in the Real World
Vue
5
star
54

nodejssecurity-mixed-content

Exercise resources about browser security controls
JavaScript
5
star
55

pact-workshop-consumer-nodejs

Pact Workshop - Consumer in Node.js
JavaScript
5
star
56

security-report

Report a security vulnerability
JavaScript
5
star
57

Proactive-Controls-for-JavaScript-Supply-Chain-Security

Proactive NPM Controls for Supply Chain Security
5
star
58

operations-orchestration-api

HPE's Operations Orchestration client API module for NodeJS
JavaScript
5
star
59

Dependency-Frost

Dependency Frost is an educational platform game to promote awareness of security in open source dependencies
JavaScript
5
star
60

public-speaking-jekyll

A starter template for Public Speaking templates 🎤 💫
Ruby
4
star
61

lockfile-prune

Lockfiles have needs too and this package takes care of them
JavaScript
4
star
62

nodejssecurity-headers-xframe-innocent

Exercise resources about HTTP security headers in Node.js and Express applications
JavaScript
4
star
63

snyk-vs-npm-audit

This repository will contain benchmark comparison between Snyk and npm audit, based on personal observation, as objective as possible
4
star
64

pp-minimist-poc

Prototype Pollution in minimist
JavaScript
4
star
65

aws-s3-utils

Node.js library providing high-level wrapper for convenient AWS S3 capabilities
JavaScript
4
star
66

lirantaldotcom

Liran Tal's lirantal.com website v2
Astro
4
star
67

bazz

🚀📩 effortless remote push notifications for the CLI
JavaScript
4
star
68

serverless-goof-azure

Oreilly's Serverless security example application - serverless-goof todo app
JavaScript
4
star
69

no-secrets-env-vars-website

SAY NO TO SECRETS IN ENVIRONMENT VARIABLES
Vue
4
star
70

eslint-plugin-security

ESLint collection of curated security rules for static code analysis linter
JavaScript
3
star
71

swagger-lint-api

Linter for a Swagger JSON API spec
JavaScript
3
star
72

picture-tuber

render images on the terminal (forked from substack/picture-tube)
JavaScript
3
star
73

licensewatch

Recurses a given node_modules directory to fetch all npm package licenses
JavaScript
3
star
74

bazz-serverless-firebase

JavaScript
3
star
75

presentation-terminal-great-again

JavaScript
3
star
76

githubs

CLI to manage GitHub repositories in bulk
JavaScript
3
star
77

fastify-dotenv-envschema-example

A Fastify example codebase for using dotenv with env-schema wrapper
JavaScript
3
star
78

terminal-detect

CLI to detect terminal support for properties like color, unicode and others
JavaScript
3
star
79

smtp-watch

smtp-watch will create an smtp server for incoming mail connections, and display these e-mails on a web page
JavaScript
3
star
80

cwe-tool

A command line CWE discovery tool based on OWASP / CAPSEC database of Common Weakness Enumeration.
JavaScript
3
star
81

fastify-supertokens-example

A Node.js Fastify microservice that uses SuperTokens for authentication
JavaScript
3
star
82

techies

A web app that shows and compares technology stacks and trends around the world
JavaScript
3
star
83

goof-container-breaking-in

A Snyk-based goof application to demonstrate breaking into containers
JavaScript
3
star
84

012cable

A QT-based PPTP dialer for Linux users of the 012 Israel ISP
Makefile
2
star
85

operations-orchestration-backup

NodeJS Backup Tool (Import/Export) for HPE's Operations Orchestration
JavaScript
2
star
86

atombundles

Easily install all packages required to create an Atom Bundle for a Language or Platform
TypeScript
2
star
87

speak-easy

The source-code for the speak|easy website which promotes inspirational and information public speaking tips
Vue
2
star
88

daloradius-web

daloRADIUS official website
CSS
2
star
89

bazz-frontend

JavaScript
2
star
90

php-sdk

PHP SDK for the Facebook API
PHP
2
star
91

snyk-or-snick

Race your friend to the Snyk palace
JavaScript
2
star
92

slides-supply-chain-security

Vue
2
star
93

create-node-sandbox

Spin-off an isolated Node.js environment using Docker containers
JavaScript
2
star
94

lirantal

2
star
95

ecosystem-lockfiles

An up to date list of ecosystem, their package managers and traits of theirs with regards to software security
2
star
96

pkg-probe

Vue
1
star
97

techies-meetup-crawler

Crawling meetup.com to retrieve data
JavaScript
1
star
98

berry-plugin-hello-world

TypeScript
1
star
99

cwe-toolkit-api

An HTTP API to access CWE information based on the CWE Toolkit OWASP project
TypeScript
1
star
100

pact-workshop-provider-nodejs

Pact Workshop - Provider in Node.js
JavaScript
1
star