forked from cory/tildefriends
		
	To calculate an ID, take the utf-8 message, convert it to utf-16, and then throw away the high bytes. Of course.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3834 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		| @@ -219,7 +219,9 @@ function ebtReplicateSendClock(request, have) { | ||||
| 	} | ||||
|  | ||||
| 	var to_send = {} | ||||
| 	for (let id of ids) { | ||||
| 	var offset = Math.floor(Math.random() * ids.length); | ||||
| 	for (var i = 0; i < ids.length; i++) { | ||||
| 		var id = ids[(i + offset) % ids.length]; | ||||
| 		if (last_sent[id] === undefined || message[id] > last_sent[id]) { | ||||
| 			last_sent[id] = to_send[id] = message[id] === -1 ? -1 : message[id] << 1; | ||||
| 		} | ||||
|   | ||||
							
								
								
									
										25
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -569,20 +569,35 @@ static int _tf_command_check(const char* file, int argc, char* argv[]) | ||||
| 	int extra_count = 0; | ||||
| 	const char *err = NULL; | ||||
| 	XOPT_PARSE(file, XOPT_CTX_KEEPFIRST | XOPT_CTX_STRICT, options, &args, argc, (const char**)argv, &extra_count, &extras, &err, stderr, "post [options]", "options:", NULL, 15); | ||||
| 	if (extras) | ||||
| 	{ | ||||
| 		free((void*)extras); | ||||
| 	} | ||||
| 	if (err) | ||||
| 	{ | ||||
| 		if (extras) | ||||
| 		{ | ||||
| 			free((void*)extras); | ||||
| 		} | ||||
| 		fprintf(stderr, "Error: %s\n", err); | ||||
| 		return 2; | ||||
| 	} | ||||
|  | ||||
| 	bool result = true; | ||||
| 	sqlite3* db = NULL; | ||||
| 	sqlite3_open("db.sqlite", &db); | ||||
| 	bool result = tf_ssb_db_check(db); | ||||
| 	if (extra_count) | ||||
| 	{ | ||||
| 		for (int i = 0; i < extra_count; i++) | ||||
| 		{ | ||||
| 			result = result && tf_ssb_db_check(db, extras[i]); | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		result = tf_ssb_db_check(db, NULL); | ||||
| 	} | ||||
| 	sqlite3_close(db); | ||||
| 	if (extras) | ||||
| 	{ | ||||
| 		free((void*)extras); | ||||
| 	} | ||||
| 	return result ? EXIT_SUCCESS : EXIT_FAILURE; | ||||
|  | ||||
| xopt_help: | ||||
|   | ||||
							
								
								
									
										31
									
								
								src/ssb.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								src/ssb.c
									
									
									
									
									
								
							| @@ -512,6 +512,25 @@ static const uint8_t* _utf8_to_cp(const uint8_t* ch, uint32_t* out_cp) | ||||
| 	return ch + actual_len; | ||||
| } | ||||
|  | ||||
| static uint32_t _cp_to_utf16(uint32_t cp, uint16_t* out_h, uint16_t* out_l) | ||||
| { | ||||
| 	if (cp < 0x10000) | ||||
| 	{ | ||||
| 		*out_h = 0; | ||||
| 		*out_l = cp & 0xffff; | ||||
| 		return cp; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		uint32_t t = cp - 0x10000; | ||||
| 		uint32_t h = ((t << 12) >> 22) + 0xd800; | ||||
| 		uint32_t l = ((t << 22) >> 22) + 0xdc00; | ||||
| 		*out_h = h & 0xffff; | ||||
| 		*out_l = l & 0xffff; | ||||
| 		return (h << 16) | (l & 0xffff); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void tf_ssb_calculate_message_id(JSContext* context, JSValue message, char* out_id, size_t out_id_size) | ||||
| { | ||||
| 	JSValue idval = JS_JSONStringify(context, message, JS_NULL, JS_NewInt32(context, 2)); | ||||
| @@ -525,7 +544,17 @@ void tf_ssb_calculate_message_id(JSContext* context, JSValue message, char* out_ | ||||
| 	{ | ||||
| 		uint32_t cp = 0; | ||||
| 		p = _utf8_to_cp(p, &cp); | ||||
| 		*write_pos++ = (cp & 0xff); | ||||
| 		uint16_t h = 0; | ||||
| 		uint16_t l = 0; | ||||
| 		_cp_to_utf16(cp, &h, &l); | ||||
| 		if (h) | ||||
| 		{ | ||||
| 			*write_pos++ = h & 0xff; | ||||
| 		} | ||||
| 		if (l) | ||||
| 		{ | ||||
| 			*write_pos++ = l & 0xff; | ||||
| 		} | ||||
| 	} | ||||
| 	size_t latin1_len = write_pos - (uint8_t*)latin1; | ||||
| 	*write_pos++ = '\0'; | ||||
|   | ||||
							
								
								
									
										11
									
								
								src/ssb.db.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/ssb.db.c
									
									
									
									
									
								
							| @@ -545,14 +545,21 @@ bool _tf_ssb_update_message_id(sqlite3* db, const char* old_id, const char* new_ | ||||
| 	return success; | ||||
| } | ||||
|  | ||||
| bool tf_ssb_db_check(sqlite3* db) | ||||
| bool tf_ssb_db_check(sqlite3* db, const char* check_author) | ||||
| { | ||||
| 	JSRuntime* runtime = JS_NewRuntime(); | ||||
| 	JSContext* context = JS_NewContext(runtime); | ||||
|  | ||||
| 	sqlite3_stmt* statement = NULL; | ||||
| 	if (sqlite3_prepare(db, "SELECT id, previous, author, sequence, timestamp, hash, content, signature, sequence_before_author FROM messages ORDER BY author, sequence", -1, &statement, NULL) == SQLITE_OK) | ||||
| 	int result = check_author ? | ||||
| 		sqlite3_prepare(db, "SELECT id, previous, author, sequence, timestamp, hash, content, signature, sequence_before_author FROM messages WHERE author = ? ORDER BY author, sequence", -1, &statement, NULL) : | ||||
| 		sqlite3_prepare(db, "SELECT id, previous, author, sequence, timestamp, hash, content, signature, sequence_before_author FROM messages ORDER BY author, sequence", -1, &statement, NULL); | ||||
| 	if (result == SQLITE_OK) | ||||
| 	{ | ||||
| 		if (check_author) | ||||
| 		{ | ||||
| 			sqlite3_bind_text(statement, 1, check_author, -1, NULL); | ||||
| 		} | ||||
| 		char previous_id[k_id_base64_len]; | ||||
| 		while (sqlite3_step(statement) == SQLITE_ROW) | ||||
| 		{ | ||||
|   | ||||
| @@ -16,4 +16,4 @@ bool tf_ssb_db_get_latest_message_by_author(tf_ssb_t* ssb, const char* author, i | ||||
| void tf_ssb_db_visit_query(tf_ssb_t* ssb, const char* query, const JSValue binds, void (*callback)(JSValue row, void* user_data), void* user_data); | ||||
|  | ||||
| typedef struct sqlite3 sqlite3; | ||||
| bool tf_ssb_db_check(sqlite3* db); | ||||
| bool tf_ssb_db_check(sqlite3* db, const char* author); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user