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