瀏覽代碼

Split passwd into its' own subpackage

tags/v0.9.2-beta
Daniel Oaks 6 年之前
父節點
當前提交
68b1dc9e72
共有 7 個檔案被更改,包括 37 行新增29 行删除
  1. 2
    1
      irc/accountreg.go
  2. 4
    5
      irc/config.go
  3. 3
    1
      irc/database.go
  4. 20
    16
      irc/passwd/salted.go
  5. 1
    1
      irc/passwd/unsalted.go
  6. 5
    4
      irc/server.go
  7. 2
    1
      oragono.go

+ 2
- 1
irc/accountreg.go 查看文件

@@ -14,6 +14,7 @@ import (
14 14
 
15 15
 	"github.com/goshuirc/irc-go/ircfmt"
16 16
 	"github.com/goshuirc/irc-go/ircmsg"
17
+	"github.com/oragono/oragono/irc/passwd"
17 18
 	"github.com/oragono/oragono/irc/sno"
18 19
 	"github.com/tidwall/buntdb"
19 20
 )
@@ -224,7 +225,7 @@ func accRegisterHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b
224 225
 		var creds AccountCredentials
225 226
 
226 227
 		// always set passphrase salt
227
-		creds.PassphraseSalt, err = NewSalt()
228
+		creds.PassphraseSalt, err = passwd.NewSalt()
228 229
 		if err != nil {
229 230
 			return fmt.Errorf("Could not create passphrase salt: %s", err.Error())
230 231
 		}

+ 4
- 5
irc/config.go 查看文件

@@ -14,12 +14,11 @@ import (
14 14
 	"strings"
15 15
 	"time"
16 16
 
17
+	"code.cloudfoundry.org/bytefmt"
17 18
 	"github.com/oragono/oragono/irc/custime"
18 19
 	"github.com/oragono/oragono/irc/logger"
20
+	"github.com/oragono/oragono/irc/passwd"
19 21
 	"github.com/oragono/oragono/irc/utils"
20
-
21
-	"code.cloudfoundry.org/bytefmt"
22
-
23 22
 	"gopkg.in/yaml.v2"
24 23
 )
25 24
 
