Appending a message produces the ID. And bump the version.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4344 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										6
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								Makefile
									
									
									
									
									
								
							@@ -3,9 +3,9 @@
 | 
				
			|||||||
MAKEFLAGS += --warn-undefined-variables
 | 
					MAKEFLAGS += --warn-undefined-variables
 | 
				
			||||||
MAKEFLAGS += --no-builtin-rules
 | 
					MAKEFLAGS += --no-builtin-rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VERSION_CODE := 8
 | 
					VERSION_CODE := 9
 | 
				
			||||||
VERSION_NUMBER := 0.0.8
 | 
					VERSION_NUMBER := 0.0.9-wip
 | 
				
			||||||
VERSION_NAME := The secret ingredient is love.
 | 
					VERSION_NAME := Failure is the only opportunity to begin again.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PROJECT = tildefriends
 | 
					PROJECT = tildefriends
 | 
				
			||||||
BUILD_DIR ?= out
 | 
					BUILD_DIR ?= out
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
					<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
	package="com.unprompted.tildefriends"
 | 
						package="com.unprompted.tildefriends"
 | 
				
			||||||
	versionCode="8"
 | 
						versionCode="9"
 | 
				
			||||||
	versionName="0.0.8">
 | 
						versionName="0.0.9">
 | 
				
			||||||
	<uses-sdk android:minSdkVersion="26"/>
 | 
						<uses-sdk android:minSdkVersion="26"/>
 | 
				
			||||||
	<uses-permission android:name="android.permission.INTERNET"/>
 | 
						<uses-permission android:name="android.permission.INTERNET"/>
 | 
				
			||||||
	<application android:label="Tilde Friends" android:usesCleartextTraffic="true" android:debuggable="true">
 | 
						<application android:label="Tilde Friends" android:usesCleartextTraffic="true" android:debuggable="true">
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								src/ssb.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/ssb.c
									
									
									
									
									
								
							@@ -1666,7 +1666,7 @@ static bool _tf_ssb_connection_box_stream_recv(tf_ssb_connection_t* connection)
 | 
				
			|||||||
	return true;
 | 
						return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void tf_ssb_append_message_with_keys(tf_ssb_t* ssb, const char* author, const uint8_t* private_key, JSValue message)
 | 
					bool tf_ssb_append_message_with_keys(tf_ssb_t* ssb, const char* author, const uint8_t* private_key, JSValue message, char* out_id, size_t out_id_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char previous_id[crypto_hash_sha256_BYTES * 2];
 | 
						char previous_id[crypto_hash_sha256_BYTES * 2];
 | 
				
			||||||
	int64_t previous_sequence = 0;
 | 
						int64_t previous_sequence = 0;
 | 
				
			||||||
@@ -1718,12 +1718,15 @@ void tf_ssb_append_message_with_keys(tf_ssb_t* ssb, const char* author, const ui
 | 
				
			|||||||
	JS_FreeCString(context, json);
 | 
						JS_FreeCString(context, json);
 | 
				
			||||||
	JS_FreeValue(context, jsonval);
 | 
						JS_FreeValue(context, jsonval);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool stored = false;
 | 
				
			||||||
	char id[sodium_base64_ENCODED_LEN(crypto_hash_sha256_BYTES, sodium_base64_VARIANT_ORIGINAL) + 7 + 1];
 | 
						char id[sodium_base64_ENCODED_LEN(crypto_hash_sha256_BYTES, sodium_base64_VARIANT_ORIGINAL) + 7 + 1];
 | 
				
			||||||
	if (valid && tf_ssb_verify_and_strip_signature(ssb->context, root, id, sizeof(id), NULL, 0, NULL))
 | 
						if (valid && tf_ssb_verify_and_strip_signature(ssb->context, root, id, sizeof(id), NULL, 0, NULL))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (tf_ssb_db_store_message(ssb, ssb->context, id, root, signature_base64, false))
 | 
							if (tf_ssb_db_store_message(ssb, ssb->context, id, root, signature_base64, false))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			tf_ssb_notify_message_added(ssb, id);
 | 
								tf_ssb_notify_message_added(ssb, id);
 | 
				
			||||||
 | 
								snprintf(out_id, out_id_size, "%s", id);
 | 
				
			||||||
 | 
								stored = true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@@ -1735,7 +1738,13 @@ void tf_ssb_append_message_with_keys(tf_ssb_t* ssb, const char* author, const ui
 | 
				
			|||||||
		tf_printf("Failed to verify message signature.\n");
 | 
							tf_printf("Failed to verify message signature.\n");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!stored && out_id && out_id_size)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							*out_id = '\0';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	JS_FreeValue(context, root);
 | 
						JS_FreeValue(context, root);
 | 
				
			||||||
 | 
						return stored;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void _tf_ssb_connection_dispatch_scheduled(tf_ssb_connection_t* connection)
 | 
					static void _tf_ssb_connection_dispatch_scheduled(tf_ssb_connection_t* connection)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -87,7 +87,7 @@ JSContext* tf_ssb_get_context(tf_ssb_t* ssb);
 | 
				
			|||||||
void tf_ssb_broadcast_listener_start(tf_ssb_t* ssb, bool linger);
 | 
					void tf_ssb_broadcast_listener_start(tf_ssb_t* ssb, bool linger);
 | 
				
			||||||
void tf_ssb_broadcast_sender_start(tf_ssb_t* ssb);
 | 
					void tf_ssb_broadcast_sender_start(tf_ssb_t* ssb);
 | 
				
			||||||
void tf_ssb_run(tf_ssb_t* ssb);
 | 
					void tf_ssb_run(tf_ssb_t* ssb);
 | 
				
			||||||
void tf_ssb_append_message_with_keys(tf_ssb_t* ssb, const char* author, const uint8_t* private_key, JSValue message);
 | 
					bool tf_ssb_append_message_with_keys(tf_ssb_t* ssb, const char* author, const uint8_t* private_key, JSValue message, char* out_id, size_t out_id_size);
 | 
				
			||||||
bool tf_ssb_whoami(tf_ssb_t* ssb, char* out_id, size_t out_id_size);
 | 
					bool tf_ssb_whoami(tf_ssb_t* ssb, char* out_id, size_t out_id_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void tf_ssb_visit_broadcasts(tf_ssb_t* ssb, void (*callback)(const char* host, const struct sockaddr_in* addr, tf_ssb_connection_t* tunnel, const uint8_t* pub, void* user_data), void* user_data);
 | 
					void tf_ssb_visit_broadcasts(tf_ssb_t* ssb, void (*callback)(const char* host, const struct sockaddr_in* addr, tf_ssb_connection_t* tunnel, const uint8_t* pub, void* user_data), void* user_data);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -118,7 +118,9 @@ static JSValue _tf_ssb_appendMessageWithIdentity(JSContext* context, JSValueCons
 | 
				
			|||||||
		uint8_t private_key[crypto_sign_SECRETKEYBYTES];
 | 
							uint8_t private_key[crypto_sign_SECRETKEYBYTES];
 | 
				
			||||||
		if (tf_ssb_db_identity_get_private_key(ssb, user, id, private_key, sizeof(private_key)))
 | 
							if (tf_ssb_db_identity_get_private_key(ssb, user, id, private_key, sizeof(private_key)))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			tf_ssb_append_message_with_keys(ssb, id, private_key, argv[2]);
 | 
								char id[k_id_base64_len] = { 0 };
 | 
				
			||||||
 | 
								tf_ssb_append_message_with_keys(ssb, id, private_key, argv[2], id, sizeof(id));
 | 
				
			||||||
 | 
								result = JS_NewString(context, id);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -170,17 +170,19 @@ void tf_ssb_test_ssb(const tf_test_options_t* options)
 | 
				
			|||||||
	b = tf_ssb_db_blob_store(ssb0, (const uint8_t*)k_blob, strlen(k_blob), blob_id, sizeof(blob_id), NULL);
 | 
						b = tf_ssb_db_blob_store(ssb0, (const uint8_t*)k_blob, strlen(k_blob), blob_id, sizeof(blob_id), NULL);
 | 
				
			||||||
	assert(b);
 | 
						assert(b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char message_id[k_id_base64_len] = { 0 };
 | 
				
			||||||
	JSContext* context0 = tf_ssb_get_context(ssb0);
 | 
						JSContext* context0 = tf_ssb_get_context(ssb0);
 | 
				
			||||||
	JSValue obj = JS_NewObject(context0);
 | 
						JSValue obj = JS_NewObject(context0);
 | 
				
			||||||
	JS_SetPropertyStr(context0, obj, "type", JS_NewString(context0, "post"));
 | 
						JS_SetPropertyStr(context0, obj, "type", JS_NewString(context0, "post"));
 | 
				
			||||||
	JS_SetPropertyStr(context0, obj, "text", JS_NewString(context0, "Hello, world!"));
 | 
						JS_SetPropertyStr(context0, obj, "text", JS_NewString(context0, "Hello, world!"));
 | 
				
			||||||
	tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj);
 | 
						tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj, message_id, sizeof(message_id));
 | 
				
			||||||
	JS_FreeValue(context0, obj);
 | 
						JS_FreeValue(context0, obj);
 | 
				
			||||||
 | 
						printf("appended %s\n", message_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	obj = JS_NewObject(context0);
 | 
						obj = JS_NewObject(context0);
 | 
				
			||||||
	JS_SetPropertyStr(context0, obj, "type", JS_NewString(context0, "post"));
 | 
						JS_SetPropertyStr(context0, obj, "type", JS_NewString(context0, "post"));
 | 
				
			||||||
	JS_SetPropertyStr(context0, obj, "text", JS_NewString(context0, "First post."));
 | 
						JS_SetPropertyStr(context0, obj, "text", JS_NewString(context0, "First post."));
 | 
				
			||||||
	tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj);
 | 
						tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj, NULL, 0);
 | 
				
			||||||
	JS_FreeValue(context0, obj);
 | 
						JS_FreeValue(context0, obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	obj = JS_NewObject(context0);
 | 
						obj = JS_NewObject(context0);
 | 
				
			||||||
@@ -191,7 +193,7 @@ void tf_ssb_test_ssb(const tf_test_options_t* options)
 | 
				
			|||||||
	JS_SetPropertyStr(context0, mention, "link", JS_NewString(context0, blob_id));
 | 
						JS_SetPropertyStr(context0, mention, "link", JS_NewString(context0, blob_id));
 | 
				
			||||||
	JS_SetPropertyUint32(context0, mentions, 0, mention);
 | 
						JS_SetPropertyUint32(context0, mentions, 0, mention);
 | 
				
			||||||
	JS_SetPropertyStr(context0, obj, "mentions", mentions);
 | 
						JS_SetPropertyStr(context0, obj, "mentions", mentions);
 | 
				
			||||||
	tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj);
 | 
						tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj, NULL, 0);
 | 
				
			||||||
	JS_FreeValue(context0, obj);
 | 
						JS_FreeValue(context0, obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint8_t* b0;
 | 
						uint8_t* b0;
 | 
				
			||||||
@@ -247,7 +249,7 @@ void tf_ssb_test_ssb(const tf_test_options_t* options)
 | 
				
			|||||||
	obj = JS_NewObject(context0);
 | 
						obj = JS_NewObject(context0);
 | 
				
			||||||
	JS_SetPropertyStr(context0, obj, "type", JS_NewString(context0, "post"));
 | 
						JS_SetPropertyStr(context0, obj, "type", JS_NewString(context0, "post"));
 | 
				
			||||||
	JS_SetPropertyStr(context0, obj, "text", JS_NewString(context0, "Message to self."));
 | 
						JS_SetPropertyStr(context0, obj, "text", JS_NewString(context0, "Message to self."));
 | 
				
			||||||
	tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj);
 | 
						tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj, NULL, 0);
 | 
				
			||||||
	JS_FreeValue(context0, obj);
 | 
						JS_FreeValue(context0, obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (count0 == 0)
 | 
						while (count0 == 0)
 | 
				
			||||||
@@ -497,7 +499,7 @@ void tf_ssb_test_following(const tf_test_options_t* options)
 | 
				
			|||||||
		JS_SetPropertyStr(context, message, "type", JS_NewString(context, "contact")); \
 | 
							JS_SetPropertyStr(context, message, "type", JS_NewString(context, "contact")); \
 | 
				
			||||||
		JS_SetPropertyStr(context, message, "contact", JS_NewString(context, id)); \
 | 
							JS_SetPropertyStr(context, message, "contact", JS_NewString(context, id)); \
 | 
				
			||||||
		JS_SetPropertyStr(context, message, "following", follow ? JS_TRUE : JS_FALSE); \
 | 
							JS_SetPropertyStr(context, message, "following", follow ? JS_TRUE : JS_FALSE); \
 | 
				
			||||||
		tf_ssb_append_message_with_keys(ssb, id, priv, message); \
 | 
							tf_ssb_append_message_with_keys(ssb, id, priv, message, NULL, 0); \
 | 
				
			||||||
		JS_FreeValue(context, message); \
 | 
							JS_FreeValue(context, message); \
 | 
				
			||||||
		context = NULL
 | 
							context = NULL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -573,7 +575,7 @@ void tf_ssb_test_bench(const tf_test_options_t* options)
 | 
				
			|||||||
	JS_SetPropertyStr(tf_ssb_get_context(ssb0), obj, "text", JS_NewString(tf_ssb_get_context(ssb0), "Hello, world!"));
 | 
						JS_SetPropertyStr(tf_ssb_get_context(ssb0), obj, "text", JS_NewString(tf_ssb_get_context(ssb0), "Hello, world!"));
 | 
				
			||||||
	for (int i = 0; i < k_messages; i++)
 | 
						for (int i = 0; i < k_messages; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj);
 | 
							tf_ssb_append_message_with_keys(ssb0, id0, priv0, obj, NULL, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	JS_FreeValue(tf_ssb_get_context(ssb0), obj);
 | 
						JS_FreeValue(tf_ssb_get_context(ssb0), obj);
 | 
				
			||||||
	clock_gettime(CLOCK_REALTIME, &end_time);
 | 
						clock_gettime(CLOCK_REALTIME, &end_time);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
#define VERSION_NUMBER "0.0.8"
 | 
					#define VERSION_NUMBER "0.0.9-wip"
 | 
				
			||||||
#define VERSION_NAME "The secret ingredient is love."
 | 
					#define VERSION_NAME "Failure is the only opportunity to begin again."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user