Skip to content

Instantly share code, notes, and snippets.

@TkTech
Created June 29, 2012 03:48
Show Gist options
  • Save TkTech/3015568 to your computer and use it in GitHub Desktop.
Save TkTech/3015568 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
import json
import getopt
from jawa.core.jf import JarFile
from jawa.core.constants import ConstantClass, ConstantFieldRef
def main(argv):
try:
opts, args = getopt.gnu_getopt(argv[1:], '', [
'debug',
'bukkit='
])
except getopt.GetoptError, e:
print(str(e))
return 1
debug = False
bukkit = None
for o, a in opts:
if o == '--debug':
debug = True
elif o == '--bukkit':
bukkit = a
# You would expand this to handle either bukkit or craftbukkit.
if bukkit is None:
print('--bukkit=<path> is required.')
return 1
bukkit_jar = JarFile(bukkit)
final_results = {}
bad_classes = set()
for arg in args:
current_jar = final_results.setdefault(arg, dict())
with JarFile(arg) as jf:
for cf in jf.all_classes():
current_class = current_jar.setdefault(cf.this.name, dict())
missing_classes = current_class.setdefault(
'missing_classes', list())
missing_fields = current_class.setdefault(
'missing_fields', list())
# Find all class references, and ensure that the class
# is implemented in bukkit.
q = cf.constants.find(
ConstantClass,
f=lambda c: c.name.startswith('org/bukkit')
)
for result in q:
if '{}.class'.format(result.name) in bukkit_jar.namelist:
continue
missing_classes.append({
'name': result.name
})
bad_classes.add(result.name)
# Find all field references and ensure that they
# implemented in bukkit.
q = cf.constants.find(
ConstantFieldRef,
f=lambda f: f.class_.name.startswith('org/bukkit')
)
for result in q:
if result.class_.name in bad_classes:
missing_fields.append({
'name': result.name_and_type.name,
'why': 'Missing Bukkit Class',
'class_': result.class_.name
})
continue
bukkit_class = bukkit_jar.open_class('{}.class'.format(
result.class_.name
))
bukkit_field = bukkit_class.fields.find_one(
result.name_and_type.name
)
if not bukkit_field:
missing_fields.append({
'name': result.name_and_type.name,
'why': 'Field Not Declared',
'class_': result.class_.name
})
continue
print(json.dumps(final_results, sort_keys=True, indent=4))
if __name__ == '__main__':
sys.exit(main(sys.argv))
☁ Jawa [master] ⚡ python find.py --bukkit test/Bukkit-1.1-R5.jar test/PermissionsBukkit-1.2.jar
{
"test/PermissionsBukkit-1.2.jar": {
"com/platymuus/bukkit/permissions/BlockListener": {
"missing_classes": [
{
"name": "org/bukkit/event/block/BlockListener"
},
{
"name": "org/bukkit/util/config/Configuration"
}
],
"missing_fields": []
},
"com/platymuus/bukkit/permissions/Group": {
"missing_classes": [
{
"name": "org/bukkit/util/config/ConfigurationNode"
}
],
"missing_fields": []
},
"com/platymuus/bukkit/permissions/PermissionInfo": {
"missing_classes": [
{
"name": "org/bukkit/util/config/ConfigurationNode"
}
],
"missing_fields": []
},
"com/platymuus/bukkit/permissions/PermissionsCommand": {
"missing_classes": [
{
"name": "org/bukkit/util/config/Configuration"
},
{
"name": "org/bukkit/util/config/ConfigurationNode"
}
],
"missing_fields": []
},
"com/platymuus/bukkit/permissions/PermissionsCommand$1": {
"missing_classes": [],
"missing_fields": []
},
"com/platymuus/bukkit/permissions/PermissionsPlugin": {
"missing_classes": [
{
"name": "org/bukkit/event/Event$Type"
},
{
"name": "org/bukkit/event/Event$Priority"
},
{
"name": "org/bukkit/util/config/ConfigurationNode"
},
{
"name": "org/bukkit/util/config/Configuration"
}
],
"missing_fields": [
{
"class_": "org/bukkit/event/Event$Type",
"name": "PLAYER_JOIN",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Priority",
"name": "Lowest",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Type",
"name": "PLAYER_MOVE",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Type",
"name": "PLAYER_TELEPORT",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Type",
"name": "PLAYER_QUIT",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Priority",
"name": "Monitor",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Type",
"name": "PLAYER_KICK",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Type",
"name": "PLAYER_INTERACT",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Priority",
"name": "Normal",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Type",
"name": "BLOCK_BREAK",
"why": "Missing Bukkit Class"
},
{
"class_": "org/bukkit/event/Event$Type",
"name": "BLOCK_PLACE",
"why": "Missing Bukkit Class"
}
]
},
"com/platymuus/bukkit/permissions/PlayerListener": {
"missing_classes": [
{
"name": "org/bukkit/event/player/PlayerListener"
},
{
"name": "org/bukkit/util/config/Configuration"
}
],
"missing_fields": []
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment