Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
c91f809e
Commit
c91f809e
authored
Dec 08, 2018
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove all backwards compatibility nonsense
This also allows full obfuscation
parent
a54eaf53
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
189 additions
and
718 deletions
+189
-718
proguard-rules.pro
app/proguard-rules.pro
+1
-0
AndroidManifest.xml
app/src/full/AndroidManifest.xml
+0
-9
Const.java
app/src/full/java/com/topjohnwu/magisk/Const.java
+1
-6
Data.java
app/src/full/java/com/topjohnwu/magisk/Data.java
+1
-6
FlashActivity.java
app/src/full/java/com/topjohnwu/magisk/FlashActivity.java
+1
-2
MagiskManager.java
app/src/full/java/com/topjohnwu/magisk/MagiskManager.java
+2
-2
SplashActivity.java
app/src/full/java/com/topjohnwu/magisk/SplashActivity.java
+1
-2
SuRequestActivity.java
...src/full/java/com/topjohnwu/magisk/SuRequestActivity.java
+6
-46
InstallMagisk.java
.../full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java
+1
-12
MagiskDB.java
...src/full/java/com/topjohnwu/magisk/database/MagiskDB.java
+165
-34
MagiskDBCmdline.java
...l/java/com/topjohnwu/magisk/database/MagiskDBCmdline.java
+0
-189
MagiskDBLegacy.java
...ll/java/com/topjohnwu/magisk/database/MagiskDBLegacy.java
+0
-299
MagiskFragment.java
...l/java/com/topjohnwu/magisk/fragments/MagiskFragment.java
+1
-2
GeneralReceiver.java
.../java/com/topjohnwu/magisk/receivers/GeneralReceiver.java
+1
-2
RequestActivity.java
.../java/com/topjohnwu/magisk/superuser/RequestActivity.java
+0
-21
SuReceiver.java
.../full/java/com/topjohnwu/magisk/superuser/SuReceiver.java
+0
-16
BootSigner.java
app/src/full/java/com/topjohnwu/magisk/utils/BootSigner.java
+0
-1
RootUtils.java
app/src/full/java/com/topjohnwu/magisk/utils/RootUtils.java
+0
-7
SuConnector.java
...src/full/java/com/topjohnwu/magisk/utils/SuConnector.java
+8
-23
utils.sh
app/src/full/res/raw/utils.sh
+0
-39
No files found.
app/proguard-rules.pro
View file @
c91f809e
...
...
@@ -24,6 +24,7 @@
# Snet extention
-
keepclassmembers
class
com
.
topjohnwu
.
magisk
.
utils
.
ISafetyNetHelper
{
*
;
}
-
keepclassmembers
class
com
.
topjohnwu
.
magisk
.
utils
.
BootSigner
{
*
;
}
# Fast Android Networking Library
-
dontwarn
okhttp3
.
**
...
...
app/src/full/AndroidManifest.xml
View file @
c91f809e
...
...
@@ -53,15 +53,6 @@
android:taskAffinity=
"internal.superuser"
android:theme=
"@style/SuRequest"
/>
<activity
android:name=
".superuser.RequestActivity"
android:excludeFromRecents=
"true"
android:launchMode=
"singleTask"
android:taskAffinity=
"internal.superuser"
android:theme=
"@style/AppTheme.Translucent"
/>
<receiver
android:name=
".superuser.SuReceiver"
/>
<!-- Receiver -->
<receiver
android:name=
"a.h"
>
...
...
app/src/full/java/com/topjohnwu/magisk/Const.java
View file @
c91f809e
...
...
@@ -10,7 +10,6 @@ import java.util.List;
public
class
Const
{
public
static
final
String
DEBUG_TAG
=
"MagiskManager"
;
public
static
final
String
MAGISKHIDE_PROP
=
"persist.magisk.hide"
;
// APK content
public
static
final
String
ANDROID_MANIFEST
=
"AndroidManifest.xml"
;
...
...
@@ -47,11 +46,7 @@ public class Const {
public
static
final
int
USER_ID
=
Process
.
myUid
()
/
100000
;
public
static
final
class
MAGISK_VER
{
public
static
final
int
SEPOL_REFACTOR
=
1640
;
public
static
final
int
FIX_ENV
=
1650
;
public
static
final
int
DBVER_SIX
=
17000
;
public
static
final
int
CMDLINE_DB
=
17305
;
public
static
final
int
HIDE_STATUS
=
17315
;
/* Currently no backwards compatibility needed */
}
public
static
class
ID
{
...
...
app/src/full/java/com/topjohnwu/magisk/Data.java
View file @
c91f809e
...
...
@@ -83,12 +83,7 @@ public class Data {
try
{
magiskVersionString
=
ShellUtils
.
fastCmd
(
"magisk -v"
).
split
(
":"
)[
0
];
magiskVersionCode
=
Integer
.
parseInt
(
ShellUtils
.
fastCmd
(
"magisk -V"
));
if
(
magiskVersionCode
>=
Const
.
MAGISK_VER
.
HIDE_STATUS
)
{
magiskHide
=
Shell
.
su
(
"magiskhide --status"
).
exec
().
isSuccess
();
}
else
{
String
s
=
ShellUtils
.
fastCmd
((
"resetprop -p "
)
+
Const
.
MAGISKHIDE_PROP
);
magiskHide
=
s
.
isEmpty
()
||
Integer
.
parseInt
(
s
)
!=
0
;
}
}
catch
(
NumberFormatException
ignored
)
{}
}
...
...
app/src/full/java/com/topjohnwu/magisk/FlashActivity.java
View file @
c91f809e
...
...
@@ -15,7 +15,6 @@ import android.widget.Toast;
import
com.topjohnwu.magisk.asyncs.FlashZip
;
import
com.topjohnwu.magisk.asyncs.InstallMagisk
;
import
com.topjohnwu.magisk.components.BaseActivity
;
import
com.topjohnwu.magisk.utils.RootUtils
;
import
com.topjohnwu.magisk.utils.Utils
;
import
com.topjohnwu.superuser.CallbackList
;
import
com.topjohnwu.superuser.Shell
;
...
...
@@ -160,7 +159,7 @@ public class FlashActivity extends BaseActivity {
protected
void
onPostExecute
(
Integer
result
)
{
if
(
result
==
1
)
{
Data
.
mainHandler
.
postDelayed
(()
->
RootUtils
.
uninstallPkg
(
getActivity
().
getPackageName
()
),
3000
);
Shell
.
su
(
"pm uninstall "
+
getActivity
().
getPackageName
()).
exec
(
),
3000
);
}
else
{
super
.
onPostExecute
(
result
);
}
...
...
app/src/full/java/com/topjohnwu/magisk/MagiskManager.java
View file @
c91f809e
...
...
@@ -20,8 +20,8 @@ public class MagiskManager extends ContainerApp {
// Global resources
public
SharedPreferences
prefs
;
public
MagiskDB
mDB
;
public
RepoDatabaseHelper
repoDB
;
public
MagiskDB
mDB
;
public
MagiskManager
()
{
Data
.
weakApp
=
new
WeakReference
<>(
this
);
...
...
@@ -37,8 +37,8 @@ public class MagiskManager extends ContainerApp {
Shell
.
Config
.
setTimeout
(
2
);
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
this
);
mDB
=
MagiskDB
.
getInstance
();
repoDB
=
new
RepoDatabaseHelper
(
this
);
mDB
=
new
MagiskDB
(
this
);
LocaleManager
.
setLocale
(
this
);
Data
.
loadConfig
();
...
...
app/src/full/java/com/topjohnwu/magisk/SplashActivity.java
View file @
c91f809e
...
...
@@ -12,7 +12,6 @@ import com.topjohnwu.magisk.components.Notifications;
import
com.topjohnwu.magisk.receivers.ShortcutReceiver
;
import
com.topjohnwu.magisk.utils.Download
;
import
com.topjohnwu.magisk.utils.LocaleManager
;
import
com.topjohnwu.magisk.utils.RootUtils
;
import
com.topjohnwu.magisk.utils.Utils
;
import
com.topjohnwu.superuser.Shell
;
...
...
@@ -31,7 +30,7 @@ public class SplashActivity extends BaseActivity {
try
{
// We are the manager, remove com.topjohnwu.magisk as it could be malware
getPackageManager
().
getApplicationInfo
(
BuildConfig
.
APPLICATION_ID
,
0
);
RootUtils
.
uninstallPkg
(
BuildConfig
.
APPLICATION_ID
);
Shell
.
su
(
"pm uninstall "
+
BuildConfig
.
APPLICATION_ID
).
submit
(
);
}
catch
(
PackageManager
.
NameNotFoundException
ignored
)
{}
}
...
...
app/src/full/java/com/topjohnwu/magisk/SuRequestActivity.java
View file @
c91f809e
...
...
@@ -3,10 +3,8 @@ package com.topjohnwu.magisk;
import
android.content.Intent
;
import
android.content.pm.PackageManager
;
import
android.hardware.fingerprint.FingerprintManager
;
import
android.net.LocalSocketAddress
;
import
android.os.Bundle
;
import
android.os.CountDownTimer
;
import
android.os.FileObserver
;
import
android.text.TextUtils
;
import
android.view.View
;
import
android.view.Window
;
...
...
@@ -43,48 +41,6 @@ public class SuRequestActivity extends BaseActivity {
private
CountDownTimer
timer
;
private
FingerprintHelper
fingerprintHelper
;
class
SuConnectorV1
extends
SuConnector
{
SuConnectorV1
(
String
name
)
throws
IOException
{
super
(
name
);
}
@Override
public
void
connect
(
String
name
)
throws
IOException
{
socket
.
connect
(
new
LocalSocketAddress
(
name
,
LocalSocketAddress
.
Namespace
.
FILESYSTEM
));
new
FileObserver
(
name
)
{
@Override
public
void
onEvent
(
int
fileEvent
,
String
path
)
{
if
(
fileEvent
==
FileObserver
.
DELETE_SELF
)
{
finish
();
}
}
}.
startWatching
();
}
@Override
public
void
onResponse
()
throws
IOException
{
out
.
write
((
policy
.
policy
==
Policy
.
ALLOW
?
"socket:ALLOW"
:
"socket:DENY"
).
getBytes
());
}
}
class
SuConnectorV2
extends
SuConnector
{
SuConnectorV2
(
String
name
)
throws
IOException
{
super
(
name
);
}
@Override
public
void
connect
(
String
name
)
throws
IOException
{
socket
.
connect
(
new
LocalSocketAddress
(
name
,
LocalSocketAddress
.
Namespace
.
ABSTRACT
));
}
@Override
public
void
onResponse
()
throws
IOException
{
out
.
writeInt
(
policy
.
policy
);
}
}
@Override
public
int
getDarkTheme
()
{
return
R
.
style
.
SuRequest_Dark
;
...
...
@@ -120,8 +76,12 @@ public class SuRequestActivity extends BaseActivity {
Intent
intent
=
getIntent
();
try
{
String
socketName
=
intent
.
getStringExtra
(
"socket"
);
connector
=
intent
.
getIntExtra
(
"version"
,
1
)
==
1
?
new
SuConnectorV1
(
socketName
)
:
new
SuConnectorV2
(
socketName
);
connector
=
new
SuConnector
(
socketName
)
{
@Override
protected
void
onResponse
()
throws
IOException
{
out
.
writeInt
(
policy
.
policy
);
}
};
Bundle
bundle
=
connector
.
readSocketInput
();
int
uid
=
Integer
.
parseInt
(
bundle
.
getString
(
"uid"
));
policy
=
mm
.
mDB
.
getPolicy
(
uid
);
...
...
app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java
View file @
c91f809e
...
...
@@ -342,18 +342,7 @@ public class InstallMagisk extends ParallelTask<Void, Void, Boolean> {
console
.
add
(
"- Target image: "
+
mBoot
);
List
<
String
>
abis
=
Arrays
.
asList
(
Build
.
SUPPORTED_ABIS
);
String
arch
;
if
(
Data
.
remoteMagiskVersionCode
>=
Const
.
MAGISK_VER
.
SEPOL_REFACTOR
)
{
// 32-bit only
if
(
abis
.
contains
(
"x86"
))
arch
=
"x86"
;
else
arch
=
"arm"
;
}
else
{
if
(
abis
.
contains
(
"x86_64"
))
arch
=
"x64"
;
else
if
(
abis
.
contains
(
"arm64-v8a"
))
arch
=
"arm64"
;
else
if
(
abis
.
contains
(
"x86"
))
arch
=
"x86"
;
else
arch
=
"arm"
;
}
String
arch
=
abis
.
contains
(
"x86"
)
?
"x86"
:
"arm"
;
console
.
add
(
"- Device platform: "
+
Build
.
SUPPORTED_ABIS
[
0
]);
...
...
app/src/full/java/com/topjohnwu/magisk/database/MagiskDB.java
View file @
c91f809e
package
com
.
topjohnwu
.
magisk
.
database
;
import
android.content.ContentValues
;
import
android.content.Context
;
import
android.content.pm.PackageManager
;
import
android.text.TextUtils
;
import
com.topjohnwu.magisk.Const
;
import
com.topjohnwu.magisk.Data
;
import
com.topjohnwu.magisk.container.Policy
;
import
com.topjohnwu.magisk.container.SuLogEntry
;
import
com.topjohnwu.magisk.utils.LocaleManager
;
import
com.topjohnwu.magisk.utils.Utils
;
import
com.topjohnwu.superuser.Shell
;
import
java.io.File
;
import
java.text.DateFormat
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.Date
;
import
java.util.List
;
import
androidx.annotation.NonNull
;
import
java.util.Map
;
public
class
MagiskDB
{
static
final
String
POLICY_TABLE
=
"policies"
;
static
final
String
LOG_TABLE
=
"logs"
;
static
final
String
SETTINGS_TABLE
=
"settings"
;
static
final
String
STRINGS_TABLE
=
"strings"
;
static
final
File
LEGACY_MANAGER_DB
=
new
File
(
Utils
.
fmt
(
"/sbin/.magisk/db-%d/magisk.db"
,
Const
.
USER_ID
));
@NonNull
public
static
MagiskDB
getInstance
()
{
if
(
LEGACY_MANAGER_DB
.
canWrite
())
{
return
MagiskDBLegacy
.
newInstance
();
}
else
if
(
Shell
.
rootAccess
())
{
return
Data
.
magiskVersionCode
>=
Const
.
MAGISK_VER
.
CMDLINE_DB
?
new
MagiskDBCmdline
()
:
MagiskDBLegacy
.
newInstance
();
private
static
final
String
POLICY_TABLE
=
"policies"
;
private
static
final
String
LOG_TABLE
=
"logs"
;
private
static
final
String
SETTINGS_TABLE
=
"settings"
;
private
static
final
String
STRINGS_TABLE
=
"strings"
;
private
PackageManager
pm
;
public
MagiskDB
(
Context
context
)
{
pm
=
context
.
getPackageManager
();
}
public
void
deletePolicy
(
Policy
policy
)
{
deletePolicy
(
policy
.
uid
);
}
private
List
<
String
>
rawSQL
(
String
fmt
,
Object
...
args
)
{
return
Shell
.
su
(
"magisk --sqlite '"
+
Utils
.
fmt
(
fmt
,
args
)
+
"'"
).
exec
().
getOut
();
}
private
List
<
ContentValues
>
SQL
(
String
fmt
,
Object
...
args
)
{
List
<
ContentValues
>
list
=
new
ArrayList
<>();
for
(
String
raw
:
rawSQL
(
fmt
,
args
))
{
ContentValues
values
=
new
ContentValues
();
String
[]
cols
=
raw
.
split
(
"\\|"
);
for
(
String
col
:
cols
)
{
String
[]
pair
=
col
.
split
(
"="
,
2
);
if
(
pair
.
length
!=
2
)
continue
;
values
.
put
(
pair
[
0
],
pair
[
1
]);
}
list
.
add
(
values
);
}
return
list
;
}
private
String
toSQL
(
ContentValues
values
)
{
StringBuilder
keys
=
new
StringBuilder
(),
vals
=
new
StringBuilder
();
keys
.
append
(
'('
);
vals
.
append
(
"VALUES("
);
boolean
first
=
true
;
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
values
.
valueSet
())
{
if
(!
first
)
{
keys
.
append
(
','
);
vals
.
append
(
','
);
}
else
{
return
new
MagiskDB
();
first
=
false
;
}
keys
.
append
(
entry
.
getKey
());
vals
.
append
(
'"'
);
vals
.
append
(
entry
.
getValue
());
vals
.
append
(
'"'
);
}
keys
.
append
(
')'
);
vals
.
append
(
')'
);
keys
.
append
(
vals
);
return
keys
.
toString
();
}
public
void
clearOutdated
()
{
rawSQL
(
"DELETE FROM %s WHERE until > 0 AND until < %d;"
+
"DELETE FROM %s WHERE time < %d"
,
POLICY_TABLE
,
System
.
currentTimeMillis
()
/
1000
,
LOG_TABLE
,
System
.
currentTimeMillis
()
-
Data
.
suLogTimeout
*
86400000
);
}
public
void
clearOutdated
()
{}
public
void
deletePolicy
(
String
pkg
)
{
rawSQL
(
"DELETE FROM %s WHERE package_name=\"%s\""
,
POLICY_TABLE
,
pkg
);
}
public
void
deletePolicy
(
Policy
policy
)
{
deletePolicy
(
policy
.
uid
);
public
void
deletePolicy
(
int
uid
)
{
rawSQL
(
"DELETE FROM %s WHERE uid=%d"
,
POLICY_TABLE
,
uid
);
}
public
Policy
getPolicy
(
int
uid
)
{
List
<
ContentValues
>
res
=
SQL
(
"SELECT * FROM %s WHERE uid=%d"
,
POLICY_TABLE
,
uid
);
if
(!
res
.
isEmpty
())
{
try
{
return
new
Policy
(
res
.
get
(
0
),
pm
);
}
catch
(
PackageManager
.
NameNotFoundException
e
)
{
deletePolicy
(
uid
);
}
}
return
null
;
}
public
void
updatePolicy
(
Policy
policy
)
{
rawSQL
(
"REPLACE INTO %s %s"
,
POLICY_TABLE
,
toSQL
(
policy
.
getContentValues
()));
}
public
List
<
Policy
>
getPolicyList
()
{
List
<
Policy
>
list
=
new
ArrayList
<>();
for
(
ContentValues
values
:
SQL
(
"SELECT * FROM %s WHERE uid/100000=%d"
,
POLICY_TABLE
,
Const
.
USER_ID
))
{
try
{
list
.
add
(
new
Policy
(
values
,
pm
));
}
catch
(
PackageManager
.
NameNotFoundException
e
)
{
deletePolicy
(
values
.
getAsInteger
(
"uid"
));
}
}
Collections
.
sort
(
list
);
return
list
;
}
public
void
deletePolicy
(
String
pkg
)
{}
public
void
deletePolicy
(
int
uid
)
{}
public
List
<
List
<
SuLogEntry
>>
getLogs
()
{
List
<
List
<
SuLogEntry
>>
ret
=
new
ArrayList
<>();
List
<
SuLogEntry
>
list
=
null
;
String
dateString
=
null
,
newString
;
for
(
ContentValues
values
:
SQL
(
"SELECT * FROM %s ORDER BY time DESC"
,
LOG_TABLE
))
{
Date
date
=
new
Date
(
values
.
getAsLong
(
"time"
));
newString
=
DateFormat
.
getDateInstance
(
DateFormat
.
MEDIUM
,
LocaleManager
.
locale
).
format
(
date
);
if
(!
TextUtils
.
equals
(
dateString
,
newString
))
{
dateString
=
newString
;
list
=
new
ArrayList
<>();
ret
.
add
(
list
);
}
list
.
add
(
new
SuLogEntry
(
values
));
}
return
ret
;
}
public
void
addLog
(
SuLogEntry
log
)
{
rawSQL
(
"INSERT INTO %s %s"
,
LOG_TABLE
,
toSQL
(
log
.
getContentValues
()));
}
public
Policy
getPolicy
(
int
uid
)
{
return
null
;
}
public
void
updatePolicy
(
Policy
policy
)
{}
public
void
clearLogs
()
{
rawSQL
(
"DELETE FROM %s"
,
LOG_TABLE
);
}
public
List
<
Policy
>
getPolicyList
()
{
return
Collections
.
emptyList
();
}
public
List
<
List
<
SuLogEntry
>>
getLogs
()
{
return
Collections
.
emptyList
();
}
public
void
setSettings
(
String
key
,
int
value
)
{
ContentValues
data
=
new
ContentValues
();
data
.
put
(
"key"
,
key
);
data
.
put
(
"value"
,
value
);
rawSQL
(
"REPLACE INTO %s %s"
,
SETTINGS_TABLE
,
toSQL
(
data
));
}
public
void
addLog
(
SuLogEntry
log
)
{}
public
void
clearLogs
()
{}
public
int
getSettings
(
String
key
,
int
defaultValue
)
{
List
<
ContentValues
>
res
=
SQL
(
"SELECT value FROM %s WHERE key=\"%s\""
,
SETTINGS_TABLE
,
key
);
if
(
res
.
isEmpty
())
return
defaultValue
;
return
res
.
get
(
0
).
getAsInteger
(
"value"
);
}
public
void
setSettings
(
String
key
,
int
value
)
{}
public
int
getSettings
(
String
key
,
int
defaultValue
)
{
return
defaultValue
;
}
public
void
setStrings
(
String
key
,
String
value
)
{
if
(
value
==
null
)
{
rawSQL
(
"DELETE FROM %s WHERE key=\"%s\""
,
STRINGS_TABLE
,
key
);
return
;
}
ContentValues
data
=
new
ContentValues
();
data
.
put
(
"key"
,
key
);
data
.
put
(
"value"
,
value
);
rawSQL
(
"REPLACE INTO %s %s"
,
STRINGS_TABLE
,
toSQL
(
data
));
}
public
void
setStrings
(
String
key
,
String
value
)
{}
public
String
getStrings
(
String
key
,
String
defaultValue
)
{
return
defaultValue
;
}
public
String
getStrings
(
String
key
,
String
defaultValue
)
{
List
<
ContentValues
>
res
=
SQL
(
"SELECT value FROM %s WHERE key=\"%s\""
,
STRINGS_TABLE
,
key
);
if
(
res
.
isEmpty
())
return
defaultValue
;
return
res
.
get
(
0
).
getAsString
(
"value"
);
}
}
app/src/full/java/com/topjohnwu/magisk/database/MagiskDBCmdline.java
deleted
100644 → 0
View file @
a54eaf53
package
com
.
topjohnwu
.
magisk
.
database
;
import
android.content.ContentValues
;
import
android.content.pm.PackageManager
;
import
android.text.TextUtils
;
import
com.topjohnwu.magisk.Const
;
import
com.topjohnwu.magisk.Data
;
import
com.topjohnwu.magisk.container.Policy
;
import
com.topjohnwu.magisk.container.SuLogEntry
;
import
com.topjohnwu.magisk.utils.LocaleManager
;
import
com.topjohnwu.magisk.utils.Utils
;
import
com.topjohnwu.superuser.Shell
;
import
java.text.DateFormat
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Map
;
public
class
MagiskDBCmdline
extends
MagiskDB
{
private
PackageManager
pm
;
public
MagiskDBCmdline
()
{
pm
=
Data
.
MM
().
getPackageManager
();
}
private
List
<
String
>
rawSQL
(
String
fmt
,
Object
...
args
)
{
return
Shell
.
su
(
"magisk --sqlite '"
+
Utils
.
fmt
(
fmt
,
args
)
+
"'"
).
exec
().
getOut
();
}
private
List
<
ContentValues
>
SQL
(
String
fmt
,
Object
...
args
)
{
List
<
ContentValues
>
list
=
new
ArrayList
<>();
for
(
String
raw
:
rawSQL
(
fmt
,
args
))
{
ContentValues
values
=
new
ContentValues
();
String
[]
cols
=
raw
.
split
(
"\\|"
);
for
(
String
col
:
cols
)
{
String
[]
pair
=
col
.
split
(
"="
,
2
);
if
(
pair
.
length
!=
2
)
continue
;
values
.
put
(
pair
[
0
],
pair
[
1
]);
}
list
.
add
(
values
);
}
return
list
;
}
private
String
toSQL
(
ContentValues
values
)
{
StringBuilder
keys
=
new
StringBuilder
(),
vals
=
new
StringBuilder
();
keys
.
append
(
'('
);
vals
.
append
(
"VALUES("
);
boolean
first
=
true
;
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
values
.
valueSet
())
{
if
(!
first
)
{
keys
.
append
(
','
);
vals
.
append
(
','
);
}
else
{
first
=
false
;
}
keys
.
append
(
entry
.
getKey
());
vals
.
append
(
'"'
);
vals
.
append
(
entry
.
getValue
());
vals
.
append
(
'"'
);
}
keys
.
append
(
')'
);
vals
.
append
(
')'
);
keys
.
append
(
vals
);
return
keys
.
toString
();
}
@Override
public
void
clearOutdated
()
{
rawSQL
(
"DELETE FROM %s WHERE until > 0 AND until < %d;"
+
"DELETE FROM %s WHERE time < %d"
,
POLICY_TABLE
,
System
.
currentTimeMillis
()
/
1000
,
LOG_TABLE
,
System
.
currentTimeMillis
()
-
Data
.
suLogTimeout
*
86400000
);
}
@Override
public
void
deletePolicy
(
String
pkg
)
{
rawSQL
(
"DELETE FROM %s WHERE package_name=\"%s\""
,
POLICY_TABLE
,
pkg
);
}
@Override
public
void
deletePolicy
(
int
uid
)
{
rawSQL
(
"DELETE FROM %s WHERE uid=%d"
,
POLICY_TABLE
,
uid
);
}
@Override
public
Policy
getPolicy
(
int
uid
)
{
List
<
ContentValues
>
res
=
SQL
(
"SELECT * FROM %s WHERE uid=%d"
,
POLICY_TABLE
,
uid
);
if
(!
res
.
isEmpty
())
{
try
{
return
new
Policy
(
res
.
get
(
0
),
pm
);
}
catch
(
PackageManager
.
NameNotFoundException
e
)
{
deletePolicy
(
uid
);
}
}
return
null
;
}
@Override
public
void
updatePolicy
(
Policy
policy
)
{
rawSQL
(
"REPLACE INTO %s %s"
,
POLICY_TABLE
,
toSQL
(
policy
.
getContentValues
()));
}
@Override
public
List
<
Policy
>
getPolicyList
()
{
List
<
Policy
>
list
=
new
ArrayList
<>();
for
(
ContentValues
values
:
SQL
(
"SELECT * FROM %s WHERE uid/100000=%d"
,
POLICY_TABLE
,
Const
.
USER_ID
))
{
try
{
list
.
add
(
new
Policy
(
values
,
pm
));
}
catch
(
PackageManager
.
NameNotFoundException
e
)
{
deletePolicy
(
values
.
getAsInteger
(
"uid"
));
}
}
Collections
.
sort
(
list
);
return
list
;
}
@Override
public
List
<
List
<
SuLogEntry
>>
getLogs
()
{
List
<
List
<
SuLogEntry
>>
ret
=
new
ArrayList
<>();
List
<
SuLogEntry
>
list
=
null
;
String
dateString
=
null
,
newString
;
for
(
ContentValues
values
:
SQL
(
"SELECT * FROM %s ORDER BY time DESC"
,
LOG_TABLE
))
{
Date
date
=
new
Date
(
values
.
getAsLong
(
"time"
));
newString
=
DateFormat
.
getDateInstance
(
DateFormat
.
MEDIUM
,
LocaleManager
.
locale
).
format
(
date
);
if
(!
TextUtils
.
equals
(
dateString
,
newString
))
{
dateString
=
newString
;
list
=
new
ArrayList
<>();
ret
.
add
(
list
);
}
list
.
add
(
new
SuLogEntry
(
values
));
}
return
ret
;
}
@Override
public
void
addLog
(
SuLogEntry
log
)
{
rawSQL
(
"INSERT INTO %s %s"
,
LOG_TABLE
,
toSQL
(
log
.
getContentValues
()));
}
@Override
public
void
clearLogs
()
{
rawSQL
(
"DELETE FROM %s"
,
LOG_TABLE
);
}
@Override
public
void
setSettings
(
String
key
,
int
value
)
{
ContentValues
data
=
new
ContentValues
();
data
.
put
(
"key"
,
key
);
data
.
put
(
"value"
,
value
);
rawSQL
(
"REPLACE INTO %s %s"
,
SETTINGS_TABLE
,
toSQL
(
data
));
}
@Override
public
int
getSettings
(
String
key
,
int
defaultValue
)
{
List
<
ContentValues
>
res
=
SQL
(
"SELECT value FROM %s WHERE key=\"%s\""
,
SETTINGS_TABLE
,
key
);
if
(
res
.
isEmpty
())
return
defaultValue
;
return
res
.
get
(
0
).
getAsInteger
(
"value"
);
}
@Override
public
void
setStrings
(
String
key
,
String
value
)
{
if
(
value
==
null
)
{
rawSQL
(
"DELETE FROM %s WHERE key=\"%s\""
,
STRINGS_TABLE
,
key
);
return
;
}
ContentValues
data
=
new
ContentValues
();
data
.
put
(
"key"
,
key
);
data
.
put
(
"value"
,
value
);
rawSQL
(
"REPLACE INTO %s %s"
,
STRINGS_TABLE
,
toSQL
(
data
));
}
@Override
public
String
getStrings
(
String
key
,
String
defaultValue
)
{
List
<
ContentValues
>
res
=
SQL
(
"SELECT value FROM %s WHERE key=\"%s\""
,
STRINGS_TABLE
,
key
);
if
(
res
.
isEmpty
())
return
defaultValue
;
return
res
.
get
(
0
).
getAsString
(
"value"
);
}
}
app/src/full/java/com/topjohnwu/magisk/database/MagiskDBLegacy.java
deleted
100644 → 0
View file @
a54eaf53
This diff is collapsed.
Click to expand it.
app/src/full/java/com/topjohnwu/magisk/fragments/MagiskFragment.java
View file @
c91f809e
...
...
@@ -271,8 +271,7 @@ public class MagiskFragment extends BaseFragment
if
(
Data
.
remoteMagiskVersionCode
>
Data
.
magiskVersionCode
||
Data
.
remoteManagerVersionCode
>
BuildConfig
.
VERSION_CODE
)
{
install
();
}
else
if
(
Data
.
remoteMagiskVersionCode
>=
Const
.
MAGISK_VER
.
FIX_ENV
&&
!
ShellUtils
.
fastCmdResult
(
"env_check"
))
{
}
else
if
(!
ShellUtils
.
fastCmdResult
(
"env_check"
))
{
new
EnvFixDialog
(
requireActivity
()).
show
();
}
}
...
...
app/src/full/java/com/topjohnwu/magisk/receivers/GeneralReceiver.java
View file @
c91f809e
...
...
@@ -36,12 +36,11 @@ public class GeneralReceiver extends BroadcastReceiver {
case
"request"
:
Intent
i
=
new
Intent
(
mm
,
Data
.
classMap
.
get
(
SuRequestActivity
.
class
))
.
putExtra
(
"socket"
,
intent
.
getStringExtra
(
"socket"
))
.
putExtra
(
"version"
,
2
)
.
addFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
mm
.
startActivity
(
i
);
break
;
case
"log"
:
SuConnector
.
handleLogs
(
intent
,
2
);
SuConnector
.
handleLogs
(
intent
);
break
;
case
"notify"
:
SuConnector
.
handleNotify
(
intent
);
...
...
app/src/full/java/com/topjohnwu/magisk/superuser/RequestActivity.java
deleted
100644 → 0
View file @
a54eaf53
package
com
.
topjohnwu
.
magisk
.
superuser
;
import
android.content.Intent
;
import
android.os.Bundle
;
import
com.topjohnwu.magisk.Data
;
import
com.topjohnwu.magisk.SuRequestActivity
;
import
com.topjohnwu.magisk.components.BaseActivity
;
public
class
RequestActivity
extends
BaseActivity
{
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
Intent
intent
=
new
Intent
(
this
,
Data
.
classMap
.
get
(
SuRequestActivity
.
class
))
.
putExtra
(
"socket"
,
getIntent
().
getStringExtra
(
"socket"
))
.
addFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
startActivity
(
intent
);
finish
();
}
}
app/src/full/java/com/topjohnwu/magisk/superuser/SuReceiver.java
deleted
100644 → 0
View file @
a54eaf53
package
com
.
topjohnwu
.
magisk
.
superuser
;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
import
android.content.Intent
;
import
com.topjohnwu.magisk.utils.SuConnector
;
public
class
SuReceiver
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
if
(
intent
!=
null
)
SuConnector
.
handleLogs
(
intent
,
1
);
}
}
app/src/full/java/com/topjohnwu/magisk/utils/BootSigner.java
View file @
c91f809e
...
...
@@ -9,7 +9,6 @@ import androidx.annotation.Keep;
public
class
BootSigner
{
@Keep
public
static
void
main
(
String
[]
args
)
throws
Exception
{
if
(
args
.
length
>
0
&&
"-verify"
.
equals
(
args
[
0
]))
{
String
certPath
=
""
;
...
...
app/src/full/java/com/topjohnwu/magisk/utils/RootUtils.java
View file @
c91f809e
...
...
@@ -21,10 +21,6 @@ public class RootUtils extends Shell.Initializer {
BusyBox
.
BB_PATH
=
new
File
(
Const
.
BUSYBOX_PATH
);
}
public
static
void
uninstallPkg
(
String
pkg
)
{
Shell
.
su
(
"db_clean "
+
Const
.
USER_ID
,
"pm uninstall "
+
pkg
).
exec
();
}
public
static
void
rmAndLaunch
(
String
rm
,
String
launch
)
{
Shell
.
su
(
Utils
.
fmt
(
"(rm_launch %d %s %s)&"
,
Const
.
USER_ID
,
rm
,
launch
)).
exec
();
}
...
...
@@ -33,9 +29,6 @@ public class RootUtils extends Shell.Initializer {
public
boolean
onInit
(
Context
context
,
@NonNull
Shell
shell
)
{
Shell
.
Job
job
=
shell
.
newJob
();
if
(
shell
.
isRoot
())
{
if
(!
new
SuFile
(
"/sbin/.magisk"
).
exists
())
job
.
add
(
"ln -s /sbin/.core /sbin/.magisk"
);
job
.
add
(
context
.
getResources
().
openRawResource
(
R
.
raw
.
util_functions
))
.
add
(
context
.
getResources
().
openRawResource
(
R
.
raw
.
utils
));
Const
.
MAGISK_DISABLE_FILE
=
new
SuFile
(
"/cache/.disable_magisk"
);
...
...
app/src/full/java/com/topjohnwu/magisk/utils/SuConnector.java
View file @
c91f809e
...
...
@@ -3,6 +3,7 @@ package com.topjohnwu.magisk.utils;
import
android.content.Intent
;
import
android.content.pm.PackageManager
;
import
android.net.LocalSocket
;
import
android.net.LocalSocketAddress
;
import
android.os.Bundle
;
import
android.os.Process
;
import
android.text.TextUtils
;
...
...
@@ -24,12 +25,13 @@ import java.util.Date;
public
abstract
class
SuConnector
{
pr
otected
LocalSocket
socket
=
new
LocalSocket
()
;
pr
ivate
LocalSocket
socket
;
protected
DataOutputStream
out
;
protected
DataInputStream
in
;
public
SuConnector
(
String
name
)
throws
IOException
{
connect
(
name
);
socket
=
new
LocalSocket
();
socket
.
connect
(
new
LocalSocketAddress
(
name
,
LocalSocketAddress
.
Namespace
.
ABSTRACT
));
out
=
new
DataOutputStream
(
new
BufferedOutputStream
(
socket
.
getOutputStream
()));
in
=
new
DataInputStream
(
new
BufferedInputStream
(
socket
.
getInputStream
()));
}
...
...
@@ -66,11 +68,9 @@ public abstract class SuConnector {
}
catch
(
IOException
ignored
)
{
}
}
public
abstract
void
connect
(
String
name
)
throws
IOException
;
protected
abstract
void
onResponse
()
throws
IOException
;
public
static
void
handleLogs
(
Intent
intent
,
int
version
)
{
public
static
void
handleLogs
(
Intent
intent
)
{
int
fromUid
=
intent
.
getIntExtra
(
"from.uid"
,
-
1
);
if
(
fromUid
<
0
)
return
;
...
...
@@ -97,24 +97,9 @@ public abstract class SuConnector {
notify
=
policy
.
notification
;
}
if
(
version
==
1
)
{
String
action
=
intent
.
getStringExtra
(
"action"
);
if
(
action
==
null
)
return
;
switch
(
action
)
{
case
"allow"
:
policy
.
policy
=
Policy
.
ALLOW
;
break
;
case
"deny"
:
policy
.
policy
=
Policy
.
DENY
;
break
;
default
:
return
;
}
}
else
{
policy
.
policy
=
data
.
getInt
(
"policy"
,
-
1
);
if
(
policy
.
policy
<
0
)
return
;
}
if
(
notify
)
handleNotify
(
policy
);
...
...
app/src/full/res/raw/utils.sh
View file @
c91f809e
db_sepatch
()
{
magiskpolicy
--live
'create magisk_file'
'attradd magisk_file mlstrustedobject'
\
'allow * magisk_file file *'
'allow * magisk_file dir *'
\
'allow magisk_file * filesystem associate'
}
db_clean
()
{
local
USERID
=
$1
local
DIR
=
"/sbin/.magisk/db-
${
USERID
}
"
umount
-l
/data/user
*
/
*
/
*
/databases/su.db
$DIR
$DIR
/
*
rm
-rf
$DIR
[
"
$USERID
"
=
"*"
]
&&
rm
-fv
/data/adb/magisk.db
*
}
db_init
()
{
# Temporary let the folder rw by anyone
chcon
u:object_r:magisk_file:s0 /data/adb
chmod
777 /data/adb
}
db_restore
()
{
chmod
700 /data/adb
magisk
--restorecon
}
db_setup
()
{
local
USER
=
$1
local
USERID
=
$((
$USER
/
100000
))
local
DIR
=
/sbin/.magisk/db-
${
USERID
}
mkdir
-p
$DIR
touch
$DIR
/magisk.db
mount
-o
bind
/data/adb/magisk.db
$DIR
/magisk.db
rm
-f
/data/adb/magisk.db-
*
chcon
u:object_r:magisk_file:s0
$DIR
$DIR
/
*
chmod
700
$DIR
chown
$USER
.
$USER
$DIR
chmod
666
$DIR
/
*
}
env_check
()
{
for
file
in
busybox magisk magiskboot magiskinit util_functions.sh boot_patch.sh
;
do
[
-f
/data/adb/magisk/
$file
]
||
return
1
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment