<<

Preliminary analysis of an Android application connected to the Fediverse

UC3ADF101 Assessment 2 - Part 3

Mathias Brandal Vagnes

December 22nd 2019

1 Contents

Abstract 5

Keywords 5

1 Methodology modifications 6

2 Results 6 2.1 Files and folders ...... 6 2.1.1 Application folder structure ...... 6 2.1.2 Files ...... 7 2.2 Databases ...... 8 2.3 Cached data ...... 8 2.3.1 Images ...... 8 2.3.2 HTTP data ...... 9 2.4 Shared preferences ...... 9

3 Discussion 9 3.1 Databases ...... 9 3.2 Logs ...... 11 3.3 Potential attack vectors ...... 12 3.4 Evidence of user activity ...... 12 3.4.1 Logs ...... 12 3.4.2 Databases ...... 13

4 Conclusion 13

References 15

Appendices 16 Appendix A ...... 16 Appendix B ...... 21 Appendix C ...... 28 Appendix D ...... 29 Appendix E ...... 31

2 List of Figures 1 ASCII representation of the ”/data/data/fr.gouv.etalab.” folder . . .7 2 ASCII representation of the ”shared prefs” folder ...... 9 3 Source code of Fedilab showing column visibility logic (Fedilab, 2019) . . . . . 10 4 Screenshot of virtualised Android device showing backup related settings . . . 10 5 Graph showing time on the x-axis and amount of entries to the TIMELINE CACHE table on the y-axis ...... 11 6 Example of one log entry describing the interaction between Fedilab and a picture ...... 11 7 Screenshot of Device File Explorer in Android Studio ...... 11 8 Example of two log entry showing the user switching from the Fedilab appli- cation to the home screen ...... 13

3 Glossary

ADB Android Debugging Bridge. 13

4 Abstract

With a solid foundation in the realm of digital forensics relating to the Android OS platform, there is no lack of general information on the most prolific applications. However, with the increasing popularity of applications that use novel methods for communication, such as applications using federated services, there is a demand for an understanding of how these store data. Different from many commercial services which utilise a user’s data for profit, services on the ”Fediverse” pride themselves in respecting users’ privacy and rights while at the same time offering an accessible for everyone. Because of the public’s recent wake-up call regarding issues of privacy and security, it is not unexpected that such services are bound to become more prolific in the near future. Still, applications need their data to work, and such can be locally stored on the device itself. Hence, a look into how such applications store data locally to investigate what could potentially be either compromised or retrieved, depending on one’s perspective, can prove fruitful to both the scientific discussion on digital security and to the public. In this analysis, gathered data generated from the popular application ”Fedilab” will be used to show the forensic potential of the application. After a general overview of the results, the significance of these findings is going to be demonstrated. The feasibility of getting an overview of a user’s activity will be in focus. Prepositions on how to gather additional remote data through potential exploits in the nature of the application’s authentication methods will also be discussed. Finally, the findings will be used to propose matters that could benefit from further research and investigations.

Keywords

Android, mobile, forensics, application, Fediverse, federated, Fedilab, Mastodon, Activity- Pub

5 1 Methodology modifications

The following changes have been made to the methodology.

While thoroughly attempted, after careful consideration, volatile memory analysis was set aside. Compared to the data that was found logically, and the type of data that was expected to be found, one may argue that the overall yield of data would not be any different. Indeed, as stated in the original methodology:

”(...) one may argue that memory analysis is not of the utmost importance in the case of analysing Fedilab and that one should at least primarily focus and expand upon the knowledge from the low hanging fruit first”.

All this considered, the main focus was therefore pivoted to investigate data of higher priority, such as databases and cached data.

Life cycle analysis was also deprioritised as the Snapshot utility within Android Studio did not work for unexpected reasons.

2 Results

2.1 Files and folders

By utilising the Device File Explorer within Android Studio, contents of the virtualised device may be accessed as well as exported for further analysis. Both the number of files and folders changed throughout the investigation process, which will be discussed in relation to evidence of user activity in section 3.4.

2.1.1 Application folder structure

One may get a visual overview of the folder structure, not including the actual files, by running the tree command on the root folder. The output may be seen in figure 1. In total there are 27 directories.

6 (ROOT) |-- app_textures |-- app_webview | |-- GPUCache | | ‘-- index-dir | ‘-- blob_storage | ‘-- 4822ba0b-f34e-403a-bcba-919d4350dec4 |-- cache | |-- WebView | | |-- Crash Reports | | |-- Crashpad | | | |-- attachments | | | |-- completed | | | |-- new | | | ‘-- pending | | ‘-- SafeBrowsing | |-- compress | |-- image_manager_disk_cache | ‘-- org.chromium.android_webview | |-- Code Cache | | ‘-- js | | ‘-- index-dir | ‘-- index-dir |-- code_cache |-- databases |-- lldb | ‘-- bin ‘-- shared_prefs

Figure 1: ASCII representation of the ”/data/data/fr.gouv.etalab.mastodon” folder

2.1.2 Files

In total there are 208 files, at the time of capture. The complete view of all the files may be found in Appendix A. Out of these 208 files, over 160 of them were images, primarily located in the cache/image_manager_disk_cache folder. Also related to cached data was the plethora of various cached HTTP request data. This will be demonstrated in section 2.3.

7 2.2 Databases

In total, four databases were found. The databases which contained any data were evernote_jobs.db and mastodon_etalab_db. These databases can be found in Appendix B and Appendix C, respectively. Two files with the names evernote_jobs.db-journal and mastodon_etalab_db-journal were also found. These are technically not databases, but they act as temporary storage places for the previously mentioned SQLite databases. De- pending on when these temporary files were analysed, they contained variable amounts of information.

Located in the app_webview folder were two databases, namely cookies and Web Data that was related to the stripped-down browser called WebView (Google Developers, 2019b).

ID KEYWORDS USER ID ANY TAG ALL TAG NONE TAG NAME IS ART IS NSFW DATE CREATION 1 witcher 925267 0 0 2019-12-22 02:20:54

Table 1: SHARED table of mastodon etalab db

Some tables also include cached data, for example, messages and data related to these mes- sages. This data was structured as JSON, contained within a cell. An example of such cached data can be seen in Appendix D with personal information redacted. Data such as account name, avatar image, number of followers and emojis are just some of the field that can be regarded as valuable data. Many of these fields are URLs that merely reference where this data may be found.

Other tables, like the SHARED table as seen in table 1, can show clear signs of user activity. Not only can what has been searched for finding, but also when and from which account the search has been done from (Fedilab supports multiple accounts simultaneously).

Upon every startup of the application, the databases mastodon_etalab_db and mastodon_etalab_db-journal are updated. While the latter is persistently empty, the former is updated mainly in terms of timestamps.

2.3 Cached data

2.3.1 Images

Cached images from other users could be retrieved from the cache/image_manager_disk_cache folder. While the file extension is .0 for the cached images, they are all encoded as jpg files. A simple file extension substitution allows for the cached images to be read.

Images that were previously shared through the Fedilab application could still be retrieved from the cache folder.

8 2.3.2 HTTP data

Cached HTTP data were also found, which is a standard feature of WebView (Google De- velopers, 2019a). While the data is for the most part not human readable, there are some parts that are. An example of the human-readable part of one of these cached requests may be viewed in Appendix E.

2.4 Shared preferences

|- shared_prefs |-- BubbleShowCasePrefs.xml |-- LocaleChanger.LocalePersistence.xml |-- WebViewChromiumPrefs.xml |-- app_prefs.xml |-- evernote_jobs.xml ‘-- fr.gouv.etalab.mastodon_preferences.xml

Figure 2: ASCII representation of the ”shared prefs” folder

3 Discussion

3.1 Databases

One of the most high-yield sources of forensically interesting and relevant data was the databases. As this data highly structured in a widely used format (SQLite), it should be very easy to further process this data with either existing tools or create novel ones, as most programming languages have this format supported through additional libraries.

