def valid_source_code(app_dir): """Test if this is an valid source code zip.""" try: logger.info('Detecting source code type') ide, is_and = is_android_source(app_dir) if ide: return ide, is_and # Relaxed Android Source check, one level down for x in os.listdir(app_dir): obj = os.path.join(app_dir, x) if not is_dir_exists(obj): continue ide, is_and = is_android_source(obj) if ide: move_to_parent(obj, app_dir) return ide, is_and # iOS Source xcode = [f for f in os.listdir(app_dir) if f.endswith('.xcodeproj')] if xcode: return 'ios', True # Relaxed iOS Source Check for x in os.listdir(app_dir): obj = os.path.join(app_dir, x) if not is_dir_exists(obj): continue if [f for f in os.listdir(obj) if f.endswith('.xcodeproj')]: return 'ios', True return '', False except Exception: logger.exception('Identifying source code from zip')
def get_icon(md5, bin_dir, binary): """Get app icon from IPA.""" try: logger.info('Fetching icon path') bin_path = os.path.join(bin_dir, binary + '.app') if not is_dir_exists(bin_path): logger.warning('Could not find app binary directory') return False icons = glob.glob(bin_path + '/AppIcon*png') if not icons: logger.warning('Could not find app icon') return False icon_file = icons.pop() outfile = os.path.join(settings.DWD_DIR, md5 + '-icon.png') if platform.system() == 'Darwin': args = ['xcrun', '-sdk', 'iphoneos', 'pngcrush', '-q', '-revert-iphone-optimizations', icon_file, outfile] # Uncrush PNG. CgBI -> PNG, Mac only # https://iphonedevwiki.net/index.php/CgBI_file_format try: out = subprocess.run(args, capture_output=True) if b'libpng error:' in out.stdout: # PNG looks normal raise ValueError('PNG is not CgBI') except Exception: shutil.copy2(icon_file, outfile) else: shutil.copy2(icon_file, outfile) return True except Exception: logger.exception('Error Fetching icon') return False
def valid_android_zip(app_dir): """Test if this is an valid android zip.""" try: logger.info('Checking for ZIP Validity and Mode') # Eclipse man = os.path.isfile(os.path.join(app_dir, 'AndroidManifest.xml')) src = os.path.exists(os.path.join(app_dir, 'src/')) if man and src: return 'eclipse', True # Studio man = os.path.isfile( os.path.join(app_dir, 'app/src/main/AndroidManifest.xml'), ) java = os.path.exists(os.path.join(app_dir, 'app/src/main/java/')) kotlin = os.path.exists(os.path.join(app_dir, 'app/src/main/kotlin/')) if man and (java or kotlin): return 'studio', True # iOS Source xcode = [f for f in os.listdir(app_dir) if f.endswith('.xcodeproj')] if xcode: return 'ios', True # Relaxed iOS Source Check for x in os.listdir(app_dir): obj = os.path.join(app_dir, x) if not is_dir_exists(obj): continue if [f for f in os.listdir(obj) if f.endswith('.xcodeproj')]: return 'ios', True return '', False except Exception: logger.exception('Determining Upload type')
def delete_scan(request, api=False): """Delete Scan from DB and remove the scan related files.""" try: if request.method == 'POST': if api: md5_hash = request.POST['hash'] else: md5_hash = request.POST['md5'] data = {'deleted': 'scan hash not found'} if re.match('[0-9a-f]{32}', md5_hash): # Delete DB Entries scan = RecentScansDB.objects.filter(MD5=md5_hash) if scan.exists(): RecentScansDB.objects.filter(MD5=md5_hash).delete() StaticAnalyzerAndroid.objects.filter(MD5=md5_hash).delete() StaticAnalyzerIOS.objects.filter(MD5=md5_hash).delete() StaticAnalyzerWindows.objects.filter(MD5=md5_hash).delete() # Delete Upload Dir Contents app_upload_dir = os.path.join(settings.UPLD_DIR, md5_hash) if is_dir_exists(app_upload_dir): shutil.rmtree(app_upload_dir) # Delete Download Dir Contents dw_dir = settings.DWD_DIR for item in os.listdir(dw_dir): item_path = os.path.join(dw_dir, item) valid_item = item.startswith(md5_hash + '-') # Delete all related files if is_file_exists(item_path) and valid_item: os.remove(item_path) # Delete related directories if is_dir_exists(item_path) and valid_item: shutil.rmtree(item_path) data = {'deleted': 'yes'} if api: return data else: ctype = 'application/json; charset=utf-8' return HttpResponse(json.dumps(data), content_type=ctype) except Exception as exp: msg = str(exp) exp_doc = exp.__doc__ if api: return print_n_send_error_response(request, msg, True, exp_doc) else: return print_n_send_error_response(request, msg, False, exp_doc)