Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
IRMA
Github mirrors
irmago
Commits
d6cf7ff0
Commit
d6cf7ff0
authored
May 31, 2021
by
Sietse Ringers
Browse files
refactor: unexport keyshare server structs, interfaces and members where possible
parent
40ff4726
Changes
19
Hide whitespace changes
Inline
Side-by-side
server/keyshare/keyshareserver/conf.go
View file @
d6cf7ff0
...
...
@@ -18,7 +18,7 @@ import (
type
DBType
string
var
E
rrUnknownDBType
=
errors
.
New
(
"Unknown database type"
)
var
e
rrUnknownDBType
=
errors
.
New
(
"Unknown database type"
)
const
(
DBTypeMemory
=
"memory"
...
...
@@ -116,7 +116,7 @@ func processConfiguration(conf *Configuration) (*keysharecore.Core, error) {
return
nil
,
server
.
LogError
(
err
)
}
default
:
return
nil
,
server
.
LogError
(
E
rrUnknownDBType
)
return
nil
,
server
.
LogError
(
e
rrUnknownDBType
)
}
}
...
...
server/keyshare/keyshareserver/db.go
View file @
d6cf7ff0
...
...
@@ -7,18 +7,18 @@ import (
)
var
(
E
rrUserAlreadyExists
=
errors
.
New
(
"Cannot create user, username already taken"
)
E
rrInvalidRecord
=
errors
.
New
(
"Invalid record in database"
)
e
rrUserAlreadyExists
=
errors
.
New
(
"Cannot create user, username already taken"
)
e
rrInvalidRecord
=
errors
.
New
(
"Invalid record in database"
)
)
type
E
ventType
string
type
e
ventType
string
const
(
E
ventTypePinCheckRefused
E
ventType
=
"PIN_CHECK_REFUSED"
E
ventTypePinCheckSuccess
E
ventType
=
"PIN_CHECK_SUCCESS"
E
ventTypePinCheckFailed
E
ventType
=
"PIN_CHECK_FAILED"
E
ventTypePinCheckBlocked
E
ventType
=
"PIN_CHECK_BLOCKED"
E
ventTypeIRMASession
E
ventType
=
"IRMA_SESSION"
e
ventTypePinCheckRefused
e
ventType
=
"PIN_CHECK_REFUSED"
e
ventTypePinCheckSuccess
e
ventType
=
"PIN_CHECK_SUCCESS"
e
ventTypePinCheckFailed
e
ventType
=
"PIN_CHECK_FAILED"
e
ventTypePinCheckBlocked
e
ventType
=
"PIN_CHECK_BLOCKED"
e
ventTypeIRMASession
e
ventType
=
"IRMA_SESSION"
)
// Interface used by server to manage data storage
...
...
@@ -28,29 +28,29 @@ const (
type
DB
interface
{
// User management
AddUser
(
user
*
User
)
error
U
ser
(
username
string
)
(
*
User
,
error
)
U
pdateUser
(
user
*
User
)
error
u
ser
(
username
string
)
(
*
User
,
error
)
u
pdateUser
(
user
*
User
)
error
// ReservePinTry reserves a pin check attempt, and additionally it returns:
// - allowed is whether the user is allowed to do the pin check (false if user is blocked)
// - tries is how many tries are remaining, after this pin check
// - wait is how long the user must wait before the next attempt is allowed if tries is 0
//
R
esetPinTries increases the user's try count and (if applicable) the date when the user
//
r
esetPinTries increases the user's try count and (if applicable) the date when the user
// is unblocked again in the database, regardless of if the pin check succeeds after this
// invocation.
R
eservePinTry
(
user
*
User
)
(
allowed
bool
,
tries
int
,
wait
int64
,
err
error
)
r
eservePinTry
(
user
*
User
)
(
allowed
bool
,
tries
int
,
wait
int64
,
err
error
)
//
R
esetPinTries resets the user's pin count and unblock date fields in the database to their
//
r
esetPinTries resets the user's pin count and unblock date fields in the database to their
// default values (0 past attempts, no unblock date).
R
esetPinTries
(
user
*
User
)
error
r
esetPinTries
(
user
*
User
)
error
// User activity registration
// SetSeen calls are used to track when a users account was last active, for deleting old accounts
S
etSeen
(
user
*
User
)
error
A
ddLog
(
user
*
User
,
eventType
E
ventType
,
param
interface
{})
error
s
etSeen
(
user
*
User
)
error
a
ddLog
(
user
*
User
,
eventType
e
ventType
,
param
interface
{})
error
// Store email verification tokens on registration
A
ddEmailVerification
(
user
*
User
,
emailAddress
,
token
string
)
error
a
ddEmailVerification
(
user
*
User
,
emailAddress
,
token
string
)
error
}
// Actual data on a user used by this server.
...
...
server/keyshare/keyshareserver/memorydb.go
View file @
d6cf7ff0
...
...
@@ -20,7 +20,7 @@ func NewMemoryDB() DB {
return
&
memoryDB
{
users
:
map
[
string
]
keysharecore
.
User
{}}
}
func
(
db
*
memoryDB
)
U
ser
(
username
string
)
(
*
User
,
error
)
{
func
(
db
*
memoryDB
)
u
ser
(
username
string
)
(
*
User
,
error
)
{
// Ensure access to database is single-threaded
db
.
lock
.
Lock
()
defer
db
.
lock
.
Unlock
()
...
...
@@ -41,13 +41,13 @@ func (db *memoryDB) AddUser(user *User) error {
// Check and insert user
_
,
exists
:=
db
.
users
[
user
.
Username
]
if
exists
{
return
E
rrUserAlreadyExists
return
e
rrUserAlreadyExists
}
db
.
users
[
user
.
Username
]
=
user
.
UserData
return
nil
}
func
(
db
*
memoryDB
)
U
pdateUser
(
user
*
User
)
error
{
func
(
db
*
memoryDB
)
u
pdateUser
(
user
*
User
)
error
{
// Ensure access to database is single-threaded
db
.
lock
.
Lock
()
defer
db
.
lock
.
Unlock
()
...
...
@@ -61,27 +61,27 @@ func (db *memoryDB) UpdateUser(user *User) error {
return
nil
}
func
(
db
*
memoryDB
)
R
eservePinTry
(
user
*
User
)
(
bool
,
int
,
int64
,
error
)
{
func
(
db
*
memoryDB
)
r
eservePinTry
(
user
*
User
)
(
bool
,
int
,
int64
,
error
)
{
// Since this is a testing DB, implementing anything more than always allow creates hastle
return
true
,
1
,
0
,
nil
}
func
(
db
*
memoryDB
)
R
esetPinTries
(
user
*
User
)
error
{
func
(
db
*
memoryDB
)
r
esetPinTries
(
user
*
User
)
error
{
// Since this is a testing DB, implementing anything more than always allow creates hastle
return
nil
}
func
(
db
*
memoryDB
)
S
etSeen
(
user
*
User
)
error
{
func
(
db
*
memoryDB
)
s
etSeen
(
user
*
User
)
error
{
// We don't need to do anything here, as this information cannot be extracted locally
return
nil
}
func
(
db
*
memoryDB
)
A
ddLog
(
user
*
User
,
eventType
E
ventType
,
param
interface
{})
error
{
func
(
db
*
memoryDB
)
a
ddLog
(
user
*
User
,
eventType
e
ventType
,
param
interface
{})
error
{
// We don't need to do anything here, as this information cannot be extracted locally
return
nil
}
func
(
db
*
memoryDB
)
A
ddEmailVerification
(
user
*
User
,
emailAddress
,
token
string
)
error
{
func
(
db
*
memoryDB
)
a
ddEmailVerification
(
user
*
User
,
emailAddress
,
token
string
)
error
{
// We don't need to do anything here, as this information cannot be extracted locally
return
nil
}
server/keyshare/keyshareserver/memorydb_test.go
View file @
d6cf7ff0
...
...
@@ -15,32 +15,32 @@ func TestMemoryDBUserManagement(t *testing.T) {
require
.
NoError
(
t
,
err
)
assert
.
Equal
(
t
,
"testuser"
,
user
.
Username
)
nuser
,
err
:=
db
.
U
ser
(
"testuser"
)
nuser
,
err
:=
db
.
u
ser
(
"testuser"
)
require
.
NoError
(
t
,
err
)
assert
.
Equal
(
t
,
"testuser"
,
nuser
.
Username
)
_
,
err
=
db
.
U
ser
(
"nonexistent"
)
_
,
err
=
db
.
u
ser
(
"nonexistent"
)
assert
.
Error
(
t
,
err
)
user
=
&
User
{
Username
:
"testuser"
}
err
=
db
.
AddUser
(
user
)
assert
.
Error
(
t
,
err
)
err
=
db
.
U
pdateUser
(
nuser
)
err
=
db
.
u
pdateUser
(
nuser
)
assert
.
NoError
(
t
,
err
)
err
=
db
.
A
ddEmailVerification
(
nuser
,
"test@test.com"
,
"testtoken"
)
err
=
db
.
a
ddEmailVerification
(
nuser
,
"test@test.com"
,
"testtoken"
)
assert
.
NoError
(
t
,
err
)
err
=
db
.
A
ddLog
(
nuser
,
E
ventTypePinCheckSuccess
,
nil
)
err
=
db
.
a
ddLog
(
nuser
,
e
ventTypePinCheckSuccess
,
nil
)
assert
.
NoError
(
t
,
err
)
ok
,
tries
,
wait
,
err
:=
db
.
R
eservePinTry
(
nuser
)
ok
,
tries
,
wait
,
err
:=
db
.
r
eservePinTry
(
nuser
)
assert
.
NoError
(
t
,
err
)
assert
.
True
(
t
,
ok
)
assert
.
True
(
t
,
tries
>
0
)
assert
.
Equal
(
t
,
int64
(
0
),
wait
)
err
=
db
.
S
etSeen
(
nuser
)
err
=
db
.
s
etSeen
(
nuser
)
assert
.
NoError
(
t
,
err
)
}
server/keyshare/keyshareserver/postgresdb.go
View file @
d6cf7ff0
...
...
@@ -53,7 +53,7 @@ func (db *postgresDB) AddUser(user *User) error {
if
err
=
res
.
Err
();
err
!=
nil
{
return
err
}
return
E
rrUserAlreadyExists
return
e
rrUserAlreadyExists
}
var
id
int64
err
=
res
.
Scan
(
&
id
)
...
...
@@ -64,7 +64,7 @@ func (db *postgresDB) AddUser(user *User) error {
return
nil
}
func
(
db
*
postgresDB
)
U
ser
(
username
string
)
(
*
User
,
error
)
{
func
(
db
*
postgresDB
)
u
ser
(
username
string
)
(
*
User
,
error
)
{
var
result
User
var
ep
[]
byte
err
:=
db
.
db
.
QueryUser
(
...
...
@@ -76,13 +76,13 @@ func (db *postgresDB) User(username string) (*User, error) {
return
nil
,
err
}
if
len
(
ep
)
!=
len
(
result
.
UserData
[
:
])
{
return
nil
,
E
rrInvalidRecord
return
nil
,
e
rrInvalidRecord
}
copy
(
result
.
UserData
[
:
],
ep
)
return
&
result
,
nil
}
func
(
db
*
postgresDB
)
U
pdateUser
(
user
*
User
)
error
{
func
(
db
*
postgresDB
)
u
pdateUser
(
user
*
User
)
error
{
return
db
.
db
.
ExecUser
(
"UPDATE irma.users SET username = $1, language = $2, coredata = $3 WHERE id=$4"
,
user
.
Username
,
...
...
@@ -92,7 +92,7 @@ func (db *postgresDB) UpdateUser(user *User) error {
)
}
func
(
db
*
postgresDB
)
R
eservePinTry
(
user
*
User
)
(
bool
,
int
,
int64
,
error
)
{
func
(
db
*
postgresDB
)
r
eservePinTry
(
user
*
User
)
(
bool
,
int
,
int64
,
error
)
{
// Check that account is not blocked already, and if not,
// update pinCounter and pinBlockDate
uprows
,
err
:=
db
.
db
.
Query
(
`
...
...
@@ -159,14 +159,14 @@ func (db *postgresDB) ReservePinTry(user *User) (bool, int, int64, error) {
return
allowed
,
tries
,
wait
,
nil
}
func
(
db
*
postgresDB
)
R
esetPinTries
(
user
*
User
)
error
{
func
(
db
*
postgresDB
)
r
esetPinTries
(
user
*
User
)
error
{
return
db
.
db
.
ExecUser
(
"UPDATE irma.users SET pin_counter = 0, pin_block_date = 0 WHERE id = $1"
,
user
.
id
,
)
}
func
(
db
*
postgresDB
)
S
etSeen
(
user
*
User
)
error
{
func
(
db
*
postgresDB
)
s
etSeen
(
user
*
User
)
error
{
return
db
.
db
.
ExecUser
(
"UPDATE irma.users SET last_seen = $1 WHERE id = $2"
,
time
.
Now
()
.
Unix
(),
...
...
@@ -174,7 +174,7 @@ func (db *postgresDB) SetSeen(user *User) error {
)
}
func
(
db
*
postgresDB
)
A
ddLog
(
user
*
User
,
eventType
E
ventType
,
param
interface
{})
error
{
func
(
db
*
postgresDB
)
a
ddLog
(
user
*
User
,
eventType
e
ventType
,
param
interface
{})
error
{
var
encodedParamString
*
string
if
param
!=
nil
{
encodedParam
,
err
:=
json
.
Marshal
(
param
)
...
...
@@ -193,7 +193,7 @@ func (db *postgresDB) AddLog(user *User, eventType EventType, param interface{})
return
err
}
func
(
db
*
postgresDB
)
A
ddEmailVerification
(
user
*
User
,
emailAddress
,
token
string
)
error
{
func
(
db
*
postgresDB
)
a
ddEmailVerification
(
user
*
User
,
emailAddress
,
token
string
)
error
{
_
,
err
:=
db
.
db
.
Exec
(
"INSERT INTO irma.email_verification_tokens (token, email, user_id, expiry) VALUES ($1, $2, $3, $4)"
,
token
,
emailAddress
,
...
...
server/keyshare/keyshareserver/postgresdb_test.go
View file @
d6cf7ff0
...
...
@@ -23,27 +23,27 @@ func TestPostgresDBUserManagement(t *testing.T) {
require
.
NoError
(
t
,
err
)
assert
.
Equal
(
t
,
"testuser"
,
user
.
Username
)
nuser
,
err
:=
db
.
U
ser
(
"testuser"
)
nuser
,
err
:=
db
.
u
ser
(
"testuser"
)
require
.
NoError
(
t
,
err
)
assert
.
Equal
(
t
,
"testuser"
,
nuser
.
Username
)
_
,
err
=
db
.
U
ser
(
"notexist"
)
_
,
err
=
db
.
u
ser
(
"notexist"
)
assert
.
Error
(
t
,
err
)
err
=
db
.
U
pdateUser
(
nuser
)
err
=
db
.
u
pdateUser
(
nuser
)
assert
.
NoError
(
t
,
err
)
user
=
&
User
{
Username
:
"testuser"
}
err
=
db
.
AddUser
(
user
)
assert
.
Error
(
t
,
err
)
err
=
db
.
A
ddLog
(
nuser
,
E
ventTypePinCheckFailed
,
15
)
err
=
db
.
a
ddLog
(
nuser
,
e
ventTypePinCheckFailed
,
15
)
assert
.
NoError
(
t
,
err
)
err
=
db
.
A
ddEmailVerification
(
nuser
,
"test@example.com"
,
"testtoken"
)
err
=
db
.
a
ddEmailVerification
(
nuser
,
"test@example.com"
,
"testtoken"
)
assert
.
NoError
(
t
,
err
)
err
=
db
.
S
etSeen
(
nuser
)
err
=
db
.
s
etSeen
(
nuser
)
assert
.
NoError
(
t
,
err
)
}
...
...
@@ -60,12 +60,12 @@ func TestPostgresDBPinReservation(t *testing.T) {
err
=
db
.
AddUser
(
user
)
require
.
NoError
(
t
,
err
)
//
R
eservePinTry sets user fields in the database as if the attempt was wrong. If the attempt
//
r
eservePinTry sets user fields in the database as if the attempt was wrong. If the attempt
// was in fact correct, then these fields are cleared again later by the keyshare server by
// invoking db.
R
esetPinTries(user). So below we may think of
R
eservePinTry invocations as
// invoking db.
r
esetPinTries(user). So below we may think of
r
eservePinTry invocations as
// wrong pin attempts.
ok
,
tries
,
wait
,
err
:=
db
.
R
eservePinTry
(
user
)
ok
,
tries
,
wait
,
err
:=
db
.
r
eservePinTry
(
user
)
require
.
NoError
(
t
,
err
)
assert
.
True
(
t
,
ok
)
assert
.
Equal
(
t
,
maxPinTries
-
1
,
tries
)
...
...
@@ -73,7 +73,7 @@ func TestPostgresDBPinReservation(t *testing.T) {
// Try until we have no tries left
for
tries
!=
0
{
ok
,
tries
,
wait
,
err
=
db
.
R
eservePinTry
(
user
)
ok
,
tries
,
wait
,
err
=
db
.
r
eservePinTry
(
user
)
require
.
NoError
(
t
,
err
)
assert
.
True
(
t
,
ok
)
}
...
...
@@ -84,7 +84,7 @@ func TestPostgresDBPinReservation(t *testing.T) {
time
.
Sleep
(
time
.
Duration
(
wait
-
1
)
*
time
.
Second
)
// Try again, not yet allowed
ok
,
tries
,
wait
,
err
=
db
.
R
eservePinTry
(
user
)
ok
,
tries
,
wait
,
err
=
db
.
r
eservePinTry
(
user
)
assert
.
NoError
(
t
,
err
)
assert
.
False
(
t
,
ok
)
assert
.
Equal
(
t
,
0
,
tries
)
...
...
@@ -94,14 +94,14 @@ func TestPostgresDBPinReservation(t *testing.T) {
time
.
Sleep
(
2
*
time
.
Second
)
// Trying is now allowed
ok
,
tries
,
wait
,
err
=
db
.
R
eservePinTry
(
user
)
ok
,
tries
,
wait
,
err
=
db
.
r
eservePinTry
(
user
)
assert
.
NoError
(
t
,
err
)
assert
.
True
(
t
,
ok
)
assert
.
Equal
(
t
,
0
,
tries
)
assert
.
Equal
(
t
,
2
*
backoffStart
,
wait
)
// next attempt after doubled timeout
// Since we just used another attempt we are now blocked again
ok
,
tries
,
wait
,
err
=
db
.
R
eservePinTry
(
user
)
ok
,
tries
,
wait
,
err
=
db
.
r
eservePinTry
(
user
)
assert
.
NoError
(
t
,
err
)
assert
.
False
(
t
,
ok
)
assert
.
Equal
(
t
,
0
,
tries
)
...
...
@@ -111,16 +111,16 @@ func TestPostgresDBPinReservation(t *testing.T) {
time
.
Sleep
(
time
.
Duration
(
wait
+
1
)
*
time
.
Second
)
// Try a final time
ok
,
tries
,
wait
,
err
=
db
.
R
eservePinTry
(
user
)
ok
,
tries
,
wait
,
err
=
db
.
r
eservePinTry
(
user
)
assert
.
NoError
(
t
,
err
)
assert
.
True
(
t
,
ok
)
assert
.
Equal
(
t
,
0
,
tries
)
assert
.
Equal
(
t
,
4
*
backoffStart
,
wait
)
// next attempt after again a doubled timeout
err
=
db
.
R
esetPinTries
(
user
)
err
=
db
.
r
esetPinTries
(
user
)
assert
.
NoError
(
t
,
err
)
ok
,
tries
,
wait
,
err
=
db
.
R
eservePinTry
(
user
)
ok
,
tries
,
wait
,
err
=
db
.
r
eservePinTry
(
user
)
assert
.
NoError
(
t
,
err
)
assert
.
True
(
t
,
ok
)
assert
.
True
(
t
,
tries
>
0
)
...
...
server/keyshare/keyshareserver/server.go
View file @
d6cf7ff0
...
...
@@ -62,11 +62,11 @@ func New(conf *Configuration) (*Server, error) {
// Load neccessary idemix keys into core, and ensure that future updates
// to them are processed
if
err
=
s
.
L
oadIdemixKeys
(
conf
.
IrmaConfiguration
);
err
!=
nil
{
if
err
=
s
.
l
oadIdemixKeys
(
conf
.
IrmaConfiguration
);
err
!=
nil
{
return
nil
,
err
}
conf
.
IrmaConfiguration
.
UpdateListeners
=
append
(
conf
.
IrmaConfiguration
.
UpdateListeners
,
func
(
conf
*
irma
.
Configuration
)
{
if
err
:=
s
.
L
oadIdemixKeys
(
conf
);
err
!=
nil
{
if
err
:=
s
.
l
oadIdemixKeys
(
conf
);
err
!=
nil
{
// run periodically; can only log the error here
_
=
server
.
LogError
(
err
)
}
...
...
@@ -123,7 +123,7 @@ func (s *Server) Handler() http.Handler {
// On configuration changes, inform the keyshare core of any
// new IRMA issuer public keys.
func
(
s
*
Server
)
L
oadIdemixKeys
(
conf
*
irma
.
Configuration
)
error
{
func
(
s
*
Server
)
l
oadIdemixKeys
(
conf
*
irma
.
Configuration
)
error
{
errs
:=
multierror
.
Error
{}
for
_
,
issuer
:=
range
conf
.
Issuers
{
keyIDs
,
err
:=
conf
.
PublicKeyIndices
(
issuer
.
Identifier
())
...
...
@@ -194,7 +194,7 @@ func (s *Server) generateCommitments(user *User, authorization string, keys []ir
// the user comes back later to retrieve her response. gabi.ProofP.P will depend on this public
// key, which is used only during issuance. Thus, this assumes that during issuance, the user
// puts the key ID of the credential(s) being issued at index 0.
s
.
store
.
add
(
user
.
Username
,
&
S
ession
{
s
.
store
.
add
(
user
.
Username
,
&
s
ession
{
KeyID
:
keys
[
0
],
CommitID
:
commitID
,
})
...
...
@@ -248,14 +248,14 @@ func (s *Server) handleResponse(w http.ResponseWriter, r *http.Request) {
func
(
s
*
Server
)
generateResponses
(
user
*
User
,
authorization
string
,
challenge
*
big
.
Int
,
commitID
uint64
,
keyID
irma
.
PublicKeyIdentifier
)
(
string
,
error
)
{
// Indicate activity on user account
err
:=
s
.
db
.
S
etSeen
(
user
)
err
:=
s
.
db
.
s
etSeen
(
user
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not mark user as seen recently"
)
// Do not send to user
}
// Make log entry
err
=
s
.
db
.
A
ddLog
(
user
,
E
ventTypeIRMASession
,
nil
)
err
=
s
.
db
.
a
ddLog
(
user
,
e
ventTypeIRMASession
,
nil
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not add log entry for user"
)
return
""
,
err
...
...
@@ -289,7 +289,7 @@ func (s *Server) handleVerifyPin(w http.ResponseWriter, r *http.Request) {
}
// Fetch user
user
,
err
:=
s
.
db
.
U
ser
(
msg
.
Username
)
user
,
err
:=
s
.
db
.
u
ser
(
msg
.
Username
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithFields
(
logrus
.
Fields
{
"username"
:
msg
.
Username
,
"error"
:
err
})
.
Warn
(
"Could not find user in db"
)
server
.
WriteError
(
w
,
server
.
ErrorUserNotRegistered
,
""
)
...
...
@@ -327,13 +327,13 @@ func (s *Server) verifyPin(user *User, username, pin string) (irma.KeysharePinSt
if
err
==
keysharecore
.
ErrInvalidPin
{
// Handle invalid pin
err
=
s
.
db
.
A
ddLog
(
user
,
E
ventTypePinCheckFailed
,
tries
)
err
=
s
.
db
.
a
ddLog
(
user
,
e
ventTypePinCheckFailed
,
tries
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not add log entry for user"
)
return
irma
.
KeysharePinStatus
{},
err
}
if
tries
==
0
{
err
=
s
.
db
.
A
ddLog
(
user
,
E
ventTypePinCheckBlocked
,
wait
)
err
=
s
.
db
.
a
ddLog
(
user
,
e
ventTypePinCheckBlocked
,
wait
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not add log entry for user"
)
return
irma
.
KeysharePinStatus
{},
err
...
...
@@ -345,17 +345,17 @@ func (s *Server) verifyPin(user *User, username, pin string) (irma.KeysharePinSt
}
// Handle success
err
=
s
.
db
.
R
esetPinTries
(
user
)
err
=
s
.
db
.
r
esetPinTries
(
user
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not reset users pin check logic"
)
// Do not send to user
}
err
=
s
.
db
.
S
etSeen
(
user
)
err
=
s
.
db
.
s
etSeen
(
user
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not indicate user activity"
)
// Do not send to user
}
err
=
s
.
db
.
A
ddLog
(
user
,
E
ventTypePinCheckSuccess
,
nil
)
err
=
s
.
db
.
a
ddLog
(
user
,
e
ventTypePinCheckSuccess
,
nil
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not add log entry for user"
)
return
irma
.
KeysharePinStatus
{},
err
...
...
@@ -374,7 +374,7 @@ func (s *Server) handleChangePin(w http.ResponseWriter, r *http.Request) {
}
// Fetch user
user
,
err
:=
s
.
db
.
U
ser
(
msg
.
Username
)
user
,
err
:=
s
.
db
.
u
ser
(
msg
.
Username
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithFields
(
logrus
.
Fields
{
"username"
:
msg
.
Username
,
"error"
:
err
})
.
Warn
(
"Could not find user in db"
)
server
.
WriteError
(
w
,
server
.
ErrorUserNotRegistered
,
""
)
...
...
@@ -414,14 +414,14 @@ func (s *Server) updatePin(user *User, oldPin, newPin string) (irma.KeysharePinS
}
// Mark pincheck as success, resetting users wait and count
err
=
s
.
db
.
R
esetPinTries
(
user
)
err
=
s
.
db
.
r
esetPinTries
(
user
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not reset users pin check logic"
)
// Do not send to user
}
// Write user back
err
=
s
.
db
.
U
pdateUser
(
user
)
err
=
s
.
db
.
u
pdateUser
(
user
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not write updated user to database"
)
return
irma
.
KeysharePinStatus
{},
err
...
...
@@ -500,7 +500,7 @@ func (s *Server) sendRegistrationEmail(user *User, language, email string) error
token
:=
common
.
NewSessionToken
()
// Add it to the database
err
:=
s
.
db
.
A
ddEmailVerification
(
user
,
email
,
token
)
err
:=
s
.
db
.
a
ddEmailVerification
(
user
,
email
,
token
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not generate email verification mail record"
)
return
err
...
...
@@ -522,7 +522,7 @@ func (s *Server) userMiddleware(next http.Handler) http.Handler {
username
:=
r
.
Header
.
Get
(
"X-IRMA-Keyshare-Username"
)
// and fetch its information
user
,
err
:=
s
.
db
.
U
ser
(
username
)
user
,
err
:=
s
.
db
.
u
ser
(
username
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithFields
(
logrus
.
Fields
{
"username"
:
username
,
"error"
:
err
})
.
Warn
(
"Could not find user in db"
)
server
.
WriteError
(
w
,
server
.
ErrorUserNotRegistered
,
err
.
Error
())
...
...
@@ -556,13 +556,13 @@ func (s *Server) authorizationMiddleware(next http.Handler) http.Handler {
}
func
(
s
*
Server
)
reservePinCheck
(
user
*
User
,
pin
string
)
(
bool
,
int
,
int64
,
error
)
{
ok
,
tries
,
wait
,
err
:=
s
.
db
.
R
eservePinTry
(
user
)
ok
,
tries
,
wait
,
err
:=
s
.
db
.
r
eservePinTry
(
user
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not reserve pin check slot"
)
return
false
,
0
,
0
,
err
}
if
!
ok
{
err
=
s
.
db
.
A
ddLog
(
user
,
E
ventTypePinCheckRefused
,
nil
)
err
=
s
.
db
.
a
ddLog
(
user
,
e
ventTypePinCheckRefused
,
nil
)
if
err
!=
nil
{
s
.
conf
.
Logger
.
WithField
(
"error"
,
err
)
.
Error
(
"Could not add log entry for user"
)
return
false
,
0
,
0
,
err
...
...
server/keyshare/keyshareserver/server_test.go
View file @
d6cf7ff0
...
...
@@ -333,32 +333,32 @@ func (db *testDB) AddUser(user *User) error {
return
db
.
db
.
AddUser
(
user
)
}
func
(
db
*
testDB
)
U
ser
(
username
string
)
(
*
User
,
error
)
{
return
db
.
db
.
U
ser
(
username
)
func
(
db
*
testDB
)
u
ser
(
username
string
)
(
*
User
,
error
)
{
return
db
.
db
.
u
ser
(
username
)
}
func
(
db
*
testDB
)
U
pdateUser
(
user
*
User
)
error
{
return
db
.
db
.
U
pdateUser
(
user
)
func
(
db
*
testDB
)
u
pdateUser
(
user
*
User
)
error
{
return
db
.
db
.
u
pdateUser
(
user
)
}
func
(
db
*
testDB
)
R
eservePinTry
(
user
*
User
)
(
bool
,
int
,
int64
,
error
)
{
func
(
db
*
testDB
)
r
eservePinTry
(
user
*
User
)
(
bool
,
int
,
int64
,
error
)
{
return
db
.
ok
,
db
.
tries
,
db
.
wait
,
db
.
err
}
func
(
db
*
testDB
)
R
esetPinTries
(
user
*
User
)
error
{
return
db
.
db
.
R
esetPinTries
(
user
)
func
(
db
*
testDB
)
r
esetPinTries
(
user
*
User
)
error
{
return
db
.
db
.
r
esetPinTries
(
user
)
}
func
(
db
*
testDB
)
S
etSeen
(
user
*
User
)
error
{
return
db
.
db
.
S
etSeen
(
user
)
func
(
db
*
testDB
)
s
etSeen
(
user
*
User
)
error
{
return
db
.
db
.
s
etSeen
(
user
)
}
func
(
db
*
testDB
)
A
ddLog
(
user
*
User
,
entrytype
E
ventType
,
params
interface
{})
error
{
return
db
.
db
.
A
ddLog
(
user
,
entrytype
,
params
)
func
(
db
*
testDB
)
a
ddLog
(
user
*
User
,
entrytype
e
ventType
,
params
interface
{})
error
{
return
db
.
db
.
a
ddLog
(
user
,
entrytype
,
params
)
}
func
(
db
*
testDB
)
A
ddEmailVerification
(
user
*
User
,
email
,
token
string
)
error
{
return
db
.
db
.
A
ddEmailVerification
(
user
,
email
,
token
)
func
(
db
*
testDB
)
a
ddEmailVerification
(
user
*
User
,
email
,
token
string
)
error
{
return
db
.
db
.
a
ddEmailVerification
(
user
,
email
,
token
)
}
func
createDB
(
t
*
testing
.
T
)
DB
{
...
...
server/keyshare/keyshareserver/session.go
View file @
d6cf7ff0
...
...
@@ -7,40 +7,40 @@ import (
irma
"github.com/privacybydesign/irmago"
)
type
S
ession
struct
{
type
s
ession
struct
{
KeyID
irma
.
PublicKeyIdentifier
// last used key, used in signing the issuance message
CommitID
uint64
expiry
time
.
Time
}
type
sessionStore
interface
{
add
(
username
string
,
session
*
S
ession
)
get
(
username
string
)
*
S
ession
add
(
username
string
,
session
*
s
ession
)
get
(
username
string
)
*
s
ession
flush
()
}
type
memorySessionStore
struct
{
sync
.
Mutex
sessions
map
[
string
]
*
S
ession
sessions
map
[
string
]
*
s
ession
sessionLifetime
time
.
Duration
}
func
newMemorySessionStore
(
sessionLifetime
time
.
Duration
)
sessionStore
{
r