import Foundation
import UIKit

@objc(UNSecurityHelperModule)
class UNSecurityHelperModule: NSObject, RCTBridgeModule {
  static func moduleName() -> String! {
    "UNSecurityHelperModule"
  }
  
  @objc static func requiresMainQueueSetup() -> Bool {
      return false
  }

  @objc func isDeviceJailbroke(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
      #if targetEnvironment(simulator)
      resolve(false)
      #else
      if checkJailbrokeByFilePermissions() ||
          checkJailbrokeByProtocolHandlers() ||
          checkJailbrokeByContainingSuspiciousApps() ||
          checkJailbrokeByContainingSuspiciousSystemPaths() {
          resolve(true)
      } else {
          resolve(false)
      }
      #endif
  }
}

fileprivate extension UNSecurityHelperModule {
    var suspiciousSystemPaths: [String] {
        [
            "/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist",
            "/Library/MobileSubstrate/DynamicLibraries/Veency.plist",
            "/private/var/lib/apt",
            "/private/var/lib/apt/",
            "/private/var/lib/cydia",
            "/private/var/mobile/Library/SBSettings/Themes",
            "/private/var/stash",
            "/private/var/tmp/cydia.log",
            "/System/Library/LaunchDaemons/com.ikey.bbot.plist",
            "/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist",
            "/usr/bin/sshd",
            "/usr/libexec/sftp-server",
            "/usr/sbin/sshd",
            "/etc/apt",
            "/bin/bash",
            "/Library/MobileSubstrate/MobileSubstrate.dylib"
        ]
    }

    var suspiciousAppsPath: [String] {
        [
            "/Applications/Cydia.app",
            "/Applications/blackra1n.app",
            "/Applications/FakeCarrier.app",
            "/Applications/Icy.app",
            "/Applications/IntelliScreen.app",
            "/Applications/MxTube.app",
            "/Applications/RockApp.app",
            "/Applications/SBSettings.app",
            "/Applications/WinterBoard.app"
        ]
    }

    func checkJailbrokeByFilePermissions() -> Bool {
        do {
            let pathToFileInRestrictedDirectory = "/private/jailbreak.txt"
            try "This is a test.".write(toFile: pathToFileInRestrictedDirectory, atomically: true, encoding: String.Encoding.utf8)
            try FileManager.default.removeItem(atPath: pathToFileInRestrictedDirectory)
            // Device is jailbroken
            return true
        } catch {
            // Device is not jailbroken
            return false
        }
    }

    func checkJailbrokeByProtocolHandlers() -> Bool {
        if let url = URL(string: "cydia://package/com.example.package"), UIApplication.shared.canOpenURL(url) {
            // Device is jailbroken
            return true
        }
        return false
    }

    func checkJailbrokeByContainingSuspiciousApps() -> Bool {
        suspiciousAppsPath.contains { FileManager.default.fileExists(atPath: $0) }
    }

    func checkJailbrokeByContainingSuspiciousSystemPaths() -> Bool {
        suspiciousSystemPaths.contains { FileManager.default.fileExists(atPath: $0) }
    }
}