It is to be expected that Fedilab employs the strategy of storing messages and status updates in a database, as such is very common practice in other applications with similar function. For example, KakaoTalk (a popular messaging service in South Korea) store messages from both encrypted/secret and unencrypted chats using databases (Gandeva B Satrya, Daely, & Shin, 2016). The same technique for storing messages can be also observed in the chat applications Telegram and Line.

From inspecting the code of the Fedilab application (Fedilab, 2019), one may see what kind of statuses and messages are supposed to be stored in the database. However, despite the various ways attempted to make private statuses so be cached to the database, these were still not found. Further analysis is required to pinpoint why this is and if such is intended behaviour. One may indeed see from the source code, as shown in figure 3 that the columns that are supposed to store different classification of messages (direct, private, public and unlisted) should exist under certain conditions.

9 if (!filterToots.isV_direct()) selection.append(" AND " + Sqlite.COL_VISIBILITY + " <> ’direct’"); if (!filterToots.isV_private()) selection.append(" AND " + Sqlite.COL_VISIBILITY + " <> ’private’"); if (!filterToots.isV_public()) selection.append(" AND " + Sqlite.COL_VISIBILITY + " <> ’public’"); if (!filterToots.isV_unlisted()) selection.append(" AND " + Sqlite.COL_VISIBILITY + " <> ’unlisted’");

Figure 3: Source code of Fedilab showing column visibility logic (Fedilab, 2019)

Other variables that can also change the outcome on whether messages and statuses are stored in the databases are the settings related to backup and cache, as can be seen in figure 4. From testing with a variation of these settings toggled either on or off, it was determined that the number of messages and status updates that were saved in the database was highly variable, but the primary variable for how much was stored in the database was used.

Figure 4: Screenshot of virtualised Android device showing backup related settings

A very interesting detail that was discovered is that messages and statuses are saved in bulk, as can be seen in figure 5 which shows the TIMELINE_CACHE table in the mastodon_etalab_db database, where the timestamps were correlated with the addition of entries.

10 Figure 5: Graph showing time on the x-axis and amount of entries to the TIMELINE CACHE table on the y-axis

3.2 Logs

While collecting and processing logs were fairly trivial (albeit labour intensive), the amount of both relevant and novel information gathered from these logs were relatively low. Most of the data that could be considered valuable were already represented through other means. An example of this is in the scenario where an image is shared through the application. While one may see this happening in the logs, as is shown in figure 6, such information can also be found in the Device File Explorer in Android Studio, as shown in figure 7. Hence, at least for the purposes of the investigation of the Fedilab application, logs were deemed mostly complementary, if not merely redundant, for most purposes. However, there is a case to be made in relation to user activity which will be illustrated in 3.4.

11-30 17:25:38.210 3368 3368 D PhotoEditor: Image : /data/user/0/fr.gouv.etalab.mastodon/cache/ 1575131138205 2327FloydSteinberg.png

Figure 6: Example of one log entry describing the interaction between Fedilab and a picture

Figure 7: Screenshot of Device File Explorer in Android Studio

11 3.3 Potential attack vectors

If an examiner cannot retrieve sufficient information from the data locally on the device itself, some information present on the device can open doors to explore data stored remotely. In the case of Fedilab, one may attempt to use the app ID/secret stored in the app\_prefs.xml file in the shared\_prefs folder to authenticate with an OAuth endpoint (Wang et al., 2015). OAuth is a widely utilised authorisation protocol used to get access to HTTP services (Chen et al., 2014). Similarly, one may also retrieve authentication data from the WebView (such as, but not limited to cookies) to connect to endpoints to retrieve additional remote data. Of course, such is only necessary if data cannot be gathered through the utilisation of the Fedilab application itself, which would arguably not only be easier but also much quicker. However, in the scenario that such cannot be done, using exploits such as the ones mentioned, may result invaluable information.

3.4 Evidence of user activity

3.4.1 Logs

Despite the redundant nature of logs, there is a case to be made for evidence of user activity. In figure 8, one may observe the log entries resulting from a user opening the Fedilab applica- tion and then going back to the home screen. Such information can be valuable information in the mission of correlating actions and creating a timeline of events. While the log entries rarely express much information in relation to what has been done within the app, with some exceptions, such as in figure 6, the supplementary information that log entries result in tying the actions of a timeline together. Using log files to enhance the accuracy of a timeline is a common forensic practice (Gandeva Bayu Satrya, Daely, & Nugroho, 2016). However, it is important to note that such log entries may not be supported by the tool of choice for a forensic examiner, and hence would prove of very little direct value to an investigation. Indeed, while the collection of log entries and analysis of these are potentially important in any investigation, log systems (such as logcat in this case) are not inherently designed to specifically support forensic examinations (Herrerias & Gomez, 2007; Sandler, Derr, Crosby, & Wallach, 2008; Takahashi & Xiao, 2008).

12 2019-12-20 11:37:34.374 2086-7612/system_process I/ActivityTaskManager: START u0{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=fr.gouv.etalab.mastodon/ app.fedilab.android.activities.MainActivity.Bubbles bnds=[316,673][585,1010]} from uid 10104

2019-12-20 11:37:43.100 2086-2106/system_process I/ActivityTaskManager: START u0{act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.google.android.apps.nexuslauncher/.NexusLauncherActivity (has extras)} from uid 0

Figure 8: Example of two log entry showing the user switching from the Fedilab application to the home screen

3.4.2 Databases

As described in section 3.1, there is a clear correlation between user activity and the addition of entries to the database, albeit potentially unpredictable. As entries in the database are deployed in bulk, as can be seen in figure 5, it is possible to hypothesise on when a user may have seen or scrolled past a post using Fedilab.

Similarly, as both saved tags and search terms are stored within the database, it can also be possible to derive both a timeline and potentially also intent. Several other tables in the databases have information that can be utilised in a similar way. There is even a table for one’s position on the timeline within the Fedilab application. Therefore, such information may be very valuable in terms of proving user activity.

4 Conclusion

During this paper, it has been demonstrated that a range of diverse data may be collected from an Android device, even though the use of simple tools that are not primarily intended to be forensic tools, such as ADB and Android Studio. Information that could be forensically valuable is often found in places that are deemed as default within the developer community, such as databases and cached data, especially in relation to WebView.

In a field which experiences a lot of growth such as the field of , it is important that forensic investigators are following along at a steady pace. While many applications may use similar methods of storing their data, as discussed, each application has its unique quirks and ways. There are many other applications (as well as mobile platforms) that are

13 also using the Fediverse to communicate and therefore warrant future case studies into these applications.

14 References

Chen, E. Y., Pei, Y., Chen, S., Tian, Y., Kotcher, R., & Tague, P. (2014). Oauth demystified for mobile application developers. In Proceedings of the 2014 acm sigsac conference on computer and communications security (pp. 892–903). ACM. Fedilab. (2019). Statuscachedao.java. Retrieved from https://framagit.org/tom79/fedilab/ blob/develop/app/src/main/java/app/fedilab/android/sqlite/StatusCacheDAO.java Google Developers. (2019a). Httpresponsecache. Retrieved from https://developer.android. com/reference/android/net/http/HttpResponseCache Google Developers. (2019b). Webview. Retrieved from https : / / developer . android . com / reference/android/webkit/WebView Herrerias, J., & Gomez, R. (2007). A log correlation model to support the evidence search process in a forensic investigation. In Second international workshop on systematic approaches to digital forensic engineering (sadfe’07) (pp. 31–42). IEEE. Sandler, D., Derr, K., Crosby, S., & Wallach, D. S. (2008). Finding the evidence in tamper- evident logs. In 2008 third international workshop on systematic approaches to digital forensic engineering (pp. 69–75). IEEE. Satrya, G. B. [Gandeva B], Daely, P. T., & Shin, S. Y. (2016). Android forensics analysis: Private chat on social messenger. In 2016 eighth international conference on ubiquitous and future networks (icufn) (pp. 430–435). IEEE. Satrya, G. B. [Gandeva Bayu], Daely, P. T., & Nugroho, M. A. (2016). Digital forensic analysis of telegram messenger on android devices. In 2016 international conference on information & communication technology and systems (icts) (pp. 1–7). IEEE. Takahashi, D., & Xiao, Y. (2008). Retrieving knowledge from auditing log-files for computer and network forensics and accountability. Security and Communication Networks, 1 (2), 147–160. Wang, H., Zhang, Y., Li, J., Liu, H., Yang, W., Li, B., & Gu, D. (2015). Vulnerability assessment of oauth implementations in android applications. In Proceedings of the 31st annual computer security applications conference (pp. 61–70). ACM.

