Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
641c340b15 | |||
af4181185c | |||
ced84a05a6 | |||
474d014f09 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -29,6 +29,7 @@ build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
.cache/
|
||||
|
||||
node_modules
|
||||
bundle.js
|
||||
|
51
.prettierignore
Normal file
51
.prettierignore
Normal file
@ -0,0 +1,51 @@
|
||||
HELP.md
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**
|
||||
!**/src/test/**
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
.cache/
|
||||
|
||||
node_modules
|
||||
bundle.js
|
||||
bundle.min.js
|
||||
adminBundle.js
|
||||
adminBundle.min.js
|
||||
worker.js
|
||||
chatWorker.js
|
||||
chatWorker.min.js
|
||||
node
|
||||
src/main/javascript/node/
|
||||
dist
|
||||
out
|
||||
yarn-error.log
|
||||
gen-password.txt
|
||||
|
||||
**/static/**
|
||||
|
||||
License.md
|
@ -34,6 +34,7 @@
|
||||
"grunt-banner": "^0.6.0",
|
||||
"grunt-browserify": "^5.3.0",
|
||||
"grunt-terser": "^1.0.0",
|
||||
"prettier": "2.0.5",
|
||||
"tsify": "^4.0.1",
|
||||
"typescript": "^3.7.4",
|
||||
"uglify-js": "^3.7.5"
|
||||
|
11
pom.xml
11
pom.xml
@ -223,6 +223,17 @@
|
||||
</excludeProperties>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>net.revelc.code.formatter</groupId>
|
||||
<artifactId>formatter-maven-plugin</artifactId>
|
||||
<version>2.12.0</version>
|
||||
<configuration>
|
||||
<configFile>${project.basedir}/eclipse-formatter.xml</configFile>
|
||||
<compilerSource>11</compilerSource>
|
||||
<compilerCompliance>11</compilerCompliance>
|
||||
<compilerTargetPlatform>11</compilerTargetPlatform>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
@ -1,34 +1,34 @@
|
||||
{
|
||||
"properties": [
|
||||
{
|
||||
"name": "chatto.token.timeout-duration",
|
||||
"type": "java.lang.String",
|
||||
"description": "The duration for auth token validity. Token expires after this period of inactivity"
|
||||
},
|
||||
{
|
||||
"name": "chatto.frontend.log-level",
|
||||
"type": "java.lang.String",
|
||||
"description": "The log level for the frontend JS application"
|
||||
},
|
||||
{
|
||||
"name": "chatto.frontend.chat-page-size",
|
||||
"type": "java.lang.Integer",
|
||||
"description": "The pagination size for the chat area"
|
||||
},
|
||||
{
|
||||
"name": "chat-worker-bundle",
|
||||
"type": "java.lang.String",
|
||||
"description": "Name of the chat worker js bundle"
|
||||
},
|
||||
{
|
||||
"name": "chat-bundle",
|
||||
"type": "java.lang.String",
|
||||
"description": "Name of the chatjs bundle"
|
||||
},
|
||||
{
|
||||
"name": "admin-bundle",
|
||||
"type": "java.lang.String",
|
||||
"description": "Name of the admin js bundle"
|
||||
}
|
||||
]
|
||||
"properties" : [
|
||||
{
|
||||
"name" : "chatto.token.timeout-duration",
|
||||
"type" : "java.lang.String",
|
||||
"description" : "The duration for auth token validity. Token expires after this period of inactivity"
|
||||
},
|
||||
{
|
||||
"name" : "chatto.frontend.log-level",
|
||||
"type" : "java.lang.String",
|
||||
"description" : "The log level for the frontend JS application"
|
||||
},
|
||||
{
|
||||
"name" : "chatto.frontend.chat-page-size",
|
||||
"type" : "java.lang.Integer",
|
||||
"description" : "The pagination size for the chat area"
|
||||
},
|
||||
{
|
||||
"name" : "chat-worker-bundle",
|
||||
"type" : "java.lang.String",
|
||||
"description" : "Name of the chat worker js bundle"
|
||||
},
|
||||
{
|
||||
"name" : "chat-bundle",
|
||||
"type" : "java.lang.String",
|
||||
"description" : "Name of the chatjs bundle"
|
||||
},
|
||||
{
|
||||
"name" : "admin-bundle",
|
||||
"type" : "java.lang.String",
|
||||
"description" : "Name of the admin js bundle"
|
||||
}
|
||||
]
|
||||
}
|
@ -2,6 +2,9 @@ package db.migration;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.FileWriter;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.attribute.PosixFilePermission;
|
||||
import java.security.SecureRandom;
|
||||
import java.sql.PreparedStatement;
|
||||
|
||||
@ -12,50 +15,75 @@ import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
|
||||
public class V3__add_default_admin extends BaseJavaMigration {
|
||||
|
||||
private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
|
||||
private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
|
||||
|
||||
private final SecureRandom random = new SecureRandom();
|
||||
private final SecureRandom random = new SecureRandom();
|
||||
|
||||
/** different dictionaries used */
|
||||
private final String ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
private final String ALPHA = "abcdefghijklmnopqrstuvwxyz";
|
||||
private final String NUMERIC = "0123456789";
|
||||
private final String SPECIAL_CHARS = "!@#$%^&*_=+-/";
|
||||
/** different dictionaries used */
|
||||
private final String ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
private final String ALPHA = "abcdefghijklmnopqrstuvwxyz";
|
||||
private final String NUMERIC = "0123456789";
|
||||
private final String SPECIAL_CHARS = "!@#$%^&*_=+-/";
|
||||
|
||||
/**
|
||||
* Method will generate random string based on the parameters
|
||||
*
|
||||
* @param len the length of the random string
|
||||
* @param dic the dictionary used to generate the password
|
||||
* @return the random password
|
||||
*/
|
||||
public String generatePassword(int len, String dic) {
|
||||
String result = "";
|
||||
for (int i = 0; i < len; i++) {
|
||||
int index = random.nextInt(dic.length());
|
||||
result += dic.charAt(index);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
/**
|
||||
* Method will generate random string based on the parameters
|
||||
*
|
||||
* @param len
|
||||
* the length of the random string
|
||||
* @param dic
|
||||
* the dictionary used to generate the password
|
||||
* @return the random password
|
||||
*/
|
||||
public String generatePassword(int len, String dic) {
|
||||
String result = "";
|
||||
for (int i = 0; i < len; i++) {
|
||||
int index = random.nextInt(dic.length());
|
||||
result += dic.charAt(index);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void migrate(final Context context) throws Exception {
|
||||
try (final PreparedStatement ps = context.getConnection()
|
||||
.prepareStatement("insert into users (user_id, name, password) values (0,?,?)")) {
|
||||
final String generatedPassword = generatePassword(60, ALPHA_CAPS + ALPHA + SPECIAL_CHARS);
|
||||
final BufferedWriter bw = new BufferedWriter(new FileWriter("gen-password.txt"));
|
||||
bw.write(generatedPassword);
|
||||
bw.write("\nPlease delete this file");
|
||||
bw.close();
|
||||
ps.setString(1, "admin");
|
||||
ps.setString(2, passwordEncoder.encode(generatedPassword));
|
||||
ps.execute();
|
||||
}
|
||||
@Override
|
||||
public void migrate(final Context context) throws Exception {
|
||||
try (final PreparedStatement ps = context.getConnection()
|
||||
.prepareStatement(
|
||||
"insert into users (user_id, name, password) values (0,?,?)")) {
|
||||
final String generatedPassword = generatePassword(60,
|
||||
ALPHA_CAPS + ALPHA + SPECIAL_CHARS);
|
||||
final BufferedWriter bw = new BufferedWriter(
|
||||
new FileWriter("gen-password.txt"));
|
||||
|
||||
try (final PreparedStatement ps = context.getConnection()
|
||||
.prepareStatement("insert into users_roles (user_id, role_id) values (1,0)")) {
|
||||
ps.execute();
|
||||
}
|
||||
}
|
||||
bw.write(generatedPassword);
|
||||
bw.write("\nPlease delete this file");
|
||||
bw.close();
|
||||
|
||||
final var perms = Files
|
||||
.getPosixFilePermissions(Paths.get("gen-password.txt"));
|
||||
|
||||
// add owners permission
|
||||
perms.add(PosixFilePermission.OWNER_READ);
|
||||
perms.add(PosixFilePermission.OWNER_WRITE);
|
||||
perms.remove(PosixFilePermission.OWNER_EXECUTE);
|
||||
// add group permissions
|
||||
perms.remove(PosixFilePermission.GROUP_READ);
|
||||
perms.remove(PosixFilePermission.GROUP_WRITE);
|
||||
perms.remove(PosixFilePermission.GROUP_EXECUTE);
|
||||
// add others permissions
|
||||
perms.remove(PosixFilePermission.OTHERS_READ);
|
||||
perms.remove(PosixFilePermission.OTHERS_WRITE);
|
||||
perms.remove(PosixFilePermission.OTHERS_EXECUTE);
|
||||
Files.setPosixFilePermissions(Paths.get("gen-password.txt"), perms);
|
||||
|
||||
ps.setString(1, "admin");
|
||||
ps.setString(2, passwordEncoder.encode(generatedPassword));
|
||||
ps.execute();
|
||||
}
|
||||
|
||||
try (final PreparedStatement ps = context.getConnection()
|
||||
.prepareStatement(
|
||||
"insert into users_roles (user_id, role_id) values (1,0)")) {
|
||||
ps.execute();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -17,8 +17,8 @@ public class ChattoApplication extends SpringBootServletInitializer {
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@Profile("development")
|
||||
@ComponentScan(lazyInit = true)
|
||||
static class LocalConfig {
|
||||
}
|
||||
@Profile("development")
|
||||
@ComponentScan(lazyInit = true)
|
||||
static class LocalConfig {
|
||||
}
|
||||
}
|
@ -12,19 +12,21 @@ import org.springframework.security.web.authentication.www.BasicAuthenticationEn
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public final class RESTAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
|
||||
public final class RESTAuthenticationEntryPoint
|
||||
extends BasicAuthenticationEntryPoint {
|
||||
|
||||
@Override
|
||||
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
|
||||
throws IOException, ServletException {
|
||||
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
PrintWriter writer = response.getWriter();
|
||||
writer.println("HTTP ApplicationStatus 401 - " + authEx.getMessage());
|
||||
}
|
||||
@Override
|
||||
public void commence(HttpServletRequest request,
|
||||
HttpServletResponse response, AuthenticationException authEx)
|
||||
throws IOException, ServletException {
|
||||
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
PrintWriter writer = response.getWriter();
|
||||
writer.println("HTTP ApplicationStatus 401 - " + authEx.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
setRealmName("Chatto");
|
||||
super.afterPropertiesSet();
|
||||
}
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
setRealmName("Chatto");
|
||||
super.afterPropertiesSet();
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,8 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
|
||||
public class ServletInitializer extends SpringBootServletInitializer {
|
||||
|
||||
@Override
|
||||
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
|
||||
protected SpringApplicationBuilder configure(
|
||||
SpringApplicationBuilder application) {
|
||||
return application.sources(ChattoApplication.class);
|
||||
}
|
||||
|
||||
|
@ -5,16 +5,14 @@ import org.springframework.web.servlet.config.annotation.CorsRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
@Configuration
|
||||
//@EnableWebMvc
|
||||
// @EnableWebMvc
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
|
||||
@Override
|
||||
public void addCorsMappings(CorsRegistry registry) {
|
||||
registry.addMapping("/api/**")
|
||||
.allowedOrigins("*")
|
||||
.allowedMethods("POST","GET","OPTIONS")
|
||||
.allowedHeaders("*")
|
||||
.allowCredentials(false).maxAge(3600);
|
||||
@Override
|
||||
public void addCorsMappings(CorsRegistry registry) {
|
||||
registry.addMapping("/api/**").allowedOrigins("*")
|
||||
.allowedMethods("POST", "GET", "OPTIONS").allowedHeaders("*")
|
||||
.allowCredentials(false).maxAge(3600);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -4,7 +4,10 @@ import java.awt.image.BufferedImage;
|
||||
|
||||
interface CaptchaBehaviour {
|
||||
public BufferedImage generateCaptcha();
|
||||
|
||||
public BufferedImage generateCaptcha(String captchaText);
|
||||
|
||||
public String getRandomChars(int size);
|
||||
|
||||
public String getRandomChars();
|
||||
}
|
||||
|
@ -6,9 +6,10 @@ import lombok.Builder;
|
||||
|
||||
/*Class for providing your own captcha generator*/
|
||||
@Builder
|
||||
public class ManualCaptchaBehaviour implements CaptchaBehaviour{
|
||||
public class ManualCaptchaBehaviour implements CaptchaBehaviour {
|
||||
private final int length;
|
||||
private final String style;
|
||||
|
||||
@Override
|
||||
public BufferedImage generateCaptcha() {
|
||||
// TODO Auto-generated method stub
|
||||
@ -33,5 +34,4 @@ public class ManualCaptchaBehaviour implements CaptchaBehaviour{
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -10,174 +10,183 @@ import java.io.IOException;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* This class represents a simple captcha consisting
|
||||
* of an image {@code png} and its text value.
|
||||
* Comic Neue Bold Font.
|
||||
* Capital english letters {@code ONLY}.
|
||||
* This class represents a simple captcha consisting of an image {@code png} and
|
||||
* its text value. Comic Neue Bold Font. Capital english letters {@code ONLY}.
|
||||
*
|
||||
* @since 1.3
|
||||
* @author Gennadiy Golovin
|
||||
*/
|
||||
public final class SimpleCaptcha {
|
||||
|
||||
private BufferedImage imagePng;
|
||||
private char[] text;
|
||||
private BufferedImage imagePng;
|
||||
private char[] text;
|
||||
|
||||
/**
|
||||
* Initializes a newly created default object
|
||||
* consisting of 8 capital english letters.
|
||||
*/
|
||||
public SimpleCaptcha() {
|
||||
this.text = getRandomChars();
|
||||
/**
|
||||
* Initializes a newly created default object consisting of 8 capital
|
||||
* english letters.
|
||||
*/
|
||||
public SimpleCaptcha() {
|
||||
this.text = getRandomChars();
|
||||
|
||||
try {
|
||||
generateCaptcha();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
try {
|
||||
generateCaptcha();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a newly created object, which length
|
||||
* depends on the passed {@code int} parameter,
|
||||
* which {@code MUST} be greater than 0.
|
||||
* If the condition is not met, initializes a newly
|
||||
* created default object consisting of 8 symbols.
|
||||
*
|
||||
* @param length the quantity of symbols, that the
|
||||
* captcha consists of, greater than 0.
|
||||
*/
|
||||
public SimpleCaptcha(int length) {
|
||||
if (length < 1) {
|
||||
this.text = getRandomChars();
|
||||
} else {
|
||||
this.text = getRandomChars(length);
|
||||
}
|
||||
/**
|
||||
* Initializes a newly created object, which length depends on the passed
|
||||
* {@code int} parameter, which {@code MUST} be greater than 0. If the
|
||||
* condition is not met, initializes a newly created default object
|
||||
* consisting of 8 symbols.
|
||||
*
|
||||
* @param length
|
||||
* the quantity of symbols, that the captcha consists of, greater
|
||||
* than 0.
|
||||
*/
|
||||
public SimpleCaptcha(int length) {
|
||||
if (length < 1) {
|
||||
this.text = getRandomChars();
|
||||
} else {
|
||||
this.text = getRandomChars(length);
|
||||
}
|
||||
|
||||
try {
|
||||
generateCaptcha();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
try {
|
||||
generateCaptcha();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a newly created object based on the passed
|
||||
* {@link String} parameter, consisting of capital english
|
||||
* letters. If the condition is not met, initializes a newly
|
||||
* created default object consisting of 8 capital english letters.
|
||||
*
|
||||
* @param text the text string with the value of the captcha,
|
||||
* length greater than 0.
|
||||
*/
|
||||
public SimpleCaptcha(String text) {
|
||||
if (text == null || text.equals("")) {
|
||||
this.text = getRandomChars();
|
||||
} else {
|
||||
this.text = text.toCharArray();
|
||||
}
|
||||
/**
|
||||
* Initializes a newly created object based on the passed {@link String}
|
||||
* parameter, consisting of capital english letters. If the condition is not
|
||||
* met, initializes a newly created default object consisting of 8 capital
|
||||
* english letters.
|
||||
*
|
||||
* @param text
|
||||
* the text string with the value of the captcha, length greater
|
||||
* than 0.
|
||||
*/
|
||||
public SimpleCaptcha(String text) {
|
||||
if (text == null || text.equals("")) {
|
||||
this.text = getRandomChars();
|
||||
} else {
|
||||
this.text = text.toCharArray();
|
||||
}
|
||||
|
||||
try {
|
||||
generateCaptcha();
|
||||
} catch (IOException e) {
|
||||
this.text = getRandomChars();
|
||||
try {
|
||||
generateCaptcha();
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
generateCaptcha();
|
||||
} catch (IOException e) {
|
||||
this.text = getRandomChars();
|
||||
try {
|
||||
generateCaptcha();
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the picture with captcha
|
||||
*
|
||||
* @return {@link BufferedImage}
|
||||
*/
|
||||
public BufferedImage getImagePng() {
|
||||
return imagePng;
|
||||
}
|
||||
/**
|
||||
* Returns the picture with captcha
|
||||
*
|
||||
* @return {@link BufferedImage}
|
||||
*/
|
||||
public BufferedImage getImagePng() {
|
||||
return imagePng;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text value of the captcha
|
||||
*
|
||||
* @return {@link String}
|
||||
*/
|
||||
public String getText() {
|
||||
return String.valueOf(text);
|
||||
}
|
||||
/**
|
||||
* Returns the text value of the captcha
|
||||
*
|
||||
* @return {@link String}
|
||||
*/
|
||||
public String getText() {
|
||||
return String.valueOf(text);
|
||||
}
|
||||
|
||||
//////// //////// //////// //////// //////// //////// //////// ////////
|
||||
//////// //////// //////// //////// //////// //////// //////// ////////
|
||||
|
||||
private char[] getRandomChars() {
|
||||
return getRandomChars(8);
|
||||
}
|
||||
private char[] getRandomChars() {
|
||||
return getRandomChars(8);
|
||||
}
|
||||
|
||||
private char[] getRandomChars(int quantity) {
|
||||
private char[] getRandomChars(int quantity) {
|
||||
|
||||
char[] randomString = new char[quantity];
|
||||
char[] randomString = new char[quantity];
|
||||
|
||||
Random random = new Random();
|
||||
Random random = new Random();
|
||||
|
||||
int capitalLetter;
|
||||
int capitalLetter;
|
||||
|
||||
for (int i = 0; i < quantity; i++) {
|
||||
capitalLetter = 65 + random.nextInt(26);
|
||||
randomString[i] = (char) capitalLetter;
|
||||
}
|
||||
for (int i = 0; i < quantity; i++) {
|
||||
capitalLetter = 65 + random.nextInt(26);
|
||||
randomString[i] = (char) capitalLetter;
|
||||
}
|
||||
|
||||
return randomString;
|
||||
}
|
||||
return randomString;
|
||||
}
|
||||
|
||||
private void generateCaptcha() throws IOException {
|
||||
int charsQuantity = this.text.length;
|
||||
BufferedImage[] images = new BufferedImage[charsQuantity];
|
||||
private void generateCaptcha() throws IOException {
|
||||
int charsQuantity = this.text.length;
|
||||
BufferedImage[] images = new BufferedImage[charsQuantity];
|
||||
|
||||
for (int i = 0; i < charsQuantity; i++) {
|
||||
images[i] = ImageIO.read(SimpleCaptcha.class.getResourceAsStream("/pictures/" + this.text[i] + ".png"));
|
||||
if (i % 2 == 0) {
|
||||
images[i] = rotateImage(images[i], 25);
|
||||
} else {
|
||||
images[i] = rotateImage(images[i], -20);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < charsQuantity; i++) {
|
||||
images[i] = ImageIO.read(SimpleCaptcha.class
|
||||
.getResourceAsStream("/pictures/" + this.text[i] + ".png"));
|
||||
if (i % 2 == 0) {
|
||||
images[i] = rotateImage(images[i], 25);
|
||||
} else {
|
||||
images[i] = rotateImage(images[i], -20);
|
||||
}
|
||||
}
|
||||
|
||||
int imageSize = 30;
|
||||
int rotatedImageSize = (int) Math.sqrt(imageSize * imageSize * 2);
|
||||
int imageSize = 30;
|
||||
int rotatedImageSize = (int) Math.sqrt(imageSize * imageSize * 2);
|
||||
|
||||
BufferedImage captchaImg = new BufferedImage(rotatedImageSize * (charsQuantity - 1) / 10 * 6 + rotatedImageSize, rotatedImageSize, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D graphics2d = captchaImg.createGraphics();
|
||||
graphics2d.setBackground(Color.WHITE);
|
||||
graphics2d.clearRect(0, 0, captchaImg.getWidth(), captchaImg.getHeight());
|
||||
for (int i = 0; i < charsQuantity; i++) {
|
||||
captchaImg.getGraphics().drawImage(images[i], rotatedImageSize * i / 10 * 6, 0, null);
|
||||
}
|
||||
graphics2d.dispose();
|
||||
this.imagePng = captchaImg;
|
||||
}
|
||||
BufferedImage captchaImg = new BufferedImage(
|
||||
rotatedImageSize * (charsQuantity - 1) / 10 * 6
|
||||
+ rotatedImageSize,
|
||||
rotatedImageSize, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D graphics2d = captchaImg.createGraphics();
|
||||
graphics2d.setBackground(Color.WHITE);
|
||||
graphics2d.clearRect(0, 0, captchaImg.getWidth(),
|
||||
captchaImg.getHeight());
|
||||
for (int i = 0; i < charsQuantity; i++) {
|
||||
captchaImg.getGraphics().drawImage(images[i],
|
||||
rotatedImageSize * i / 10 * 6, 0, null);
|
||||
}
|
||||
graphics2d.dispose();
|
||||
this.imagePng = captchaImg;
|
||||
}
|
||||
|
||||
private BufferedImage rotateImage(BufferedImage buffImage, double angle) {
|
||||
private BufferedImage rotateImage(BufferedImage buffImage, double angle) {
|
||||
|
||||
double radian = Math.toRadians(angle);
|
||||
double sin = Math.abs(Math.sin(radian));
|
||||
double cos = Math.abs(Math.cos(radian));
|
||||
double radian = Math.toRadians(angle);
|
||||
double sin = Math.abs(Math.sin(radian));
|
||||
double cos = Math.abs(Math.cos(radian));
|
||||
|
||||
int width = buffImage.getWidth();
|
||||
int height = buffImage.getHeight();
|
||||
int width = buffImage.getWidth();
|
||||
int height = buffImage.getHeight();
|
||||
|
||||
int nWidth = (int) Math.floor((double) width * cos + (double) height * sin);
|
||||
int nHeight = (int) Math.floor((double) height * cos + (double) width * sin);
|
||||
int nWidth = (int) Math
|
||||
.floor((double) width * cos + (double) height * sin);
|
||||
int nHeight = (int) Math
|
||||
.floor((double) height * cos + (double) width * sin);
|
||||
|
||||
BufferedImage rotatedImage = new BufferedImage(nWidth, nHeight, BufferedImage.TYPE_INT_ARGB);
|
||||
BufferedImage rotatedImage = new BufferedImage(nWidth, nHeight,
|
||||
BufferedImage.TYPE_INT_ARGB);
|
||||
|
||||
Graphics2D graphics = rotatedImage.createGraphics();
|
||||
Graphics2D graphics = rotatedImage.createGraphics();
|
||||
|
||||
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
|
||||
graphics.translate((nWidth - width) / 2, (nHeight - height) / 2);
|
||||
graphics.rotate(radian, (double) (width / 2), (double) (height / 2));
|
||||
graphics.drawImage(buffImage, 0, 0,null);
|
||||
graphics.dispose();
|
||||
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
|
||||
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
|
||||
graphics.translate((nWidth - width) / 2, (nHeight - height) / 2);
|
||||
graphics.rotate(radian, (double) (width / 2), (double) (height / 2));
|
||||
graphics.drawImage(buffImage, 0, 0, null);
|
||||
graphics.dispose();
|
||||
|
||||
return rotatedImage;
|
||||
}
|
||||
return rotatedImage;
|
||||
}
|
||||
}
|
@ -9,30 +9,30 @@ public class SimpleCaptchaBehavior implements CaptchaBehaviour {
|
||||
SimpleCaptcha simpleCaptcha = new SimpleCaptcha();
|
||||
return simpleCaptcha.getImagePng();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BufferedImage generateCaptcha(String captchaText) {
|
||||
SimpleCaptcha simpleCaptcha = new SimpleCaptcha(captchaText);
|
||||
return simpleCaptcha.getImagePng();
|
||||
}
|
||||
|
||||
|
||||
public String getRandomChars() {
|
||||
return getRandomChars(8);
|
||||
}
|
||||
|
||||
public String getRandomChars(int quantity)
|
||||
{
|
||||
return getRandomChars(8);
|
||||
}
|
||||
|
||||
public String getRandomChars(int quantity) {
|
||||
char[] randomString = new char[quantity];
|
||||
|
||||
Random random = new Random();
|
||||
Random random = new Random();
|
||||
|
||||
int capitalLetter;
|
||||
int capitalLetter;
|
||||
|
||||
for (int i = 0; i < quantity; i++) {
|
||||
capitalLetter = 65 + random.nextInt(26);
|
||||
randomString[i] = (char) capitalLetter;
|
||||
}
|
||||
for (int i = 0; i < quantity; i++) {
|
||||
capitalLetter = 65 + random.nextInt(26);
|
||||
randomString[i] = (char) capitalLetter;
|
||||
}
|
||||
|
||||
return new String(randomString);
|
||||
return new String(randomString);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -7,34 +7,35 @@ import lombok.Builder;
|
||||
@Builder
|
||||
public class WebCaptcha {
|
||||
private final CaptchaBehaviour captchaBehaviour;
|
||||
|
||||
|
||||
public BufferedImage generateCaptcha() {
|
||||
return captchaBehaviour.generateCaptcha();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public BufferedImage generateCaptcha(String captchaText) {
|
||||
return captchaBehaviour.generateCaptcha(captchaText);
|
||||
}
|
||||
|
||||
public String getRandomChars() {
|
||||
return captchaBehaviour.getRandomChars();
|
||||
}
|
||||
}
|
||||
|
||||
public String getRandomChars(int quantity) {
|
||||
return captchaBehaviour.getRandomChars(quantity);
|
||||
}
|
||||
public String getRandomChars() {
|
||||
return captchaBehaviour.getRandomChars();
|
||||
}
|
||||
|
||||
public String getRandomChars(int quantity) {
|
||||
return captchaBehaviour.getRandomChars(quantity);
|
||||
}
|
||||
}
|
||||
|
||||
// WebCaptcha webCaptcha = WebCaptcha.builder().captchaBehaviour(new SimpleCaptchaBehavior()).build();
|
||||
// webCaptcha.generateCaptcha();
|
||||
// WebCaptcha webCaptcha = WebCaptcha.builder().captchaBehaviour(new
|
||||
// SimpleCaptchaBehavior()).build();
|
||||
// webCaptcha.generateCaptcha();
|
||||
//
|
||||
// // @formatter:off
|
||||
// webCaptcha = WebCaptcha.builder()
|
||||
// .captchaBehaviour(
|
||||
// ManualCaptchaBehaviour.builder()
|
||||
// .length(8)
|
||||
// .style("black")
|
||||
// .build()
|
||||
// ).build();
|
||||
//
|
||||
// // @formatter:on
|
||||
// // @formatter:off
|
||||
// webCaptcha = WebCaptcha.builder()
|
||||
// .captchaBehaviour(
|
||||
// ManualCaptchaBehaviour.builder()
|
||||
// .length(8)
|
||||
// .style("black")
|
||||
// .build()
|
||||
// ).build();
|
||||
//
|
||||
// // @formatter:on
|
||||
|
@ -10,13 +10,13 @@ import lombok.Getter;
|
||||
@PropertySource(value = "classpath:git.properties")
|
||||
@Getter
|
||||
public class BuildInfo {
|
||||
private final String buildVersion;
|
||||
private final String branchName;
|
||||
private final String buildVersion;
|
||||
private final String branchName;
|
||||
|
||||
public BuildInfo(@Value("${git.build.version") String buildVersion,
|
||||
@Value("${git.branch") String branchName) {
|
||||
this.buildVersion = buildVersion;
|
||||
this.branchName = branchName;
|
||||
}
|
||||
public BuildInfo(@Value("${git.build.version") String buildVersion,
|
||||
@Value("${git.branch") String branchName) {
|
||||
this.buildVersion = buildVersion;
|
||||
this.branchName = branchName;
|
||||
}
|
||||
|
||||
}
|
@ -6,11 +6,14 @@ import org.ehcache.event.CacheEventListener;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class CustomCacheEventLogger implements CacheEventListener<Object, Object> {
|
||||
public class CustomCacheEventLogger
|
||||
implements CacheEventListener<Object, Object> {
|
||||
|
||||
@Override
|
||||
public void onEvent(CacheEvent<? extends Object, ? extends Object> cacheEvent) {
|
||||
log.debug("custom Caching event {} key = {} old {} new {} ", cacheEvent.getType(), cacheEvent.getKey(),
|
||||
public void onEvent(
|
||||
CacheEvent<? extends Object, ? extends Object> cacheEvent) {
|
||||
log.debug("custom Caching event {} key = {} old {} new {} ",
|
||||
cacheEvent.getType(), cacheEvent.getKey(),
|
||||
cacheEvent.getOldValue(), cacheEvent.getNewValue());
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.ros.chatto.config;
|
||||
|
||||
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
|
@ -89,8 +89,8 @@ public class ChatMessageController {
|
||||
@PathVariable final String userName,
|
||||
@PathVariable final Instant lastMessageTime,
|
||||
final Principal principal) {
|
||||
final List<ChatMessageDTO> chatMessageDTOs = chatService.getNewMessages(
|
||||
principal.getName(), userName, lastMessageTime);
|
||||
final List<ChatMessageDTO> chatMessageDTOs = chatService
|
||||
.getNewMessages(principal.getName(), userName, lastMessageTime);
|
||||
return chatMessageDTOs;
|
||||
}
|
||||
|
||||
|
14
src/main/java/org/ros/chatto/controller/CsrfController.java
Normal file
14
src/main/java/org/ros/chatto/controller/CsrfController.java
Normal file
@ -0,0 +1,14 @@
|
||||
package org.ros.chatto.controller;
|
||||
|
||||
import org.springframework.security.web.csrf.CsrfToken;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class CsrfController {
|
||||
|
||||
@RequestMapping("/csrf")
|
||||
public CsrfToken csrf(CsrfToken token) {
|
||||
return token;
|
||||
}
|
||||
}
|
@ -45,7 +45,7 @@ public class Home {
|
||||
|| r.getAuthority().equals("ROLE_SUPER_USER"));
|
||||
log.trace("Is admin? " + isAdmin);
|
||||
// model.addAttribute("activeUsers",
|
||||
// userService.getOtherActiveUsers(principal.getName()));
|
||||
// userService.getOtherActiveUsers(principal.getName()));
|
||||
return "chat";
|
||||
}
|
||||
}
|
||||
|
@ -14,16 +14,16 @@ import lombok.RequiredArgsConstructor;
|
||||
@RequestMapping("/api/stats")
|
||||
@RequiredArgsConstructor
|
||||
public class StatisticsController {
|
||||
private final StatisticsService statisticsService;
|
||||
private final StatisticsService statisticsService;
|
||||
|
||||
@GetMapping
|
||||
public StatsDTO rootStats() {
|
||||
return StatsDTO.builder()
|
||||
.totalMessages(statisticsService.totalMessage())
|
||||
.totalOnlineUsers(statisticsService.totalUsersOnline())
|
||||
.numMessagesToday(
|
||||
statisticsService.messagesOnDay(Instant.now()))
|
||||
.totalUsers(statisticsService.totalUsers()).build();
|
||||
}
|
||||
@GetMapping
|
||||
public StatsDTO rootStats() {
|
||||
return StatsDTO.builder()
|
||||
.totalMessages(statisticsService.totalMessage())
|
||||
.totalOnlineUsers(statisticsService.totalUsersOnline())
|
||||
.numMessagesToday(
|
||||
statisticsService.messagesOnDay(Instant.now()))
|
||||
.totalUsers(statisticsService.totalUsers()).build();
|
||||
}
|
||||
|
||||
}
|
@ -6,9 +6,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
@Controller
|
||||
@RequestMapping("/user")
|
||||
public class UserController {
|
||||
|
||||
@RequestMapping
|
||||
public String viewUserProfile() {
|
||||
return "user/home";
|
||||
}
|
||||
|
||||
@RequestMapping
|
||||
public String viewUserProfile() {
|
||||
return "user/home";
|
||||
}
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
package org.ros.chatto.dto;
|
||||
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.Pattern;
|
||||
import javax.validation.constraints.Size;
|
||||
@ -12,10 +11,10 @@ import lombok.Data;
|
||||
public class ChatMessageDTO {
|
||||
@NotBlank(message = "Username should not be blank")
|
||||
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "Username must be alphanumeric")
|
||||
@Size(max=15)
|
||||
@Size(max = 15)
|
||||
private String toUser;
|
||||
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "Username must be alphanumeric")
|
||||
@Size(max=15)
|
||||
@Size(max = 15)
|
||||
private String fromUser;
|
||||
private MessageCipherDTO messageCipher;
|
||||
private Instant messageTime;
|
||||
|
@ -12,7 +12,9 @@ import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MessageCipherDTO {
|
||||
@Pattern(regexp = "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$") // regex for base64
|
||||
@Pattern(regexp = "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$") // regex
|
||||
// for
|
||||
// base64
|
||||
@NotBlank
|
||||
private String iv;
|
||||
@Max(1)
|
||||
|
@ -16,11 +16,13 @@ public class UserRegistrationDTO {
|
||||
@Transient
|
||||
@Size(min = 4, max = 75, message = "Password must be between 4 and 75 characters")
|
||||
@NotBlank(message = "Password should not be blank")
|
||||
// @Pattern(regexp = "^.*(?=.{6,})(?=.*d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$", message = "Invalid password format")
|
||||
// @Pattern(regexp =
|
||||
// "^.*(?=.{6,})(?=.*d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$", message
|
||||
// = "Invalid password format")
|
||||
private String password;
|
||||
|
||||
|
||||
private Long captchaID;
|
||||
private String captchaText;
|
||||
|
||||
|
||||
private String captchaInput;
|
||||
}
|
||||
|
@ -7,15 +7,14 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class ErrorModel{
|
||||
public class ErrorModel {
|
||||
@JsonProperty("field_name")
|
||||
private String fieldName;
|
||||
private String fieldName;
|
||||
@JsonProperty("rejected_value")
|
||||
private Object rejectedValue;
|
||||
private Object rejectedValue;
|
||||
@JsonProperty("error_message")
|
||||
private String messageError;
|
||||
|
||||
|
||||
private String messageError;
|
||||
|
||||
}
|
@ -15,6 +15,6 @@ import lombok.NoArgsConstructor;
|
||||
@AllArgsConstructor
|
||||
public class ErrorResponse {
|
||||
@JsonProperty("errors")
|
||||
private List<ErrorModel> errorMessage;
|
||||
|
||||
private List<ErrorModel> errorMessage;
|
||||
|
||||
}
|
@ -4,5 +4,6 @@ import org.springframework.cache.annotation.CacheEvict;
|
||||
|
||||
public class TokenCacheUtil {
|
||||
@CacheEvict(value = "userTokenCache", key = "#cacheKey")
|
||||
public static void evictSingleTokenValue(String cacheKey) {}
|
||||
public static void evictSingleTokenValue(String cacheKey) {
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,8 @@ public class UserLoggingSessionListener implements HttpSessionBindingListener {
|
||||
@Override
|
||||
public void valueBound(HttpSessionBindingEvent event) {
|
||||
|
||||
UserLoggingSessionListener user = (UserLoggingSessionListener) event.getValue();
|
||||
UserLoggingSessionListener user = (UserLoggingSessionListener) event
|
||||
.getValue();
|
||||
|
||||
log.debug("Incrementing session count for user {}", user.getUsername());
|
||||
|
||||
@ -38,7 +39,8 @@ public class UserLoggingSessionListener implements HttpSessionBindingListener {
|
||||
|
||||
@Override
|
||||
public void valueUnbound(HttpSessionBindingEvent event) {
|
||||
UserLoggingSessionListener user = (UserLoggingSessionListener) event.getValue();
|
||||
UserLoggingSessionListener user = (UserLoggingSessionListener) event
|
||||
.getValue();
|
||||
|
||||
log.debug("Decrementing session count for user {}", user.getUsername());
|
||||
|
||||
|
@ -11,17 +11,19 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHand
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component("myAuthenticationSuccessHandler")
|
||||
public class UserSessionLoggingLoginSuccessHandler implements AuthenticationSuccessHandler {
|
||||
|
||||
@Override
|
||||
public void onAuthenticationSuccess(HttpServletRequest request,
|
||||
HttpServletResponse response, Authentication authentication)
|
||||
throws IOException {
|
||||
HttpSession session = request.getSession(false);
|
||||
if (session != null) {
|
||||
UserLoggingSessionListener user = new UserLoggingSessionListener(authentication.getName());
|
||||
session.setAttribute("user", user);
|
||||
}
|
||||
response.sendRedirect("/chat");
|
||||
}
|
||||
public class UserSessionLoggingLoginSuccessHandler
|
||||
implements AuthenticationSuccessHandler {
|
||||
|
||||
@Override
|
||||
public void onAuthenticationSuccess(HttpServletRequest request,
|
||||
HttpServletResponse response, Authentication authentication)
|
||||
throws IOException {
|
||||
HttpSession session = request.getSession(false);
|
||||
if (session != null) {
|
||||
UserLoggingSessionListener user = new UserLoggingSessionListener(
|
||||
authentication.getName());
|
||||
session.setAttribute("user", user);
|
||||
}
|
||||
response.sendRedirect("/chat");
|
||||
}
|
||||
}
|
@ -12,15 +12,16 @@ import org.springframework.security.web.authentication.logout.LogoutSuccessHandl
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component("myLogoutSuccessHandler")
|
||||
public class UserSessionLoggingLogoutSuccessHandler implements LogoutSuccessHandler{
|
||||
@Override
|
||||
public void onLogoutSuccess(HttpServletRequest request,
|
||||
HttpServletResponse response, Authentication authentication)
|
||||
throws IOException, ServletException {
|
||||
HttpSession session = request.getSession();
|
||||
if (session != null){
|
||||
session.removeAttribute("user");
|
||||
}
|
||||
response.sendRedirect("/login?logout");
|
||||
}
|
||||
public class UserSessionLoggingLogoutSuccessHandler
|
||||
implements LogoutSuccessHandler {
|
||||
@Override
|
||||
public void onLogoutSuccess(HttpServletRequest request,
|
||||
HttpServletResponse response, Authentication authentication)
|
||||
throws IOException, ServletException {
|
||||
HttpSession session = request.getSession();
|
||||
if (session != null) {
|
||||
session.removeAttribute("user");
|
||||
}
|
||||
response.sendRedirect("/login?logout");
|
||||
}
|
||||
}
|
@ -24,18 +24,18 @@ public class ChatMessage {
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "m_id")
|
||||
private Long messageID;
|
||||
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "from_user")
|
||||
private ChatUser fromUser;
|
||||
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "to_user")
|
||||
private ChatUser toUser;
|
||||
|
||||
|
||||
@OneToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "message")
|
||||
private MessageCipher messageCipher;
|
||||
|
||||
private Instant messageTime;
|
||||
|
||||
private Instant messageTime;
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ this is what the json will look like*/
|
||||
@Entity
|
||||
@Table(name = "message_ciphers")
|
||||
@EntityListeners(AuditingEntityListener.class)
|
||||
//@JsonIgnoreProperties(value = { "id"}, allowGetters = false)
|
||||
// @JsonIgnoreProperties(value = { "id"}, allowGetters = false)
|
||||
public class MessageCipher {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
|
@ -16,7 +16,6 @@ import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
|
||||
@Entity
|
||||
@Table(name = "roles")
|
||||
@Data
|
||||
@ -24,14 +23,14 @@ public class Role {
|
||||
@Id
|
||||
@Column(name = "role_id")
|
||||
private int roleID;
|
||||
|
||||
|
||||
@Column(name = "role_name")
|
||||
private String name;
|
||||
|
||||
private String name;
|
||||
|
||||
private String description;
|
||||
|
||||
@OneToMany(mappedBy = "role", cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH,
|
||||
CascadeType.REFRESH })
|
||||
|
||||
@OneToMany(mappedBy = "role", cascade = { CascadeType.PERSIST,
|
||||
CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
|
||||
@JsonBackReference
|
||||
@ToString.Exclude
|
||||
@EqualsAndHashCode.Exclude
|
||||
|
@ -20,13 +20,13 @@ public class UserSession {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private int id;
|
||||
|
||||
|
||||
@OneToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "user_id")
|
||||
private ChatUser user;
|
||||
|
||||
|
||||
private boolean online;
|
||||
|
||||
|
||||
private int numSessions;
|
||||
private Instant timeStamp;
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
//package org.ros.chatto.repository;
|
||||
// package org.ros.chatto.repository;
|
||||
//
|
||||
//import org.springframework.data.jpa.repository.JpaRepository;
|
||||
//import org.springframework.stereotype.Repository;
|
||||
// import org.springframework.data.jpa.repository.JpaRepository;
|
||||
// import org.springframework.stereotype.Repository;
|
||||
//
|
||||
//@Repository
|
||||
//public interface DBInitializerRepostory extends JpaRepository<Integer, Integer>{
|
||||
//
|
||||
//}
|
||||
// @Repository
|
||||
// public interface DBInitializerRepostory extends JpaRepository<Integer,
|
||||
// Integer>{
|
||||
//
|
||||
// }
|
||||
|
@ -5,6 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface MessageCipherRepository extends JpaRepository<MessageCipher, Long>{
|
||||
public interface MessageCipherRepository
|
||||
extends JpaRepository<MessageCipher, Long> {
|
||||
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface RoleRepository extends JpaRepository<Role, Long>{
|
||||
public interface RoleRepository extends JpaRepository<Role, Long> {
|
||||
@Query("select r from Role r where r.name = ?1")
|
||||
public Role findByName(String roleName);
|
||||
}
|
||||
|
@ -4,8 +4,8 @@ import java.util.List;
|
||||
|
||||
public interface UserRepositoryCustom {
|
||||
|
||||
// @Query("select s from Article s where s.author like ?1 and s.title = ?2")
|
||||
// List<Article> findByAuthorAndTitle(String author, String title);
|
||||
// @Query("select u from ChatUser u")
|
||||
// @Query("select s from Article s where s.author like ?1 and s.title = ?2")
|
||||
// List<Article> findByAuthorAndTitle(String author, String title);
|
||||
// @Query("select u from ChatUser u")
|
||||
public List<String> getAllUserNames(String s);
|
||||
}
|
||||
|
@ -14,30 +14,34 @@ import org.ros.chatto.model.ChatUser;
|
||||
import org.ros.chatto.repository.UserRepositoryCustom;
|
||||
|
||||
@Service
|
||||
class UserRepositoryCustomImpl implements UserRepositoryCustom{
|
||||
class UserRepositoryCustomImpl implements UserRepositoryCustom {
|
||||
@PersistenceContext
|
||||
private EntityManager entityManager;
|
||||
|
||||
@Override
|
||||
public List<String> getAllUserNames(String userName) {
|
||||
List<String> userNamesList = null;
|
||||
// Session session = null;
|
||||
// Session session = null;
|
||||
try {
|
||||
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<String> criteriaQuery = criteriaBuilder.createQuery(String.class);
|
||||
CriteriaBuilder criteriaBuilder = entityManager
|
||||
.getCriteriaBuilder();
|
||||
CriteriaQuery<String> criteriaQuery = criteriaBuilder
|
||||
.createQuery(String.class);
|
||||
Root<ChatUser> root = criteriaQuery.from(ChatUser.class);
|
||||
criteriaQuery.select(root.get("userName"));
|
||||
criteriaQuery.where(criteriaBuilder.notEqual(root.get("userName"), userName));
|
||||
|
||||
userNamesList = entityManager.createQuery(criteriaQuery).getResultList();
|
||||
// for(String un: userNamesList)
|
||||
// {
|
||||
// System.out.println(un);
|
||||
// }
|
||||
criteriaQuery.where(
|
||||
criteriaBuilder.notEqual(root.get("userName"), userName));
|
||||
|
||||
userNamesList = entityManager.createQuery(criteriaQuery)
|
||||
.getResultList();
|
||||
// for(String un: userNamesList)
|
||||
// {
|
||||
// System.out.println(un);
|
||||
// }
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return userNamesList;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -16,20 +16,29 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHand
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler {
|
||||
|
||||
private static final SimpleGrantedAuthority SUPER_USER_AUTHORITY = new SimpleGrantedAuthority("ROLE_SUPER_USER");
|
||||
private static final SimpleGrantedAuthority ADMIN_AUTHORITY = new SimpleGrantedAuthority("ROLE_ADMIN");
|
||||
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
|
||||
public class AuthenticationSuccessHandlerImpl
|
||||
implements AuthenticationSuccessHandler {
|
||||
|
||||
private static final SimpleGrantedAuthority SUPER_USER_AUTHORITY = new SimpleGrantedAuthority(
|
||||
"ROLE_SUPER_USER");
|
||||
private static final SimpleGrantedAuthority ADMIN_AUTHORITY = new SimpleGrantedAuthority(
|
||||
"ROLE_ADMIN");
|
||||
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
|
||||
|
||||
@Override
|
||||
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
|
||||
Authentication authentication) throws IOException, ServletException {
|
||||
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
|
||||
if (authorities.contains(ADMIN_AUTHORITY) || authorities.contains(SUPER_USER_AUTHORITY)) {
|
||||
redirectStrategy.sendRedirect(httpServletRequest, httpServletResponse, "/admin");
|
||||
} else {
|
||||
redirectStrategy.sendRedirect(httpServletRequest, httpServletResponse, "/user");
|
||||
}
|
||||
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest,
|
||||
HttpServletResponse httpServletResponse,
|
||||
Authentication authentication)
|
||||
throws IOException, ServletException {
|
||||
Collection<? extends GrantedAuthority> authorities = authentication
|
||||
.getAuthorities();
|
||||
if (authorities.contains(ADMIN_AUTHORITY)
|
||||
|| authorities.contains(SUPER_USER_AUTHORITY)) {
|
||||
redirectStrategy.sendRedirect(httpServletRequest,
|
||||
httpServletResponse, "/admin");
|
||||
} else {
|
||||
redirectStrategy.sendRedirect(httpServletRequest,
|
||||
httpServletResponse, "/user");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,18 +9,17 @@ import org.springframework.stereotype.Service;
|
||||
@Service
|
||||
public class CaptchaService {
|
||||
private final WebCaptcha webCaptcha;
|
||||
|
||||
|
||||
public CaptchaService() {
|
||||
webCaptcha = WebCaptcha.builder().captchaBehaviour(new SimpleCaptchaBehavior()).build();
|
||||
webCaptcha = WebCaptcha.builder()
|
||||
.captchaBehaviour(new SimpleCaptchaBehavior()).build();
|
||||
}
|
||||
|
||||
public BufferedImage createCaptchaImage(final String captchaText)
|
||||
{
|
||||
|
||||
public BufferedImage createCaptchaImage(final String captchaText) {
|
||||
return webCaptcha.generateCaptcha(captchaText);
|
||||
}
|
||||
|
||||
public String getRandomText()
|
||||
{
|
||||
|
||||
public String getRandomText() {
|
||||
return webCaptcha.getRandomChars();
|
||||
}
|
||||
}
|
||||
|
@ -46,13 +46,15 @@ public class DBInitializerService {
|
||||
});
|
||||
}
|
||||
|
||||
private void resetAllUserSessions(final Connection connection) throws SQLException {
|
||||
private void resetAllUserSessions(final Connection connection)
|
||||
throws SQLException {
|
||||
final PreparedStatement preparedStatement = connection
|
||||
.prepareStatement(dbInitializerConfig.getResetSessionsQuery());
|
||||
preparedStatement.executeUpdate();
|
||||
}
|
||||
|
||||
private void clearAllTokens(final Connection connection) throws SQLException {
|
||||
private void clearAllTokens(final Connection connection)
|
||||
throws SQLException {
|
||||
final PreparedStatement preparedStatement = connection
|
||||
.prepareStatement(dbInitializerConfig.getClearTokensQuery());
|
||||
preparedStatement.executeUpdate();
|
||||
|
@ -15,65 +15,68 @@
|
||||
// @RunWith(SpringRunner.class)
|
||||
// @SpringBootTest
|
||||
// public class ChattoApplicationTests {
|
||||
|
||||
// // @Autowired
|
||||
// // ChatMessageRepository chatMessageRepository;
|
||||
// //
|
||||
// // @Mock
|
||||
// // ChatMessageRepository mockChatMessageRepository;
|
||||
// //
|
||||
// @Autowired
|
||||
// private UserRepository userRepository;
|
||||
|
||||
// @Autowired
|
||||
// private UserRoleRepository userRoleRepository;
|
||||
|
||||
// private final Logger logger = LoggerFactory.getLogger(ChattoApplicationTests.class);
|
||||
|
||||
// // @Autowired
|
||||
// // ChatMessageRepository chatMessageRepository;
|
||||
// //
|
||||
// @Test
|
||||
// public void contextLoads() {
|
||||
// }
|
||||
// // @Mock
|
||||
// // ChatMessageRepository mockChatMessageRepository;
|
||||
// //
|
||||
// // @Test
|
||||
// // public void testMessageRepo() {
|
||||
// // chatMessageRepository.findAll().toString();
|
||||
// // }
|
||||
|
||||
// @Test
|
||||
// public void testRoleRepo() {
|
||||
// List<String> list = userRoleRepository.getAllRegularUser();
|
||||
// logger.info("List = {} ", list);
|
||||
// }
|
||||
|
||||
// @Test
|
||||
// public void findAllOtherUsers() {
|
||||
// logger.info("Usernames = {}",userRepository.findAllOtherUserNames("hmm").toString());
|
||||
// }
|
||||
|
||||
// // @Test
|
||||
// // public void testSave() {
|
||||
// // ChatUser fromUser = new ChatUser();
|
||||
// // fromUser = userRepository.findByUserName("hmm");
|
||||
// // ChatUser toUser = new ChatUser();
|
||||
// // toUser = userRepository.findByUserName("user2");
|
||||
// // ChatMessage chatMessage = new ChatMessage();
|
||||
// // chatMessage.setMessage("Hello!");
|
||||
// // chatMessage.setFromUser(fromUser);
|
||||
// // chatMessage.setToUser(toUser);
|
||||
// //
|
||||
// // chatMessageRepository.save(chatMessage);
|
||||
// // }
|
||||
|
||||
// /*
|
||||
// * @Test public void testSave() { ChatUser fromUser = new ChatUser(); fromUser =
|
||||
// * userRepository.findByUserName("hmm"); ChatUser toUser = new ChatUser();
|
||||
// * toUser = userRepository.findByUserName("user2"); ChatMessage chatMessage =
|
||||
// * new ChatMessage(); chatMessage.setMessage("Hello!");
|
||||
// * chatMessage.setFromUser(fromUser); chatMessage.setToUser(toUser);
|
||||
// *
|
||||
// * // chatMessageRepository.save(chatMessage);
|
||||
// * when(mockChatMessageRepository.save(any(ChatMessage.class))).thenReturn(
|
||||
// * chatMessage); verify(mockChatMessageRepository,
|
||||
// * times(1)).save(Mockito.any(ChatMessage.class)); }
|
||||
// */
|
||||
// @Autowired
|
||||
// private UserRepository userRepository;
|
||||
|
||||
// @Autowired
|
||||
// private UserRoleRepository userRoleRepository;
|
||||
|
||||
// private final Logger logger =
|
||||
// LoggerFactory.getLogger(ChattoApplicationTests.class);
|
||||
// //
|
||||
// @Test
|
||||
// public void contextLoads() {
|
||||
// }
|
||||
// //
|
||||
// // @Test
|
||||
// // public void testMessageRepo() {
|
||||
// // chatMessageRepository.findAll().toString();
|
||||
// // }
|
||||
|
||||
// @Test
|
||||
// public void testRoleRepo() {
|
||||
// List<String> list = userRoleRepository.getAllRegularUser();
|
||||
// logger.info("List = {} ", list);
|
||||
// }
|
||||
|
||||
// @Test
|
||||
// public void findAllOtherUsers() {
|
||||
// logger.info("Usernames =
|
||||
// {}",userRepository.findAllOtherUserNames("hmm").toString());
|
||||
// }
|
||||
|
||||
// // @Test
|
||||
// // public void testSave() {
|
||||
// // ChatUser fromUser = new ChatUser();
|
||||
// // fromUser = userRepository.findByUserName("hmm");
|
||||
// // ChatUser toUser = new ChatUser();
|
||||
// // toUser = userRepository.findByUserName("user2");
|
||||
// // ChatMessage chatMessage = new ChatMessage();
|
||||
// // chatMessage.setMessage("Hello!");
|
||||
// // chatMessage.setFromUser(fromUser);
|
||||
// // chatMessage.setToUser(toUser);
|
||||
// //
|
||||
// // chatMessageRepository.save(chatMessage);
|
||||
// // }
|
||||
|
||||
// /*
|
||||
// * @Test public void testSave() { ChatUser fromUser = new ChatUser(); fromUser
|
||||
// =
|
||||
// * userRepository.findByUserName("hmm"); ChatUser toUser = new ChatUser();
|
||||
// * toUser = userRepository.findByUserName("user2"); ChatMessage chatMessage =
|
||||
// * new ChatMessage(); chatMessage.setMessage("Hello!");
|
||||
// * chatMessage.setFromUser(fromUser); chatMessage.setToUser(toUser);
|
||||
// *
|
||||
// * // chatMessageRepository.save(chatMessage);
|
||||
// * when(mockChatMessageRepository.save(any(ChatMessage.class))).thenReturn(
|
||||
// * chatMessage); verify(mockChatMessageRepository,
|
||||
// * times(1)).save(Mockito.any(ChatMessage.class)); }
|
||||
// */
|
||||
// }
|
||||
|
@ -32,61 +32,62 @@
|
||||
// @RunWith(MockitoJUnitRunner.class)
|
||||
// @Slf4j
|
||||
// public class UnitTest {
|
||||
// @InjectMocks
|
||||
// @InjectMocks
|
||||
|
||||
// // private RoleService roleService;
|
||||
// // private UserTokenService userTokenService;
|
||||
// // private RoleService roleService;
|
||||
// // private UserTokenService userTokenService;
|
||||
|
||||
// @Mock
|
||||
// private UserRoleRepository userRoleRepository;
|
||||
// @Mock
|
||||
// private UserRoleRepository userRoleRepository;
|
||||
|
||||
// @Mock
|
||||
// private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
|
||||
// @Mock
|
||||
// private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
|
||||
|
||||
// @Mock
|
||||
// private RoleRepository roleRepository;
|
||||
// @Mock
|
||||
// private RoleRepository roleRepository;
|
||||
|
||||
// @Mock
|
||||
// private UserRepositoryCustom userRepositoryCustom;
|
||||
// @Mock
|
||||
// private UserRepositoryCustom userRepositoryCustom;
|
||||
|
||||
// @Mock
|
||||
// private UserSessionRepository userSessionRepository;
|
||||
// @Mock
|
||||
// private UserSessionRepository userSessionRepository;
|
||||
|
||||
// @Mock
|
||||
// private UserRepository userRepository;
|
||||
// @Mock
|
||||
// private UserRepository userRepository;
|
||||
|
||||
// private UserService userService = new UserServiceImpl(userRepository, userRoleRepository, passwordEncoder, roleRepository,
|
||||
// userSessionRepository);
|
||||
// // private ChatUser chatUser;
|
||||
// private UserService userService = new UserServiceImpl(userRepository,
|
||||
// userRoleRepository, passwordEncoder, roleRepository,
|
||||
// userSessionRepository);
|
||||
// // private ChatUser chatUser;
|
||||
|
||||
// @Before
|
||||
// public void setupMock() {
|
||||
// // userRepository = mock(UserRepository.class);
|
||||
// // chatUser = mock(ChatUser.class);
|
||||
// }
|
||||
// @Before
|
||||
// public void setupMock() {
|
||||
// // userRepository = mock(UserRepository.class);
|
||||
// // chatUser = mock(ChatUser.class);
|
||||
// }
|
||||
|
||||
// @Test
|
||||
// public void userRegistrationTest() {
|
||||
// UserRegistrationDTO userRegistrationDTO = new UserRegistrationDTO();
|
||||
// userRegistrationDTO.setUserName("mickey");
|
||||
// userRegistrationDTO.setPassword("mouse");
|
||||
// @Test
|
||||
// public void userRegistrationTest() {
|
||||
// UserRegistrationDTO userRegistrationDTO = new UserRegistrationDTO();
|
||||
// userRegistrationDTO.setUserName("mickey");
|
||||
// userRegistrationDTO.setPassword("mouse");
|
||||
|
||||
// ChatUser chatUser = new ChatUser();
|
||||
// chatUser.setUserName("mickey");
|
||||
// // chatUser.setPassword("mouse");
|
||||
// ChatUser chatUser = new ChatUser();
|
||||
// chatUser.setUserName("mickey");
|
||||
// // chatUser.setPassword("mouse");
|
||||
|
||||
// Role role = new Role();
|
||||
// role.setRoleID(2);
|
||||
// role.setName("USER");
|
||||
// when(roleRepository.findByName("USER")).thenReturn(role);
|
||||
// when(userRepository.save(chatUser)).thenReturn(chatUser);
|
||||
// Role role = new Role();
|
||||
// role.setRoleID(2);
|
||||
// role.setName("USER");
|
||||
// when(roleRepository.findByName("USER")).thenReturn(role);
|
||||
// when(userRepository.save(chatUser)).thenReturn(chatUser);
|
||||
|
||||
// UserRole userRole = userService.registerUser(userRegistrationDTO);
|
||||
// assertArrayEquals(new Object[] { 2, "USER","mickey" },
|
||||
// new Object[] { userRole.getRole().getRoleID(),
|
||||
// userRole.getRole().getName(), userRole.getUser().getUserName() });
|
||||
// verify(userRepository, times(1)).save(chatUser);
|
||||
// verify(userRoleRepository,times(1)).save(userRole);
|
||||
// }
|
||||
// UserRole userRole = userService.registerUser(userRegistrationDTO);
|
||||
// assertArrayEquals(new Object[] { 2, "USER","mickey" },
|
||||
// new Object[] { userRole.getRole().getRoleID(),
|
||||
// userRole.getRole().getName(), userRole.getUser().getUserName() });
|
||||
// verify(userRepository, times(1)).save(chatUser);
|
||||
// verify(userRoleRepository,times(1)).save(userRole);
|
||||
// }
|
||||
|
||||
// }
|
||||
|
Loading…
Reference in New Issue
Block a user