Skip to content

Commit

Permalink
Merge pull request #85 from ensdomains/fix/insufficient-label-checks
Browse files Browse the repository at this point in the history
fix: insufficient label checks for validity + compare tweaks
  • Loading branch information
TateB committed Feb 13, 2024
2 parents bf1f987 + c8f9dfb commit 17294f5
Show file tree
Hide file tree
Showing 15 changed files with 3,404 additions and 41 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Expand Up @@ -73,4 +73,5 @@ typings/
# intellij
.idea

/tests/.bin
/tests/.bin
/tests/.latest.json
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 (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 (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
51 changes: 34 additions & 17 deletions src/resolver.ts
Expand Up @@ -57,7 +57,7 @@ export function handleAddrChanged(event: AddrChangedEvent): void {
}

export function handleMulticoinAddrChanged(event: AddressChangedEvent): void {
let resolver = getOrCreateResolver(event.params.node, event.address);
let resolver = getOrCreateResolver(event.params.node, event.address, false);

let coinType = event.params.coinType;
if (resolver.coinTypes == null) {
Expand All @@ -84,26 +84,32 @@ export function handleMulticoinAddrChanged(event: AddressChangedEvent): void {
export function handleNameChanged(event: NameChangedEvent): void {
if (event.params.name.indexOf("\u0000") != -1) return;

const resolver = getOrCreateResolver(event.params.node, event.address, true);

let resolverEvent = new NameChanged(createEventID(event));
resolverEvent.resolver = createResolverID(event.params.node, event.address);
resolverEvent.resolver = resolver.id;
resolverEvent.blockNumber = event.block.number.toI32();
resolverEvent.transactionID = event.transaction.hash;
resolverEvent.name = event.params.name;
resolverEvent.save();
}

export function handleABIChanged(event: ABIChangedEvent): void {
const resolver = getOrCreateResolver(event.params.node, event.address, true);

let resolverEvent = new AbiChanged(createEventID(event));
resolverEvent.resolver = createResolverID(event.params.node, event.address);
resolverEvent.resolver = resolver.id;
resolverEvent.blockNumber = event.block.number.toI32();
resolverEvent.transactionID = event.transaction.hash;
resolverEvent.contentType = event.params.contentType;
resolverEvent.save();
}

export function handlePubkeyChanged(event: PubkeyChangedEvent): void {
const resolver = getOrCreateResolver(event.params.node, event.address, true);

let resolverEvent = new PubkeyChanged(createEventID(event));
resolverEvent.resolver = createResolverID(event.params.node, event.address);
resolverEvent.resolver = resolver.id;
resolverEvent.blockNumber = event.block.number.toI32();
resolverEvent.transactionID = event.transaction.hash;
resolverEvent.x = event.params.x;
Expand All @@ -112,7 +118,7 @@ export function handlePubkeyChanged(event: PubkeyChangedEvent): void {
}

export function handleTextChanged(event: TextChangedEvent): void {
let resolver = getOrCreateResolver(event.params.node, event.address);
let resolver = getOrCreateResolver(event.params.node, event.address, false);

let key = event.params.key;
if (resolver.texts == null) {
Expand All @@ -128,7 +134,7 @@ export function handleTextChanged(event: TextChangedEvent): void {
}

let resolverEvent = new TextChanged(createEventID(event));
resolverEvent.resolver = createResolverID(event.params.node, event.address);
resolverEvent.resolver = resolver.id;
resolverEvent.blockNumber = event.block.number.toI32();
resolverEvent.transactionID = event.transaction.hash;
resolverEvent.key = event.params.key;
Expand All @@ -138,7 +144,7 @@ export function handleTextChanged(event: TextChangedEvent): void {
export function handleTextChangedWithValue(
event: TextChangedWithValueEvent
): void {
let resolver = getOrCreateResolver(event.params.node, event.address);
let resolver = getOrCreateResolver(event.params.node, event.address, false);

let key = event.params.key;
if (resolver.texts == null) {
Expand All @@ -154,7 +160,7 @@ export function handleTextChangedWithValue(
}

let resolverEvent = new TextChanged(createEventID(event));
resolverEvent.resolver = createResolverID(event.params.node, event.address);
resolverEvent.resolver = resolver.id;
resolverEvent.blockNumber = event.block.number.toI32();
resolverEvent.transactionID = event.transaction.hash;
resolverEvent.key = event.params.key;
Expand All @@ -163,21 +169,23 @@ export function handleTextChangedWithValue(
}

export function handleContentHashChanged(event: ContenthashChangedEvent): void {
let resolver = getOrCreateResolver(event.params.node, event.address);
let resolver = getOrCreateResolver(event.params.node, event.address, false);
resolver.contentHash = event.params.hash;
resolver.save();

let resolverEvent = new ContenthashChanged(createEventID(event));
resolverEvent.resolver = createResolverID(event.params.node, event.address);
resolverEvent.resolver = resolver.id;
resolverEvent.blockNumber = event.block.number.toI32();
resolverEvent.transactionID = event.transaction.hash;
resolverEvent.hash = event.params.hash;
resolverEvent.save();
}

export function handleInterfaceChanged(event: InterfaceChangedEvent): void {
const resolver = getOrCreateResolver(event.params.node, event.address, true);

let resolverEvent = new InterfaceChanged(createEventID(event));
resolverEvent.resolver = createResolverID(event.params.node, event.address);
resolverEvent.resolver = resolver.id;
resolverEvent.blockNumber = event.block.number.toI32();
resolverEvent.transactionID = event.transaction.hash;
resolverEvent.interfaceID = event.params.interfaceID;
Expand All @@ -188,10 +196,12 @@ export function handleInterfaceChanged(event: InterfaceChangedEvent): void {
export function handleAuthorisationChanged(
event: AuthorisationChangedEvent
): void {
const resolver = getOrCreateResolver(event.params.node, event.address, true);

let resolverEvent = new AuthorisationChanged(createEventID(event));
resolverEvent.blockNumber = event.block.number.toI32();
resolverEvent.transactionID = event.transaction.hash;
resolverEvent.resolver = createResolverID(event.params.node, event.address);
resolverEvent.resolver = resolver.id;
resolverEvent.owner = event.params.owner;
resolverEvent.target = event.params.target;
resolverEvent.isAuthorized = event.params.isAuthorised;
Expand All @@ -207,26 +217,33 @@ 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();
}

let resolver = getOrCreateResolver(event.params.node, event.address);
let resolver = getOrCreateResolver(event.params.node, event.address, false);
resolver.addr = null;
resolver.contentHash = null;
resolver.texts = null;
resolver.coinTypes = null;
resolver.save();
}

function getOrCreateResolver(node: Bytes, address: Address): Resolver {
function getOrCreateResolver(
node: Bytes,
address: Address,
saveOnNew: boolean
): 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;
if (saveOnNew) {
resolver.save();
}
}
return resolver as Resolver;
}
Expand All @@ -238,7 +255,7 @@ function createEventID(event: ethereum.Event): string {
.concat(event.logIndex.toString());
}

function createResolverID(node: Bytes, resolver: Address): string {
export function createResolverID(node: Bytes, resolver: Address): string {
return resolver
.toHexString()
.concat("-")
Expand Down
28 changes: 20 additions & 8 deletions src/utils.ts
Expand Up @@ -41,10 +41,7 @@ export function byteArrayFromHex(s: string): ByteArray {
}

export function uint256ToByteArray(i: BigInt): ByteArray {
let hex = i
.toHex()
.slice(2)
.padStart(64, "0");
let hex = i.toHex().slice(2).padStart(64, "0");
return byteArrayFromHex(hex);
}

Expand All @@ -68,18 +65,33 @@ export function createOrLoadDomain(node: string): Domain {
return domain;
}

export function checkValidLabel(name: string): boolean {
export function checkValidLabel(name: string | null): boolean {
if (name == null) {
return false;
}
// for compiler
name = name!;
for (let i = 0; i < name.length; i++) {
let c = name.charCodeAt(i);
if (c === 0) {
let charCode = name.charCodeAt(i);
if (charCode === 0) {
// 0 = null byte
log.warning("Invalid label '{}' contained null byte. Skipping.", [name]);
return false;
} else if (c === 46) {
} else if (charCode === 46) {
// 46 = .
log.warning(
"Invalid label '{}' contained separator char '.'. Skipping.",
[name]
);
return false;
} else if (charCode === 91) {
// 91 = [
log.warning("Invalid label '{}' contained char '['. Skipping.", [name]);
return false;
} else if (charCode === 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": 1704668302285
}

0 comments on commit 17294f5

Please sign in to comment.