15 Appendices

Appendix A

. |-- app_textures |-- app_webview | |-- Cookies | |-- Cookies-journal | |-- GPUCache | | |-- index | | ‘-- index-dir | | ‘-- the-real-index | |-- Web Data | |-- Web Data-journal | |-- blob_storage | | ‘-- 4822ba0b-f34e-403a-bcba-919d4350dec4 | |-- metrics_guid | |-- pref_store | |-- variations_seed_new | |-- variations_stamp | ‘-- webview_data.lock |-- cache | |-- 1575131138205_2327FloydSteinberg.png | |-- WebView | | |-- Crash Reports | | |-- Crashpad | | | |-- attachments | | | |-- completed | | | |-- new | | | |-- pending | | | ‘-- settings.dat | | ‘-- SafeBrowsing | |-- compress | |-- image_manager_disk_cache | | |-- 0051fc00b199c9a2a883cb34963d5d78c6c7a68b8fb38257385984555a508368.0 | | |-- 01f921934b5350a812275e248cfb72bc290f2f732d5894b05a25b59305c5b61b.0 | | |-- 0358af5902e68b7ef7c5d800e3eaf0966d929e3e8a0dce96619d95813ccdebf5.0 | | |-- 0453726081867dce9d47b5184fdab8dc4cfabf9a030dae975ead078f31344ae8.0 | | |-- 0566f9fefc9f6dc38900d8aedd97409e9699d4832e3e43c7d5ac3bf6bc38f3b1.0 | | |-- 05b99fbc8be76684dcc91c5d910cbf941826df5a2f7bb1ee29340eb893304bad.0

16 | | |-- 06de268d0a6b62fcc8dbf3b98e6d2c39a41d1d535d6dd0f73674e7e54ba07dc1.0 | | |-- 09b4ed3440259f293cb306988c93d49136af651025fb1f0f3123eea4e8023c24.0 | | |-- 0adade754c1e5579db3ec4e2a2c4cb15abf2d9024a1dd2642475ef3e87b7d8d3.0 | | |-- 0bdbafc159422e71b1192ddb51c84cf36ac54a301b480dcb3d9c6c2432528562.0 | | |-- 0ca7fb7c097d7f3572b9f30f7c6872ceae1f1dd95539913875529c0f9dcc0d1c.0 | | |-- 118a34c2d880122fed654e4ad5c7b068a980bd3884e998183ab2f079b3d8eced.0 | | |-- 12fa5cb0c75608e6286298bcc83298ae3d86dd10619839cc5dc15616640efe24.0 | | |-- 13c6865b60f7df261bfeb671f7f02445c7f6edb050158a013228853b9c461297.0 | | |-- 15379c41d3d83508a7782b8cdea5d15c137844406a5736b8a57c6b2d0a402877.0 | | |-- 15dc3e89e864109ec8699eb2676ed1a93d92e45077803c021e4109a2633695fb.0 | | |-- 16c9f612e70020bb9a3a65cf319f6d8b0a420393266e65d43091d5c2a9339e25.0 | | |-- 17ba35a8c2f2ebef70fb51f2422984aa42c0c44438138a06557363283288e764.0 | | |-- 1a5b0fdf9121d02106939e4c2daf33eec493df35de1cd25d13540b43c8f15ac7.0 | | |-- 1bd2225f370b0e6b994bed33135c514d69dd5b21c1321a5c02e58b92982b10dc.0 | | |-- 1cce5eb4adaa9da4beeee48bd91572d61e1660bded90db87c80c33dda9cbc07f.0 | | |-- 1d5b9c2db909e45434b58c2f26faaad0159cc709fa72a8d75b8c056b4da43064.0 | | |-- 1e78ac0733396f04a8c484853f7f36212bd4047adccce1d0d251f6f3c127e166.0 | | |-- 1edf39dc750db37072a537c47be6e24aac9ddc6e09825a87c67462398c286a9f.0 | | |-- 208b15200c916511c0c8cf30748d5c31096ee4cbb61751ef3f5050daa474ba3d.0 | | |-- 211c09a210e3e0b39d1db9e2a46f4feccf588cbf1080c7ea4c9d2b701ec6db87.0 | | |-- 2138a13544c97a114a1ffd98ab1d22e03982442f6dbcbbe5777c667b9e0bff4c.0 | | |-- 24ab2dc89015ac44441abede0091fae1ac580c0c1de531c1a41b267a6b614fdf.0 | | |-- 2601f66343f92e0870dd9601368d68bcb1836890b094b658d6a1c78425caa8f8.0 | | |-- 272d8ec091b566102a7ee7f2eeeb9917b2b09597ba1252200794c6aa4889dc98.0 | | |-- 29fbd77bd760aef2f94fa40dd122f061da472f9548093761ef9a31b3d48d54b8.0 | | |-- 2c7883993d3b55d136d8b38358937ad50648f5f414b4d0112c7bfe1a587bfd3b.0 | | |-- 30419be761f3d6a79947ea284f6054458f9984e64ce38dbdcc207162975bd966.0 | | |-- 343285bbbc47f175b550176e02cf0b4f4b9ec7a33d9e016457e9efe0f96b161e.0 | | |-- 344e0470df4c7054d4b79dc074fd95dc82c919a5f4dfd5c21af0a55f29e18f28.0 | | |-- 3780f3b5f77128650993d4ea0158259f03bbeb79909b8f93da5c845b4ce2eac8.0 | | |-- 3a2c8344f23c489a381c9758db6ec48e6e3f14cc330399a8353075dd0a974c6d.0 | | |-- 3aa613515c466d8ea3f9fb22037c566feb5446f64d23a96f01a8b3fe743f203d.0 | | |-- 3b1020d0f291372fb2c04713702de47eab702dd005ec3800df86436e0bcbdf5d.0 | | |-- 3cea59e2c8d885233280047dda2c7e0465441a0be21a59d3cf7444b2a0be5403.0 | | |-- 3fa594f0138b3591c93403d9f1ab50fd1d69b7eb2b44e63258c100e1367b9df4.0 | | |-- 3fabc6cd12e07e6ce7f22b5a930aa4b81da32a2319a1fa083e85fd075f5b7cee.0 | | |-- 3fd54ed44cc00aeacc204cdaf38435f1c8514554f38454f979270080bb417e3c.0 | | |-- 40428b56f2cc81a29204e4f8553404421b8370b9ad743b7447cf600c724f1af9.0 | | |-- 4094dd9418774ee1cda538175664774f4192f2f2749c54a679f9cacfb6e7f25f.0 | | |-- 4283878c4d61dd7befb1e6c7977cf63bc7d30ab8feaa91dec02d4010355a18ee.0 | | |-- 44c16b7801f3d9174ce97db6b8610784c168482da83fd01cad170fda94193474.0

