2016-10-09 19:14:02 +00:00
"use strict" ;
2016-09-05 12:37:27 +00:00
const pkg = require ( "../package.json" ) ;
2016-06-08 09:26:24 +00:00
var _ = require ( "lodash" ) ;
2014-10-04 23:22:23 +00:00
var path = require ( "path" ) ;
2016-04-27 08:13:25 +00:00
var os = require ( "os" ) ;
2016-07-04 20:15:30 +00:00
var fs = require ( "fs" ) ;
2016-11-19 18:32:47 +00:00
var net = require ( "net" ) ;
2017-03-23 07:47:51 +00:00
var bcrypt = require ( "bcryptjs" ) ;
2017-06-08 18:40:17 +00:00
const colors = require ( "colors/safe" ) ;
2014-10-04 23:22:23 +00:00
2016-05-09 16:19:16 +00:00
var Helper = {
2016-06-08 09:26:24 +00:00
config : null ,
2016-04-27 08:13:25 +00:00
expandHome : expandHome ,
2017-06-22 21:09:55 +00:00
getPackagesPath : getPackagesPath ,
getPackageModulePath : getPackageModulePath ,
2017-07-06 15:33:09 +00:00
getStoragePath : getStoragePath ,
2016-05-08 06:21:31 +00:00
getUserConfigPath : getUserConfigPath ,
2016-05-15 21:13:51 +00:00
getUserLogsPath : getUserLogsPath ,
2016-05-09 16:19:16 +00:00
setHome : setHome ,
2016-09-05 12:37:27 +00:00
getVersion : getVersion ,
getGitCommit : getGitCommit ,
2016-11-19 18:32:47 +00:00
ip2hex : ip2hex ,
2017-07-10 19:47:03 +00:00
cleanIrcMessage : cleanIrcMessage ,
2016-10-21 19:00:43 +00:00
password : {
hash : passwordHash ,
compare : passwordCompare ,
requiresUpdate : passwordRequiresUpdate ,
} ,
2014-09-13 12:23:17 +00:00
} ;
2016-05-09 16:19:16 +00:00
module . exports = Helper ;
2016-06-08 09:26:24 +00:00
Helper . config = require ( path . resolve ( path . join (
_ _dirname ,
".." ,
"defaults" ,
"config.js"
) ) ) ;
2016-09-05 12:37:27 +00:00
function getVersion ( ) {
const gitCommit = getGitCommit ( ) ;
return gitCommit ? ` source ( ${ gitCommit } ) ` : ` v ${ pkg . version } ` ;
}
let _gitCommit ;
function getGitCommit ( ) {
if ( _gitCommit !== undefined ) {
return _gitCommit ;
}
try {
_gitCommit = require ( "child_process" )
. execSync ( "git rev-parse --short HEAD 2> /dev/null" ) // Returns hash of current commit
. toString ( )
. trim ( ) ;
return _gitCommit ;
} catch ( e ) {
// Not a git repository or git is not installed
_gitCommit = null ;
return null ;
}
}
2016-05-09 16:19:16 +00:00
function setHome ( homePath ) {
2017-08-15 18:57:47 +00:00
this . HOME = expandHome ( homePath ) ;
2016-05-09 16:19:16 +00:00
this . CONFIG _PATH = path . join ( this . HOME , "config.js" ) ;
this . USERS _PATH = path . join ( this . HOME , "users" ) ;
2016-06-08 09:26:24 +00:00
// Reload config from new home location
2016-07-04 20:15:30 +00:00
if ( fs . existsSync ( this . CONFIG _PATH ) ) {
var userConfig = require ( this . CONFIG _PATH ) ;
2017-07-06 12:00:43 +00:00
this . config = _ . merge ( this . config , userConfig ) ;
2016-07-04 20:15:30 +00:00
}
2016-12-10 08:53:06 +00:00
2017-06-08 18:40:17 +00:00
if ( ! this . config . displayNetwork && ! this . config . lockNetwork ) {
this . config . lockNetwork = true ;
log . warn ( ` ${ colors . bold ( "displayNetwork" ) } and ${ colors . bold ( "lockNetwork" ) } are false, setting ${ colors . bold ( "lockNetwork" ) } to true. ` ) ;
}
2016-12-10 08:53:06 +00:00
// TODO: Remove in future release
if ( this . config . debug === true ) {
log . warn ( "debug option is now an object, see defaults file for more information." ) ;
this . config . debug = { ircFramework : true } ;
}
2017-09-19 09:08:08 +00:00
// TODO: Remove in future release
// Backwards compatibility for old way of specifying themes in settings
if ( this . config . theme . includes ( ".css" ) ) {
log . warn ( ` Referring to CSS files in the ${ colors . green ( "theme" ) } setting of ${ colors . green ( Helper . CONFIG _PATH ) } is ${ colors . bold ( "deprecated" ) } and will be removed in a future version. ` ) ;
} else {
this . config . theme = ` themes/ ${ this . config . theme } .css ` ;
}
2016-05-09 16:19:16 +00:00
}
2016-05-08 06:21:31 +00:00
function getUserConfigPath ( name ) {
return path . join ( this . USERS _PATH , name + ".json" ) ;
}
2016-05-15 21:13:51 +00:00
function getUserLogsPath ( name , network ) {
return path . join ( this . HOME , "logs" , name , network ) ;
}
2017-07-06 15:33:09 +00:00
function getStoragePath ( ) {
return path . join ( this . HOME , "storage" ) ;
}
2017-06-22 21:09:55 +00:00
function getPackagesPath ( ) {
return path . join ( this . HOME , "packages" , "node_modules" ) ;
}
function getPackageModulePath ( packageName ) {
return path . join ( Helper . getPackagesPath ( ) , packageName ) ;
}
2016-11-19 18:32:47 +00:00
function ip2hex ( address ) {
// no ipv6 support
if ( ! net . isIPv4 ( address ) ) {
return "00000000" ;
}
return address . split ( "." ) . map ( function ( octet ) {
var hex = parseInt ( octet , 10 ) . toString ( 16 ) ;
if ( hex . length === 1 ) {
hex = "0" + hex ;
}
return hex ;
} ) . join ( "" ) ;
}
2016-05-08 06:21:31 +00:00
function expandHome ( shortenedPath ) {
2017-04-17 19:48:28 +00:00
if ( ! shortenedPath ) {
return "" ;
}
2016-04-27 08:13:25 +00:00
2017-08-16 07:06:20 +00:00
const home = os . homedir ( ) . replace ( "$" , "$$$$" ) ;
2016-05-08 06:21:31 +00:00
return path . resolve ( shortenedPath . replace ( /^~($|\/|\\)/ , home + "$1" ) ) ;
2016-04-27 08:13:25 +00:00
}
2016-10-21 19:00:43 +00:00
2017-07-10 19:47:03 +00:00
function cleanIrcMessage ( message ) {
// TODO: This does not strip hex based colours
return message . replace ( /\x02|\x1D|\x1F|\x16|\x0F|\x03(?:[0-9]{1,2}(?:,[0-9]{1,2})?)?/g , "" ) ;
}
2016-10-21 19:00:43 +00:00
function passwordRequiresUpdate ( password ) {
return bcrypt . getRounds ( password ) !== 11 ;
}
function passwordHash ( password ) {
return bcrypt . hashSync ( password , bcrypt . genSaltSync ( 11 ) ) ;
}
function passwordCompare ( password , expected ) {
2017-03-23 07:47:51 +00:00
return bcrypt . compare ( password , expected ) ;
2016-10-21 19:00:43 +00:00
}