Skip to content

Commit

Permalink
feat: 0.0.1-alpha
Browse files Browse the repository at this point in the history
  • Loading branch information
nullswan committed Jul 29, 2022
1 parent 79b9ca9 commit 72a5e87
Show file tree
Hide file tree
Showing 11 changed files with 56 additions and 64 deletions.
27 changes: 27 additions & 0 deletions .github/workflows/cd.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: cd

on:
push:
tags:
- "v*"

jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: softprops/action-gh-release@v1

npm-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '16.x'
registry-url: 'https://registry.npmjs.org'
- run: npm install .
- run: npm run build
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
6 changes: 6 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parser": "typescript",
"printWidth": 120,
"singleQuote": true,
"trailingComma": "all"
}
9 changes: 2 additions & 7 deletions commitlint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,9 @@ const Configuration = {
/*
* Custom URL to show upon failure
*/
helpUrl:
'https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines',
helpUrl: 'https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines',
rules: {
'type-enum': [
2,
'always',
['ci', 'docs', 'feat', 'fix', 'refactor', 'test', 'chore'],
],
'type-enum': [2, 'always', ['ci', 'docs', 'feat', 'fix', 'refactor', 'test', 'chore', 'wip']],
},
};

Expand Down
2 changes: 1 addition & 1 deletion examples/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ const armor = new GQLArmor(
},
(status: string, plugin: any) => {
console.log(status, plugin._namespace);
}
},
);

const server = armor.apolloServer({
Expand Down
15 changes: 9 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
{
"name": "graphql-armor",
"version": "0.0.1",
"name": "@escape.tech/graphql-armor",
"version": "0.0.1-alpha",
"description": "",
"main": "index.js",
"main": "dist/index.js",
"files": [
"dist/**/*.js"
],
"scripts": {
"build": "tsc -p tsconfig.json",
"watch": "tsc -p tsconfig.json -w",
"build": "tsc",
"dev": "tsc -w",
"start": "NODE_PATH=dist node dist/index.js",
"test": "echo 'NotImplementedError'",
"lint": "yarn prettier . -uw --single-quote",
"lint": "prettier src/ -uw --single-quote",
"example": "nodemon --delay 500ms examples/server.ts"
},
"repository": {
Expand Down
5 changes: 1 addition & 4 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@ const defaultConfig: ArmorConfig = {
FieldSuggestion: DefaultFieldSuggestionConfig, // 0x8
};

function applyBitwisePermissions(
config: ArmorConfig,
permUID: number
): ArmorConfig {
function applyBitwisePermissions(config: ArmorConfig, permUID: number): ArmorConfig {
let keyID = 0;
for (const key in defaultConfig) {
if (!config.hasOwnProperty(key)) {
Expand Down
17 changes: 3 additions & 14 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,7 @@ import { Config } from 'apollo-server-core/src/types';
import * as Plugins from './plugins/';

import { ArmorPlugin } from './ArmorPlugin';
import {
PluginDefinition,
ValidationRule,
ArmorConfig,
PluginUpdateEvent,
PluginState,
} from './types';
import { PluginDefinition, ValidationRule, ArmorConfig, PluginUpdateEvent, PluginState } from './types';
import { ConfigService } from './config';

export class GQLArmor {
Expand Down Expand Up @@ -42,9 +36,7 @@ export class GQLArmor {
/*
* Inject remediations into the ApolloServer constructor
*/
public apolloServer<ContextFunctionParams>(
apolloConfig: Config<ContextFunctionParams>
) {
public apolloServer<ContextFunctionParams>(apolloConfig: Config<ContextFunctionParams>) {
apolloConfig.plugins ??= [];
apolloConfig.validationRules ??= [];

Expand All @@ -65,10 +57,7 @@ export class GQLArmor {
// We prepend our plugins/rules
// So that we can protect the following user-defined plugins from attacks
apolloConfig.plugins = [...apolloPlugins, ...apolloConfig.plugins!];
apolloConfig.validationRules = [
...validationRules,
...apolloConfig.validationRules!,
];
apolloConfig.validationRules = [...validationRules, ...apolloConfig.validationRules!];

return new ApolloServer<ContextFunctionParams>(apolloConfig);
}
Expand Down
8 changes: 1 addition & 7 deletions src/plugins/CostAnalysis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,7 @@ import { ValidationRule, PluginConfig } from '../types';

import { ComplexityVisitor } from 'graphql-validation-complexity';

import {
ASTVisitor,
GraphQLError,
TypeInfo,
visit,
visitWithTypeInfo,
} from 'graphql';
import { ASTVisitor, GraphQLError, TypeInfo, visit, visitWithTypeInfo } from 'graphql';

export type CostAnalysisConfig = {
CostAnalysis?: { options: { maxCost: number } } & PluginConfig;
Expand Down
8 changes: 1 addition & 7 deletions src/plugins/FieldSuggestion.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
import { ArmorPlugin } from '../ArmorPlugin';
import {
ValidationRule,
GraphQLError,
ValidationContext,
ASTVisitor,
FieldNode,
} from 'graphql';
import { ValidationRule, GraphQLError, ValidationContext, ASTVisitor, FieldNode } from 'graphql';
import { PluginConfig } from 'types';

export type FieldSuggestionConfig = {
Expand Down
12 changes: 3 additions & 9 deletions src/plugins/Introspection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,18 @@ export const DefaultIntrospectionConfig = {
options: {
headersWhitelist: {
'x-allow-introspection': 'allow',
...(process.env.ESCAPE_IDENTIFIER
? { 'x-escape-identifier': process.env.ESCAPE_IDENTIFIER }
: {}),
...(process.env.ESCAPE_IDENTIFIER ? { 'x-escape-identifier': process.env.ESCAPE_IDENTIFIER } : {}),
},
},
};

const plugin = ({
options: { headersWhitelist },
}: PluginConfig): PluginDefinition => {
const plugin = ({ options: { headersWhitelist } }: PluginConfig): PluginDefinition => {
return {
async requestDidStart({ request }) {
if (request.query!.includes('__schema')) {
const headers = request.http!.headers;

const whitelistedHeaders = headersWhitelist.filter((header) =>
headers.has(header)
);
const whitelistedHeaders = headersWhitelist.filter((header) => headers.has(header));

if (whitelistedHeaders.length === 0) {
throw new Error('Introspection is disabled');
Expand Down
11 changes: 2 additions & 9 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,12 @@ export enum PluginState {
REGISTERED = 'registered',
UNREGISTERED = 'unregistered',
}
export type PluginUpdateEvent = (
status: PluginState,
plugin: PluginConfig
) => void;
export type PluginUpdateEvent = (status: PluginState, plugin: PluginConfig) => void;

// Config
export type PluginConfig = {
_namespace?: string;
enabled?: boolean;
options?: any;
};
export type ArmorConfig =
| IntrospectionConfig
| CharacterLimitConfig
| CostAnalysisConfig
| FieldSuggestionConfig;
export type ArmorConfig = IntrospectionConfig | CharacterLimitConfig | CostAnalysisConfig | FieldSuggestionConfig;

0 comments on commit 72a5e87

Please sign in to comment.