17 | | |-- 48be579862c7fffc4c79f48370271ecd2329d60ae65089a3c91a197ebe9bfd22.0 | | |-- 4b994fd5293d57c592df4d88508f82f3388e276c804d21e9f00e84966a0896bc.0 | | |-- 4bbacdd9f86bd4e60ad95e964a025e17431661afa77ef980e267e95e6db54789.0 | | |-- 4db4ecad632997cc1d3b0dacc8f309768f56160d508f6afd5db8ce73c3cfdf59.0 | | |-- 4f0ecda348cd32db1e43faefd31a2d872802bb33cfa7da11c8374ba76566dc6f.0 | | |-- 51570d2a1a29812b638f22c1a4975d704265e087b20ca4478319b59c3689b802.0 | | |-- 55011fd5336627008abbda5d7c958a2e71b92df9fd1abf02c7d9e2e857f8929b.0 | | |-- 55806d90a30ef51b54cdb1dbc6469311498a9037d89f0e9fcc64e10b75092680.0 | | |-- 560768f16e1f3a9d5fc7529e171a06031aedd7d11b484806c934f80531ccb5d1.0 | | |-- 57786095d319c08de10a565004390898439b81a0dd29afbb7a0312bed6f71330.0 | | |-- 57b4536f3ab950db01326df2069118b9a07aecec544cc07b80a6ac9445d3cb4b.0 | | |-- 58a9cc59e12c86c47c2b49d9e7714cf16a5c8d418f8451172c18be9994253272.0 | | |-- 59a89b4960709d1212d30eb0d7b3d15176dde1c93e953c1d0cb48d4b3efe8d19.0 | | |-- 59dcd71d3d2ff6d209bfc6bba1c64ee83f0c6958239761a532a211438b8bb4a9.0 | | |-- 5a8d4bebef70f012a2caa2fb611b154d9894e71e9fc4e46e0bbf987614df52f0.0 | | |-- 5fe233cb4c237204a0413d74e6537070121fecaa413413136b98702e0c4b1d1b.0 | | |-- 601bc44c819e143c53290ab68d172c0088577de77ee24ea9ef3ef46220fdbf6f.0 | | |-- 60b947043510958e9e77d6a973b66e8642d979f868a9f487b630bbdf086eb3b3.0 | | |-- 60dba11361e6837087670f2ab9c1c810db7444bdd9401ce5da031b3de9ce876a.0 | | |-- 639ae0efc080229e5121a5cb89b0b2d50d81630db38fb2768fec51f146880a6d.0 | | |-- 68b8395c007e3d9fc9c2fb058cefe20911683cb5aee5ecfd72e744e833f44bea.0 | | |-- 69b5e0f83bdd2731ec04b53f1d3eda4bcc952b00eeef8a9502ec75c6851f2cd7.0 | | |-- 69ec67d3917b6697519a8cd75dc71d806f7e4b69a958ad41ec9c119ddc8edc14.0 | | |-- 6a7b18174c3c3bfba2ac8ba05ade611fa726f1060cb46f4f66c887560bab206d.0 | | |-- 6ab52f3c35cf3d4f2ae70abcc6673576bbb8c219cf421af190c9de052c9a1e2e.0 | | |-- 6d8ca50562a9fa5a67e7510626a9630f584ae91247bdbfeefc61bbf9964446d3.0 | | |-- 7212f55d05ad6e865e132c608bd123f7a644d233f13468a0ab69efabb6710a15.0 | | |-- 732db75e4885540958d8659838fdf15623225b253a5263bcb5ba36b6ad411774.0 | | |-- 753adeb8a4af4910b673d7e6ecf1ac852cb5d1c5291f8362c8c9a5bc37b43e6b.0 | | |-- 75cb7c262a62bd87926a3b83bbd303a15b056722deec88ff7ea5f01d478a265d.0 | | |-- 77d885c8a9f88f34c72cfb09f09a678228ba40697f46972f8fb34b3786ccf45a.0 | | |-- 7a4c8588408373f31e80a7936875504cd9e1f111a08a7fc098cd9f78246ad77a.0 | | |-- 7eed538bec881e969a859c1f5fc774708967d5f6152f7aeb73c57963563ea1c2.0 | | |-- 7ff9fdcae2b8579d71c590dba60dbf0ebc8a5503538498845d2d2aeee2bbc8db.0 | | |-- 81366d4da99b0cd28f4a8697b10e3d581e2cb15f2c7d7b05a1ddf9ed7c90f80d.0 | | |-- 819387e466dfc0802e02ba8250f1425c2e7e41f46292686f26813f6d3f2a859a.0 | | |-- 840423c43989a15b33f9457855e431a93e281c3aa4d372880e0a77f0071e84da.0 | | |-- 84086002f43b4f4139216dcc9ff1b2e9d1ffe4a4c67d7d95395c063070f8cf4d.0 | | |-- 84ca0e37b2cc00dd7fc8d8aafc28c9802be8abfe6cd08f42a114399f15510383.0 | | |-- 85d9b0790677a730fcc7e69d31c7461ef99aef44985d5683ab2cff6fce05f8fb.0 | | |-- 885b2cdcd3a71f95ccbdd82dc32c298e2e95a9455a5636bcd38fe641c04c1641.0

18 | | |-- 8a2ab8d5d85c1e69b9fee42e836beede78ffebddcb00a5c9253ced681277e1d5.0 | | |-- 8a70e793efcf6c254d5a9810ca361e971b05e20be1e0776e5cd650401c829dcb.0 | | |-- 8b8bcf29b65e5a42a46a98e2c387dc3b39b8a35d58ea3d44d875b4b82477b8af.0 | | |-- 8cd2fa6f9c3e38305e02ed84feee094bbc38b0212c44afe9f912dea01d29597f.0 | | |-- 8f2e3557fed1388b5c51570b09aa4675c4740ffaf1068959e47ae04ce9dc3c7f.0 | | |-- 91df9f7117ebbceb00215d3d01d0af7c5d0205563d1e5bfb384d224e986963e5.0 | | |-- 92274292e525cc106a11bcf77afb6152609baa02998716160d222d79fc776245.0 | | |-- 9340d5ea7f8d0fa20a5fe61ed4d76dc0998dc2ea80be6373662e65928b0f2e30.0 | | |-- 960f1522f83c21181b4b945d94eb824b18b3405e50d074ccc3ffdd65f9ff0001.0 | | |-- 9628aea28c8f9cc8ac4fb867c36288dd10ca902c6ddbf798bd21ac1b50751dac.0 | | |-- 96843965568162dc63706fb28a380c27e9ffdf7c6234997e25e262c77f853634.0 | | |-- 976709d4a7f8d6b41cdeaadcdd0ff6510861506d02badda8d80564154e449574.0 | | |-- 97d1af301446e1f3b99a2ccf0e77307a52fccda18078d1b22202bd417d47425d.0 | | |-- 9a23a66973f59a6d8a7d22fa24321f040c2c76639a681da00121d9e9882028f9.0 | | |-- 9bb031b4dd11695ac9daa0c51024886105225c369355143e5a30b7d390dd44bc.0 | | |-- a1472c966b89b82f8d21a0c205d242e794304bfe6aca97f786b01d4098425849.0 | | |-- a1cc897e41b4f65e6045e47f232735b4867464b4c55bc8afdc650127bc38988d.0 | | |-- a1f9e4d79261a6e072ec2dc53d303650a76f1dd5652408ccfbee6bc7605eb6a3.0 | | |-- a608ca35e9fe31813fccad2c9ecb78cfe6197a7b5ccf0197638b6def6fc16b7c.0 | | |-- a71545edcf3659951e47d90f9ecfa5bee5a0d1b1b97f06b54357a2b17f031325.0 | | |-- aa1401bac73572d5dbdde16473bf97beff47a60154bc40c821cfba60758c784b.0 | | |-- ad366c34348f5b99ce8d91d7b6aafe19d9e54a7a21a41cef354a5dbde797378f.0 | | |-- ae4f854a37bf18a70ce80bd4b48bc276a42b897dabf9461aa0b29fd791af03ed.0 | | |-- af8232dc985cfafe94dc86849aa2c78562772f69f432f19ba4c5fca3e864bf22.0 | | |-- b02ce72f57185365c8132cc0b4cdb203fbb7492265c866238bb0122bd4b458d2.0 | | |-- b133a1381a8d7b9ee003c14158a3c8840a9275f29bb6d788bbb281e4c08fded9.0 | | |-- b2a4f79fd14945f2458892a5ff83e025f7724e5302fb05c7b97df3888e7cf833.0 | | |-- b38f8c60a60275a9ad4570ecb44ce93d09f6a5bef6f5494ad54ba1d76fa584e9.0 | | |-- b3b4c0fdde0200eabceb086369d04d5eddebfb62b0229a3f7df4a321995d2351.0 | | |-- b51854eb868d42f4b26fd43023af7e166d5e23364b34621fbee8ec3721e35492.0 | | |-- b545d62e6fc814b50d5855876a2859e02bfb2dab1777b08fb3901eaf467e4d1a.0 | | |-- b59ab964f9f9e26404cd931f4fd982de154f4e088dd243fae3ec3d185499ea5c.0 | | |-- b75e51a2e99847858c5f2124570af93e031011c7e40f1e72bc265966638de7a2.0 | | |-- bc3466e86835be9f18b1040c44fab99a579a4e6726ec7e90b7654958f22fe403.0 | | |-- bee88dd124e7236a10d70c61b1585cea0a3824994b1af6cd48ab0b78e9af9f6e.0 | | |-- c1bb63c9458362046d5cd6cd5ac574bb2f214065233ba21073a3c958e17d594f.0 | | |-- c211fc7f662aa919e1b3feecb89005b1cbaca8814456262b4c8169618be0d622.0 | | |-- c377b6e8b415a8c537c063c8f9ae791e742e01ab3c6fe06cf9a4a96865e1cd20.0 | | |-- c753362ceff73fa6593a0bc820a9d124dd59be4013431641e10c85ce8edcd925.0 | | |-- ca111376731e52016f2086e529cf53b44c72d66c4758d24e432ec3e97a862e65.0 | | |-- cce45808101eb3ef0614103822bc75dfb0940410f08dd70a7b041feb713a87eb.0

