ssb: Respond to tunnel.endpoints.  Patchwork didn't seem to like that we responded to tunnel.isRoom but not this.
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build Tilde Friends / Build-All (push) Successful in 28m4s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Build Tilde Friends / Build-All (push) Successful in 28m4s
				
			This commit is contained in:
		
							
								
								
									
										20
									
								
								src/ssb.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								src/ssb.c
									
									
									
									
									
								
							@@ -294,6 +294,8 @@ typedef struct _tf_ssb_connection_t
 | 
				
			|||||||
	tf_ssb_state_t state;
 | 
						tf_ssb_state_t state;
 | 
				
			||||||
	bool is_attendant;
 | 
						bool is_attendant;
 | 
				
			||||||
	int32_t attendant_request_number;
 | 
						int32_t attendant_request_number;
 | 
				
			||||||
 | 
						bool is_endpoint;
 | 
				
			||||||
 | 
						int32_t endpoint_request_number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint8_t epub[crypto_box_PUBLICKEYBYTES];
 | 
						uint8_t epub[crypto_box_PUBLICKEYBYTES];
 | 
				
			||||||
	uint8_t epriv[crypto_box_SECRETKEYBYTES];
 | 
						uint8_t epriv[crypto_box_SECRETKEYBYTES];
 | 
				
			||||||
