Write new permissions to the AndroidManifest.xml

Instead of editing the placeholder permissions actually write new ones.
This should solve the privacy statement problems for the Play store.
This means we also no longer need to placeholder permissions in the
template.
This commit is contained in:
Hein-Pieter van Braam 2018-07-04 15:47:33 +02:00
parent 858d0b6887
commit 2a126242dd
2 changed files with 106 additions and 200 deletions

View file

@ -35,171 +35,6 @@ $$ADD_APPLICATION_CHUNKS$$
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" />
$$ADD_PERMISSION_CHUNKS$$ $$ADD_PERMISSION_CHUNKS$$
<uses-permission android:name="godot.ACCESS_CHECKIN_PROPERTIES"/>
<uses-permission android:name="godot.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="godot.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="godot.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="godot.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="godot.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="godot.ACCESS_SURFACE_FLINGER"/>
<uses-permission android:name="godot.ACCESS_WIFI_STATE"/>
<uses-permission android:name="godot.ACCOUNT_MANAGER"/>
<uses-permission android:name="godot.ADD_VOICEMAIL"/>
<uses-permission android:name="godot.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="godot.BATTERY_STATS"/>
<uses-permission android:name="godot.BIND_ACCESSIBILITY_SERVICE"/>
<uses-permission android:name="godot.BIND_APPWIDGET"/>
<uses-permission android:name="godot.BIND_DEVICE_ADMIN"/>
<uses-permission android:name="godot.BIND_INPUT_METHOD"/>
<uses-permission android:name="godot.BIND_NFC_SERVICE"/>
<uses-permission android:name="godot.BIND_NOTIFICATION_LISTENER_SERVICE"/>
<uses-permission android:name="godot.BIND_PRINT_SERVICE"/>
<uses-permission android:name="godot.BIND_REMOTEVIEWS"/>
<uses-permission android:name="godot.BIND_TEXT_SERVICE"/>
<uses-permission android:name="godot.BIND_VPN_SERVICE"/>
<uses-permission android:name="godot.BIND_WALLPAPER"/>
<uses-permission android:name="godot.BLUETOOTH"/>
<uses-permission android:name="godot.BLUETOOTH_ADMIN"/>
<uses-permission android:name="godot.BLUETOOTH_PRIVILEGED"/>
<uses-permission android:name="godot.BRICK"/>
<uses-permission android:name="godot.BROADCAST_PACKAGE_REMOVED"/>
<uses-permission android:name="godot.BROADCAST_SMS"/>
<uses-permission android:name="godot.BROADCAST_STICKY"/>
<uses-permission android:name="godot.BROADCAST_WAP_PUSH"/>
<uses-permission android:name="godot.CALL_PHONE"/>
<uses-permission android:name="godot.CALL_PRIVILEGED"/>
<uses-permission android:name="godot.CAMERA"/>
<uses-permission android:name="godot.CAPTURE_AUDIO_OUTPUT"/>
<uses-permission android:name="godot.CAPTURE_SECURE_VIDEO_OUTPUT"/>
<uses-permission android:name="godot.CAPTURE_VIDEO_OUTPUT"/>
<uses-permission android:name="godot.CHANGE_COMPONENT_ENABLED_STATE"/>
<uses-permission android:name="godot.CHANGE_CONFIGURATION"/>
<uses-permission android:name="godot.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="godot.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="godot.CHANGE_WIFI_STATE"/>
<uses-permission android:name="godot.CLEAR_APP_CACHE"/>
<uses-permission android:name="godot.CLEAR_APP_USER_DATA"/>
<uses-permission android:name="godot.CONTROL_LOCATION_UPDATES"/>
<uses-permission android:name="godot.DELETE_CACHE_FILES"/>
<uses-permission android:name="godot.DELETE_PACKAGES"/>
<uses-permission android:name="godot.DEVICE_POWER"/>
<uses-permission android:name="godot.DIAGNOSTIC"/>
<uses-permission android:name="godot.DISABLE_KEYGUARD"/>
<uses-permission android:name="godot.DUMP"/>
<uses-permission android:name="godot.EXPAND_STATUS_BAR"/>
<uses-permission android:name="godot.FACTORY_TEST"/>
<uses-permission android:name="godot.FLASHLIGHT"/>
<uses-permission android:name="godot.FORCE_BACK"/>
<uses-permission android:name="godot.GET_ACCOUNTS"/>
<uses-permission android:name="godot.GET_PACKAGE_SIZE"/>
<uses-permission android:name="godot.GET_TASKS"/>
<uses-permission android:name="godot.GET_TOP_ACTIVITY_INFO"/>
<uses-permission android:name="godot.GLOBAL_SEARCH"/>
<uses-permission android:name="godot.HARDWARE_TEST"/>
<uses-permission android:name="godot.INJECT_EVENTS"/>
<uses-permission android:name="godot.INSTALL_LOCATION_PROVIDER"/>
<uses-permission android:name="godot.INSTALL_PACKAGES"/>
<uses-permission android:name="godot.INSTALL_SHORTCUT"/>
<uses-permission android:name="godot.INTERNAL_SYSTEM_WINDOW"/>
<uses-permission android:name="godot.INTERNET"/>
<uses-permission android:name="godot.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="godot.LOCATION_HARDWARE"/>
<uses-permission android:name="godot.MANAGE_ACCOUNTS"/>
<uses-permission android:name="godot.MANAGE_APP_TOKENS"/>
<uses-permission android:name="godot.MANAGE_DOCUMENTS"/>
<uses-permission android:name="godot.MASTER_CLEAR"/>
<uses-permission android:name="godot.MEDIA_CONTENT_CONTROL"/>
<uses-permission android:name="godot.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="godot.MODIFY_PHONE_STATE"/>
<uses-permission android:name="godot.MOUNT_FORMAT_FILESYSTEMS"/>
<uses-permission android:name="godot.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="godot.NFC"/>
<uses-permission android:name="godot.PERSISTENT_ACTIVITY"/>
<uses-permission android:name="godot.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="godot.READ_CALENDAR"/>
<uses-permission android:name="godot.READ_CALL_LOG"/>
<uses-permission android:name="godot.READ_CONTACTS"/>
<uses-permission android:name="godot.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="godot.READ_FRAME_BUFFER"/>
<uses-permission android:name="godot.READ_HISTORY_BOOKMARKS"/>
<uses-permission android:name="godot.READ_INPUT_STATE"/>
<uses-permission android:name="godot.READ_LOGS"/>
<uses-permission android:name="godot.READ_PHONE_STATE"/>
<uses-permission android:name="godot.READ_PROFILE"/>
<uses-permission android:name="godot.READ_SMS"/>
<uses-permission android:name="godot.READ_SOCIAL_STREAM"/>
<uses-permission android:name="godot.READ_SYNC_SETTINGS"/>
<uses-permission android:name="godot.READ_SYNC_STATS"/>
<uses-permission android:name="godot.READ_USER_DICTIONARY"/>
<uses-permission android:name="godot.REBOOT"/>
<uses-permission android:name="godot.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="godot.RECEIVE_MMS"/>
<uses-permission android:name="godot.RECEIVE_SMS"/>
<uses-permission android:name="godot.RECEIVE_WAP_PUSH"/>
<uses-permission android:name="godot.RECORD_AUDIO"/>
<uses-permission android:name="godot.REORDER_TASKS"/>
<uses-permission android:name="godot.RESTART_PACKAGES"/>
<uses-permission android:name="godot.SEND_RESPOND_VIA_MESSAGE"/>
<uses-permission android:name="godot.SEND_SMS"/>
<uses-permission android:name="godot.SET_ACTIVITY_WATCHER"/>
<uses-permission android:name="godot.SET_ALARM"/>
<uses-permission android:name="godot.SET_ALWAYS_FINISH"/>
<uses-permission android:name="godot.SET_ANIMATION_SCALE"/>
<uses-permission android:name="godot.SET_DEBUG_APP"/>
<uses-permission android:name="godot.SET_ORIENTATION"/>
<uses-permission android:name="godot.SET_POINTER_SPEED"/>
<uses-permission android:name="godot.SET_PREFERRED_APPLICATIONS"/>
<uses-permission android:name="godot.SET_PROCESS_LIMIT"/>
<uses-permission android:name="godot.SET_TIME"/>
<uses-permission android:name="godot.SET_TIME_ZONE"/>
<uses-permission android:name="godot.SET_WALLPAPER"/>
<uses-permission android:name="godot.SET_WALLPAPER_HINTS"/>
<uses-permission android:name="godot.SIGNAL_PERSISTENT_PROCESSES"/>
<uses-permission android:name="godot.STATUS_BAR"/>
<uses-permission android:name="godot.SUBSCRIBED_FEEDS_READ"/>
<uses-permission android:name="godot.SUBSCRIBED_FEEDS_WRITE"/>
<uses-permission android:name="godot.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="godot.TRANSMIT_IR"/>
<uses-permission android:name="godot.UNINSTALL_SHORTCUT"/>
<uses-permission android:name="godot.UPDATE_DEVICE_STATS"/>
<uses-permission android:name="godot.USE_CREDENTIALS"/>
<uses-permission android:name="godot.USE_SIP"/>
<uses-permission android:name="godot.VIBRATE"/>
<uses-permission android:name="godot.WAKE_LOCK"/>
<uses-permission android:name="godot.WRITE_APN_SETTINGS"/>
<uses-permission android:name="godot.WRITE_CALENDAR"/>
<uses-permission android:name="godot.WRITE_CALL_LOG"/>
<uses-permission android:name="godot.WRITE_CONTACTS"/>
<uses-permission android:name="godot.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="godot.WRITE_GSERVICES"/>
<uses-permission android:name="godot.WRITE_HISTORY_BOOKMARKS"/>
<uses-permission android:name="godot.WRITE_PROFILE"/>
<uses-permission android:name="godot.WRITE_SECURE_SETTINGS"/>
<uses-permission android:name="godot.WRITE_SETTINGS"/>
<uses-permission android:name="godot.WRITE_SMS"/>
<uses-permission android:name="godot.WRITE_SOCIAL_STREAM"/>
<uses-permission android:name="godot.WRITE_SYNC_SETTINGS"/>
<uses-permission android:name="godot.WRITE_USER_DICTIONARY"/>
<uses-permission android:name="godot.custom.0"/>
<uses-permission android:name="godot.custom.1"/>
<uses-permission android:name="godot.custom.2"/>
<uses-permission android:name="godot.custom.3"/>
<uses-permission android:name="godot.custom.4"/>
<uses-permission android:name="godot.custom.5"/>
<uses-permission android:name="godot.custom.6"/>
<uses-permission android:name="godot.custom.7"/>
<uses-permission android:name="godot.custom.8"/>
<uses-permission android:name="godot.custom.9"/>
<uses-permission android:name="godot.custom.10"/>
<uses-permission android:name="godot.custom.11"/>
<uses-permission android:name="godot.custom.12"/>
<uses-permission android:name="godot.custom.13"/>
<uses-permission android:name="godot.custom.14"/>
<uses-permission android:name="godot.custom.15"/>
<uses-permission android:name="godot.custom.16"/>
<uses-permission android:name="godot.custom.17"/>
<uses-permission android:name="godot.custom.18"/>
<uses-permission android:name="godot.custom.19"/>
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="27"/> <uses-sdk android:minSdkVersion="18" android:targetSdkVersion="27"/>

