Browse Source

Split passwd into its' own subpackage

tags/v0.9.2-beta
Daniel Oaks 6 years ago
parent
commit
68b1dc9e72
7 changed files with 37 additions and 29 deletions
  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 View File

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

+ 4
- 5
irc/config.go View File

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

+ 3
- 1
irc/database.go View File

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

irc/password_salted.go → irc/passwd/salted.go View File

1
 // Copyright (c) 2016 Daniel Oaks <daniel@danieloaks.net>
1
 // Copyright (c) 2016 Daniel Oaks <daniel@danieloaks.net>
2
 // released under the MIT license
2
 // released under the MIT license
3
 
3
 
4
-package irc
4
+package passwd
5
 
5
 
6
 import (
6
 import (
7
 	"crypto/rand"
7
 	"crypto/rand"
9
 	"golang.org/x/crypto/bcrypt"
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
 // NewSalt returns a salt for crypto uses.
19
 // NewSalt returns a salt for crypto uses.
16
 func NewSalt() ([]byte, error) {
20
 func NewSalt() ([]byte, error) {
25
 	return salt, nil
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
 	salt []byte
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
 // assemblePassword returns an assembled slice of bytes for the given password details.
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
 	var assembledPasswordBytes []byte
46
 	var assembledPasswordBytes []byte
43
-	assembledPasswordBytes = append(assembledPasswordBytes, pwm.salt...)
47
+	assembledPasswordBytes = append(assembledPasswordBytes, sm.salt...)
44
 	assembledPasswordBytes = append(assembledPasswordBytes, '-')
48
 	assembledPasswordBytes = append(assembledPasswordBytes, '-')
45
 	assembledPasswordBytes = append(assembledPasswordBytes, specialSalt...)
49
 	assembledPasswordBytes = append(assembledPasswordBytes, specialSalt...)
46
 	assembledPasswordBytes = append(assembledPasswordBytes, '-')
50
 	assembledPasswordBytes = append(assembledPasswordBytes, '-')
49
 }
53
 }
50
 
54
 
51
 // GenerateFromPassword encrypts the given password.
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
 	return bcrypt.GenerateFromPassword(assembledPasswordBytes, defaultPasswordCost)
58
 	return bcrypt.GenerateFromPassword(assembledPasswordBytes, defaultPasswordCost)
55
 }
59
 }
56
 
60
 
57
 // CompareHashAndPassword compares a hashed password with its possible plaintext equivalent.
61
 // CompareHashAndPassword compares a hashed password with its possible plaintext equivalent.
58
 // Returns nil on success, or an error on failure.
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
 	return bcrypt.CompareHashAndPassword(hashedPassword, assembledPasswordBytes)
65
 	return bcrypt.CompareHashAndPassword(hashedPassword, assembledPasswordBytes)
62
 }
66
 }

irc/password.go → irc/passwd/unsalted.go View File

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

+ 5
- 4
irc/server.go View File

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

+ 2
- 1
oragono.go View File

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

Loading…
Cancel
Save