8
8
9
9
const app = require ( 'electron' ) . app ;
10
10
const path = require ( 'path' ) ;
11
- const fs = require ( 'fs' ) ;
11
+ const fs = require ( 'original- fs' ) ;
12
12
13
13
const userDataDir = app . getPath ( 'userData' ) ;
14
14
const userDataAppArchivePath = path . join ( userDataDir , 'app.asar' ) ;
15
15
let entryPointDir = __dirname ;
16
16
17
- if ( fs . existsSync ( userDataAppArchivePath ) ) {
18
- let versionLocal = require ( './package.json' ) . version ;
17
+ try {
18
+ const appFilePath = entryPointDir . endsWith ( 'app.asar' ) ? entryPointDir : __filename ;
19
+ let userPackageStat ;
19
20
try {
20
- let versionUserData = require ( path . join ( userDataAppArchivePath , 'package.json' ) ) . version ;
21
- versionLocal = versionLocal . split ( '.' ) ;
22
- versionUserData = versionUserData . split ( '.' ) ;
23
- for ( let i = 0 ; i < versionLocal . length ; i ++ ) {
24
- if ( + versionUserData [ i ] > + versionLocal [ i ] ) {
25
- entryPointDir = userDataAppArchivePath ;
26
- try {
27
- validateSignature ( userDataDir ) ;
28
- } catch ( e ) {
29
- exitWithError ( 'Error validating signatures: ' + e ) ;
21
+ userPackageStat = fs . statSync ( userDataAppArchivePath ) ;
22
+ } catch ( e ) { }
23
+ if ( userPackageStat ) {
24
+ const packageStat = fs . statSync ( appFilePath ) ;
25
+ const userPackageStatTime = Math . max ( userPackageStat . mtime . getTime ( ) , userPackageStat . ctime . getTime ( ) ) ;
26
+ const packageStatTime = Math . max ( packageStat . mtime . getTime ( ) , packageStat . ctime . getTime ( ) ) ;
27
+ if ( userPackageStatTime > packageStatTime ) {
28
+ let versionLocal = require ( './package.json' ) . version ;
29
+ let versionUserData = require ( path . join ( userDataAppArchivePath , 'package.json' ) ) . version ;
30
+ versionLocal = versionLocal . split ( '.' ) ;
31
+ versionUserData = versionUserData . split ( '.' ) ;
32
+ for ( let i = 0 ; i < versionLocal . length ; i ++ ) {
33
+ if ( + versionUserData [ i ] > + versionLocal [ i ] ) {
34
+ entryPointDir = userDataAppArchivePath ;
35
+ try {
36
+ validateSignature ( userDataDir ) ;
37
+ } catch ( e ) {
38
+ exitWithError ( 'Error validating signatures: ' + e ) ;
39
+ }
40
+ break ;
41
+ }
42
+ if ( + versionUserData [ i ] < + versionLocal [ i ] ) {
43
+ break ;
30
44
}
31
- break ;
32
- }
33
- if ( + versionUserData [ i ] < + versionLocal [ i ] ) {
34
- break ;
35
45
}
36
46
}
37
- } catch ( e ) {
38
- console . error ( 'Error reading user file version' , e ) ; // eslint-disable-line no-console
39
47
}
48
+ } catch ( e ) {
49
+ console . error ( 'Error reading user file version' , e ) ; // eslint-disable-line no-console
40
50
}
51
+ const entryPointFile = path . join ( entryPointDir , 'app.js' ) ;
52
+ require ( entryPointFile ) ;
41
53
42
54
function validateSignature ( appPath ) {
43
- const fs = require ( 'original-fs' ) ;
44
55
const signatures = JSON . parse ( fs . readFileSync ( path . join ( appPath , 'signatures.json' ) ) ) ;
45
56
const selfSignature = signatures . kwResSelf ;
46
57
if ( ! selfSignature || ! signatures [ 'app.asar' ] ) {
@@ -58,8 +69,11 @@ function validateSignature(appPath) {
58
69
59
70
function validateDataSignature ( data , signature , name ) {
60
71
const crypto = require ( 'crypto' ) ;
61
- const publicKey = 'PUBLIC_KEY_CONTENT' ;
62
72
const verify = crypto . createVerify ( 'RSA-SHA256' ) ;
73
+ let publicKey = '@@PUBLIC_KEY_CONTENT' ;
74
+ if ( publicKey . startsWith ( '@@' ) ) {
75
+ publicKey = fs . readFileSync ( 'app/resources/public-key.pem' , { encoding : 'utf8' } ) . trim ( ) ;
76
+ }
63
77
verify . write ( data ) ;
64
78
verify . end ( ) ;
65
79
signature = Buffer . from ( signature , 'base64' ) ;
@@ -72,6 +86,3 @@ function exitWithError(err) {
72
86
console . error ( err ) ; // eslint-disable-line no-console
73
87
process . exit ( 1 ) ;
74
88
}
75
-
76
- const entryPointFile = path . join ( entryPointDir , 'app.js' ) ;
77
- require ( entryPointFile ) ;
0 commit comments