Stop using github.com/pkg/errors

This commit is contained in:
Tulir Asokan 2020-09-24 14:41:29 +03:00
commit 72fc4c1643
15 changed files with 65 additions and 69 deletions

View file

@ -8,8 +8,8 @@ package crypto
import (
"encoding/json"
"github.com/pkg/errors"
"errors"
"fmt"
"maunium.net/go/mautrix/event"
"maunium.net/go/mautrix/id"
@ -39,14 +39,14 @@ func (mach *OlmMachine) DecryptMegolmEvent(evt *event.Event) (*event.Event, erro
}
sess, err := mach.CryptoStore.GetGroupSession(evt.RoomID, content.SenderKey, content.SessionID)
if err != nil {
return nil, errors.Wrap(err, "failed to get group session")
return nil, fmt.Errorf("failed to get group session: %w", err)
} else if sess == nil {
mach.checkIfWedged(evt)
return nil, NoSessionFound
}
plaintext, messageIndex, err := sess.Internal.Decrypt(content.MegolmCiphertext)
if err != nil {
return nil, errors.Wrap(err, "failed to decrypt megolm event")
return nil, fmt.Errorf("failed to decrypt megolm event: %w", err)
} else if !mach.CryptoStore.ValidateMessageIndex(content.SenderKey, content.SessionID, evt.ID, messageIndex, evt.Timestamp) {
return nil, DuplicateMessageIndex
}
@ -72,13 +72,13 @@ func (mach *OlmMachine) DecryptMegolmEvent(evt *event.Event) (*event.Event, erro
megolmEvt := &megolmEvent{}
err = json.Unmarshal(plaintext, &megolmEvt)
if err != nil {
return nil, errors.Wrap(err, "failed to parse megolm payload")
return nil, fmt.Errorf("failed to parse megolm payload: %w", err)
} else if megolmEvt.RoomID != evt.RoomID {
return nil, WrongRoom
}
err = megolmEvt.Content.ParseRaw(megolmEvt.Type)
if err != nil && !event.IsUnsupportedContentType(err) {
return nil, errors.Wrap(err, "failed to parse content of megolm payload event")
return nil, fmt.Errorf("failed to parse content of megolm payload event: %w", err)
}
relatable, ok := megolmEvt.Content.Parsed.(event.Relatable)
if ok && content.RelatesTo != nil && relatable.OptionalGetRelatesTo() == nil {

View file

@ -8,8 +8,8 @@ package crypto
import (
"encoding/json"
"github.com/pkg/errors"
"errors"
"fmt"
"maunium.net/go/mautrix/event"
"maunium.net/go/mautrix/id"
@ -76,7 +76,7 @@ func (mach *OlmMachine) decryptOlmCiphertext(sender id.UserID, deviceID id.Devic
mach.Log.Warn("Found matching session yet decryption failed for sender %s with key %s", sender, senderKey)
mach.markDeviceForUnwedging(sender, senderKey)
}
return nil, errors.Wrap(err, "failed to decrypt olm event")
return nil, fmt.Errorf("failed to decrypt olm event: %w", err)
}
// Decryption failed with every known session or no known sessions, let's try to create a new session.
@ -92,13 +92,13 @@ func (mach *OlmMachine) decryptOlmCiphertext(sender id.UserID, deviceID id.Devic
session, err := mach.createInboundSession(senderKey, ciphertext)
if err != nil {
mach.markDeviceForUnwedging(sender, senderKey)
return nil, errors.Wrap(err, "failed to create new session from prekey message")
return nil, fmt.Errorf("failed to create new session from prekey message: %w", err)
}
mach.Log.Trace("Created inbound session %s for %s/%s (sender key: %s)", session.ID(), sender, deviceID, senderKey)
plaintext, err = session.Decrypt(ciphertext, olmType)
if err != nil {
return nil, errors.Wrap(err, "failed to decrypt olm event with session created from prekey message")
return nil, fmt.Errorf("failed to decrypt olm event with session created from prekey message: %w", err)
}
err = mach.CryptoStore.UpdateSession(senderKey, session)
@ -110,7 +110,7 @@ func (mach *OlmMachine) decryptOlmCiphertext(sender id.UserID, deviceID id.Devic
var olmEvt DecryptedOlmEvent
err = json.Unmarshal(plaintext, &olmEvt)
if err != nil {
return nil, errors.Wrap(err, "failed to parse olm payload")
return nil, fmt.Errorf("failed to parse olm payload: %w", err)
}
if sender != olmEvt.Sender {
return nil, SenderMismatch
@ -122,7 +122,7 @@ func (mach *OlmMachine) decryptOlmCiphertext(sender id.UserID, deviceID id.Devic
err = olmEvt.Content.ParseRaw(olmEvt.Type)
if err != nil && !event.IsUnsupportedContentType(err) {
return nil, errors.Wrap(err, "failed to parse content of olm payload event")
return nil, fmt.Errorf("failed to parse content of olm payload event: %w", err)
}
olmEvt.SenderKey = senderKey
@ -133,13 +133,13 @@ func (mach *OlmMachine) decryptOlmCiphertext(sender id.UserID, deviceID id.Devic
func (mach *OlmMachine) tryDecryptOlmCiphertext(senderKey id.SenderKey, olmType id.OlmMsgType, ciphertext string) ([]byte, error) {
sessions, err := mach.CryptoStore.GetSessions(senderKey)
if err != nil {
return nil, errors.Wrapf(err, "failed to get session for %s", senderKey)
return nil, fmt.Errorf("failed to get session for %s: %w", senderKey, err)
}
for _, session := range sessions {
if olmType == id.OlmMsgTypePreKey {
matches, err := session.Internal.MatchesInboundSession(ciphertext)
if err != nil {
return nil, errors.Wrap(err, "failed to check if ciphertext matches inbound session")
return nil, fmt.Errorf("failed to check if ciphertext matches inbound session: %w", err)
} else if !matches {
continue
}

View file

@ -7,7 +7,8 @@
package crypto
import (
"github.com/pkg/errors"
"errors"
"fmt"
"maunium.net/go/mautrix"
"maunium.net/go/mautrix/crypto/olm"
@ -131,7 +132,7 @@ func (mach *OlmMachine) validateDevice(userID id.UserID, deviceID id.DeviceID, d
ok, err := olm.VerifySignatureJSON(deviceKeys, userID, deviceID, signingKey)
if err != nil {
return existing, errors.Wrap(err, "failed to verify signature")
return existing, fmt.Errorf("failed to verify signature: %w", err)
} else if !ok {
return existing, InvalidKeySignature
}

View file

@ -8,8 +8,8 @@ package crypto
import (
"encoding/json"
"github.com/pkg/errors"
"errors"
"fmt"
"maunium.net/go/mautrix"
"maunium.net/go/mautrix/event"
@ -34,8 +34,8 @@ func getRelatesTo(content interface{}) *event.RelatesTo {
}
type rawMegolmEvent struct {
RoomID id.RoomID `json:"room_id"`
Type event.Type `json:"type"`
RoomID id.RoomID `json:"room_id"`
Type event.Type `json:"type"`
Content interface{} `json:"content"`
}
@ -52,7 +52,7 @@ func (mach *OlmMachine) EncryptMegolmEvent(roomID id.RoomID, evtType event.Type,
mach.Log.Trace("Encrypting event of type %s for %s", evtType.Type, roomID)
session, err := mach.CryptoStore.GetOutboundGroupSession(roomID)
if err != nil {
return nil, errors.Wrap(err, "failed to get outbound group session")
return nil, fmt.Errorf("failed to get outbound group session: %w", err)
} else if session == nil {
return nil, NoGroupSession
}
@ -97,7 +97,7 @@ func (mach *OlmMachine) ShareGroupSession(roomID id.RoomID, users []id.UserID) e
mach.Log.Debug("Sharing group session for room %s to %v", roomID, users)
session, err := mach.CryptoStore.GetOutboundGroupSession(roomID)
if err != nil {
return errors.Wrap(err, "failed to get previous outbound group session")
return fmt.Errorf("failed to get previous outbound group session: %w", err)
} else if session != nil && session.Shared && !session.Expired() {
return AlreadyShared
}
@ -180,7 +180,7 @@ func (mach *OlmMachine) ShareGroupSession(roomID id.RoomID, users []id.UserID) e
mach.Log.Trace("Sending to-device to %d users to share group session for %s", len(toDevice.Messages), roomID)
_, err = mach.Client.SendToDevice(event.ToDeviceEncrypted, toDevice)
if err != nil {
return errors.Wrap(err, "failed to share group session")
return fmt.Errorf("failed to share group session: %w", err)
}
mach.Log.Trace("Sending to-device messages to %d users to report withheld keys in %s", len(toDeviceWithheld.Messages), roomID)

View file

@ -8,8 +8,7 @@ package crypto
import (
"encoding/json"
"github.com/pkg/errors"
"fmt"
"maunium.net/go/mautrix"
"maunium.net/go/mautrix/crypto/olm"
@ -69,7 +68,7 @@ func (mach *OlmMachine) createOutboundSessions(input map[id.UserID]map[id.Device
Timeout: 10 * 1000,
})
if err != nil {
return errors.Wrap(err, "failed to claim keys")
return fmt.Errorf("failed to claim keys: %w", err)
}
for userID, user := range resp.OneTimeKeys {
for deviceID, oneTimeKeys := range user {

View file

@ -20,7 +20,6 @@ import (
"fmt"
"math"
"github.com/pkg/errors"
"golang.org/x/crypto/pbkdf2"
"maunium.net/go/mautrix/crypto/olm"
@ -91,7 +90,7 @@ func exportSessions(sessions []*InboundGroupSession) ([]ExportedSession, error)
for i, session := range sessions {
key, err := session.Internal.Export(session.Internal.FirstKnownIndex())
if err != nil {
return nil, errors.Wrap(err, "failed to export session")
return nil, fmt.Errorf("failed to export session: %w", err)
}
export[i] = ExportedSession{
Algorithm: id.AlgorithmMegolmV1,

View file

@ -15,8 +15,8 @@ import (
"encoding/base64"
"encoding/binary"
"encoding/json"
"github.com/pkg/errors"
"errors"
"fmt"
"maunium.net/go/mautrix/crypto/olm"
"maunium.net/go/mautrix/id"
@ -85,7 +85,7 @@ func decryptKeyExport(passphrase string, exportData []byte) ([]ExportedSession,
var sessionsJSON []ExportedSession
err := json.Unmarshal(unencryptedData, &sessionsJSON)
if err != nil {
return nil, errors.Wrap(err, "invalid export json")
return nil, fmt.Errorf("invalid export json: %w", err)
}
return sessionsJSON, nil
}
@ -97,7 +97,7 @@ func (mach *OlmMachine) importExportedRoomKey(session ExportedSession) (bool, er
igsInternal, err := olm.InboundGroupSessionImport([]byte(session.SessionKey))
if err != nil {
return false, errors.Wrap(err, "failed to import session")
return false, fmt.Errorf("failed to import session: %w", err)
} else if igsInternal.ID() != session.SessionID {
return false, ErrMismatchingExportedSessionID
}
@ -116,7 +116,7 @@ func (mach *OlmMachine) importExportedRoomKey(session ExportedSession) (bool, er
}
err = mach.CryptoStore.PutGroupSession(igs.RoomID, igs.SenderKey, igs.ID(), igs)
if err != nil {
return false, errors.Wrap(err, "failed to store imported session")
return false, fmt.Errorf("failed to store imported session: %w", err)
}
mach.markSessionReceived(igs.ID())
return true, nil

View file

@ -7,11 +7,11 @@
package crypto
import (
"errors"
"fmt"
"sync"
"time"
"github.com/pkg/errors"
"maunium.net/go/mautrix/crypto/olm"
"maunium.net/go/mautrix/id"
@ -50,7 +50,7 @@ type OlmMachine struct {
roomKeyRequestFilled *sync.Map
keyVerificationTransactionState *sync.Map
keyWaiters map[id.SessionID]chan struct{}
keyWaiters map[id.SessionID]chan struct{}
keyWaitersLock sync.Mutex
}
@ -251,7 +251,7 @@ func (mach *OlmMachine) GetOrFetchDevice(userID id.UserID, deviceID id.DeviceID)
// get device identity
device, err := mach.CryptoStore.GetDevice(userID, deviceID)
if err != nil {
return nil, errors.Wrap(err, "failed to get sender device from store")
return nil, fmt.Errorf("failed to get sender device from store: %w", err)
} else if device != nil {
return device, nil
}
@ -261,9 +261,9 @@ func (mach *OlmMachine) GetOrFetchDevice(userID id.UserID, deviceID id.DeviceID)
if device, ok = devices[deviceID]; ok {
return device, nil
}
return nil, errors.Errorf("Failed to get identity for device %v", deviceID)
return nil, fmt.Errorf("didn't get identity for device %s of %s", deviceID, userID)
}
return nil, errors.Errorf("Error fetching devices for user %v", userID)
return nil, fmt.Errorf("didn't get any devices for %s", userID)
}
// SendEncryptedToDevice sends an Olm-encrypted event to the given user device.
@ -283,7 +283,7 @@ func (mach *OlmMachine) SendEncryptedToDevice(device *DeviceIdentity, content ev
return err
}
if olmSess == nil {
return errors.Errorf("Did not find created outbound session for device %v", device.DeviceID)
return fmt.Errorf("didn't find created outbound session for device %s of %s", device.DeviceID, device.UserID)
}
encrypted := mach.encryptOlmEvent(olmSess, device, event.ToDeviceForwardedRoomKey, content)

View file

@ -7,11 +7,10 @@
package crypto
import (
"errors"
"strings"
"time"
"github.com/pkg/errors"
"maunium.net/go/mautrix/crypto/olm"
"maunium.net/go/mautrix/event"

View file

@ -12,7 +12,6 @@ import (
"strings"
"github.com/lib/pq"
"github.com/pkg/errors"
"maunium.net/go/mautrix/crypto/olm"
"maunium.net/go/mautrix/crypto/sql_store_upgrade"
@ -183,7 +182,7 @@ func (store *SQLCryptoStore) AddSession(key id.SenderKey, session *OlmSession) e
}
// UpdateSession replaces the Olm session for a sender in the database.
func (store *SQLCryptoStore) UpdateSession(key id.SenderKey, session *OlmSession) error {
func (store *SQLCryptoStore) UpdateSession(_ id.SenderKey, session *OlmSession) error {
sessionBytes := session.Internal.Pickle(store.PickleKey)
_, err := store.DB.Exec("UPDATE crypto_olm_session SET session=$1, last_used=$2 WHERE session_id=$3 AND account_id=$4",
sessionBytes, session.UseTime, session.ID(), store.AccountID)
@ -492,18 +491,18 @@ func (store *SQLCryptoStore) PutDevices(userID id.UserID, devices map[id.DeviceI
err = fmt.Errorf("unsupported dialect %s", store.Dialect)
}
if err != nil {
return errors.Wrap(err, "failed to add user to tracked users list")
return fmt.Errorf("failed to add user to tracked users list: %w", err)
}
_, err = tx.Exec("DELETE FROM crypto_device WHERE user_id=$1", userID)
if err != nil {
_ = tx.Rollback()
return errors.Wrap(err, "failed to delete old devices")
return fmt.Errorf("failed to delete old devices: %w", err)
}
if len(devices) == 0 {
err = tx.Commit()
if err != nil {
return errors.Wrap(err, "failed to commit changes (no devices added)")
return fmt.Errorf("failed to commit changes (no devices added): %w", err)
}
return nil
}
@ -533,12 +532,12 @@ func (store *SQLCryptoStore) PutDevices(userID id.UserID, devices map[id.DeviceI
_, err = tx.Exec("INSERT INTO crypto_device (user_id, device_id, identity_key, signing_key, trust, deleted, name) VALUES "+valueString, values...)
if err != nil {
_ = tx.Rollback()
return errors.Wrap(err, "failed to insert new devices")
return fmt.Errorf("failed to insert new devices: %w", err)
}
}
err = tx.Commit()
if err != nil {
return errors.Wrap(err, "failed to commit changes")
return fmt.Errorf("failed to commit changes: %w", err)
}
return nil
}

View file

@ -2,14 +2,15 @@ package sql_store_upgrade
import (
"database/sql"
"errors"
"fmt"
"strings"
"github.com/pkg/errors"
)
type upgradeFunc func(*sql.Tx, string) error
var ErrUnknownDialect = errors.New("unknown dialect")
var Upgrades = [...]upgradeFunc{
func(tx *sql.Tx, _ string) error {
for _, query := range []string{
@ -153,7 +154,7 @@ var Upgrades = [...]upgradeFunc{
}
}
} else {
return errors.New("unknown dialect: " + dialect)
return fmt.Errorf("%w (%s)", ErrUnknownDialect, dialect)
}
return nil
},
@ -203,7 +204,7 @@ var Upgrades = [...]upgradeFunc{
return err
}
} else {
return errors.New("unknown dialect: " + dialect)
return fmt.Errorf("%w (%s)", ErrUnknownDialect, dialect)
}
return nil
},

View file

@ -11,6 +11,7 @@ package crypto
import (
"context"
"encoding/json"
"errors"
"fmt"
"math/rand"
"sort"
@ -19,8 +20,6 @@ import (
"sync"
"time"
"github.com/pkg/errors"
"maunium.net/go/mautrix"
"maunium.net/go/mautrix/crypto/canonicaljson"
"maunium.net/go/mautrix/crypto/olm"
@ -28,11 +27,14 @@ import (
"maunium.net/go/mautrix/id"
)
// ErrUnknownTransaction is returned when a key verification message is received with an unknown transaction ID.
var ErrUnknownTransaction = errors.New("Unknown transaction")
// ErrUnknownVerificationMethod is returned when the verification method in a received m.key.verification.start is unknown.
var ErrUnknownVerificationMethod = errors.New("Unknown verification method")
var (
ErrUnknownUserForTransaction = errors.New("unknown user for transaction")
ErrTransactionAlreadyExists = errors.New("transaction already exists")
// ErrUnknownTransaction is returned when a key verification message is received with an unknown transaction ID.
ErrUnknownTransaction = errors.New("unknown transaction")
// ErrUnknownVerificationMethod is returned when the verification method in a received m.key.verification.start is unknown.
ErrUnknownVerificationMethod = errors.New("unknown verification method")
)
type VerificationHooks interface {
// VerifySASMatch receives the generated SAS and its method, as well as the device that is being verified.
@ -130,7 +132,7 @@ func (mach *OlmMachine) getTransactionState(transactionID string, userID id.User
reason := fmt.Sprintf("Unknown user for transaction %v: %v", transactionID, userID)
_ = mach.SendSASVerificationCancel(userID, id.DeviceID("*"), transactionID, reason, event.VerificationCancelUserMismatch)
mach.keyVerificationTransactionState.Delete(userID.String() + ":" + transactionID)
return nil, errors.New(reason)
return nil, fmt.Errorf("%w %s: %s", ErrUnknownUserForTransaction, transactionID, userID)
}
return verState, nil
}
@ -544,7 +546,7 @@ func (mach *OlmMachine) NewSASVerificationWith(device *DeviceIdentity, hooks Ver
verState.startEventCanonical = string(canonical)
_, loaded := mach.keyVerificationTransactionState.LoadOrStore(device.UserID.String()+":"+transactionID, verState)
if loaded {
return "", errors.New("Transaction already exists")
return "", ErrTransactionAlreadyExists
}
mach.timeoutAfter(verState, transactionID, timeout)

View file

@ -9,11 +9,10 @@ package event
import (
"encoding/gob"
"encoding/json"
"errors"
"fmt"
"reflect"
"strings"
"github.com/pkg/errors"
)
// TypeMap is a mapping from event type to the content struct type.

View file

@ -9,8 +9,6 @@ package event
import (
"encoding/json"
"github.com/pkg/errors"
"maunium.net/go/mautrix/id"
)
@ -58,7 +56,7 @@ func (content *EncryptedEventContent) UnmarshalJSON(data []byte) error {
return json.Unmarshal(content.Ciphertext, &content.OlmCiphertext)
case id.AlgorithmMegolmV1:
if len(content.Ciphertext) == 0 || content.Ciphertext[0] != '"' || content.Ciphertext[len(content.Ciphertext)-1] != '"' {
return errors.New("input doesn't look like a JSON string")
return id.InputNotJSONString
}
content.MegolmCiphertext = content.Ciphertext[1 : len(content.Ciphertext)-1]
}

1
go.mod
View file

@ -6,7 +6,6 @@ require (
github.com/gorilla/mux v1.7.4
github.com/lib/pq v1.7.0
github.com/mattn/go-sqlite3 v1.14.0
github.com/pkg/errors v0.9.1
github.com/russross/blackfriday/v2 v2.0.1
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
github.com/stretchr/testify v1.6.1