diff --git a/.gitignore b/.gitignore index be6008e2c..d86b432e3 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,8 @@ gcs_key_file.json *_build/ cmake-build-*/ testing/test_framework/external/ +CMakeFiles/ +CMakeCache.txt # XCode user specific folders **/xcuserdata/ diff --git a/app/src/include/firebase/app.h b/app/src/include/firebase/app.h index f32f8bf33..03f0ad2dd 100644 --- a/app/src/include/firebase/app.h +++ b/app/src/include/firebase/app.h @@ -571,11 +571,8 @@ class App { /// Get the App with the given name, or nullptr if none have been created. static App* GetInstance(const char* name); -#if !defined(DOXYGEN) - // Hidden from the public documentation for now /// Get all the apps, including the default one. static std::vector GetApps(); -#endif // !defined(DOXYGEN) #ifndef SWIG // diff --git a/auth/src/android/auth_android.cc b/auth/src/android/auth_android.cc index 7b588dbb9..2f8ccda64 100644 --- a/auth/src/android/auth_android.cc +++ b/auth/src/android/auth_android.cc @@ -17,6 +17,8 @@ #include #include +#include + #include "app/src/assert.h" #include "app/src/embedded_file.h" #include "app/src/include/firebase/internal/mutex.h" @@ -53,6 +55,7 @@ using util::JniStringToString; X(RemoveIdTokenListener, "removeIdTokenListener", \ "(Lcom/google/firebase/auth/FirebaseAuth$IdTokenListener;)V"), \ X(SignOut, "signOut", "()V"), \ + X(UseEmulator, "useEmulator", "(Ljava/lang/String;I)V"), \ X(FetchSignInMethodsForEmail, "fetchSignInMethodsForEmail", \ "(Ljava/lang/String;)" \ "Lcom/google/android/gms/tasks/Task;"), \ @@ -185,6 +188,31 @@ void UpdateCurrentUser(AuthData* auth_data) { } } +const char* const kEmulatorLocalHost = "10.0.2.2"; +const char* const kEmulatorPort = "9099"; +void CheckEmulator(AuthData* auth_data) { + JNIEnv* env = Env(auth_data); + + // Use emulator as long as this env variable is set, regardless its value. + if (std::getenv("USE_AUTH_EMULATOR") == nullptr) { + LogDebug("Using Auth Prod for testing."); + return; + } + + // Use AUTH_EMULATOR_PORT if it is set to non empty string, + // otherwise use the default port. + uint32_t port = std::stoi(kEmulatorPort); + if (std::getenv("AUTH_EMULATOR_PORT") != nullptr) { + port = std::stoi(std::getenv("AUTH_EMULATOR_PORT")); + } + + jstring j_host = env->NewStringUTF(kEmulatorLocalHost); + env->CallVoidMethod(AuthImpl(auth_data), + auth::GetMethodId(auth::kUseEmulator), j_host, port); + env->DeleteLocalRef(j_host); + firebase::util::CheckAndClearJniExceptions(env); +} + // Release cached Java classes. static void ReleaseClasses(JNIEnv* env) { ReleaseAuthClasses(env); @@ -269,6 +297,8 @@ void Auth::InitPlatformAuth(AuthData* auth_data) { // Ensure our User is in-line with underlying API's user. // It's possible for a user to already be logged-in on start-up. UpdateCurrentUser(auth_data); + + CheckEmulator(auth_data); } void Auth::DestroyPlatformAuth(AuthData* auth_data) { diff --git a/auth/src/desktop/auth_desktop.h b/auth/src/desktop/auth_desktop.h index 6210d4771..2d407cab1 100644 --- a/auth/src/desktop/auth_desktop.h +++ b/auth/src/desktop/auth_desktop.h @@ -16,6 +16,7 @@ #define FIREBASE_AUTH_SRC_DESKTOP_AUTH_DESKTOP_H_ #include +#include #include "app/rest/request.h" #include "app/src/scheduler.h" diff --git a/auth/src/desktop/rpcs/auth_request.cc b/auth/src/desktop/rpcs/auth_request.cc index 4db7ac46a..c9af69f78 100644 --- a/auth/src/desktop/rpcs/auth_request.cc +++ b/auth/src/desktop/rpcs/auth_request.cc @@ -23,6 +23,7 @@ #include "app/src/heartbeat/heartbeat_controller_desktop.h" #include "app/src/include/firebase/app.h" #include "app/src/include/firebase/internal/mutex.h" +#include "firebase/log.h" namespace firebase { namespace auth { @@ -37,6 +38,8 @@ AuthRequest::AuthRequest(::firebase::App& app, const char* schema, // dependencies upon other parts of this library. This complication is due to // the way the tests are currently configured where each library has minimal // dependencies. + + CheckEmulator(); static std::string auth_user_agent; // NOLINT static std::string extended_auth_user_agent; // NOLINT static Mutex* user_agent_mutex = new Mutex(); @@ -77,5 +80,40 @@ AuthRequest::AuthRequest(::firebase::App& app, const char* schema, } } +std::string AuthRequest::GetUrl() { + if (emulator_url.empty()) { + std::string url(kHttps); + url += kServerURL; + return url; + } else { + std::string url(kHttp); + url += emulator_url; + url += kServerURL; + return url; + } +} + +void AuthRequest::CheckEmulator() { + if (!emulator_url.empty()) { + LogDebug("Emulator Url already set: %s", emulator_url.c_str()); + return; + } + // Use emulator as long as this env variable is set, regardless its value. + if (std::getenv("USE_AUTH_EMULATOR") == nullptr) { + LogDebug("Using Auth Prod for testing."); + return; + } + + emulator_url.append(kEmulatorLocalHost); + emulator_url.append(":"); + // Use AUTH_EMULATOR_PORT if it is set to non empty string, + // otherwise use the default port. + if (std::getenv("AUTH_EMULATOR_PORT") == nullptr) { + emulator_url.append(kEmulatorPort); + } else { + emulator_url.append(std::getenv("AUTH_EMULATOR_PORT")); + } +} + } // namespace auth } // namespace firebase diff --git a/auth/src/desktop/rpcs/auth_request.h b/auth/src/desktop/rpcs/auth_request.h index 670571e5a..88835e946 100644 --- a/auth/src/desktop/rpcs/auth_request.h +++ b/auth/src/desktop/rpcs/auth_request.h @@ -17,6 +17,8 @@ #ifndef FIREBASE_AUTH_SRC_DESKTOP_RPCS_AUTH_REQUEST_H_ #define FIREBASE_AUTH_SRC_DESKTOP_RPCS_AUTH_REQUEST_H_ +#include + #include "app/rest/request_json.h" #include "app/src/include/firebase/app.h" #include "auth/request_generated.h" @@ -28,6 +30,16 @@ namespace auth { // Key name for header when sending language code data. extern const char* kHeaderFirebaseLocale; +const char* const kHttps = "https://"; + +const char* const kHttp = "http://"; + +const char* const kServerURL = + "www.googleapis.com/identitytoolkit/v3/relyingparty/"; + +const char* const kEmulatorLocalHost = "localhost"; +const char* const kEmulatorPort = "9099"; + class AuthRequest : public firebase::rest::RequestJson { public: @@ -39,6 +51,12 @@ class AuthRequest bool deliver_heartbeat) : AuthRequest(app, reinterpret_cast(schema), deliver_heartbeat) {} + + std::string GetUrl(); + + private: + void CheckEmulator(); + std::string emulator_url; }; } // namespace auth diff --git a/auth/src/desktop/rpcs/create_auth_uri_request.cc b/auth/src/desktop/rpcs/create_auth_uri_request.cc index 04ee9efc2..e0de666b4 100644 --- a/auth/src/desktop/rpcs/create_auth_uri_request.cc +++ b/auth/src/desktop/rpcs/create_auth_uri_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/create_auth_uri_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" #include "app/src/log.h" @@ -27,11 +29,8 @@ CreateAuthUriRequest::CreateAuthUriRequest(::firebase::App& app, : AuthRequest(app, request_resource_data, true) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "createAuthUri?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "createAuthUri?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/delete_account_request.cc b/auth/src/desktop/rpcs/delete_account_request.cc index efe393573..359fb0d74 100644 --- a/auth/src/desktop/rpcs/delete_account_request.cc +++ b/auth/src/desktop/rpcs/delete_account_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/delete_account_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" @@ -25,11 +27,8 @@ DeleteAccountRequest::DeleteAccountRequest(::firebase::App& app, : AuthRequest(app, request_resource_data, true) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "deleteAccount?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "deleteAccount?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/get_account_info_request.cc b/auth/src/desktop/rpcs/get_account_info_request.cc index 0dad730f1..e5f6cd4e7 100644 --- a/auth/src/desktop/rpcs/get_account_info_request.cc +++ b/auth/src/desktop/rpcs/get_account_info_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/get_account_info_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" @@ -39,11 +41,8 @@ GetAccountInfoRequest::GetAccountInfoRequest(::firebase::App& app, void GetAccountInfoRequest::SetUrl(const char* const api_key) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "getAccountInfo?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "getAccountInfo?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/get_oob_confirmation_code_request.cc b/auth/src/desktop/rpcs/get_oob_confirmation_code_request.cc index 3087837a6..3a1805884 100644 --- a/auth/src/desktop/rpcs/get_oob_confirmation_code_request.cc +++ b/auth/src/desktop/rpcs/get_oob_confirmation_code_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/get_oob_confirmation_code_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" @@ -25,11 +27,8 @@ GetOobConfirmationCodeRequest::GetOobConfirmationCodeRequest( : AuthRequest(app, request_resource_data, true) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "getOobConfirmationCode?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "getOobConfirmationCode?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/reset_password_request.cc b/auth/src/desktop/rpcs/reset_password_request.cc index b8fc65654..a8c64d1ff 100644 --- a/auth/src/desktop/rpcs/reset_password_request.cc +++ b/auth/src/desktop/rpcs/reset_password_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/reset_password_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" #include "app/src/log.h" @@ -28,11 +30,8 @@ ResetPasswordRequest::ResetPasswordRequest(::firebase::App& app, : AuthRequest(app, request_resource_data, true) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "resetPassword?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "resetPassword?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/set_account_info_request.cc b/auth/src/desktop/rpcs/set_account_info_request.cc index 48105661b..618cbef90 100644 --- a/auth/src/desktop/rpcs/set_account_info_request.cc +++ b/auth/src/desktop/rpcs/set_account_info_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/set_account_info_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" @@ -25,11 +27,8 @@ SetAccountInfoRequest::SetAccountInfoRequest(::firebase::App& app, : AuthRequest(app, request_resource_data, true) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "setAccountInfo?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "setAccountInfo?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/sign_up_new_user_request.cc b/auth/src/desktop/rpcs/sign_up_new_user_request.cc index 5a098b4b1..bd8d5ed09 100644 --- a/auth/src/desktop/rpcs/sign_up_new_user_request.cc +++ b/auth/src/desktop/rpcs/sign_up_new_user_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/sign_up_new_user_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" @@ -53,11 +55,8 @@ SignUpNewUserRequest::SignUpNewUserRequest(::firebase::App& app, void SignUpNewUserRequest::SetUrl(const char* api_key) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "signupNewUser?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "signupNewUser?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/verify_assertion_request.cc b/auth/src/desktop/rpcs/verify_assertion_request.cc index 84dc5e4f7..cca72d578 100644 --- a/auth/src/desktop/rpcs/verify_assertion_request.cc +++ b/auth/src/desktop/rpcs/verify_assertion_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/verify_assertion_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" @@ -26,11 +28,8 @@ VerifyAssertionRequest::VerifyAssertionRequest(::firebase::App& app, : AuthRequest(app, request_resource_data, true) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "verifyAssertion?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "verifyAssertion?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/verify_custom_token_request.cc b/auth/src/desktop/rpcs/verify_custom_token_request.cc index 83754219f..af53e6f3f 100644 --- a/auth/src/desktop/rpcs/verify_custom_token_request.cc +++ b/auth/src/desktop/rpcs/verify_custom_token_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/verify_custom_token_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" #include "app/src/log.h" @@ -27,11 +29,8 @@ VerifyCustomTokenRequest::VerifyCustomTokenRequest(::firebase::App& app, : AuthRequest(app, request_resource_data, true) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "verifyCustomToken?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "verifyCustomToken?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/desktop/rpcs/verify_password_request.cc b/auth/src/desktop/rpcs/verify_password_request.cc index bbfddfa33..db840685a 100644 --- a/auth/src/desktop/rpcs/verify_password_request.cc +++ b/auth/src/desktop/rpcs/verify_password_request.cc @@ -14,6 +14,8 @@ #include "auth/src/desktop/rpcs/verify_password_request.h" +#include + #include "app/src/assert.h" #include "app/src/include/firebase/app.h" #include "app/src/log.h" @@ -28,11 +30,8 @@ VerifyPasswordRequest::VerifyPasswordRequest(::firebase::App& app, : AuthRequest(app, request_resource_data, true) { FIREBASE_ASSERT_RETURN_VOID(api_key); - const char api_host[] = - "https://www.googleapis.com/identitytoolkit/v3/relyingparty/" - "verifyPassword?key="; - std::string url; - url.reserve(strlen(api_host) + strlen(api_key)); + const char api_host[] = "verifyPassword?key="; + std::string url = GetUrl(); url.append(api_host); url.append(api_key); set_url(url.c_str()); diff --git a/auth/src/include/firebase/auth.h b/auth/src/include/firebase/auth.h index bec3ce8ff..f9c8bfbf3 100644 --- a/auth/src/include/firebase/auth.h +++ b/auth/src/include/firebase/auth.h @@ -17,6 +17,7 @@ #ifndef FIREBASE_AUTH_SRC_INCLUDE_FIREBASE_AUTH_H_ #define FIREBASE_AUTH_SRC_INCLUDE_FIREBASE_AUTH_H_ +#include #include #include "firebase/app.h" diff --git a/auth/src/ios/auth_ios.mm b/auth/src/ios/auth_ios.mm index b8b52573a..e66af55dd 100644 --- a/auth/src/ios/auth_ios.mm +++ b/auth/src/ios/auth_ios.mm @@ -41,6 +41,9 @@ @implementation FIRCPPAuthListenerHandle namespace firebase { namespace auth { +const char *const kEmulatorLocalHost = "localhost"; +const char *const kEmulatorPort = "9099"; + static const struct { int ios_error; AuthError cpp_error; @@ -154,6 +157,24 @@ void UpdateCurrentUser(AuthData *auth_data) { SetUserImpl(auth_data, user); } +void CheckEmulator(AuthData *auth_data) { + // Use emulator as long as this env variable is set, regardless its value. + if (std::getenv("USE_AUTH_EMULATOR") == nullptr) { + LogDebug("Using Auth Prod for testing."); + return; + } + + // Use AUTH_EMULATOR_PORT if it is set to non empty string, + // otherwise use the default port. + uint32_t port = std::stoi(kEmulatorPort); + if (std::getenv("AUTH_EMULATOR_PORT") != nullptr) { + port = std::stoi(std::getenv("AUTH_EMULATOR_PORT")); + } + + NSUInteger ns_port = port; + [AuthImpl(auth_data) useEmulatorWithHost:@(kEmulatorLocalHost) port:ns_port]; +} + // Platform-specific method to initialize AuthData. void Auth::InitPlatformAuth(AuthData *auth_data) { FIRCPPAuthListenerHandle *listener_cpp_handle = [[FIRCPPAuthListenerHandle alloc] init]; @@ -191,6 +212,8 @@ void UpdateCurrentUser(AuthData *auth_data) { // It's possible for the user to be signed-in at creation, if the user signed-in during a // previous run, for example. UpdateCurrentUser(auth_data); + + CheckEmulator(auth_data); } // Platform-specific method to destroy the wrapped Auth class. diff --git a/release_build_files/readme.md b/release_build_files/readme.md index 15827c0fb..788ce32f2 100644 --- a/release_build_files/readme.md +++ b/release_build_files/readme.md @@ -632,7 +632,10 @@ code. - General (Android): Update to Firebase Android BoM version 32.2.2. - General (iOS): Update to Firebase Cocoapods version 10.13.0. - General (iOS): 32-bit iOS builds (i386 and armv7) are no longer supported. + - General: Add FirebaseApp.GetApps(), to return the list of `firebase::App` instances. - GMA (Android): Fixed a crash when initializing GMA without a Firebase App. + - Firestore: Add support for disjunctions in queries (OR queries) + ([#1335](https://github.com/firebase/firebase-cpp-sdk/pull/1335)). ### 11.3.0 - Changes