importbase64fromhashlibimportpbkdf2_hmacfromCrypto.CipherimportAESsaltLength=8aesCfb="aes-cfb"aesGcm="aes-gcm"encryptionAlgorithmDelimiter='*'nonceByteSize=12defdecrypt(payload,secret):alg,payload,err=deriveEncryptionAlgorithm(payload)iferrisnotNone:returnNone,erriflen(payload)<saltLength:returnNone,"Unable to compute salt"salt=payload[:saltLength]key,err=encryptionKeyToBytes(secret,salt)iferrisnotNone:returnNone,errifalg==aesCfb:returndecryptCFB(payload,key)elifalg==aesGcm:returndecryptGCM(payload,key)returnNone,NonedefencryptionKeyToBytes(secret,salt):returnpbkdf2_hmac("sha256",secret.encode("utf-8"),salt,10000,32),NonedefderiveEncryptionAlgorithm(payload):iflen(payload)==0:return"",None,"Unable to derive encryption"ifpayload[0]!=encryptionAlgorithmDelimiter.encode():returnaesCfb,payload,Nonepayload=payload[:1]defdecryptGCM(payload,key):nonce=payload[saltLength:saltLength+nonceByteSize]payload=payload[saltLength+nonceByteSize:]gcm=AES.new(key,AES.MODE_GCM,nonce,segment_size=128)returngcm.decrypt(payload).decode(),NonedefdecryptCFB(payload,key):iflen(payload)<AES.block_size:returnNone,"Payload too short"iv=payload[saltLength:saltLength+AES.block_size]payload=payload[saltLength+AES.block_size:]cipher=AES.new(key,AES.MODE_CFB,iv,segment_size=128)returncipher.decrypt(payload).decode(),Noneif__name__=="__main__":grafanaIni_secretKey="SW2YcwTIb9zpO1hoPsMm"dataSourcePassword="b0NXeVJoSXKPoSYIWt8i/GfPreRT03fO6gbMhzkPefodqe1nvGpdSROTvfHK1I3kzZy9SQnuVy9c3lVkvbyJcqRwNT6/"encrypted=base64.b64decode(dataSourcePassword.encode())pwdBytes,_=decrypt(encrypted,grafanaIni_secretKey)print(pwdBytes)
/* login */router.post('/signin',function(req,res,next){varusername=req.body.username;varpassword=req.body.password;if(username==''||password=='')returnres.json({"code":-1,"message":"Please input username and password."});if(!passwordCheck(password))returnres.json({"code":-1,"message":"Password is not valid."});db.get("SELECT * FROM users WHERE NAME = ? AND PASSWORD = ?",[username,password],function(err,row){if(err){console.log(err);returnres.json({"code":-1,"message":"Error executing SQL query"});}if(!row){returnres.json({"code":-1,"msg":"Username or password is incorrect"});}req.session.is_login=1;if(row.NAME==="admin"&&row.PASSWORD==password&&row.ACTIVE==1){req.session.is_admin=1;}returnres.json({"code":0,"message":"Login successful"});});});/* register */router.post('/signup',function(req,res,next){varusername=req.body.username;varpassword=req.body.password;if(username==''||password=='')returnres.json({"code":-1,"message":"Please input username and password."});// check if username exists
db.get("SELECT * FROM users WHERE NAME = ?",[username],function(err,row){if(err){console.log(err);returnres.json({"code":-1,"message":"Error executing SQL query"});}if(row){console.log(row)returnres.json({"code":-1,"message":"Username already exists"});}else{// in case of sql injection , I'll reset admin's password to a new random string every time.
varrandomPassword=stringRandom(100);db.run(`UPDATE users SET PASSWORD = '${randomPassword}' WHERE NAME = 'admin'`,()=>{});// insert new user
varsql=`INSERT INTO users (NAME, PASSWORD, ACTIVE) VALUES (?, '${password}', 0)`;db.run(sql,[username],function(err){if(err){console.log(err);returnres.json({"code":-1,"message":"Error executing SQL query "+sql});}returnres.json({"code":0,"message":"Sign up successful"});});}});});