@@ -942,6 +944,7 @@ bool tf_ssb_connection_rpc_send_error_method_not_allowed(tf_ssb_connection_t* co
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	char buffer[1024] = "";
 | 
						char buffer[1024] = "";
 | 
				
			||||||
	snprintf(buffer, sizeof(buffer), "method '%s' is not in list of allowed methods", name);
 | 
						snprintf(buffer, sizeof(buffer), "method '%s' is not in list of allowed methods", name);
 | 
				
			||||||
 | 
						tf_printf("%s\n", buffer);
 | 
				
			||||||
	return tf_ssb_connection_rpc_send_error(connection, flags, request_number, buffer);
 | 
						return tf_ssb_connection_rpc_send_error(connection, flags, request_number, buffer);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3857,6 +3860,23 @@ void tf_ssb_connection_set_attendant(tf_ssb_connection_t* connection, bool atten
 | 
				
			|||||||
	_tf_ssb_notify_broadcasts_changed(connection->ssb);
 | 
						_tf_ssb_notify_broadcasts_changed(connection->ssb);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void tf_ssb_connection_set_endpoint(tf_ssb_connection_t* connection, bool endpoint, int request_number)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						connection->is_endpoint = endpoint;
 | 
				
			||||||
 | 
						connection->endpoint_request_number = request_number;
 | 
				
			||||||
 | 
						_tf_ssb_notify_broadcasts_changed(connection->ssb);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool tf_ssb_connection_is_endpoint(tf_ssb_connection_t* connection)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return connection->is_endpoint;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int32_t tf_ssb_connection_get_endpoint_request_number(tf_ssb_connection_t* connection)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return connection->endpoint_request_number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void tf_ssb_connection_clear_room_attendants(tf_ssb_connection_t* connection)
 | 
					void tf_ssb_connection_clear_room_attendants(tf_ssb_connection_t* connection)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int modified = 0;
 | 
						int modified = 0;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								src/ssb.h
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/ssb.h
									
									
									
									
									
								
							@@ -883,6 +883,28 @@ int32_t tf_ssb_connection_get_attendant_request_number(tf_ssb_connection_t* conn
 | 
				
			|||||||
*/
 | 
					*/
 | 
				
			||||||
void tf_ssb_connection_set_attendant(tf_ssb_connection_t* connection, bool attendant, int request_number);
 | 
					void tf_ssb_connection_set_attendant(tf_ssb_connection_t* connection, bool attendant, int request_number);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					** Register for endpoint change notifications on a connection.
 | 
				
			||||||
 | 
					** @param connection The SHS connection.
 | 
				
			||||||
 | 
					** @param endpoint Whether this connection will be an endpoint.
 | 
				
			||||||
 | 
					** @param request_number The request number on which to send endpoint changes.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					void tf_ssb_connection_set_endpoint(tf_ssb_connection_t* connection, bool endpoint, int request_number);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					** Get whether we are a potential tunnel endpoint.
 | 
				
			||||||
 | 
					** @param connection The SHS connection.
 | 
				
			||||||
 | 
					** @return True if this is an endpoint connection.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					bool tf_ssb_connection_is_endpoint(tf_ssb_connection_t* connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					** Get the request number used to notify of tunnel endpoint changes.
 | 
				
			||||||
 | 
					** @param connection the SHS connection.
 | 
				
			||||||
 | 
					** @return A request number.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					int32_t tf_ssb_connection_get_endpoint_request_number(tf_ssb_connection_t* connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
** Clear all attendants from a room.
 | 
					** Clear all attendants from a room.
 | 
				
			||||||
** @param connection The SHS connection.
 | 
					** @param connection The SHS connection.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -435,6 +435,36 @@ static void _tf_ssb_rpc_room_meta(tf_ssb_connection_t* connection, uint8_t flags
 | 
				
			|||||||
	JS_FreeValue(context, response);
 | 
						JS_FreeValue(context, response);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void _tf_ssb_rpc_send_endpoints(tf_ssb_t* ssb)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						JSContext* context = tf_ssb_get_context(ssb);
 | 
				
			||||||
 | 
						JSValue endpoints = JS_NewArray(context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tf_ssb_connection_t* connections[1024];
 | 
				
			||||||
 | 
						int count = tf_ssb_get_connections(ssb, connections, tf_countof(connections));
 | 
				
			||||||
 | 
						int id_count = 0;
 | 
				
			||||||
 | 
						for (int i = 0; i < count; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							char id[k_id_base64_len] = { 0 };
 | 
				
			||||||
 | 
							if ((tf_ssb_connection_is_attendant(connections[i]) || tf_ssb_connection_is_endpoint(connections[i])) &&
 | 
				
			||||||
 | 
								tf_ssb_connection_is_connected(connections[i]) &&
 | 
				
			||||||
 | 
								tf_ssb_connection_get_id(connections[i], id, sizeof(id)))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								JS_SetPropertyUint32(context, endpoints, id_count++, JS_NewString(context, id));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (int i = 0; i < count; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (tf_ssb_connection_is_endpoint(connections[i]) && tf_ssb_connection_is_connected(connections[i]))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								int32_t request_number = tf_ssb_connection_get_ebt_request_number(connections[i]);
 | 
				
			||||||
 | 
								tf_ssb_connection_rpc_send_json(connections[i], k_ssb_rpc_flag_json | k_ssb_rpc_flag_stream, -request_number, NULL, endpoints, NULL, NULL, NULL);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						JS_FreeValue(context, endpoints);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void _tf_ssb_rpc_room_attendants(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data)
 | 
					static void _tf_ssb_rpc_room_attendants(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	tf_ssb_t* ssb = tf_ssb_connection_get_ssb(connection);
 | 
						tf_ssb_t* ssb = tf_ssb_connection_get_ssb(connection);
 | 
				
			||||||
@@ -460,6 +490,7 @@ static void _tf_ssb_rpc_room_attendants(tf_ssb_connection_t* connection, uint8_t
 | 
				
			|||||||
	tf_ssb_connection_t* connections[1024];
 | 
						tf_ssb_connection_t* connections[1024];
 | 
				
			||||||
	int count = tf_ssb_get_connections(ssb, connections, tf_countof(connections));
 | 
						int count = tf_ssb_get_connections(ssb, connections, tf_countof(connections));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool have_endpoints = false;
 | 
				
			||||||
	for (int i = 0; i < count; i++)
 | 
						for (int i = 0; i < count; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		char id[k_id_base64_len] = { 0 };
 | 
							char id[k_id_base64_len] = { 0 };
 | 
				
			||||||
@@ -469,15 +500,37 @@ static void _tf_ssb_rpc_room_attendants(tf_ssb_connection_t* connection, uint8_t
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			tf_ssb_connection_rpc_send_json(connections[i], flags, -tf_ssb_connection_get_attendant_request_number(connections[i]), NULL, joined, NULL, NULL, NULL);
 | 
								tf_ssb_connection_rpc_send_json(connections[i], flags, -tf_ssb_connection_get_attendant_request_number(connections[i]), NULL, joined, NULL, NULL, NULL);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (tf_ssb_connection_is_endpoint(connections[i]))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								have_endpoints = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	JS_SetPropertyStr(context, state, "ids", ids);
 | 
						JS_SetPropertyStr(context, state, "ids", ids);
 | 
				
			||||||
	tf_ssb_connection_rpc_send_json(connection, flags, -request_number, NULL, state, NULL, NULL, NULL);
 | 
						tf_ssb_connection_rpc_send_json(connection, flags, -request_number, NULL, state, NULL, NULL, NULL);
 | 
				
			||||||
	JS_FreeValue(context, joined);
 | 
						JS_FreeValue(context, joined);
 | 
				
			||||||
	JS_FreeValue(context, state);
 | 
						JS_FreeValue(context, state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (have_endpoints)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							_tf_ssb_rpc_send_endpoints(ssb);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tf_ssb_connection_set_attendant(connection, true, request_number);
 | 
						tf_ssb_connection_set_attendant(connection, true, request_number);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void _tf_ssb_rpc_tunnel_endpoints(tf_ssb_connection_t* connection, uint8_t flags, int32_t request_number, JSValue args, const uint8_t* message, size_t size, void* user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						tf_ssb_t* ssb = tf_ssb_connection_get_ssb(connection);
 | 
				
			||||||
 | 
						if (!tf_ssb_is_room(ssb))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							tf_ssb_connection_rpc_send_error_method_not_allowed(connection, flags, -request_number, "room.attendants");
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tf_ssb_connection_set_endpoint(connection, true, request_number);
 | 
				
			||||||
 | 
						_tf_ssb_rpc_send_endpoints(ssb);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _blobs_get_t
 | 
					typedef struct _blobs_get_t
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char id[k_blob_id_len];
 | 
						char id[k_blob_id_len];
 | 
				
			||||||
@@ -1213,6 +1266,11 @@ static void _tf_ssb_rpc_connections_changed_callback(tf_ssb_t* ssb, tf_ssb_chang
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			JS_FreeValue(context, left);
 | 
								JS_FreeValue(context, left);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (tf_ssb_connection_is_endpoint(connection) || tf_ssb_connection_is_attendant(connection))
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									_tf_ssb_rpc_send_endpoints(ssb);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1577,6 +1635,7 @@ void tf_ssb_rpc_register(tf_ssb_t* ssb)
 | 
				
			|||||||
	tf_ssb_add_rpc_callback(ssb, "blobs.createWants", _tf_ssb_rpc_blobs_createWants, NULL, NULL); /* SOURCE */
 | 
						tf_ssb_add_rpc_callback(ssb, "blobs.createWants", _tf_ssb_rpc_blobs_createWants, NULL, NULL); /* SOURCE */
 | 
				
			||||||
	tf_ssb_add_rpc_callback(ssb, "tunnel.connect", _tf_ssb_rpc_tunnel_connect, NULL, NULL); /* DUPLEX */
 | 
						tf_ssb_add_rpc_callback(ssb, "tunnel.connect", _tf_ssb_rpc_tunnel_connect, NULL, NULL); /* DUPLEX */
 | 
				
			||||||
	tf_ssb_add_rpc_callback(ssb, "tunnel.isRoom", _tf_ssb_rpc_room_meta, NULL, NULL); /* FAKE-ASYNC */
 | 
						tf_ssb_add_rpc_callback(ssb, "tunnel.isRoom", _tf_ssb_rpc_room_meta, NULL, NULL); /* FAKE-ASYNC */
 | 
				
			||||||
 | 
						tf_ssb_add_rpc_callback(ssb, "tunnel.endpoints", _tf_ssb_rpc_tunnel_endpoints, NULL, NULL); /* SOURCE */
 | 
				
			||||||
	tf_ssb_add_rpc_callback(ssb, "room.metadata", _tf_ssb_rpc_room_meta, NULL, NULL); /* ASYNC */
 | 
						tf_ssb_add_rpc_callback(ssb, "room.metadata", _tf_ssb_rpc_room_meta, NULL, NULL); /* ASYNC */
 | 
				
			||||||
	tf_ssb_add_rpc_callback(ssb, "room.attendants", _tf_ssb_rpc_room_attendants, NULL, NULL); /* SOURCE */
 | 
						tf_ssb_add_rpc_callback(ssb, "room.attendants", _tf_ssb_rpc_room_attendants, NULL, NULL); /* SOURCE */
 | 
				
			||||||
	tf_ssb_add_rpc_callback(ssb, "createHistoryStream", _tf_ssb_rpc_createHistoryStream, NULL, NULL); /* SOURCE */
 | 
						tf_ssb_add_rpc_callback(ssb, "createHistoryStream", _tf_ssb_rpc_createHistoryStream, NULL, NULL); /* SOURCE */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user