From c062910a22024f0c658e0b36ca0ea31910f6236b Mon Sep 17 00:00:00 2001 From: profiteroles Date: Wed, 22 May 2019 00:59:01 -0700 Subject: [PATCH] 0.7.11.5 --- MainMenu.nib/designable.nib | 337 ++++++++++++++++++++++++---------- MainMenu.nib/keyedobjects.nib | Bin 37119 -> 42690 bytes README.md | 34 ++++ Yuba.php | 98 ++++------ YubaPrefs.php | 0 filetypes.php | 279 +++++++++++++++------------- functions.php | 15 +- version.txt | 1 + web/rtc.php | 53 ++++-- yuba.icns | Bin 0 -> 179991 bytes 10 files changed, 509 insertions(+), 308 deletions(-) create mode 100644 README.md create mode 100644 YubaPrefs.php create mode 100755 version.txt create mode 100644 yuba.icns diff --git a/MainMenu.nib/designable.nib b/MainMenu.nib/designable.nib index 578d787..2f1894d 100644 --- a/MainMenu.nib/designable.nib +++ b/MainMenu.nib/designable.nib @@ -52,21 +52,20 @@ - - + - + - + - + - + @@ -75,7 +74,7 @@ - + - + - + - - - - + + + + + - - + - - + - + - + - + - + @@ -489,11 +639,11 @@ Gw - + - + @@ -507,28 +657,36 @@ Gw - + - - + - + + - + - + - + - + @@ -537,7 +695,7 @@ Gw - + @@ -548,21 +706,12 @@ Gw - - + diff --git a/MainMenu.nib/keyedobjects.nib b/MainMenu.nib/keyedobjects.nib index 7e12bedfa0d9db99d8cb6f681cbcdaecd0ac9114..de94f155c34fe295b3e816b30953f7cdc0a46283 100644 GIT binary patch literal 42690 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

