Skip to content

Commit

Permalink
fix: insufficient label checks for validity
Browse files Browse the repository at this point in the history
  • Loading branch information
TateB committed Dec 11, 2023
1 parent 5c048fb commit 43d6247
Show file tree
Hide file tree
Showing 12 changed files with 2,821 additions and 17 deletions.
2,752 changes: 2,752 additions & 0 deletions src/@types/assembly/index.d.ts

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src/@types/assembly/package.json
@@ -0,0 +1,3 @@
{
"types": "index.d.ts"
}
File renamed without changes.
3 changes: 3 additions & 0 deletions src/@types/es5/package.json
@@ -0,0 +1,3 @@
{
"types": "index.d.ts"
}
13 changes: 6 additions & 7 deletions src/ensRegistry.ts
Expand Up @@ -2,6 +2,7 @@
import { BigInt, crypto, ens } from "@graphprotocol/graph-ts";

import {
checkValidLabel,
concat,
createEventID,
EMPTY_ADDRESS,
Expand Down Expand Up @@ -47,7 +48,7 @@ function getDomain(
timestamp: BigInt = BIG_INT_ZERO
): Domain | null {
let domain = Domain.load(node);
if (domain === null && node == ROOT_NODE) {
if (domain == null && node == ROOT_NODE) {
return createDomain(node, timestamp);
} else {
return domain;
Expand Down Expand Up @@ -94,25 +95,23 @@ function _handleNewOwner(event: NewOwnerEvent, isMigrated: boolean): void {
let domain = getDomain(subnode, event.block.timestamp);
let parent = getDomain(event.params.node.toHexString());

if (domain === null) {
if (domain == null) {
domain = new Domain(subnode);
domain.createdAt = event.block.timestamp;
domain.subdomainCount = 0;
}

if (domain.parent === null && parent !== null) {
if (domain.parent == null && parent != null) {
parent.subdomainCount = parent.subdomainCount + 1;
parent.save();
}

if (domain.name == null) {
// Get label and node names
let label = ens.nameByHash(event.params.label.toHexString());
if (label != null) {
if (!isNullable(label) && checkValidLabel(label)) {
domain.labelName = label;
}

if (label === null) {
} else {
label = "[" + event.params.label.toHexString().slice(2) + "]";
}
if (
Expand Down
4 changes: 2 additions & 2 deletions src/ethRegistrar.ts
Expand Up @@ -55,7 +55,7 @@ export function handleNameRegistered(event: NameRegisteredEvent): void {
domain.expiryDate = event.params.expires.plus(GRACE_PERIOD_SECONDS);

let labelName = ens.nameByHash(label.toHexString());
if (labelName != null) {
if (!isNullable(labelName) && checkValidLabel(labelName)) {
domain.labelName = labelName;
domain.name = labelName! + ".eth";
registration.labelName = labelName;
Expand Down Expand Up @@ -100,7 +100,7 @@ function setNamePreimage(name: string, label: Bytes, cost: BigInt): void {
}

let domain = Domain.load(crypto.keccak256(concat(rootNode, label)).toHex())!;
if (domain.labelName !== name) {
if (domain.labelName != name) {
domain.labelName = name;
domain.name = name + ".eth";
domain.save();
Expand Down
6 changes: 3 additions & 3 deletions src/nameWrapper.ts
Expand Up @@ -34,7 +34,7 @@ function decodeName(buf: Bytes): Array<string> | null {
let len = buf[offset++];
let hex = buf.toHexString();
let firstLabel = "";
if (len === 0) {
if (len == 0) {
return [firstLabel, "."];
}

Expand Down Expand Up @@ -68,7 +68,7 @@ export function handleNameWrapped(event: NameWrappedEvent): void {
let decoded = decodeName(event.params.name);
let label: string | null = null;
let name: string | null = null;
if (decoded !== null) {
if (decoded != null) {
label = decoded[0];
name = decoded[1];
}
Expand Down Expand Up @@ -120,7 +120,7 @@ export function handleNameUnwrapped(event: NameUnwrappedEvent): void {

let domain = createOrLoadDomain(node.toHex());
domain.wrappedOwner = null;
if (domain.expiryDate && domain.parent !== ETH_NODE) {
if (domain.expiryDate && domain.parent != ETH_NODE) {
domain.expiryDate = null;
}
domain.save();
Expand Down
4 changes: 2 additions & 2 deletions src/resolver.ts
Expand Up @@ -207,7 +207,7 @@ export function handleVersionChanged(event: VersionChangedEvent): void {
resolverEvent.save();

let domain = Domain.load(event.params.node.toHexString());
if (domain && domain.resolver === resolverEvent.resolver) {
if (domain && domain.resolver == resolverEvent.resolver) {
domain.resolvedAddress = null;
domain.save();
}
Expand All @@ -223,7 +223,7 @@ export function handleVersionChanged(event: VersionChangedEvent): void {
function getOrCreateResolver(node: Bytes, address: Address): Resolver {
let id = createResolverID(node, address);
let resolver = Resolver.load(id);
if (resolver === null) {
if (resolver == null) {
resolver = new Resolver(id);
resolver.domain = node.toHexString();
resolver.address = address;
Expand Down
10 changes: 10 additions & 0 deletions src/utils.ts
Expand Up @@ -72,14 +72,24 @@ export function checkValidLabel(name: string): boolean {
for (let i = 0; i < name.length; i++) {
let c = name.charCodeAt(i);
if (c === 0) {
// 0 = null byte
log.warning("Invalid label '{}' contained null byte. Skipping.", [name]);
return false;
} else if (c === 46) {
// 46 = .
log.warning(
"Invalid label '{}' contained separator char '.'. Skipping.",
[name]
);
return false;
} else if (c === 91) {
// 91 = [
log.warning("Invalid label '{}' contained char '['. Skipping.", [name]);
return false;
} else if (c === 93) {
// 93 = ]
log.warning("Invalid label '{}' contained char ']'. Skipping.", [name]);
return false;
}
}

Expand Down
4 changes: 2 additions & 2 deletions tests/.latest.json
@@ -1,4 +1,4 @@
{
"version": "0.5.4",
"timestamp": 1689736116460
"version": "0.6.0",
"timestamp": 1702245606450
}
33 changes: 33 additions & 0 deletions tests/ensRegistrar.test.ts
Expand Up @@ -215,3 +215,36 @@ test("does not assign label name to label with '.' separator", () => {

checkNullLabelName(labelhash, labelhashAsInt, label);
});

test("does not assign label name to label with '[' char", () => {
const labelhash =
"0x6d2df8d29c51e5e79bce0067df6a093fd7e535f1fe0a509ead1eb5a2171640c9";
const labelhashAsInt =
"49383325924636276199200854251362239534766035480602437112552046254651845525705";
const label =
"[41ff1915eef2bf5841388d748bfcd23bd49ff5521ca4200c20bc0978b136c3cb";

checkNullLabelName(labelhash, labelhashAsInt, label);
});

test("does not assign label name to label with ']' char", () => {
const labelhash =
"0xb9cf267ed9b0cb8caf44655901be5b66f2e6bbedd8dc1436fba973f7a824db58";
const labelhashAsInt =
"84043880016553362091807057514212448616446700818045523307434280128309910362968";
const label =
"41ff1915eef2bf5841388d748bfcd23bd49ff5521ca4200c20bc0978b136c3cb]";

checkNullLabelName(labelhash, labelhashAsInt, label);
});

test("does not assign label name to label that uses unnormalised label notation", () => {
const labelhash =
"0x162894963b59f9b7e47a34709830c0211a6ba5f7de3973839f3ee7002e0c8434";
const labelhashAsInt =
"10022582060124759960163130513734713560279061696053801337665848910969813369908";
const label =
"[41ff1915eef2bf5841388d748bfcd23bd49ff5521ca4200c20bc0978b136c3cb]";

checkNullLabelName(labelhash, labelhashAsInt, label);
});
6 changes: 5 additions & 1 deletion tsconfig.json
Expand Up @@ -6,5 +6,9 @@
"node_modules/@graphprotocol/graph-ts/global/global.ts",
"src/**/*.ts",
"tests/**/*.ts"
]
],
"compilerOptions": {
"typeRoots": ["./src/@types"],
"types": ["assembly", "es5"]
}
}

0 comments on commit 43d6247

Please sign in to comment.