19 | | |-- cd388b2b5499487c757fd42e45d7d24aefbc7d817088ed9d4b60f5c15ed81b82.0 | | |-- ce103513ebf60dd2dc7a8788f05843e9c2c55471bd94a10bce0427653b11ccc4.0 | | |-- cf33166d072dce5428cafe4318c4cc8a32b0c39c6df0deb664b3326d8f2688d1.0 | | |-- d181f32d4c1ecc41b246cfb2a469a3218d1e11ea62a3169ce79bd81f7ab16267.0 | | |-- d2a09e6fc0a8107bae12c2eb86e44e058c4b7558818d3189860041d8d4fcd633.0 | | |-- d5d75a51db7e2cc0c8293c27703b6d39317c8d5a4d82374f3de2704317bf65fa.0 | | |-- d6b1929b0acea984775f0ec75373a77d126ceebd53354fc10c823e128c7977a2.0 | | |-- d7941de3e362575b206186124d32f5c895ba538f8b7dca93d890759bad71efd8.0 | | |-- d97f4fdf4c78ff3c7aff3364b5643d08a3ff5784ab7867510721c45cc5f84558.0 | | |-- df2b98fe4a052fce62e8abe406a4866ae975aaf316834dbce1d30a3a5fec9281.0 | | |-- df91d15f4f9f356d9f386f8719d89c7037a1a3fa2cadb533e7a1e712c4138d57.0 | | |-- e152f7f88a5de770610510ae6afeff69c97c5f927a57522224f8ecbacc75d0cf.0 | | |-- e4d6f725717e77fa0db44a18596c764fcbbd058c4589579196857e438ee7dc91.0 | | |-- e4f6d9de4847bdd830520465e811ccb9ff5eedd4071dfeb7ca5dd656ab9411bb.0 | | |-- e4fa67c21da09c3b92ca9bd6c68821b67334fbe4cd0555056417db8a798a0cb7.0 | | |-- e652a13bf2fd990f84a7b906d8e185f90085aaf99618b05548a6d89010d42b4b.0 | | |-- e9a4fe6138b717d6c546979a90ff5bbaefe97cf7ae75fba0d589ba82c2edce41.0 | | |-- ea4d49b3bde03b293b8818d83eca435f3894b1fffe73474b56535b63421c8094.0 | | |-- ea705c84b5cae34ecf8307d397925c4586bf1effd786bf2a0ad99ab80a02db47.0 | | |-- ebd7d3a187e44e25bae3b55ca17d3989f6375f4d06ef776ee2df6ba11286c106.0 | | |-- f229dff6995bf1958fa68e7e1b78cbe9d70a4b6b2e73faa5945be1ff96f9d9a9.0 | | |-- f3194735ff7115ab6e331ad0a8462527162a4dc9d13b1380701a365328bdcf2c.0 | | |-- f3dfa49ef3935e3633d149cb677891b482a460698ecac0fd00984cc1b9d4f235.0 | | |-- f4efdbd29719292b2eafbfe7a5d5e69c85bd363bc9c3f23c381ea517abbe742d.0 | | |-- f5236e15da53c8fcaa48407c20fee0a39d746afb37a6bc61f58071087e4effc0.0 | | |-- fcecbf518af5c369b98c3090b4fc5352d0eacb03eb397ff24fa801774943727c.0 | | |-- fde1884412747858ce3259b6d1922f65946a1a254776daa751a4c850a8a30ef9.0 | | |-- fe0e1ceafbb4cf663dcaa8cfbeeedafa7094629dcab09ed9ab5cb812cd3f25c4.0 | | |-- fed1816783349c5199ded7d23b34cba73f49cdb3900567f63b4940d46ee43bd2.0 | | |-- fed1a3838b6d6f9d5671df65f3bc25476a0470dc9ddff983f2a0ab982d098c7c.0 | | |-- ffee5306c91fe340eb6cbb215f152415fae15cca48293079b23ef1c2bd6d0a81.0 | | ‘-- journal | |-- org.chromium.android_webview | | |-- 0ae5c52e7d3fb345_0 | | |-- 0b3df38f24424e65_0 | | |-- 1de64cebb4d1e393_0 | | |-- 27620e24143dcec2_0 | | |-- 4fe3c069bef5381e_0 | | |-- 5dd893e9a6bedd5b_0 | | |-- 64ad361f62a1d55e_0 | | |-- 6c5df82b19fd2f08_0

20 | | |-- 7221c4a8bc6673f3_0 | | |-- 7356f9d1bc119d25_0 | | |-- 7eb416c7e476030c_0 | | |-- Code Cache | | | ‘-- js | | | |-- 703cbe12b606b8ca_0 | | | |-- 865232f863b25a46_0 | | | |-- cd26e7b7bb696122_0 | | | |-- index | | | ‘-- index-dir | | | ‘-- the-real-index | | |-- b31b77d7d0089b8e_0 | | |-- b45a423d6427f2e8_0 | | |-- fce91f7c96401356_0 | | |-- index | | ‘-- index-dir | | ‘-- the-real-index | ‘-- randomTemp17483935204060447318.png |-- code_cache |-- databases | |-- evernote_jobs.db | |-- evernote_jobs.db-journal | |-- mastodon_etalab_db | ‘-- mastodon_etalab_db-journal |-- lldb | ‘-- bin | |-- lldb-server | ‘-- start_lldb_server.sh ‘-- shared_prefs |-- BubbleShowCasePrefs.xml |-- LocaleChanger.LocalePersistence.xml |-- WebViewChromiumPrefs.xml |-- app_prefs.xml |-- evernote_jobs.xml ‘-- fr.gouv.etalab.mastodon_preferences.xml

27 directories, 208 files

21 Appendix B

