···38383939 if (event.commit.record.$type !== "social.clippr.feed.clip") {
4040 Logger.verbose(
4141- "Invalid type for incoming clip record",
4141+ `Mismatched type for incoming clip record (${event.did}/${event.commit.rkey})`,
4242 event.commit.record,
4343 );
4444 }
45454646 if (!is(SocialClipprFeedClip.mainSchema, event.commit.record)) {
4747 Logger.verbose(
4848- "Invalid schema for incoming clip record",
4848+ `Invalid schema for incoming clip record (${event.did}/${event.commit.rkey})`,
4949 event.commit.record,
5050 );
5151 return;
···70707171 if (urlHash !== event.commit.rkey) {
7272 Logger.verbose(
7373- `Record key hash (${event.commit.rkey}) does not match hash of URL (${urlHash}) in incoming clip record`,
7373+ `Record key hash (${event.commit.rkey}) does not match hash of URL (${urlHash}) in incoming clip record (${event.did})`,
7474 event.commit.record,
7575 );
7676 return;
···8686 timestamp: convertMicroToDate(event.time_us),
8787 recordKey: event.commit.rkey,
8888 createdAt: new Date(record.createdAt),
8989+ indexedAt: new Date(),
8990 url: record.url,
9091 title: record.title,
9192 description: record.description,
···9697 languages: record.languages,
9798 });
98999999- Logger.verbose("Indexed new clip:", event.did, event.commit.rkey);
100100+ Logger.verbose(`Indexed new clip: ${event.did}/${event.commit.rkey}`, event);
100101}
101102102103export async function handleTag(
···110111 } // We currently do not handle these.
111112112113 if (event.commit.record.$type !== "social.clippr.feed.tag") {
113113- Logger.verbose("Invalid type for incoming tag record", event.commit.record);
114114+ Logger.verbose(
115115+ `Mismatched type for incoming tag record (${event.did}/${event.commit.rkey})`,
116116+ event.commit.record,
117117+ );
114118 return;
115119 }
116120117121 if (!is(SocialClipprFeedTag.mainSchema, event.commit.record)) {
118122 Logger.verbose(
119119- "Invalid schema for incoming tag record",
123123+ `Invalid schema for incoming tag record (${event.did}/${event.commit.rkey})`,
120124 event.commit.record,
121125 );
122126 return;
···127131 createdAt: event.commit.record.createdAt,
128132 name: event.commit.record.name,
129133 color: event.commit.record.color,
134134+ description: event.commit.record.description,
130135 };
131136132137 if (record.name !== event.commit.rkey) {
133138 Logger.verbose(
134134- "Record key does not match name of incoming tag record",
139139+ `Record key does not match name of incoming tag record (${event.did}/${event.commit.rkey})`,
135140 event.commit.record,
136141 );
137142 return;
···143148 }
144149145150 await db.insert(tagsTable).values({
151151+ timestamp: convertMicroToDate(event.time_us),
146152 did: convertDidToString(event.did),
147147- timestamp: convertMicroToDate(event.time_us),
148153 recordKey: event.commit.rkey,
149149- createdAt: new Date(record.createdAt),
150154 name: record.name,
155155+ description: record.description,
151156 color: record.color,
157157+ createdAt: new Date(record.createdAt),
158158+ indexedAt: new Date(),
152159 });
153160154154- Logger.verbose("Indexed new tag:", event.did, event.commit.rkey);
161161+ Logger.verbose(`Indexed new tag: ${event.did}/${event.commit.rkey}`, event);
155162}
156163157164export async function handleProfile(
···166173167174 if (event.commit.record.$type !== "social.clippr.actor.profile") {
168175 Logger.verbose(
169169- "Invalid type for incoming profile record",
176176+ `Mismatched type for incoming profile record (${event.did})`,
170177 event.commit.record,
171178 );
172179 return;
···174181175182 if (!is(SocialClipprActorProfile.mainSchema, event.commit.record)) {
176183 Logger.verbose(
177177- "Invalid schema for incoming profile record",
184184+ `Invalid schema for incoming profile record (${event.did})`,
178185 event.commit.record,
179186 );
180187 return;
···190197191198 if (event.commit.rkey !== "self") {
192199 Logger.verbose(
193193- "Record key of incoming profile record does not match 'self'",
200200+ `Record key of incoming profile record does not match 'self' (${event.did})`,
194201 event.commit.record,
195202 );
196203 return;
···199206 // This needs to be here so the avatar can be recognized as a proper blob.
200207 if (record.avatar) {
201208 if (!isBlob(record.avatar)) {
202202- Logger.verbose("Avatar in incoming profile record is not a blob", record);
209209+ Logger.verbose(
210210+ `Avatar in incoming profile record is not a blob (${event.did})`,
211211+ record,
212212+ );
203213 return;
204214 }
205215206216 if (record.avatar.mimeType.match(/^image\/(png|jpeg)$/i) === null) {
207217 Logger.verbose(
208208- "Avatar in incoming profile record is not a PNG or JPEG",
218218+ `Avatar in incoming profile record is not a PNG or JPEG (${event.did})`,
209219 record,
210220 );
211221 return;
···213223214224 if (record.avatar.ref?.$link === undefined) {
215225 Logger.verbose(
216216- "Avatar in incoming profile record has no link to blob",
226226+ `Avatar in incoming profile record has no link to blob (${event.did})`,
217227 record,
218228 );
219229 return;
220230 }
221231222232 if (record.avatar.size > 1000000) {
223223- Logger.verbose("Avatar in incoming profile record is too large", record);
233233+ Logger.verbose(
234234+ `Avatar in incoming profile record is too large (${event.did})`,
235235+ record,
236236+ );
224237 return;
225238 }
226239 }
···239252 description: record.description,
240253 });
241254242242- Logger.verbose("Indexed new profile for:", convertDidToString(event.did));
255255+ Logger.verbose(
256256+ `Indexed new profile: ${convertDidToString(event.did)}`,
257257+ event,
258258+ );
243259}
+9-28
backend/src/network/validator.ts
···8787 return false;
8888 }
89899090- if (record.name.length < 1) {
9191- Logger.verbose("Name from incoming tag record is too short", record);
9292- }
9393-9490 if (record.color) {
9591 if (record.color.length > 7) {
9692 Logger.verbose("Color from incoming tag record is too long", record);
9793 return false;
9894 }
9995100100- if (record.color.length < 4) {
101101- Logger.verbose("Color from incoming tag record is too short", record);
9696+ if (!record.color.match("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$")) {
9797+ Logger.verbose(
9898+ "Invalid hexadecimal color for incoming tag record",
9999+ record,
100100+ );
102101 return false;
103102 }
103103+ }
104104105105- if (!record.color.match("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$")) {
105105+ if (record.description) {
106106+ if (record.description.length > 500) {
106107 Logger.verbose(
107107- "Invalid hexadecimal color for incoming tag record",
108108+ "Description from incoming tag record is too long",
108109 record,
109110 );
110111 return false;
···127128 return false;
128129 }
129130130130- if (record.url.length < 3) {
131131- Logger.verbose("Too short url from incoming clip record", record);
132132- return false;
133133- }
134134-135131 if (record.title.length > 2048) {
136132 Logger.verbose("Too long title from incoming clip record", record);
137133 return false;
138134 }
139135140140- if (record.title.length < 1) {
141141- Logger.verbose("Too short title from incoming clip record", record);
142142- return false;
143143- }
144144-145136 if (record.description.length > 4096) {
146137 Logger.verbose("Too long description from incoming clip record", record);
147138 return false;
148139 }
149140150150- if (record.description.length < 1) {
151151- Logger.verbose("Too short description from incoming clip record", record);
152152- return false;
153153- }
154154-155141 if (record.notes) {
156142 if (record.notes.length > 10000) {
157143 Logger.verbose("Too long notes from incoming clip record", record);
158158- return false;
159159- }
160160-161161- if (record.notes.length < 1) {
162162- Logger.verbose("Too short notes from incoming clip record", record);
163144 return false;
164145 }
165146 }