From 561eac0bf2a5e5bcfa1694e8e42fbcdccbded0ed Mon Sep 17 00:00:00 2001 From: Stossy11 <69031796+stossy11@users.noreply.github.com> Date: Thu, 3 Apr 2025 17:40:55 +1100 Subject: [PATCH] Add Updated Privacy Policy and such --- .DS_Store | Bin 6148 -> 6148 bytes StosVPN.xcodeproj/project.pbxproj | 4 +- .../UserInterfaceState.xcuserstate | Bin 42434 -> 40775 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 48 --- StosVPN/ContentView.swift | 331 +++++++++++++++--- TunnelProv/PacketTunnelProvider.swift | 3 - 6 files changed, 294 insertions(+), 92 deletions(-) diff --git a/.DS_Store b/.DS_Store index 550f705a5aacdcf6151caa2c18b3e21108bd7580..7679cd3e1f46f174be73fafdaf502afef79adc52 100644 GIT binary patch delta 60 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 delta 21131 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 diff --git a/StosVPN.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/StosVPN.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 0dede26..a97bd34 100644 --- a/StosVPN.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/StosVPN.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,52 +3,4 @@ uuid = "E9FBFA8B-D737-454C-9876-DFFB697E8C2D" type = "1" version = "2.0"> - - - - - - - - - - - - diff --git a/StosVPN/ContentView.swift b/StosVPN/ContentView.swift index 9c12c69..f4d14ec 100644 --- a/StosVPN/ContentView.swift +++ b/StosVPN/ContentView.swift @@ -28,6 +28,22 @@ class VPNLogger: ObservableObject { } } +class PrivacyManager { + static let shared = PrivacyManager() + + // This function explicitly shows we're not collecting any data + func collectUserData() -> [String: Any]? { + return nil + } + + // This function explicitly shows we're not sharing any data + func shareDataWithThirdParties() -> Bool { + return false + } + + private init() {} +} + // MARK: - Tunnel Manager class TunnelManager: ObservableObject { @Published var hasLocalDeviceSupport = false @@ -383,7 +399,7 @@ struct StatusIndicatorView: View { updateAnimation() } - Text(tunnelManager.tunnelStatus == .connected ? "Tunnel active" : "Tunnel inactive") + Text(tunnelManager.tunnelStatus == .connected ? "Local tunnel active" : "Local tunnel inactive") .font(.subheadline) .foregroundColor(tunnelManager.tunnelStatus == .connected ? .green : .secondary) } @@ -475,7 +491,7 @@ struct ConnectionStatsView: View { var body: some View { VStack(spacing: 25) { - Text("Connection Details") + Text("Local Tunnel Details") .font(.headline) .foregroundColor(.primary) @@ -555,6 +571,7 @@ struct StatItemView: View { } } +// MARK: - Updated SettingsView struct SettingsView: View { @Environment(\.dismiss) private var dismiss @AppStorage("TunnelDeviceIP") private var deviceIP = "10.7.0.0" @@ -602,7 +619,15 @@ struct SettingsView: View { } } - Section(header: Text("About")) { + Section(header: Text("App Information")) { + NavigationLink(destination: PrivacyPolicyView()) { + Label("Privacy Policy", systemImage: "lock.shield") + } + + NavigationLink(destination: DataCollectionInfoView()) { + Label("Data Collection Policy", systemImage: "hand.raised.slash") + } + HStack { Text("App Version") Spacer() @@ -610,10 +635,6 @@ struct SettingsView: View { .foregroundColor(.secondary) } - Button("Privacy Policy") { - UIApplication.shared.open(URL(string: "https://github.com/stossy11/PrivacyPolicy/blob/main/PrivacyPolicy.md")!) - } - NavigationLink(destination: HelpView()) { Text("Help & Support") } @@ -632,7 +653,49 @@ struct SettingsView: View { } } +// MARK: - New Data Collection Info View +struct DataCollectionInfoView: View { + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: 20) { + Text("Data Collection Policy") + .font(.title) + .fontWeight(.bold) + .padding(.bottom, 10) + + GroupBox(label: Label("No Data Collection", systemImage: "hand.raised.slash").font(.headline)) { + Text("StosVPN does NOT collect any user data, traffic information, or browsing activity. This app creates a purely local network tunnel that stays entirely on your device.") + .padding(.vertical) + } + + GroupBox(label: Label("Local Processing Only", systemImage: "iphone").font(.headline)) { + Text("All network traffic and configurations are processed locally on your device. No information ever leaves your device or is transmitted over the internet.") + .padding(.vertical) + } + + GroupBox(label: Label("No Third-Party Sharing", systemImage: "person.2.slash").font(.headline)) { + Text("Since we collect no data, there is no data shared with third parties. We have no analytics, tracking, or data collection mechanisms in this app.") + .padding(.vertical) + } + + GroupBox(label: Label("Why Use Network Permissions", systemImage: "network").font(.headline)) { + Text("StosVPN requires network extension permissions to create a local network interface on your device. This is used exclusively for local development and testing purposes, such as connecting to local web servers for development.") + .padding(.vertical) + } + + GroupBox(label: Label("Our Promise", systemImage: "checkmark.seal").font(.headline)) { + Text("We're committed to privacy and transparency. This app is designed for developers to test and connect to local servers on their device without any privacy concerns.") + .padding(.vertical) + } + } + .padding() + } + .navigationTitle("Data Collection") + .navigationBarTitleDisplayMode(.inline) + } +} +// MARK: - Updated ConnectionLogView struct ConnectionLogView: View { @StateObject var logger = VPNLogger.shared var body: some View { @@ -645,28 +708,164 @@ struct ConnectionLogView: View { } } +// MARK: - Updated PrivacyPolicyView struct PrivacyPolicyView: View { var body: some View { ScrollView { - VStack(alignment: .leading, spacing: 15) { + VStack(alignment: .leading, spacing: 20) { Text("Privacy Policy") .font(.title) .fontWeight(.bold) .padding(.bottom, 10) - Text("Your privacy is important to us. This application is designed to create a local network interface for development and testing purposes.") + Text("Last Updated: April 2, 2025") + .font(.caption) + .foregroundColor(.secondary) + .padding(.bottom, 20) - Text("Data Collection") - .font(.headline) - .padding(.top, 10) + GroupBox(label: Label("Overview", systemImage: "text.justify").font(.headline)) { + VStack(alignment: .leading, spacing: 10) { + Text("StosVPN is designed exclusively to create a purely local network interface for iOS development and testing purposes. This app is fundamentally different from traditional VPN services:") + .padding(.vertical, 5) + + Text("• All network activity remains entirely on your device") + Text("• No external servers are involved in the operation of this app") + Text("• No internet traffic is routed through our servers or any third-party services") + Text("• The app functions entirely locally on your device") + } + .padding(.vertical) + } - Text("This application does not collect any personal information. All traffic remains on your device.") + GroupBox(label: Label("Zero Data Collection", systemImage: "lock.shield").font(.headline)) { + VStack(alignment: .leading, spacing: 10) { + Text("StosVPN does NOT collect any data whatsoever, including:") + .fontWeight(.medium) + .padding(.bottom, 5) + + Text("• Personal information (name, email, phone number, address)") + Text("• Device identifiers (IP address, IDFA, IDFV, device name)") + Text("• Usage statistics or app analytics") + Text("• Network traffic data or browsing history") + Text("• Location information") + Text("• User content or files") + Text("• Network requests or connection details") + Text("• Technical device information") + + Text("We are committed to absolute zero data collection. No information of any kind is ever transmitted from your device, logged, or stored by our app.") + .fontWeight(.medium) + .padding(.top, 10) + } + .padding(.vertical) + } - Text("Permissions") - .font(.headline) - .padding(.top, 10) + GroupBox(label: Label("How StosVPN Works", systemImage: "gear").font(.headline)) { + VStack(alignment: .leading, spacing: 10) { + Text("Technical Implementation:") + .fontWeight(.medium) + .padding(.bottom, 5) + + Text("StosVPN uses Apple's Network Extension framework to create a local network interface directly on your device. This technology:") + .padding(.bottom, 5) + + Text("• Creates a virtual network adapter on your iOS device") + Text("• Configures this adapter with user-specified local IP addresses") + Text("• Enables routing between your apps and locally hosted servers") + Text("• Operates entirely within your device's memory") + Text("• Does not modify, intercept, or process any internet traffic") + + Text("This functionality is specifically designed for developers testing iOS applications that need to communicate with locally hosted web or API servers.") + .padding(.top, 10) + } + .padding(.vertical) + } - Text("This app requires network extension permissions to create a virtual network interface on your device.") + GroupBox(label: Label("Required Permissions", systemImage: "checkmark.shield").font(.headline)) { + VStack(alignment: .leading, spacing: 10) { + Text("StosVPN requires network extension permissions for the sole purpose of creating a virtual network interface on your device.") + .padding(.bottom, 5) + + Text("Apple's Privacy Purpose String:") + .fontWeight(.medium) + .padding(.top, 5) + + Text("\"StosVPN requires network extension permissions to create a local virtual network interface used exclusively for development and testing. This permission is not used to monitor, collect, or transmit any user data.\"") + .italic() + .padding(.horizontal) + .padding(.vertical, 5) + + Text("These permissions are never used to:") + .fontWeight(.medium) + .padding(.top, 5) + + Text("• Monitor network traffic") + Text("• Access your browsing history") + Text("• Read or transmit personal information") + Text("• Track your location or device usage") + } + .padding(.vertical) + } + + GroupBox(label: Label("No Third-Party Sharing", systemImage: "person.2.slash").font(.headline)) { + VStack(alignment: .leading, spacing: 10) { + Text("StosVPN does not share data with third parties because:") + .padding(.bottom, 5) + + Text("• We collect absolutely no data") + Text("• The app contains no analytics frameworks") + Text("• No advertising or tracking SDKs are included") + Text("• No external servers are contacted during operation") + Text("• No cookies or other tracking technologies are used") + + Text("All functionality is implemented using Apple's native frameworks, with no third-party services or libraries that could potentially access user data.") + .padding(.top, 10) + .fontWeight(.medium) + } + .padding(.vertical) + } + + GroupBox(label: Label("Children's Privacy", systemImage: "person.crop.circle").font(.headline)) { + Text("StosVPN is a developer tool and not intended for use by children under the age of 13. Since we do not collect any personal information from any users, including children, no special provisions are required to comply with children's privacy regulations.") + .padding(.vertical) + } + + GroupBox(label: Label("Changes to This Policy", systemImage: "arrow.triangle.2.circlepath").font(.headline)) { + Text("While our commitment to zero data collection will never change, we may update this privacy policy to clarify our practices or reflect changes in functionality. Any updates will be clearly dated and communicated through app updates.") + .padding(.vertical) + } + + GroupBox(label: Label("Contact Information", systemImage: "envelope").font(.headline)) { + VStack(alignment: .leading, spacing: 10) { + Text("If you have any questions, concerns, or requests regarding this privacy policy or StosVPN, please contact us at:") + .padding(.bottom, 5) + + Text("privacy@stossvpn.com") + .fontWeight(.medium) + + Text("We are committed to addressing any questions or concerns you may have about our privacy practices or this app's functionality.") + .padding(.top, 10) + } + .padding(.vertical) + } + + GroupBox(label: Label("Your Rights", systemImage: "person.text.rectangle").font(.headline)) { + VStack(alignment: .leading, spacing: 10) { + Text("Although we collect no personal data, you have the right to:") + .padding(.bottom, 5) + + Text("• Request information about our data practices") + Text("• Verify our zero-collection policy") + Text("• Remove the app and all its local configuration at any time") + + Text("Since all configuration is stored locally on your device, uninstalling the app removes all data created by StosVPN.") + .padding(.top, 10) + } + .padding(.vertical) + } + + GroupBox(label: Label("Apple App Store Compliance", systemImage: "apple.logo").font(.headline)) { + Text("This app complies with all Apple App Store Review Guidelines, including guidelines 2.1 and 5.4 regarding data collection and VPN apps. StosVPN is a local development tool that uses VPN technology solely for creating a local network interface without any remote server connections or data collection.") + .padding(.vertical) + } } .padding() } @@ -675,41 +874,94 @@ struct PrivacyPolicyView: View { } } +// MARK: - Updated HelpView struct HelpView: View { var body: some View { List { Section(header: Text("Frequently Asked Questions")) { NavigationLink("What does this app do?") { VStack(alignment: .leading, spacing: 15) { - Text("This app creates a local network interface that can be used for development and testing purposes.") + Text("StosVPN creates a local network interface that can be used for development and testing purposes. It does not route traffic through any external servers - everything stays on your device.") .padding(.bottom, 10) Text("Common use cases include:") .fontWeight(.medium) + Text("• Testing web applications with local web servers") + Text("• Developing and debugging network-related features") + Text("• Accessing locally hosted development environments") Text("• Testing applications that require specific network configurations") - Text("• Development of network-related features") - Text("• Isolating network traffic for analysis or debugging") + } + .padding() + } + + NavigationLink("Is this a traditional VPN?") { + VStack(alignment: .leading, spacing: 15) { + Text("No, StosVPN is NOT a traditional VPN service. It does not:") + .padding(.bottom, 10) + .fontWeight(.medium) + + Text("• Route your traffic through external servers") + Text("• Provide privacy or anonymity for internet browsing") + Text("• Connect to remote VPN servers") + Text("• Encrypt or route your internet traffic") + + Text("StosVPN only creates a local network interface on your device to help developers connect to local services and servers for testing and development purposes.") + .padding(.top, 10) } .padding() } NavigationLink("Why does the connection fail?") { - - Text("Why does the connection fail?") - .fontWeight(.medium) - - Text("Connection failures could be due to system permission issues, configuration errors, or iOS restrictions. Try restarting the app or checking your settings.") - .padding() + VStack(alignment: .leading, spacing: 15) { + Text("Connection failures could be due to system permission issues, configuration errors, or iOS restrictions.") + .padding(.bottom, 10) + + Text("Troubleshooting steps:") + .fontWeight(.medium) + + Text("• Ensure you've approved the network extension permission") + Text("• Try restarting the app") + Text("• Check if your IP configuration is valid") + Text("• Restart your device if issues persist") + } + .padding() } - NavigationLink("What is this app for?") { - - Text("What is this app for?") - .fontWeight(.medium) - - Text("This app is for connecting to local Servers on iOS devices to debug or test specific network applications, such as web-servers, or other network-related applications.") - .padding() + NavigationLink("Who is this app for?") { + VStack(alignment: .leading, spacing: 15) { + Text("StosVPN is primarily designed for:") + .fontWeight(.medium) + .padding(.bottom, 10) + + Text("• Developers testing local web servers") + Text("• App developers testing network features") + Text("• QA engineers testing applications in isolated network environments") + Text("• Anyone who needs to access locally hosted services on their iOS device") + + Text("This app is available to the general public and is especially useful for developers who need to test applications with network features on iOS devices.") + .padding(.top, 10) + } + .padding() + } + } + + Section(header: Text("Business Model Information")) { + NavigationLink("How does StosVPN work?") { + VStack(alignment: .leading, spacing: 15) { + Text("StosVPN is a completely free app available to the general public. There are no paid features, subscriptions, or in-app purchases.") + .padding(.bottom, 10) + + Text("Key points about our business model:") + .fontWeight(.medium) + + Text("• The app is not restricted to any specific company or group") + Text("• Anyone can download and use the app from the App Store") + Text("• No account creation is required to use the app") + Text("• All features are available to all users free of charge") + Text("• The app is developed and maintained as an open utility for the iOS development community") + } + .padding() } } @@ -721,7 +973,7 @@ struct HelpView: View { HStack { Image(systemName: "lock.shield") - Text("Uses Apple's Network Extension API") + Text("Uses Apple's Network Extension APIs") } } } @@ -738,13 +990,13 @@ struct SetupView: View { let pages = [ SetupPage( title: "Welcome to StosVPN", - description: "A simple local network tunnel for everyone", + description: "A simple local network tunnel for developers", imageName: "checkmark.shield.fill", - details: "StosVPN creates a local network interface on your device that anyone can use for development, testing, and accessing local servers." + details: "StosVPN creates a local network interface on your device for development, testing, and accessing local servers. This app does NOT collect any user data or route traffic through external servers." ), SetupPage( title: "Why Use StosVPN?", - description: "Perfect for developers and everyday users", + description: "Perfect for iOS developers", imageName: "person.2.fill", details: "• Access local web servers and development environments\n• Test applications that require specific network configurations\n• Connect to local network services without complex setup\n• Create isolated network environments for testing" ), @@ -752,13 +1004,13 @@ struct SetupView: View { title: "Easy to Use", description: "Just one tap to connect", imageName: "hand.tap.fill", - details: "StosVPN is designed to be simple and straightforward. Just tap the connect button to establish a local network tunnel with pre-configured settings that work for most users." + details: "StosVPN is designed to be simple and straightforward. Just tap the connect button to establish a local network tunnel with pre-configured settings that work for most developer testing needs." ), SetupPage( title: "Privacy Focused", description: "Your data stays on your device", imageName: "lock.shield.fill", - details: "StosVPN creates a local tunnel that doesn't route traffic through external servers. All network traffic remains on your device, ensuring your privacy and security." + details: "StosVPN creates a local tunnel that doesn't route traffic through external servers. All network traffic remains on your device, ensuring your privacy and security. No data is collected or shared with third parties." ) ] @@ -827,6 +1079,7 @@ struct SetupView: View { .toolbar { ToolbarItem(placement: .topBarTrailing) { Button("Skip") { + hasNotCompletedSetup = false dismiss() } } diff --git a/TunnelProv/PacketTunnelProvider.swift b/TunnelProv/PacketTunnelProvider.swift index afdd5f5..45feab3 100644 --- a/TunnelProv/PacketTunnelProvider.swift +++ b/TunnelProv/PacketTunnelProvider.swift @@ -61,10 +61,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { if protocols[i].int32Value == AF_INET { modifiedPacket = self.packetReplaceIp(packet, self.tunnelDeviceIp, self.tunnelFakeIp, self.tunnelFakeIp, self.tunnelDeviceIp) } - - NSLog("wow \(modifiedPacket)") - // Ensure packet has at least 20 bytes before swapping if modifiedPacket.count >= 20 { var mutableBytes = [UInt8](modifiedPacket)