mbedsock: Init
This commit is contained in:
		
							parent
							
								
									276ad4f22b
								
							
						
					
					
						commit
						4ef73546aa
					
				@ -13,6 +13,14 @@ This package contains the actual XMPP code that is platform-independent.
 | 
				
			|||||||
allows the user to resolve SRV records and thus support XEP-0368. Due to how DNS
 | 
					allows the user to resolve SRV records and thus support XEP-0368. Due to how DNS
 | 
				
			||||||
resolution is implemented, Flutter is required.
 | 
					resolution is implemented, Flutter is required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### mbedsock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This package contains a C library that wraps [mbedTLS](https://github.com/Mbed-TLS/mbedtls)
 | 
				
			||||||
 | 
					into a form that makes it easily digestable in Dart for use in `moxxmpp_socket`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is so that we can work around various issues with Dart's `SecureSocket`, though
 | 
				
			||||||
 | 
					mostly just the issue with setting a SNI value different from the connecting host name.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## License
 | 
					## License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
See `./LICENSE`.
 | 
					See `./LICENSE`.
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										29
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								flake.nix
									
									
									
									
									
								
							@ -30,14 +30,43 @@
 | 
				
			|||||||
      useGoogleTVAddOns = false;
 | 
					      useGoogleTVAddOns = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    pinnedJDK = pkgs.jdk;
 | 
					    pinnedJDK = pkgs.jdk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mbedsock = pkgs.callPackage ./packages/mbedsock.nix {};
 | 
				
			||||||
  in {
 | 
					  in {
 | 
				
			||||||
 | 
					    packages = {
 | 
				
			||||||
 | 
					      inherit mbedsock;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    devShell = pkgs.mkShell {
 | 
					    devShell = pkgs.mkShell {
 | 
				
			||||||
      buildInputs = with pkgs; [
 | 
					      buildInputs = with pkgs; [
 | 
				
			||||||
        flutter pinnedJDK android.platform-tools dart # Flutter/Android
 | 
					        flutter pinnedJDK android.platform-tools dart # Flutter/Android
 | 
				
			||||||
	      gitlint # Code hygiene
 | 
						      gitlint # Code hygiene
 | 
				
			||||||
	      ripgrep # General utilities
 | 
						      ripgrep # General utilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Flutter dependencies for linux desktop
 | 
				
			||||||
 | 
					        atk
 | 
				
			||||||
 | 
					        cairo
 | 
				
			||||||
 | 
					        clang
 | 
				
			||||||
 | 
					        cmake
 | 
				
			||||||
 | 
					        epoxy
 | 
				
			||||||
 | 
					        gdk-pixbuf
 | 
				
			||||||
 | 
					        glib
 | 
				
			||||||
 | 
					        gtk3
 | 
				
			||||||
 | 
					        harfbuzz
 | 
				
			||||||
 | 
					        ninja
 | 
				
			||||||
 | 
					        pango
 | 
				
			||||||
 | 
					        pcre
 | 
				
			||||||
 | 
					        pkg-config
 | 
				
			||||||
 | 
					        xorg.libX11
 | 
				
			||||||
 | 
					        xorg.xorgproto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # moxxmpp_socket
 | 
				
			||||||
 | 
					        mbedtls
 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      CPATH = "${pkgs.xorg.libX11.dev}/include:${pkgs.xorg.xorgproto}/include";
 | 
				
			||||||
 | 
					      LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [ atk cairo epoxy gdk-pixbuf glib gtk3 harfbuzz pango mbedtls mbedsock ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ANDROID_HOME = (toString ./.) + "/.android/sdk";
 | 
					      ANDROID_HOME = (toString ./.) + "/.android/sdk";
 | 
				
			||||||
      JAVA_HOME = pinnedJDK;
 | 
					      JAVA_HOME = pinnedJDK;
 | 
				
			||||||
      ANDROID_AVD_HOME = (toString ./.) + "/.android/avd";
 | 
					      ANDROID_AVD_HOME = (toString ./.) + "/.android/avd";
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										16
									
								
								mbedsock/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								mbedsock/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					cmake_minimum_required(VERSION 3.7 FATAL_ERROR)
 | 
				
			||||||
 | 
					project(mbedsock VERSION 1.0.0 LANGUAGES C)
 | 
				
			||||||
 | 
					add_library(mbedsock SHARED mbedsock.c mbedsock.h mbedsock.def)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target_include_directories(mbedsock PUBLIC ${MBEDTLS_ROOT_DIR}/include)
 | 
				
			||||||
 | 
					target_link_libraries(mbedsock mbedtls mbedx509 mbedcrypto)
 | 
				
			||||||
 | 
					link_directories(${MBEDTLS_ROOT_DIR}/lib)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set_target_properties(mbedsock PROPERTIES
 | 
				
			||||||
 | 
					    PUBLIC_HEADER mbedsock.h
 | 
				
			||||||
 | 
					    VERSION ${PROJECT_VERSION}
 | 
				
			||||||
 | 
					    SOVERSION 1
 | 
				
			||||||
 | 
					    OUTPUT_NAME "mbedsock"
 | 
				
			||||||
 | 
					    XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Hex_Identity_ID_Goes_Here"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					install(TARGETS mbedsock)
 | 
				
			||||||
							
								
								
									
										188
									
								
								mbedsock/mbedsock.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								mbedsock/mbedsock.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,188 @@
 | 
				
			|||||||
 | 
					#include "mbedtls/ssl.h"
 | 
				
			||||||
 | 
					#include "mbedtls/entropy.h"
 | 
				
			||||||
 | 
					#include "mbedtls/net_sockets.h"
 | 
				
			||||||
 | 
					#include "mbedtls/ctr_drbg.h"
 | 
				
			||||||
 | 
					#include "mbedsock.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct mbedsock_ctx *mbedsock_ctx_new_ex(const char *capath) {
 | 
				
			||||||
 | 
					  struct mbedsock_ctx *ctx = malloc(sizeof(struct mbedsock_ctx));
 | 
				
			||||||
 | 
					  mbedsock_ctx_new(ctx, capath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return ctx;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct mbedsock *mbedsock_new_ex(struct mbedsock_ctx *ctx) {
 | 
				
			||||||
 | 
					  struct mbedsock *sock = malloc(sizeof(struct mbedsock));
 | 
				
			||||||
 | 
					  mbedsock_new(ctx, sock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return sock;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int mbedsock_ctx_new(struct mbedsock_ctx *ctx, const char *capath) {
 | 
				
			||||||
 | 
					  int ret = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mbedtls_x509_crt_init(&ctx->chain);
 | 
				
			||||||
 | 
					  mbedtls_ctr_drbg_init(&ctx->ctr_drbg);
 | 
				
			||||||
 | 
					  mbedtls_entropy_init(&ctx->entropy);
 | 
				
			||||||
 | 
					  if ((ret = mbedtls_ctr_drbg_seed(&ctx->ctr_drbg, mbedtls_entropy_func, &ctx->entropy,
 | 
				
			||||||
 | 
									   (unsigned char *) SSL_PERS,
 | 
				
			||||||
 | 
									   SSL_PERS_LEN)) != 0)
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if((ret = mbedtls_x509_crt_parse_path(&ctx->chain, capath)) < 0 )
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int mbedsock_new(struct mbedsock_ctx *ctx, struct mbedsock *sock) {
 | 
				
			||||||
 | 
					  int ret = 1;
 | 
				
			||||||
 | 
					  mbedtls_net_init(&sock->server_fd);
 | 
				
			||||||
 | 
					  mbedtls_ssl_init(&sock->ssl);
 | 
				
			||||||
 | 
					  mbedtls_ssl_config_init(&sock->conf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mbedtls_ssl_conf_authmode(&sock->conf, MBEDTLS_SSL_VERIFY_REQUIRED);
 | 
				
			||||||
 | 
					  mbedtls_ssl_conf_ca_chain(&sock->conf, &ctx->chain, NULL);
 | 
				
			||||||
 | 
					  mbedtls_ssl_conf_rng(&sock->conf, mbedtls_ctr_drbg_random, &ctx->ctr_drbg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((ret = mbedtls_ssl_setup(&sock->ssl, &sock->conf)) != 0)
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mbedtls_ssl_set_bio(&sock->ssl, &sock->server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((ret = mbedtls_ssl_config_defaults(&sock->conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0)
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sock->secure = false;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mbedsock_free(struct mbedsock *sock) {
 | 
				
			||||||
 | 
					  mbedtls_net_free(&sock->server_fd);
 | 
				
			||||||
 | 
					  mbedtls_ssl_free(&sock->ssl);
 | 
				
			||||||
 | 
					  mbedtls_ssl_config_free(&sock->conf);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mbedsock_ctx_free(struct mbedsock_ctx *ctx) {
 | 
				
			||||||
 | 
					  mbedtls_x509_crt_free(&ctx->chain);
 | 
				
			||||||
 | 
					  mbedtls_ctr_drbg_free(&ctx->ctr_drbg);
 | 
				
			||||||
 | 
					  mbedtls_entropy_free(&ctx->entropy);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mbedsock_free_ex(struct mbedsock *sock) {
 | 
				
			||||||
 | 
					  mbedsock_free(sock);
 | 
				
			||||||
 | 
					  free(sock);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mbedsock_ctx_free_ex(struct mbedsock_ctx *ctx) {
 | 
				
			||||||
 | 
					  mbedsock_ctx_free(ctx);
 | 
				
			||||||
 | 
					  free(ctx);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int mbedsock_do_handshake(struct mbedsock *sock, const char *alpn, const char *sni) {
 | 
				
			||||||
 | 
					  int ret = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Set ALPN, if desired
 | 
				
			||||||
 | 
					  if (alpn != NULL) {
 | 
				
			||||||
 | 
					    const char *alpn_list[2];
 | 
				
			||||||
 | 
					    alpn_list[0] = alpn;
 | 
				
			||||||
 | 
					    alpn_list[1] = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((ret = mbedtls_ssl_conf_alpn_protocols(&sock->conf, alpn_list)) != 0) {
 | 
				
			||||||
 | 
					      return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Set SNI, if desired
 | 
				
			||||||
 | 
					  if (sni != NULL) {
 | 
				
			||||||
 | 
					    if ((ret = mbedtls_ssl_set_hostname(&sock->ssl, sni)) != 0) {
 | 
				
			||||||
 | 
					      return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  while ((ret = mbedtls_ssl_handshake(&sock->ssl)) != 0) {
 | 
				
			||||||
 | 
					    if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )
 | 
				
			||||||
 | 
					      return ret;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Verify the certificates
 | 
				
			||||||
 | 
					  if ((ret = mbedtls_ssl_get_verify_result(&sock->ssl)) != 0) {
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sock->secure = true;
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int mbedsock_connect_secure(struct mbedsock *sock, const char *host, const char *port, const char *alpn, const char *sni) {
 | 
				
			||||||
 | 
					  int ret = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((ret = mbedtls_net_connect(&sock->server_fd, host, port, MBEDTLS_NET_PROTO_TCP)) != 0)
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((ret = mbedsock_do_handshake(sock, alpn, sni)))
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int mbedsock_connect(struct mbedsock *sock, const char *host, const char *port) {
 | 
				
			||||||
 | 
					  return mbedtls_net_connect(&sock->server_fd, host, port, MBEDTLS_NET_PROTO_TCP);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int mbedsock_write(struct mbedsock *sock, const unsigned char *data, int len) {
 | 
				
			||||||
 | 
					  int ret = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (sock->secure) {
 | 
				
			||||||
 | 
					    while ((ret = mbedtls_ssl_write(&sock->ssl, data, len)) <= 0) {
 | 
				
			||||||
 | 
						if(ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE)
 | 
				
			||||||
 | 
						return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    if ((ret = mbedtls_net_send(&sock->server_fd, data, len)) <= 0)
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int mbedsock_read(struct mbedsock *sock, unsigned char *buf, int len) {
 | 
				
			||||||
 | 
					  int ret = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  memset(buf, 0, len);
 | 
				
			||||||
 | 
					  if (sock->secure) {
 | 
				
			||||||
 | 
					    do {
 | 
				
			||||||
 | 
					      ret = mbedtls_ssl_read(&sock->ssl, buf, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE)
 | 
				
			||||||
 | 
					          continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // TODO: Notify
 | 
				
			||||||
 | 
					      if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY)
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (ret < 0)
 | 
				
			||||||
 | 
						return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return ret;
 | 
				
			||||||
 | 
					    } while (true);
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    ret = mbedtls_net_recv(&sock->server_fd, buf, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ret < 0)
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool mbedsock_is_secure(struct mbedsock *sock) {
 | 
				
			||||||
 | 
					  return sock->secure;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										4
									
								
								mbedsock/mbedsock.def
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								mbedsock/mbedsock.def
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					LIBRARY   mbedsock
 | 
				
			||||||
 | 
					EXPORTS
 | 
				
			||||||
 | 
					   mbedsock_ctx_new
 | 
				
			||||||
 | 
					   mbedsock_new
 | 
				
			||||||
							
								
								
									
										109
									
								
								mbedsock/mbedsock.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								mbedsock/mbedsock.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,109 @@
 | 
				
			|||||||
 | 
					#ifndef __MBEDSOCK_H__
 | 
				
			||||||
 | 
					#define __MBEDSOCK_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mbedtls/ssl.h"
 | 
				
			||||||
 | 
					#include "mbedtls/entropy.h"
 | 
				
			||||||
 | 
					#include "mbedtls/net_sockets.h"
 | 
				
			||||||
 | 
					#include "mbedtls/ctr_drbg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SSL_PERS "moxxmpp_socket"
 | 
				
			||||||
 | 
					#define SSL_PERS_LEN sizeof(SSL_PERS)/sizeof(char)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * The context for the sockets. This must be created once and is shared between all
 | 
				
			||||||
 | 
					 * sockets.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct mbedsock_ctx {
 | 
				
			||||||
 | 
					  mbedtls_entropy_context entropy;
 | 
				
			||||||
 | 
					  mbedtls_ctr_drbg_context ctr_drbg;
 | 
				
			||||||
 | 
					  mbedtls_x509_crt chain;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * The data for the socket.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct mbedsock {
 | 
				
			||||||
 | 
					  mbedtls_ssl_context ssl;
 | 
				
			||||||
 | 
					  mbedtls_ssl_config conf;
 | 
				
			||||||
 | 
					  mbedtls_net_context server_fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Indicates whether the socket is secured using TLS (true) or not (false).
 | 
				
			||||||
 | 
					  bool secure;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Create a new mbedsock_ctx context and write it to @ctx. @capath is the path
 | 
				
			||||||
 | 
					 * to the directory containing the system's .crt root CA files.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns true if everything went well; something non-zero on errors.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int mbedsock_ctx_new(struct mbedsock_ctx *ctx, const char *capath);
 | 
				
			||||||
 | 
					struct mbedsock_ctx *mbedsock_ctx_new_ex(const char *capath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Create a new socket using the context @ctx and writes it to @sock. Returns zero
 | 
				
			||||||
 | 
					 * on success; something non-zero on error.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int mbedsock_new(struct mbedsock_ctx *ctx, struct mbedsock *sock);
 | 
				
			||||||
 | 
					struct mbedsock *mbedsock_new_ex(struct mbedsock_ctx *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Free the resources used by @sock.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void mbedsock_free(struct mbedsock *sock);
 | 
				
			||||||
 | 
					void mbedsock_free_ex(struct mbedsock *sock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Free the resources used by @ctx.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void mbedsock_ctx_free(struct mbedsock_ctx *ctx);
 | 
				
			||||||
 | 
					void mbedsock_ctx_free_ex(struct mbedsock_ctx *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Performs the TLS handshake and upgrades the connection @sock to a secured one.
 | 
				
			||||||
 | 
					 * If @alpn is not NULL, then its value will be used for TLS ALPN. If @sni is not NULL,
 | 
				
			||||||
 | 
					 * then its value will be used for Server Name Indication.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns 0 on success; something non-zero on failure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int mbedsock_do_handshake(struct mbedsock *sock, const char *alpn, const char *sni);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Use socket @sock to to connect to @host:@port and immediately call
 | 
				
			||||||
 | 
					 * mbedsock_do_handshake. @alpn and @sni are used for mbedsock_do_handshake.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns 0 on success; something non-zero on failure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int mbedsock_connect_secure(struct mbedsock *sock, const char *host, const char *port, const char *alpn, const char *sni);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Use socket @sock to to connect to @host:@port. The socket is not secured on success.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns 0 on success; something non-zero on failure.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int mbedsock_connect(struct mbedsock *sock, const char *host, const char *port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Write @data - @len being the amount of bytes in data to read - to @sock. The function
 | 
				
			||||||
 | 
					 * uses @sock's secure attribute to decide whether to use TLS or not.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns the amount of bytes written on success. The documentation for
 | 
				
			||||||
 | 
					 * mbedtls_ssl_write and mbedtls_net_send apply for the return value. Returns -1
 | 
				
			||||||
 | 
					 * if an error occurred.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int mbedsock_write(struct mbedsock *sock, const unsigned char *data, int len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Read data from @sock into @buf. @len is the size of the buffer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns the amount of bytes read on success. The documentation for
 | 
				
			||||||
 | 
					 * mbedtls_ssl_read and mbedtls_net_recv apply for the return value. Returns -1
 | 
				
			||||||
 | 
					 * if an error occurred.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int mbedsock_read(struct mbedsock *sock, unsigned char *buf, int len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool mbedsock_is_secure(struct mbedsock *sock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // __MBEDSOCK_H__
 | 
				
			||||||
@ -1,4 +1,5 @@
 | 
				
			|||||||
# This is a generated file; do not edit or check into version control.
 | 
					# This is a generated file; do not edit or check into version control.
 | 
				
			||||||
 | 
					integration_test=/nix/store/8gcfk0g1lg8gccd9kv3rzj910w9pz1kj-flutter-3.3.3-unwrapped/packages/integration_test/
 | 
				
			||||||
moxdns=/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns-0.1.4/
 | 
					moxdns=/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns-0.1.4/
 | 
				
			||||||
moxdns_android=/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns_android-0.1.4/
 | 
					moxdns_android=/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns_android-0.1.4/
 | 
				
			||||||
moxdns_linux=/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns_linux-0.1.4/
 | 
					moxdns_linux=/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns_linux-0.1.4/
 | 
				
			||||||
 | 
				
			|||||||
@ -1 +1 @@
 | 
				
			|||||||
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[],"android":[{"name":"moxdns_android","path":"/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns_android-0.1.4/","native_build":true,"dependencies":[]}],"macos":[],"linux":[{"name":"moxdns_linux","path":"/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns_linux-0.1.4/","native_build":true,"dependencies":[]}],"windows":[],"web":[]},"dependencyGraph":[{"name":"moxdns","dependencies":["moxdns_android","moxdns_linux"]},{"name":"moxdns_android","dependencies":["moxdns"]},{"name":"moxdns_linux","dependencies":["moxdns"]}],"date_created":"2022-11-05 14:01:31.714716","version":"3.3.3"}
 | 
					{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"integration_test","path":"/nix/store/8gcfk0g1lg8gccd9kv3rzj910w9pz1kj-flutter-3.3.3-unwrapped/packages/integration_test/","native_build":true,"dependencies":[]}],"android":[{"name":"integration_test","path":"/nix/store/8gcfk0g1lg8gccd9kv3rzj910w9pz1kj-flutter-3.3.3-unwrapped/packages/integration_test/","native_build":true,"dependencies":[]},{"name":"moxdns_android","path":"/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns_android-0.1.4/","native_build":true,"dependencies":[]}],"macos":[],"linux":[{"name":"moxdns_linux","path":"/home/alexander/.pub-cache/hosted/git.polynom.me%47api%47packages%47Moxxy%47pub%47/moxdns_linux-0.1.4/","native_build":true,"dependencies":[]}],"windows":[],"web":[]},"dependencyGraph":[{"name":"integration_test","dependencies":[]},{"name":"moxdns","dependencies":["moxdns_android","moxdns_linux"]},{"name":"moxdns_android","dependencies":["moxdns"]},{"name":"moxdns_linux","dependencies":["moxdns"]}],"date_created":"2022-11-07 22:04:34.759562","version":"3.3.3"}
 | 
				
			||||||
							
								
								
									
										44
									
								
								moxxmpp_socket/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								moxxmpp_socket/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					# Miscellaneous
 | 
				
			||||||
 | 
					*.class
 | 
				
			||||||
 | 
					*.log
 | 
				
			||||||
 | 
					*.pyc
 | 
				
			||||||
 | 
					*.swp
 | 
				
			||||||
 | 
					.DS_Store
 | 
				
			||||||
 | 
					.atom/
 | 
				
			||||||
 | 
					.buildlog/
 | 
				
			||||||
 | 
					.history
 | 
				
			||||||
 | 
					.svn/
 | 
				
			||||||
 | 
					migrate_working_dir/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# IntelliJ related
 | 
				
			||||||
 | 
					*.iml
 | 
				
			||||||
 | 
					*.ipr
 | 
				
			||||||
 | 
					*.iws
 | 
				
			||||||
 | 
					.idea/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The .vscode folder contains launch configuration and tasks you configure in
 | 
				
			||||||
 | 
					# VS Code which you may wish to be included in version control, so this line
 | 
				
			||||||
 | 
					# is commented out by default.
 | 
				
			||||||
 | 
					#.vscode/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Flutter/Dart/Pub related
 | 
				
			||||||
 | 
					**/doc/api/
 | 
				
			||||||
 | 
					**/ios/Flutter/.last_build_id
 | 
				
			||||||
 | 
					.dart_tool/
 | 
				
			||||||
 | 
					.flutter-plugins
 | 
				
			||||||
 | 
					.flutter-plugins-dependencies
 | 
				
			||||||
 | 
					.packages
 | 
				
			||||||
 | 
					.pub-cache/
 | 
				
			||||||
 | 
					.pub/
 | 
				
			||||||
 | 
					/build/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Symbolication related
 | 
				
			||||||
 | 
					app.*.symbols
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Obfuscation related
 | 
				
			||||||
 | 
					app.*.map.json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Android Studio will place build artifacts here
 | 
				
			||||||
 | 
					/android/app/debug
 | 
				
			||||||
 | 
					/android/app/profile
 | 
				
			||||||
 | 
					/android/app/release
 | 
				
			||||||
							
								
								
									
										30
									
								
								moxxmpp_socket/.metadata
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								moxxmpp_socket/.metadata
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					# This file tracks properties of this Flutter project.
 | 
				
			||||||
 | 
					# Used by Flutter tool to assess capabilities and perform upgrades etc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This file should be version controlled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					version:
 | 
				
			||||||
 | 
					  revision: 18a827f3933c19f51862dde3fa472197683249d6
 | 
				
			||||||
 | 
					  channel: stable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					project_type: app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Tracks metadata for the flutter migrate command
 | 
				
			||||||
 | 
					migration:
 | 
				
			||||||
 | 
					  platforms:
 | 
				
			||||||
 | 
					    - platform: root
 | 
				
			||||||
 | 
					      create_revision: 18a827f3933c19f51862dde3fa472197683249d6
 | 
				
			||||||
 | 
					      base_revision: 18a827f3933c19f51862dde3fa472197683249d6
 | 
				
			||||||
 | 
					    - platform: linux
 | 
				
			||||||
 | 
					      create_revision: 18a827f3933c19f51862dde3fa472197683249d6
 | 
				
			||||||
 | 
					      base_revision: 18a827f3933c19f51862dde3fa472197683249d6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # User provided section
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # List of Local paths (relative to this file) that should be
 | 
				
			||||||
 | 
					  # ignored by the migrate tool.
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  # Files that are not part of the templates will be ignored by default.
 | 
				
			||||||
 | 
					  unmanaged_files:
 | 
				
			||||||
 | 
					    - 'lib/main.dart'
 | 
				
			||||||
 | 
					    - 'ios/Runner.xcodeproj/project.pbxproj'
 | 
				
			||||||
							
								
								
									
										15
									
								
								moxxmpp_socket/analysis_options.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								moxxmpp_socket/analysis_options.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					include: package:very_good_analysis/analysis_options.yaml
 | 
				
			||||||
 | 
					linter:
 | 
				
			||||||
 | 
					  rules:
 | 
				
			||||||
 | 
					    public_member_api_docs: false
 | 
				
			||||||
 | 
					    lines_longer_than_80_chars: false
 | 
				
			||||||
 | 
					    use_setters_to_change_properties: false
 | 
				
			||||||
 | 
					    avoid_positional_boolean_parameters: false
 | 
				
			||||||
 | 
					    avoid_bool_literals_in_conditional_expressions: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					analyzer:
 | 
				
			||||||
 | 
					  exclude:
 | 
				
			||||||
 | 
					    - "**/*.g.dart"
 | 
				
			||||||
 | 
					    - "**/*.freezed.dart"
 | 
				
			||||||
 | 
					    - "lib/src/generated/*.dart"
 | 
				
			||||||
 | 
					    - "test/"
 | 
				
			||||||
							
								
								
									
										29
									
								
								moxxmpp_socket/integration_test/test_wrong_host.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								moxxmpp_socket/integration_test/test_wrong_host.dart
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					import 'dart:io';
 | 
				
			||||||
 | 
					import 'package:moxxmpp_socket/src/ssl.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void main(List<String> argv) async {
 | 
				
			||||||
 | 
					  if (argv.length != 2) {
 | 
				
			||||||
 | 
					    print('Usage: test_wrong_host.dart server-addr host-name');
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final server = argv[0];
 | 
				
			||||||
 | 
					  final hostname = argv[1];
 | 
				
			||||||
 | 
					  final ctx = MbedSockCtx('/etc/ssl/certs/');
 | 
				
			||||||
 | 
					  final sock = MbedSock(ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  print('Connecting...');
 | 
				
			||||||
 | 
					  final done = sock.connectSecure(
 | 
				
			||||||
 | 
					    server,
 | 
				
			||||||
 | 
					    '5223',
 | 
				
			||||||
 | 
					    alpn: 'xmpp-client',
 | 
				
			||||||
 | 
					    hostname: hostname,
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  print('Success? $done');
 | 
				
			||||||
 | 
					  print('Secure? ${sock.isSecure()}');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sock.free();
 | 
				
			||||||
 | 
					  ctx.free();
 | 
				
			||||||
 | 
					  print('OKAY');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										293
									
								
								moxxmpp_socket/lib/src/generated/ffi.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								moxxmpp_socket/lib/src/generated/ffi.dart
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,293 @@
 | 
				
			|||||||
 | 
					// AUTO GENERATED FILE, DO NOT EDIT.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Generated by `package:ffigen`.
 | 
				
			||||||
 | 
					import 'dart:ffi' as ffi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NativeLibrary {
 | 
				
			||||||
 | 
					  /// Holds the symbol lookup function.
 | 
				
			||||||
 | 
					  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
 | 
				
			||||||
 | 
					      _lookup;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// The symbols are looked up in [dynamicLibrary].
 | 
				
			||||||
 | 
					  NativeLibrary(ffi.DynamicLibrary dynamicLibrary)
 | 
				
			||||||
 | 
					      : _lookup = dynamicLibrary.lookup;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// The symbols are looked up with [lookup].
 | 
				
			||||||
 | 
					  NativeLibrary.fromLookup(
 | 
				
			||||||
 | 
					      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
 | 
				
			||||||
 | 
					          lookup)
 | 
				
			||||||
 | 
					      : _lookup = lookup;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int mbedsock_ctx_new(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock_ctx> ctx,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> capath,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_ctx_new(
 | 
				
			||||||
 | 
					      ctx,
 | 
				
			||||||
 | 
					      capath,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_ctx_newPtr = _lookup<
 | 
				
			||||||
 | 
					      ffi.NativeFunction<
 | 
				
			||||||
 | 
					          ffi.Int32 Function(ffi.Pointer<mbedsock_ctx>,
 | 
				
			||||||
 | 
					              ffi.Pointer<ffi.Int8>)>>('mbedsock_ctx_new');
 | 
				
			||||||
 | 
					  late final _mbedsock_ctx_new = _mbedsock_ctx_newPtr.asFunction<
 | 
				
			||||||
 | 
					      int Function(ffi.Pointer<mbedsock_ctx>, ffi.Pointer<ffi.Int8>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ffi.Pointer<mbedsock_ctx> mbedsock_ctx_new_ex(
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> capath,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_ctx_new_ex(
 | 
				
			||||||
 | 
					      capath,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_ctx_new_exPtr = _lookup<
 | 
				
			||||||
 | 
					      ffi.NativeFunction<
 | 
				
			||||||
 | 
					          ffi.Pointer<mbedsock_ctx> Function(
 | 
				
			||||||
 | 
					              ffi.Pointer<ffi.Int8>)>>('mbedsock_ctx_new_ex');
 | 
				
			||||||
 | 
					  late final _mbedsock_ctx_new_ex = _mbedsock_ctx_new_exPtr
 | 
				
			||||||
 | 
					      .asFunction<ffi.Pointer<mbedsock_ctx> Function(ffi.Pointer<ffi.Int8>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int mbedsock_new(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock_ctx> ctx,
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock> sock,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_new(
 | 
				
			||||||
 | 
					      ctx,
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_newPtr = _lookup<
 | 
				
			||||||
 | 
					      ffi.NativeFunction<
 | 
				
			||||||
 | 
					          ffi.Int32 Function(ffi.Pointer<mbedsock_ctx>,
 | 
				
			||||||
 | 
					              ffi.Pointer<mbedsock>)>>('mbedsock_new');
 | 
				
			||||||
 | 
					  late final _mbedsock_new = _mbedsock_newPtr.asFunction<
 | 
				
			||||||
 | 
					      int Function(ffi.Pointer<mbedsock_ctx>, ffi.Pointer<mbedsock>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ffi.Pointer<mbedsock> mbedsock_new_ex(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock_ctx> ctx,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_new_ex(
 | 
				
			||||||
 | 
					      ctx,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_new_exPtr = _lookup<
 | 
				
			||||||
 | 
					      ffi.NativeFunction<
 | 
				
			||||||
 | 
					          ffi.Pointer<mbedsock> Function(
 | 
				
			||||||
 | 
					              ffi.Pointer<mbedsock_ctx>)>>('mbedsock_new_ex');
 | 
				
			||||||
 | 
					  late final _mbedsock_new_ex = _mbedsock_new_exPtr
 | 
				
			||||||
 | 
					      .asFunction<ffi.Pointer<mbedsock> Function(ffi.Pointer<mbedsock_ctx>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void mbedsock_free(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock> sock,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_free(
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_freePtr =
 | 
				
			||||||
 | 
					      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<mbedsock>)>>(
 | 
				
			||||||
 | 
					          'mbedsock_free');
 | 
				
			||||||
 | 
					  late final _mbedsock_free =
 | 
				
			||||||
 | 
					      _mbedsock_freePtr.asFunction<void Function(ffi.Pointer<mbedsock>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void mbedsock_free_ex(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock> sock,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_free_ex(
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_free_exPtr =
 | 
				
			||||||
 | 
					      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<mbedsock>)>>(
 | 
				
			||||||
 | 
					          'mbedsock_free_ex');
 | 
				
			||||||
 | 
					  late final _mbedsock_free_ex =
 | 
				
			||||||
 | 
					      _mbedsock_free_exPtr.asFunction<void Function(ffi.Pointer<mbedsock>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void mbedsock_ctx_free(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock_ctx> ctx,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_ctx_free(
 | 
				
			||||||
 | 
					      ctx,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_ctx_freePtr =
 | 
				
			||||||
 | 
					      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<mbedsock_ctx>)>>(
 | 
				
			||||||
 | 
					          'mbedsock_ctx_free');
 | 
				
			||||||
 | 
					  late final _mbedsock_ctx_free = _mbedsock_ctx_freePtr
 | 
				
			||||||
 | 
					      .asFunction<void Function(ffi.Pointer<mbedsock_ctx>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void mbedsock_ctx_free_ex(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock_ctx> ctx,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_ctx_free_ex(
 | 
				
			||||||
 | 
					      ctx,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_ctx_free_exPtr =
 | 
				
			||||||
 | 
					      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<mbedsock_ctx>)>>(
 | 
				
			||||||
 | 
					          'mbedsock_ctx_free_ex');
 | 
				
			||||||
 | 
					  late final _mbedsock_ctx_free_ex = _mbedsock_ctx_free_exPtr
 | 
				
			||||||
 | 
					      .asFunction<void Function(ffi.Pointer<mbedsock_ctx>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int mbedsock_do_handshake(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock> sock,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> alpn,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> sni,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_do_handshake(
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					      alpn,
 | 
				
			||||||
 | 
					      sni,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_do_handshakePtr = _lookup<
 | 
				
			||||||
 | 
					      ffi.NativeFunction<
 | 
				
			||||||
 | 
					          ffi.Int32 Function(ffi.Pointer<mbedsock>, ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					              ffi.Pointer<ffi.Int8>)>>('mbedsock_do_handshake');
 | 
				
			||||||
 | 
					  late final _mbedsock_do_handshake = _mbedsock_do_handshakePtr.asFunction<
 | 
				
			||||||
 | 
					      int Function(ffi.Pointer<mbedsock>, ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					          ffi.Pointer<ffi.Int8>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int mbedsock_connect_secure(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock> sock,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> host,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> port,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> alpn,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> sni,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_connect_secure(
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					      host,
 | 
				
			||||||
 | 
					      port,
 | 
				
			||||||
 | 
					      alpn,
 | 
				
			||||||
 | 
					      sni,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_connect_securePtr = _lookup<
 | 
				
			||||||
 | 
					      ffi.NativeFunction<
 | 
				
			||||||
 | 
					          ffi.Int32 Function(
 | 
				
			||||||
 | 
					              ffi.Pointer<mbedsock>,
 | 
				
			||||||
 | 
					              ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					              ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					              ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					              ffi.Pointer<ffi.Int8>)>>('mbedsock_connect_secure');
 | 
				
			||||||
 | 
					  late final _mbedsock_connect_secure = _mbedsock_connect_securePtr.asFunction<
 | 
				
			||||||
 | 
					      int Function(
 | 
				
			||||||
 | 
					          ffi.Pointer<mbedsock>,
 | 
				
			||||||
 | 
					          ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					          ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					          ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					          ffi.Pointer<ffi.Int8>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int mbedsock_connect(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock> sock,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> host,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Int8> port,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_connect(
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					      host,
 | 
				
			||||||
 | 
					      port,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_connectPtr = _lookup<
 | 
				
			||||||
 | 
					      ffi.NativeFunction<
 | 
				
			||||||
 | 
					          ffi.Int32 Function(ffi.Pointer<mbedsock>, ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					              ffi.Pointer<ffi.Int8>)>>('mbedsock_connect');
 | 
				
			||||||
 | 
					  late final _mbedsock_connect = _mbedsock_connectPtr.asFunction<
 | 
				
			||||||
 | 
					      int Function(ffi.Pointer<mbedsock>, ffi.Pointer<ffi.Int8>,
 | 
				
			||||||
 | 
					          ffi.Pointer<ffi.Int8>)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int mbedsock_write(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock> sock,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Uint8> data,
 | 
				
			||||||
 | 
					    int len,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_write(
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					      data,
 | 
				
			||||||
 | 
					      len,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_writePtr = _lookup<
 | 
				
			||||||
 | 
					      ffi.NativeFunction<
 | 
				
			||||||
 | 
					          ffi.Int32 Function(ffi.Pointer<mbedsock>, ffi.Pointer<ffi.Uint8>,
 | 
				
			||||||
 | 
					              ffi.Int32)>>('mbedsock_write');
 | 
				
			||||||
 | 
					  late final _mbedsock_write = _mbedsock_writePtr.asFunction<
 | 
				
			||||||
 | 
					      int Function(ffi.Pointer<mbedsock>, ffi.Pointer<ffi.Uint8>, int)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int mbedsock_read(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock> sock,
 | 
				
			||||||
 | 
					    ffi.Pointer<ffi.Uint8> buf,
 | 
				
			||||||
 | 
					    int len,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_read(
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					      buf,
 | 
				
			||||||
 | 
					      len,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_readPtr = _lookup<
 | 
				
			||||||
 | 
					      ffi.NativeFunction<
 | 
				
			||||||
 | 
					          ffi.Int32 Function(ffi.Pointer<mbedsock>, ffi.Pointer<ffi.Uint8>,
 | 
				
			||||||
 | 
					              ffi.Int32)>>('mbedsock_read');
 | 
				
			||||||
 | 
					  late final _mbedsock_read = _mbedsock_readPtr.asFunction<
 | 
				
			||||||
 | 
					      int Function(ffi.Pointer<mbedsock>, ffi.Pointer<ffi.Uint8>, int)>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int mbedsock_is_secure(
 | 
				
			||||||
 | 
					    ffi.Pointer<mbedsock> sock,
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    return _mbedsock_is_secure(
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  late final _mbedsock_is_securePtr =
 | 
				
			||||||
 | 
					      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Pointer<mbedsock>)>>(
 | 
				
			||||||
 | 
					          'mbedsock_is_secure');
 | 
				
			||||||
 | 
					  late final _mbedsock_is_secure =
 | 
				
			||||||
 | 
					      _mbedsock_is_securePtr.asFunction<int Function(ffi.Pointer<mbedsock>)>();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class mbedsock_ctx extends ffi.Struct {
 | 
				
			||||||
 | 
					  @ffi.Int32()
 | 
				
			||||||
 | 
					  external int entropy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @ffi.Int32()
 | 
				
			||||||
 | 
					  external int ctr_drbg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @ffi.Int32()
 | 
				
			||||||
 | 
					  external int chain;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class mbedsock extends ffi.Struct {
 | 
				
			||||||
 | 
					  @ffi.Int32()
 | 
				
			||||||
 | 
					  external int ssl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @ffi.Int32()
 | 
				
			||||||
 | 
					  external int conf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @ffi.Int32()
 | 
				
			||||||
 | 
					  external int server_fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @ffi.Int32()
 | 
				
			||||||
 | 
					  external int secure;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const String SSL_PERS = 'moxxmpp_socket';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const int SSL_PERS_LEN = 15;
 | 
				
			||||||
							
								
								
									
										86
									
								
								moxxmpp_socket/lib/src/ssl.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								moxxmpp_socket/lib/src/ssl.dart
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,86 @@
 | 
				
			|||||||
 | 
					import 'dart:io';
 | 
				
			||||||
 | 
					import 'dart:ffi';
 | 
				
			||||||
 | 
					import 'dart:typed_data';
 | 
				
			||||||
 | 
					import 'package:ffi/ffi.dart';
 | 
				
			||||||
 | 
					import 'package:path/path.dart' as path;
 | 
				
			||||||
 | 
					import 'package:moxxmpp_socket/src/generated/ffi.dart' as libmbedsock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//final libPath = path.join(Directory.current.path, 'libmbedsock.so');
 | 
				
			||||||
 | 
					final lib = libmbedsock.NativeLibrary(DynamicLibrary.open('libmbedsock.so'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MbedSockCtx {
 | 
				
			||||||
 | 
					  late Pointer<libmbedsock.mbedsock_ctx> _ctxPtr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MbedSockCtx(String caPath) {
 | 
				
			||||||
 | 
					    final caPathNative = caPath.toNativeUtf8();
 | 
				
			||||||
 | 
					    _ctxPtr = lib.mbedsock_ctx_new_ex(caPathNative.cast());
 | 
				
			||||||
 | 
					    malloc.free(caPathNative);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void free() {
 | 
				
			||||||
 | 
					    lib.mbedsock_ctx_free_ex(_ctxPtr);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Pointer<libmbedsock.mbedsock_ctx> get ctx => _ctxPtr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MbedSock {
 | 
				
			||||||
 | 
					  late Pointer<libmbedsock.mbedsock> sock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MbedSock(MbedSockCtx ctx) {
 | 
				
			||||||
 | 
					    sock = lib.mbedsock_new_ex(ctx.ctx);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool connect(String host, int port) {
 | 
				
			||||||
 | 
					    final nativeHost = host.toNativeUtf8();
 | 
				
			||||||
 | 
					    final nativePort = port.toString().toNativeUtf8();
 | 
				
			||||||
 | 
					    final ret = lib.mbedsock_connect(sock, nativeHost.cast(), nativePort.cast());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    malloc
 | 
				
			||||||
 | 
					      ..free(nativeHost)
 | 
				
			||||||
 | 
					      ..free(nativePort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret == 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool connectSecure(String host, String port, {String? alpn, String? hostname}) {
 | 
				
			||||||
 | 
					    final nativeHost = host.toNativeUtf8();
 | 
				
			||||||
 | 
					    final nativePort = port.toNativeUtf8();
 | 
				
			||||||
 | 
					    final nativeAlpn = alpn != null ? alpn.toNativeUtf8() : nullptr;
 | 
				
			||||||
 | 
					    final nativeHostname = hostname != null ? hostname.toNativeUtf8() : nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    final ret = lib.mbedsock_connect_secure(
 | 
				
			||||||
 | 
					      sock,
 | 
				
			||||||
 | 
					      nativeHost.cast(),
 | 
				
			||||||
 | 
					      nativePort.cast(),
 | 
				
			||||||
 | 
					      nativeAlpn.cast(),
 | 
				
			||||||
 | 
					      nativeHostname.cast(),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    malloc
 | 
				
			||||||
 | 
					      ..free(nativeHost)
 | 
				
			||||||
 | 
					      ..free(nativePort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (alpn != null) {
 | 
				
			||||||
 | 
					      malloc.free(nativeAlpn);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (hostname != null) {
 | 
				
			||||||
 | 
					      malloc.free(nativeHostname);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print(ret);
 | 
				
			||||||
 | 
					    return ret == 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool isSecure() {
 | 
				
			||||||
 | 
					    return lib.mbedsock_is_secure(sock) == 1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void write(String data) {
 | 
				
			||||||
 | 
					    //lib.mbedsock_write(sock, data, data.length);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  void free() {
 | 
				
			||||||
 | 
					    lib.mbedsock_free_ex(sock);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -9,6 +9,7 @@ environment:
 | 
				
			|||||||
  flutter: '>=2.13.0-0.1'
 | 
					  flutter: '>=2.13.0-0.1'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dependencies:
 | 
					dependencies:
 | 
				
			||||||
 | 
					  ffi:
 | 
				
			||||||
  logging: 1.0.2
 | 
					  logging: 1.0.2
 | 
				
			||||||
  moxdns:
 | 
					  moxdns:
 | 
				
			||||||
    hosted: https://git.polynom.me/api/packages/Moxxy/pub
 | 
					    hosted: https://git.polynom.me/api/packages/Moxxy/pub
 | 
				
			||||||
@ -16,8 +17,20 @@ dependencies:
 | 
				
			|||||||
  moxxmpp:
 | 
					  moxxmpp:
 | 
				
			||||||
    hosted: https://git.polynom.me/api/packages/Moxxy/pub
 | 
					    hosted: https://git.polynom.me/api/packages/Moxxy/pub
 | 
				
			||||||
    version: 0.1.0
 | 
					    version: 0.1.0
 | 
				
			||||||
 | 
					  path: 1.8.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dev_dependencies:
 | 
					dev_dependencies:
 | 
				
			||||||
 | 
					  integration_test:
 | 
				
			||||||
 | 
					    sdk: flutter
 | 
				
			||||||
 | 
					  ffigen: ^4.1.2
 | 
				
			||||||
  lints: ^2.0.0
 | 
					  lints: ^2.0.0
 | 
				
			||||||
  test: ^1.16.0
 | 
					  test: ^1.16.0
 | 
				
			||||||
  very_good_analysis: ^3.0.1
 | 
					  very_good_analysis: ^3.0.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ffigen:
 | 
				
			||||||
 | 
					  output: 'lib/src/generated/ffi.dart'
 | 
				
			||||||
 | 
					  llvm-path:
 | 
				
			||||||
 | 
					    - '/nix/store/zq6966rjlmmwjym4jlnymjwwgjhcgryz-clang-11.1.0-lib'
 | 
				
			||||||
 | 
					  headers:
 | 
				
			||||||
 | 
					    entry-points:
 | 
				
			||||||
 | 
					      - ../mbedsock/mbedsock.h
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										30
									
								
								moxxmpp_socket/test/widget_test.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								moxxmpp_socket/test/widget_test.dart
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					// This is a basic Flutter widget test.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// To perform an interaction with a widget in your test, use the WidgetTester
 | 
				
			||||||
 | 
					// utility in the flutter_test package. For example, you can send tap and scroll
 | 
				
			||||||
 | 
					// gestures. You can also use WidgetTester to find child widgets in the widget
 | 
				
			||||||
 | 
					// tree, read text, and verify that the values of widget properties are correct.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					import 'package:flutter_test/flutter_test.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'package:moxxmpp_socket/main.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void main() {
 | 
				
			||||||
 | 
					  testWidgets('Counter increments smoke test', (WidgetTester tester) async {
 | 
				
			||||||
 | 
					    // Build our app and trigger a frame.
 | 
				
			||||||
 | 
					    await tester.pumpWidget(const MyApp());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Verify that our counter starts at 0.
 | 
				
			||||||
 | 
					    expect(find.text('0'), findsOneWidget);
 | 
				
			||||||
 | 
					    expect(find.text('1'), findsNothing);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Tap the '+' icon and trigger a frame.
 | 
				
			||||||
 | 
					    await tester.tap(find.byIcon(Icons.add));
 | 
				
			||||||
 | 
					    await tester.pump();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Verify that our counter has incremented.
 | 
				
			||||||
 | 
					    expect(find.text('0'), findsNothing);
 | 
				
			||||||
 | 
					    expect(find.text('1'), findsOneWidget);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								packages/mbedsock.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								packages/mbedsock.nix
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  stdenv, cmake, pkg-config
 | 
				
			||||||
 | 
					, mbedtls
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stdenv.mkDerivation {
 | 
				
			||||||
 | 
					  pname = "mbedsock";
 | 
				
			||||||
 | 
					  version = "0.1.1";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  src = ./mbedsock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cmakeFlags = [ "-DMBEDTLS_ROOT_DIR=${mbedtls}" ];
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  buildInputs = [ cmake mbedtls pkg-config ];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user