100 lines
2.8 KiB
JavaScript
100 lines
2.8 KiB
JavaScript
const { app } = require('electron')
|
|
const { networkInterfaces } = require('os')
|
|
const { randomBytes, createCipheriv, createDecipheriv } = require('crypto')
|
|
const path = require('path')
|
|
const getStore = require('@common/store')
|
|
const STORE_NAME = 'sync'
|
|
|
|
exports.getAddress = () => {
|
|
const nets = networkInterfaces()
|
|
const results = []
|
|
// console.log(nets)
|
|
|
|
for (const name of Object.keys(nets)) {
|
|
for (const net of nets[name]) {
|
|
// Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses
|
|
if (net.family === 'IPv4' && !net.internal) {
|
|
results.push(net.address)
|
|
}
|
|
}
|
|
}
|
|
return results
|
|
}
|
|
|
|
let serverId
|
|
exports.getServerId = () => {
|
|
if (serverId) return serverId
|
|
const store = getStore(STORE_NAME)
|
|
serverId = store.get('serverId')
|
|
if (!serverId) {
|
|
serverId = randomBytes(4 * 4).toString('base64')
|
|
store.set('serverId', serverId)
|
|
}
|
|
return serverId
|
|
}
|
|
|
|
let keyInfos
|
|
exports.createClientKeyInfo = deviceName => {
|
|
const keyInfo = {
|
|
clientId: randomBytes(4 * 4).toString('base64'),
|
|
key: randomBytes(16).toString('base64'),
|
|
iv: randomBytes(16).toString('base64'),
|
|
deviceName,
|
|
}
|
|
const store = getStore(STORE_NAME)
|
|
if (!keyInfos) keyInfos = store.get('keys') || {}
|
|
if (Object.keys(keyInfos).length > 101) throw new Error('max keys')
|
|
|
|
keyInfos[keyInfo.clientId] = keyInfo
|
|
store.set('keys', keyInfos)
|
|
return keyInfo
|
|
}
|
|
exports.setClientKeyInfo = keyInfo => {
|
|
keyInfos[keyInfo.clientId] = keyInfo
|
|
const store = getStore(STORE_NAME)
|
|
store.set('keys', keyInfos)
|
|
}
|
|
exports.getClientKeyInfo = clientId => {
|
|
if (!keyInfos) {
|
|
const store = getStore(STORE_NAME)
|
|
keyInfos = store.get('keys') || {}
|
|
}
|
|
return keyInfos[clientId] || null
|
|
}
|
|
|
|
exports.generateCode = () => {
|
|
return Math.random().toString().substring(2, 8)
|
|
}
|
|
|
|
exports.aesEncrypt = (buffer, key, iv) => {
|
|
const cipher = createCipheriv('aes-128-cbc', Buffer.from(key, 'base64'), Buffer.from(iv, 'base64'))
|
|
return Buffer.concat([cipher.update(buffer), cipher.final()]).toString('base64')
|
|
}
|
|
|
|
exports.aesDecrypt = (text, key, iv) => {
|
|
const decipher = createDecipheriv('aes-128-cbc', Buffer.from(key, 'base64'), Buffer.from(iv, 'base64'))
|
|
return Buffer.concat([decipher.update(Buffer.from(text, 'base64')), decipher.final()]).toString()
|
|
}
|
|
|
|
exports.encryptMsg = (keyInfo, msg) => {
|
|
return msg
|
|
// if (!keyInfo) return ''
|
|
// return exports.aesEncrypt(msg, keyInfo.key, keyInfo.iv)
|
|
}
|
|
|
|
exports.decryptMsg = (keyInfo, enMsg) => {
|
|
return enMsg
|
|
// if (!keyInfo) return ''
|
|
// let msg = ''
|
|
// try {
|
|
// msg = exports.aesDecrypt(enMsg, keyInfo.key, keyInfo.iv)
|
|
// } catch (err) {
|
|
// console.log(err)
|
|
// }
|
|
// return msg
|
|
}
|
|
|
|
exports.getSnapshotFilePath = keyInfo => {
|
|
return path.join(app.getPath('userData'), `snapshot-${Buffer.from(keyInfo.clientId).toString('hex').substring(0, 10)}.json`)
|
|
}
|