Tables (18) Name Type Schema BOOST_SCHEDULE CREATE TABLE BOOST_SCHEDULE (ID INTEGER PRIMARY KEY AUTOINCREMENT, USER_ID TEXT NOT NULL, INSTANCE TEXT NOT NULL, STATUS_SERIALIZED TEXT NOT NULL, DATE_SCHEDULED TEXT, IS_SCHEDULED INTEGER NOT NULL, SENT INTEGER NOT NULL, DATE_SENT TEXT) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT USER_ID TEXT "USER_ID" TEXT NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL STATUS_SERIALIZED TEXT "STATUS_SERIALIZED" TEXT NOT NULL DATE_SCHEDULED TEXT "DATE_SCHEDULED" TEXT IS_SCHEDULED INTEGER "IS_SCHEDULED" INTEGER NOT NULL SENT INTEGER "SENT" INTEGER NOT NULL DATE_SENT TEXT "DATE_SENT" TEXT CACHE_TAGS CREATE TABLE CACHE_TAGS(ID INTEGER PRIMARY KEY AUTOINCREMENT, TAGS TEXT NOT NULL) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT TAGS TEXT "TAGS" TEXT NOT NULL CUSTOM_EMOJI CREATE TABLE CUSTOM_EMOJI (ID INTEGER PRIMARY KEY AUTOINCREMENT, SHORTCODE TEXT NOT NULL, INSTANCE TEXT NOT NULL, URL TEXT NOT NULL, URL_STATIC TEXT NOT NULL, DATE_CREATION TEXT NOT NULL) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT SHORTCODE TEXT "SHORTCODE" TEXT NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL URL TEXT "URL" TEXT NOT NULL URL_STATIC TEXT "URL_STATIC" TEXT NOT NULL DATE_CREATION TEXT "DATE_CREATION" TEXT NOT NULL INSTANCES CREATE TABLE INSTANCES (ID INTEGER PRIMARY KEY AUTOINCREMENT, INSTANCE TEXT NOT NULL, USER_ID TEXT NOT NULL, INSTANCE_TYPE TEXT, TAGS TEXT, FILTERED_WITH TEXT, DATE_CREATION TEXT NOT NULL) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT INSTANCE TEXT "INSTANCE" TEXT NOT NULL USER_ID TEXT "USER_ID" TEXT NOT NULL INSTANCE_TYPE TEXT "INSTANCE_TYPE" TEXT TAGS TEXT "TAGS" TEXT FILTERED_WITH TEXT "FILTERED_WITH" TEXT DATE_CREATION TEXT "DATE_CREATION" TEXT NOT NULL MAIN_MENU_ITEMS CREATE TABLE MAIN_MENU_ITEMS(ID INTEGER PRIMARY KEY AUTOINCREMENT, USER_ID TEXT NOT NULL, INSTANCE TEXT NOT NULL, NAV_NEWS INTEGER DEFAULT 1, NAV_LIST INTEGER DEFAULT 1, NAV_SCHEDULED INTEGER DEFAULT 1, NAV_ARCHIVE INTEGER DEFAULT 1, NAV_ARCHIVE_NOTIFICATIONS INTEGER DEFAULT 1, NAV_PEERTUBE INTEGER DEFAULT 1, NAV_FILTERS INTEGER DEFAULT 1, NAV_HOW_TO_FOLLOW INTEGER DEFAULT 1, NAV_ADMINISTRATION INTEGER DEFAULT 1, NAV_BLOCKED INTEGER DEFAULT 1, NAV_MUTED INTEGER DEFAULT 1,

1

22 Name Type Schema NAV_BLOCKED_DOMAINS INTEGER DEFAULT 1, NAV_HOWTO INTEGER DEFAULT 1) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT USER_ID TEXT "USER_ID" TEXT NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL NAV_NEWS INTEGER "NAV_NEWS" INTEGER DEFAULT 1 NAV_LIST INTEGER "NAV_LIST" INTEGER DEFAULT 1 NAV_SCHEDULED INTEGER "NAV_SCHEDULED" INTEGER DEFAULT 1 NAV_ARCHIVE INTEGER "NAV_ARCHIVE" INTEGER DEFAULT 1 NAV_ARCHIVE_NOTIFICATIONS INTEGER "NAV_ARCHIVE_NOTIFICATIONS" INTEGER DEFAULT 1 NAV_PEERTUBE INTEGER "NAV_PEERTUBE" INTEGER DEFAULT 1 NAV_FILTERS INTEGER "NAV_FILTERS" INTEGER DEFAULT 1 NAV_HOW_TO_FOLLOW INTEGER "NAV_HOW_TO_FOLLOW" INTEGER DEFAULT 1 NAV_ADMINISTRATION INTEGER "NAV_ADMINISTRATION" INTEGER DEFAULT 1 NAV_BLOCKED INTEGER "NAV_BLOCKED" INTEGER DEFAULT 1 NAV_MUTED INTEGER "NAV_MUTED" INTEGER DEFAULT 1 NAV_BLOCKED_DOMAINS INTEGER "NAV_BLOCKED_DOMAINS" INTEGER DEFAULT 1 NAV_HOWTO INTEGER "NAV_HOWTO" INTEGER DEFAULT 1 NOTIFICATION_CACHE CREATE TABLE NOTIFICATION_CACHE(ID INTEGER PRIMARY KEY AUTOINCREMENT, NOTIFICATION_ID TEXT NOT NULL, INSTANCE TEXT NOT NULL, USER_ID TEXT NOT NULL, ACCOUNT TEXT NOT NULL, TYPE TEXT NOT NULL, STATUS_ID TEXT, IN_REPLY_TO_ID TEXT, STATUS_ID_CACHE INTEGER, CREATED_AT TEXT NOT NULL) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT NOTIFICATION_ID TEXT "NOTIFICATION_ID" TEXT NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL USER_ID TEXT "USER_ID" TEXT NOT NULL ACCOUNT TEXT "ACCOUNT" TEXT NOT NULL TYPE TEXT "TYPE" TEXT NOT NULL STATUS_ID TEXT "STATUS_ID" TEXT IN_REPLY_TO_ID TEXT "IN_REPLY_TO_ID" TEXT STATUS_ID_CACHE INTEGER "STATUS_ID_CACHE" INTEGER CREATED_AT TEXT "CREATED_AT" TEXT NOT NULL PEERTUBE_FAVOURITES CREATE TABLE PEERTUBE_FAVOURITES(ID INTEGER PRIMARY KEY AUTOINCREMENT, UUID TEXT NOT NULL, INSTANCE TEXT NOT NULL, CACHE TEXT NOT NULL, DATE TEXT NOT NULL) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT UUID TEXT "UUID" TEXT NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL CACHE TEXT "CACHE" TEXT NOT NULL DATE TEXT "DATE" TEXT NOT NULL SEARCH CREATE TABLE SEARCH (ID INTEGER PRIMARY KEY AUTOINCREMENT, KEYWORDS TEXT NOT NULL, USER_ID TEXT NOT NULL, ANY_TAG TEXT, ALL_TAG TEXT, NONE_TAG TEXT, NAME TEXT, IS_ART INTEGER DEFAULT 0, IS_NSFW INTEGER DEFAULT 0, DATE_CREATION TEXT NOT NULL)

2

23 Name Type Schema ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT KEYWORDS TEXT "KEYWORDS" TEXT NOT NULL USER_ID TEXT "USER_ID" TEXT NOT NULL ANY_TAG TEXT "ANY_TAG" TEXT ALL_TAG TEXT "ALL_TAG" TEXT NONE_TAG TEXT "NONE_TAG" TEXT NAME TEXT "NAME" TEXT IS_ART INTEGER "IS_ART" INTEGER DEFAULT 0 IS_NSFW INTEGER "IS_NSFW" INTEGER DEFAULT 0 DATE_CREATION TEXT "DATE_CREATION" TEXT NOT NULL STATUSES_CACHE CREATE TABLE STATUSES_CACHE (ID INTEGER PRIMARY KEY AUTOINCREMENT, CACHED_ACTION INTEGER NOT NULL, INSTANCE TEXT NOT NULL, USER_ID NOT NULL, DATE_BACKUP TEXT NOT NULL, STATUS_ID TEXT NOT NULL, URI TEXT NOT NULL, URL TEXT NOT NULL, ACCOUNT TEXT NOT NULL, IN_REPLY_TO_ID TEXT, IN_REPLY_TO_ACCOUNT_ID TEXT,REBLOG TEXT, CONTENT TEXT NOT NULL, CREATED_AT TEXT NOT NULL, EMOJIS TEXT, REBLOGS_COUNT INTEGER NOT NULL, FAVOURITES_COUNT INTEGER NOT NULL, REBLOGGED INTEGER, FAVOURITED INTEGER, MUTED INTEGER, SENSITIVE INTEGER, SPOILER_TEXT TEXT, VISIBILITY TEXT NOT NULL, MEDIA_ATTACHMENTS TEXT,CARD TEXT,MENTIONS TEXT, TAGS TEXT, APPLICATION TEXT,LANGUAGE TEXT,PINNED INTEGER) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT CACHED_ACTION INTEGER "CACHED_ACTION" INTEGER NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL USER_ID TEXT "USER_ID" TEXT NOT NULL DATE_BACKUP TEXT "DATE_BACKUP" TEXT NOT NULL STATUS_ID TEXT "STATUS_ID" TEXT NOT NULL URI TEXT "URI" TEXT NOT NULL URL TEXT "URL" TEXT NOT NULL ACCOUNT TEXT "ACCOUNT" TEXT NOT NULL IN_REPLY_TO_ID TEXT "IN_REPLY_TO_ID" TEXT IN_REPLY_TO_ACCOUNT_ID TEXT "IN_REPLY_TO_ACCOUNT_ID" TEXT REBLOG TEXT "REBLOG" TEXT CONTENT TEXT "CONTENT" TEXT NOT NULL CREATED_AT TEXT "CREATED_AT" TEXT NOT NULL EMOJIS TEXT "EMOJIS" TEXT REBLOGS_COUNT INTEGER "REBLOGS_COUNT" INTEGER NOT NULL FAVOURITES_COUNT INTEGER "FAVOURITES_COUNT" INTEGER NOT NULL REBLOGGED INTEGER "REBLOGGED" INTEGER FAVOURITED INTEGER "FAVOURITED" INTEGER MUTED INTEGER "MUTED" INTEGER SENSITIVE INTEGER "SENSITIVE" INTEGER SPOILER_TEXT TEXT "SPOILER_TEXT" TEXT VISIBILITY TEXT "VISIBILITY" TEXT NOT NULL

3

24 Name Type Schema MEDIA_ATTACHMENTS TEXT "MEDIA_ATTACHMENTS" TEXT CARD TEXT "CARD" TEXT MENTIONS TEXT "MENTIONS" TEXT TAGS TEXT "TAGS" TEXT APPLICATION TEXT "APPLICATION" TEXT LANGUAGE TEXT "LANGUAGE" TEXT PINNED INTEGER "PINNED" INTEGER STATUSES_STORED CREATE TABLE STATUSES_STORED (ID INTEGER PRIMARY KEY AUTOINCREMENT, USER_ID TEXT NOT NULL, INSTANCE TEXT NOT NULL, STATUS_SERIALIZED TEXT NOT NULL, STATUS_REPLY_SERIALIZED TEXT, DATE_CREATION TEXT NOT NULL, IS_SCHEDULED INTEGER NOT NULL, DATE_SCHEDULED TEXT, SENT INTEGER NOT NULL, DATE_SENT TEXT) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT USER_ID TEXT "USER_ID" TEXT NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL STATUS_SERIALIZED TEXT "STATUS_SERIALIZED" TEXT NOT NULL STATUS_REPLY_SERIALIZED TEXT "STATUS_REPLY_SERIALIZED" TEXT DATE_CREATION TEXT "DATE_CREATION" TEXT NOT NULL IS_SCHEDULED INTEGER "IS_SCHEDULED" INTEGER NOT NULL DATE_SCHEDULED TEXT "DATE_SCHEDULED" TEXT SENT INTEGER "SENT" INTEGER NOT NULL DATE_SENT TEXT "DATE_SENT" TEXT TEMP_MUTE CREATE TABLE TEMP_MUTE (ID INTEGER PRIMARY KEY AUTOINCREMENT, ACCT TEXT NOT NULL, INSTANCE TEXT NOT NULL, TARGETED_USER_ID TEXT NOT NULL, DATE_CREATION TEXT NOT NULL, DATE_END TEXT NOT NULL) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT ACCT TEXT "ACCT" TEXT NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL TARGETED_USER_ID TEXT "TARGETED_USER_ID" TEXT NOT NULL DATE_CREATION TEXT "DATE_CREATION" TEXT NOT NULL DATE_END TEXT "DATE_END" TEXT NOT NULL TIMELINES CREATE TABLE TIMELINES (ID INTEGER PRIMARY KEY AUTOINCREMENT, POSITION INTEGER NOT NULL, USER_ID TEXT NOT NULL, INSTANCE TEXT NOT NULL, TYPE TEXT NOT NULL, REMOTE_INSTANCE TEXT, TAG_TIMELINE TEXT, DISPLAYED INTEGER NOT NULL, LIST_TIMELINE TEXT) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT POSITION INTEGER "POSITION" INTEGER NOT NULL USER_ID TEXT "USER_ID" TEXT NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL TYPE TEXT "TYPE" TEXT NOT NULL REMOTE_INSTANCE TEXT "REMOTE_INSTANCE" TEXT TAG_TIMELINE TEXT "TAG_TIMELINE" TEXT DISPLAYED INTEGER "DISPLAYED" INTEGER NOT NULL

4

25 Name Type Schema LIST_TIMELINE TEXT "LIST_TIMELINE" TEXT TIMELINE_CACHE CREATE TABLE TIMELINE_CACHE(ID INTEGER PRIMARY KEY AUTOINCREMENT, STATUS_ID TEXT NOT NULL, INSTANCE TEXT NOT NULL, USER_ID TEXT NOT NULL, CACHE TEXT NOT NULL, DATE TEXT NOT NULL) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT STATUS_ID TEXT "STATUS_ID" TEXT NOT NULL INSTANCE TEXT "INSTANCE" TEXT NOT NULL USER_ID TEXT "USER_ID" TEXT NOT NULL CACHE TEXT "CACHE" TEXT NOT NULL DATE TEXT "DATE" TEXT NOT NULL TRACKING_BLOCK CREATE TABLE TRACKING_BLOCK (ID INTEGER PRIMARY KEY AUTOINCREMENT, DOMAIN TEXT NOT NULL) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT DOMAIN TEXT "DOMAIN" TEXT NOT NULL USER_ACCOUNT CREATE TABLE USER_ACCOUNT (USER_ID TEXT, USERNAME TEXT NOT NULL, ACCT TEXT NOT NULL, DISPLAYED_NAME TEXT NOT NULL, LOCKED INTEGER NOT NULL, FOLLOWERS_COUNT INTEGER NOT NULL, FOLLOWING_COUNT INTEGER NOT NULL, STATUSES_COUNT INTEGER NOT NULL, NOTE TEXT NOT NULL, URL TEXT NOT NULL, AVATAR TEXT NOT NULL, AVATAR_STATIC TEXT NOT NULL, HEADER TEXT NOT NULL, HEADER_STATIC TEXT NOT NULL, EMOJIS TEXT, SOCIAL TEXT, IS_MODERATOR INTEGER DEFAULT 0, IS_ADMIN INTEGER DEFAULT 0, CLIENT_ID TEXT, CLIENT_SECRET TEXT, REFRESH_TOKEN TEXT,UPDATED_AT TEXT, PRIVACY TEXT, SENSITIVE INTEGER DEFAULT 0, INSTANCE TEXT NOT NULL, OAUTH_TOKEN TEXT NOT NULL, CREATED_AT TEXT NOT NULL) USER_ID TEXT "USER_ID" TEXT USERNAME TEXT "USERNAME" TEXT NOT NULL ACCT TEXT "ACCT" TEXT NOT NULL DISPLAYED_NAME TEXT "DISPLAYED_NAME" TEXT NOT NULL LOCKED INTEGER "LOCKED" INTEGER NOT NULL FOLLOWERS_COUNT INTEGER "FOLLOWERS_COUNT" INTEGER NOT NULL FOLLOWING_COUNT INTEGER "FOLLOWING_COUNT" INTEGER NOT NULL STATUSES_COUNT INTEGER "STATUSES_COUNT" INTEGER NOT NULL NOTE TEXT "NOTE" TEXT NOT NULL URL TEXT "URL" TEXT NOT NULL AVATAR TEXT "AVATAR" TEXT NOT NULL AVATAR_STATIC TEXT "AVATAR_STATIC" TEXT NOT NULL HEADER TEXT "HEADER" TEXT NOT NULL HEADER_STATIC TEXT "HEADER_STATIC" TEXT NOT NULL EMOJIS TEXT "EMOJIS" TEXT SOCIAL TEXT "SOCIAL" TEXT IS_MODERATOR INTEGER "IS_MODERATOR" INTEGER DEFAULT 0 IS_ADMIN INTEGER "IS_ADMIN" INTEGER DEFAULT 0 CLIENT_ID TEXT "CLIENT_ID" TEXT CLIENT_SECRET TEXT "CLIENT_SECRET" TEXT