@@ -48,7 +47,7 @@ func (conf *TLSListenConfig) Config() (*tls.Config, error) {
48 47
 
49 48
 // PasswordBytes returns the bytes represented by the password hash.
50 49
 func (conf *PassConfig) PasswordBytes() []byte {
51
-	bytes, err := DecodePasswordHash(conf.Password)
50
+	bytes, err := passwd.DecodePasswordHash(conf.Password)
52 51
 	if err != nil {
53 52
 		log.Fatal("decode password error: ", err)
54 53
 	}
@@ -102,7 +101,7 @@ type OperConfig struct {
102 101
 
103 102
 // PasswordBytes returns the bytes represented by the password hash.
104 103
 func (conf *OperConfig) PasswordBytes() []byte {
105
-	bytes, err := DecodePasswordHash(conf.Password)
104
+	bytes, err := passwd.DecodePasswordHash(conf.Password)
106 105
 	if err != nil {
107 106
 		log.Fatal("decode password error: ", err)
108 107
 	}

+ 3
- 1
irc/database.go 查看文件

@@ -11,6 +11,8 @@ import (
11 11
 	"os"
12 12
 	"strings"
13 13
 
14
+	"github.com/oragono/oragono/irc/passwd"
15
+
14 16
 	"github.com/tidwall/buntdb"
15 17
 )
16 18
 
@@ -36,7 +38,7 @@ func InitDB(path string) {
36 38
 
37 39
 	err = store.Update(func(tx *buntdb.Tx) error {
38 40
 		// set base db salt
39
-		salt, err := NewSalt()
41
+		salt, err := passwd.NewSalt()
40 42
 		encodedSalt := base64.StdEncoding.EncodeToString(salt)
41 43
 		if err != nil {
42 44
 			log.Fatal("Could not generate cryptographically-secure salt for the user:", err.Error())

irc/password_salted.go → irc/passwd/salted.go 查看文件

@@ -1,7 +1,7 @@
1 1
 // Copyright (c) 2016 Daniel Oaks <daniel@danieloaks.net>
2 2
 // released under the MIT license
3 3
 
4
-package irc
4
+package passwd
5 5
 
6 6
 import (
7 7
 	"crypto/rand"
@@ -9,8 +9,12 @@ import (
9 9
 	"golang.org/x/crypto/bcrypt"
10 10
 )
11 11
 
12
-const newSaltLen = 30
13
-const defaultPasswordCost = 14
12
+const (
13
+	// newSaltLen is how many bytes long newly-generated salts are.
14
+	newSaltLen = 30
15
+	// defaultPasswordCost is the bcrypt cost we use for passwords.
16
+	defaultPasswordCost = 14
17
+)
14 18
 
15 19
 // NewSalt returns a salt for crypto uses.
16 20
 func NewSalt() ([]byte, error) {
@@ -25,22 +29,22 @@ func NewSalt() ([]byte, error) {
25 29
 	return salt, nil
26 30
 }
27 31
 
28
-// PasswordManager supports the hashing and comparing of passwords with the given salt.
29
-type PasswordManager struct {
32
+// SaltedManager supports the hashing and comparing of passwords with the given salt.
33
+type SaltedManager struct {
30 34
 	salt []byte
31 35
 }
32 36
 
33
-// NewPasswordManager returns a new PasswordManager with the given salt.
34
-func NewPasswordManager(salt []byte) PasswordManager {
35
-	var pwm PasswordManager
36
-	pwm.salt = salt
37
-	return pwm
37
+// NewSaltedManager returns a new SaltedManager with the given salt.
38
+func NewSaltedManager(salt []byte) SaltedManager {
39
+	var sm SaltedManager
40
+	sm.salt = salt
41
+	return sm
38 42
 }
39 43
 
40 44
 // assemblePassword returns an assembled slice of bytes for the given password details.
41
-func (pwm *PasswordManager) assemblePassword(specialSalt []byte, password string) []byte {
45
+func (sm *SaltedManager) assemblePassword(specialSalt []byte, password string) []byte {
42 46
 	var assembledPasswordBytes []byte
43
-	assembledPasswordBytes = append(assembledPasswordBytes, pwm.salt...)
47
+	assembledPasswordBytes = append(assembledPasswordBytes, sm.salt...)
44 48
 	assembledPasswordBytes = append(assembledPasswordBytes, '-')
45 49
 	assembledPasswordBytes = append(assembledPasswordBytes, specialSalt...)
46 50
 	assembledPasswordBytes = append(assembledPasswordBytes, '-')
@@ -49,14 +53,14 @@ func (pwm *PasswordManager) assemblePassword(specialSalt []byte, password string
49 53
 }
50 54
 
51 55
 // GenerateFromPassword encrypts the given password.
52
-func (pwm *PasswordManager) GenerateFromPassword(specialSalt []byte, password string) ([]byte, error) {
53
-	assembledPasswordBytes := pwm.assemblePassword(specialSalt, password)
56
+func (sm *SaltedManager) GenerateFromPassword(specialSalt []byte, password string) ([]byte, error) {
57
+	assembledPasswordBytes := sm.assemblePassword(specialSalt, password)
54 58
 	return bcrypt.GenerateFromPassword(assembledPasswordBytes, defaultPasswordCost)
55 59
 }
56 60
 
57 61
 // CompareHashAndPassword compares a hashed password with its possible plaintext equivalent.
58 62
 // Returns nil on success, or an error on failure.
59
-func (pwm *PasswordManager) CompareHashAndPassword(hashedPassword []byte, specialSalt []byte, password string) error {
60
-	assembledPasswordBytes := pwm.assemblePassword(specialSalt, password)
63
+func (sm *SaltedManager) CompareHashAndPassword(hashedPassword []byte, specialSalt []byte, password string) error {
64
+	assembledPasswordBytes := sm.assemblePassword(specialSalt, password)
61 65
 	return bcrypt.CompareHashAndPassword(hashedPassword, assembledPasswordBytes)
62 66
 }

irc/password.go → irc/passwd/unsalted.go 查看文件

@@ -1,7 +1,7 @@
1 1
 // Copyright (c) 2012-2014 Jeremy Latt
2 2
 // released under the MIT license
3 3
 
4
-package irc
4
+package passwd
5 5
 
6 6
 import (
7 7
 	"encoding/base64"

+ 5
- 4
irc/server.go 查看文件

@@ -26,6 +26,7 @@ import (
26 26
 	"github.com/oragono/oragono/irc/caps"
27 27
 	"github.com/oragono/oragono/irc/isupport"
28 28
 	"github.com/oragono/oragono/irc/logger"
29
+	"github.com/oragono/oragono/irc/passwd"
29 30
 	"github.com/oragono/oragono/irc/sno"
30 31
 	"github.com/oragono/oragono/irc/utils"
31 32
 	"github.com/tidwall/buntdb"
@@ -108,7 +109,7 @@ type Server struct {
108 109
 	operators                    map[string]Oper
109 110
 	operclasses                  map[string]OperClass
110 111
 	password                     []byte
111
-	passwords                    *PasswordManager
112
+	passwords                    *passwd.SaltedManager
112 113
 	registeredChannels           map[string]*RegisteredChannel
113 114
 	registeredChannelsMutex      sync.RWMutex
114 115
 	rehashMutex                  sync.Mutex
@@ -474,7 +475,7 @@ func passHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
474 475
 
475 476
 	// check the provided password
476 477
 	password := []byte(msg.Params[0])
477
-	if ComparePassword(server.password, password) != nil {
478
+	if passwd.ComparePassword(server.password, password) != nil {
478 479
 		client.Send(nil, server.name, ERR_PASSWDMISMATCH, client.nick, "Password incorrect")
479 480
 		client.Send(nil, server.name, "ERROR", "Password incorrect")
480 481
 		return true
@@ -1140,7 +1141,7 @@ func operHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
1140 1141
 	server.configurableStateMutex.RUnlock()
1141 1142
 
1142 1143
 	password := []byte(msg.Params[1])
1143
-	err = ComparePassword(oper.Pass, password)
1144
+	err = passwd.ComparePassword(oper.Pass, password)
1144 1145
 	if (oper.Pass == nil) || (err != nil) {
1145 1146
 		client.Send(nil, server.name, ERR_PASSWDMISMATCH, client.nick, "Password incorrect")
1146 1147
 		return true
@@ -1523,7 +1524,7 @@ func (server *Server) loadDatastore(datastorePath string) error {
1523 1524
 			return err
1524 1525
 		}
1525 1526
 
1526
-		pwm := NewPasswordManager(salt)
1527
+		pwm := passwd.NewSaltedManager(salt)
1527 1528
 		server.passwords = &pwm
1528 1529
 		return nil
1529 1530
 	})

+ 2
- 1
oragono.go 查看文件

@@ -16,6 +16,7 @@ import (
16 16
 	"github.com/docopt/docopt-go"
17 17
 	"github.com/oragono/oragono/irc"
18 18
 	"github.com/oragono/oragono/irc/logger"
19
+	"github.com/oragono/oragono/irc/passwd"
19 20
 	"github.com/oragono/oragono/mkcerts"
20 21
 	stackimpact "github.com/stackimpact/stackimpact-go"
21 22
 	"golang.org/x/crypto/ssh/terminal"
@@ -58,7 +59,7 @@ Options:
58 59
 			log.Fatal("Error reading password:", err.Error())
59 60
 		}
60 61
 		password := string(bytePassword)
61
-		encoded, err := irc.GenerateEncodedPassword(password)
62
+		encoded, err := passwd.GenerateEncodedPassword(password)
62 63
 		if err != nil {
63 64
 			log.Fatal("encoding error:", err.Error())
64 65
 		}

Loading…
取消
儲存