i 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%0DJmr@Eh-}_%N&&xl^0bI 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 E56M;b+5i9m diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f4cc77 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ + + +# Yuba + +**Yuba** generates a web-browsable SQLite database from an HFS+ filesystem. Its client application gathers forensic-quality data about a locally attached disk, properly interpreting bundles, reading Spotlight data, Finder flags, labels, and other contextual information. It can generate hashes, thumbnails, and gather 3rd party metadata with exiftool and mediainfo. Yuba's filesystem catalogues are comprehensive, lightweight, optimized for massive (1 million+) trees, and reflect incremental changes to contents and metadata. A server-side PHP script is provided, which allows familiar, Finder-style browsing of a catalogue. + +* **⇩ [Download Yuba 0.7.11](http://www.profiteroles.org/downloads/Yuba_0.7.11.zip)** + +## Features + +* Recursive directory scanning +* Properly interprets bundles +* Uses native macOS methods +* Spotlight metadata and icons +* Caches assets for re-scans +* Optional file hashes +* Tested with large filesystems + +## Screenshots + + + + + +## Notes + +Running Yuba requires disabling Gatekeeper by running `sudo spctl --master-disable` in the Terminal. + +## Building from source + +Building Minat requires Platypus and Pashua + +* https://github.com/sveinbjornt/Platypus +* https://github.com/BlueM/Pashua \ No newline at end of file diff --git a/Yuba.php b/Yuba.php index 7166e0b..9d3b378 100755 --- a/Yuba.php +++ b/Yuba.php @@ -3,7 +3,7 @@ // Yuba // // ////////////////////////////////////////// -$version = "0.7.10.3"; +$version = "0.7.11.5"; ini_set('memory_limit', '10240M'); date_default_timezone_set("America/Los_Angeles"); @@ -11,23 +11,22 @@ date_default_timezone_set("America/Los_Angeles"); // Includes & Prefs ////////////////////////////////////////// +$p = unserialize(file_get_contents("prefs.php")); + require("functions.php"); require("filetypes.php"); -$wopt_noprofile = 0; $wopt_steps = 10; $wopt_currstep = 1; $parser = new plistParser(); -$p = unserialize(file_get_contents("prefs.php")); - // Path & application variables ////////////////////////////////////////// $stamp = date("Y-m-d_H-i-s", time()); -if (!isset($argv[1])) { echo "Input error"; die; } +if (!isset($argv[1])) { echo "No input"; die; } $zpath = realpath(@$argv[1]); if (@$argv[2]) { $bdest = realpath($argv[2]); } else { $bdest = realpath($p['bdest']); } if (!is_dir($zpath) | !is_dir($bdest)) { echo "Filepath error"; die; } @@ -41,38 +40,6 @@ if (!is_dir($bpath)) { mkdir($bpath); } if (!is_dir($bpath."/thumbs")) { mkdir($bpath."/thumbs"); } if (!is_dir($bpath."/contents")) { mkdir($bpath."/contents"); } -// Treat these directories as files -$p['bundles'] = array( "app", - "bundle", - "sparsebundle", - "photoslibrary", - "aplibrary", - "apvault", - "abbu", - "calendar", - "framework", - "plugin", - "kext", - "rtfd" - ); - -foreach ($p['bundles'] as $bundle) { - $p['nodescend'][] = "*.".$bundle; - } - -// Ignore matching files and directories -$p['ignore'] = array( ".DS_Store", - ".Trashes", - ".DocumentRevisions-V100", - ".Spotlight-V100", - ".TemporaryItems", - ".apdisk", - ".com.apple.timemachine.donotpresent", - ".fseventsd", - ".metadata-never-index", - ".neofinder.abemeda.volinfo.xml" - ); - // Metadata tools $bin_gfi = __DIR__."/bin/GetFileInfo"; $bin_mediainfo = __DIR__."/bin/mediainfo"; @@ -187,11 +154,11 @@ if ($type == "Disk image") { $image_file = false; } -if ($wopt_noprofile) { - $profile = "disabled"; - } else { +if ($p['profile']) { echo msg("system_profiler"); $profile = shell_exec("system_profiler SPHardwareDataType SPStorageDataType SPThunderboltDataType SPUSBDataType 2>&1"); + } else { + $profile = "disabled"; } $qlmanage = shell_exec("qlmanage -m 2>&1"); $sysvers = shell_exec("sw_vers 2>&1"); @@ -460,10 +427,7 @@ echo ProgressBar::finish(); // Thow permissions error if (count($noread)) { - echo msg("Current user (".posix_getuid().") does not have read access to the following files:"); - foreach ($noread as $file) { - echo $file."\n"; - } + echo msg("Current user (".posix_getuid().") does not have read access to the following files:\n").implode("\n",$noread); if ($p['readability']) { echo msg("Exiting..."); die; @@ -546,7 +510,7 @@ if ($p['thumbs']) { $tfile = $tpath."/".$fid.".jpg"; // HACK for ql-thumbnail bug - $t_skip = array("emlx"); + $t_skip = array("emlx","flac"); if (count($t_skip) && in_array($ext, $t_skip)) { echo ProgressBar::next("Skipping ".shortlabel($pathname)); continue; @@ -571,13 +535,13 @@ if ($p['thumbs']) { // first try to make a thumb with external tools $cmd = null; - if (in_array($ext, $t_files['sips'])) { + if (in_array($ext, $p['t_files']['sips'])) { //$cmd = $bin_tv." ".$shellpath." -o ".$tfile."[Q=90,optimize_coding] --size=".$p['thumb_size']; $cmd = "sips -s format jpeg -s formatOptions 80 --resampleHeightWidthMax ".$p['thumb_size']." ".$shellpath." --out ".$tfile; $stmt->BindValue(":tool","sips"); - } elseif (in_array($ext, $t_files['ffmpeg'])) { + } elseif (in_array($ext, $p['t_files']['ffmpeg'])) { //$cmd = $bin_tf." -i ".$shellpath." -o ".$tfile." -s ".$p['thumb_size']." -c jpg -q 8.5"; - $cmd = $bin_ffmpeg." -ss $(( $(".$bin_mediainfo." --Inform='Video;%Duration%' ".$shellpath.") / 10000 )) -i ".$shellpath." -vframes 1 -filter:v scale='400:-1' -q:v 3 ".$tfile; + $cmd = $bin_ffmpeg." -ss $(( $(".$bin_mediainfo." --Inform='Video;%Duration%' ".$shellpath." | cut -d'.' -f1) / 10000 )) -i ".$shellpath." -vframes 1 -filter:v scale='400:-1' -q:v 3 ".$tfile; $stmt->BindValue(":tool","ffmpeg"); } @@ -592,7 +556,8 @@ if ($p['thumbs']) { } // success, move thumb into the bundle - if (file_exists($tfile) && @filesize($tfile)) { + // ignore generic music icon thumbs (7133) + if (file_exists($tfile) && @filesize($tfile) && @filesize($tfile) != 7133) { $stmt->BindValue(":relative_path",substr($tfile, strlen($bpath))); list($width, $height) = getimagesize($tfile); $stmt->BindValue(":width",$width); @@ -622,7 +587,7 @@ if ($p['contents']) { $ext = pathinfo($pathname,PATHINFO_EXTENSION); $cpath = $bpath."/contents/".substr($fid, 0, 2); $cfile = $cpath."/".$fid.".zip"; - if (in_array($ext, $c_files)) { + if (in_array($ext, $p['c_files'])) { if (!is_dir($cpath)) { mkdir($cpath); } if (!file_exists($cfile) && filesize($pathname) < 25000) { @@ -663,12 +628,12 @@ if ($p['meta']) { $ext = pathinfo($pathname,PATHINFO_EXTENSION); $found = 1; - if (!in_array($ext, $e_files) && !in_array($ext, $m_files)) { + if (!in_array($ext, $p['e_files']) && !in_array($ext, $p['m_files'])) { echo ProgressBar::next("Not a media file: ".shortlabel($pathname)); continue; } - if (in_array($ext, $e_files)) { + if (in_array($ext, $p['e_files'])) { $check = $dbp->query("SELECT EXISTS(SELECT 1 FROM exiftool WHERE fid='".$fid."')")->fetch()[0]; if (!$check) { $arrstring = shell_exec($bin_exiftool." -php ".$shellpath); @@ -685,13 +650,14 @@ if ($p['meta']) { } } - if (in_array($ext, $m_files)) { + if (in_array($ext, $p['m_files'])) { $check = $dbp->query("SELECT EXISTS(SELECT 1 FROM mediainfo WHERE fid='".$fid."')")->fetch()[0]; if (!$check) { $stmt = $dbp->prepare("INSERT INTO mediainfo VALUES (:fid, :info)"); $stmt->BindValue(":fid",$fid); //$stmt->BindValue(":info",serialize(parseMediaInfo(shell_exec($bin_mediainfo." --Output=OLDXML ".$shellpath." 2>&1")))); - $stmt->BindValue(":info",shell_exec($bin_mediainfo." --Output=OLDXML ".$shellpath." 2>&1")); + //$stmt->BindValue(":info",shell_exec($bin_mediainfo." --Output=OLDXML ".$shellpath." 2>&1")); + $stmt->BindValue(":info",shell_exec($bin_mediainfo." --Output=JSON ".$shellpath." 2>&1")); $stmt->execute(); $found = 0; } @@ -1005,8 +971,10 @@ foreach ($files as $splFileInfo) { $yes_contents = $dbp->query("SELECT relative_path FROM contents WHERE fid='".$fid."'")->fetch()[0]; $stmt->BindValue(":contents_filename",$yes_contents); - - $fetch_thumb = $dbp->query("SELECT * FROM thumbs WHERE fid='".$fid."'")->fetch(); + + if (!in_array($extension, $t_skip)) { + $fetch_thumb = $dbp->query("SELECT * FROM thumbs WHERE fid='".$fid."'")->fetch(); + } if (@$fetch_thumb['relative_path']) { $stmt->BindValue(":thumb_filename",$fetch_thumb['relative_path']); $stmt->BindValue(":thumb_width",$fetch_thumb['width']); @@ -1137,14 +1105,18 @@ while ($row_a = $loop->fetch()) { if (isset($row_a['has_mediainfo'])) { $row_d = $dbp->query("SELECT * FROM mediainfo WHERE (rowid='".$row_a['has_mediainfo']."')")->fetch(); - $decoded = @json_decode(json_encode(simplexml_load_string($row_d['info'])),true); - $m['m'] = $decoded['File']['track'][0]; + if (substr($row_d['info'],0,5) == " \ No newline at end of file diff --git a/functions.php b/functions.php index 36e9afe..a6276dd 100755 --- a/functions.php +++ b/functions.php @@ -59,7 +59,7 @@ class ProgressBar { global $wopt_currstep; $wopt_currstep++; self::$done = 0; - return "\n"; + return "\nREFRESH\n"; } } @@ -67,17 +67,6 @@ class ProgressBar { // Functions ////////////////////////////////////////// -/* -function getParents($zpath, $pathname) { - $path = dirname($pathname); - $parts = explode("/",trim(substr($path,strlen(basename($zpath))),"/")); - foreach ($parts as $index => $part) { - $parents[] = array($part, md5($zpath."/".implode("/",array_slice($parts, 0, $index+1)))); - } - return $parents; - } -*/ - function msg($string) { global $messages_log_file; $logstring = "[".date('Y-m-d h:i:s')."] ".$string."\n"; @@ -185,7 +174,7 @@ class plistParser extends XMLReader { case 'false': return false; break; case 'array': return $this->parse_array(); break; case 'dict': return $this->parse_dict(); break; - // why the fuck cant this plist parser handle the plist generated from an hdiutil list with no dimgs attached? + // why the can't this plist parser handle the plist generated from an hdiutil list with no dimgs attached? //default: throw new Exception(sprintf("Not a valid plist. %s is not a valid type", $this->name), 4); } } diff --git a/version.txt b/version.txt new file mode 100755 index 0000000..66fc364 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +0.7.11.5 \ No newline at end of file diff --git a/web/rtc.php b/web/rtc.php index 988b31b..a4f4974 100644 --- a/web/rtc.php +++ b/web/rtc.php @@ -4,14 +4,18 @@ // Yuba RTC Browser ///////////////////////////////////////////////////////////////// -$browser_version = "0.7.10.3"; +$browser_version = "0.7.10.5"; require "togggle.php"; -require "lib/debug.php"; +require "lib/ref/ref.php"; + +ref::config('expLvl', 1); +ref::config('validHtml', TRUE); $db_dir = "data/skim"; $icon_size = 96; $pad = 40; +$overlay_exts = array("txt","php","inc","sh","md","json","cmd"); ?> @@ -22,6 +26,9 @@ $pad = 40; html { font-family: Helvetica; word-wrap: break-word; } +table.file td { width: 33%; } +table.dir td:last-of-type { width: 22%; } + div#exectime { position: absolute; right: 8px; top: 8px; } div.container { display: flex; flex-flow: row wrap; justify-content: center; } @@ -61,7 +68,11 @@ div.size { color: grey; margin-top: 3px; } img#thumb { padding: 6px; border: 1px solid gainsboro; } img#item { float: left; margin-right: 10px; width: 32px; height: 32px; } img { margin-bottom: 8px; } - +img#thumb.overlay { border: 0px !important; + padding: 6px !important; + -webkit-mask-image: url('/icons/mask.png'); + -webkit-mask-size: 100%; + outline: 1px solid black; } div.fileinfo { font-size: 12px; } div.fileinfo span.title { display: table-cell; font-weight: bold; width: 200px; } div.fileinfo span.value { display: table-cell; } @@ -76,10 +87,12 @@ div.dblist { display: none; } + +