5

26 Name Type Schema REFRESH_TOKEN TEXT "REFRESH_TOKEN" TEXT UPDATED_AT TEXT "UPDATED_AT" TEXT PRIVACY TEXT "PRIVACY" TEXT SENSITIVE INTEGER "SENSITIVE" INTEGER DEFAULT 0 INSTANCE TEXT "INSTANCE" TEXT NOT NULL OAUTH_TOKEN TEXT "OAUTH_TOKEN" TEXT NOT NULL CREATED_AT TEXT "CREATED_AT" TEXT NOT NULL USER_NOTES CREATE TABLE USER_NOTES(ID INTEGER PRIMARY KEY AUTOINCREMENT, ACCT TEXT NOT NULL, NOTE TEXT, DATE_CREATION TEXT NOT NULL) ID INTEGER "ID" INTEGER PRIMARY KEY AUTOINCREMENT ACCT TEXT "ACCT" TEXT NOT NULL NOTE TEXT "NOTE" TEXT DATE_CREATION TEXT "DATE_CREATION" TEXT NOT NULL android_metadata CREATE TABLE android_metadata (locale TEXT) locale TEXT "locale" TEXT sqlite_sequence CREATE TABLE sqlite_sequence(name,seq) name TEXT "name" TEXT seq TEXT "seq" TEXT

Indices (1) Name Type Schema instance_statusid CREATE UNIQUE INDEX instance_statusid on STATUSES_CACHE(INSTANCE,STATUS_ID,CACHED_ACTION) INSTANCE "INSTANCE" STATUS_ID "STATUS_ID" CACHED_ACTION "CACHED_ACTION"

Views (0) Name Type Schema

Triggers (0) Name Type Schema

6

27 Appendix C

Tables (2) Name Type Schema android_metadata CREATE TABLE android_metadata (locale TEXT) locale TEXT "locale" TEXT jobs CREATE TABLE jobs (_id integer primary key, tag text not null, startMs integer, endMs integer, backoffMs integer, backoffPolicy text not null, intervalMs integer, requirementsEnforced integer, requiresCharging integer, requiresDeviceIdle integer, exact integer, networkType text not null, extras text, numFailures integer, scheduledAt integer, started integer, flexMs integer, flexSupport integer, lastRun integer, transient integer, requiresBatteryNotLow integer, requiresStorageNotLow integer) _id integer "_id" integer tag text "tag" text NOT NULL startMs integer "startMs" integer endMs integer "endMs" integer backoffMs integer "backoffMs" integer backoffPolicy text "backoffPolicy" text NOT NULL intervalMs integer "intervalMs" integer requirementsEnforced integer "requirementsEnforced" integer requiresCharging integer "requiresCharging" integer requiresDeviceIdle integer "requiresDeviceIdle" integer exact integer "exact" integer networkType text "networkType" text NOT NULL extras text "extras" text numFailures integer "numFailures" integer scheduledAt integer "scheduledAt" integer started integer "started" integer flexMs integer "flexMs" integer flexSupport integer "flexSupport" integer lastRun integer "lastRun" integer transient integer "transient" integer requiresBatteryNotLow integer "requiresBatteryNotLow" integer requiresStorageNotLow integer "requiresStorageNotLow" integer

Indices (0) Name Type Schema

Views (0) Name Type Schema

Triggers (0) Name Type Schema

1

28 Appendix D

{ "account": { "acct": "[REDACTED]", "avatar": "[REDACTED]", "avatar_static": "[REDACTED]", "bot": false, "created_at": "[REDACTED]", "display_name": "[REDACTED]", "emojis": [{ "shortcode": "[REDACTED]", "static_url": "[REDACTED]", "url": "[REDACTED]", "visible_in_picker": true }, { "shortcode": "[REDACTED]", "static_url": "[REDACTED]", "url": "[REDACTED]", "visible_in_picker": true }, { "shortcode": "[REDACTED]", "static_url": "[REDACTED]", "url": "[REDACTED]", "visible_in_picker": true } ], "fields": [{ "name": "[REDACTED]", "value": "[REDACTED]", "verified_at": null }, { "name": "[REDACTED]", "value": "[REDACTED]", "verified_at": null } ],

29 "followers_count": 881, "following_count": 1135, "header": "[REDACTED]", "header_static": "[REDACTED]", "id": "[REDACTED]", "last_status_at": "[REDACTED]", "locked": true, "note": "[REDACTED]", "statuses_count": 48234, "url": "[REDACTED]", "username": "[REDACTED]" }, "bookmarked": false, "card": null, "content": "[REDACTED]", "created_at": "[REDACTED]", "emojis": [], "favourited": false, "favourites_count": 1, "id": "[REDACTED]", "in_reply_to_account_id": null, "in_reply_to_id": null, "language": "[REDACTED]", "media_attachments": [], "mentions": [], "muted": false, "poll": null, "reblog": null, "reblogged": false, "reblogs_count": 1, "replies_count": 0, "sensitive": false, "spoiler_text": "[REDACTED]", "tags": [], "uri": "[REDACTED]", "url": "[REDACTED]", "visibility": "[REDACTED]" }

30 Appendix E HTTP/1.1 302 status:302 date:Mon, 11 Nov 2019 04:06:40 GMT content-type:text/html; charset=utf-8 location:https://mastodon.social/oauth/authorize? client_id=W8clw61fhO7jYQ667K05gjxPSmQS6yLqE8akqAMulUA&redirect_uri= mastalab%3A%2F%2Fbacktomastalab&response_type=code&scope=read%20write%20follow server:Mastodon x-frame-options:DENY x-content-type-options:nosniff x-xss-protection:1; mode=block vary:Accept-Encoding content-encoding:gzip cache-control:no-cache content-security-policy:base-uri ’none’; default-src ’none’; frame-ancestors ’none’; font-src ’self’ https://mastodon.social; img-src ’self’ https: data: blob: https://mastodon.social; style-src ’self’ ’unsafe-inline’ https://mastodon.social; media-src ’self’ https: data: https://mastodon.social; frame-src ’self’ https:; manifest-src ’self’ https://mastodon.social; connect-src ’self’ data: blob: https://mastodon.social https://files.mastodon.social wss://mastodon.social; script-src ’self’ https://mastodon.social; worker-src ’self’ blob: https://mastodon.social x-request-id:97dc89fc-4d8

31