Skip to content
This repository has been archived by the owner on Mar 25, 2023. It is now read-only.

fix: get rid of cidr library #1084

Merged
merged 2 commits into from
May 22, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
"@ngx-translate/core": "^8.0.0",
"@ngx-translate/http-loader": "^2.0.0",
"chart.js": "2.7.0",
"cidr-regex": "^2.0.8",
"core-js": "^2.4.1",
"hammerjs": "^2.0.8",
"lodash": "^4.17.4",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import { ErrorStateMatcher } from '@angular/material';

import { IPVersion, NetworkRuleType } from '../../sg.model';
import { NetworkProtocol } from '../../network-rule.model';
import { Utils } from '../../../shared/services/utils/utils.service';
import {
cidrValidator,
endPortValidator,
Expand All @@ -31,8 +30,8 @@ import {
icmpV4Types,
icmpV6Types
} from '../../../shared/icmp/icmp-types';
import 'rxjs/add/operator/startWith';
import { FirewallRule } from '../../shared/models';
import { CidrUtils } from '../../../shared/utils/cidr-utils';


export class PortsErrorStateMatcher implements ErrorStateMatcher {
Expand Down Expand Up @@ -250,7 +249,7 @@ export class SGRuleAdditionFormComponent implements OnDestroy {

private onCidrChange() {
this.cidrChanges = this.cidr.valueChanges
.map(Utils.cidrType)
.map(CidrUtils.getCidrIpVersion)
.distinctUntilChanged()
.filter(() => this.isIcmpProtocol === true)
.subscribe(() => { // invokes only when cidr change IP version and protocol equals ICMP
Expand Down Expand Up @@ -367,7 +366,7 @@ export class SGRuleAdditionFormComponent implements OnDestroy {
}

private getIcmpTypes(): IcmpType[] {
const cidrIpVersion = Utils.cidrType(this.cidr.value);
const cidrIpVersion = CidrUtils.getCidrIpVersion(this.cidr.value);
if (!cidrIpVersion) {
return [];
}
Expand All @@ -388,7 +387,7 @@ export class SGRuleAdditionFormComponent implements OnDestroy {
}

private getIcmpTypeTranslationToken(type: number) {
const cidrIpVersion = Utils.cidrType(this.cidr.value);
const cidrIpVersion = CidrUtils.getCidrIpVersion(this.cidr.value);
if (!cidrIpVersion) {
return;
}
Expand All @@ -398,7 +397,7 @@ export class SGRuleAdditionFormComponent implements OnDestroy {
}

private getIcmpCodeTranslationToken(type: number, code: number) {
const cidrIpVersion = Utils.cidrType(this.cidr.value);
const cidrIpVersion = CidrUtils.getCidrIpVersion(this.cidr.value);
if (!cidrIpVersion) {
return;
}
Expand Down
22 changes: 9 additions & 13 deletions src/app/security-group/sg-rules/sg-rule.component.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
import {
ChangeDetectionStrategy,
Component,
EventEmitter,
Input,
Output
} from '@angular/core';
import { Utils } from '../../shared/services/utils/utils.service';
import { NetworkProtocol, NetworkRule } from '../network-rule.model';
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';

import {
GetICMPCodeTranslationToken,
GetICMPTypeTranslationToken, GetICMPV6CodeTranslationToken,
GetICMPTypeTranslationToken,
GetICMPV6CodeTranslationToken,
GetICMPV6TypeTranslationToken
} from '../../shared/icmp/icmp-types';
import { IPVersion, NetworkRuleType } from '../sg.model';
import { NetworkProtocol, NetworkRule } from '../network-rule.model';
import { CidrUtils } from '../../shared/utils/cidr-utils';

@Component({
selector: 'cs-security-group-rule',
Expand Down Expand Up @@ -50,19 +46,19 @@ export class SgRuleComponent {
}

public get icmpTypeTranslationToken(): string {
return Utils.cidrType(this.item.CIDR) === IPVersion.ipv4
return CidrUtils.getCidrIpVersion(this.item.CIDR) === IPVersion.ipv4
? GetICMPTypeTranslationToken(this.item.icmpType)
: GetICMPV6TypeTranslationToken(this.item.icmpType);
}

public get icmpCodeTranslationToken(): string {
return Utils.cidrType(this.item.CIDR) === IPVersion.ipv4
return CidrUtils.getCidrIpVersion(this.item.CIDR) === IPVersion.ipv4
? GetICMPCodeTranslationToken(this.item.icmpType, this.item.icmpCode)
: GetICMPV6CodeTranslationToken(this.item.icmpType, this.item.icmpCode);
}

public get ruleParams(): Object {
const ipVersion = Utils.cidrType(this.item.CIDR) === IPVersion.ipv4
const ipVersion = CidrUtils.getCidrIpVersion(this.item.CIDR) === IPVersion.ipv4
? IPVersion.ipv4
: IPVersion.ipv6;

Expand Down
4 changes: 2 additions & 2 deletions src/app/security-group/sg-rules/sg-rules.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ import { Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';

import { NotificationService } from '../../shared/services/notification.service';
import { Utils } from '../../shared/services/utils/utils.service';
import { NetworkRuleService } from '../services/network-rule.service';
import { getType, IPVersion, NetworkRuleType, SecurityGroup, SecurityGroupType } from '../sg.model';
import { NetworkProtocol, NetworkRule } from '../network-rule.model';
import { DialogService } from '../../dialog/dialog-service/dialog.service';
import { SgRuleComponent } from './sg-rule.component';
import { FirewallRule } from '../shared/models';
import { SecurityGroupViewMode } from '../sg-view-mode';
import { CidrUtils } from '../../shared/utils/cidr-utils';


@Component({
Expand Down Expand Up @@ -221,7 +221,7 @@ export class SgRulesComponent implements OnInit, OnChanges {
private filterRules(rules: NetworkRule[]) {
return rules.filter((rule: NetworkRule) => {
const filterByIPversion = (item: NetworkRule) => {
const ruleIPversion = item.CIDR && Utils.cidrType(item.CIDR) === IPVersion.ipv6
const ruleIPversion = item.CIDR && CidrUtils.getCidrIpVersion(item.CIDR) === IPVersion.ipv6
? IPVersion.ipv6
: IPVersion.ipv4;
return !this.selectedIPVersion.length
Expand Down
4 changes: 2 additions & 2 deletions src/app/security-group/shared/validators/cidr.validator.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
import { Utils } from '../../../shared/services/utils/utils.service';
import { CidrUtils } from '../../../shared/utils/cidr-utils';

export function cidrValidator(): ValidatorFn {
return (control: AbstractControl): ValidationErrors | null => {
const isValid = Utils.cidrIsValid(control.value);
const isValid = CidrUtils.isCidrValid(control.value);
return isValid ? null : { 'cidrValidator': { value: control.value } };
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { AbstractControl, ValidationErrors } from '@angular/forms';

import { icmpV4Types, icmpV6Types } from '../../../shared/icmp/icmp-types';
import { Utils } from '../../../shared/services/utils/utils.service';
import { IPVersion } from '../../sg.model';
import { CidrUtils } from '../../../shared/utils/cidr-utils';

export function icmpCodeValidator(cidr: AbstractControl, icmpType: AbstractControl) {
return (control: AbstractControl): ValidationErrors | null => {
const code = +control.value;
const type = +icmpType.value;
const types = Utils.cidrType(cidr.value) === IPVersion.ipv4 ? icmpV4Types : icmpV6Types;
const types = CidrUtils.getCidrIpVersion(cidr.value) === IPVersion.ipv4 ? icmpV4Types : icmpV6Types;
const typeObject = types.find(value => value.type === type);
if (!typeObject) {
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';

import { icmpV4Types, icmpV6Types } from '../../../shared/icmp/icmp-types';
import { Utils } from '../../../shared/services/utils/utils.service';
import { IPVersion } from '../../sg.model';
import { CidrUtils } from '../../../shared/utils/cidr-utils';


export function icmpTypeValidator(cidr: AbstractControl): ValidatorFn {
return (control: AbstractControl): ValidationErrors | null => {
const type = +control.value;
const types = Utils.cidrType(cidr.value) === IPVersion.ipv4 ? icmpV4Types : icmpV6Types;
const types = CidrUtils.getCidrIpVersion(cidr.value) === IPVersion.ipv4 ? icmpV4Types : icmpV6Types;
const index = types.findIndex(value => value.type === type);
return index > -1 ? null : { 'icmpTypeValidator': { value: control.value } };
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { NetworkProtocol } from '../../../../security-group/network-rule.model';
import {
GetICMPCodeTranslationToken,
GetICMPTypeTranslationToken
} from '../../../icmp/icmp-types';
import { Utils } from '../../../services/utils/utils.service';
import { GetICMPCodeTranslationToken, GetICMPTypeTranslationToken } from '../../../icmp/icmp-types';
import { RuleListItem } from '../security-group-builder.component';
import { CidrUtils } from '../../../utils/cidr-utils';


@Component({
Expand Down Expand Up @@ -85,7 +82,7 @@ export class SecurityGroupBuilderRuleComponent {
type: this.translateService.instant(this.typeTranslationToken),
protocol: this.translateService.instant(this.protocolTranslationToken),
cidr: this.item.rule.CIDR,
ipVersion: Utils.cidrType(this.item.rule.CIDR)
ipVersion: CidrUtils.getCidrIpVersion(this.item.rule.CIDR)
};

let ruleParams;
Expand Down
54 changes: 0 additions & 54 deletions src/app/shared/services/utils/utils.service.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { RouterState } from '@angular/router';
import { Utils } from './utils.service';
import { IPVersion } from '../../../security-group/sg.model';


const divideFixture = [
Expand Down Expand Up @@ -68,37 +67,6 @@ const getRouteWithoutQueryParamsFixture = [
}
];

const validCidrV4Values = [
'99.198.122.146/32',
'46.51.197.88/8',
'173.194.34.134/12',
'0.0.0.0/0'
];
const validCidrV6Values = [
'fe80:0000:0000:0000:0204:61ff:fe9d:f156/100',
'::1/128',
'a:b:c:d:e:f:0::/64',
'FE80::/10'
];
const invalidCidrValues = [
'invalid',
'',
' ',
null,
// IP v4
'.100.100.100.100/16',
'100.100.100.100./32',
'http://123.123.123/28',
'1000.2.3.4/14',
// IP v6
'fe80:0000:0000:0000:0204:61ff:fe9d:f156/129',
'1::5:400.2.3.4/64',
'2001:0000:1234:0000:0000:C1C0:ABCD:0876 0/64',
'1.2.3.4::/64',
':::/64',
'::2222:3333:4444:5555:7777:8888::/64'
];

describe('Utils service', () => {
it('should generate unique id', () => {
expect(Utils.getUniqueId()).toBeDefined();
Expand Down Expand Up @@ -163,26 +131,4 @@ describe('Utils service', () => {
color = '#000000';
expect(Utils.isColorDark(color)).toBeTruthy();
});

it('should check if CIDR valid', () => {
const validCidrValues = [...validCidrV4Values, ...validCidrV6Values];
for (const value of validCidrValues) {
expect(Utils.cidrIsValid(value)).toBe(true);
}
for (const value of invalidCidrValues) {
expect(Utils.cidrIsValid(value)).toBe(false);
}
});

it('should return proper CIDR type', () => {
for (const value of validCidrV4Values) {
expect(Utils.cidrType(value)).toBe(IPVersion.ipv4);
}
for (const value of validCidrV6Values) {
expect(Utils.cidrType(value)).toBe(IPVersion.ipv6);
}
for (const value of invalidCidrValues) {
expect(Utils.cidrType(value)).toBe(null);
}
})
});
14 changes: 0 additions & 14 deletions src/app/shared/services/utils/utils.service.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { Params, RouterState, RouterStateSnapshot } from '@angular/router';
import { RouterStateSerializer } from '@ngrx/router-store';
import { IPVersion } from '../../../security-group/sg.model';
import * as uuid from 'uuid';
import * as cidrRegex from 'cidr-regex';

export class Utils {
public static getUniqueId(): string {
Expand Down Expand Up @@ -87,18 +85,6 @@ export class Utils {
public static sortByName = (a, b) => {
return a.name && a.name.localeCompare(b.name);
};

public static cidrIsValid(cidr: string | null): boolean {
return cidrRegex({exact: true}).test(cidr);
}

public static cidrType(cidr: string | null): IPVersion | null {
if (!Utils.cidrIsValid(cidr)) {
return null;
}
const isIPv4 = cidrRegex.v4({exact: true}).test(cidr);
return isIPv4 ? IPVersion.ipv4 : IPVersion.ipv6;
}
}


Expand Down
77 changes: 77 additions & 0 deletions src/app/shared/utils/cidr-utils.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { CidrUtils } from './cidr-utils';
import { IPVersion } from '../../security-group/sg.model';

const validCidrV4Values = [
'99.198.122.146/32',
'46.51.197.88/8',
'173.194.34.134/12',
'0.0.0.0/0'
];
const validCidrV6Values = [
'fe80:0000:0000:0000:0204:61ff:fe9d:f156/100',
'::1/128',
'a:b:c:d:e:f:0::/64',
'FE80::/10'
];
const invalidCidrValues = [
'invalid',
'',
' ',
null,
// IP v4
'.100.100.100.100/16',
'100.100.100.100./32',
'http://123.123.123/28',
'1000.2.3.4/14',
'0.0.0.0',
// IP v6
'fe80:0000:0000:0000:0204:61ff:fe9d:f156/129',
'1::5:400.2.3.4/64',
'2001:0000:1234:0000:0000:C1C0:ABCD:0876 0/64',
'1.2.3.4::/64',
'::',
':::/64',
'::2222:3333:4444:5555:7777:8888::/64'
];

describe('CIDR Utils', () => {
it('should check if CIDR v4 valid', () => {
for (const value of validCidrV4Values) {
expect(CidrUtils.isCidrV4Valid(value)).toBe(true);
}
for (const value of invalidCidrValues) {
expect(CidrUtils.isCidrV4Valid(value)).toBe(false);
}
});

it('should check if CIDR v6 valid', () => {
for (const value of validCidrV6Values) {
expect(CidrUtils.isCidrV6Valid(value)).toBe(true);
}
for (const value of invalidCidrValues) {
expect(CidrUtils.isCidrV6Valid(value)).toBe(false);
}
});

it('should check if CIDR (v4 or v6) valid', () => {
const validCidrValues = [...validCidrV4Values, ...validCidrV6Values];
for (const value of validCidrValues) {
expect(CidrUtils.isCidrValid(value)).toBe(true);
}
for (const value of invalidCidrValues) {
expect(CidrUtils.isCidrValid(value)).toBe(false);
}
});

it('should return proper CIDR IP version', () => {
for (const value of validCidrV4Values) {
expect(CidrUtils.getCidrIpVersion(value)).toBe(IPVersion.ipv4);
}
for (const value of validCidrV6Values) {
expect(CidrUtils.getCidrIpVersion(value)).toBe(IPVersion.ipv6);
}
for (const value of invalidCidrValues) {
expect(CidrUtils.getCidrIpVersion(value)).toBe(null);
}
});
});
Loading