diff --git a/wp-fdroid/android-permissions.php b/wp-fdroid/android-permissions.php index c1c73c61..7e1288a9 100644 --- a/wp-fdroid/android-permissions.php +++ b/wp-fdroid/android-permissions.php @@ -1,103 +1,103 @@ -load($android_manifest_file_path); - $manifestXpath = new DOMXPath($manifestDoc); - - $stringsDoc = new DOMDocument; - $stringsDoc->load($android_strings_file_path); - $stringsXpath = new DOMXPath($stringsDoc); - - $comment = ''; - foreach ($manifestXpath->query('node()') as $node) { - // Save permissions and permission groups from tags - if($node->nodeName == 'permission-group' || $node->nodeName == 'permission') { - $name = $node->attributes->getNamedItem('name')->value; - $name = substr(strrchr($name,'.'), 1); - - // Lookup the human readable title - $labelObject = $node->attributes->getNamedItem('label'); - $labelString = $name; - if( $labelObject !== NULL ) { - $labelName = substr(strrchr($labelObject->value,'/'),1); - $labelStringObject = $stringsXpath->query('//string[@name="'.$labelName.'"]'); - $labelString = ucfirst($labelStringObject->item(0)->nodeValue); - } - - // Lookup the human readable description - $descriptionObject = $node->attributes->getNamedItem('description'); - $descriptionString = '(Description missing)'; - if($descriptionObject !== NULL) { - $descriptionName = substr(strrchr($descriptionObject->value,'/'),1); - $descriptionStringObject = $stringsXpath->query('//string[@name="'.$descriptionName.'"]'); - $descriptionString = ucfirst($descriptionStringObject->item(0)->nodeValue); - } - - $permissions[$node->nodeName][$name]['label'] = stripslashes($labelString); - $permissions[$node->nodeName][$name]['description'] = stripslashes($descriptionString); - $permissions[$node->nodeName][$name]['comment'] = stripslashes(str_replace(array("\r\n", "\r", "\n", "\t", ' '), '', $comment)); - - if($node->nodeName == 'permission') { - $permissionGroupObject = $node->attributes->getNamedItem('permissionGroup'); - $permissionGroup = 'none'; - if($permissionGroupObject !== NULL) { - $permissionGroup = substr(strrchr($permissionGroupObject->value,'.'), 1); - } - - $permissions[$node->nodeName][$name]['permissionGroup'] = $permissionGroup; - $permissions[$node->nodeName][$name]['protectionLevel'] = $node->attributes->getNamedItem('protectionLevel')->value; - } - } - - // Cache descriptions from comments preceding the tags - if($node->nodeName == '#comment') { - $comment .= $node->textContent; - } - elseif($node->nodeName != '#text') { - $comment = ''; - } - } - - // Update cache with serialized permissions - $cache_file_handle = fopen($cache_file_path, 'w'); - fwrite($cache_file_handle, serialize($permissions)); - fclose($cache_file_handle); - - return $permissions; -} +load($android_manifest_file_path); + $manifestXpath = new DOMXPath($manifestDoc); + + $stringsDoc = new DOMDocument; + $stringsDoc->load($android_strings_file_path); + $stringsXpath = new DOMXPath($stringsDoc); + + $comment = ''; + foreach ($manifestXpath->query('node()') as $node) { + // Save permissions and permission groups from tags + if($node->nodeName == 'permission-group' || $node->nodeName == 'permission') { + $name = $node->attributes->getNamedItem('name')->value; + $name = substr(strrchr($name,'.'), 1); + + // Lookup the human readable title + $labelObject = $node->attributes->getNamedItem('label'); + $labelString = $name; + if( $labelObject !== NULL ) { + $labelName = substr(strrchr($labelObject->value,'/'),1); + $labelStringObject = $stringsXpath->query('//string[@name="'.$labelName.'"]'); + $labelString = ucfirst($labelStringObject->item(0)->nodeValue); + } + + // Lookup the human readable description + $descriptionObject = $node->attributes->getNamedItem('description'); + $descriptionString = '(Description missing)'; + if($descriptionObject !== NULL) { + $descriptionName = substr(strrchr($descriptionObject->value,'/'),1); + $descriptionStringObject = $stringsXpath->query('//string[@name="'.$descriptionName.'"]'); + $descriptionString = ucfirst($descriptionStringObject->item(0)->nodeValue); + } + + $permissions[$node->nodeName][$name]['label'] = stripslashes($labelString); + $permissions[$node->nodeName][$name]['description'] = stripslashes($descriptionString); + $permissions[$node->nodeName][$name]['comment'] = stripslashes(str_replace(array("\r\n", "\r", "\n", "\t", ' '), '', $comment)); + + if($node->nodeName == 'permission') { + $permissionGroupObject = $node->attributes->getNamedItem('permissionGroup'); + $permissionGroup = 'none'; + if($permissionGroupObject !== NULL) { + $permissionGroup = substr(strrchr($permissionGroupObject->value,'.'), 1); + } + + $permissions[$node->nodeName][$name]['permissionGroup'] = $permissionGroup; + $permissions[$node->nodeName][$name]['protectionLevel'] = $node->attributes->getNamedItem('protectionLevel')->value; + } + } + + // Cache descriptions from comments preceding the tags + if($node->nodeName == '#comment') { + $comment .= $node->textContent; + } + elseif($node->nodeName != '#text') { + $comment = ''; + } + } + + // Update cache with serialized permissions + $cache_file_handle = fopen($cache_file_path, 'w'); + fwrite($cache_file_handle, serialize($permissions)); + fclose($cache_file_handle); + + return $permissions; +} ?> \ No newline at end of file diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 8e073371..e3ec52d5 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -1,536 +1,536 @@ -inited=false; - $this->site_path=getenv('DOCUMENT_ROOT'); - } - - - // Register additional query variables. (Handler for the 'query_vars' filter) - function queryvars($qvars) { - $qvars[]='fdfilter'; - $qvars[]='fdid'; - $qvars[]='fdpage'; - $qvars[]='fdstyle'; - return $qvars; - } - - - // Lazy initialise. All non-trivial members should call this before doing anything else. - function lazyinit() { - if(!$this->inited) { - load_plugin_textdomain($this->textdom, PLUGINDIR.'/'.dirname(plugin_basename(__FILE__)), dirname(plugin_basename(__FILE__))); - - $this->inited=true; - } - } - - // Gets a required query parameter by name. - function getrequiredparam($name) { - global $wp_query; - if(!isset($wp_query->query_vars[$name])) - wp_die("Missing parameter ".$name,"Error"); - return $wp_query->query_vars[$name]; - } - - // Handler for the 'fdroidrepo' shortcode. - // $attribs - shortcode attributes - // $content - optional content enclosed between the starting and - // ending shortcode - // Returns the generated content. - function do_shortcode($attribs,$content=null) { - global $wp_query,$wp_rewrite; - $this->lazyinit(); - - - // Init local query vars - foreach($this->queryvars(array()) as $qv) { - if(array_key_exists($qv,$wp_query->query_vars)) { - $query_vars[$qv] = $wp_query->query_vars[$qv]; - } else { - $query_vars[$qv] = null; - } - } - - // Santiy check query vars - if(!isset($query_vars['fdpage']) || !is_numeric($query_vars['fdpage']) || $query_vars['fdpage'] <= 0) { - $query_vars['fdpage'] = 1; - } - - $out = ''; - - if(isset($attribs['search']) && $query_vars['fdfilter']===null) { - $query_vars['fdfilter'] = ''; - } - - if($query_vars['fdid']!==null) { - $out.=$this->get_app($query_vars); - } else { - if($query_vars['fdfilter'] !== null) - $out.=$this->show_search($query_vars); - - $out.=$this->get_apps($query_vars); - } - return $out; - - } - - - function get_app($query_vars) { - $permissions_data = get_android_permissions_array($this->site_path.'/repo/AndroidManifest.xml', $this->site_path.'/repo/strings.xml', $this->site_path.'/repo/android-permissions.cache'); - - $xml = simplexml_load_file($this->site_path.'/repo/index.xml'); - foreach($xml->children() as $app) { - - $attrs=$app->attributes(); - if($attrs['id']==$query_vars['fdid']) { - $apks=array();; - foreach($app->children() as $el) { - switch($el->getName()) { - case "name": - $name=$el; - break; - case "icon": - $icon=$el; - break; - case "summary": - $summary=$el; - break; - case "description": - $desc=$el; - break; - case "license": - $license=$el; - break; - case "source": - $source=$el; - break; - case "tracker": - $issues=$el; - break; - case "donate": - $donate=$el; - break; - case "web": - $web=$el; - break; - case "package": - $thisapk=array(); - foreach($el->children() as $pel) { - switch($pel->getName()) { - case "version": - $thisapk['version']=$pel; - break; - case "vercode": - $thisapk['vercode']=$pel; - break; - case "apkname": - $thisapk['apkname']=$pel; - break; - case "srcname": - $thisapk['srcname']=$pel; - break; - case "hash": - $thisapk['hash']=$pel; - break; - case "size": - $thisapk['size']=$pel; - break; - case "sdkver": - $thisapk['sdkver']=$pel; - break; - case "permissions": - $thisapk['permissions']=$pel; - break; - } - } - $apks[]=$thisapk; - - } - } - - $out='
'.$name."";
- $out.="
".$summary."
".$desc."
"; - - $out.="License: ".$license."
"; - - $out.="";
- if(strlen($web)>0)
- $out.='Website: '.$web.'
';
- if(strlen($issues)>0)
- $out.='Issue Tracker: '.$issues.'
';
- if(strlen($source)>0)
- $out.='Source Code: '.$source.'
';
- if($donate && strlen($donate)>0)
- $out.='Donate: '.$donate.'
';
- $out.="
Version ".$apk['version']."
";
- $out.='download apk ';
- $out.=$apk['size']." bytes";
- if($apk['srcname'])
- $out.='
source tarball';
-
- /*if($i==0)
- $divStyleDisplay='block';
- else*/
- $divStyleDisplay='none';
- $divId='permissions'.$i;
- $out.='
view permissions
';
- $out.='
'.$permission.']Application not found
"; - } - - private function get_permission_protection_level_icon($protection_level) { - if($protection_level=='dangerous') - { - return '⚠'; - } - elseif($protection_level=='normal') - { - return 'ⓘ'; - } - else - { - return '⚙'; - } - } - - function get_apps($query_vars) { - - $xml = simplexml_load_file($this->site_path."/repo/index.xml"); - $matches = $this->show_apps($xml,$query_vars,$numpages); - - $out=''; - - if(($query_vars['fdfilter']===null || $query_vars['fdfilter']!='') && $numpages>0) - { - $out.=''; - if($query_vars['fdpage']==1) { - $out.="<<first "; - $out.="<prev "; - } else { - $out.='<<first '; - $out.='<<prev '; - } - $out.=' Page '.$query_vars['fdpage'].' of '.$numpages.' '; - if($query_vars['fdpage']==$numpages) { - $out.="next> "; - $out.="last>> "; - } else { - $out.='next> '; - $out.='last>> '; - } - $out.='
'; - } else if($query_vars['fdfilter']!='') { - $out.='No matches
'; - } - - return $out; - } - - - function show_search($query_vars) { - - $out=''; - $out.=''."\n"; - - return $out; - } - - - function show_apps($xml,$query_vars,&$numpages) { - - $skipped=0; - $got=0; - $total=0; - - if($query_vars['fdstyle']=='grid') { - $outputter = new FDOutGrid(); - } else { - $outputter = new FDOutList(); - } - - $out = ""; - - $out.=$outputter->outputStart(); - - foreach($xml->children() as $app) { - - if($app->getName() == 'repo') continue; - $appinfo['attrs']=$app->attributes(); - $appinfo['id']=$appinfo['attrs']['id']; - foreach($app->children() as $el) { - switch($el->getName()) { - case "name": - $appinfo['name']=$el; - break; - case "icon": - $appinfo['icon']=$el; - break; - case "summary": - $appinfo['summary']=$el; - break; - case "license": - $appinfo['license']=$el; - break; - } - } - - if($query_vars['fdfilter']===null || $query_vars['fdfilter']!='' && (stristr($appinfo['name'],$query_vars['fdfilter']) || stristr($appinfo['summary'],$query_vars['fdfilter']))) { - if($skipped<($query_vars['fdpage']-1)*$outputter->perpage) { - $skipped++; - } else if($got<$outputter->perpage) { - $out.=$outputter->outputEntry($query_vars, $appinfo); - $got++; - } - $total++; - } - - } - - $out.=$outputter->outputEnd(); - - $numpages = ceil((float)$total/$outputter->perpage); - - return $out; - } -} - -// Class to output app entries in a detailed list format -class FDOutList -{ - var $perpage=30; - - function FDOutList() { - } - - function outputStart() { - return ''; - } - - function outputEntry($query_vars, $appinfo) { - $out=""; - $out.="Details...'; - $out.="
"; - $out.="'.$appinfo['name']."";
- $out.="
".$appinfo['summary']."
| ';
- $out.=' '; - $out.=' ';
-
- $out.='';
- $out.=' ";
- $out.='';
- $out.="'; - $out.=$appinfo['name'].' '; - $out.=''; - - $out.=" | \n";
-
- $this->itemCount++;
- return $out;
- }
-
- function outputEnd() {
- return '
'.$name."";
+ $out.="
".$summary."
".$desc."
"; + + $out.="License: ".$license."
"; + + $out.="";
+ if(strlen($web)>0)
+ $out.='Website: '.$web.'
';
+ if(strlen($issues)>0)
+ $out.='Issue Tracker: '.$issues.'
';
+ if(strlen($source)>0)
+ $out.='Source Code: '.$source.'
';
+ if($donate && strlen($donate)>0)
+ $out.='Donate: '.$donate.'
';
+ $out.="
Version ".$apk['version']."
";
+ $out.='download apk ';
+ $out.=$apk['size']." bytes";
+ if($apk['srcname'])
+ $out.='
source tarball';
+
+ /*if($i==0)
+ $divStyleDisplay='block';
+ else*/
+ $divStyleDisplay='none';
+ $divId='permissions'.$i;
+ $out.='
view permissions
';
+ $out.='
'.$permission.']Application not found
"; + } + + private function get_permission_protection_level_icon($protection_level) { + if($protection_level=='dangerous') + { + return '⚠'; + } + elseif($protection_level=='normal') + { + return 'ⓘ'; + } + else + { + return '⚙'; + } + } + + function get_apps($query_vars) { + + $xml = simplexml_load_file($this->site_path."/repo/index.xml"); + $matches = $this->show_apps($xml,$query_vars,$numpages); + + $out=''; + + if(($query_vars['fdfilter']===null || $query_vars['fdfilter']!='') && $numpages>0) + { + $out.=''; + if($query_vars['fdpage']==1) { + $out.="<<first "; + $out.="<prev "; + } else { + $out.='<<first '; + $out.='<<prev '; + } + $out.=' Page '.$query_vars['fdpage'].' of '.$numpages.' '; + if($query_vars['fdpage']==$numpages) { + $out.="next> "; + $out.="last>> "; + } else { + $out.='next> '; + $out.='last>> '; + } + $out.='
'; + } else if($query_vars['fdfilter']!='') { + $out.='No matches
'; + } + + return $out; + } + + + function show_search($query_vars) { + + $out=''; + $out.=''."\n"; + + return $out; + } + + + function show_apps($xml,$query_vars,&$numpages) { + + $skipped=0; + $got=0; + $total=0; + + if($query_vars['fdstyle']=='grid') { + $outputter = new FDOutGrid(); + } else { + $outputter = new FDOutList(); + } + + $out = ""; + + $out.=$outputter->outputStart(); + + foreach($xml->children() as $app) { + + if($app->getName() == 'repo') continue; + $appinfo['attrs']=$app->attributes(); + $appinfo['id']=$appinfo['attrs']['id']; + foreach($app->children() as $el) { + switch($el->getName()) { + case "name": + $appinfo['name']=$el; + break; + case "icon": + $appinfo['icon']=$el; + break; + case "summary": + $appinfo['summary']=$el; + break; + case "license": + $appinfo['license']=$el; + break; + } + } + + if($query_vars['fdfilter']===null || $query_vars['fdfilter']!='' && (stristr($appinfo['name'],$query_vars['fdfilter']) || stristr($appinfo['summary'],$query_vars['fdfilter']))) { + if($skipped<($query_vars['fdpage']-1)*$outputter->perpage) { + $skipped++; + } else if($got<$outputter->perpage) { + $out.=$outputter->outputEntry($query_vars, $appinfo); + $got++; + } + $total++; + } + + } + + $out.=$outputter->outputEnd(); + + $numpages = ceil((float)$total/$outputter->perpage); + + return $out; + } +} + +// Class to output app entries in a detailed list format +class FDOutList +{ + var $perpage=30; + + function FDOutList() { + } + + function outputStart() { + return ''; + } + + function outputEntry($query_vars, $appinfo) { + $out=""; + $out.="Details...'; + $out.="
"; + $out.="'.$appinfo['name']."";
+ $out.="
".$appinfo['summary']."
| ';
+ $out.=' '; + $out.=' ';
+
+ $out.='';
+ $out.=' ";
+ $out.='';
+ $out.="'; + $out.=$appinfo['name'].' '; + $out.=''; + + $out.=" | \n";
+
+ $this->itemCount++;
+ return $out;
+ }
+
+ function outputEnd() {
+ return '