View file

@ -570,7 +570,7 @@ class EditorExportAndroid : public EditorExportPlatform {
// const int CHUNK_RESOURCEIDS = 0x00080180; // const int CHUNK_RESOURCEIDS = 0x00080180;
const int CHUNK_STRINGS = 0x001C0001; const int CHUNK_STRINGS = 0x001C0001;
// const int CHUNK_XML_END_NAMESPACE = 0x00100101; // const int CHUNK_XML_END_NAMESPACE = 0x00100101;
// const int CHUNK_XML_END_TAG = 0x00100103; const int CHUNK_XML_END_TAG = 0x00100103;
// const int CHUNK_XML_START_NAMESPACE = 0x00100100; // const int CHUNK_XML_START_NAMESPACE = 0x00100100;
const int CHUNK_XML_START_TAG = 0x00100102; const int CHUNK_XML_START_TAG = 0x00100102;
// const int CHUNK_XML_TEXT = 0x00100104; // const int CHUNK_XML_TEXT = 0x00100104;
@ -601,24 +601,28 @@ class EditorExportAndroid : public EditorExportPlatform {
bool screen_support_large = p_preset->get("screen/support_large"); bool screen_support_large = p_preset->get("screen/support_large");
bool screen_support_xlarge = p_preset->get("screen/support_xlarge"); bool screen_support_xlarge = p_preset->get("screen/support_xlarge");
String user_perms[MAX_USER_PERMISSIONS]; Vector<String> perms;
for (int i = 0; i < MAX_USER_PERMISSIONS; i++) {
user_perms[i] = p_preset->get("user_permissions/" + itos(i));
}
Set<String> perms;
const char **aperms = android_perms; const char **aperms = android_perms;
while (*aperms) { while (*aperms) {
bool enabled = p_preset->get("permissions/" + String(*aperms).to_lower()); bool enabled = p_preset->get("permissions/" + String(*aperms).to_lower());
if (enabled) if (enabled)
perms.insert(String(*aperms)); perms.push_back("android.permission." + String(*aperms));
aperms++; aperms++;
} }
for (int i = 0; i < MAX_USER_PERMISSIONS; i++) {
String user_perm = p_preset->get("user_permissions/" + itos(i));
if (user_perm.strip_edges() != "" && user_perm.strip_edges() != "False")
perms.push_back(user_perm.strip_edges());
}
if (p_give_internet) {
if (perms.find("android.permission.INTERNET") == -1)
perms.push_back("android.permission.INTERNET");
}
while (ofs < (uint32_t)p_manifest.size()) { while (ofs < (uint32_t)p_manifest.size()) {
uint32_t chunk = decode_uint32(&p_manifest[ofs]); uint32_t chunk = decode_uint32(&p_manifest[ofs]);
@ -741,27 +745,6 @@ class EditorExportAndroid : public EditorExportPlatform {
print_line("version number: " + itos(decode_uint32(&p_manifest[iofs + 16]))); print_line("version number: " + itos(decode_uint32(&p_manifest[iofs + 16])));
} }
if (tname == "uses-permission" && /*nspace=="android" &&*/ attrname == "name") {
if (value.begins_with("godot.custom")) {
int which = value.get_slice(".", 2).to_int();
if (which >= 0 && which < MAX_USER_PERMISSIONS && user_perms[which].strip_edges() != "") {
string_table[attr_value] = user_perms[which].strip_edges();
}
} else if (value.begins_with("godot.")) {
String perm = value.get_slice(".", 1);
if (perms.has(perm) || (p_give_internet && perm == "INTERNET")) {
print_line("PERM: " + perm);
string_table[attr_value] = "android.permission." + perm;
}
}
}
if (tname == "supports-screens") { if (tname == "supports-screens") {
if (attrname == "smallScreens") { if (attrname == "smallScreens") {
@ -786,6 +769,91 @@ class EditorExportAndroid : public EditorExportPlatform {
} }
} break; } break;
case CHUNK_XML_END_TAG: {
int iofs = ofs + 8;
uint32_t name = decode_uint32(&p_manifest[iofs + 12]);
String tname = string_table[name];
if (tname == "manifest") {
print_line("Found manifest end");
// save manifest ending so we can restore it
Vector<uint8_t> manifest_end;
uint32_t manifest_cur_size = p_manifest.size();
uint32_t node_size = size;
manifest_end.resize(p_manifest.size() - ofs);
memcpy(manifest_end.ptrw(), &p_manifest[ofs], manifest_end.size());
int32_t attr_name_string = string_table.find("name");
ERR_EXPLAIN("Template does not have 'name' attribute");
ERR_FAIL_COND(attr_name_string == -1);
int32_t ns_android_string = string_table.find("android");
ERR_EXPLAIN("Template does not have 'android' namespace");
ERR_FAIL_COND(ns_android_string == -1);
int32_t attr_uses_permission_string = string_table.find("uses-permission");
if (attr_uses_permission_string == -1) {
string_table.push_back("uses-permission");
attr_uses_permission_string = string_table.size() - 1;
}
for (int i = 0; i < perms.size(); ++i) {
print_line("Adding permission " + perms[i]);
manifest_cur_size += 56 + 24; // node + end node
p_manifest.resize(manifest_cur_size);
// Add permission to the string pool
int32_t perm_string = string_table.find(perms[i]);
if (perm_string == -1) {
string_table.push_back(perms[i]);
perm_string = string_table.size() - 1;
}
// start tag
encode_uint16(0x102, &p_manifest[ofs]); // type
encode_uint16(16, &p_manifest[ofs + 2]); // headersize
encode_uint32(56, &p_manifest[ofs + 4]); // size
encode_uint32(0, &p_manifest[ofs + 8]); // lineno
encode_uint32(-1, &p_manifest[ofs + 12]); // comment
encode_uint32(-1, &p_manifest[ofs + 16]); // ns
encode_uint32(attr_uses_permission_string, &p_manifest[ofs + 20]); // name
encode_uint16(20, &p_manifest[ofs + 24]); // attr_start
encode_uint16(20, &p_manifest[ofs + 26]); // attr_size
encode_uint16(1, &p_manifest[ofs + 28]); // num_attrs
encode_uint16(0, &p_manifest[ofs + 30]); // id_index
encode_uint16(0, &p_manifest[ofs + 32]); // class_index
encode_uint16(0, &p_manifest[ofs + 34]); // style_index
// attribute
encode_uint32(ns_android_string, &p_manifest[ofs + 36]); // ns
encode_uint32(attr_name_string, &p_manifest[ofs + 40]); // 'name'
encode_uint32(perm_string, &p_manifest[ofs + 44]); // raw_value
encode_uint16(8, &p_manifest[ofs + 48]); // typedvalue_size
p_manifest[ofs + 50] = 0; // typedvalue_always0
p_manifest[ofs + 51] = 0x03; // typedvalue_type (string)
encode_uint32(perm_string, &p_manifest[ofs + 52]); // typedvalue reference
ofs += 56;
// end tag
encode_uint16(0x103, &p_manifest[ofs]); // type
encode_uint16(16, &p_manifest[ofs + 2]); // headersize
encode_uint32(24, &p_manifest[ofs + 4]); // size
encode_uint32(0, &p_manifest[ofs + 8]); // lineno
encode_uint32(-1, &p_manifest[ofs + 12]); // comment
encode_uint32(-1, &p_manifest[ofs + 16]); // ns
encode_uint32(attr_uses_permission_string, &p_manifest[ofs + 20]); // name
ofs += 24;
}
// copy footer back in
memcpy(&p_manifest[ofs], manifest_end.ptr(), manifest_end.size());
}
} break;
} }
ofs += size; ofs += size;
@ -806,17 +874,17 @@ class EditorExportAndroid : public EditorExportPlatform {
encode_uint32(ofs, &ret[string_table_begins + i * 4]); encode_uint32(ofs, &ret[string_table_begins + i * 4]);
ofs += string_table[i].length() * 2 + 2 + 2; ofs += string_table[i].length() * 2 + 2 + 2;
//print_line("ofs: "+itos(i)+": "+itos(ofs));
} }
ret.resize(ret.size() + ofs); ret.resize(ret.size() + ofs);
uint8_t *chars = &ret[ret.size() - ofs]; string_data_offset = ret.size() - ofs;
uint8_t *chars = &ret[string_data_offset];
for (int i = 0; i < string_table.size(); i++) { for (int i = 0; i < string_table.size(); i++) {
String s = string_table[i]; String s = string_table[i];
//print_line("savint string :"+s);
encode_uint16(s.length(), chars); encode_uint16(s.length(), chars);
chars += 2; chars += 2;
for (int j = 0; j < s.length(); j++) { //include zero? for (int j = 0; j < s.length(); j++) {
encode_uint16(s[j], chars); encode_uint16(s[j], chars);
chars += 2; chars += 2;
} }
@ -828,6 +896,7 @@ class EditorExportAndroid : public EditorExportPlatform {
ret.push_back(stable_extra[i]); ret.push_back(stable_extra[i]);
} }
//pad
while (ret.size() % 4) while (ret.size() % 4)
ret.push_back(0); ret.push_back(0);
@ -843,6 +912,8 @@ class EditorExportAndroid : public EditorExportPlatform {
encode_uint32(ret.size(), &ret[4]); //update new file size encode_uint32(ret.size(), &ret[4]); //update new file size
encode_uint32(new_stable_end - 8, &ret[12]); //update new string table size encode_uint32(new_stable_end - 8, &ret[12]); //update new string table size
encode_uint32(string_table.size(), &ret[16]); //update new number of strings
encode_uint32(string_data_offset - 8, &ret[28]); //update new string data offset
//print_line("file size: "+itos(ret.size())); //print_line("file size: "+itos(ret.size()));