Skip to content

chore(openiap): apply security improvement pass#156

Merged
hyochan merged 26 commits into
mainfrom
codex/chore-openiap-security-improvements
May 16, 2026
Merged

chore(openiap): apply security improvement pass#156
hyochan merged 26 commits into
mainfrom
codex/chore-openiap-security-improvements

Conversation

@hyochan
Copy link
Copy Markdown
Member

@hyochan hyochan commented May 16, 2026

Summary

  • update GQL schema, generated platform types, and SDK implementations across Apple, Google, and framework libraries
  • harden Kit validation, request handling, sync flows, dashboard behavior, and MCP Kit response redaction
  • refresh docs, knowledge context, CI/release workflows, and shared automation scripts

Test plan

  • flutter analyze via pre-commit hook for Flutter-touched commits
  • ./gradlew :library:compileDebugKotlinAndroid via pre-commit hook for KMP/GQL-touched commits
  • Kit CI-equivalent gate via pre-commit hook: install, lint, prettier, 45 test files / 502 tests, smoke server probes
  • Docs gate via pre-commit hook: typecheck, audit-docs, prettier
  • git diff --check HEAD~10..HEAD

hyochan added 10 commits May 16, 2026 14:38
Update the GraphQL API schema for the cross-platform purchase and verification work before committing generated outputs and implementations.
Update codegen metadata and regenerated platform type outputs after the schema changes.
Update Apple package implementation, wrappers, examples, and release scripts for the shared API changes.
Update Google package implementation, examples, build scripts, and release helpers for the shared API changes.
Update framework SDK implementations, examples, tests, and build scripts for the shared purchase API changes.
Tighten Kit API validation, request handling, Convex sync behavior, and dashboard handling with focused test coverage.
Update documentation pages, version references, generated llms files, and docs deployment helpers.
Refresh internal guidance, release notes policy, docs consistency details, and compiled assistant context.
Add MCP response redaction and tests around Kit client output handling.
Refresh CI and release workflows, version sync tooling, deployment scripts, and related root automation.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 16, 2026

Important

Review skipped

Too many files!

This PR contains 286 files, which is 136 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 944e730d-fece-435e-ab12-c04c31b5ece3

📥 Commits

Reviewing files that changed from the base of the PR and between 722752f and 7d27024.

⛔ Files ignored due to path filters (14)
  • bun.lock is excluded by !**/*.lock
  • libraries/expo-iap/bun.lock is excluded by !**/*.lock
  • libraries/flutter_inapp_purchase/android/jars/in-app-purchasing-2.0.76.jar is excluded by !**/*.jar
  • libraries/react-native-iap/example-expo/assets/fonts/SpaceMono-Regular.ttf is excluded by !**/*.ttf
  • libraries/react-native-iap/example-expo/assets/images/adaptive-icon.png is excluded by !**/*.png
  • libraries/react-native-iap/example-expo/assets/images/favicon.png is excluded by !**/*.png
  • libraries/react-native-iap/example-expo/assets/images/icon.png is excluded by !**/*.png
  • libraries/react-native-iap/example-expo/assets/images/partial-react-logo.png is excluded by !**/*.png
  • libraries/react-native-iap/example-expo/assets/images/react-logo.png is excluded by !**/*.png
  • libraries/react-native-iap/example-expo/assets/images/react-logo@2x.png is excluded by !**/*.png
  • libraries/react-native-iap/example-expo/assets/images/react-logo@3x.png is excluded by !**/*.png
  • libraries/react-native-iap/example-expo/assets/images/splash-icon.png is excluded by !**/*.png
  • libraries/react-native-iap/example-expo/bun.lock is excluded by !**/*.lock
  • libraries/react-native-iap/example-expo/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (286)
  • .github/workflows/ci-expo-iap.yml
  • .github/workflows/ci-flutter-iap.yml
  • .github/workflows/ci-maui-iap.yml
  • .github/workflows/ci.yml
  • .github/workflows/publish-flutter.yml
  • .github/workflows/release-apple.yml
  • .github/workflows/release-expo.yml
  • .github/workflows/release-flutter.yml
  • .github/workflows/release-godot.yml
  • .github/workflows/release-google.yml
  • .github/workflows/release-kmp.yml
  • .github/workflows/release-maui.yml
  • .github/workflows/release-react-native.yml
  • .github/workflows/release.yml
  • .gitignore
  • knowledge/_claude-context/context.md
  • knowledge/external/google-billing-api.md
  • knowledge/internal/04-platform-packages.md
  • knowledge/internal/06-git-deployment.md
  • knowledge/internal/07-docs-consistency.md
  • libraries/expo-iap/CLAUDE.md
  • libraries/expo-iap/CONTRIBUTING.md
  • libraries/expo-iap/README.md
  • libraries/expo-iap/android/build.gradle
  • libraries/expo-iap/android/openiap-android-sdk.gradle
  • libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapHelper.kt
  • libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapLog.kt
  • libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt
  • libraries/expo-iap/android/src/main/java/expo/modules/iap/PromiseUtils.kt
  • libraries/expo-iap/example/README.md
  • libraries/expo-iap/example/app/alternative-billing.tsx
  • libraries/expo-iap/example/app/available-purchases.tsx
  • libraries/expo-iap/example/app/purchase-flow.tsx
  • libraries/expo-iap/example/app/subscription-flow.tsx
  • libraries/expo-iap/example/app/webhook-stream.tsx
  • libraries/expo-iap/example/src/utils/buildPurchaseRows.ts
  • libraries/expo-iap/ios/ExpoIapModule.swift
  • libraries/expo-iap/ios/onside/OnsideIapModule.swift
  • libraries/expo-iap/plugin/src/withLocalOpenIAP.ts
  • libraries/expo-iap/scripts/test-coverage.sh
  • libraries/expo-iap/src/ExpoIapModule.ts
  • libraries/expo-iap/src/__mocks__/ExpoIapModule.js
  • libraries/expo-iap/src/__mocks__/expo-modules-core.js
  • libraries/expo-iap/src/__tests__/ExpoIapModule.test.ts
  • libraries/expo-iap/src/__tests__/index.test.ts
  • libraries/expo-iap/src/index.ts
  • libraries/expo-iap/src/modules/android.ts
  • libraries/expo-iap/src/modules/ios.ts
  • libraries/expo-iap/src/types.ts
  • libraries/expo-iap/src/useIAP.ts
  • libraries/flutter_inapp_purchase/CLAUDE.md
  • libraries/flutter_inapp_purchase/CONTRIBUTING.md
  • libraries/flutter_inapp_purchase/KINDLE.md
  • libraries/flutter_inapp_purchase/README.md
  • libraries/flutter_inapp_purchase/ancillary/amazon.sdktester.json
  • libraries/flutter_inapp_purchase/android/build.gradle
  • libraries/flutter_inapp_purchase/android/gradle.properties
  • libraries/flutter_inapp_purchase/android/gradle/wrapper/gradle-wrapper.properties
  • libraries/flutter_inapp_purchase/android/openiap-android-sdk.gradle
  • libraries/flutter_inapp_purchase/android/settings.gradle
  • libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AmazonInappPurchasePlugin.kt
  • libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt
  • libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/FlutterInappPurchasePlugin.kt
  • libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/MethodResultWrapper.kt
  • libraries/flutter_inapp_purchase/example/android/app/build.gradle
  • libraries/flutter_inapp_purchase/example/android/app/src/main/AndroidManifest.xml
  • libraries/flutter_inapp_purchase/example/android/build.gradle
  • libraries/flutter_inapp_purchase/example/android/gradle.properties
  • libraries/flutter_inapp_purchase/example/android/gradle/wrapper/gradle-wrapper.properties
  • libraries/flutter_inapp_purchase/example/android/settings.gradle
  • libraries/flutter_inapp_purchase/example/lib/src/screens/all_products_screen.dart
  • libraries/flutter_inapp_purchase/example/lib/src/screens/alternative_billing_screen.dart
  • libraries/flutter_inapp_purchase/example/lib/src/screens/purchase_flow_screen.dart
  • libraries/flutter_inapp_purchase/example/lib/src/screens/subscription_flow_screen.dart
  • libraries/flutter_inapp_purchase/example/lib/src/screens/webhook_stream_screen.dart
  • libraries/flutter_inapp_purchase/example/lib/src/widgets/product_detail_modal.dart
  • libraries/flutter_inapp_purchase/example/lib/src/widgets/purchase_detail_view.dart
  • libraries/flutter_inapp_purchase/example/macos/Runner.xcodeproj/project.pbxproj
  • libraries/flutter_inapp_purchase/ios/Classes/FlutterInappPurchasePlugin.swift
  • libraries/flutter_inapp_purchase/ios/flutter_inapp_purchase.podspec
  • libraries/flutter_inapp_purchase/issue_template.md
  • libraries/flutter_inapp_purchase/lib/enums.dart
  • libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart
  • libraries/flutter_inapp_purchase/lib/types.dart
  • libraries/flutter_inapp_purchase/lib/utils.dart
  • libraries/flutter_inapp_purchase/macos/Classes/FlutterInappPurchasePlugin.swift
  • libraries/flutter_inapp_purchase/macos/flutter_inapp_purchase.podspec
  • libraries/flutter_inapp_purchase/test/builders_unit_test.dart
  • libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart
  • libraries/flutter_inapp_purchase/test/ios_methods_test.dart
  • libraries/godot-iap/CLAUDE.md
  • libraries/godot-iap/CONTRIBUTING.md
  • libraries/godot-iap/EXAMPLES.md
  • libraries/godot-iap/Example/iap_manager.gd
  • libraries/godot-iap/Makefile
  • libraries/godot-iap/README.md
  • libraries/godot-iap/addons/godot-iap/android/GodotIap.gdap
  • libraries/godot-iap/addons/godot-iap/godot_iap.gd
  • libraries/godot-iap/addons/godot-iap/godot_iap_plugin.gd
  • libraries/godot-iap/android/build.gradle.kts
  • libraries/godot-iap/android/gradle.properties
  • libraries/godot-iap/android/gradle/wrapper/gradle-wrapper.properties
  • libraries/godot-iap/android/settings.gradle.kts
  • libraries/godot-iap/android/src/main/AndroidManifest.xml
  • libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt
  • libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift
  • libraries/godot-iap/scripts/build_android.sh
  • libraries/godot-iap/scripts/generate-types.sh
  • libraries/godot-iap/scripts/pre-commit
  • libraries/godot-iap/scripts/sync-versions.sh
  • libraries/godot-iap/scripts/write-gdap.sh
  • libraries/kmp-iap/CHANGELOG.md
  • libraries/kmp-iap/CLAUDE.md
  • libraries/kmp-iap/CONTRIBUTING.md
  • libraries/kmp-iap/README.md
  • libraries/kmp-iap/example/composeApp/build.gradle.kts
  • libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt
  • libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/PurchaseFlowScreen.kt
  • libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/SubscriptionFlowScreen.kt
  • libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/WebhookStreamScreen.kt
  • libraries/kmp-iap/example/gradle.properties
  • libraries/kmp-iap/example/gradle/libs.versions.toml
  • libraries/kmp-iap/example/gradle/wrapper/gradle-wrapper.properties
  • libraries/kmp-iap/example/iosApp/iosApp.xcodeproj/project.pbxproj
  • libraries/kmp-iap/example/run-ios.sh
  • libraries/kmp-iap/example/settings.gradle.kts
  • libraries/kmp-iap/gradle.properties
  • libraries/kmp-iap/gradle.properties.template
  • libraries/kmp-iap/gradle/libs.versions.toml
  • libraries/kmp-iap/gradle/wrapper/gradle-wrapper.properties
  • libraries/kmp-iap/library/build.gradle.kts
  • libraries/kmp-iap/library/library.podspec
  • libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt
  • libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt
  • libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/DslExtensions.kt
  • libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt
  • libraries/kmp-iap/library/src/commonTest/kotlin/io/github/hyochan/kmpiap/InAppPurchaseTest.kt
  • libraries/kmp-iap/library/src/commonTest/kotlin/io/github/hyochan/kmpiap/VerificationTest.kt
  • libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt
  • libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/openiap/WebhookTransport.ios.kt
  • libraries/kmp-iap/local.properties.template
  • libraries/kmp-iap/native/InAppPurchaseBridge/Package.swift
  • libraries/kmp-iap/native/InAppPurchaseBridge/Sources/InAppPurchaseBridge/InAppPurchaseBridge.swift
  • libraries/kmp-iap/publish-local.sh
  • libraries/kmp-iap/scripts/build-all.sh
  • libraries/kmp-iap/scripts/generate-types.sh
  • libraries/kmp-iap/scripts/publish-local.sh
  • libraries/kmp-iap/scripts/update-readme-version.sh
  • libraries/kmp-iap/setup.sh
  • libraries/maui-iap/README.md
  • libraries/maui-iap/android/build.gradle.kts
  • libraries/maui-iap/android/gradle.properties
  • libraries/maui-iap/android/openiap/build.gradle.kts
  • libraries/maui-iap/android/settings.gradle.kts
  • libraries/maui-iap/example/OpenIap.Maui.Example/Pages/AllProductsPage.xaml.cs
  • libraries/maui-iap/example/OpenIap.Maui.Example/Pages/AlternativeBillingPage.xaml.cs
  • libraries/maui-iap/example/OpenIap.Maui.Example/Pages/AvailablePurchasesPage.xaml.cs
  • libraries/maui-iap/example/OpenIap.Maui.Example/Pages/WebhookStreamPage.xaml.cs
  • libraries/maui-iap/src/Directory.Build.props
  • libraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj
  • libraries/maui-iap/src/OpenIap.Maui.Bindings.iOS/ApiDefinition.cs
  • libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj
  • libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/NSObjectJsonBridge.cs
  • libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/OpenIapIOS.cs
  • libraries/maui-iap/src/OpenIap.Maui/Types.cs
  • libraries/react-native-iap/CLAUDE.md
  • libraries/react-native-iap/CONTRIBUTING.md
  • libraries/react-native-iap/README.md
  • libraries/react-native-iap/android/build.gradle
  • libraries/react-native-iap/android/gradle.properties
  • libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt
  • libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/RnIapLog.kt
  • libraries/react-native-iap/codecov.yml
  • libraries/react-native-iap/example-expo/.env.example
  • libraries/react-native-iap/example-expo/.gitignore
  • libraries/react-native-iap/example-expo/.vscode/settings.json
  • libraries/react-native-iap/example-expo/App.tsx
  • libraries/react-native-iap/example-expo/README.md
  • libraries/react-native-iap/example-expo/app.config.ts
  • libraries/react-native-iap/example-expo/app/_layout.tsx
  • libraries/react-native-iap/example-expo/app/all-products.tsx
  • libraries/react-native-iap/example-expo/app/alternative-billing.tsx
  • libraries/react-native-iap/example-expo/app/available-purchases.tsx
  • libraries/react-native-iap/example-expo/app/index.tsx
  • libraries/react-native-iap/example-expo/app/offer-code.tsx
  • libraries/react-native-iap/example-expo/app/purchase-flow.tsx
  • libraries/react-native-iap/example-expo/app/subscription-flow.tsx
  • libraries/react-native-iap/example-expo/app/test.tsx
  • libraries/react-native-iap/example-expo/app/webhook-stream.tsx
  • libraries/react-native-iap/example-expo/components/AndroidOneTimeOfferDetails.tsx
  • libraries/react-native-iap/example-expo/components/Collapsible.tsx
  • libraries/react-native-iap/example-expo/components/ExternalLink.tsx
  • libraries/react-native-iap/example-expo/components/HapticTab.tsx
  • libraries/react-native-iap/example-expo/components/HelloWave.tsx
  • libraries/react-native-iap/example-expo/components/Loading.tsx
  • libraries/react-native-iap/example-expo/components/ParallaxScrollView.tsx
  • libraries/react-native-iap/example-expo/components/PurchaseDetails.tsx
  • libraries/react-native-iap/example-expo/components/PurchaseSummaryRow.tsx
  • libraries/react-native-iap/example-expo/components/ThemedText.tsx
  • libraries/react-native-iap/example-expo/components/ThemedView.tsx
  • libraries/react-native-iap/example-expo/components/ui/IconSymbol.ios.tsx
  • libraries/react-native-iap/example-expo/components/ui/IconSymbol.tsx
  • libraries/react-native-iap/example-expo/components/ui/TabBarBackground.ios.tsx
  • libraries/react-native-iap/example-expo/components/ui/TabBarBackground.tsx
  • libraries/react-native-iap/example-expo/constants/Colors.ts
  • libraries/react-native-iap/example-expo/constants/products.ts
  • libraries/react-native-iap/example-expo/contexts/DataModalContext.tsx
  • libraries/react-native-iap/example-expo/eslint.config.js
  • libraries/react-native-iap/example-expo/hooks/useColorScheme.ts
  • libraries/react-native-iap/example-expo/hooks/useColorScheme.web.ts
  • libraries/react-native-iap/example-expo/hooks/useThemeColor.ts
  • libraries/react-native-iap/example-expo/hooks/useVerificationMethod.ts
  • libraries/react-native-iap/example-expo/package.json
  • libraries/react-native-iap/example-expo/scripts/copy-screens.sh
  • libraries/react-native-iap/example-expo/scripts/expo-setup.sh
  • libraries/react-native-iap/example-expo/scripts/reset-project.js
  • libraries/react-native-iap/example-expo/tsconfig.json
  • libraries/react-native-iap/example-expo/utils/buildPurchaseRows.ts
  • libraries/react-native-iap/example-expo/utils/errorUtils.ts
  • libraries/react-native-iap/example/android/app/build.gradle
  • libraries/react-native-iap/example/screens/AllProducts.tsx
  • libraries/react-native-iap/example/screens/AlternativeBilling.tsx
  • libraries/react-native-iap/example/screens/AvailablePurchases.tsx
  • libraries/react-native-iap/example/screens/PurchaseFlow.tsx
  • libraries/react-native-iap/example/screens/SubscriptionFlow.tsx
  • libraries/react-native-iap/example/screens/WebhookStream.tsx
  • libraries/react-native-iap/example/src/components/AndroidOneTimeOfferDetails.tsx
  • libraries/react-native-iap/example/src/contexts/DataModalContext.tsx
  • libraries/react-native-iap/example/src/utils/buildPurchaseRows.ts
  • libraries/react-native-iap/ios/HybridRnIap.swift
  • libraries/react-native-iap/nitro.json
  • libraries/react-native-iap/package.json
  • libraries/react-native-iap/scripts/ci-check.sh
  • libraries/react-native-iap/src/__tests__/index.test.ts
  • libraries/react-native-iap/src/hooks/useIAP.ts
  • libraries/react-native-iap/src/index.ts
  • libraries/react-native-iap/src/specs/RnIap.nitro.ts
  • libraries/react-native-iap/src/types.ts
  • libraries/react-native-iap/tsconfig.build.json
  • libraries/react-native-iap/tsconfig.json
  • llms-full.txt
  • llms.txt
  • package.json
  • packages/apple/.gitignore
  • packages/apple/CONTRIBUTING.md
  • packages/apple/Example/OpenIapExample/Screens/WebhookStreamScreen.swift
  • packages/apple/Example/workspace-state.json
  • packages/apple/README.md
  • packages/apple/Sources/Models/Types.swift
  • packages/apple/Sources/OpenIapModule+ObjC.swift
  • packages/apple/Sources/OpenIapModule.swift
  • packages/apple/Sources/OpenIapProtocol.swift
  • packages/apple/Sources/OpenIapStore.swift
  • packages/apple/Sources/OpenIapVersion.swift
  • packages/apple/openiap.podspec
  • packages/apple/package.json
  • packages/apple/scripts/build-xcframework.sh
  • packages/apple/scripts/bump-version.sh
  • packages/apple/wrapper/project.yml
  • packages/docs/CONVENTION.md
  • packages/docs/deploy.sh
  • packages/docs/package.json
  • packages/docs/public/llms-full.txt
  • packages/docs/public/llms.txt
  • packages/docs/src/components/FeatureCode.tsx
  • packages/docs/src/lib/images.ts
  • packages/docs/src/lib/versioning.ts
  • packages/docs/src/pages/docs/android-setup.tsx
  • packages/docs/src/pages/docs/events/android/developer-provided-billing-listener-android.tsx
  • packages/docs/src/pages/docs/events/android/user-choice-billing-listener-android.tsx
  • packages/docs/src/pages/docs/example.tsx
  • packages/docs/src/pages/docs/features/debugging.tsx
  • packages/docs/src/pages/docs/features/external-purchase.tsx
  • packages/docs/src/pages/docs/features/offer-code-redemption.tsx
  • packages/docs/src/pages/docs/features/purchase.tsx
  • packages/docs/src/pages/docs/features/subscription/index.tsx
  • packages/docs/src/pages/docs/features/validation.tsx
  • packages/docs/src/pages/docs/horizon-setup.tsx
  • packages/docs/src/pages/docs/kit-backend.tsx
  • packages/docs/src/pages/docs/lifecycle/subscription.tsx
  • packages/docs/src/pages/docs/setup/expo.tsx
  • packages/docs/src/pages/docs/setup/flutter.tsx
  • packages/docs/src/pages/docs/setup/godot.tsx
  • packages/docs/src/pages/docs/setup/kmp.tsx
  • packages/docs/src/pages/docs/setup/maui.tsx
  • packages/docs/src/pages/docs/setup/react-native.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/chore-openiap-security-improvements

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@hyochan hyochan added cross-platform Cross-platform (both Android & iOS) expo-iap expo-iap library flutter_inapp_purchase flutter_inapp_purchase library godot-iap godot-iap library kit IAPKit (receipt-validation SaaS) kmp-iap kmp-iap library maui maui library react-native-iap react-native-iap library ⬡ gql 💨 ci Cloud integration 📖 documentation Improvements or additions to documentation 📱 iOS Related to iOS 🛠 bugfix All kinds of bug fixes 🤖 android Related to android 🧪 test Issue or pr related to testing labels May 16, 2026
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request performs a comprehensive synchronization and refactoring across all OpenIAP framework libraries (Expo, Flutter, Godot, KMP, and MAUI). Key changes include centralizing version management by reading directly from openiap-versions.json and native build files, implementing sensitive data redaction in logs, and updating documentation links to align with the new openiap.dev structure. The PR also updates core dependencies to Kotlin 2.2.0 and AGP 8.13.2 while refactoring Android build logic for better maintainability. Feedback for the flutter_inapp_purchase Android implementation suggests avoiding aggressive connection termination in onDetachedFromActivity to prevent background update issues. Additionally, the reviewer notes that repurposing existing alternative billing methods for specific programs breaks consistency across packages and recommends using non-deprecated native methods.

@hyochan hyochan requested a review from Copilot May 16, 2026 08:20
@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

/gemini review

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request synchronizes dependency versions and documentation links across the monorepo, refactors build scripts for better maintainability, and removes legacy Amazon IAP support from the Flutter library. It also introduces a GV Cloud Workspace Policy and enhances the Expo and MAUI libraries with improved logging, error handling, and support for advanced purchase features. Feedback was provided to address potential precision loss in currency formatting within the Onside module, ensure robust error messages in the KMP library by restoring a null fallback, and correct string serialization in the MAUI iOS bridge to avoid issues with literal quotes.

Comment thread libraries/expo-iap/ios/onside/OnsideIapModule.swift Outdated
Comment thread libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/NSObjectJsonBridge.cs Outdated
@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

/gemini review

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request standardizes all OpenIAP framework libraries by centralizing dependency versions and aligning documentation links. It includes significant cleanups, such as removing legacy Amazon IAP support in Flutter and the independent Expo example in React Native, and introduces a new GV Cloud Workspace Policy. Review feedback identifies critical security risks introduced by removing token truncation in example UIs and logs. Additionally, the reviewer noted potential crashes in Android error handling for Flutter and KMP due to unsafe type assumptions, and a possible null pointer exception in KMP's purchase logic following the removal of a type fallback.

Comment thread libraries/expo-iap/example/app/alternative-billing.tsx
Comment thread libraries/expo-iap/example/app/purchase-flow.tsx
Comment thread libraries/expo-iap/example/app/subscription-flow.tsx
Comment thread libraries/expo-iap/example/app/available-purchases.tsx
@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

/gemini review

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements a comprehensive standardization of version management and cross-platform behavior across the OpenIAP monorepo, affecting the Expo, Flutter, Godot, KMP, and .NET MAUI libraries. Key changes include centralizing Android SDK and dependency versions, improving internal logging mechanisms, and updating all documentation to point to the unified openiap.dev site. Review feedback identifies a critical missing cast in the KMP iOS implementation that would cause a build failure and suggests making regex-based version parsing more robust. Furthermore, security concerns were raised regarding the exposure of full purchase tokens in example app logs, recommending the restoration of truncation or redaction for sensitive data.

Comment thread libraries/expo-iap/android/openiap-android-sdk.gradle Outdated
Comment thread libraries/expo-iap/example/app/subscription-flow.tsx
@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

/gemini review

@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 16, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request synchronizes and modernizes the OpenIAP ecosystem across Expo, Flutter, Godot, KMP, and MAUI. Key changes include centralizing Android SDK versions, updating documentation links to openiap.dev, standardizing logging with sensitive data masking, and adding support for advanced iOS subscription features in Flutter and KMP. Native bridges were also improved for better robustness. Feedback recommends ensuring main-thread execution for Flutter method channel calls and suggests mapping null values to NSNull in the KMP iOS bridge to maintain key presence for native consumers.

@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

/gemini review

@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 16, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request executes a broad synchronization of dependency versions and documentation across all OpenIAP libraries, centralizing Android SDK management and updating references to the official documentation. Key technical updates include the adoption of payload-based purchase requests on iOS to support advanced offer fields and the removal of redundant example projects. Review feedback highlights a high-severity security regression in the Flutter library where sensitive token masking was removed, a critical bug in the KMP library's Objective-C bridge regarding recursive collection conversion, and a potential logic failure in the Android plugin due to the removal of product type inference.

Comment thread libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart
@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

/gemini review

@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 16, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements a comprehensive update across the OpenIAP monorepo, focusing on dependency upgrades, documentation refinement, and architectural standardization. Key improvements include centralized Android SDK version management for the Expo, Flutter, and KMP libraries, the removal of legacy Amazon IAP support from the Flutter plugin, and enhanced iOS bridge logic to support advanced subscription features. The PR also introduces a new GV Cloud Workspace Policy and improves logging security by redacting sensitive data in example apps. Review feedback identifies opportunities to better align with the repository's naming conventions by removing redundant "Android" suffixes from native function calls in the Android implementations. Additionally, it is recommended to represent null values as "NSNull.Null" in the MAUI iOS bridge to ensure consistency across SDKs.

@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

/gemini review

@hyochan
Copy link
Copy Markdown
Member Author

hyochan commented May 16, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 16, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@hyochan hyochan merged commit 674a11e into main May 16, 2026
21 checks passed
@hyochan hyochan deleted the codex/chore-openiap-security-improvements branch May 16, 2026 16:11
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements a major refactor across the OpenIAP monorepo to centralize version management, standardize documentation links, and streamline build processes for Expo, Flutter, Godot, KMP, and MAUI. Key updates include the removal of legacy Amazon IAP support from the Flutter library, the migration of the React Native Expo example to the standalone expo-iap package, and the introduction of a mandatory GV Cloud Workspace Policy. Reviewer feedback consistently identifies a security regression across multiple example applications where sensitive identifiers like purchaseToken and externalTransactionToken are now displayed in full in the UI and logs rather than being truncated.

0,
20,
)}...\n\n⚠️ Important:\n1. Report token to Google Play within 24 hours\n2. Process payment on your external site`,
}\nToken: ${details.externalTransactionToken}\n\n⚠️ Important:\n1. Report token to Google Play within 24 hours\n2. Process payment on your external site`,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Displaying the full externalTransactionToken in the UI is a security risk. It's better to display a truncated version, as was done previously, or not display it at all in a real application.

Suggested change
}\nToken: ${details.externalTransactionToken}\n\n⚠️ Important:\n1. Report token to Google Play within 24 hours\n2. Process payment on your external site`,
}\nToken: ${details.externalTransactionToken.substring(0, 20)}...\n\n⚠️ Important:\n1. Report token to Google Play within 24 hours\n2. Process payment on your external site`,

<Text style={styles.value}>
{selectedSubscription.purchaseToken}
</Text>
<Text style={styles.value}>{selectedSubscription.purchaseToken}</Text>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Displaying the full purchaseToken in the UI is a security risk. Please consider masking it or showing only a portion of it.

Suggested change
<Text style={styles.value}>{selectedSubscription.purchaseToken}</Text>
<Text style={styles.value}>{selectedSubscription.purchaseToken ? `${selectedSubscription.purchaseToken.substring(0, 10)}...` : 'N/A'}</Text>

User selected alternative billing
Products: ${details.products.join(', ')}
Token: ${details.externalTransactionToken.substring(0, 20)}...
Token: ${details.externalTransactionToken}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Displaying the full externalTransactionToken in the UI is a security risk. It's better to display a truncated version, as was done previously.

Suggested change
Token: ${details.externalTransactionToken}
Token: ${details.externalTransactionToken.substring(0, 20)}...

Purchase Token: $truncatedToken...
Date: ${purchase.transactionDate}
Receipt: $receiptStatus
Purchase Token: $tokenStatus
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Displaying the full purchaseToken in the UI is a security risk. Please consider masking it or showing only a portion of it.

Suggested change
Purchase Token: $tokenStatus
Purchase Token: ${tokenStatus.length > 10 ? '${tokenStatus.substring(0, 10)}...' : tokenStatus}

const SizedBox(height: 4),
Text(
'Token: ${subscription.purchaseToken!.substring(0, subscription.purchaseToken!.length > 20 ? 20 : subscription.purchaseToken!.length)}...',
'Token: ${subscription.purchaseToken}',
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Displaying the full purchaseToken in the UI is a security risk. Please consider masking it or showing only a portion of it.

Suggested change
'Token: ${subscription.purchaseToken}',
'Token: ${_currentActiveSubscription!.purchaseToken!.substring(0, 10)}...',

offer.offerToken.length > 30
? '${offer.offerToken.substring(0, 30)}...'
: offer.offerToken,
offer.offerToken,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Displaying the full offerToken in the UI is a security risk. Please consider masking it or showing only a portion of it, as was done previously.

Suggested change
offer.offerToken,
offer.offerToken.length > 30
? '${offer.offerToken.substring(0, 30)}...'
: offer.offerToken,

if not offer_token.is_empty():
props.request.google.offer_token = offer_token
print("[IAPManager] Using offer token: %s" % offer_token.substr(0, 20) + "...")
print("[IAPManager] Using offer token: %s" % offer_token)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Displaying the full offer_token in the logs is a security risk. It's better to display a truncated version, as was done previously.

print("[IAPManager] Using offer token: %s" % offer_token.substr(0, 20) + "...")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🤖 android Related to android 🛠 bugfix All kinds of bug fixes 💨 ci Cloud integration cross-platform Cross-platform (both Android & iOS) 📖 documentation Improvements or additions to documentation expo-iap expo-iap library flutter_inapp_purchase flutter_inapp_purchase library godot-iap godot-iap library ⬡ gql 📱 iOS Related to iOS kit IAPKit (receipt-validation SaaS) kmp-iap kmp-iap library maui maui library react-native-iap react-native-iap library 🧪 test Issue or pr related to testing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants