TwoFactorAuthService.java

1
package com.edtech.service;
2
3
import dev.samstevens.totp.code.CodeVerifier;
4
import dev.samstevens.totp.code.DefaultCodeGenerator;
5
import dev.samstevens.totp.code.DefaultCodeVerifier;
6
import dev.samstevens.totp.code.HashingAlgorithm;
7
import dev.samstevens.totp.exceptions.QrGenerationException;
8
import dev.samstevens.totp.qr.QrData;
9
import dev.samstevens.totp.qr.QrGenerator;
10
import dev.samstevens.totp.qr.ZxingPngQrGenerator;
11
import dev.samstevens.totp.secret.DefaultSecretGenerator;
12
import dev.samstevens.totp.secret.SecretGenerator;
13
import dev.samstevens.totp.time.SystemTimeProvider;
14
import dev.samstevens.totp.time.TimeProvider;
15
import java.util.Base64;
16
import org.springframework.stereotype.Service;
17
18
/** Javadoc. */
19
@Service
20
public class TwoFactorAuthService {
21
22
  private final SecretGenerator secretGenerator;
23
  private final QrGenerator qrGenerator;
24
  private final CodeVerifier codeVerifier;
25
26
  /** Javadoc. */
27
  public TwoFactorAuthService() {
28
    this.secretGenerator = new DefaultSecretGenerator();
29
    this.qrGenerator = new ZxingPngQrGenerator();
30
31
    TimeProvider timeProvider = new SystemTimeProvider();
32
    DefaultCodeGenerator codeGenerator = new DefaultCodeGenerator();
33
    this.codeVerifier = new DefaultCodeVerifier(codeGenerator, timeProvider);
34
  }
35
36
  /** Generates a new Base32 encoded secret. */
37
  public String generateSecret() {
38 1 1. generateSecret : replaced return value with "" for com/edtech/service/TwoFactorAuthService::generateSecret → NO_COVERAGE
    return secretGenerator.generate();
39
  }
40
41
  /** Generates a QR Code Image (Data URI encoded in Base64) for the given user email and secret. */
42
  public String getQrCodeImageUri(String secret, String email) throws QrGenerationException {
43
    QrData data =
44
        new QrData.Builder()
45
            .label(email)
46
            .secret(secret)
47
            .issuer("EdTech")
48
            .algorithm(HashingAlgorithm.SHA1)
49
            .digits(6)
50
            .period(30)
51
            .build();
52
53
    byte[] imageData = qrGenerator.generate(data);
54
    String mimeType = qrGenerator.getImageMimeType();
55
56 1 1. getQrCodeImageUri : replaced return value with "" for com/edtech/service/TwoFactorAuthService::getQrCodeImageUri → NO_COVERAGE
    return "data:" + mimeType + ";base64," + Base64.getEncoder().encodeToString(imageData);
57
  }
58
59
  /** Verifies the given code against the given secret. */
60
  public boolean verifyCode(String secret, String code) {
61 2 1. verifyCode : replaced boolean return with false for com/edtech/service/TwoFactorAuthService::verifyCode → NO_COVERAGE
2. verifyCode : replaced boolean return with true for com/edtech/service/TwoFactorAuthService::verifyCode → NO_COVERAGE
    return codeVerifier.isValidCode(secret, code);
62
  }
63
}

Mutations

38

1.1
Location : generateSecret
Killed by : none
replaced return value with "" for com/edtech/service/TwoFactorAuthService::generateSecret → NO_COVERAGE

56

1.1
Location : getQrCodeImageUri
Killed by : none
replaced return value with "" for com/edtech/service/TwoFactorAuthService::getQrCodeImageUri → NO_COVERAGE

61

1.1
Location : verifyCode
Killed by : none
replaced boolean return with false for com/edtech/service/TwoFactorAuthService::verifyCode → NO_COVERAGE

2.2
Location : verifyCode
Killed by : none
replaced boolean return with true for com/edtech/service/TwoFactorAuthService::verifyCode → NO_COVERAGE

Active mutators

Tests examined


Report generated by PIT 1.16.1