From: Hans-Emil Skogh Date: Sat, 21 Jan 2012 12:22:37 +0000 (+0100) Subject: Added a permissions diff view, and a summary view of the permission category count... X-Git-Tag: 0.1~1063^2~2^2~4 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=43d1e13a4f0840bd3abef9926db91609da3f7370;p=fdroidserver.git Added a permissions diff view, and a summary view of the permission category count of an apk. --- diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 46612423..2319aa25 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -178,12 +178,20 @@ class FDroid } } - + // Generate app diff data foreach(array_reverse($apks, true) as $key=>$apk) { if(isset($previous)) { - $apks[$key]['diff']['size'] = $apk['size']-$previous['size']; + // Apk size + $apks[$key]['diff']['size'] = $apk['size']-$previous['size']; } + + // Permissions + $permissions = explode(',',$apk['permissions']); + $permissionsPrevious = isset($previous['permissions'])?explode(',',$previous['permissions']):array(); + $apks[$key]['diff']['permissions']['added'] = array_diff($permissions, $permissionsPrevious); + $apks[$key]['diff']['permissions']['removed'] = array_diff($permissionsPrevious, $permissions); + $previous = $apk; } @@ -222,6 +230,7 @@ class FDroid $out.="

Packages

"; $i=0; foreach($apks as $apk) { + $first = $i+1==count($apks); $out.="

Version ".$apk['version']."
"; $out.='download apk '; $out.=$this->human_readable_size($apk['size']); @@ -237,36 +246,67 @@ class FDroid } if(isset($apk['permissions'])) { + // Permissions diff link + if($first == false) { + $permissionsAddedCount = count($apk['diff']['permissions']['added']); + $permissionsRemovedCount = count($apk['diff']['permissions']['removed']); + $divIdDiff='permissionsDiff'.$i; + if($permissionsAddedCount || $permissionsRemovedCount) { + $out.='
permissions diff'; + $out.=' ('; + if($permissionsAddedCount) + $out.='+'.$permissionsAddedCount; + if($permissionsAddedCount && $permissionsRemovedCount) + $out.='/'; + if($permissionsRemovedCount) + $out.='-'.$permissionsRemovedCount; + $out.=')'; + } + else + { + $out.='
no permission changes'; + } + } + + // Permissions list link + $permissionsListString = $this->get_permission_list_string(explode(',',$apk['permissions']), $permissions_data, $summary); /*if($i==0) $divStyleDisplay='block'; else*/ $divStyleDisplay='none'; $divId='permissions'.$i; - $out.='
view permissions
'; + $out.='
view permissions'; + $out.=' ['.$summary.']'; + $out.='
'; + + // Permissions list $out.='

'; - $permissions = explode(',',$apk['permissions']); - usort($permissions, "permissions_cmp"); - - $permission_group_last = ''; - foreach($permissions as $permission) { - $permission_group = $permissions_data['permission'][$permission]['permissionGroup']; - if($permission_group != $permission_group_last) { - $permission_group_label = $permissions_data['permission-group'][$permission_group]['label']; - if($permission_group_label=='') $permission_group_label = 'Extra/Custom'; - $out.=''.strtoupper($permission_group_label).'
'; - $permission_group_last = $permission_group; + $out.=$permissionsListString; + $out.='
'; + + // Permissions diff + { + $out.='
'; + $permissionsRemoved = $apk['diff']['permissions']['removed']; + usort($permissionsRemoved, "permissions_cmp"); + + // Added permissions + if($permissionsAddedCount) { + $out.='
ADDED

'; + $out.=$this->get_permission_list_string($apk['diff']['permissions']['added'], $permissions_data, $summary); } - $out.=$this->get_permission_protection_level_icon($permissions_data['permission'][$permission]['protectionLevel']).' '; - $out.=''.$permissions_data['permission'][$permission]['label'].' ['.$permission.']
'; - if($permissions_data['permission'][$permission]['description']) $out.=$permissions_data['permission'][$permission]['description'].'
'; - //$out.=$permissions_data['permission'][$permission]['comment'].'
'; - $out.='
'; + // Removed permissions + if($permissionsRemovedCount) { + $out.='
REMOVED

'; + $out.=$this->get_permission_list_string($apk['diff']['permissions']['removed'], $permissions_data, $summary); + } + + $out.='
'; } - $out.=''; } else { - $out.='
no permissions
'; + $out.='
no extra permissions needed
'; } $out.='

'; @@ -281,22 +321,68 @@ class FDroid return "

Application not found

"; } - private function get_permission_protection_level_icon($protection_level) { + private function get_permission_list_string($permissions, $permissions_data, &$summary) { + $out=''; + usort($permissions, "permissions_cmp"); + $permission_group_last = ''; + foreach($permissions as $permission) { + $permission_group = $permissions_data['permission'][$permission]['permissionGroup']; + if($permission_group != $permission_group_last) { + $permission_group_label = $permissions_data['permission-group'][$permission_group]['label']; + if($permission_group_label=='') $permission_group_label = 'Extra/Custom'; + $out.=''.strtoupper($permission_group_label).'
'; + $permission_group_last = $permission_group; + } + + $out.=$this->get_permission_protection_level_icon($permissions_data['permission'][$permission]['protectionLevel']).' '; + $out.=''.$permissions_data['permission'][$permission]['label'].' ['.$permission.']
'; + if($permissions_data['permission'][$permission]['description']) $out.=$permissions_data['permission'][$permission]['description'].'
'; + //$out.=$permissions_data['permission'][$permission]['comment'].'
'; + $out.='
'; + + if(!isset($summaryCount[$permissions_data['permission'][$permission]['protectionLevel']])) + $summaryCount[$permissions_data['permission'][$permission]['protectionLevel']] = 0; + $summaryCount[$permissions_data['permission'][$permission]['protectionLevel']]++; + } + + $summary = ''; + foreach($summaryCount as $protectionLevel => $count) { + $summary .= $this->get_permission_protection_level_icon($protectionLevel, 'regular').' '.$count; + $summary .= ', '; + } + $summary = substr($summary,0,-2); + + return $out; + } + + private function get_permission_protection_level_icon($protection_level, $size='adjusted') { + $iconString = ''; if($protection_level=='dangerous') { - return ''; + $iconString .= ''; } elseif($protection_level=='normal') { - return ''; + $iconString .= ''; } else { - return ''; + $iconString .= ''; } + + return $iconString; } - + private function human_readable_size($size, $minDiv=0) { $si_prefix = array('bytes','kB','MB'); $div = 1000; - + for($i=0;(abs($size) > $div && $i < count($si_prefix)) || $i<$minDiv;$i++) { $size /= $div; }